@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,6 +1,6 @@
|
|
|
1
|
-
import { $
|
|
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 { $a as WORKSPACE_SHAPE_VALUES, $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, Ca as SHADCN_RADIUS_VALUES, Cn as GO_MIGRATIONS_VALUES, Cr as MOBILE_LIBRARIES_VALUES, Ct as ELIXIR_JSON_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, Hr as PACKAGE_MANAGER_VALUES, I as DOTNET_API_VALUES, Ii as RATE_LIMIT_VALUES, Ja as VERSION_CHANNEL_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, 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, Sa as SHADCN_ICON_LIBRARY_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, ba as SHADCN_COLOR_THEME_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, 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, r as AI_DOCS_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, ti as PYTHON_OBSERVABILITY_VALUES, tr as JAVA_AUTH_VALUES, u as ASTRO_INTEGRATION_VALUES, ui as PYTHON_WEB_FRAMEWORK_VALUES, ut as EFFECT_VALUES, va as SHADCN_BASE_COLOR_VALUES, vn as GO_CLI_VALUES, vt as ELIXIR_EMAIL_VALUES, wa as SHADCN_STYLE_VALUES, wn as GO_OBSERVABILITY_VALUES, wr as MOBILE_NAVIGATION_VALUES, wt as ELIXIR_LIBRARIES_VALUES, xa as SHADCN_FONT_VALUES, xn as GO_LOGGING_VALUES, xt as ELIXIR_I18N_VALUES, ya as SHADCN_BASE_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
|
+
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-DiLi3WuL.mjs";
|
|
3
|
+
import { t as createCliDefaultProjectConfigBase } from "./defaults-Cl16mM84.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",
|
|
@@ -300,6 +311,7 @@ const REACT_NATIVE_CATEGORY_ORDER = [
|
|
|
300
311
|
"mobilePush",
|
|
301
312
|
"mobileOTA",
|
|
302
313
|
"mobileDeepLinking",
|
|
314
|
+
"mobileLibraries",
|
|
303
315
|
"auth",
|
|
304
316
|
"payments",
|
|
305
317
|
"packageManager",
|
|
@@ -345,6 +357,13 @@ const PYTHON_CATEGORY_ORDER = [
|
|
|
345
357
|
"pythonRealtime",
|
|
346
358
|
"pythonObservability",
|
|
347
359
|
"pythonCli",
|
|
360
|
+
"pythonCloudSdk",
|
|
361
|
+
"pythonHttpClient",
|
|
362
|
+
"pythonData",
|
|
363
|
+
"pythonMedia",
|
|
364
|
+
"pythonServer",
|
|
365
|
+
"pythonPackageManager",
|
|
366
|
+
"pythonMessageQueue",
|
|
348
367
|
"email",
|
|
349
368
|
"observability",
|
|
350
369
|
"caching",
|
|
@@ -366,6 +385,12 @@ const GO_CATEGORY_ORDER = [
|
|
|
366
385
|
"goCaching",
|
|
367
386
|
"goConfig",
|
|
368
387
|
"goObservability",
|
|
388
|
+
"goValidation",
|
|
389
|
+
"goQuality",
|
|
390
|
+
"goMigrations",
|
|
391
|
+
"goTemplating",
|
|
392
|
+
"goProtoTooling",
|
|
393
|
+
"goDI",
|
|
369
394
|
"auth",
|
|
370
395
|
"email",
|
|
371
396
|
"observability",
|
|
@@ -405,6 +430,7 @@ const DOTNET_CATEGORY_ORDER = [
|
|
|
405
430
|
"dotnetValidation",
|
|
406
431
|
"dotnetCaching",
|
|
407
432
|
"dotnetDeploy",
|
|
433
|
+
"dotnetLibraries",
|
|
408
434
|
"aiDocs",
|
|
409
435
|
"git",
|
|
410
436
|
"install"
|
|
@@ -424,6 +450,11 @@ const ELIXIR_CATEGORY_ORDER = [
|
|
|
424
450
|
"elixirObservability",
|
|
425
451
|
"elixirTesting",
|
|
426
452
|
"elixirQuality",
|
|
453
|
+
"elixirI18n",
|
|
454
|
+
"elixirHttpServer",
|
|
455
|
+
"elixirApplicationFramework",
|
|
456
|
+
"elixirDocumentation",
|
|
457
|
+
"elixirClustering",
|
|
427
458
|
"elixirDeploy",
|
|
428
459
|
"elixirLibraries",
|
|
429
460
|
"aiDocs",
|
|
@@ -455,6 +486,8 @@ function getCategoryOrderForEcosystem(ecosystem) {
|
|
|
455
486
|
function getCategoryDisplayName(categoryKey) {
|
|
456
487
|
const customName = {
|
|
457
488
|
i18n: "Internationalization (i18n)",
|
|
489
|
+
appShells: "App Platforms",
|
|
490
|
+
appPlatforms: "Addons",
|
|
458
491
|
mobileNavigation: "Mobile Navigation",
|
|
459
492
|
mobileUI: "Mobile UI",
|
|
460
493
|
mobileStorage: "Mobile Storage",
|
|
@@ -462,6 +495,7 @@ function getCategoryDisplayName(categoryKey) {
|
|
|
462
495
|
mobilePush: "Mobile Push",
|
|
463
496
|
mobileOTA: "Mobile OTA",
|
|
464
497
|
mobileDeepLinking: "Mobile Deep Linking",
|
|
498
|
+
mobileLibraries: "Mobile Libraries",
|
|
465
499
|
backendLibraries: "Effect Services",
|
|
466
500
|
rustWebFramework: "Rust Web Framework",
|
|
467
501
|
rustFrontend: "Rust Frontend (WASM)",
|
|
@@ -491,6 +525,13 @@ function getCategoryDisplayName(categoryKey) {
|
|
|
491
525
|
pythonRealtime: "Python Realtime",
|
|
492
526
|
pythonObservability: "Python Observability",
|
|
493
527
|
pythonCli: "Python CLI Tooling",
|
|
528
|
+
pythonCloudSdk: "Python Cloud SDK",
|
|
529
|
+
pythonHttpClient: "Python HTTP Client",
|
|
530
|
+
pythonData: "Python Data & Scientific Computing",
|
|
531
|
+
pythonMedia: "Python Media",
|
|
532
|
+
pythonServer: "Python Production Server",
|
|
533
|
+
pythonPackageManager: "Python Package Manager",
|
|
534
|
+
pythonMessageQueue: "Python Message Queue",
|
|
494
535
|
goWebFramework: "Go Web Framework",
|
|
495
536
|
goOrm: "Go ORM / Database",
|
|
496
537
|
goApi: "Go API Layer",
|
|
@@ -503,6 +544,12 @@ function getCategoryDisplayName(categoryKey) {
|
|
|
503
544
|
goCaching: "Go Caching",
|
|
504
545
|
goConfig: "Go Config",
|
|
505
546
|
goObservability: "Go Observability",
|
|
547
|
+
goValidation: "Go Validation",
|
|
548
|
+
goQuality: "Go Code Quality",
|
|
549
|
+
goMigrations: "Go Database Migrations",
|
|
550
|
+
goTemplating: "Go Templating",
|
|
551
|
+
goProtoTooling: "Go Protobuf Tooling",
|
|
552
|
+
goDI: "Go Dependency Injection",
|
|
506
553
|
javaLanguage: "Java Language",
|
|
507
554
|
javaWebFramework: "Java Web Framework",
|
|
508
555
|
javaBuildTool: "Java Build Tool",
|
|
@@ -523,6 +570,7 @@ function getCategoryDisplayName(categoryKey) {
|
|
|
523
570
|
dotnetValidation: ".NET Validation",
|
|
524
571
|
dotnetCaching: ".NET Caching",
|
|
525
572
|
dotnetDeploy: ".NET Deploy",
|
|
573
|
+
dotnetLibraries: ".NET Libraries",
|
|
526
574
|
elixirWebFramework: "Elixir Web Framework",
|
|
527
575
|
elixirOrm: "Elixir ORM / Database",
|
|
528
576
|
elixirAuth: "Elixir Auth",
|
|
@@ -537,6 +585,11 @@ function getCategoryDisplayName(categoryKey) {
|
|
|
537
585
|
elixirObservability: "Elixir Observability",
|
|
538
586
|
elixirTesting: "Elixir Testing",
|
|
539
587
|
elixirQuality: "Elixir Code Quality",
|
|
588
|
+
elixirI18n: "Elixir Localization",
|
|
589
|
+
elixirHttpServer: "Elixir HTTP Server",
|
|
590
|
+
elixirApplicationFramework: "Elixir Application Framework",
|
|
591
|
+
elixirDocumentation: "Elixir Documentation",
|
|
592
|
+
elixirClustering: "Elixir Clustering",
|
|
540
593
|
elixirDeploy: "Elixir Deploy",
|
|
541
594
|
elixirLibraries: "Elixir Libraries"
|
|
542
595
|
}[categoryKey];
|
|
@@ -548,6 +601,8 @@ const WEB_FRONTEND_VALUES = [
|
|
|
548
601
|
"tanstack-router",
|
|
549
602
|
"react-router",
|
|
550
603
|
"react-vite",
|
|
604
|
+
"vanilla-vite",
|
|
605
|
+
"vue",
|
|
551
606
|
"tanstack-start",
|
|
552
607
|
"next",
|
|
553
608
|
"vinext",
|
|
@@ -591,6 +646,8 @@ const BACKEND_BUILDER_VALUES = [
|
|
|
591
646
|
];
|
|
592
647
|
const CODE_QUALITY_VALUES = [
|
|
593
648
|
"biome",
|
|
649
|
+
"eslint",
|
|
650
|
+
"prettier",
|
|
594
651
|
"oxlint",
|
|
595
652
|
"ultracite",
|
|
596
653
|
"lefthook",
|
|
@@ -598,13 +655,10 @@ const CODE_QUALITY_VALUES = [
|
|
|
598
655
|
"ruler"
|
|
599
656
|
];
|
|
600
657
|
const DOCUMENTATION_VALUES = ["starlight", "fumadocs"];
|
|
658
|
+
const APP_SHELL_VALUES = APP_PLATFORM_ADDON_VALUES;
|
|
601
659
|
const APP_PLATFORM_VALUES = [
|
|
602
660
|
"turborepo",
|
|
603
661
|
"nx",
|
|
604
|
-
"pwa",
|
|
605
|
-
"tauri",
|
|
606
|
-
"wxt",
|
|
607
|
-
"opentui",
|
|
608
662
|
"mcp",
|
|
609
663
|
"skills",
|
|
610
664
|
"msw",
|
|
@@ -618,7 +672,12 @@ const APP_PLATFORM_VALUES = [
|
|
|
618
672
|
"backend-utils",
|
|
619
673
|
"devcontainer",
|
|
620
674
|
"docker-compose",
|
|
621
|
-
"github-actions"
|
|
675
|
+
"github-actions",
|
|
676
|
+
"axios",
|
|
677
|
+
"firebase",
|
|
678
|
+
"graphql-codegen",
|
|
679
|
+
"openapi-typescript",
|
|
680
|
+
"apollo-client"
|
|
622
681
|
];
|
|
623
682
|
const EXAMPLE_VALUES = ["ai", "chat-sdk"];
|
|
624
683
|
const BOOLEAN_OPTION_VALUES = ["true", "false"];
|
|
@@ -627,6 +686,7 @@ const MULTI_SELECT_CATEGORIES = new Set([
|
|
|
627
686
|
"nativeFrontend",
|
|
628
687
|
"codeQuality",
|
|
629
688
|
"documentation",
|
|
689
|
+
"appShells",
|
|
630
690
|
"appPlatforms",
|
|
631
691
|
"examples",
|
|
632
692
|
"aiDocs",
|
|
@@ -634,11 +694,14 @@ const MULTI_SELECT_CATEGORIES = new Set([
|
|
|
634
694
|
"pythonAi",
|
|
635
695
|
"javaLibraries",
|
|
636
696
|
"javaTestingLibraries",
|
|
697
|
+
"mobileLibraries",
|
|
698
|
+
"dotnetLibraries",
|
|
637
699
|
"dotnetTesting",
|
|
638
700
|
"dotnetObservability",
|
|
639
701
|
"goTesting",
|
|
640
702
|
"pythonTesting",
|
|
641
703
|
"pythonCli",
|
|
704
|
+
"pythonData",
|
|
642
705
|
"elixirLibraries"
|
|
643
706
|
]);
|
|
644
707
|
const CATEGORY_VALUE_IDS = {
|
|
@@ -685,8 +748,10 @@ const CATEGORY_VALUE_IDS = {
|
|
|
685
748
|
mobilePush: MOBILE_PUSH_VALUES,
|
|
686
749
|
mobileOTA: MOBILE_OTA_VALUES,
|
|
687
750
|
mobileDeepLinking: MOBILE_DEEP_LINKING_VALUES,
|
|
751
|
+
mobileLibraries: MOBILE_LIBRARIES_VALUES,
|
|
688
752
|
codeQuality: CODE_QUALITY_VALUES,
|
|
689
753
|
documentation: DOCUMENTATION_VALUES,
|
|
754
|
+
appShells: APP_SHELL_VALUES,
|
|
690
755
|
appPlatforms: APP_PLATFORM_VALUES,
|
|
691
756
|
packageManager: PACKAGE_MANAGER_VALUES,
|
|
692
757
|
workspaceShape: WORKSPACE_SHAPE_VALUES,
|
|
@@ -732,6 +797,13 @@ const CATEGORY_VALUE_IDS = {
|
|
|
732
797
|
pythonRealtime: PYTHON_REALTIME_VALUES,
|
|
733
798
|
pythonObservability: PYTHON_OBSERVABILITY_VALUES,
|
|
734
799
|
pythonCli: PYTHON_CLI_VALUES,
|
|
800
|
+
pythonCloudSdk: PYTHON_CLOUD_SDK_VALUES,
|
|
801
|
+
pythonHttpClient: PYTHON_HTTP_CLIENT_VALUES,
|
|
802
|
+
pythonData: PYTHON_DATA_VALUES,
|
|
803
|
+
pythonMedia: PYTHON_MEDIA_VALUES,
|
|
804
|
+
pythonServer: PYTHON_SERVER_VALUES,
|
|
805
|
+
pythonPackageManager: PYTHON_PACKAGE_MANAGER_VALUES,
|
|
806
|
+
pythonMessageQueue: PYTHON_MESSAGE_QUEUE_VALUES,
|
|
735
807
|
goWebFramework: GO_WEB_FRAMEWORK_VALUES,
|
|
736
808
|
goOrm: GO_ORM_VALUES,
|
|
737
809
|
goApi: GO_API_VALUES,
|
|
@@ -744,6 +816,12 @@ const CATEGORY_VALUE_IDS = {
|
|
|
744
816
|
goCaching: GO_CACHING_VALUES,
|
|
745
817
|
goConfig: GO_CONFIG_VALUES,
|
|
746
818
|
goObservability: GO_OBSERVABILITY_VALUES,
|
|
819
|
+
goValidation: GO_VALIDATION_VALUES,
|
|
820
|
+
goQuality: GO_QUALITY_VALUES,
|
|
821
|
+
goMigrations: GO_MIGRATIONS_VALUES,
|
|
822
|
+
goTemplating: GO_TEMPLATING_VALUES,
|
|
823
|
+
goProtoTooling: GO_PROTO_TOOLING_VALUES,
|
|
824
|
+
goDI: GO_DI_VALUES,
|
|
747
825
|
javaLanguage: JAVA_LANGUAGE_VALUES,
|
|
748
826
|
javaWebFramework: JAVA_WEB_FRAMEWORK_VALUES,
|
|
749
827
|
javaBuildTool: JAVA_BUILD_TOOL_VALUES,
|
|
@@ -764,6 +842,7 @@ const CATEGORY_VALUE_IDS = {
|
|
|
764
842
|
dotnetValidation: DOTNET_VALIDATION_VALUES,
|
|
765
843
|
dotnetCaching: DOTNET_CACHING_VALUES,
|
|
766
844
|
dotnetDeploy: DOTNET_DEPLOY_VALUES,
|
|
845
|
+
dotnetLibraries: DOTNET_LIBRARIES_VALUES,
|
|
767
846
|
elixirWebFramework: ELIXIR_WEB_FRAMEWORK_VALUES,
|
|
768
847
|
elixirOrm: ELIXIR_ORM_VALUES,
|
|
769
848
|
elixirAuth: ELIXIR_AUTH_VALUES,
|
|
@@ -778,6 +857,11 @@ const CATEGORY_VALUE_IDS = {
|
|
|
778
857
|
elixirObservability: ELIXIR_OBSERVABILITY_VALUES,
|
|
779
858
|
elixirTesting: ELIXIR_TESTING_VALUES,
|
|
780
859
|
elixirQuality: ELIXIR_QUALITY_VALUES,
|
|
860
|
+
elixirI18n: ELIXIR_I18N_VALUES,
|
|
861
|
+
elixirHttpServer: ELIXIR_HTTP_SERVER_VALUES,
|
|
862
|
+
elixirApplicationFramework: ELIXIR_APPLICATION_FRAMEWORK_VALUES,
|
|
863
|
+
elixirDocumentation: ELIXIR_DOCUMENTATION_VALUES,
|
|
864
|
+
elixirClustering: ELIXIR_CLUSTERING_VALUES,
|
|
781
865
|
elixirDeploy: ELIXIR_DEPLOY_VALUES,
|
|
782
866
|
elixirLibraries: ELIXIR_LIBRARIES_VALUES
|
|
783
867
|
};
|
|
@@ -793,6 +877,8 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
793
877
|
next: "Next.js",
|
|
794
878
|
vinext: "Vinext",
|
|
795
879
|
"react-vite": "React + Vite",
|
|
880
|
+
"vanilla-vite": "Vite (Vanilla TypeScript)",
|
|
881
|
+
vue: "Vue 3 + Vite",
|
|
796
882
|
svelte: "SvelteKit",
|
|
797
883
|
redwood: "RedwoodJS"
|
|
798
884
|
},
|
|
@@ -858,17 +944,20 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
858
944
|
cms: {
|
|
859
945
|
tinacms: "TinaCMS",
|
|
860
946
|
directus: "Directus",
|
|
861
|
-
keystatic: "Keystatic"
|
|
947
|
+
keystatic: "Keystatic",
|
|
948
|
+
contentful: "Contentful"
|
|
862
949
|
},
|
|
863
950
|
auth: {
|
|
864
951
|
"better-auth-organizations": "Better Auth + Organizations",
|
|
865
952
|
auth0: "Auth0",
|
|
866
953
|
workos: "WorkOS AuthKit",
|
|
867
|
-
kinde: "Kinde"
|
|
954
|
+
kinde: "Kinde",
|
|
955
|
+
passport: "Passport.js"
|
|
868
956
|
},
|
|
869
957
|
payments: {
|
|
870
958
|
"lemon-squeezy": "Lemon Squeezy",
|
|
871
|
-
dodo: "Dodo Payments"
|
|
959
|
+
dodo: "Dodo Payments",
|
|
960
|
+
paypal: "PayPal"
|
|
872
961
|
},
|
|
873
962
|
email: {
|
|
874
963
|
"react-email": "React Email",
|
|
@@ -910,9 +999,13 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
910
999
|
typebox: "TypeBox",
|
|
911
1000
|
"effect-schema": "Effect Schema"
|
|
912
1001
|
},
|
|
913
|
-
testing: {
|
|
1002
|
+
testing: {
|
|
1003
|
+
"vitest-playwright": "Vitest + Playwright",
|
|
1004
|
+
mocha: "Mocha"
|
|
1005
|
+
},
|
|
914
1006
|
realtime: {
|
|
915
1007
|
"socket-io": "Socket.IO",
|
|
1008
|
+
ws: "ws",
|
|
916
1009
|
yjs: "Y.js"
|
|
917
1010
|
},
|
|
918
1011
|
jobQueue: {
|
|
@@ -947,7 +1040,8 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
947
1040
|
cssFramework: {
|
|
948
1041
|
tailwind: "Tailwind CSS",
|
|
949
1042
|
scss: "SCSS",
|
|
950
|
-
"postcss-only": "PostCSS Only"
|
|
1043
|
+
"postcss-only": "PostCSS Only",
|
|
1044
|
+
"styled-components": "styled-components"
|
|
951
1045
|
},
|
|
952
1046
|
uiLibrary: {
|
|
953
1047
|
"shadcn-ui": "shadcn/ui",
|
|
@@ -973,7 +1067,8 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
973
1067
|
},
|
|
974
1068
|
analytics: {
|
|
975
1069
|
plausible: "Plausible",
|
|
976
|
-
umami: "Umami"
|
|
1070
|
+
umami: "Umami",
|
|
1071
|
+
ga4: "Google Analytics 4"
|
|
977
1072
|
},
|
|
978
1073
|
mobileNavigation: {
|
|
979
1074
|
"expo-router": "Expo Router",
|
|
@@ -994,8 +1089,32 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
994
1089
|
mobilePush: { "expo-notifications": "Expo Notifications" },
|
|
995
1090
|
mobileOTA: { "expo-updates": "Expo Updates" },
|
|
996
1091
|
mobileDeepLinking: { "expo-linking": "Expo Linking" },
|
|
1092
|
+
mobileLibraries: {
|
|
1093
|
+
"expo-sqlite": "Expo SQLite",
|
|
1094
|
+
"expo-camera": "Expo Camera",
|
|
1095
|
+
"expo-image-picker": "Expo Image Picker",
|
|
1096
|
+
"expo-location": "Expo Location",
|
|
1097
|
+
"expo-sensors": "Expo Sensors",
|
|
1098
|
+
"expo-file-system": "Expo File System",
|
|
1099
|
+
"expo-image": "Expo Image",
|
|
1100
|
+
"expo-audio": "Expo Audio",
|
|
1101
|
+
"expo-video": "Expo Video",
|
|
1102
|
+
"expo-contacts": "Expo Contacts",
|
|
1103
|
+
"expo-calendar": "Expo Calendar",
|
|
1104
|
+
"expo-local-authentication": "Expo Local Authentication",
|
|
1105
|
+
"expo-sharing": "Expo Sharing",
|
|
1106
|
+
"expo-clipboard": "Expo Clipboard",
|
|
1107
|
+
"expo-task-manager": "Expo Task Manager",
|
|
1108
|
+
"expo-background-task": "Expo Background Task",
|
|
1109
|
+
"expo-maps": "Expo Maps",
|
|
1110
|
+
"expo-brightness": "Expo Brightness",
|
|
1111
|
+
"expo-battery": "Expo Battery",
|
|
1112
|
+
"expo-screen-capture": "Expo Screen Capture"
|
|
1113
|
+
},
|
|
997
1114
|
codeQuality: {
|
|
998
1115
|
biome: "Biome",
|
|
1116
|
+
eslint: "ESLint",
|
|
1117
|
+
prettier: "Prettier",
|
|
999
1118
|
oxlint: "Oxlint",
|
|
1000
1119
|
ultracite: "Ultracite",
|
|
1001
1120
|
lefthook: "Lefthook",
|
|
@@ -1006,10 +1125,15 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
1006
1125
|
starlight: "Starlight",
|
|
1007
1126
|
fumadocs: "Fumadocs"
|
|
1008
1127
|
},
|
|
1009
|
-
|
|
1128
|
+
appShells: {
|
|
1010
1129
|
pwa: "PWA",
|
|
1130
|
+
tauri: "Tauri",
|
|
1131
|
+
electron: "Electron",
|
|
1132
|
+
capacitor: "Capacitor",
|
|
1011
1133
|
wxt: "WXT",
|
|
1012
|
-
opentui: "OpenTUI"
|
|
1134
|
+
opentui: "OpenTUI"
|
|
1135
|
+
},
|
|
1136
|
+
appPlatforms: {
|
|
1013
1137
|
mcp: "MCP",
|
|
1014
1138
|
msw: "MSW",
|
|
1015
1139
|
swr: "SWR",
|
|
@@ -1020,7 +1144,12 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
1020
1144
|
"tanstack-pacer": "TanStack Pacer",
|
|
1021
1145
|
devcontainer: "DevContainer",
|
|
1022
1146
|
"docker-compose": "Docker Compose",
|
|
1023
|
-
"github-actions": "GitHub Actions"
|
|
1147
|
+
"github-actions": "GitHub Actions",
|
|
1148
|
+
axios: "Axios",
|
|
1149
|
+
firebase: "Firebase JS SDK",
|
|
1150
|
+
"graphql-codegen": "GraphQL Code Generator",
|
|
1151
|
+
"openapi-typescript": "openapi-typescript",
|
|
1152
|
+
"apollo-client": "Apollo Client"
|
|
1024
1153
|
},
|
|
1025
1154
|
versionChannel: {
|
|
1026
1155
|
stable: "Stable",
|
|
@@ -1036,6 +1165,8 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
1036
1165
|
voltagent: "VoltAgent",
|
|
1037
1166
|
langgraph: "LangGraph.js",
|
|
1038
1167
|
"openai-agents": "OpenAI Agents SDK",
|
|
1168
|
+
"openai-sdk": "OpenAI SDK",
|
|
1169
|
+
"anthropic-sdk": "Anthropic SDK",
|
|
1039
1170
|
"google-adk": "Google ADK",
|
|
1040
1171
|
modelfusion: "ModelFusion",
|
|
1041
1172
|
langchain: "LangChain",
|
|
@@ -1104,20 +1235,27 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
1104
1235
|
"actix-web": "Actix-web",
|
|
1105
1236
|
rocket: "Rocket",
|
|
1106
1237
|
poem: "Poem",
|
|
1107
|
-
loco: "Loco"
|
|
1238
|
+
loco: "Loco",
|
|
1239
|
+
warp: "Warp",
|
|
1240
|
+
salvo: "Salvo"
|
|
1108
1241
|
},
|
|
1109
1242
|
rustFrontend: {
|
|
1110
1243
|
leptos: "Leptos",
|
|
1111
|
-
dioxus: "Dioxus"
|
|
1244
|
+
dioxus: "Dioxus",
|
|
1245
|
+
yew: "Yew"
|
|
1112
1246
|
},
|
|
1113
1247
|
rustOrm: {
|
|
1114
1248
|
"sea-orm": "SeaORM",
|
|
1115
1249
|
sqlx: "SQLx",
|
|
1116
|
-
diesel: "Diesel"
|
|
1250
|
+
diesel: "Diesel",
|
|
1251
|
+
mongodb: "MongoDB Rust Driver",
|
|
1252
|
+
rusqlite: "rusqlite",
|
|
1253
|
+
"tokio-postgres": "tokio-postgres"
|
|
1117
1254
|
},
|
|
1118
1255
|
rustApi: {
|
|
1119
1256
|
"async-graphql": "async-graphql",
|
|
1120
|
-
tonic: "Tonic"
|
|
1257
|
+
tonic: "Tonic",
|
|
1258
|
+
jsonrpsee: "jsonrpsee"
|
|
1121
1259
|
},
|
|
1122
1260
|
rustCli: {
|
|
1123
1261
|
clap: "Clap",
|
|
@@ -1140,7 +1278,14 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
1140
1278
|
"tokio-test": "Tokio Test",
|
|
1141
1279
|
mockall: "Mockall",
|
|
1142
1280
|
proptest: "Proptest",
|
|
1143
|
-
insta: "Insta"
|
|
1281
|
+
insta: "Insta",
|
|
1282
|
+
rand: "rand",
|
|
1283
|
+
regex: "regex",
|
|
1284
|
+
rayon: "Rayon",
|
|
1285
|
+
itertools: "Itertools",
|
|
1286
|
+
rstest: "rstest",
|
|
1287
|
+
"cargo-nextest": "cargo-nextest",
|
|
1288
|
+
"cargo-audit": "cargo-audit"
|
|
1144
1289
|
},
|
|
1145
1290
|
rustLogging: {
|
|
1146
1291
|
tracing: "Tracing",
|
|
@@ -1156,27 +1301,40 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
1156
1301
|
},
|
|
1157
1302
|
rustAuth: {
|
|
1158
1303
|
oauth2: "OAuth2",
|
|
1159
|
-
torii: "Torii"
|
|
1304
|
+
torii: "Torii",
|
|
1305
|
+
openidconnect: "OpenID Connect",
|
|
1306
|
+
"tower-sessions": "tower-sessions"
|
|
1160
1307
|
},
|
|
1161
1308
|
rustRealtime: { "tokio-tungstenite": "tokio-tungstenite" },
|
|
1162
|
-
rustMessageQueue: {
|
|
1163
|
-
|
|
1309
|
+
rustMessageQueue: {
|
|
1310
|
+
lapin: "Lapin (RabbitMQ)",
|
|
1311
|
+
rdkafka: "rdkafka (Kafka)",
|
|
1312
|
+
"async-nats": "async-nats"
|
|
1313
|
+
},
|
|
1314
|
+
rustObservability: {
|
|
1315
|
+
opentelemetry: "OpenTelemetry",
|
|
1316
|
+
metrics: "metrics"
|
|
1317
|
+
},
|
|
1164
1318
|
rustTemplating: {
|
|
1165
1319
|
askama: "Askama",
|
|
1166
|
-
tera: "Tera"
|
|
1320
|
+
tera: "Tera",
|
|
1321
|
+
minijinja: "MiniJinja"
|
|
1167
1322
|
},
|
|
1168
1323
|
pythonWebFramework: {
|
|
1169
1324
|
fastapi: "FastAPI",
|
|
1170
1325
|
django: "Django",
|
|
1171
1326
|
flask: "Flask",
|
|
1172
1327
|
litestar: "Litestar",
|
|
1173
|
-
starlette: "Starlette"
|
|
1328
|
+
starlette: "Starlette",
|
|
1329
|
+
aiohttp: "aiohttp",
|
|
1330
|
+
streamlit: "Streamlit"
|
|
1174
1331
|
},
|
|
1175
1332
|
pythonOrm: {
|
|
1176
1333
|
sqlalchemy: "SQLAlchemy",
|
|
1177
1334
|
sqlmodel: "SQLModel",
|
|
1178
1335
|
"tortoise-orm": "Tortoise ORM",
|
|
1179
|
-
peewee: "Peewee"
|
|
1336
|
+
peewee: "Peewee",
|
|
1337
|
+
pymongo: "PyMongo"
|
|
1180
1338
|
},
|
|
1181
1339
|
pythonValidation: { pydantic: "Pydantic" },
|
|
1182
1340
|
pythonAi: {
|
|
@@ -1189,11 +1347,17 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
1189
1347
|
haystack: "Haystack",
|
|
1190
1348
|
"pydantic-ai": "Pydantic AI",
|
|
1191
1349
|
"google-adk": "Google ADK",
|
|
1192
|
-
smolagents: "smolagents"
|
|
1350
|
+
smolagents: "smolagents",
|
|
1351
|
+
pytorch: "PyTorch",
|
|
1352
|
+
transformers: "Transformers",
|
|
1353
|
+
"scikit-learn": "scikit-learn",
|
|
1354
|
+
tensorflow: "TensorFlow",
|
|
1355
|
+
mcp: "MCP Python SDK"
|
|
1193
1356
|
},
|
|
1194
1357
|
pythonAuth: {
|
|
1195
1358
|
authlib: "Authlib",
|
|
1196
1359
|
jwt: "JWT (python-jose)",
|
|
1360
|
+
pyjwt: "PyJWT",
|
|
1197
1361
|
"fastapi-users": "FastAPI Users"
|
|
1198
1362
|
},
|
|
1199
1363
|
pythonApi: {
|
|
@@ -1218,7 +1382,8 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
1218
1382
|
},
|
|
1219
1383
|
pythonTesting: {
|
|
1220
1384
|
pytest: "pytest",
|
|
1221
|
-
hypothesis: "Hypothesis"
|
|
1385
|
+
hypothesis: "Hypothesis",
|
|
1386
|
+
"pytest-cov": "pytest-cov"
|
|
1222
1387
|
},
|
|
1223
1388
|
pythonCaching: {
|
|
1224
1389
|
redis: "redis-py",
|
|
@@ -1228,28 +1393,52 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
1228
1393
|
"python-socketio": "python-socketio",
|
|
1229
1394
|
websockets: "websockets"
|
|
1230
1395
|
},
|
|
1231
|
-
pythonObservability: {
|
|
1396
|
+
pythonObservability: {
|
|
1397
|
+
opentelemetry: "OpenTelemetry",
|
|
1398
|
+
"prometheus-client": "Prometheus Client"
|
|
1399
|
+
},
|
|
1232
1400
|
pythonCli: {
|
|
1233
1401
|
typer: "Typer",
|
|
1234
1402
|
click: "Click",
|
|
1235
1403
|
rich: "Rich"
|
|
1236
1404
|
},
|
|
1405
|
+
pythonCloudSdk: { boto3: "Boto3" },
|
|
1406
|
+
pythonHttpClient: { requests: "Requests" },
|
|
1407
|
+
pythonData: {
|
|
1408
|
+
numpy: "NumPy",
|
|
1409
|
+
pandas: "pandas",
|
|
1410
|
+
scipy: "SciPy"
|
|
1411
|
+
},
|
|
1412
|
+
pythonMedia: { pillow: "Pillow" },
|
|
1413
|
+
pythonServer: { gunicorn: "Gunicorn" },
|
|
1414
|
+
pythonPackageManager: {
|
|
1415
|
+
uv: "uv",
|
|
1416
|
+
poetry: "Poetry"
|
|
1417
|
+
},
|
|
1418
|
+
pythonMessageQueue: { "confluent-kafka": "Confluent Kafka" },
|
|
1237
1419
|
goWebFramework: {
|
|
1238
1420
|
gin: "Gin",
|
|
1239
1421
|
echo: "Echo",
|
|
1240
1422
|
fiber: "Fiber",
|
|
1241
1423
|
chi: "Chi",
|
|
1242
|
-
stdlib: "net/http"
|
|
1424
|
+
stdlib: "net/http",
|
|
1425
|
+
"go-zero": "go-zero",
|
|
1426
|
+
kratos: "Kratos",
|
|
1427
|
+
httprouter: "HttpRouter"
|
|
1243
1428
|
},
|
|
1244
1429
|
goOrm: {
|
|
1245
1430
|
gorm: "GORM",
|
|
1246
1431
|
sqlc: "sqlc",
|
|
1247
1432
|
ent: "Ent",
|
|
1248
|
-
bun: "Bun"
|
|
1433
|
+
bun: "Bun",
|
|
1434
|
+
sqlx: "sqlx"
|
|
1249
1435
|
},
|
|
1250
1436
|
goApi: {
|
|
1251
1437
|
"grpc-go": "gRPC-Go",
|
|
1252
|
-
gqlgen: "gqlgen"
|
|
1438
|
+
gqlgen: "gqlgen",
|
|
1439
|
+
"grpc-gateway": "grpc-gateway",
|
|
1440
|
+
"connect-go": "Connect-Go",
|
|
1441
|
+
"oapi-codegen": "oapi-codegen"
|
|
1253
1442
|
},
|
|
1254
1443
|
goCli: {
|
|
1255
1444
|
cobra: "Cobra",
|
|
@@ -1265,11 +1454,15 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
1265
1454
|
goAuth: {
|
|
1266
1455
|
casbin: "Casbin",
|
|
1267
1456
|
jwt: "golang-jwt",
|
|
1268
|
-
goth: "Goth"
|
|
1457
|
+
goth: "Goth",
|
|
1458
|
+
oauth2: "golang.org/x/oauth2"
|
|
1269
1459
|
},
|
|
1270
1460
|
goTesting: {
|
|
1271
1461
|
testify: "Testify",
|
|
1272
|
-
gomock: "GoMock"
|
|
1462
|
+
gomock: "GoMock",
|
|
1463
|
+
testcontainers: "Testcontainers for Go",
|
|
1464
|
+
"ginkgo-gomega": "Ginkgo + Gomega",
|
|
1465
|
+
mockery: "mockery"
|
|
1273
1466
|
},
|
|
1274
1467
|
goRealtime: {
|
|
1275
1468
|
"gorilla-websocket": "Gorilla WebSocket",
|
|
@@ -1277,7 +1470,9 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
1277
1470
|
},
|
|
1278
1471
|
goMessageQueue: {
|
|
1279
1472
|
nats: "NATS",
|
|
1280
|
-
watermill: "Watermill"
|
|
1473
|
+
watermill: "Watermill",
|
|
1474
|
+
"kafka-go": "kafka-go",
|
|
1475
|
+
asynq: "Asynq"
|
|
1281
1476
|
},
|
|
1282
1477
|
goCaching: {
|
|
1283
1478
|
redis: "go-redis",
|
|
@@ -1287,7 +1482,16 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
1287
1482
|
viper: "Viper",
|
|
1288
1483
|
koanf: "Koanf"
|
|
1289
1484
|
},
|
|
1290
|
-
goObservability: {
|
|
1485
|
+
goObservability: {
|
|
1486
|
+
opentelemetry: "OpenTelemetry",
|
|
1487
|
+
prometheus: "Prometheus"
|
|
1488
|
+
},
|
|
1489
|
+
goValidation: { validator: "go-playground/validator" },
|
|
1490
|
+
goQuality: { "golangci-lint": "golangci-lint" },
|
|
1491
|
+
goMigrations: { "golang-migrate": "golang-migrate" },
|
|
1492
|
+
goTemplating: { templ: "templ" },
|
|
1493
|
+
goProtoTooling: { buf: "Buf" },
|
|
1494
|
+
goDI: { fx: "Uber Fx" },
|
|
1291
1495
|
javaLanguage: {
|
|
1292
1496
|
java: "Java",
|
|
1293
1497
|
kotlin: "Kotlin"
|
|
@@ -1334,7 +1538,27 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
1334
1538
|
"micrometer-prometheus": "Micrometer Prometheus",
|
|
1335
1539
|
thymeleaf: "Thymeleaf",
|
|
1336
1540
|
"spring-amqp": "Spring AMQP (RabbitMQ)",
|
|
1337
|
-
"opentelemetry-java": "OpenTelemetry"
|
|
1541
|
+
"opentelemetry-java": "OpenTelemetry",
|
|
1542
|
+
"spring-data-redis": "Spring Data Redis",
|
|
1543
|
+
"spring-data-mongodb": "Spring Data MongoDB",
|
|
1544
|
+
"spring-data-elasticsearch": "Spring Data Elasticsearch",
|
|
1545
|
+
"spring-data-neo4j": "Spring Data Neo4j",
|
|
1546
|
+
"spring-data-cassandra": "Spring Data Cassandra",
|
|
1547
|
+
"spring-data-couchbase": "Spring Data Couchbase",
|
|
1548
|
+
"spring-data-jdbc": "Spring Data JDBC",
|
|
1549
|
+
"spring-data-rest": "Spring Data REST",
|
|
1550
|
+
"spring-quartz": "Quartz Scheduler",
|
|
1551
|
+
"spring-pulsar": "Spring for Apache Pulsar",
|
|
1552
|
+
"spring-integration": "Spring Integration",
|
|
1553
|
+
"spring-websocket": "Spring WebSocket",
|
|
1554
|
+
"spring-rsocket": "Spring RSocket",
|
|
1555
|
+
"spring-hateoas": "Spring HATEOAS",
|
|
1556
|
+
"spring-session-redis": "Spring Session Redis",
|
|
1557
|
+
"spring-session-jdbc": "Spring Session JDBC",
|
|
1558
|
+
"spring-ldap": "Spring LDAP",
|
|
1559
|
+
"spring-oauth2-client": "Spring Security OAuth2 Client",
|
|
1560
|
+
"spring-saml2": "Spring Security SAML2",
|
|
1561
|
+
"spring-restclient": "Spring REST Client"
|
|
1338
1562
|
},
|
|
1339
1563
|
javaTestingLibraries: {
|
|
1340
1564
|
junit5: "JUnit 5",
|
|
@@ -1398,27 +1622,56 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
1398
1622
|
azure: "Azure",
|
|
1399
1623
|
aws: "AWS"
|
|
1400
1624
|
},
|
|
1625
|
+
dotnetLibraries: {
|
|
1626
|
+
automapper: "AutoMapper",
|
|
1627
|
+
mediatr: "MediatR",
|
|
1628
|
+
fastendpoints: "FastEndpoints",
|
|
1629
|
+
"api-versioning": "ASP.NET API Versioning",
|
|
1630
|
+
scalar: "Scalar",
|
|
1631
|
+
polly: "Polly",
|
|
1632
|
+
masstransit: "MassTransit",
|
|
1633
|
+
rebus: "Rebus",
|
|
1634
|
+
coravel: "Coravel",
|
|
1635
|
+
"magic-onion": "MagicOnion",
|
|
1636
|
+
"prometheus-net": "prometheus-net",
|
|
1637
|
+
seq: "Seq",
|
|
1638
|
+
"application-insights": "Application Insights",
|
|
1639
|
+
sentry: "Sentry",
|
|
1640
|
+
"mongodb-driver": "MongoDB Driver",
|
|
1641
|
+
nhibernate: "NHibernate",
|
|
1642
|
+
mapster: "Mapster",
|
|
1643
|
+
scrutor: "Scrutor",
|
|
1644
|
+
refit: "Refit",
|
|
1645
|
+
"fluent-email": "FluentEmail"
|
|
1646
|
+
},
|
|
1401
1647
|
elixirWebFramework: {
|
|
1402
1648
|
phoenix: "Phoenix",
|
|
1403
1649
|
"phoenix-live-view": "Phoenix LiveView"
|
|
1404
1650
|
},
|
|
1405
1651
|
elixirOrm: {
|
|
1406
1652
|
ecto: "Ecto",
|
|
1407
|
-
"ecto-sql": "Ecto SQL"
|
|
1653
|
+
"ecto-sql": "Ecto SQL",
|
|
1654
|
+
myxql: "MyXQL",
|
|
1655
|
+
ecto_sqlite3: "ecto_sqlite3"
|
|
1408
1656
|
},
|
|
1409
1657
|
elixirAuth: {
|
|
1410
1658
|
"phx-gen-auth": "phx.gen.auth",
|
|
1411
1659
|
ueberauth: "Ueberauth",
|
|
1412
|
-
guardian: "Guardian"
|
|
1660
|
+
guardian: "Guardian",
|
|
1661
|
+
pow: "Pow"
|
|
1413
1662
|
},
|
|
1414
1663
|
elixirApi: {
|
|
1415
1664
|
rest: "Phoenix REST",
|
|
1416
1665
|
absinthe: "Absinthe GraphQL",
|
|
1417
|
-
grpc: "gRPC (grpc-elixir)"
|
|
1666
|
+
grpc: "gRPC (grpc-elixir)",
|
|
1667
|
+
open_api_spex: "OpenApiSpex"
|
|
1418
1668
|
},
|
|
1419
1669
|
elixirLibraries: {
|
|
1420
1670
|
broadway: "Broadway",
|
|
1421
|
-
nx: "Nx (Numerical Elixir)"
|
|
1671
|
+
nx: "Nx (Numerical Elixir)",
|
|
1672
|
+
ex_aws: "ExAws",
|
|
1673
|
+
floki: "Floki",
|
|
1674
|
+
rustler: "Rustler"
|
|
1422
1675
|
},
|
|
1423
1676
|
elixirRealtime: {
|
|
1424
1677
|
channels: "Phoenix Channels",
|
|
@@ -1436,30 +1689,48 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
1436
1689
|
},
|
|
1437
1690
|
elixirHttp: {
|
|
1438
1691
|
req: "Req",
|
|
1439
|
-
finch: "Finch"
|
|
1692
|
+
finch: "Finch",
|
|
1693
|
+
tesla: "Tesla"
|
|
1440
1694
|
},
|
|
1441
1695
|
elixirJson: { jason: "Jason" },
|
|
1442
|
-
elixirEmail: {
|
|
1696
|
+
elixirEmail: {
|
|
1697
|
+
swoosh: "Swoosh",
|
|
1698
|
+
bamboo: "Bamboo"
|
|
1699
|
+
},
|
|
1443
1700
|
elixirCaching: {
|
|
1444
1701
|
cachex: "Cachex",
|
|
1445
|
-
nebulex: "Nebulex"
|
|
1702
|
+
nebulex: "Nebulex",
|
|
1703
|
+
redix: "Redix"
|
|
1446
1704
|
},
|
|
1447
1705
|
elixirObservability: {
|
|
1448
1706
|
telemetry: "Telemetry",
|
|
1449
1707
|
opentelemetry: "OpenTelemetry",
|
|
1450
|
-
prom_ex: "PromEx"
|
|
1708
|
+
prom_ex: "PromEx",
|
|
1709
|
+
sentry: "Sentry"
|
|
1451
1710
|
},
|
|
1452
1711
|
elixirTesting: {
|
|
1453
1712
|
ex_unit: "ExUnit",
|
|
1454
1713
|
mox: "Mox",
|
|
1455
1714
|
bypass: "Bypass",
|
|
1456
|
-
wallaby: "Wallaby"
|
|
1715
|
+
wallaby: "Wallaby",
|
|
1716
|
+
stream_data: "StreamData",
|
|
1717
|
+
ex_machina: "ExMachina"
|
|
1457
1718
|
},
|
|
1458
1719
|
elixirQuality: {
|
|
1459
1720
|
credo: "Credo",
|
|
1460
1721
|
dialyxir: "Dialyxir",
|
|
1461
|
-
sobelow: "Sobelow"
|
|
1462
|
-
|
|
1722
|
+
sobelow: "Sobelow",
|
|
1723
|
+
excoveralls: "ExCoveralls",
|
|
1724
|
+
mix_audit: "MixAudit"
|
|
1725
|
+
},
|
|
1726
|
+
elixirI18n: { gettext: "Gettext" },
|
|
1727
|
+
elixirHttpServer: {
|
|
1728
|
+
bandit: "Bandit",
|
|
1729
|
+
cowboy: "Cowboy"
|
|
1730
|
+
},
|
|
1731
|
+
elixirApplicationFramework: { ash: "Ash Framework" },
|
|
1732
|
+
elixirDocumentation: { ex_doc: "ExDoc" },
|
|
1733
|
+
elixirClustering: { libcluster: "libcluster" },
|
|
1463
1734
|
elixirDeploy: {
|
|
1464
1735
|
docker: "Docker",
|
|
1465
1736
|
fly: "Fly.io",
|
|
@@ -1569,8 +1840,10 @@ const OPTION_CATEGORY_METADATA = {
|
|
|
1569
1840
|
mobilePush: buildCategoryMetadata("mobilePush"),
|
|
1570
1841
|
mobileOTA: buildCategoryMetadata("mobileOTA"),
|
|
1571
1842
|
mobileDeepLinking: buildCategoryMetadata("mobileDeepLinking"),
|
|
1843
|
+
mobileLibraries: buildCategoryMetadata("mobileLibraries"),
|
|
1572
1844
|
codeQuality: buildCategoryMetadata("codeQuality"),
|
|
1573
1845
|
documentation: buildCategoryMetadata("documentation"),
|
|
1846
|
+
appShells: buildCategoryMetadata("appShells"),
|
|
1574
1847
|
appPlatforms: buildCategoryMetadata("appPlatforms"),
|
|
1575
1848
|
packageManager: buildCategoryMetadata("packageManager"),
|
|
1576
1849
|
workspaceShape: buildCategoryMetadata("workspaceShape"),
|
|
@@ -1616,6 +1889,13 @@ const OPTION_CATEGORY_METADATA = {
|
|
|
1616
1889
|
pythonRealtime: buildCategoryMetadata("pythonRealtime"),
|
|
1617
1890
|
pythonObservability: buildCategoryMetadata("pythonObservability"),
|
|
1618
1891
|
pythonCli: buildCategoryMetadata("pythonCli"),
|
|
1892
|
+
pythonCloudSdk: buildCategoryMetadata("pythonCloudSdk"),
|
|
1893
|
+
pythonHttpClient: buildCategoryMetadata("pythonHttpClient"),
|
|
1894
|
+
pythonData: buildCategoryMetadata("pythonData"),
|
|
1895
|
+
pythonMedia: buildCategoryMetadata("pythonMedia"),
|
|
1896
|
+
pythonServer: buildCategoryMetadata("pythonServer"),
|
|
1897
|
+
pythonPackageManager: buildCategoryMetadata("pythonPackageManager"),
|
|
1898
|
+
pythonMessageQueue: buildCategoryMetadata("pythonMessageQueue"),
|
|
1619
1899
|
goWebFramework: buildCategoryMetadata("goWebFramework"),
|
|
1620
1900
|
goOrm: buildCategoryMetadata("goOrm"),
|
|
1621
1901
|
goApi: buildCategoryMetadata("goApi"),
|
|
@@ -1628,6 +1908,12 @@ const OPTION_CATEGORY_METADATA = {
|
|
|
1628
1908
|
goCaching: buildCategoryMetadata("goCaching"),
|
|
1629
1909
|
goConfig: buildCategoryMetadata("goConfig"),
|
|
1630
1910
|
goObservability: buildCategoryMetadata("goObservability"),
|
|
1911
|
+
goValidation: buildCategoryMetadata("goValidation"),
|
|
1912
|
+
goQuality: buildCategoryMetadata("goQuality"),
|
|
1913
|
+
goMigrations: buildCategoryMetadata("goMigrations"),
|
|
1914
|
+
goTemplating: buildCategoryMetadata("goTemplating"),
|
|
1915
|
+
goProtoTooling: buildCategoryMetadata("goProtoTooling"),
|
|
1916
|
+
goDI: buildCategoryMetadata("goDI"),
|
|
1631
1917
|
javaLanguage: buildCategoryMetadata("javaLanguage"),
|
|
1632
1918
|
javaWebFramework: buildCategoryMetadata("javaWebFramework"),
|
|
1633
1919
|
javaBuildTool: buildCategoryMetadata("javaBuildTool"),
|
|
@@ -1648,6 +1934,7 @@ const OPTION_CATEGORY_METADATA = {
|
|
|
1648
1934
|
dotnetValidation: buildCategoryMetadata("dotnetValidation"),
|
|
1649
1935
|
dotnetCaching: buildCategoryMetadata("dotnetCaching"),
|
|
1650
1936
|
dotnetDeploy: buildCategoryMetadata("dotnetDeploy"),
|
|
1937
|
+
dotnetLibraries: buildCategoryMetadata("dotnetLibraries"),
|
|
1651
1938
|
elixirWebFramework: buildCategoryMetadata("elixirWebFramework"),
|
|
1652
1939
|
elixirOrm: buildCategoryMetadata("elixirOrm"),
|
|
1653
1940
|
elixirAuth: buildCategoryMetadata("elixirAuth"),
|
|
@@ -1662,6 +1949,11 @@ const OPTION_CATEGORY_METADATA = {
|
|
|
1662
1949
|
elixirObservability: buildCategoryMetadata("elixirObservability"),
|
|
1663
1950
|
elixirTesting: buildCategoryMetadata("elixirTesting"),
|
|
1664
1951
|
elixirQuality: buildCategoryMetadata("elixirQuality"),
|
|
1952
|
+
elixirI18n: buildCategoryMetadata("elixirI18n"),
|
|
1953
|
+
elixirHttpServer: buildCategoryMetadata("elixirHttpServer"),
|
|
1954
|
+
elixirApplicationFramework: buildCategoryMetadata("elixirApplicationFramework"),
|
|
1955
|
+
elixirDocumentation: buildCategoryMetadata("elixirDocumentation"),
|
|
1956
|
+
elixirClustering: buildCategoryMetadata("elixirClustering"),
|
|
1665
1957
|
elixirDeploy: buildCategoryMetadata("elixirDeploy"),
|
|
1666
1958
|
elixirLibraries: buildCategoryMetadata("elixirLibraries")
|
|
1667
1959
|
};
|
|
@@ -1720,6 +2012,8 @@ const PARAGLIDE_COMPATIBLE_FRONTENDS = new Set([
|
|
|
1720
2012
|
"tanstack-start",
|
|
1721
2013
|
"react-router",
|
|
1722
2014
|
"react-vite",
|
|
2015
|
+
"vanilla-vite",
|
|
2016
|
+
"vue",
|
|
1723
2017
|
"svelte",
|
|
1724
2018
|
"solid",
|
|
1725
2019
|
"solid-start",
|
|
@@ -2237,6 +2531,19 @@ const analyzeStackCompatibility = (stack) => {
|
|
|
2237
2531
|
}
|
|
2238
2532
|
}
|
|
2239
2533
|
if (nextStack.backend !== "convex" && nextStack.backend !== "none") {
|
|
2534
|
+
if (nextStack.webFrontend.some((frontend) => ["vanilla-vite", "vue"].includes(frontend)) && [
|
|
2535
|
+
"trpc",
|
|
2536
|
+
"orpc",
|
|
2537
|
+
"ts-rest",
|
|
2538
|
+
"garph"
|
|
2539
|
+
].includes(nextStack.api)) {
|
|
2540
|
+
nextStack.api = "graphql-yoga";
|
|
2541
|
+
changed = true;
|
|
2542
|
+
changes.push({
|
|
2543
|
+
category: "api",
|
|
2544
|
+
message: "API set to 'GraphQL Yoga' (supported by standalone Vite frontends)"
|
|
2545
|
+
});
|
|
2546
|
+
}
|
|
2240
2547
|
if (nextStack.webFrontend.some((f) => [
|
|
2241
2548
|
"nuxt",
|
|
2242
2549
|
"svelte",
|
|
@@ -2365,6 +2672,33 @@ const analyzeStackCompatibility = (stack) => {
|
|
|
2365
2672
|
});
|
|
2366
2673
|
}
|
|
2367
2674
|
}
|
|
2675
|
+
if (nextStack.payments === "paypal") {
|
|
2676
|
+
const hasWebFrontend = nextStack.webFrontend.some((f) => f !== "none");
|
|
2677
|
+
if (!hasWebFrontend || ["none", "convex"].includes(nextStack.backend)) {
|
|
2678
|
+
nextStack.payments = "none";
|
|
2679
|
+
changed = true;
|
|
2680
|
+
changes.push({
|
|
2681
|
+
category: "payments",
|
|
2682
|
+
message: hasWebFrontend ? "Payments set to 'None' (PayPal requires a standalone or fullstack backend)" : "Payments set to 'None' (PayPal requires a web frontend)"
|
|
2683
|
+
});
|
|
2684
|
+
}
|
|
2685
|
+
}
|
|
2686
|
+
if (["openai-sdk", "anthropic-sdk"].includes(nextStack.aiSdk) && ["none", "convex"].includes(nextStack.backend)) {
|
|
2687
|
+
nextStack.aiSdk = "none";
|
|
2688
|
+
changed = true;
|
|
2689
|
+
changes.push({
|
|
2690
|
+
category: "ai",
|
|
2691
|
+
message: "AI SDK set to 'None' (direct provider SDKs require a backend)"
|
|
2692
|
+
});
|
|
2693
|
+
}
|
|
2694
|
+
if (nextStack.realtime === "ws" && nextStack.backend !== "express") {
|
|
2695
|
+
nextStack.realtime = "none";
|
|
2696
|
+
changed = true;
|
|
2697
|
+
changes.push({
|
|
2698
|
+
category: "realtime",
|
|
2699
|
+
message: "Realtime set to 'None' (the ws integration requires Express)"
|
|
2700
|
+
});
|
|
2701
|
+
}
|
|
2368
2702
|
if (nextStack.email !== "none") {
|
|
2369
2703
|
if (nextStack.backend === "convex") {
|
|
2370
2704
|
nextStack.email = "none";
|
|
@@ -2634,6 +2968,14 @@ const analyzeStackCompatibility = (stack) => {
|
|
|
2634
2968
|
message
|
|
2635
2969
|
});
|
|
2636
2970
|
}
|
|
2971
|
+
if ((nextStack.mobileLibraries?.length ?? 0) > 0) {
|
|
2972
|
+
nextStack.mobileLibraries = [];
|
|
2973
|
+
changed = true;
|
|
2974
|
+
changes.push({
|
|
2975
|
+
category: "mobileLibraries",
|
|
2976
|
+
message: "Mobile libraries cleared (no native frontend)"
|
|
2977
|
+
});
|
|
2978
|
+
}
|
|
2637
2979
|
} else {
|
|
2638
2980
|
if (nextStack.mobileNavigation === "none") {
|
|
2639
2981
|
nextStack.mobileNavigation = "expo-router";
|
|
@@ -2668,6 +3010,23 @@ const analyzeStackCompatibility = (stack) => {
|
|
|
2668
3010
|
});
|
|
2669
3011
|
}
|
|
2670
3012
|
}
|
|
3013
|
+
const styledComponentsFrontends = new Set([
|
|
3014
|
+
"tanstack-router",
|
|
3015
|
+
"react-router",
|
|
3016
|
+
"react-vite",
|
|
3017
|
+
"tanstack-start",
|
|
3018
|
+
"next",
|
|
3019
|
+
"vinext",
|
|
3020
|
+
"redwood"
|
|
3021
|
+
]);
|
|
3022
|
+
if (nextStack.cssFramework === "styled-components" && !nextStack.webFrontend.some((frontend) => styledComponentsFrontends.has(frontend))) {
|
|
3023
|
+
nextStack.cssFramework = "none";
|
|
3024
|
+
changed = true;
|
|
3025
|
+
changes.push({
|
|
3026
|
+
category: "cssFramework",
|
|
3027
|
+
message: "CSS framework set to 'None' (styled-components requires a React frontend)"
|
|
3028
|
+
});
|
|
3029
|
+
}
|
|
2671
3030
|
if ([
|
|
2672
3031
|
"shadcn-ui",
|
|
2673
3032
|
"shadcn-svelte",
|
|
@@ -2770,6 +3129,26 @@ const analyzeStackCompatibility = (stack) => {
|
|
|
2770
3129
|
message: "Tauri removed (requires compatible frontend)"
|
|
2771
3130
|
});
|
|
2772
3131
|
}
|
|
3132
|
+
for (const platform of ["electron", "capacitor"]) if (nextStack.appPlatforms.includes(platform) && !validateAddonCompatibility(platform, nextStack.webFrontend).isCompatible) {
|
|
3133
|
+
nextStack.appPlatforms = nextStack.appPlatforms.filter((addon) => addon !== platform);
|
|
3134
|
+
changed = true;
|
|
3135
|
+
changes.push({
|
|
3136
|
+
category: "appPlatforms",
|
|
3137
|
+
message: `${platform === "electron" ? "Electron" : "Capacitor"} removed (requires compatible frontend)`
|
|
3138
|
+
});
|
|
3139
|
+
}
|
|
3140
|
+
if (nextStack.appPlatforms.includes("graphql-codegen") && ![
|
|
3141
|
+
"garph",
|
|
3142
|
+
"graphql-yoga",
|
|
3143
|
+
"apollo-server"
|
|
3144
|
+
].includes(nextStack.api) && !nextStack.webFrontend.includes("redwood")) {
|
|
3145
|
+
nextStack.appPlatforms = nextStack.appPlatforms.filter((platform) => platform !== "graphql-codegen");
|
|
3146
|
+
changed = true;
|
|
3147
|
+
changes.push({
|
|
3148
|
+
category: "appPlatforms",
|
|
3149
|
+
message: "GraphQL Code Generator removed (requires a GraphQL API selection)"
|
|
3150
|
+
});
|
|
3151
|
+
}
|
|
2773
3152
|
if (nextStack.examples.includes("ai")) {
|
|
2774
3153
|
if (nextStack.webFrontend.includes("solid") || nextStack.webFrontend.includes("solid-start")) {
|
|
2775
3154
|
nextStack.examples = nextStack.examples.filter((e) => e !== "ai");
|
|
@@ -2818,7 +3197,33 @@ const analyzeStackCompatibility = (stack) => {
|
|
|
2818
3197
|
});
|
|
2819
3198
|
}
|
|
2820
3199
|
}
|
|
2821
|
-
|
|
3200
|
+
const isFresh = nextStack.webFrontend.includes("fresh");
|
|
3201
|
+
const hasStandaloneViteFrontend = nextStack.webFrontend.some((frontend) => ["vanilla-vite", "vue"].includes(frontend));
|
|
3202
|
+
if (hasStandaloneViteFrontend && nextStack.forms !== "none") {
|
|
3203
|
+
nextStack.forms = "none";
|
|
3204
|
+
changed = true;
|
|
3205
|
+
changes.push({
|
|
3206
|
+
category: "forms",
|
|
3207
|
+
message: "Forms set to 'None' (standalone Vue and Vanilla integrations are not wired yet)"
|
|
3208
|
+
});
|
|
3209
|
+
}
|
|
3210
|
+
if (hasStandaloneViteFrontend && nextStack.cms !== "none" && nextStack.cms !== "contentful") {
|
|
3211
|
+
nextStack.cms = "none";
|
|
3212
|
+
changed = true;
|
|
3213
|
+
changes.push({
|
|
3214
|
+
category: "cms",
|
|
3215
|
+
message: "CMS set to 'None' (standalone Vue and Vanilla CMS templates are not wired yet)"
|
|
3216
|
+
});
|
|
3217
|
+
}
|
|
3218
|
+
if (hasStandaloneViteFrontend && nextStack.featureFlags !== "none") {
|
|
3219
|
+
nextStack.featureFlags = "none";
|
|
3220
|
+
changed = true;
|
|
3221
|
+
changes.push({
|
|
3222
|
+
category: "featureFlags",
|
|
3223
|
+
message: "Feature flags set to 'None' (standalone Vue and Vanilla client integrations are not wired yet)"
|
|
3224
|
+
});
|
|
3225
|
+
}
|
|
3226
|
+
if (isFresh) {
|
|
2822
3227
|
if (nextStack.forms === "tanstack-form") {
|
|
2823
3228
|
nextStack.forms = "none";
|
|
2824
3229
|
changed = true;
|
|
@@ -2858,6 +3263,62 @@ const analyzeStackCompatibility = (stack) => {
|
|
|
2858
3263
|
message: "Python API framework set to 'None' (DRF and Django Ninja require Django)"
|
|
2859
3264
|
});
|
|
2860
3265
|
}
|
|
3266
|
+
if (nextStack.pythonOrm === "pymongo" && nextStack.database !== "mongodb") {
|
|
3267
|
+
nextStack.database = "mongodb";
|
|
3268
|
+
changed = true;
|
|
3269
|
+
changes.push({
|
|
3270
|
+
category: "pythonOrm",
|
|
3271
|
+
message: "Database set to MongoDB (required by PyMongo)"
|
|
3272
|
+
});
|
|
3273
|
+
}
|
|
3274
|
+
if (nextStack.pythonOrm === "pymongo" && nextStack.dbSetup !== "mongodb-atlas" && nextStack.dbSetup !== "none" && nextStack.dbSetup !== "docker") {
|
|
3275
|
+
nextStack.dbSetup = "none";
|
|
3276
|
+
changed = true;
|
|
3277
|
+
changes.push({
|
|
3278
|
+
category: "pythonOrm",
|
|
3279
|
+
message: "DB Setup set to 'None' (incompatible with MongoDB)"
|
|
3280
|
+
});
|
|
3281
|
+
}
|
|
3282
|
+
if (nextStack.database === "mongodb" && nextStack.pythonOrm !== "pymongo" && nextStack.pythonOrm !== "none") {
|
|
3283
|
+
nextStack.database = "sqlite";
|
|
3284
|
+
changed = true;
|
|
3285
|
+
changes.push({
|
|
3286
|
+
category: "database",
|
|
3287
|
+
message: `Database set to SQLite (MongoDB requires PyMongo, not ${nextStack.pythonOrm})`
|
|
3288
|
+
});
|
|
3289
|
+
}
|
|
3290
|
+
if ((nextStack.pythonWebFramework === "none" || nextStack.pythonWebFramework === "aiohttp" || nextStack.pythonWebFramework === "starlette" || nextStack.pythonWebFramework === "streamlit") && nextStack.pythonGraphql !== "none") {
|
|
3291
|
+
nextStack.pythonGraphql = "none";
|
|
3292
|
+
changed = true;
|
|
3293
|
+
changes.push({
|
|
3294
|
+
category: "pythonGraphql",
|
|
3295
|
+
message: "GraphQL set to 'None' (only wired for FastAPI, Django, Flask, and Litestar)"
|
|
3296
|
+
});
|
|
3297
|
+
}
|
|
3298
|
+
if ((nextStack.pythonWebFramework === "none" || nextStack.pythonWebFramework === "aiohttp" || nextStack.pythonWebFramework === "starlette" || nextStack.pythonWebFramework === "streamlit") && nextStack.pythonAuth !== "none") {
|
|
3299
|
+
nextStack.pythonAuth = "none";
|
|
3300
|
+
changed = true;
|
|
3301
|
+
changes.push({
|
|
3302
|
+
category: "pythonAuth",
|
|
3303
|
+
message: `Auth set to 'None' (auth routes are not wired for ${nextStack.pythonWebFramework})`
|
|
3304
|
+
});
|
|
3305
|
+
}
|
|
3306
|
+
if ((nextStack.pythonWebFramework === "streamlit" || nextStack.pythonWebFramework === "none") && nextStack.pythonObservability === "prometheus-client") {
|
|
3307
|
+
nextStack.pythonObservability = "none";
|
|
3308
|
+
changed = true;
|
|
3309
|
+
changes.push({
|
|
3310
|
+
category: "pythonObservability",
|
|
3311
|
+
message: "Observability set to 'None' (prometheus-client needs an HTTP server to expose /metrics)"
|
|
3312
|
+
});
|
|
3313
|
+
}
|
|
3314
|
+
if (nextStack.pythonServer === "gunicorn" && (nextStack.pythonWebFramework === "streamlit" || nextStack.pythonWebFramework === "none")) {
|
|
3315
|
+
nextStack.pythonServer = "none";
|
|
3316
|
+
changed = true;
|
|
3317
|
+
changes.push({
|
|
3318
|
+
category: "pythonServer",
|
|
3319
|
+
message: "Production server set to 'None' (Gunicorn requires a WSGI, ASGI, or aiohttp app)"
|
|
3320
|
+
});
|
|
3321
|
+
}
|
|
2861
3322
|
}
|
|
2862
3323
|
if (nextStack.ecosystem === "java") {
|
|
2863
3324
|
if (nextStack.javaBuildTool === "none") {
|
|
@@ -2972,7 +3433,9 @@ const analyzeStackCompatibility = (stack) => {
|
|
|
2972
3433
|
"elixirAuth",
|
|
2973
3434
|
"elixirApi",
|
|
2974
3435
|
"elixirRealtime",
|
|
2975
|
-
"elixirObservability"
|
|
3436
|
+
"elixirObservability",
|
|
3437
|
+
"elixirI18n",
|
|
3438
|
+
"elixirHttpServer"
|
|
2976
3439
|
]) {
|
|
2977
3440
|
const value = nextStack[key];
|
|
2978
3441
|
if (key !== "elixirObservability" ? value !== "none" : value === "phoenix-telemetry") {
|
|
@@ -3034,6 +3497,19 @@ const analyzeStackCompatibility = (stack) => {
|
|
|
3034
3497
|
message: "Elixir auth set to 'None' (phx.gen.auth requires Ecto SQL with PostgreSQL)"
|
|
3035
3498
|
});
|
|
3036
3499
|
}
|
|
3500
|
+
const sqlBackedElixirOrms = new Set([
|
|
3501
|
+
"ecto-sql",
|
|
3502
|
+
"myxql",
|
|
3503
|
+
"ecto_sqlite3"
|
|
3504
|
+
]);
|
|
3505
|
+
if (nextStack.elixirAuth === "pow" && !sqlBackedElixirOrms.has(nextStack.elixirOrm)) {
|
|
3506
|
+
nextStack.elixirAuth = "none";
|
|
3507
|
+
changed = true;
|
|
3508
|
+
changes.push({
|
|
3509
|
+
category: "elixirAuth",
|
|
3510
|
+
message: "Elixir auth set to 'None' (Pow requires an Ecto SQL repository)"
|
|
3511
|
+
});
|
|
3512
|
+
}
|
|
3037
3513
|
}
|
|
3038
3514
|
if (nextStack.webDeploy !== "none" && !nextStack.webFrontend.some((f) => f !== "none")) {
|
|
3039
3515
|
nextStack.webDeploy = "none";
|
|
@@ -3043,6 +3519,16 @@ const analyzeStackCompatibility = (stack) => {
|
|
|
3043
3519
|
message: "Web deploy set to 'None' (no web frontend)"
|
|
3044
3520
|
});
|
|
3045
3521
|
}
|
|
3522
|
+
const unsupportedWebDeployFrontend = getUnsupportedWebDeployFrontend(nextStack.webDeploy, nextStack.webFrontend);
|
|
3523
|
+
if (nextStack.webDeploy !== "none" && unsupportedWebDeployFrontend) {
|
|
3524
|
+
const webDeploy = nextStack.webDeploy;
|
|
3525
|
+
nextStack.webDeploy = "none";
|
|
3526
|
+
changed = true;
|
|
3527
|
+
changes.push({
|
|
3528
|
+
category: "webDeploy",
|
|
3529
|
+
message: `Web deploy set to 'None' ('${webDeploy}' is not wired for the '${unsupportedWebDeployFrontend}' frontend)`
|
|
3530
|
+
});
|
|
3531
|
+
}
|
|
3046
3532
|
if (nextStack.serverDeploy === "cloudflare") {
|
|
3047
3533
|
if (nextStack.runtime !== "workers" || nextStack.backend !== "hono") {
|
|
3048
3534
|
nextStack.serverDeploy = "none";
|
|
@@ -3094,6 +3580,16 @@ const analyzeStackCompatibility = (stack) => {
|
|
|
3094
3580
|
* - Follow CLI behavior: filter options based on UPSTREAM selections only
|
|
3095
3581
|
*/
|
|
3096
3582
|
const getDisabledReason = (currentStack, category, optionId) => {
|
|
3583
|
+
const hasStandaloneViteFrontend = currentStack.webFrontend.some((frontend) => ["vanilla-vite", "vue"].includes(frontend));
|
|
3584
|
+
if (category === "api" && hasStandaloneViteFrontend && [
|
|
3585
|
+
"trpc",
|
|
3586
|
+
"orpc",
|
|
3587
|
+
"ts-rest",
|
|
3588
|
+
"garph"
|
|
3589
|
+
].includes(optionId)) return "Standalone Vite frontends support only GraphQL and OpenAPI API integrations";
|
|
3590
|
+
if (category === "forms" && hasStandaloneViteFrontend && optionId !== "none") return "Form library integrations are not yet wired for standalone Vue or Vanilla Vite";
|
|
3591
|
+
if (category === "cms" && hasStandaloneViteFrontend && optionId !== "none" && optionId !== "contentful") return "CMS integrations other than Contentful are not yet wired for standalone Vue or Vanilla Vite";
|
|
3592
|
+
if (category === "featureFlags" && hasStandaloneViteFrontend && optionId !== "none") return "Feature flag client integrations are not yet wired for standalone Vue or Vanilla Vite";
|
|
3097
3593
|
if (currentStack.backend === "convex") {
|
|
3098
3594
|
if (category === "runtime" && optionId !== "none") return "Convex provides its own runtime";
|
|
3099
3595
|
if (category === "database" && optionId !== "none") return "Convex provides its own database";
|
|
@@ -3129,6 +3625,7 @@ const getDisabledReason = (currentStack, category, optionId) => {
|
|
|
3129
3625
|
"mobilePush",
|
|
3130
3626
|
"mobileOTA",
|
|
3131
3627
|
"mobileDeepLinking",
|
|
3628
|
+
"mobileLibraries",
|
|
3132
3629
|
"auth",
|
|
3133
3630
|
"payments",
|
|
3134
3631
|
"packageManager",
|
|
@@ -3173,6 +3670,21 @@ const getDisabledReason = (currentStack, category, optionId) => {
|
|
|
3173
3670
|
if (category === "caching" && optionId === "upstash-redis") return "The Upstash Redis integration is Java-only in the Java ecosystem scaffold";
|
|
3174
3671
|
if (category === "observability" && optionId === "sentry") return "The Sentry integration is Java-only in the Java ecosystem scaffold";
|
|
3175
3672
|
}
|
|
3673
|
+
if (currentStack.ecosystem === "rust") {
|
|
3674
|
+
const filterOnlyFramework = currentStack.rustWebFramework === "warp" || currentStack.rustWebFramework === "salvo";
|
|
3675
|
+
if (category === "rustApi" && filterOnlyFramework && optionId !== "none" && optionId !== "jsonrpsee") return "Warp and Salvo currently support REST or the standalone jsonrpsee server";
|
|
3676
|
+
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";
|
|
3677
|
+
if (category === "rustApi" && currentStack.rustWebFramework === "loco" && optionId === "jsonrpsee") return "Loco owns the server boot sequence; jsonrpsee is available with the other Rust frameworks";
|
|
3678
|
+
if (category === "rustWebFramework" && optionId === "loco" && currentStack.rustApi === "jsonrpsee") return "Loco owns the server boot sequence and cannot start the generated jsonrpsee server";
|
|
3679
|
+
if (category === "rustAuth" && optionId === "tower-sessions" && currentStack.rustWebFramework !== "axum") return "The generated tower-sessions middleware is wired specifically for Axum";
|
|
3680
|
+
if (category === "rustWebFramework" && optionId !== "axum" && currentStack.rustAuth === "tower-sessions") return "tower-sessions requires the generated Axum middleware stack";
|
|
3681
|
+
if (category === "rustAuth" && optionId === "torii" && currentStack.rustOrm === "rusqlite") return "Torii's sqlx-based storage conflicts with rusqlite (both link the native sqlite3 library)";
|
|
3682
|
+
if (category === "rustOrm" && optionId === "rusqlite" && currentStack.rustAuth === "torii") return "rusqlite conflicts with Torii's sqlx-based storage (both link the native sqlite3 library)";
|
|
3683
|
+
}
|
|
3684
|
+
if (category === "pythonApi") {
|
|
3685
|
+
if (optionId !== "none" && currentStack.pythonWebFramework !== "django") return "Python API frameworks currently require Django";
|
|
3686
|
+
}
|
|
3687
|
+
if (category === "pythonServer" && optionId === "gunicorn" && (currentStack.pythonWebFramework === "streamlit" || currentStack.pythonWebFramework === "none")) return "Gunicorn requires a WSGI, ASGI, or aiohttp application";
|
|
3176
3688
|
const graphDisabledReason = category === "payments" && optionId === "revenuecat" || category === "i18n" && optionId === "intlayer" ? {
|
|
3177
3689
|
handled: false,
|
|
3178
3690
|
authoritative: false,
|
|
@@ -3351,12 +3863,17 @@ const getDisabledReason = (currentStack, category, optionId) => {
|
|
|
3351
3863
|
if (category === "payments" && optionId === "revenuecat") {
|
|
3352
3864
|
if (!hasRevenueCatCompatibleNativeFrontend(currentStack.nativeFrontend)) return "RevenueCat payments requires a native frontend (native-bare, native-uniwind, or native-unistyles)";
|
|
3353
3865
|
}
|
|
3866
|
+
if (category === "payments" && optionId === "paypal") {
|
|
3867
|
+
if (!currentStack.webFrontend.some((f) => f !== "none")) return "PayPal requires a web frontend";
|
|
3868
|
+
if (["none", "convex"].includes(currentStack.backend)) return "PayPal checkout requires a standalone or fullstack backend";
|
|
3869
|
+
}
|
|
3354
3870
|
if (category === "cms" && optionId === "payload") {
|
|
3355
3871
|
if (!currentStack.webFrontend.includes("next")) return "Payload CMS v3 requires Next.js";
|
|
3356
3872
|
}
|
|
3357
3873
|
if (category === "cms" && optionId === "keystatic") {
|
|
3358
3874
|
if (!currentStack.webFrontend.includes("next")) return "Keystatic is currently scaffolded for Next.js only because @keystatic/astro is not Astro 7-compatible yet.";
|
|
3359
3875
|
}
|
|
3876
|
+
if (category === "realtime" && optionId === "ws" && currentStack.backend !== "express") return "The ws integration is currently wired for the Express backend";
|
|
3360
3877
|
if (category === "email" && optionId !== "none") {
|
|
3361
3878
|
if (currentStack.ecosystem !== "typescript") return null;
|
|
3362
3879
|
if (currentStack.backend === "convex") return "Email integration is not available with Convex backend";
|
|
@@ -3382,6 +3899,7 @@ const getDisabledReason = (currentStack, category, optionId) => {
|
|
|
3382
3899
|
if (currentStack.ecosystem !== "typescript") return "Vector database is only available for the TypeScript ecosystem";
|
|
3383
3900
|
}
|
|
3384
3901
|
if (category === "ai" && requiresChatSdkVercelAI(currentStack) && optionId !== "vercel-ai") return "Chat SDK example (Nuxt/Hono profile) requires Vercel AI SDK in v1";
|
|
3902
|
+
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";
|
|
3385
3903
|
if (category === "ai" && optionId === "tanstack-ai") {
|
|
3386
3904
|
const compatibleFrontends = [
|
|
3387
3905
|
"tanstack-router",
|
|
@@ -3403,11 +3921,32 @@ const getDisabledReason = (currentStack, category, optionId) => {
|
|
|
3403
3921
|
"tanstack-db",
|
|
3404
3922
|
"tanstack-pacer"
|
|
3405
3923
|
].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)";
|
|
3924
|
+
if (optionId === "graphql-codegen" && ![
|
|
3925
|
+
"garph",
|
|
3926
|
+
"graphql-yoga",
|
|
3927
|
+
"apollo-server"
|
|
3928
|
+
].includes(currentStack.api) && !currentStack.webFrontend.includes("redwood")) return "GraphQL Code Generator requires a GraphQL API selection";
|
|
3929
|
+
if (optionId === "openapi-typescript" && currentStack.api !== "openapi") return "openapi-typescript requires the OpenAPI API selection";
|
|
3930
|
+
if (optionId === "openapi-typescript" && currentStack.backend === "self") return "openapi-typescript requires a standalone backend that exposes an OpenAPI schema";
|
|
3931
|
+
if (optionId === "apollo-client" && ![
|
|
3932
|
+
"garph",
|
|
3933
|
+
"graphql-yoga",
|
|
3934
|
+
"apollo-server"
|
|
3935
|
+
].includes(currentStack.api)) return "Apollo Client requires a GraphQL API selection";
|
|
3406
3936
|
}
|
|
3407
3937
|
if (category === "cssFramework") {
|
|
3408
3938
|
if (!currentStack.webFrontend.some((f) => f !== "none")) {
|
|
3409
3939
|
if (optionId !== "none") return "CSS framework requires a web frontend";
|
|
3410
3940
|
}
|
|
3941
|
+
if (optionId === "styled-components" && !currentStack.webFrontend.some((f) => [
|
|
3942
|
+
"tanstack-router",
|
|
3943
|
+
"react-router",
|
|
3944
|
+
"react-vite",
|
|
3945
|
+
"tanstack-start",
|
|
3946
|
+
"next",
|
|
3947
|
+
"vinext",
|
|
3948
|
+
"redwood"
|
|
3949
|
+
].includes(f))) return "styled-components requires a React frontend";
|
|
3411
3950
|
if ([
|
|
3412
3951
|
"shadcn-ui",
|
|
3413
3952
|
"shadcn-svelte",
|
|
@@ -3422,7 +3961,8 @@ const getDisabledReason = (currentStack, category, optionId) => {
|
|
|
3422
3961
|
"mobileTesting",
|
|
3423
3962
|
"mobilePush",
|
|
3424
3963
|
"mobileOTA",
|
|
3425
|
-
"mobileDeepLinking"
|
|
3964
|
+
"mobileDeepLinking",
|
|
3965
|
+
"mobileLibraries"
|
|
3426
3966
|
]).has(category)) {
|
|
3427
3967
|
if (!currentStack.nativeFrontend.some((f) => f !== "none") && optionId !== "none") return `${getCategoryDisplayName(category)} requires a native Expo frontend`;
|
|
3428
3968
|
if (category === "mobileNavigation" && optionId === "react-navigation") return null;
|
|
@@ -3540,9 +4080,16 @@ const getDisabledReason = (currentStack, category, optionId) => {
|
|
|
3540
4080
|
if (unsupportedFrontend) return `Intlayer is not yet wired for the '${unsupportedFrontend}' frontend`;
|
|
3541
4081
|
}
|
|
3542
4082
|
}
|
|
3543
|
-
if (category === "
|
|
3544
|
-
|
|
3545
|
-
|
|
4083
|
+
if (category === "goMigrations" && optionId !== "none" && currentStack.ecosystem === "go" && ![
|
|
4084
|
+
"sqlite",
|
|
4085
|
+
"postgres",
|
|
4086
|
+
"mysql"
|
|
4087
|
+
].includes(currentStack.database)) return "Go migrations require SQLite, PostgreSQL, or MySQL";
|
|
4088
|
+
if (category === "database" && currentStack.ecosystem === "go" && currentStack.goMigrations !== "none" && ![
|
|
4089
|
+
"sqlite",
|
|
4090
|
+
"postgres",
|
|
4091
|
+
"mysql"
|
|
4092
|
+
].includes(optionId)) return "The selected Go migration tool requires SQLite, PostgreSQL, or MySQL";
|
|
3546
4093
|
if (category === "javaWebFramework") {
|
|
3547
4094
|
if (optionId !== "none" && currentStack.javaBuildTool === "none") return "Java web frameworks require Maven or Gradle";
|
|
3548
4095
|
}
|
|
@@ -3593,11 +4140,30 @@ const getDisabledReason = (currentStack, category, optionId) => {
|
|
|
3593
4140
|
"elixirObservability",
|
|
3594
4141
|
"elixirTesting",
|
|
3595
4142
|
"elixirQuality",
|
|
4143
|
+
"elixirI18n",
|
|
4144
|
+
"elixirHttpServer",
|
|
4145
|
+
"elixirApplicationFramework",
|
|
4146
|
+
"elixirDocumentation",
|
|
4147
|
+
"elixirClustering",
|
|
3596
4148
|
"elixirDeploy"
|
|
3597
4149
|
]).has(category) && optionId !== "none") {
|
|
3598
4150
|
if (currentStack.ecosystem !== "elixir") return "Elixir options only apply when the Elixir ecosystem is selected";
|
|
3599
4151
|
}
|
|
3600
4152
|
if (category === "elixirTesting" && optionId === "wallaby" && currentStack.ecosystem === "elixir" && currentStack.elixirWebFramework === "none") return "Wallaby browser tests require Phoenix";
|
|
4153
|
+
if (category === "elixirTesting" && optionId === "ex_machina" && currentStack.ecosystem === "elixir" && ![
|
|
4154
|
+
"ecto-sql",
|
|
4155
|
+
"myxql",
|
|
4156
|
+
"ecto_sqlite3"
|
|
4157
|
+
].includes(currentStack.elixirOrm)) return "ExMachina requires an Ecto SQL repository";
|
|
4158
|
+
if (category === "elixirAuth" && optionId === "pow" && currentStack.ecosystem === "elixir" && (currentStack.elixirWebFramework === "none" || ![
|
|
4159
|
+
"ecto-sql",
|
|
4160
|
+
"myxql",
|
|
4161
|
+
"ecto_sqlite3"
|
|
4162
|
+
].includes(currentStack.elixirOrm))) return "Pow requires Phoenix and an Ecto SQL repository";
|
|
4163
|
+
if ((category === "elixirApi" && optionId === "open_api_spex" || category === "elixirI18n" && optionId === "gettext") && currentStack.ecosystem === "elixir" && currentStack.elixirWebFramework === "none") return `${getCategoryDisplayName(category)} requires Phoenix`;
|
|
4164
|
+
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";
|
|
4165
|
+
if (category === "elixirJobs" && optionId === "oban" && currentStack.ecosystem === "elixir" && currentStack.elixirOrm !== "ecto-sql") return "Oban requires the PostgreSQL Ecto SQL option";
|
|
4166
|
+
if (category === "elixirOrm" && ["myxql", "ecto_sqlite3"].includes(optionId) && currentStack.ecosystem === "elixir" && currentStack.elixirJobs === "oban") return "Oban requires PostgreSQL-backed Ecto SQL";
|
|
3601
4167
|
if (category === "elixirWebFramework" && optionId !== "none" && currentStack.ecosystem !== "elixir") return "Elixir web frameworks are available only in the Elixir ecosystem";
|
|
3602
4168
|
if (category === "elixirJson" && optionId === "none" && currentStack.ecosystem === "elixir" && currentStack.elixirWebFramework !== "none") return "Phoenix JSON scaffolds require Jason";
|
|
3603
4169
|
return null;
|
|
@@ -3642,6 +4208,11 @@ const ELIXIR_GRAPH_DISABLED_REASON_ROLES = {
|
|
|
3642
4208
|
elixirObservability: "observability",
|
|
3643
4209
|
elixirTesting: "testing",
|
|
3644
4210
|
elixirQuality: "codeQuality",
|
|
4211
|
+
elixirI18n: "i18n",
|
|
4212
|
+
elixirHttpServer: "runtime",
|
|
4213
|
+
elixirApplicationFramework: "libraries",
|
|
4214
|
+
elixirDocumentation: "documentation",
|
|
4215
|
+
elixirClustering: "config",
|
|
3645
4216
|
elixirDeploy: "deploy"
|
|
3646
4217
|
};
|
|
3647
4218
|
function getElixirGraphBinding(currentStack, category) {
|
|
@@ -3861,6 +4432,15 @@ const GRAPH_DISABLED_REASON_BINDINGS = {
|
|
|
3861
4432
|
authoritative: true,
|
|
3862
4433
|
missingOwnerReason: "Mobile deep linking requires a native Expo frontend"
|
|
3863
4434
|
},
|
|
4435
|
+
mobileLibraries: {
|
|
4436
|
+
role: "libraries",
|
|
4437
|
+
ecosystem: "react-native",
|
|
4438
|
+
ownerRole: "mobile",
|
|
4439
|
+
ownerEcosystem: "react-native",
|
|
4440
|
+
authoritative: true,
|
|
4441
|
+
missingOwnerReason: "Mobile libraries require a native Expo frontend",
|
|
4442
|
+
candidateIdPrefix: "candidate:native"
|
|
4443
|
+
},
|
|
3864
4444
|
javaBuildTool: {
|
|
3865
4445
|
role: "buildTool",
|
|
3866
4446
|
ecosystem: "java",
|
|
@@ -3980,6 +4560,62 @@ const GRAPH_DISABLED_REASON_BINDINGS = {
|
|
|
3980
4560
|
currentEcosystem: "python",
|
|
3981
4561
|
authoritative: true
|
|
3982
4562
|
},
|
|
4563
|
+
pythonCloudSdk: {
|
|
4564
|
+
role: "cloudSdk",
|
|
4565
|
+
ecosystem: "python",
|
|
4566
|
+
ownerRole: "backend",
|
|
4567
|
+
ownerEcosystem: "python",
|
|
4568
|
+
currentEcosystem: "python",
|
|
4569
|
+
authoritative: true
|
|
4570
|
+
},
|
|
4571
|
+
pythonHttpClient: {
|
|
4572
|
+
role: "httpClient",
|
|
4573
|
+
ecosystem: "python",
|
|
4574
|
+
ownerRole: "backend",
|
|
4575
|
+
ownerEcosystem: "python",
|
|
4576
|
+
currentEcosystem: "python",
|
|
4577
|
+
authoritative: true
|
|
4578
|
+
},
|
|
4579
|
+
pythonData: {
|
|
4580
|
+
role: "data",
|
|
4581
|
+
ecosystem: "python",
|
|
4582
|
+
ownerRole: "backend",
|
|
4583
|
+
ownerEcosystem: "python",
|
|
4584
|
+
currentEcosystem: "python",
|
|
4585
|
+
authoritative: true
|
|
4586
|
+
},
|
|
4587
|
+
pythonMedia: {
|
|
4588
|
+
role: "media",
|
|
4589
|
+
ecosystem: "python",
|
|
4590
|
+
ownerRole: "backend",
|
|
4591
|
+
ownerEcosystem: "python",
|
|
4592
|
+
currentEcosystem: "python",
|
|
4593
|
+
authoritative: true
|
|
4594
|
+
},
|
|
4595
|
+
pythonServer: {
|
|
4596
|
+
role: "server",
|
|
4597
|
+
ecosystem: "python",
|
|
4598
|
+
ownerRole: "backend",
|
|
4599
|
+
ownerEcosystem: "python",
|
|
4600
|
+
currentEcosystem: "python",
|
|
4601
|
+
authoritative: true
|
|
4602
|
+
},
|
|
4603
|
+
pythonPackageManager: {
|
|
4604
|
+
role: "packageManager",
|
|
4605
|
+
ecosystem: "python",
|
|
4606
|
+
ownerRole: "backend",
|
|
4607
|
+
ownerEcosystem: "python",
|
|
4608
|
+
currentEcosystem: "python",
|
|
4609
|
+
authoritative: true
|
|
4610
|
+
},
|
|
4611
|
+
pythonMessageQueue: {
|
|
4612
|
+
role: "messageQueue",
|
|
4613
|
+
ecosystem: "python",
|
|
4614
|
+
ownerRole: "backend",
|
|
4615
|
+
ownerEcosystem: "python",
|
|
4616
|
+
currentEcosystem: "python",
|
|
4617
|
+
authoritative: true
|
|
4618
|
+
},
|
|
3983
4619
|
goTesting: {
|
|
3984
4620
|
role: "testing",
|
|
3985
4621
|
ecosystem: "go",
|
|
@@ -4030,6 +4666,54 @@ const GRAPH_DISABLED_REASON_BINDINGS = {
|
|
|
4030
4666
|
authoritative: true,
|
|
4031
4667
|
candidateIdPrefix: "candidate:native"
|
|
4032
4668
|
},
|
|
4669
|
+
goValidation: {
|
|
4670
|
+
role: "validation",
|
|
4671
|
+
ecosystem: "go",
|
|
4672
|
+
ownerRole: "backend",
|
|
4673
|
+
ownerEcosystem: "go",
|
|
4674
|
+
currentEcosystem: "go",
|
|
4675
|
+
authoritative: true
|
|
4676
|
+
},
|
|
4677
|
+
goQuality: {
|
|
4678
|
+
role: "codeQuality",
|
|
4679
|
+
ecosystem: "go",
|
|
4680
|
+
ownerRole: "backend",
|
|
4681
|
+
ownerEcosystem: "go",
|
|
4682
|
+
currentEcosystem: "go",
|
|
4683
|
+
authoritative: true
|
|
4684
|
+
},
|
|
4685
|
+
goMigrations: {
|
|
4686
|
+
role: "migrations",
|
|
4687
|
+
ecosystem: "go",
|
|
4688
|
+
ownerRole: "backend",
|
|
4689
|
+
ownerEcosystem: "go",
|
|
4690
|
+
currentEcosystem: "go",
|
|
4691
|
+
authoritative: true
|
|
4692
|
+
},
|
|
4693
|
+
goTemplating: {
|
|
4694
|
+
role: "templating",
|
|
4695
|
+
ecosystem: "go",
|
|
4696
|
+
ownerRole: "backend",
|
|
4697
|
+
ownerEcosystem: "go",
|
|
4698
|
+
currentEcosystem: "go",
|
|
4699
|
+
authoritative: true
|
|
4700
|
+
},
|
|
4701
|
+
goProtoTooling: {
|
|
4702
|
+
role: "buildTool",
|
|
4703
|
+
ecosystem: "go",
|
|
4704
|
+
ownerRole: "backend",
|
|
4705
|
+
ownerEcosystem: "go",
|
|
4706
|
+
currentEcosystem: "go",
|
|
4707
|
+
authoritative: true
|
|
4708
|
+
},
|
|
4709
|
+
goDI: {
|
|
4710
|
+
role: "libraries",
|
|
4711
|
+
ecosystem: "go",
|
|
4712
|
+
ownerRole: "backend",
|
|
4713
|
+
ownerEcosystem: "go",
|
|
4714
|
+
currentEcosystem: "go",
|
|
4715
|
+
authoritative: true
|
|
4716
|
+
},
|
|
4033
4717
|
dotnetOrm: {
|
|
4034
4718
|
role: "orm",
|
|
4035
4719
|
ecosystem: "dotnet",
|
|
@@ -4105,6 +4789,15 @@ const GRAPH_DISABLED_REASON_BINDINGS = {
|
|
|
4105
4789
|
ownerEcosystem: "dotnet",
|
|
4106
4790
|
currentEcosystem: "dotnet",
|
|
4107
4791
|
authoritative: true
|
|
4792
|
+
},
|
|
4793
|
+
dotnetLibraries: {
|
|
4794
|
+
role: "libraries",
|
|
4795
|
+
ecosystem: "dotnet",
|
|
4796
|
+
ownerRole: "backend",
|
|
4797
|
+
ownerEcosystem: "dotnet",
|
|
4798
|
+
currentEcosystem: "dotnet",
|
|
4799
|
+
authoritative: true,
|
|
4800
|
+
candidateIdPrefix: "candidate:native"
|
|
4108
4801
|
}
|
|
4109
4802
|
};
|
|
4110
4803
|
function compatibilityInputToGraphProjectConfig(currentStack) {
|
|
@@ -4165,6 +4858,8 @@ const WEB_FRAMEWORKS = [
|
|
|
4165
4858
|
"tanstack-router",
|
|
4166
4859
|
"react-router",
|
|
4167
4860
|
"react-vite",
|
|
4861
|
+
"vanilla-vite",
|
|
4862
|
+
"vue",
|
|
4168
4863
|
"tanstack-start",
|
|
4169
4864
|
"next",
|
|
4170
4865
|
"vinext",
|
|
@@ -4179,11 +4874,32 @@ const WEB_FRAMEWORKS = [
|
|
|
4179
4874
|
"fresh",
|
|
4180
4875
|
"none"
|
|
4181
4876
|
];
|
|
4877
|
+
const CODEGEN_COMPATIBLE_FRONTENDS = [
|
|
4878
|
+
"tanstack-router",
|
|
4879
|
+
"react-router",
|
|
4880
|
+
"react-vite",
|
|
4881
|
+
"vanilla-vite",
|
|
4882
|
+
"vue",
|
|
4883
|
+
"tanstack-start",
|
|
4884
|
+
"next",
|
|
4885
|
+
"vinext",
|
|
4886
|
+
"nuxt",
|
|
4887
|
+
"svelte",
|
|
4888
|
+
"solid",
|
|
4889
|
+
"solid-start",
|
|
4890
|
+
"astro",
|
|
4891
|
+
"qwik",
|
|
4892
|
+
"angular",
|
|
4893
|
+
"redwood",
|
|
4894
|
+
"fresh"
|
|
4895
|
+
];
|
|
4182
4896
|
const ADDON_COMPATIBILITY = {
|
|
4183
4897
|
pwa: [
|
|
4184
4898
|
"tanstack-router",
|
|
4185
4899
|
"react-router",
|
|
4186
4900
|
"react-vite",
|
|
4901
|
+
"vanilla-vite",
|
|
4902
|
+
"vue",
|
|
4187
4903
|
"solid",
|
|
4188
4904
|
"next",
|
|
4189
4905
|
"vinext",
|
|
@@ -4197,6 +4913,8 @@ const ADDON_COMPATIBILITY = {
|
|
|
4197
4913
|
"tanstack-router",
|
|
4198
4914
|
"react-router",
|
|
4199
4915
|
"react-vite",
|
|
4916
|
+
"vanilla-vite",
|
|
4917
|
+
"vue",
|
|
4200
4918
|
"nuxt",
|
|
4201
4919
|
"svelte",
|
|
4202
4920
|
"solid",
|
|
@@ -4207,7 +4925,23 @@ const ADDON_COMPATIBILITY = {
|
|
|
4207
4925
|
"redwood",
|
|
4208
4926
|
"fresh"
|
|
4209
4927
|
],
|
|
4928
|
+
electron: [
|
|
4929
|
+
"tanstack-router",
|
|
4930
|
+
"react-vite",
|
|
4931
|
+
"vanilla-vite",
|
|
4932
|
+
"vue",
|
|
4933
|
+
"solid"
|
|
4934
|
+
],
|
|
4935
|
+
capacitor: [
|
|
4936
|
+
"tanstack-router",
|
|
4937
|
+
"react-vite",
|
|
4938
|
+
"vanilla-vite",
|
|
4939
|
+
"vue",
|
|
4940
|
+
"solid"
|
|
4941
|
+
],
|
|
4210
4942
|
biome: [],
|
|
4943
|
+
eslint: [],
|
|
4944
|
+
prettier: [],
|
|
4211
4945
|
husky: [],
|
|
4212
4946
|
lefthook: [],
|
|
4213
4947
|
turborepo: [],
|
|
@@ -4231,6 +4965,55 @@ const ADDON_COMPATIBILITY = {
|
|
|
4231
4965
|
"svelte",
|
|
4232
4966
|
"solid"
|
|
4233
4967
|
],
|
|
4968
|
+
axios: [
|
|
4969
|
+
"tanstack-router",
|
|
4970
|
+
"react-router",
|
|
4971
|
+
"react-vite",
|
|
4972
|
+
"vanilla-vite",
|
|
4973
|
+
"vue",
|
|
4974
|
+
"tanstack-start",
|
|
4975
|
+
"next",
|
|
4976
|
+
"vinext",
|
|
4977
|
+
"nuxt",
|
|
4978
|
+
"svelte",
|
|
4979
|
+
"solid",
|
|
4980
|
+
"solid-start",
|
|
4981
|
+
"astro",
|
|
4982
|
+
"qwik",
|
|
4983
|
+
"angular"
|
|
4984
|
+
],
|
|
4985
|
+
firebase: [
|
|
4986
|
+
"tanstack-router",
|
|
4987
|
+
"react-router",
|
|
4988
|
+
"react-vite",
|
|
4989
|
+
"vanilla-vite",
|
|
4990
|
+
"vue",
|
|
4991
|
+
"tanstack-start",
|
|
4992
|
+
"next",
|
|
4993
|
+
"vinext",
|
|
4994
|
+
"nuxt",
|
|
4995
|
+
"svelte",
|
|
4996
|
+
"solid",
|
|
4997
|
+
"solid-start",
|
|
4998
|
+
"astro",
|
|
4999
|
+
"qwik",
|
|
5000
|
+
"angular"
|
|
5001
|
+
],
|
|
5002
|
+
"graphql-codegen": CODEGEN_COMPATIBLE_FRONTENDS,
|
|
5003
|
+
"openapi-typescript": CODEGEN_COMPATIBLE_FRONTENDS,
|
|
5004
|
+
"apollo-client": [
|
|
5005
|
+
"tanstack-router",
|
|
5006
|
+
"react-router",
|
|
5007
|
+
"react-vite",
|
|
5008
|
+
"vue",
|
|
5009
|
+
"tanstack-start",
|
|
5010
|
+
"next",
|
|
5011
|
+
"vinext",
|
|
5012
|
+
"nuxt",
|
|
5013
|
+
"svelte",
|
|
5014
|
+
"solid",
|
|
5015
|
+
"solid-start"
|
|
5016
|
+
],
|
|
4234
5017
|
swr: [
|
|
4235
5018
|
"tanstack-router",
|
|
4236
5019
|
"react-router",
|
|
@@ -4334,6 +5117,7 @@ function allowedApisForFrontends(frontends = [], astroIntegration) {
|
|
|
4334
5117
|
const includesAngular = frontends.includes("angular");
|
|
4335
5118
|
const includesRedwood = frontends.includes("redwood");
|
|
4336
5119
|
const includesFresh = frontends.includes("fresh");
|
|
5120
|
+
const includesStandaloneVite = frontends.includes("vanilla-vite") || frontends.includes("vue");
|
|
4337
5121
|
const includesNative = frontends.some((frontend) => [
|
|
4338
5122
|
"native-bare",
|
|
4339
5123
|
"native-uniwind",
|
|
@@ -4356,6 +5140,12 @@ function allowedApisForFrontends(frontends = [], astroIntegration) {
|
|
|
4356
5140
|
"garph",
|
|
4357
5141
|
"none"
|
|
4358
5142
|
];
|
|
5143
|
+
if (includesStandaloneVite) return [
|
|
5144
|
+
"graphql-yoga",
|
|
5145
|
+
"apollo-server",
|
|
5146
|
+
"openapi",
|
|
5147
|
+
"none"
|
|
5148
|
+
];
|
|
4359
5149
|
if (includesQwik || includesAngular || includesRedwood || includesFresh) return ["graphql-yoga", "none"];
|
|
4360
5150
|
const includesSolidStartApi = frontends.includes("solid-start");
|
|
4361
5151
|
if (includesNuxt || includesSvelte || includesSolid || includesSolidStartApi) return [
|
|
@@ -4390,7 +5180,23 @@ function getApiFrontendCompatibilityIssue(api, frontends = [], astroIntegration)
|
|
|
4390
5180
|
const includesRedwood = frontends.includes("redwood");
|
|
4391
5181
|
const includesFresh = frontends.includes("fresh");
|
|
4392
5182
|
const includesSolidStart = frontends.includes("solid-start");
|
|
5183
|
+
const includesStandaloneVite = frontends.includes("vanilla-vite") || frontends.includes("vue");
|
|
4393
5184
|
const isReactOnlyApi = api === "trpc" || api === "ts-rest" || api === "garph" || api === "apollo-server";
|
|
5185
|
+
if (includesStandaloneVite && (api === "trpc" || api === "orpc" || api === "ts-rest" || api === "garph")) return {
|
|
5186
|
+
code: "STANDALONE_VITE_API_UNSUPPORTED",
|
|
5187
|
+
message: "Standalone Vite frontends support only GraphQL and OpenAPI API integrations.",
|
|
5188
|
+
category: "api",
|
|
5189
|
+
optionId: api,
|
|
5190
|
+
provided: {
|
|
5191
|
+
api,
|
|
5192
|
+
frontend: frontends.includes("vanilla-vite") ? "vanilla-vite" : "vue"
|
|
5193
|
+
},
|
|
5194
|
+
suggestions: [
|
|
5195
|
+
"Use --api graphql-yoga, --api apollo-server, or --api openapi",
|
|
5196
|
+
"Choose a React-based frontend for tRPC, oRPC, ts-rest, or garph",
|
|
5197
|
+
"Use --api none"
|
|
5198
|
+
]
|
|
5199
|
+
};
|
|
4394
5200
|
if ((includesNuxt || includesSvelte || includesSolid || includesSolidStart) && isReactOnlyApi) {
|
|
4395
5201
|
const incompatibleFrontend = includesNuxt ? "nuxt" : includesSvelte ? "svelte" : includesSolid ? "solid" : "solid-start";
|
|
4396
5202
|
return {
|
|
@@ -4558,21 +5364,33 @@ function getCompatibleUILibraries(frontends = [], astroIntegration) {
|
|
|
4558
5364
|
return compatibility.frontends.includes(webFrontend);
|
|
4559
5365
|
});
|
|
4560
5366
|
}
|
|
4561
|
-
function getCompatibleCSSFrameworks(uiLibrary) {
|
|
4562
|
-
|
|
5367
|
+
function getCompatibleCSSFrameworks(uiLibrary, frontends = []) {
|
|
5368
|
+
const frameworks = !uiLibrary || uiLibrary === "none" ? [
|
|
4563
5369
|
"tailwind",
|
|
4564
5370
|
"scss",
|
|
4565
5371
|
"less",
|
|
4566
5372
|
"postcss-only",
|
|
5373
|
+
"styled-components",
|
|
4567
5374
|
"none"
|
|
5375
|
+
] : [...UI_LIBRARY_COMPATIBILITY[uiLibrary].cssFrameworks];
|
|
5376
|
+
if (frontends.length === 0) return frameworks;
|
|
5377
|
+
const reactFrontends = [
|
|
5378
|
+
"tanstack-router",
|
|
5379
|
+
"react-router",
|
|
5380
|
+
"react-vite",
|
|
5381
|
+
"tanstack-start",
|
|
5382
|
+
"next",
|
|
5383
|
+
"vinext",
|
|
5384
|
+
"redwood"
|
|
4568
5385
|
];
|
|
4569
|
-
return
|
|
5386
|
+
return frontends.some((frontend) => reactFrontends.includes(frontend)) ? frameworks : frameworks.filter((framework) => framework !== "styled-components");
|
|
4570
5387
|
}
|
|
4571
5388
|
function hasWebStyling(frontends = []) {
|
|
4572
5389
|
const { web } = splitFrontends(frontends);
|
|
4573
5390
|
return web.length > 0;
|
|
4574
5391
|
}
|
|
4575
5392
|
function getCompatibleFormLibraries(frontends = []) {
|
|
5393
|
+
if (frontends.some((frontend) => ["vanilla-vite", "vue"].includes(frontend))) return ["none"];
|
|
4576
5394
|
const hasSolid = frontends.includes("solid");
|
|
4577
5395
|
const hasSolidStart = frontends.includes("solid-start");
|
|
4578
5396
|
const hasQwik = frontends.includes("qwik");
|
|
@@ -4608,6 +5426,8 @@ function evaluateCompatibility(input) {
|
|
|
4608
5426
|
["forms", input.forms],
|
|
4609
5427
|
["stateManagement", input.stateManagement],
|
|
4610
5428
|
["animation", input.animation],
|
|
5429
|
+
["cms", input.cms],
|
|
5430
|
+
["featureFlags", input.featureFlags],
|
|
4611
5431
|
["pythonApi", input.pythonApi],
|
|
4612
5432
|
["javaWebFramework", input.javaWebFramework],
|
|
4613
5433
|
["javaBuildTool", input.javaBuildTool],
|
|
@@ -4635,6 +5455,11 @@ function evaluateCompatibility(input) {
|
|
|
4635
5455
|
["elixirObservability", input.elixirObservability],
|
|
4636
5456
|
["elixirTesting", input.elixirTesting],
|
|
4637
5457
|
["elixirQuality", input.elixirQuality],
|
|
5458
|
+
["elixirI18n", input.elixirI18n],
|
|
5459
|
+
["elixirHttpServer", input.elixirHttpServer],
|
|
5460
|
+
["elixirApplicationFramework", input.elixirApplicationFramework],
|
|
5461
|
+
["elixirDocumentation", input.elixirDocumentation],
|
|
5462
|
+
["elixirClustering", input.elixirClustering],
|
|
4638
5463
|
["elixirDeploy", input.elixirDeploy]
|
|
4639
5464
|
];
|
|
4640
5465
|
for (const [category, optionId] of scalarChecks) {
|
|
@@ -4690,6 +5515,15 @@ function evaluateCompatibility(input) {
|
|
|
4690
5515
|
optionId: javaLibrary
|
|
4691
5516
|
});
|
|
4692
5517
|
}
|
|
5518
|
+
for (const mobileLibrary of input.mobileLibraries ?? []) {
|
|
5519
|
+
const reason = getDisabledReason(input, "mobileLibraries", mobileLibrary);
|
|
5520
|
+
if (reason) issues.push({
|
|
5521
|
+
code: "INCOMPATIBLE_MOBILE_LIBRARY",
|
|
5522
|
+
message: reason,
|
|
5523
|
+
category: "mobileLibraries",
|
|
5524
|
+
optionId: mobileLibrary
|
|
5525
|
+
});
|
|
5526
|
+
}
|
|
4693
5527
|
for (const testingLibrary of input.javaTestingLibraries) {
|
|
4694
5528
|
const reason = getDisabledReason(input, "javaTestingLibraries", testingLibrary);
|
|
4695
5529
|
if (reason) issues.push({
|
|
@@ -4717,6 +5551,15 @@ function evaluateCompatibility(input) {
|
|
|
4717
5551
|
optionId: observabilityLibrary
|
|
4718
5552
|
});
|
|
4719
5553
|
}
|
|
5554
|
+
for (const dotnetLibrary of input.dotnetLibraries ?? []) {
|
|
5555
|
+
const reason = getDisabledReason(input, "dotnetLibraries", dotnetLibrary);
|
|
5556
|
+
if (reason) issues.push({
|
|
5557
|
+
code: "INCOMPATIBLE_DOTNET_LIBRARY",
|
|
5558
|
+
message: reason,
|
|
5559
|
+
category: "dotnetLibraries",
|
|
5560
|
+
optionId: dotnetLibrary
|
|
5561
|
+
});
|
|
5562
|
+
}
|
|
4720
5563
|
return { issues };
|
|
4721
5564
|
}
|
|
4722
5565
|
|
|
@@ -4750,6 +5593,7 @@ const DEFAULT_STACK_SELECTION = {
|
|
|
4750
5593
|
mobilePush: "none",
|
|
4751
5594
|
mobileOTA: "none",
|
|
4752
5595
|
mobileDeepLinking: "none",
|
|
5596
|
+
mobileLibraries: [],
|
|
4753
5597
|
backendLibraries: "none",
|
|
4754
5598
|
stateManagement: "none",
|
|
4755
5599
|
forms: "react-hook-form",
|
|
@@ -4817,6 +5661,13 @@ const DEFAULT_STACK_SELECTION = {
|
|
|
4817
5661
|
pythonRealtime: "none",
|
|
4818
5662
|
pythonObservability: "none",
|
|
4819
5663
|
pythonCli: [],
|
|
5664
|
+
pythonCloudSdk: "none",
|
|
5665
|
+
pythonHttpClient: "none",
|
|
5666
|
+
pythonData: [],
|
|
5667
|
+
pythonMedia: "none",
|
|
5668
|
+
pythonServer: "none",
|
|
5669
|
+
pythonPackageManager: "uv",
|
|
5670
|
+
pythonMessageQueue: "none",
|
|
4820
5671
|
goWebFramework: "gin",
|
|
4821
5672
|
goOrm: "gorm",
|
|
4822
5673
|
goApi: "none",
|
|
@@ -4829,6 +5680,12 @@ const DEFAULT_STACK_SELECTION = {
|
|
|
4829
5680
|
goCaching: "none",
|
|
4830
5681
|
goConfig: "none",
|
|
4831
5682
|
goObservability: "none",
|
|
5683
|
+
goValidation: "none",
|
|
5684
|
+
goQuality: "none",
|
|
5685
|
+
goMigrations: "none",
|
|
5686
|
+
goTemplating: "none",
|
|
5687
|
+
goProtoTooling: "none",
|
|
5688
|
+
goDI: "none",
|
|
4832
5689
|
javaLanguage: "java",
|
|
4833
5690
|
javaWebFramework: "spring-boot",
|
|
4834
5691
|
javaBuildTool: "maven",
|
|
@@ -4849,6 +5706,7 @@ const DEFAULT_STACK_SELECTION = {
|
|
|
4849
5706
|
dotnetValidation: "none",
|
|
4850
5707
|
dotnetCaching: "none",
|
|
4851
5708
|
dotnetDeploy: "docker",
|
|
5709
|
+
dotnetLibraries: [],
|
|
4852
5710
|
elixirWebFramework: "phoenix",
|
|
4853
5711
|
elixirOrm: "ecto-sql",
|
|
4854
5712
|
elixirAuth: "none",
|
|
@@ -4863,6 +5721,11 @@ const DEFAULT_STACK_SELECTION = {
|
|
|
4863
5721
|
elixirObservability: "telemetry",
|
|
4864
5722
|
elixirTesting: "ex_unit",
|
|
4865
5723
|
elixirQuality: "credo",
|
|
5724
|
+
elixirI18n: "none",
|
|
5725
|
+
elixirHttpServer: "cowboy",
|
|
5726
|
+
elixirApplicationFramework: "none",
|
|
5727
|
+
elixirDocumentation: "none",
|
|
5728
|
+
elixirClustering: "none",
|
|
4866
5729
|
elixirDeploy: "none",
|
|
4867
5730
|
elixirLibraries: []
|
|
4868
5731
|
};
|
|
@@ -4897,6 +5760,7 @@ const STACK_SELECTION_OPTION_CATEGORY_BY_KEY = {
|
|
|
4897
5760
|
mobilePush: "mobilePush",
|
|
4898
5761
|
mobileOTA: "mobileOTA",
|
|
4899
5762
|
mobileDeepLinking: "mobileDeepLinking",
|
|
5763
|
+
mobileLibraries: "mobileLibraries",
|
|
4900
5764
|
backendLibraries: "backendLibraries",
|
|
4901
5765
|
stateManagement: "stateManagement",
|
|
4902
5766
|
forms: "forms",
|
|
@@ -4963,6 +5827,13 @@ const STACK_SELECTION_OPTION_CATEGORY_BY_KEY = {
|
|
|
4963
5827
|
pythonRealtime: "pythonRealtime",
|
|
4964
5828
|
pythonObservability: "pythonObservability",
|
|
4965
5829
|
pythonCli: "pythonCli",
|
|
5830
|
+
pythonCloudSdk: "pythonCloudSdk",
|
|
5831
|
+
pythonHttpClient: "pythonHttpClient",
|
|
5832
|
+
pythonData: "pythonData",
|
|
5833
|
+
pythonMedia: "pythonMedia",
|
|
5834
|
+
pythonServer: "pythonServer",
|
|
5835
|
+
pythonPackageManager: "pythonPackageManager",
|
|
5836
|
+
pythonMessageQueue: "pythonMessageQueue",
|
|
4966
5837
|
goWebFramework: "goWebFramework",
|
|
4967
5838
|
goOrm: "goOrm",
|
|
4968
5839
|
goApi: "goApi",
|
|
@@ -4975,6 +5846,12 @@ const STACK_SELECTION_OPTION_CATEGORY_BY_KEY = {
|
|
|
4975
5846
|
goCaching: "goCaching",
|
|
4976
5847
|
goConfig: "goConfig",
|
|
4977
5848
|
goObservability: "goObservability",
|
|
5849
|
+
goValidation: "goValidation",
|
|
5850
|
+
goQuality: "goQuality",
|
|
5851
|
+
goMigrations: "goMigrations",
|
|
5852
|
+
goTemplating: "goTemplating",
|
|
5853
|
+
goProtoTooling: "goProtoTooling",
|
|
5854
|
+
goDI: "goDI",
|
|
4978
5855
|
javaLanguage: "javaLanguage",
|
|
4979
5856
|
javaWebFramework: "javaWebFramework",
|
|
4980
5857
|
javaBuildTool: "javaBuildTool",
|
|
@@ -4995,6 +5872,7 @@ const STACK_SELECTION_OPTION_CATEGORY_BY_KEY = {
|
|
|
4995
5872
|
dotnetValidation: "dotnetValidation",
|
|
4996
5873
|
dotnetCaching: "dotnetCaching",
|
|
4997
5874
|
dotnetDeploy: "dotnetDeploy",
|
|
5875
|
+
dotnetLibraries: "dotnetLibraries",
|
|
4998
5876
|
elixirWebFramework: "elixirWebFramework",
|
|
4999
5877
|
elixirOrm: "elixirOrm",
|
|
5000
5878
|
elixirAuth: "elixirAuth",
|
|
@@ -5009,6 +5887,11 @@ const STACK_SELECTION_OPTION_CATEGORY_BY_KEY = {
|
|
|
5009
5887
|
elixirObservability: "elixirObservability",
|
|
5010
5888
|
elixirTesting: "elixirTesting",
|
|
5011
5889
|
elixirQuality: "elixirQuality",
|
|
5890
|
+
elixirI18n: "elixirI18n",
|
|
5891
|
+
elixirHttpServer: "elixirHttpServer",
|
|
5892
|
+
elixirApplicationFramework: "elixirApplicationFramework",
|
|
5893
|
+
elixirDocumentation: "elixirDocumentation",
|
|
5894
|
+
elixirClustering: "elixirClustering",
|
|
5012
5895
|
elixirDeploy: "elixirDeploy",
|
|
5013
5896
|
elixirLibraries: "elixirLibraries"
|
|
5014
5897
|
};
|
|
@@ -5022,6 +5905,7 @@ const VIRTUAL_NONE_MULTI_SELECT_STACK_SELECTION_KEYS = [
|
|
|
5022
5905
|
"goTesting",
|
|
5023
5906
|
"pythonTesting",
|
|
5024
5907
|
"pythonCli",
|
|
5908
|
+
"pythonData",
|
|
5025
5909
|
"elixirLibraries",
|
|
5026
5910
|
"aiDocs"
|
|
5027
5911
|
];
|
|
@@ -5056,6 +5940,7 @@ const STACK_SELECTION_URL_KEYS = {
|
|
|
5056
5940
|
mobilePush: "mpu",
|
|
5057
5941
|
mobileOTA: "mota",
|
|
5058
5942
|
mobileDeepLinking: "mdl",
|
|
5943
|
+
mobileLibraries: "mlib",
|
|
5059
5944
|
backendLibraries: "bl",
|
|
5060
5945
|
stateManagement: "sm",
|
|
5061
5946
|
forms: "frm",
|
|
@@ -5123,6 +6008,13 @@ const STACK_SELECTION_URL_KEYS = {
|
|
|
5123
6008
|
pythonRealtime: "prt",
|
|
5124
6009
|
pythonObservability: "pobs",
|
|
5125
6010
|
pythonCli: "pcli",
|
|
6011
|
+
pythonCloudSdk: "pcloud",
|
|
6012
|
+
pythonHttpClient: "phttp",
|
|
6013
|
+
pythonData: "pdata",
|
|
6014
|
+
pythonMedia: "pmedia",
|
|
6015
|
+
pythonServer: "pserver",
|
|
6016
|
+
pythonPackageManager: "ppm",
|
|
6017
|
+
pythonMessageQueue: "pmq",
|
|
5126
6018
|
goWebFramework: "gwf",
|
|
5127
6019
|
goOrm: "gorm",
|
|
5128
6020
|
goApi: "gapi",
|
|
@@ -5135,6 +6027,12 @@ const STACK_SELECTION_URL_KEYS = {
|
|
|
5135
6027
|
goCaching: "gcache",
|
|
5136
6028
|
goConfig: "gcfg",
|
|
5137
6029
|
goObservability: "gobs",
|
|
6030
|
+
goValidation: "gval",
|
|
6031
|
+
goQuality: "gqual",
|
|
6032
|
+
goMigrations: "gmig",
|
|
6033
|
+
goTemplating: "gtpl",
|
|
6034
|
+
goProtoTooling: "gproto",
|
|
6035
|
+
goDI: "gdi",
|
|
5138
6036
|
javaLanguage: "jlang",
|
|
5139
6037
|
javaWebFramework: "jwf",
|
|
5140
6038
|
javaBuildTool: "jbt",
|
|
@@ -5155,6 +6053,7 @@ const STACK_SELECTION_URL_KEYS = {
|
|
|
5155
6053
|
dotnetValidation: "dnval",
|
|
5156
6054
|
dotnetCaching: "dncache",
|
|
5157
6055
|
dotnetDeploy: "dndeploy",
|
|
6056
|
+
dotnetLibraries: "dnlib",
|
|
5158
6057
|
elixirWebFramework: "ewf",
|
|
5159
6058
|
elixirOrm: "eorm",
|
|
5160
6059
|
elixirAuth: "eauth",
|
|
@@ -5169,6 +6068,11 @@ const STACK_SELECTION_URL_KEYS = {
|
|
|
5169
6068
|
elixirObservability: "eobs",
|
|
5170
6069
|
elixirTesting: "etest",
|
|
5171
6070
|
elixirQuality: "eq",
|
|
6071
|
+
elixirI18n: "ei18n",
|
|
6072
|
+
elixirHttpServer: "ehs",
|
|
6073
|
+
elixirApplicationFramework: "eaf",
|
|
6074
|
+
elixirDocumentation: "edoc",
|
|
6075
|
+
elixirClustering: "ecluster",
|
|
5172
6076
|
elixirDeploy: "edeploy",
|
|
5173
6077
|
elixirLibraries: "elib"
|
|
5174
6078
|
};
|
|
@@ -5350,6 +6254,12 @@ const CLI_SCALAR_CONFIG_FIELDS = [
|
|
|
5350
6254
|
["pythonCaching", "pythonCaching"],
|
|
5351
6255
|
["pythonRealtime", "pythonRealtime"],
|
|
5352
6256
|
["pythonObservability", "pythonObservability"],
|
|
6257
|
+
["pythonCloudSdk", "pythonCloudSdk"],
|
|
6258
|
+
["pythonHttpClient", "pythonHttpClient"],
|
|
6259
|
+
["pythonMedia", "pythonMedia"],
|
|
6260
|
+
["pythonServer", "pythonServer"],
|
|
6261
|
+
["pythonPackageManager", "pythonPackageManager"],
|
|
6262
|
+
["pythonMessageQueue", "pythonMessageQueue"],
|
|
5353
6263
|
["goWebFramework", "goWebFramework"],
|
|
5354
6264
|
["goOrm", "goOrm"],
|
|
5355
6265
|
["goApi", "goApi"],
|
|
@@ -5361,6 +6271,12 @@ const CLI_SCALAR_CONFIG_FIELDS = [
|
|
|
5361
6271
|
["goCaching", "goCaching"],
|
|
5362
6272
|
["goConfig", "goConfig"],
|
|
5363
6273
|
["goObservability", "goObservability"],
|
|
6274
|
+
["goValidation", "goValidation"],
|
|
6275
|
+
["goQuality", "goQuality"],
|
|
6276
|
+
["goMigrations", "goMigrations"],
|
|
6277
|
+
["goTemplating", "goTemplating"],
|
|
6278
|
+
["goProtoTooling", "goProtoTooling"],
|
|
6279
|
+
["goDI", "goDI"],
|
|
5364
6280
|
["javaLanguage", "javaLanguage"],
|
|
5365
6281
|
["javaWebFramework", "javaWebFramework"],
|
|
5366
6282
|
["javaBuildTool", "javaBuildTool"],
|
|
@@ -5391,6 +6307,11 @@ const CLI_SCALAR_CONFIG_FIELDS = [
|
|
|
5391
6307
|
["elixirObservability", "elixirObservability"],
|
|
5392
6308
|
["elixirTesting", "elixirTesting"],
|
|
5393
6309
|
["elixirQuality", "elixirQuality"],
|
|
6310
|
+
["elixirI18n", "elixirI18n"],
|
|
6311
|
+
["elixirHttpServer", "elixirHttpServer"],
|
|
6312
|
+
["elixirApplicationFramework", "elixirApplicationFramework"],
|
|
6313
|
+
["elixirDocumentation", "elixirDocumentation"],
|
|
6314
|
+
["elixirClustering", "elixirClustering"],
|
|
5394
6315
|
["elixirDeploy", "elixirDeploy"]
|
|
5395
6316
|
];
|
|
5396
6317
|
const CLI_NON_EMPTY_ARRAY_CONFIG_FIELDS = [
|
|
@@ -5400,15 +6321,18 @@ const CLI_NON_EMPTY_ARRAY_CONFIG_FIELDS = [
|
|
|
5400
6321
|
];
|
|
5401
6322
|
const CLI_DEFINED_ARRAY_CONFIG_FIELDS = [
|
|
5402
6323
|
["aiDocs", "aiDocs"],
|
|
6324
|
+
["mobileLibraries", "mobileLibraries"],
|
|
5403
6325
|
["rustLibraries", "rustLibraries"],
|
|
5404
6326
|
["pythonAi", "pythonAi"],
|
|
5405
6327
|
["javaLibraries", "javaLibraries"],
|
|
5406
6328
|
["javaTestingLibraries", "javaTestingLibraries"],
|
|
5407
6329
|
["dotnetTesting", "dotnetTesting"],
|
|
5408
6330
|
["dotnetObservability", "dotnetObservability"],
|
|
6331
|
+
["dotnetLibraries", "dotnetLibraries"],
|
|
5409
6332
|
["goTesting", "goTesting"],
|
|
5410
6333
|
["pythonTesting", "pythonTesting"],
|
|
5411
6334
|
["pythonCli", "pythonCli"],
|
|
6335
|
+
["pythonData", "pythonData"],
|
|
5412
6336
|
["elixirLibraries", "elixirLibraries"]
|
|
5413
6337
|
];
|
|
5414
6338
|
const PACKAGE_MANAGER_COMMANDS = {
|
|
@@ -5456,7 +6380,14 @@ const PYTHON_CONFIG_KEYS = [
|
|
|
5456
6380
|
"pythonCaching",
|
|
5457
6381
|
"pythonRealtime",
|
|
5458
6382
|
"pythonObservability",
|
|
5459
|
-
"pythonCli"
|
|
6383
|
+
"pythonCli",
|
|
6384
|
+
"pythonCloudSdk",
|
|
6385
|
+
"pythonHttpClient",
|
|
6386
|
+
"pythonData",
|
|
6387
|
+
"pythonMedia",
|
|
6388
|
+
"pythonServer",
|
|
6389
|
+
"pythonPackageManager",
|
|
6390
|
+
"pythonMessageQueue"
|
|
5460
6391
|
];
|
|
5461
6392
|
const GO_CONFIG_KEYS = [
|
|
5462
6393
|
"goWebFramework",
|
|
@@ -5470,7 +6401,13 @@ const GO_CONFIG_KEYS = [
|
|
|
5470
6401
|
"goMessageQueue",
|
|
5471
6402
|
"goCaching",
|
|
5472
6403
|
"goConfig",
|
|
5473
|
-
"goObservability"
|
|
6404
|
+
"goObservability",
|
|
6405
|
+
"goValidation",
|
|
6406
|
+
"goQuality",
|
|
6407
|
+
"goMigrations",
|
|
6408
|
+
"goTemplating",
|
|
6409
|
+
"goProtoTooling",
|
|
6410
|
+
"goDI"
|
|
5474
6411
|
];
|
|
5475
6412
|
const JAVA_CONFIG_KEYS = [
|
|
5476
6413
|
"javaLanguage",
|
|
@@ -5494,7 +6431,8 @@ const DOTNET_CONFIG_KEYS = [
|
|
|
5494
6431
|
"dotnetObservability",
|
|
5495
6432
|
"dotnetValidation",
|
|
5496
6433
|
"dotnetCaching",
|
|
5497
|
-
"dotnetDeploy"
|
|
6434
|
+
"dotnetDeploy",
|
|
6435
|
+
"dotnetLibraries"
|
|
5498
6436
|
];
|
|
5499
6437
|
const ELIXIR_CONFIG_KEYS = [
|
|
5500
6438
|
"elixirWebFramework",
|
|
@@ -5511,6 +6449,11 @@ const ELIXIR_CONFIG_KEYS = [
|
|
|
5511
6449
|
"elixirObservability",
|
|
5512
6450
|
"elixirTesting",
|
|
5513
6451
|
"elixirQuality",
|
|
6452
|
+
"elixirI18n",
|
|
6453
|
+
"elixirHttpServer",
|
|
6454
|
+
"elixirApplicationFramework",
|
|
6455
|
+
"elixirDocumentation",
|
|
6456
|
+
"elixirClustering",
|
|
5514
6457
|
"elixirDeploy",
|
|
5515
6458
|
"elixirLibraries"
|
|
5516
6459
|
];
|
|
@@ -5521,37 +6464,9 @@ const REACT_NATIVE_CONFIG_KEYS = [
|
|
|
5521
6464
|
"mobileTesting",
|
|
5522
6465
|
"mobilePush",
|
|
5523
6466
|
"mobileOTA",
|
|
5524
|
-
"mobileDeepLinking"
|
|
6467
|
+
"mobileDeepLinking",
|
|
6468
|
+
"mobileLibraries"
|
|
5525
6469
|
];
|
|
5526
|
-
const COMMAND_ADDONS = new Set([
|
|
5527
|
-
"pwa",
|
|
5528
|
-
"tauri",
|
|
5529
|
-
"starlight",
|
|
5530
|
-
"biome",
|
|
5531
|
-
"lefthook",
|
|
5532
|
-
"husky",
|
|
5533
|
-
"turborepo",
|
|
5534
|
-
"nx",
|
|
5535
|
-
"docker-compose",
|
|
5536
|
-
"devcontainer",
|
|
5537
|
-
"github-actions",
|
|
5538
|
-
"ultracite",
|
|
5539
|
-
"fumadocs",
|
|
5540
|
-
"oxlint",
|
|
5541
|
-
"ruler",
|
|
5542
|
-
"opentui",
|
|
5543
|
-
"mcp",
|
|
5544
|
-
"skills",
|
|
5545
|
-
"wxt",
|
|
5546
|
-
"msw",
|
|
5547
|
-
"storybook",
|
|
5548
|
-
"swr",
|
|
5549
|
-
"tanstack-query",
|
|
5550
|
-
"tanstack-table",
|
|
5551
|
-
"tanstack-virtual",
|
|
5552
|
-
"tanstack-db",
|
|
5553
|
-
"tanstack-pacer"
|
|
5554
|
-
]);
|
|
5555
6470
|
function withoutNone(values) {
|
|
5556
6471
|
return values.filter((value) => value !== "none");
|
|
5557
6472
|
}
|
|
@@ -5573,7 +6488,7 @@ function formatTypeScriptAddonsFlag(selection) {
|
|
|
5573
6488
|
...selection.appPlatforms
|
|
5574
6489
|
];
|
|
5575
6490
|
if (addons.length === 0) return "--addons none";
|
|
5576
|
-
return `--addons ${addons
|
|
6491
|
+
return `--addons ${toUniqueNonNoneArray(addons).join(" ") || "none"}`;
|
|
5577
6492
|
}
|
|
5578
6493
|
const GRAPH_TYPESCRIPT_FRONTEND_FLAG_KEYS = [["validation", "validation"], ["testing", "testing"]];
|
|
5579
6494
|
const GRAPH_SHADCN_FLAG_KEYS = [
|
|
@@ -5646,6 +6561,11 @@ const GRAPH_ELIXIR_BACKEND_PART_SELECTION_KEYS = [
|
|
|
5646
6561
|
["elixirObservability", "observability"],
|
|
5647
6562
|
["elixirTesting", "testing"],
|
|
5648
6563
|
["elixirQuality", "codeQuality"],
|
|
6564
|
+
["elixirI18n", "i18n"],
|
|
6565
|
+
["elixirHttpServer", "runtime"],
|
|
6566
|
+
["elixirApplicationFramework", "libraries"],
|
|
6567
|
+
["elixirDocumentation", "documentation"],
|
|
6568
|
+
["elixirClustering", "config"],
|
|
5649
6569
|
["elixirDeploy", "deploy"]
|
|
5650
6570
|
];
|
|
5651
6571
|
const GRAPH_DATABASE_PART_SELECTION_KEYS = [["dbSetup", "dbSetup"]];
|
|
@@ -5658,6 +6578,7 @@ const GRAPH_MOBILE_PART_SELECTION_KEYS = [
|
|
|
5658
6578
|
["mobileOTA", "ota"],
|
|
5659
6579
|
["mobileDeepLinking", "deepLinking"]
|
|
5660
6580
|
];
|
|
6581
|
+
const GRAPH_MOBILE_ARRAY_PART_SELECTION_KEYS = [["mobileLibraries", "libraries"]];
|
|
5661
6582
|
const GRAPH_RUST_BACKEND_PART_SELECTION_KEYS = [
|
|
5662
6583
|
["rustCli", "cli"],
|
|
5663
6584
|
["rustLogging", "logging"],
|
|
@@ -5672,13 +6593,25 @@ const GRAPH_PYTHON_BACKEND_PART_SELECTION_KEYS = [
|
|
|
5672
6593
|
["pythonTaskQueue", "jobQueue"],
|
|
5673
6594
|
["pythonGraphql", "graphql"],
|
|
5674
6595
|
["pythonQuality", "codeQuality"],
|
|
6596
|
+
["pythonCloudSdk", "cloudSdk"],
|
|
6597
|
+
["pythonHttpClient", "httpClient"],
|
|
6598
|
+
["pythonMedia", "media"],
|
|
6599
|
+
["pythonServer", "server"],
|
|
6600
|
+
["pythonPackageManager", "packageManager"],
|
|
6601
|
+
["pythonMessageQueue", "messageQueue"],
|
|
5675
6602
|
["caching", "caching"],
|
|
5676
6603
|
["search", "search"]
|
|
5677
6604
|
];
|
|
5678
|
-
const GRAPH_PYTHON_BACKEND_ARRAY_PART_SELECTION_KEYS = [["pythonAi", "ai"]];
|
|
6605
|
+
const GRAPH_PYTHON_BACKEND_ARRAY_PART_SELECTION_KEYS = [["pythonAi", "ai"], ["pythonData", "data"]];
|
|
5679
6606
|
const GRAPH_GO_BACKEND_PART_SELECTION_KEYS = [
|
|
5680
6607
|
["goCli", "cli"],
|
|
5681
6608
|
["goLogging", "logging"],
|
|
6609
|
+
["goValidation", "validation"],
|
|
6610
|
+
["goQuality", "codeQuality"],
|
|
6611
|
+
["goMigrations", "migrations"],
|
|
6612
|
+
["goTemplating", "templating"],
|
|
6613
|
+
["goProtoTooling", "buildTool"],
|
|
6614
|
+
["goDI", "libraries"],
|
|
5682
6615
|
["caching", "caching"],
|
|
5683
6616
|
["search", "search"]
|
|
5684
6617
|
];
|
|
@@ -5698,7 +6631,11 @@ const GRAPH_DOTNET_BACKEND_PART_SELECTION_KEYS = [
|
|
|
5698
6631
|
["dotnetCaching", "caching"],
|
|
5699
6632
|
["dotnetDeploy", "deploy"]
|
|
5700
6633
|
];
|
|
5701
|
-
const GRAPH_DOTNET_BACKEND_ARRAY_PART_SELECTION_KEYS = [
|
|
6634
|
+
const GRAPH_DOTNET_BACKEND_ARRAY_PART_SELECTION_KEYS = [
|
|
6635
|
+
["dotnetTesting", "testing"],
|
|
6636
|
+
["dotnetObservability", "observability"],
|
|
6637
|
+
["dotnetLibraries", "libraries"]
|
|
6638
|
+
];
|
|
5702
6639
|
const GRAPH_TYPESCRIPT_FRONTEND_PART_CLI_KEYS = [
|
|
5703
6640
|
["webDeploy", "deploy"],
|
|
5704
6641
|
["cssFramework", "css"],
|
|
@@ -5738,6 +6675,11 @@ const GRAPH_ELIXIR_BACKEND_PART_CLI_KEYS = [
|
|
|
5738
6675
|
["elixirObservability", "observability"],
|
|
5739
6676
|
["elixirTesting", "testing"],
|
|
5740
6677
|
["elixirQuality", "codeQuality"],
|
|
6678
|
+
["elixirI18n", "i18n"],
|
|
6679
|
+
["elixirHttpServer", "runtime"],
|
|
6680
|
+
["elixirApplicationFramework", "libraries"],
|
|
6681
|
+
["elixirDocumentation", "documentation"],
|
|
6682
|
+
["elixirClustering", "config"],
|
|
5741
6683
|
["elixirDeploy", "deploy"]
|
|
5742
6684
|
];
|
|
5743
6685
|
const GRAPH_DATABASE_PART_CLI_KEYS = [["dbSetup", "dbSetup"]];
|
|
@@ -5750,6 +6692,7 @@ const GRAPH_MOBILE_PART_CLI_KEYS = [
|
|
|
5750
6692
|
["mobileOTA", "ota"],
|
|
5751
6693
|
["mobileDeepLinking", "deepLinking"]
|
|
5752
6694
|
];
|
|
6695
|
+
const GRAPH_MOBILE_ARRAY_PART_CLI_KEYS = [["mobileLibraries", "libraries"]];
|
|
5753
6696
|
const GRAPH_RUST_BACKEND_PART_CLI_KEYS = [
|
|
5754
6697
|
["rustCli", "cli"],
|
|
5755
6698
|
["rustLogging", "logging"],
|
|
@@ -5764,13 +6707,25 @@ const GRAPH_PYTHON_BACKEND_PART_CLI_KEYS = [
|
|
|
5764
6707
|
["pythonTaskQueue", "jobQueue"],
|
|
5765
6708
|
["pythonGraphql", "graphql"],
|
|
5766
6709
|
["pythonQuality", "codeQuality"],
|
|
6710
|
+
["pythonCloudSdk", "cloudSdk"],
|
|
6711
|
+
["pythonHttpClient", "httpClient"],
|
|
6712
|
+
["pythonMedia", "media"],
|
|
6713
|
+
["pythonServer", "server"],
|
|
6714
|
+
["pythonPackageManager", "packageManager"],
|
|
6715
|
+
["pythonMessageQueue", "messageQueue"],
|
|
5767
6716
|
["caching", "caching"],
|
|
5768
6717
|
["search", "search"]
|
|
5769
6718
|
];
|
|
5770
|
-
const GRAPH_PYTHON_BACKEND_ARRAY_PART_CLI_KEYS = [["pythonAi", "ai"]];
|
|
6719
|
+
const GRAPH_PYTHON_BACKEND_ARRAY_PART_CLI_KEYS = [["pythonAi", "ai"], ["pythonData", "data"]];
|
|
5771
6720
|
const GRAPH_GO_BACKEND_PART_CLI_KEYS = [
|
|
5772
6721
|
["goCli", "cli"],
|
|
5773
6722
|
["goLogging", "logging"],
|
|
6723
|
+
["goValidation", "validation"],
|
|
6724
|
+
["goQuality", "codeQuality"],
|
|
6725
|
+
["goMigrations", "migrations"],
|
|
6726
|
+
["goTemplating", "templating"],
|
|
6727
|
+
["goProtoTooling", "buildTool"],
|
|
6728
|
+
["goDI", "libraries"],
|
|
5774
6729
|
["caching", "caching"],
|
|
5775
6730
|
["search", "search"]
|
|
5776
6731
|
];
|
|
@@ -5789,7 +6744,11 @@ const GRAPH_DOTNET_BACKEND_PART_CLI_KEYS = [
|
|
|
5789
6744
|
["dotnetCaching", "caching"],
|
|
5790
6745
|
["dotnetDeploy", "deploy"]
|
|
5791
6746
|
];
|
|
5792
|
-
const GRAPH_DOTNET_BACKEND_ARRAY_PART_CLI_KEYS = [
|
|
6747
|
+
const GRAPH_DOTNET_BACKEND_ARRAY_PART_CLI_KEYS = [
|
|
6748
|
+
["dotnetTesting", "testing"],
|
|
6749
|
+
["dotnetObservability", "observability"],
|
|
6750
|
+
["dotnetLibraries", "libraries"]
|
|
6751
|
+
];
|
|
5793
6752
|
function getAddonScopedPartFields(addons) {
|
|
5794
6753
|
return toUniqueNonNoneArray(addons ?? []).flatMap((addon) => {
|
|
5795
6754
|
const binding = getAddonStackPartBinding(addon);
|
|
@@ -5866,6 +6825,13 @@ function getSelectionScopedPartFields(selection) {
|
|
|
5866
6825
|
role,
|
|
5867
6826
|
value: selection[key]
|
|
5868
6827
|
})),
|
|
6828
|
+
...GRAPH_MOBILE_ARRAY_PART_SELECTION_KEYS.map(([key, role]) => ({
|
|
6829
|
+
ownerRole: "mobile",
|
|
6830
|
+
ecosystem: "react-native",
|
|
6831
|
+
role,
|
|
6832
|
+
value: selection[key],
|
|
6833
|
+
allowMultiple: true
|
|
6834
|
+
})),
|
|
5869
6835
|
...GRAPH_RUST_BACKEND_PART_SELECTION_KEYS.map(([key, role]) => ({
|
|
5870
6836
|
ownerRole: "backend",
|
|
5871
6837
|
ecosystem: "rust",
|
|
@@ -5972,6 +6938,13 @@ function getCliScopedPartFields(input) {
|
|
|
5972
6938
|
role,
|
|
5973
6939
|
value: getValue(key)
|
|
5974
6940
|
})),
|
|
6941
|
+
...GRAPH_MOBILE_ARRAY_PART_CLI_KEYS.map(([key, role]) => ({
|
|
6942
|
+
ownerRole: "mobile",
|
|
6943
|
+
ecosystem: "react-native",
|
|
6944
|
+
role,
|
|
6945
|
+
value: getArrayValue(key),
|
|
6946
|
+
allowMultiple: true
|
|
6947
|
+
})),
|
|
5975
6948
|
...GRAPH_RUST_BACKEND_PART_CLI_KEYS.map(([key, role]) => ({
|
|
5976
6949
|
ownerRole: "backend",
|
|
5977
6950
|
ecosystem: "rust",
|
|
@@ -6217,6 +7190,7 @@ function buildProjectConfigBase(selection, projectName, relativePath, install) {
|
|
|
6217
7190
|
mobilePush: stack.mobilePush,
|
|
6218
7191
|
mobileOTA: stack.mobileOTA,
|
|
6219
7192
|
mobileDeepLinking: stack.mobileDeepLinking,
|
|
7193
|
+
mobileLibraries: toUniqueNonNoneArray(stack.mobileLibraries),
|
|
6220
7194
|
cms: stack.cms,
|
|
6221
7195
|
caching: stack.caching,
|
|
6222
7196
|
rateLimit: stack.rateLimit,
|
|
@@ -6252,6 +7226,13 @@ function buildProjectConfigBase(selection, projectName, relativePath, install) {
|
|
|
6252
7226
|
pythonRealtime: stack.pythonRealtime,
|
|
6253
7227
|
pythonObservability: stack.pythonObservability,
|
|
6254
7228
|
pythonCli: toUniqueNonNoneArray(stack.pythonCli),
|
|
7229
|
+
pythonCloudSdk: stack.pythonCloudSdk,
|
|
7230
|
+
pythonHttpClient: stack.pythonHttpClient,
|
|
7231
|
+
pythonData: toUniqueNonNoneArray(stack.pythonData),
|
|
7232
|
+
pythonMedia: stack.pythonMedia,
|
|
7233
|
+
pythonServer: stack.pythonServer,
|
|
7234
|
+
pythonPackageManager: stack.pythonPackageManager,
|
|
7235
|
+
pythonMessageQueue: stack.pythonMessageQueue,
|
|
6255
7236
|
goWebFramework: stack.goWebFramework,
|
|
6256
7237
|
goOrm: stack.goOrm,
|
|
6257
7238
|
goApi: stack.goApi,
|
|
@@ -6264,6 +7245,12 @@ function buildProjectConfigBase(selection, projectName, relativePath, install) {
|
|
|
6264
7245
|
goCaching: stack.goCaching,
|
|
6265
7246
|
goConfig: stack.goConfig,
|
|
6266
7247
|
goObservability: stack.goObservability,
|
|
7248
|
+
goValidation: stack.goValidation,
|
|
7249
|
+
goQuality: stack.goQuality,
|
|
7250
|
+
goMigrations: stack.goMigrations,
|
|
7251
|
+
goTemplating: stack.goTemplating,
|
|
7252
|
+
goProtoTooling: stack.goProtoTooling,
|
|
7253
|
+
goDI: stack.goDI,
|
|
6267
7254
|
javaLanguage: stack.javaLanguage,
|
|
6268
7255
|
javaWebFramework: stack.javaWebFramework,
|
|
6269
7256
|
javaBuildTool: stack.javaBuildTool,
|
|
@@ -6284,6 +7271,7 @@ function buildProjectConfigBase(selection, projectName, relativePath, install) {
|
|
|
6284
7271
|
dotnetValidation: stack.dotnetValidation,
|
|
6285
7272
|
dotnetCaching: stack.dotnetCaching,
|
|
6286
7273
|
dotnetDeploy: stack.dotnetDeploy,
|
|
7274
|
+
dotnetLibraries: toUniqueNonNoneArray(stack.dotnetLibraries),
|
|
6287
7275
|
elixirWebFramework: stack.elixirWebFramework,
|
|
6288
7276
|
elixirOrm: stack.elixirOrm,
|
|
6289
7277
|
elixirAuth: stack.elixirAuth,
|
|
@@ -6298,6 +7286,11 @@ function buildProjectConfigBase(selection, projectName, relativePath, install) {
|
|
|
6298
7286
|
elixirObservability: stack.elixirObservability,
|
|
6299
7287
|
elixirTesting: stack.elixirTesting,
|
|
6300
7288
|
elixirQuality: stack.elixirQuality,
|
|
7289
|
+
elixirI18n: stack.elixirI18n,
|
|
7290
|
+
elixirHttpServer: stack.elixirHttpServer,
|
|
7291
|
+
elixirApplicationFramework: stack.elixirApplicationFramework,
|
|
7292
|
+
elixirDocumentation: stack.elixirDocumentation,
|
|
7293
|
+
elixirClustering: stack.elixirClustering,
|
|
6301
7294
|
elixirDeploy: stack.elixirDeploy,
|
|
6302
7295
|
elixirLibraries: toUniqueNonNoneArray(stack.elixirLibraries),
|
|
6303
7296
|
aiDocs: toUniqueNonNoneArray(stack.aiDocs)
|
|
@@ -6475,6 +7468,7 @@ function generateReactNativeCommand(selection, projectName) {
|
|
|
6475
7468
|
`--mobile-push ${selection.mobilePush}`,
|
|
6476
7469
|
`--mobile-ota ${selection.mobileOTA}`,
|
|
6477
7470
|
`--mobile-deep-linking ${selection.mobileDeepLinking}`,
|
|
7471
|
+
formatArrayFlag("mobile-libraries", selection.mobileLibraries),
|
|
6478
7472
|
`--package-manager ${selection.packageManager}`,
|
|
6479
7473
|
selection.git === "false" ? "--no-git" : "--git",
|
|
6480
7474
|
selection.install === "false" ? "--no-install" : "--install",
|
|
@@ -6486,6 +7480,7 @@ function generateReactNativeCommand(selection, projectName) {
|
|
|
6486
7480
|
function generateRustCommand(selection, projectName) {
|
|
6487
7481
|
const flags = [
|
|
6488
7482
|
"--ecosystem rust",
|
|
7483
|
+
`--database ${selection.database}`,
|
|
6489
7484
|
`--rust-web-framework ${selection.rustWebFramework}`,
|
|
6490
7485
|
`--rust-frontend ${selection.rustFrontend}`,
|
|
6491
7486
|
`--rust-orm ${selection.rustOrm}`,
|
|
@@ -6513,6 +7508,7 @@ function generateRustCommand(selection, projectName) {
|
|
|
6513
7508
|
function generatePythonCommand(selection, projectName) {
|
|
6514
7509
|
const flags = [
|
|
6515
7510
|
"--ecosystem python",
|
|
7511
|
+
`--database ${selection.database}`,
|
|
6516
7512
|
`--python-web-framework ${selection.pythonWebFramework}`,
|
|
6517
7513
|
`--python-orm ${selection.pythonOrm}`,
|
|
6518
7514
|
`--python-validation ${selection.pythonValidation}`,
|
|
@@ -6527,6 +7523,13 @@ function generatePythonCommand(selection, projectName) {
|
|
|
6527
7523
|
`--python-realtime ${selection.pythonRealtime}`,
|
|
6528
7524
|
`--python-observability ${selection.pythonObservability}`,
|
|
6529
7525
|
formatArrayFlag("python-cli", selection.pythonCli),
|
|
7526
|
+
`--python-cloud-sdk ${selection.pythonCloudSdk}`,
|
|
7527
|
+
`--python-http-client ${selection.pythonHttpClient}`,
|
|
7528
|
+
formatArrayFlag("python-data", selection.pythonData),
|
|
7529
|
+
`--python-media ${selection.pythonMedia}`,
|
|
7530
|
+
`--python-server ${selection.pythonServer}`,
|
|
7531
|
+
`--python-package-manager ${selection.pythonPackageManager}`,
|
|
7532
|
+
`--python-message-queue ${selection.pythonMessageQueue}`,
|
|
6530
7533
|
`--email ${selection.email}`,
|
|
6531
7534
|
`--observability ${selection.observability}`,
|
|
6532
7535
|
`--caching ${selection.caching}`,
|
|
@@ -6540,6 +7543,7 @@ function generatePythonCommand(selection, projectName) {
|
|
|
6540
7543
|
function generateGoCommand(selection, projectName) {
|
|
6541
7544
|
const flags = [
|
|
6542
7545
|
"--ecosystem go",
|
|
7546
|
+
`--database ${selection.database}`,
|
|
6543
7547
|
`--go-web-framework ${selection.goWebFramework}`,
|
|
6544
7548
|
`--go-orm ${selection.goOrm}`,
|
|
6545
7549
|
`--go-api ${selection.goApi}`,
|
|
@@ -6552,6 +7556,12 @@ function generateGoCommand(selection, projectName) {
|
|
|
6552
7556
|
`--go-caching ${selection.goCaching}`,
|
|
6553
7557
|
`--go-config ${selection.goConfig}`,
|
|
6554
7558
|
`--go-observability ${selection.goObservability}`,
|
|
7559
|
+
`--go-validation ${selection.goValidation}`,
|
|
7560
|
+
`--go-quality ${selection.goQuality}`,
|
|
7561
|
+
`--go-migrations ${selection.goMigrations}`,
|
|
7562
|
+
`--go-templating ${selection.goTemplating}`,
|
|
7563
|
+
`--go-proto-tooling ${selection.goProtoTooling}`,
|
|
7564
|
+
`--go-di ${selection.goDI}`,
|
|
6555
7565
|
`--auth ${selection.auth}`,
|
|
6556
7566
|
`--email ${selection.email}`,
|
|
6557
7567
|
`--observability ${selection.observability}`,
|
|
@@ -6566,6 +7576,7 @@ function generateGoCommand(selection, projectName) {
|
|
|
6566
7576
|
function generateJavaCommand(selection, projectName) {
|
|
6567
7577
|
const flags = [
|
|
6568
7578
|
"--ecosystem java",
|
|
7579
|
+
`--database ${selection.database}`,
|
|
6569
7580
|
`--java-web-framework ${selection.javaWebFramework}`,
|
|
6570
7581
|
...selection.javaLanguage === "kotlin" ? [`--java-language ${selection.javaLanguage}`] : [],
|
|
6571
7582
|
`--java-build-tool ${selection.javaBuildTool}`,
|
|
@@ -6588,6 +7599,7 @@ function generateJavaCommand(selection, projectName) {
|
|
|
6588
7599
|
function generateDotnetCommand(selection, projectName) {
|
|
6589
7600
|
const flags = [
|
|
6590
7601
|
"--ecosystem dotnet",
|
|
7602
|
+
`--database ${selection.database}`,
|
|
6591
7603
|
`--dotnet-web-framework ${selection.dotnetWebFramework}`,
|
|
6592
7604
|
`--dotnet-orm ${selection.dotnetOrm}`,
|
|
6593
7605
|
`--dotnet-auth ${selection.dotnetAuth}`,
|
|
@@ -6599,6 +7611,7 @@ function generateDotnetCommand(selection, projectName) {
|
|
|
6599
7611
|
`--dotnet-validation ${selection.dotnetValidation}`,
|
|
6600
7612
|
`--dotnet-caching ${selection.dotnetCaching}`,
|
|
6601
7613
|
`--dotnet-deploy ${selection.dotnetDeploy}`,
|
|
7614
|
+
formatArrayFlag("dotnet-libraries", selection.dotnetLibraries),
|
|
6602
7615
|
formatArrayFlag("ai-docs", selection.aiDocs)
|
|
6603
7616
|
];
|
|
6604
7617
|
if (selection.git === "false") flags.push("--no-git");
|
|
@@ -6608,6 +7621,7 @@ function generateDotnetCommand(selection, projectName) {
|
|
|
6608
7621
|
function generateElixirCommand(selection, projectName) {
|
|
6609
7622
|
const flags = [
|
|
6610
7623
|
"--ecosystem elixir",
|
|
7624
|
+
`--database ${selection.database}`,
|
|
6611
7625
|
`--elixir-web-framework ${selection.elixirWebFramework}`,
|
|
6612
7626
|
`--elixir-orm ${selection.elixirOrm}`,
|
|
6613
7627
|
`--elixir-auth ${selection.elixirAuth}`,
|
|
@@ -6622,6 +7636,11 @@ function generateElixirCommand(selection, projectName) {
|
|
|
6622
7636
|
`--elixir-observability ${selection.elixirObservability}`,
|
|
6623
7637
|
`--elixir-testing ${selection.elixirTesting}`,
|
|
6624
7638
|
`--elixir-quality ${selection.elixirQuality}`,
|
|
7639
|
+
`--elixir-i18n ${selection.elixirI18n}`,
|
|
7640
|
+
`--elixir-http-server ${selection.elixirHttpServer}`,
|
|
7641
|
+
`--elixir-application-framework ${selection.elixirApplicationFramework}`,
|
|
7642
|
+
`--elixir-documentation ${selection.elixirDocumentation}`,
|
|
7643
|
+
`--elixir-clustering ${selection.elixirClustering}`,
|
|
6625
7644
|
`--elixir-deploy ${selection.elixirDeploy}`,
|
|
6626
7645
|
formatArrayFlag("elixir-libraries", selection.elixirLibraries),
|
|
6627
7646
|
formatArrayFlag("ai-docs", selection.aiDocs)
|
|
@@ -6648,4 +7667,4 @@ function generateStackSelectionCommand(selection) {
|
|
|
6648
7667
|
|
|
6649
7668
|
//#endregion
|
|
6650
7669
|
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 };
|
|
6651
|
-
//# sourceMappingURL=stack-translation-
|
|
7670
|
+
//# sourceMappingURL=stack-translation-Ay-_1mNB.mjs.map
|