@better-fullstack/types 2.1.5 → 2.1.6
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-azh56xa4.d.mts → defaults-CklPcgSP.d.mts} +2 -2
- package/dist/defaults-CklPcgSP.d.mts.map +1 -0
- package/dist/{defaults-u9UAambo.mjs → defaults-DNnZX9er.mjs} +2 -1
- package/dist/defaults-DNnZX9er.mjs.map +1 -0
- package/dist/defaults.d.mts +3 -3
- package/dist/defaults.mjs +1 -1
- package/dist/index.d.mts +180 -6
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1560 -5
- package/dist/index.mjs.map +1 -1
- package/dist/json-schema.d.mts +604 -320
- package/dist/json-schema.d.mts.map +1 -1
- package/dist/json-schema.mjs +1 -1
- package/dist/{schemas-ZxRzd5TP.mjs → schemas-BXDvWDRp.mjs} +52 -10
- package/dist/schemas-BXDvWDRp.mjs.map +1 -0
- package/dist/{schemas-C3iF9TRm.d.mts → schemas-Dby5Bb6H.d.mts} +867 -593
- package/dist/schemas-Dby5Bb6H.d.mts.map +1 -0
- package/dist/schemas.d.mts +2 -2
- package/dist/schemas.mjs +2 -2
- package/dist/{stack-graph-BwtoYnJg.mjs → stack-graph-BAad0vv4.mjs} +48 -10
- package/dist/stack-graph-BAad0vv4.mjs.map +1 -0
- package/dist/{stack-graph-CiXONkqh.d.mts → stack-graph-DJy-Qxta.d.mts} +2 -2
- package/dist/stack-graph-DJy-Qxta.d.mts.map +1 -0
- package/dist/stack-graph.d.mts +3 -3
- package/dist/stack-graph.mjs +2 -2
- package/dist/{stack-translation-DNT-iMAE.mjs → stack-translation-BWOFnbOh.mjs} +280 -33
- package/dist/stack-translation-BWOFnbOh.mjs.map +1 -0
- package/dist/{stack-translation-BNwlAM1B.d.mts → stack-translation-C6Tubleh.d.mts} +19 -11
- package/dist/stack-translation-C6Tubleh.d.mts.map +1 -0
- package/dist/stack-translation.d.mts +4 -4
- package/dist/stack-translation.mjs +3 -3
- package/dist/{types-BG-DsHQ9.d.mts → types-B-Q8xLi7.d.mts} +5 -3
- package/dist/types-B-Q8xLi7.d.mts.map +1 -0
- package/dist/types.d.mts +3 -3
- package/package.json +1 -1
- package/dist/defaults-azh56xa4.d.mts.map +0 -1
- package/dist/defaults-u9UAambo.mjs.map +0 -1
- package/dist/schemas-C3iF9TRm.d.mts.map +0 -1
- package/dist/schemas-ZxRzd5TP.mjs.map +0 -1
- package/dist/stack-graph-BwtoYnJg.mjs.map +0 -1
- package/dist/stack-graph-CiXONkqh.d.mts.map +0 -1
- package/dist/stack-translation-BNwlAM1B.d.mts.map +0 -1
- package/dist/stack-translation-DNT-iMAE.mjs.map +0 -1
- package/dist/types-BG-DsHQ9.d.mts.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { $n as
|
|
2
|
-
import { E as requiresChatSdkVercelAIForExamples, S as hasTauriCompatibleFrontend, _ as UI_LIBRARY_COMPATIBILITY, a as getAddonStackPartBinding, b as hasPWACompatibleFrontend, f as parseStackPartSpecs, h as validateStackParts, i as formatStackPartSpec, m as stackPartsToLegacyProjectConfigPartial, s as getStackPartCompatibilityIssueForPart, u as legacyProjectConfigToStackParts, v as getUnsupportedWebDeployFrontend, x as hasTanStackAICompatibleFrontend } from "./stack-graph-
|
|
3
|
-
import { t as createCliDefaultProjectConfigBase } from "./defaults-
|
|
1
|
+
import { $n as MOBILE_OTA_VALUES, $r as RUST_AUTH_VALUES, Ai as SERVER_DEPLOY_VALUES, An as JAVA_AUTH_VALUES, Ar as PYTHON_WEB_FRAMEWORK_VALUES, B as DOTNET_OBSERVABILITY_VALUES, Cr as PYTHON_OBSERVABILITY_VALUES, Ct as ELIXIR_WEB_FRAMEWORK_VALUES, D as CMS_VALUES, Dr as PYTHON_TASK_QUEUE_VALUES, En as I18N_VALUES, Er as PYTHON_REALTIME_VALUES, F as DOTNET_API_VALUES, Fi as SHADCN_ICON_LIBRARY_VALUES, Fn as JAVA_ORM_VALUES, G as DOTNET_WEB_FRAMEWORK_VALUES, H as DOTNET_REALTIME_VALUES, I as DOTNET_AUTH_VALUES, Ii as SHADCN_RADIUS_VALUES, In as JAVA_TESTING_LIBRARIES_VALUES, Jt as FILE_UPLOAD_VALUES, Kt as FEATURE_FLAGS_VALUES, L as DOTNET_CACHING_VALUES, Li as SHADCN_STYLE_VALUES, Ln as JAVA_WEB_FRAMEWORK_VALUES, M as DATABASE_SETUP_VALUES, Mi as SHADCN_BASE_VALUES, Mn as JAVA_LANGUAGE_VALUES, N as DATABASE_VALUES, Ni as SHADCN_COLOR_THEME_VALUES, Nn as JAVA_LIBRARIES_VALUES, Or as PYTHON_TESTING_VALUES, Pi as SHADCN_FONT_VALUES, Pn as JAVA_LOGGING_VALUES, Qn as MOBILE_NAVIGATION_VALUES, Qr as RUST_API_VALUES, R as DOTNET_DEPLOY_VALUES, Ri as STATE_MANAGEMENT_VALUES, Rn as JOB_QUEUE_VALUES, Sr as PYTHON_GRAPHQL_VALUES, St as ELIXIR_VALIDATION_VALUES, Tr as PYTHON_QUALITY_VALUES, U as DOTNET_TESTING_VALUES, V as DOTNET_ORM_VALUES, W as DOTNET_VALIDATION_VALUES, Xr as REALTIME_VALUES, Yn as LOGGING_VALUES, Yr as RATE_LIMIT_VALUES, Yt as FORMS_VALUES, Zn as MOBILE_DEEP_LINKING_VALUES, Zr as RUNTIME_VALUES, _r as PYTHON_AI_VALUES, _t as ELIXIR_OBSERVABILITY_VALUES, a as ANALYTICS_VALUES, aa as VALIDATION_VALUES, ai as RUST_LOGGING_VALUES, an as GO_CLI_VALUES, br as PYTHON_CACHING_VALUES, bt as ELIXIR_REALTIME_VALUES, c as API_VALUES, ci as RUST_ORM_VALUES, cn as GO_MESSAGE_QUEUE_VALUES, ct as ELIXIR_API_VALUES, da as WEB_DEPLOY_VALUES, di as RUST_WEB_FRAMEWORK_VALUES, dn as GO_REALTIME_VALUES, dr as OBSERVABILITY_VALUES, dt as ELIXIR_DEPLOY_VALUES, ea as TESTING_VALUES, ei as RUST_CACHING_VALUES, er as MOBILE_PUSH_VALUES, fa as WORKSPACE_SHAPE_VALUES, fn as GO_TESTING_VALUES, ft as ELIXIR_EMAIL_VALUES, gr as PAYMENTS_VALUES, gt as ELIXIR_LIBRARIES_VALUES, hr as PACKAGE_MANAGER_VALUES, ht as ELIXIR_JSON_VALUES, i as AI_VALUES, ia as UI_LIBRARY_VALUES, ii as RUST_LIBRARIES_VALUES, in as GO_CACHING_VALUES, ji as SHADCN_BASE_COLOR_VALUES, jn as JAVA_BUILD_TOOL_VALUES, k as CSS_FRAMEWORK_VALUES, ki as SEARCH_VALUES, kn as JAVA_API_VALUES, kr as PYTHON_VALIDATION_VALUES, l as ASTRO_INTEGRATION_VALUES, li as RUST_REALTIME_VALUES, ln as GO_OBSERVABILITY_VALUES, lt as ELIXIR_AUTH_VALUES, mt as ELIXIR_JOBS_VALUES, ni as RUST_ERROR_HANDLING_VALUES, nn as GO_API_VALUES, nr as MOBILE_TESTING_VALUES, o as ANIMATION_VALUES, oa as VECTOR_DB_VALUES, oi as RUST_MESSAGE_QUEUE_VALUES, on as GO_CONFIG_VALUES, pn as GO_WEB_FRAMEWORK_VALUES, pr as ORM_VALUES, pt as ELIXIR_HTTP_VALUES, qt as FILE_STORAGE_VALUES, r as AI_DOCS_VALUES, ri as RUST_FRONTEND_VALUES, rn as GO_AUTH_VALUES, rr as MOBILE_UI_VALUES, sa as VERSION_CHANNEL_VALUES, si as RUST_OBSERVABILITY_VALUES, sn as GO_LOGGING_VALUES, st as EFFECT_VALUES, ti as RUST_CLI_VALUES, tr as MOBILE_STORAGE_VALUES, u as AUTH_VALUES, ui as RUST_TEMPLATING_VALUES, un as GO_ORM_VALUES, ut as ELIXIR_CACHING_VALUES, vr as PYTHON_API_VALUES, vt as ELIXIR_ORM_VALUES, w as CACHING_VALUES, wr as PYTHON_ORM_VALUES, wt as EMAIL_VALUES, xr as PYTHON_CLI_VALUES, xt as ELIXIR_TESTING_VALUES, yr as PYTHON_AUTH_VALUES, yt as ELIXIR_QUALITY_VALUES, z as DOTNET_JOB_QUEUE_VALUES } from "./schemas-BXDvWDRp.mjs";
|
|
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-BAad0vv4.mjs";
|
|
3
|
+
import { t as createCliDefaultProjectConfigBase } from "./defaults-DNnZX9er.mjs";
|
|
4
4
|
|
|
5
5
|
//#region src/capabilities.ts
|
|
6
6
|
const CAPABILITY_DEFINITIONS = { auth: [
|
|
@@ -249,7 +249,6 @@ const TYPESCRIPT_CATEGORY_ORDER = [
|
|
|
249
249
|
"shadcnFont",
|
|
250
250
|
"shadcnRadius",
|
|
251
251
|
"backend",
|
|
252
|
-
"backendLibraries",
|
|
253
252
|
"runtime",
|
|
254
253
|
"api",
|
|
255
254
|
"database",
|
|
@@ -269,6 +268,7 @@ const TYPESCRIPT_CATEGORY_ORDER = [
|
|
|
269
268
|
"stateManagement",
|
|
270
269
|
"forms",
|
|
271
270
|
"validation",
|
|
271
|
+
"backendLibraries",
|
|
272
272
|
"testing",
|
|
273
273
|
"realtime",
|
|
274
274
|
"jobQueue",
|
|
@@ -283,6 +283,7 @@ const TYPESCRIPT_CATEGORY_ORDER = [
|
|
|
283
283
|
"codeQuality",
|
|
284
284
|
"documentation",
|
|
285
285
|
"appPlatforms",
|
|
286
|
+
"workspaceShape",
|
|
286
287
|
"packageManager",
|
|
287
288
|
"examples",
|
|
288
289
|
"aiDocs",
|
|
@@ -300,6 +301,7 @@ const REACT_NATIVE_CATEGORY_ORDER = [
|
|
|
300
301
|
"mobileOTA",
|
|
301
302
|
"mobileDeepLinking",
|
|
302
303
|
"auth",
|
|
304
|
+
"payments",
|
|
303
305
|
"packageManager",
|
|
304
306
|
"aiDocs",
|
|
305
307
|
"git",
|
|
@@ -375,6 +377,7 @@ const GO_CATEGORY_ORDER = [
|
|
|
375
377
|
];
|
|
376
378
|
const JAVA_CATEGORY_ORDER = [
|
|
377
379
|
"javaWebFramework",
|
|
380
|
+
"javaLanguage",
|
|
378
381
|
"javaBuildTool",
|
|
379
382
|
"javaOrm",
|
|
380
383
|
"javaAuth",
|
|
@@ -459,6 +462,7 @@ function getCategoryDisplayName(categoryKey) {
|
|
|
459
462
|
mobilePush: "Mobile Push",
|
|
460
463
|
mobileOTA: "Mobile OTA",
|
|
461
464
|
mobileDeepLinking: "Mobile Deep Linking",
|
|
465
|
+
backendLibraries: "Effect Services",
|
|
462
466
|
rustWebFramework: "Rust Web Framework",
|
|
463
467
|
rustFrontend: "Rust Frontend (WASM)",
|
|
464
468
|
rustOrm: "Rust ORM / Database",
|
|
@@ -499,6 +503,7 @@ function getCategoryDisplayName(categoryKey) {
|
|
|
499
503
|
goCaching: "Go Caching",
|
|
500
504
|
goConfig: "Go Config",
|
|
501
505
|
goObservability: "Go Observability",
|
|
506
|
+
javaLanguage: "Java Language",
|
|
502
507
|
javaWebFramework: "Java Web Framework",
|
|
503
508
|
javaBuildTool: "Java Build Tool",
|
|
504
509
|
javaOrm: "Java ORM / Database",
|
|
@@ -569,6 +574,7 @@ const BACKEND_BUILDER_VALUES = [
|
|
|
569
574
|
"fastify",
|
|
570
575
|
"elysia",
|
|
571
576
|
"fets",
|
|
577
|
+
"effect",
|
|
572
578
|
"nestjs",
|
|
573
579
|
"adonisjs",
|
|
574
580
|
"nitro",
|
|
@@ -683,6 +689,7 @@ const CATEGORY_VALUE_IDS = {
|
|
|
683
689
|
documentation: DOCUMENTATION_VALUES,
|
|
684
690
|
appPlatforms: APP_PLATFORM_VALUES,
|
|
685
691
|
packageManager: PACKAGE_MANAGER_VALUES,
|
|
692
|
+
workspaceShape: WORKSPACE_SHAPE_VALUES,
|
|
686
693
|
versionChannel: VERSION_CHANNEL_VALUES,
|
|
687
694
|
examples: EXAMPLE_VALUES,
|
|
688
695
|
ai: AI_VALUES,
|
|
@@ -737,6 +744,7 @@ const CATEGORY_VALUE_IDS = {
|
|
|
737
744
|
goCaching: GO_CACHING_VALUES,
|
|
738
745
|
goConfig: GO_CONFIG_VALUES,
|
|
739
746
|
goObservability: GO_OBSERVABILITY_VALUES,
|
|
747
|
+
javaLanguage: JAVA_LANGUAGE_VALUES,
|
|
740
748
|
javaWebFramework: JAVA_WEB_FRAMEWORK_VALUES,
|
|
741
749
|
javaBuildTool: JAVA_BUILD_TOOL_VALUES,
|
|
742
750
|
javaOrm: JAVA_ORM_VALUES,
|
|
@@ -798,6 +806,7 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
798
806
|
workers: "Cloudflare Workers"
|
|
799
807
|
},
|
|
800
808
|
backend: {
|
|
809
|
+
effect: "Effect",
|
|
801
810
|
fets: "feTS",
|
|
802
811
|
nestjs: "NestJS",
|
|
803
812
|
encore: "Encore.ts",
|
|
@@ -882,8 +891,8 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
882
891
|
"upstash-ratelimit": "Upstash Ratelimit"
|
|
883
892
|
},
|
|
884
893
|
backendLibraries: {
|
|
885
|
-
effect: "Effect
|
|
886
|
-
"effect-full": "Effect
|
|
894
|
+
effect: "Effect Core",
|
|
895
|
+
"effect-full": "Effect Platform + SQL"
|
|
887
896
|
},
|
|
888
897
|
stateManagement: {
|
|
889
898
|
"redux-toolkit": "Redux Toolkit",
|
|
@@ -920,7 +929,8 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
920
929
|
typesense: "Typesense",
|
|
921
930
|
elasticsearch: "Elasticsearch",
|
|
922
931
|
opensearch: "OpenSearch",
|
|
923
|
-
algolia: "Algolia"
|
|
932
|
+
algolia: "Algolia",
|
|
933
|
+
bleve: "Bleve"
|
|
924
934
|
},
|
|
925
935
|
vectorDb: {
|
|
926
936
|
pgvector: "pgvector",
|
|
@@ -1047,8 +1057,8 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
1047
1057
|
false: "Skip Install"
|
|
1048
1058
|
},
|
|
1049
1059
|
effect: {
|
|
1050
|
-
effect: "Effect
|
|
1051
|
-
"effect-full": "Effect
|
|
1060
|
+
effect: "Effect Core",
|
|
1061
|
+
"effect-full": "Effect Platform + SQL"
|
|
1052
1062
|
},
|
|
1053
1063
|
shadcnBase: {
|
|
1054
1064
|
radix: "Radix UI",
|
|
@@ -1092,7 +1102,9 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
1092
1102
|
rustWebFramework: {
|
|
1093
1103
|
axum: "Axum",
|
|
1094
1104
|
"actix-web": "Actix-web",
|
|
1095
|
-
rocket: "Rocket"
|
|
1105
|
+
rocket: "Rocket",
|
|
1106
|
+
poem: "Poem",
|
|
1107
|
+
loco: "Loco"
|
|
1096
1108
|
},
|
|
1097
1109
|
rustFrontend: {
|
|
1098
1110
|
leptos: "Leptos",
|
|
@@ -1226,12 +1238,14 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
1226
1238
|
gin: "Gin",
|
|
1227
1239
|
echo: "Echo",
|
|
1228
1240
|
fiber: "Fiber",
|
|
1229
|
-
chi: "Chi"
|
|
1241
|
+
chi: "Chi",
|
|
1242
|
+
stdlib: "net/http"
|
|
1230
1243
|
},
|
|
1231
1244
|
goOrm: {
|
|
1232
1245
|
gorm: "GORM",
|
|
1233
1246
|
sqlc: "sqlc",
|
|
1234
|
-
ent: "Ent"
|
|
1247
|
+
ent: "Ent",
|
|
1248
|
+
bun: "Bun"
|
|
1235
1249
|
},
|
|
1236
1250
|
goApi: {
|
|
1237
1251
|
"grpc-go": "gRPC-Go",
|
|
@@ -1274,9 +1288,14 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
1274
1288
|
koanf: "Koanf"
|
|
1275
1289
|
},
|
|
1276
1290
|
goObservability: { opentelemetry: "OpenTelemetry" },
|
|
1291
|
+
javaLanguage: {
|
|
1292
|
+
java: "Java",
|
|
1293
|
+
kotlin: "Kotlin"
|
|
1294
|
+
},
|
|
1277
1295
|
javaWebFramework: {
|
|
1278
1296
|
"spring-boot": "Spring Boot",
|
|
1279
|
-
quarkus: "Quarkus"
|
|
1297
|
+
quarkus: "Quarkus",
|
|
1298
|
+
micronaut: "Micronaut"
|
|
1280
1299
|
},
|
|
1281
1300
|
javaBuildTool: { maven: "Maven" },
|
|
1282
1301
|
javaOrm: {
|
|
@@ -1288,8 +1307,15 @@ const EXACT_LABEL_OVERRIDES = {
|
|
|
1288
1307
|
"spring-security": "Spring Security",
|
|
1289
1308
|
keycloak: "Keycloak (OAuth2 Resource Server)"
|
|
1290
1309
|
},
|
|
1291
|
-
javaApi: {
|
|
1292
|
-
|
|
1310
|
+
javaApi: {
|
|
1311
|
+
"spring-graphql": "Spring for GraphQL",
|
|
1312
|
+
"openapi-generator": "OpenAPI Generator",
|
|
1313
|
+
grpc: "gRPC"
|
|
1314
|
+
},
|
|
1315
|
+
javaLogging: {
|
|
1316
|
+
logback: "Logback",
|
|
1317
|
+
log4j2: "Log4j2"
|
|
1318
|
+
},
|
|
1293
1319
|
javaLibraries: {
|
|
1294
1320
|
"spring-actuator": "Spring Boot Actuator",
|
|
1295
1321
|
"spring-validation": "Spring Validation",
|
|
@@ -1547,6 +1573,7 @@ const OPTION_CATEGORY_METADATA = {
|
|
|
1547
1573
|
documentation: buildCategoryMetadata("documentation"),
|
|
1548
1574
|
appPlatforms: buildCategoryMetadata("appPlatforms"),
|
|
1549
1575
|
packageManager: buildCategoryMetadata("packageManager"),
|
|
1576
|
+
workspaceShape: buildCategoryMetadata("workspaceShape"),
|
|
1550
1577
|
versionChannel: buildCategoryMetadata("versionChannel"),
|
|
1551
1578
|
examples: buildCategoryMetadata("examples"),
|
|
1552
1579
|
ai: buildCategoryMetadata("ai"),
|
|
@@ -1601,6 +1628,7 @@ const OPTION_CATEGORY_METADATA = {
|
|
|
1601
1628
|
goCaching: buildCategoryMetadata("goCaching"),
|
|
1602
1629
|
goConfig: buildCategoryMetadata("goConfig"),
|
|
1603
1630
|
goObservability: buildCategoryMetadata("goObservability"),
|
|
1631
|
+
javaLanguage: buildCategoryMetadata("javaLanguage"),
|
|
1604
1632
|
javaWebFramework: buildCategoryMetadata("javaWebFramework"),
|
|
1605
1633
|
javaBuildTool: buildCategoryMetadata("javaBuildTool"),
|
|
1606
1634
|
javaOrm: buildCategoryMetadata("javaOrm"),
|
|
@@ -1657,6 +1685,11 @@ function normalizeOptionId(category, value) {
|
|
|
1657
1685
|
//#endregion
|
|
1658
1686
|
//#region src/compatibility.ts
|
|
1659
1687
|
const DEFAULT_RUNTIME = "bun";
|
|
1688
|
+
const REVENUECAT_NATIVE_FRONTENDS = new Set([
|
|
1689
|
+
"native-bare",
|
|
1690
|
+
"native-uniwind",
|
|
1691
|
+
"native-unistyles"
|
|
1692
|
+
]);
|
|
1660
1693
|
const PARAGLIDE_COMPATIBLE_FRONTENDS = new Set([
|
|
1661
1694
|
"next",
|
|
1662
1695
|
"nuxt",
|
|
@@ -1670,6 +1703,15 @@ const PARAGLIDE_COMPATIBLE_FRONTENDS = new Set([
|
|
|
1670
1703
|
"solid-start",
|
|
1671
1704
|
"astro"
|
|
1672
1705
|
]);
|
|
1706
|
+
const INTLAYER_COMPATIBLE_FRONTENDS = new Set([
|
|
1707
|
+
"next",
|
|
1708
|
+
"vinext",
|
|
1709
|
+
"tanstack-router",
|
|
1710
|
+
"tanstack-start",
|
|
1711
|
+
"react-router",
|
|
1712
|
+
"react-vite"
|
|
1713
|
+
]);
|
|
1714
|
+
const hasRevenueCatCompatibleNativeFrontend = (frontends) => frontends.some((frontend) => REVENUECAT_NATIVE_FRONTENDS.has(frontend));
|
|
1673
1715
|
function validateProjectName(name) {
|
|
1674
1716
|
const INVALID_CHARS = [
|
|
1675
1717
|
"<",
|
|
@@ -1705,6 +1747,60 @@ const requiresChatSdkVercelAI = (stack) => {
|
|
|
1705
1747
|
* This follows the CLI approach: when you make a selection, dependent items adjust automatically.
|
|
1706
1748
|
* The flow is: frontend -> backend -> runtime -> database -> orm -> api -> auth -> etc.
|
|
1707
1749
|
*/
|
|
1750
|
+
/**
|
|
1751
|
+
* Backends that can collapse into a flat single-app layout (no separate
|
|
1752
|
+
* apps/server or packages/* workspace). These are the "thin self" fullstack
|
|
1753
|
+
* frameworks whose web app already owns the server via route handlers AND that
|
|
1754
|
+
* expose a `@/*` -> ./src path alias so the inlined env module resolves cleanly.
|
|
1755
|
+
* Nuxt is intentionally excluded from the MVP (different alias convention).
|
|
1756
|
+
*/
|
|
1757
|
+
const SINGLE_APP_SELF_BACKENDS = new Set(["self-next", "self-tanstack-start"]);
|
|
1758
|
+
const SINGLE_APP_WEB_FRONTEND_BY_BACKEND = {
|
|
1759
|
+
"self-next": "next",
|
|
1760
|
+
"self-tanstack-start": "tanstack-start"
|
|
1761
|
+
};
|
|
1762
|
+
/**
|
|
1763
|
+
* A single-app (flat) layout is only safe for a "thin self" stack that emits no
|
|
1764
|
+
* sibling workspace package (database/orm, better-auth server, trpc/orpc
|
|
1765
|
+
* packages/api, payments, email, etc.) and no separate native/server app. For
|
|
1766
|
+
* anything else, `single-app` is normalized back to `monorepo` so we never emit
|
|
1767
|
+
* a broken flat layout. appPlatforms (turborepo/nx) are ignored here — the
|
|
1768
|
+
* generator drops the workspace tooling when it flattens.
|
|
1769
|
+
*/
|
|
1770
|
+
function stackQualifiesForSingleApp(stack) {
|
|
1771
|
+
if (!SINGLE_APP_SELF_BACKENDS.has(stack.backend)) return false;
|
|
1772
|
+
if ((stack.nativeFrontend ?? []).filter((f) => f && f !== "none").length > 0) return false;
|
|
1773
|
+
const webFrontends = (stack.webFrontend ?? []).filter((f) => f && f !== "none");
|
|
1774
|
+
if (webFrontends.length !== 1) return false;
|
|
1775
|
+
if (webFrontends[0] !== SINGLE_APP_WEB_FRONTEND_BY_BACKEND[stack.backend]) return false;
|
|
1776
|
+
if ([
|
|
1777
|
+
stack.api,
|
|
1778
|
+
stack.database,
|
|
1779
|
+
stack.orm,
|
|
1780
|
+
stack.auth,
|
|
1781
|
+
stack.payments,
|
|
1782
|
+
stack.email,
|
|
1783
|
+
stack.fileUpload,
|
|
1784
|
+
stack.realtime,
|
|
1785
|
+
stack.jobQueue,
|
|
1786
|
+
stack.caching,
|
|
1787
|
+
stack.rateLimit,
|
|
1788
|
+
stack.i18n,
|
|
1789
|
+
stack.search,
|
|
1790
|
+
stack.vectorDb,
|
|
1791
|
+
stack.fileStorage,
|
|
1792
|
+
stack.cms,
|
|
1793
|
+
stack.aiSdk,
|
|
1794
|
+
stack.analytics,
|
|
1795
|
+
stack.featureFlags,
|
|
1796
|
+
stack.observability,
|
|
1797
|
+
stack.logging,
|
|
1798
|
+
stack.webDeploy,
|
|
1799
|
+
stack.serverDeploy
|
|
1800
|
+
].some((value) => value && value !== "none")) return false;
|
|
1801
|
+
if ((stack.examples ?? []).filter((e) => e && e !== "none").length > 0) return false;
|
|
1802
|
+
return true;
|
|
1803
|
+
}
|
|
1708
1804
|
const analyzeStackCompatibility = (stack) => {
|
|
1709
1805
|
if (stack.yolo === "true") return {
|
|
1710
1806
|
adjustedStack: null,
|
|
@@ -1788,6 +1884,7 @@ const analyzeStackCompatibility = (stack) => {
|
|
|
1788
1884
|
}
|
|
1789
1885
|
}
|
|
1790
1886
|
if (nextStack.backend === "none") {
|
|
1887
|
+
const shouldKeepRevenueCatPayments = nextStack.payments === "revenuecat" && (nextStack.ecosystem === "react-native" || hasRevenueCatCompatibleNativeFrontend(nextStack.nativeFrontend));
|
|
1791
1888
|
const noneOverrides = {
|
|
1792
1889
|
runtime: "none",
|
|
1793
1890
|
database: "none",
|
|
@@ -1795,7 +1892,6 @@ const analyzeStackCompatibility = (stack) => {
|
|
|
1795
1892
|
api: "none",
|
|
1796
1893
|
dbSetup: "none",
|
|
1797
1894
|
serverDeploy: "none",
|
|
1798
|
-
payments: "none",
|
|
1799
1895
|
search: "none",
|
|
1800
1896
|
vectorDb: "none",
|
|
1801
1897
|
rateLimit: "none",
|
|
@@ -1813,6 +1909,14 @@ const analyzeStackCompatibility = (stack) => {
|
|
|
1813
1909
|
});
|
|
1814
1910
|
}
|
|
1815
1911
|
}
|
|
1912
|
+
if (!shouldKeepRevenueCatPayments && nextStack.payments !== "none") {
|
|
1913
|
+
nextStack.payments = "none";
|
|
1914
|
+
changed = true;
|
|
1915
|
+
changes.push({
|
|
1916
|
+
category: "backend",
|
|
1917
|
+
message: "Payments set to 'none' (no backend)"
|
|
1918
|
+
});
|
|
1919
|
+
}
|
|
1816
1920
|
if (nextStack.examples.length > 0 && !(nextStack.examples.length === 1 && nextStack.examples[0] === "none")) {
|
|
1817
1921
|
nextStack.examples = ["none"];
|
|
1818
1922
|
changed = true;
|
|
@@ -1897,6 +2001,24 @@ const analyzeStackCompatibility = (stack) => {
|
|
|
1897
2001
|
});
|
|
1898
2002
|
}
|
|
1899
2003
|
}
|
|
2004
|
+
if (nextStack.backend === "effect") {
|
|
2005
|
+
if (nextStack.backendLibraries !== "effect-full") {
|
|
2006
|
+
nextStack.backendLibraries = "effect-full";
|
|
2007
|
+
changed = true;
|
|
2008
|
+
changes.push({
|
|
2009
|
+
category: "backendLibraries",
|
|
2010
|
+
message: "Effect services set to 'Effect Platform + SQL' (required for Effect backend)"
|
|
2011
|
+
});
|
|
2012
|
+
}
|
|
2013
|
+
if (nextStack.validation !== "effect-schema") {
|
|
2014
|
+
nextStack.validation = "effect-schema";
|
|
2015
|
+
changed = true;
|
|
2016
|
+
changes.push({
|
|
2017
|
+
category: "validation",
|
|
2018
|
+
message: "Validation set to 'Effect Schema' (required for Effect backend)"
|
|
2019
|
+
});
|
|
2020
|
+
}
|
|
2021
|
+
}
|
|
1900
2022
|
if (nextStack.runtime === "workers" && nextStack.backend !== "hono") {
|
|
1901
2023
|
nextStack.backend = "hono";
|
|
1902
2024
|
changed = true;
|
|
@@ -2169,6 +2291,22 @@ const analyzeStackCompatibility = (stack) => {
|
|
|
2169
2291
|
message: normalizedAuth.message ?? "Auth set to 'None'"
|
|
2170
2292
|
});
|
|
2171
2293
|
}
|
|
2294
|
+
if (nextStack.caching === "redis" && nextStack.ecosystem !== "typescript") {
|
|
2295
|
+
nextStack.caching = "none";
|
|
2296
|
+
changed = true;
|
|
2297
|
+
changes.push({
|
|
2298
|
+
category: "caching",
|
|
2299
|
+
message: "Caching set to 'None' (self-hosted Redis is only available for the TypeScript ecosystem)"
|
|
2300
|
+
});
|
|
2301
|
+
}
|
|
2302
|
+
if (nextStack.search === "bleve" && nextStack.ecosystem !== "go") {
|
|
2303
|
+
nextStack.search = "none";
|
|
2304
|
+
changed = true;
|
|
2305
|
+
changes.push({
|
|
2306
|
+
category: "search",
|
|
2307
|
+
message: "Search set to 'None' (Bleve is only available for the Go ecosystem)"
|
|
2308
|
+
});
|
|
2309
|
+
}
|
|
2172
2310
|
if (nextStack.payments === "dodo" && nextStack.webFrontend.includes("react-vite")) {
|
|
2173
2311
|
nextStack.payments = "none";
|
|
2174
2312
|
changed = true;
|
|
@@ -2195,6 +2333,16 @@ const analyzeStackCompatibility = (stack) => {
|
|
|
2195
2333
|
});
|
|
2196
2334
|
}
|
|
2197
2335
|
}
|
|
2336
|
+
if (nextStack.payments === "revenuecat") {
|
|
2337
|
+
if (!(nextStack.ecosystem === "react-native" || hasRevenueCatCompatibleNativeFrontend(nextStack.nativeFrontend))) {
|
|
2338
|
+
nextStack.payments = "none";
|
|
2339
|
+
changed = true;
|
|
2340
|
+
changes.push({
|
|
2341
|
+
category: "payments",
|
|
2342
|
+
message: "Payments set to 'None' (RevenueCat requires a native frontend)"
|
|
2343
|
+
});
|
|
2344
|
+
}
|
|
2345
|
+
}
|
|
2198
2346
|
if (nextStack.email !== "none") {
|
|
2199
2347
|
if (nextStack.backend === "convex") {
|
|
2200
2348
|
nextStack.email = "none";
|
|
@@ -2324,11 +2472,6 @@ const analyzeStackCompatibility = (stack) => {
|
|
|
2324
2472
|
"none",
|
|
2325
2473
|
"File upload set to 'None' (React Native ecosystem)"
|
|
2326
2474
|
],
|
|
2327
|
-
[
|
|
2328
|
-
"payments",
|
|
2329
|
-
"none",
|
|
2330
|
-
"Payments set to 'None' (React Native ecosystem)"
|
|
2331
|
-
],
|
|
2332
2475
|
[
|
|
2333
2476
|
"email",
|
|
2334
2477
|
"none",
|
|
@@ -2406,6 +2549,14 @@ const analyzeStackCompatibility = (stack) => {
|
|
|
2406
2549
|
});
|
|
2407
2550
|
}
|
|
2408
2551
|
}
|
|
2552
|
+
if (nextStack.payments !== "none" && nextStack.payments !== "revenuecat") {
|
|
2553
|
+
nextStack.payments = "none";
|
|
2554
|
+
changed = true;
|
|
2555
|
+
changes.push({
|
|
2556
|
+
category: "payments",
|
|
2557
|
+
message: "Payments set to 'None' (React Native payments currently support RevenueCat only)"
|
|
2558
|
+
});
|
|
2559
|
+
}
|
|
2409
2560
|
if (!hasNativeFrontend) {
|
|
2410
2561
|
nextStack.nativeFrontend = ["native-bare"];
|
|
2411
2562
|
hasNativeFrontend = true;
|
|
@@ -2722,6 +2873,14 @@ const analyzeStackCompatibility = (stack) => {
|
|
|
2722
2873
|
message: "Java auth set to 'None' (current scaffold only supports it with Spring Boot)"
|
|
2723
2874
|
});
|
|
2724
2875
|
}
|
|
2876
|
+
if (nextStack.javaApi !== "none") {
|
|
2877
|
+
nextStack.javaApi = "none";
|
|
2878
|
+
changed = true;
|
|
2879
|
+
changes.push({
|
|
2880
|
+
category: "javaWebFramework",
|
|
2881
|
+
message: "Java API set to 'None' (current scaffold only supports it with Spring Boot)"
|
|
2882
|
+
});
|
|
2883
|
+
}
|
|
2725
2884
|
if (nextStack.javaLibraries.some((library) => library !== "none")) {
|
|
2726
2885
|
nextStack.javaLibraries = [];
|
|
2727
2886
|
changed = true;
|
|
@@ -2752,6 +2911,36 @@ const analyzeStackCompatibility = (stack) => {
|
|
|
2752
2911
|
});
|
|
2753
2912
|
}
|
|
2754
2913
|
}
|
|
2914
|
+
if (nextStack.javaLanguage === "kotlin") {
|
|
2915
|
+
const kotlinUnsupportedTestingLibraries = new Set([
|
|
2916
|
+
"testcontainers",
|
|
2917
|
+
"rest-assured",
|
|
2918
|
+
"wiremock",
|
|
2919
|
+
"awaitility",
|
|
2920
|
+
"archunit",
|
|
2921
|
+
"jqwik"
|
|
2922
|
+
]);
|
|
2923
|
+
if (!(nextStack.javaWebFramework === "spring-boot" && nextStack.javaBuildTool !== "none" && nextStack.javaOrm !== "jooq" && nextStack.javaOrm !== "mybatis" && nextStack.javaApi !== "grpc" && nextStack.javaApi !== "openapi-generator" && nextStack.email !== "resend" && nextStack.search !== "meilisearch" && nextStack.caching !== "upstash-redis" && nextStack.observability !== "sentry" && !nextStack.javaTestingLibraries.some((library) => kotlinUnsupportedTestingLibraries.has(library)))) {
|
|
2924
|
+
nextStack.javaLanguage = "java";
|
|
2925
|
+
changed = true;
|
|
2926
|
+
changes.push({
|
|
2927
|
+
category: "javaLanguage",
|
|
2928
|
+
message: "Java language set to 'Java' (Kotlin currently targets the Spring Boot scaffold with Spring Data JPA/none, Spring GraphQL/none, and no jOOQ/MyBatis/gRPC/OpenAPI or Java-only service integrations)"
|
|
2929
|
+
});
|
|
2930
|
+
}
|
|
2931
|
+
}
|
|
2932
|
+
}
|
|
2933
|
+
if (nextStack.i18n === "intlayer") {
|
|
2934
|
+
const hasWebFrontend = nextStack.webFrontend.some((frontend) => frontend !== "none");
|
|
2935
|
+
const unsupportedFrontend = nextStack.webFrontend.find((frontend) => frontend !== "none" && !INTLAYER_COMPATIBLE_FRONTENDS.has(frontend));
|
|
2936
|
+
if (!hasWebFrontend || unsupportedFrontend) {
|
|
2937
|
+
nextStack.i18n = "none";
|
|
2938
|
+
changed = true;
|
|
2939
|
+
changes.push({
|
|
2940
|
+
category: "i18n",
|
|
2941
|
+
message: unsupportedFrontend ? `i18n set to 'None' (Intlayer is not wired for the '${unsupportedFrontend}' frontend)` : "i18n set to 'None' (Intlayer requires a web frontend)"
|
|
2942
|
+
});
|
|
2943
|
+
}
|
|
2755
2944
|
}
|
|
2756
2945
|
if (nextStack.ecosystem === "elixir") {
|
|
2757
2946
|
if (nextStack.elixirWebFramework === "none") for (const key of [
|
|
@@ -2857,6 +3046,14 @@ const analyzeStackCompatibility = (stack) => {
|
|
|
2857
3046
|
message: "Server deploy set to 'None' (not needed for this backend)"
|
|
2858
3047
|
});
|
|
2859
3048
|
}
|
|
3049
|
+
if (nextStack.workspaceShape === "single-app" && !stackQualifiesForSingleApp(nextStack)) {
|
|
3050
|
+
nextStack.workspaceShape = "monorepo";
|
|
3051
|
+
changed = true;
|
|
3052
|
+
changes.push({
|
|
3053
|
+
category: "workspaceShape",
|
|
3054
|
+
message: "Workspace shape set to 'Monorepo' (single-app only supports a thin self app: Next.js or TanStack Start fullstack with no separate database/auth/api/server packages)"
|
|
3055
|
+
});
|
|
3056
|
+
}
|
|
2860
3057
|
return {
|
|
2861
3058
|
adjustedStack: changed ? nextStack : null,
|
|
2862
3059
|
notes,
|
|
@@ -2898,7 +3095,7 @@ const getDisabledReason = (currentStack, category, optionId) => {
|
|
|
2898
3095
|
}
|
|
2899
3096
|
}
|
|
2900
3097
|
if (currentStack.ecosystem === "react-native") {
|
|
2901
|
-
|
|
3098
|
+
const reactNativeCategories = new Set([
|
|
2902
3099
|
"nativeFrontend",
|
|
2903
3100
|
"mobileNavigation",
|
|
2904
3101
|
"mobileUI",
|
|
@@ -2908,11 +3105,14 @@ const getDisabledReason = (currentStack, category, optionId) => {
|
|
|
2908
3105
|
"mobileOTA",
|
|
2909
3106
|
"mobileDeepLinking",
|
|
2910
3107
|
"auth",
|
|
3108
|
+
"payments",
|
|
2911
3109
|
"packageManager",
|
|
2912
3110
|
"aiDocs",
|
|
2913
3111
|
"git",
|
|
2914
3112
|
"install"
|
|
2915
|
-
])
|
|
3113
|
+
]);
|
|
3114
|
+
if (category === "payments" && optionId !== "none" && optionId !== "revenuecat") return "React Native payments currently support RevenueCat only";
|
|
3115
|
+
if (!reactNativeCategories.has(category) && optionId !== "none" && optionId !== "false") return "React Native ecosystem only supports native mobile options";
|
|
2916
3116
|
}
|
|
2917
3117
|
if (currentStack.backend === "none") {
|
|
2918
3118
|
if (category === "runtime" && optionId !== "none") return "No backend selected";
|
|
@@ -2921,14 +3121,22 @@ const getDisabledReason = (currentStack, category, optionId) => {
|
|
|
2921
3121
|
if (category === "api" && optionId !== "none") return "No backend selected";
|
|
2922
3122
|
if (category === "dbSetup" && optionId !== "none") return "No backend selected";
|
|
2923
3123
|
if (category === "serverDeploy" && optionId !== "none") return "No backend selected";
|
|
2924
|
-
if (category === "payments" && optionId !== "none") return "No backend selected";
|
|
3124
|
+
if (category === "payments" && optionId !== "none" && optionId !== "revenuecat") return "No backend selected";
|
|
2925
3125
|
if (category === "search" && optionId !== "none") return "No backend selected";
|
|
2926
3126
|
if (category === "vectorDb" && optionId !== "none") return "No backend selected";
|
|
2927
3127
|
if (category === "rateLimit" && optionId !== "none") return "No backend selected";
|
|
2928
3128
|
if (category === "fileStorage" && optionId !== "none") return "No backend selected";
|
|
2929
3129
|
if (category === "examples" && optionId !== "none") return "No backend selected";
|
|
2930
3130
|
}
|
|
2931
|
-
|
|
3131
|
+
if (currentStack.backend === "effect") {
|
|
3132
|
+
if (category === "backendLibraries" && optionId !== "effect-full") return "Effect backend requires Effect Platform + SQL services";
|
|
3133
|
+
if (category === "validation" && optionId !== "effect-schema") return "Effect backend requires Effect Schema validation";
|
|
3134
|
+
}
|
|
3135
|
+
const graphDisabledReason = category === "payments" && optionId === "revenuecat" || category === "i18n" && optionId === "intlayer" ? {
|
|
3136
|
+
handled: false,
|
|
3137
|
+
authoritative: false,
|
|
3138
|
+
reason: null
|
|
3139
|
+
} : getGraphDisabledReason(currentStack, category, optionId);
|
|
2932
3140
|
if (graphDisabledReason.reason) return graphDisabledReason.reason;
|
|
2933
3141
|
if (graphDisabledReason.handled && graphDisabledReason.authoritative) return null;
|
|
2934
3142
|
if (currentStack.backend === "self-next") {
|
|
@@ -3043,10 +3251,11 @@ const getDisabledReason = (currentStack, category, optionId) => {
|
|
|
3043
3251
|
if (currentStack.nativeFrontend.length > 0) return "OpenAPI is currently available for web frontends, not React Native";
|
|
3044
3252
|
if (![
|
|
3045
3253
|
"hono",
|
|
3254
|
+
"effect",
|
|
3046
3255
|
"express",
|
|
3047
3256
|
"fastify",
|
|
3048
3257
|
"elysia"
|
|
3049
|
-
].includes(currentStack.backend)) return "OpenAPI currently supports Hono, Express, Fastify, and Elysia backends";
|
|
3258
|
+
].includes(currentStack.backend)) return "OpenAPI currently supports Hono, Effect, Express, Fastify, and Elysia backends";
|
|
3050
3259
|
}
|
|
3051
3260
|
if (category === "api" && optionId === "apollo-server") {
|
|
3052
3261
|
if (currentStack.webFrontend.some((f) => [
|
|
@@ -3065,10 +3274,11 @@ const getDisabledReason = (currentStack, category, optionId) => {
|
|
|
3065
3274
|
if (currentStack.nativeFrontend.length > 0) return "Apollo Server is currently available for web frontends, not React Native";
|
|
3066
3275
|
if (![
|
|
3067
3276
|
"hono",
|
|
3277
|
+
"effect",
|
|
3068
3278
|
"express",
|
|
3069
3279
|
"fastify",
|
|
3070
3280
|
"elysia"
|
|
3071
|
-
].includes(currentStack.backend)) return "Apollo Server currently supports Hono, Express, Fastify, and Elysia backends";
|
|
3281
|
+
].includes(currentStack.backend)) return "Apollo Server currently supports Hono, Effect, Express, Fastify, and Elysia backends";
|
|
3072
3282
|
}
|
|
3073
3283
|
if (category === "appPlatforms" && optionId === "nx" && currentStack.appPlatforms.includes("turborepo")) return "Choose either Nx or Turborepo, not both";
|
|
3074
3284
|
if (category === "appPlatforms" && optionId === "turborepo" && currentStack.appPlatforms.includes("nx")) return "Choose either Turborepo or Nx, not both";
|
|
@@ -3097,6 +3307,9 @@ const getDisabledReason = (currentStack, category, optionId) => {
|
|
|
3097
3307
|
if (!currentStack.webFrontend.some((f) => f !== "none")) return "Polar requires a web frontend";
|
|
3098
3308
|
}
|
|
3099
3309
|
if (category === "payments" && optionId !== "none" && currentStack.webFrontend.includes("react-vite") && optionId === "dodo") return "Dodo Payments are not yet supported for React + Vite projects";
|
|
3310
|
+
if (category === "payments" && optionId === "revenuecat") {
|
|
3311
|
+
if (!hasRevenueCatCompatibleNativeFrontend(currentStack.nativeFrontend)) return "RevenueCat payments requires a native frontend (native-bare, native-uniwind, or native-unistyles)";
|
|
3312
|
+
}
|
|
3100
3313
|
if (category === "cms" && optionId === "payload") {
|
|
3101
3314
|
if (!currentStack.webFrontend.includes("next")) return "Payload CMS v3 requires Next.js";
|
|
3102
3315
|
}
|
|
@@ -3111,6 +3324,7 @@ const getDisabledReason = (currentStack, category, optionId) => {
|
|
|
3111
3324
|
if (category === "observability" && optionId !== "none") {
|
|
3112
3325
|
if (currentStack.ecosystem !== "typescript") return null;
|
|
3113
3326
|
}
|
|
3327
|
+
if (category === "caching" && optionId === "redis" && currentStack.ecosystem !== "typescript") return "Self-hosted Redis caching (ioredis) is only available for the TypeScript ecosystem";
|
|
3114
3328
|
if (category === "caching" && optionId !== "none") {
|
|
3115
3329
|
if (currentStack.ecosystem !== "typescript") return null;
|
|
3116
3330
|
}
|
|
@@ -3119,6 +3333,7 @@ const getDisabledReason = (currentStack, category, optionId) => {
|
|
|
3119
3333
|
if (currentStack.backend === "convex") return "Rate limiting helpers are not generated with Convex backend";
|
|
3120
3334
|
if (currentStack.backend === "none") return "Rate limiting requires a backend";
|
|
3121
3335
|
}
|
|
3336
|
+
if (category === "search" && optionId === "bleve" && currentStack.ecosystem !== "go") return "Bleve is an embedded Go search engine, only available for the Go ecosystem";
|
|
3122
3337
|
if (category === "search" && optionId !== "none") {
|
|
3123
3338
|
if (currentStack.ecosystem !== "typescript") return null;
|
|
3124
3339
|
}
|
|
@@ -3279,6 +3494,10 @@ const getDisabledReason = (currentStack, category, optionId) => {
|
|
|
3279
3494
|
if (optionId === "next-intl") {
|
|
3280
3495
|
if (!currentStack.webFrontend.includes("next")) return "next-intl requires Next.js";
|
|
3281
3496
|
}
|
|
3497
|
+
if (optionId === "intlayer") {
|
|
3498
|
+
const unsupportedFrontend = currentStack.webFrontend.find((frontend) => frontend !== "none" && !INTLAYER_COMPATIBLE_FRONTENDS.has(frontend));
|
|
3499
|
+
if (unsupportedFrontend) return `Intlayer is not yet wired for the '${unsupportedFrontend}' frontend`;
|
|
3500
|
+
}
|
|
3282
3501
|
}
|
|
3283
3502
|
if (category === "pythonApi") {
|
|
3284
3503
|
if (optionId !== "none" && currentStack.pythonWebFramework !== "django") return "Python API frameworks currently require Django";
|
|
@@ -3291,6 +3510,7 @@ const getDisabledReason = (currentStack, category, optionId) => {
|
|
|
3291
3510
|
if (currentStack.javaWebFramework !== "none") return "Java web frameworks require Maven or Gradle";
|
|
3292
3511
|
if (currentStack.javaOrm !== "none") return "Java ORM support requires Maven or Gradle";
|
|
3293
3512
|
if (currentStack.javaAuth !== "none") return "Java auth support requires Maven or Gradle";
|
|
3513
|
+
if (currentStack.javaApi !== "none") return "Java API support requires Maven or Gradle";
|
|
3294
3514
|
if (currentStack.javaLibraries.some((library) => library !== "none")) return "Java libraries require Maven or Gradle";
|
|
3295
3515
|
if (currentStack.javaTestingLibraries.some((library) => library !== "none")) return "Java testing libraries require Maven or Gradle";
|
|
3296
3516
|
}
|
|
@@ -3303,6 +3523,10 @@ const getDisabledReason = (currentStack, category, optionId) => {
|
|
|
3303
3523
|
if (optionId !== "none" && currentStack.javaWebFramework !== "spring-boot") return "Java auth support currently requires Spring Boot";
|
|
3304
3524
|
if (optionId !== "none" && currentStack.javaBuildTool === "none") return "Java auth support requires Maven or Gradle";
|
|
3305
3525
|
}
|
|
3526
|
+
if (category === "javaApi") {
|
|
3527
|
+
if (optionId !== "none" && currentStack.javaWebFramework !== "spring-boot") return "Java API support currently requires Spring Boot";
|
|
3528
|
+
if (optionId !== "none" && currentStack.javaBuildTool === "none") return "Java API support requires Maven or Gradle";
|
|
3529
|
+
}
|
|
3306
3530
|
if (category === "javaLibraries") {
|
|
3307
3531
|
if (optionId !== "none" && currentStack.javaWebFramework !== "spring-boot") return "Spring libraries currently require Spring Boot in the Java scaffold";
|
|
3308
3532
|
if (optionId !== "none" && currentStack.javaBuildTool === "none") return "Java libraries require Maven or Gradle";
|
|
@@ -4513,6 +4737,7 @@ const DEFAULT_STACK_SELECTION = {
|
|
|
4513
4737
|
documentation: [],
|
|
4514
4738
|
appPlatforms: ["turborepo"],
|
|
4515
4739
|
packageManager: "bun",
|
|
4740
|
+
workspaceShape: "monorepo",
|
|
4516
4741
|
versionChannel: "stable",
|
|
4517
4742
|
examples: [],
|
|
4518
4743
|
aiSdk: "none",
|
|
@@ -4563,6 +4788,7 @@ const DEFAULT_STACK_SELECTION = {
|
|
|
4563
4788
|
goCaching: "none",
|
|
4564
4789
|
goConfig: "none",
|
|
4565
4790
|
goObservability: "none",
|
|
4791
|
+
javaLanguage: "java",
|
|
4566
4792
|
javaWebFramework: "spring-boot",
|
|
4567
4793
|
javaBuildTool: "maven",
|
|
4568
4794
|
javaOrm: "none",
|
|
@@ -4658,6 +4884,7 @@ const STACK_SELECTION_OPTION_CATEGORY_BY_KEY = {
|
|
|
4658
4884
|
documentation: "documentation",
|
|
4659
4885
|
appPlatforms: "appPlatforms",
|
|
4660
4886
|
packageManager: "packageManager",
|
|
4887
|
+
workspaceShape: "workspaceShape",
|
|
4661
4888
|
versionChannel: "versionChannel",
|
|
4662
4889
|
examples: "examples",
|
|
4663
4890
|
aiSdk: "ai",
|
|
@@ -4707,6 +4934,7 @@ const STACK_SELECTION_OPTION_CATEGORY_BY_KEY = {
|
|
|
4707
4934
|
goCaching: "goCaching",
|
|
4708
4935
|
goConfig: "goConfig",
|
|
4709
4936
|
goObservability: "goObservability",
|
|
4937
|
+
javaLanguage: "javaLanguage",
|
|
4710
4938
|
javaWebFramework: "javaWebFramework",
|
|
4711
4939
|
javaBuildTool: "javaBuildTool",
|
|
4712
4940
|
javaOrm: "javaOrm",
|
|
@@ -4815,6 +5043,7 @@ const STACK_SELECTION_URL_KEYS = {
|
|
|
4815
5043
|
documentation: "doc",
|
|
4816
5044
|
appPlatforms: "ap",
|
|
4817
5045
|
packageManager: "pm",
|
|
5046
|
+
workspaceShape: "ws",
|
|
4818
5047
|
versionChannel: "vc",
|
|
4819
5048
|
examples: "ex",
|
|
4820
5049
|
aiSdk: "aisdk",
|
|
@@ -4865,6 +5094,7 @@ const STACK_SELECTION_URL_KEYS = {
|
|
|
4865
5094
|
goCaching: "gcache",
|
|
4866
5095
|
goConfig: "gcfg",
|
|
4867
5096
|
goObservability: "gobs",
|
|
5097
|
+
javaLanguage: "jlang",
|
|
4868
5098
|
javaWebFramework: "jwf",
|
|
4869
5099
|
javaBuildTool: "jbt",
|
|
4870
5100
|
javaOrm: "jorm",
|
|
@@ -5041,6 +5271,7 @@ const CLI_SCALAR_CONFIG_FIELDS = [
|
|
|
5041
5271
|
["runtime", "runtime"],
|
|
5042
5272
|
["dbSetup", "dbSetup"],
|
|
5043
5273
|
["packageManager", "packageManager"],
|
|
5274
|
+
["workspaceShape", "workspaceShape"],
|
|
5044
5275
|
["versionChannel", "versionChannel"],
|
|
5045
5276
|
["webDeploy", "webDeploy"],
|
|
5046
5277
|
["serverDeploy", "serverDeploy"],
|
|
@@ -5089,6 +5320,7 @@ const CLI_SCALAR_CONFIG_FIELDS = [
|
|
|
5089
5320
|
["goCaching", "goCaching"],
|
|
5090
5321
|
["goConfig", "goConfig"],
|
|
5091
5322
|
["goObservability", "goObservability"],
|
|
5323
|
+
["javaLanguage", "javaLanguage"],
|
|
5092
5324
|
["javaWebFramework", "javaWebFramework"],
|
|
5093
5325
|
["javaBuildTool", "javaBuildTool"],
|
|
5094
5326
|
["javaOrm", "javaOrm"],
|
|
@@ -5200,6 +5432,7 @@ const GO_CONFIG_KEYS = [
|
|
|
5200
5432
|
"goObservability"
|
|
5201
5433
|
];
|
|
5202
5434
|
const JAVA_CONFIG_KEYS = [
|
|
5435
|
+
"javaLanguage",
|
|
5203
5436
|
"javaWebFramework",
|
|
5204
5437
|
"javaBuildTool",
|
|
5205
5438
|
"javaOrm",
|
|
@@ -5409,6 +5642,7 @@ const GRAPH_GO_BACKEND_PART_SELECTION_KEYS = [
|
|
|
5409
5642
|
["search", "search"]
|
|
5410
5643
|
];
|
|
5411
5644
|
const GRAPH_JAVA_BACKEND_PART_SELECTION_KEYS = [
|
|
5645
|
+
["javaLanguage", "language"],
|
|
5412
5646
|
["javaBuildTool", "buildTool"],
|
|
5413
5647
|
["caching", "caching"],
|
|
5414
5648
|
["search", "search"]
|
|
@@ -5882,6 +6116,7 @@ function getCliGraphStackParts(input) {
|
|
|
5882
6116
|
function buildProjectConfigBase(selection, projectName, relativePath, install) {
|
|
5883
6117
|
const stack = getAdjustedSelection(selection);
|
|
5884
6118
|
const graphStack = isGraphStackSelection(selection) ? selection : stack;
|
|
6119
|
+
const usesEffectBackend = stack.backend === "effect";
|
|
5885
6120
|
const frontend = [...toUniqueNonNoneArray(stack.webFrontend), ...toUniqueNonNoneArray(stack.nativeFrontend)];
|
|
5886
6121
|
const baseConfig = {
|
|
5887
6122
|
projectName,
|
|
@@ -5902,13 +6137,14 @@ function buildProjectConfigBase(selection, projectName, relativePath, install) {
|
|
|
5902
6137
|
payments: stack.payments,
|
|
5903
6138
|
email: stack.email,
|
|
5904
6139
|
fileUpload: stack.fileUpload,
|
|
5905
|
-
effect: stack.backendLibraries,
|
|
6140
|
+
effect: usesEffectBackend ? "effect-full" : stack.backendLibraries,
|
|
5906
6141
|
ai: stack.aiSdk,
|
|
5907
6142
|
stateManagement: stack.stateManagement,
|
|
5908
6143
|
forms: stack.forms,
|
|
5909
6144
|
testing: stack.testing,
|
|
5910
6145
|
git: stack.git === "true",
|
|
5911
6146
|
packageManager: stack.packageManager,
|
|
6147
|
+
workspaceShape: stack.workspaceShape,
|
|
5912
6148
|
versionChannel: stack.versionChannel,
|
|
5913
6149
|
install,
|
|
5914
6150
|
dbSetup: stack.dbSetup,
|
|
@@ -5925,7 +6161,7 @@ function buildProjectConfigBase(selection, projectName, relativePath, install) {
|
|
|
5925
6161
|
shadcnBaseColor: stack.shadcnBaseColor,
|
|
5926
6162
|
shadcnFont: stack.shadcnFont,
|
|
5927
6163
|
shadcnRadius: stack.shadcnRadius,
|
|
5928
|
-
validation: stack.validation,
|
|
6164
|
+
validation: usesEffectBackend ? "effect-schema" : stack.validation,
|
|
5929
6165
|
realtime: stack.realtime,
|
|
5930
6166
|
jobQueue: stack.jobQueue,
|
|
5931
6167
|
animation: stack.animation,
|
|
@@ -5987,6 +6223,7 @@ function buildProjectConfigBase(selection, projectName, relativePath, install) {
|
|
|
5987
6223
|
goCaching: stack.goCaching,
|
|
5988
6224
|
goConfig: stack.goConfig,
|
|
5989
6225
|
goObservability: stack.goObservability,
|
|
6226
|
+
javaLanguage: stack.javaLanguage,
|
|
5990
6227
|
javaWebFramework: stack.javaWebFramework,
|
|
5991
6228
|
javaBuildTool: stack.javaBuildTool,
|
|
5992
6229
|
javaOrm: stack.javaOrm,
|
|
@@ -6027,9 +6264,14 @@ function buildProjectConfigBase(selection, projectName, relativePath, install) {
|
|
|
6027
6264
|
if (!isGraphStackSelection(graphStack)) return baseConfig;
|
|
6028
6265
|
const stackParts = getGraphStackParts(graphStack);
|
|
6029
6266
|
const loweredGraphConfig = stackPartsToLegacyProjectConfigPartial(stackParts);
|
|
6267
|
+
const graphBackend = loweredGraphConfig.backend === "effect" || baseConfig.backend === "effect";
|
|
6030
6268
|
return {
|
|
6031
6269
|
...baseConfig,
|
|
6032
6270
|
...loweredGraphConfig,
|
|
6271
|
+
...graphBackend ? {
|
|
6272
|
+
effect: "effect-full",
|
|
6273
|
+
validation: "effect-schema"
|
|
6274
|
+
} : {},
|
|
6033
6275
|
projectName,
|
|
6034
6276
|
relativePath,
|
|
6035
6277
|
git: stack.git === "true",
|
|
@@ -6119,6 +6361,8 @@ function generateTypeScriptCommand(selection, projectName) {
|
|
|
6119
6361
|
const base = getBaseCommand(selection);
|
|
6120
6362
|
if (isCliDefaultStackSelection(selection, projectName)) return `${base} ${projectName} --yes`;
|
|
6121
6363
|
const cliBackend = mapBackendToCli(selection.backend);
|
|
6364
|
+
const effectSelection = selection.backend === "effect" ? "effect-full" : selection.backendLibraries;
|
|
6365
|
+
const validationSelection = selection.backend === "effect" ? "effect-schema" : selection.validation;
|
|
6122
6366
|
const flags = [
|
|
6123
6367
|
"--ecosystem typescript",
|
|
6124
6368
|
`--frontend ${[...selection.webFrontend, ...selection.nativeFrontend].filter((value, _, values) => value !== "none" || values.length === 1).join(" ") || "none"}`,
|
|
@@ -6153,16 +6397,17 @@ function generateTypeScriptCommand(selection, projectName) {
|
|
|
6153
6397
|
`--vector-db ${selection.vectorDb}`,
|
|
6154
6398
|
`--file-storage ${selection.fileStorage}`,
|
|
6155
6399
|
`--cms ${selection.cms}`,
|
|
6156
|
-
`--effect ${
|
|
6400
|
+
`--effect ${effectSelection}`,
|
|
6157
6401
|
`--ai ${selection.aiSdk}`,
|
|
6158
6402
|
`--state-management ${selection.stateManagement}`,
|
|
6159
6403
|
`--forms ${selection.forms}`,
|
|
6160
|
-
`--validation ${
|
|
6404
|
+
`--validation ${validationSelection}`,
|
|
6161
6405
|
`--testing ${selection.testing}`,
|
|
6162
6406
|
`--animation ${selection.animation}`,
|
|
6163
6407
|
`--database ${selection.database}`,
|
|
6164
6408
|
`--orm ${selection.orm}`,
|
|
6165
6409
|
`--db-setup ${selection.dbSetup}`,
|
|
6410
|
+
`--workspace-shape ${selection.workspaceShape}`,
|
|
6166
6411
|
`--package-manager ${selection.packageManager}`,
|
|
6167
6412
|
...selection.versionChannel !== "stable" ? [`--version-channel ${selection.versionChannel}`] : [],
|
|
6168
6413
|
selection.git === "false" ? "--no-git" : "--git",
|
|
@@ -6181,6 +6426,7 @@ function generateReactNativeCommand(selection, projectName) {
|
|
|
6181
6426
|
"--ecosystem react-native",
|
|
6182
6427
|
`--frontend ${selection.nativeFrontend.filter((value, _, values) => value !== "none" || values.length === 1).join(" ") || "native-bare"}`,
|
|
6183
6428
|
`--auth ${selection.auth}`,
|
|
6429
|
+
`--payments ${selection.payments}`,
|
|
6184
6430
|
`--mobile-navigation ${selection.mobileNavigation}`,
|
|
6185
6431
|
`--mobile-ui ${selection.mobileUI}`,
|
|
6186
6432
|
`--mobile-storage ${selection.mobileStorage}`,
|
|
@@ -6280,6 +6526,7 @@ function generateJavaCommand(selection, projectName) {
|
|
|
6280
6526
|
const flags = [
|
|
6281
6527
|
"--ecosystem java",
|
|
6282
6528
|
`--java-web-framework ${selection.javaWebFramework}`,
|
|
6529
|
+
...selection.javaLanguage === "kotlin" ? [`--java-language ${selection.javaLanguage}`] : [],
|
|
6283
6530
|
`--java-build-tool ${selection.javaBuildTool}`,
|
|
6284
6531
|
`--java-orm ${selection.javaOrm}`,
|
|
6285
6532
|
`--java-auth ${selection.javaAuth}`,
|
|
@@ -6359,5 +6606,5 @@ function generateStackSelectionCommand(selection) {
|
|
|
6359
6606
|
}
|
|
6360
6607
|
|
|
6361
6608
|
//#endregion
|
|
6362
|
-
export {
|
|
6363
|
-
//# sourceMappingURL=stack-translation-
|
|
6609
|
+
export { getCategoryCliValues as $, getCompatibleFormLibraries as A, stackQualifiesForSingleApp as B, allowedApisForFrontends as C, getApiFrontendCompatibilityIssue as D, getAIFrontendCompatibilityIssue as E, isOptionCompatible as F, ELIXIR_CATEGORY_ORDER as G, validateProjectName as H, isWebFrontend as I, OPTION_CATEGORY_METADATA as J, GO_CATEGORY_ORDER as K, requiresChatSdkVercelAI as L, getDisabledReason as M, hasWebStyling as N, getCompatibleAddons as O, isFrontendAllowedWithBackend as P, TYPESCRIPT_CATEGORY_ORDER as Q, requiresChatSdkVercelAIForSelection as R, usesVirtualNoneStackSelection as S, evaluateCompatibility as T, CATEGORY_ORDER as U, validateAddonCompatibility as V, DOTNET_CATEGORY_ORDER as W, REACT_NATIVE_CATEGORY_ORDER as X, PYTHON_CATEGORY_ORDER as Y, RUST_CATEGORY_ORDER as Z, parseStackSelectionFromSearch as _, STACK_SELECTION_URL_KEYS as a, normalizeOptionId as at, stackSelectionToCliComparableConfig as b, cloneDefaultStackSelection as c, getSupportedCapabilityOptions as ct, isArrayStackSelectionKey as d, getCategoryDisplayName as et, isCliDefaultStackSelection as f, normalizeStackSelectionValue as g, normalizeStackSelection as h, STACK_SELECTION_OPTION_CATEGORY_BY_KEY as i, isMultiSelectCategory as it, getCompatibleUILibraries as j, getCompatibleCSSFrameworks as k, createStackSelectionSearchParams as l, normalizeCapabilitySelection as lt, isStackSelectionDefault as m, NON_OPTION_STACK_SELECTION_KEYS as n, getCategoryOrderForEcosystem as nt, VIRTUAL_NONE_MULTI_SELECT_STACK_SELECTION_KEYS as o, getCapabilityDefinitions as ot, isGraphStackSelection as p, JAVA_CATEGORY_ORDER as q, STACK_SELECTION_KEYS as r, getOptionMetadata as rt, cliInputToProjectConfigPartial as s, getCapabilityDisabledReason as st, DEFAULT_STACK_SELECTION as t, getCategoryOptionIds as tt, generateStackSelectionCommand as u, parseStackSelectionFromUrlRecord as v, analyzeStackCompatibility as w, stackSelectionToProjectConfig as x, processCliArrayOption as y, splitFrontends as z };
|
|
6610
|
+
//# sourceMappingURL=stack-translation-BWOFnbOh.mjs.map
|