@better-fullstack/types 2.1.4 → 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.
Files changed (44) hide show
  1. package/dist/{defaults-azh56xa4.d.mts → defaults-CklPcgSP.d.mts} +2 -2
  2. package/dist/defaults-CklPcgSP.d.mts.map +1 -0
  3. package/dist/{defaults-u9UAambo.mjs → defaults-DNnZX9er.mjs} +2 -1
  4. package/dist/defaults-DNnZX9er.mjs.map +1 -0
  5. package/dist/defaults.d.mts +3 -3
  6. package/dist/defaults.mjs +1 -1
  7. package/dist/index.d.mts +180 -6
  8. package/dist/index.d.mts.map +1 -1
  9. package/dist/index.mjs +1560 -5
  10. package/dist/index.mjs.map +1 -1
  11. package/dist/json-schema.d.mts +604 -320
  12. package/dist/json-schema.d.mts.map +1 -1
  13. package/dist/json-schema.mjs +1 -1
  14. package/dist/{schemas-ZxRzd5TP.mjs → schemas-BXDvWDRp.mjs} +52 -10
  15. package/dist/schemas-BXDvWDRp.mjs.map +1 -0
  16. package/dist/{schemas-C3iF9TRm.d.mts → schemas-Dby5Bb6H.d.mts} +867 -593
  17. package/dist/schemas-Dby5Bb6H.d.mts.map +1 -0
  18. package/dist/schemas.d.mts +2 -2
  19. package/dist/schemas.mjs +2 -2
  20. package/dist/{stack-graph-BwtoYnJg.mjs → stack-graph-BAad0vv4.mjs} +48 -10
  21. package/dist/stack-graph-BAad0vv4.mjs.map +1 -0
  22. package/dist/{stack-graph-CiXONkqh.d.mts → stack-graph-DJy-Qxta.d.mts} +2 -2
  23. package/dist/stack-graph-DJy-Qxta.d.mts.map +1 -0
  24. package/dist/stack-graph.d.mts +3 -3
  25. package/dist/stack-graph.mjs +2 -2
  26. package/dist/{stack-translation-DNT-iMAE.mjs → stack-translation-BWOFnbOh.mjs} +280 -33
  27. package/dist/stack-translation-BWOFnbOh.mjs.map +1 -0
  28. package/dist/{stack-translation-BNwlAM1B.d.mts → stack-translation-C6Tubleh.d.mts} +19 -11
  29. package/dist/stack-translation-C6Tubleh.d.mts.map +1 -0
  30. package/dist/stack-translation.d.mts +4 -4
  31. package/dist/stack-translation.mjs +3 -3
  32. package/dist/{types-BG-DsHQ9.d.mts → types-B-Q8xLi7.d.mts} +5 -3
  33. package/dist/types-B-Q8xLi7.d.mts.map +1 -0
  34. package/dist/types.d.mts +3 -3
  35. package/package.json +1 -1
  36. package/dist/defaults-azh56xa4.d.mts.map +0 -1
  37. package/dist/defaults-u9UAambo.mjs.map +0 -1
  38. package/dist/schemas-C3iF9TRm.d.mts.map +0 -1
  39. package/dist/schemas-ZxRzd5TP.mjs.map +0 -1
  40. package/dist/stack-graph-BwtoYnJg.mjs.map +0 -1
  41. package/dist/stack-graph-CiXONkqh.d.mts.map +0 -1
  42. package/dist/stack-translation-BNwlAM1B.d.mts.map +0 -1
  43. package/dist/stack-translation-DNT-iMAE.mjs.map +0 -1
  44. package/dist/types-BG-DsHQ9.d.mts.map +0 -1
@@ -1,6 +1,6 @@
1
- import { $n as MOBILE_STORAGE_VALUES, $r as RUST_CLI_VALUES, Ai as SHADCN_BASE_VALUES, An as JAVA_AUTH_VALUES, B as DOTNET_OBSERVABILITY_VALUES, Cr as PYTHON_QUALITY_VALUES, Ct as ELIXIR_WEB_FRAMEWORK_VALUES, D as CMS_VALUES, Di as SEARCH_VALUES, Dr as PYTHON_VALIDATION_VALUES, En as I18N_VALUES, Er as PYTHON_TESTING_VALUES, F as DOTNET_API_VALUES, Fi as SHADCN_STYLE_VALUES, Fn as JAVA_TESTING_LIBRARIES_VALUES, G as DOTNET_WEB_FRAMEWORK_VALUES, H as DOTNET_REALTIME_VALUES, I as DOTNET_AUTH_VALUES, Ii as STATE_MANAGEMENT_VALUES, In as JAVA_WEB_FRAMEWORK_VALUES, Jr as REALTIME_VALUES, Jt as FILE_UPLOAD_VALUES, Kt as FEATURE_FLAGS_VALUES, L as DOTNET_CACHING_VALUES, Ln as JOB_QUEUE_VALUES, M as DATABASE_SETUP_VALUES, Mi as SHADCN_FONT_VALUES, Mn as JAVA_LIBRARIES_VALUES, N as DATABASE_VALUES, Ni as SHADCN_ICON_LIBRARY_VALUES, Nn as JAVA_LOGGING_VALUES, Oi as SERVER_DEPLOY_VALUES, Or as PYTHON_WEB_FRAMEWORK_VALUES, Pi as SHADCN_RADIUS_VALUES, Pn as JAVA_ORM_VALUES, Qi as TESTING_VALUES, Qn as MOBILE_PUSH_VALUES, Qr as RUST_CACHING_VALUES, R as DOTNET_DEPLOY_VALUES, Sr as PYTHON_ORM_VALUES, St as ELIXIR_VALIDATION_VALUES, Tr as PYTHON_TASK_QUEUE_VALUES, U as DOTNET_TESTING_VALUES, V as DOTNET_ORM_VALUES, W as DOTNET_VALIDATION_VALUES, Xn as MOBILE_NAVIGATION_VALUES, Xr as RUST_API_VALUES, Yn as MOBILE_DEEP_LINKING_VALUES, Yr as RUNTIME_VALUES, Yt as FORMS_VALUES, Zn as MOBILE_OTA_VALUES, Zr as RUST_AUTH_VALUES, _r as PYTHON_AUTH_VALUES, _t as ELIXIR_OBSERVABILITY_VALUES, a as ANALYTICS_VALUES, aa as VERSION_CHANNEL_VALUES, ai as RUST_OBSERVABILITY_VALUES, an as GO_CLI_VALUES, br as PYTHON_GRAPHQL_VALUES, bt as ELIXIR_REALTIME_VALUES, c as API_VALUES, ci as RUST_TEMPLATING_VALUES, cn as GO_MESSAGE_QUEUE_VALUES, ct as ELIXIR_API_VALUES, dn as GO_REALTIME_VALUES, dr as ORM_VALUES, dt as ELIXIR_DEPLOY_VALUES, ei as RUST_ERROR_HANDLING_VALUES, er as MOBILE_TESTING_VALUES, fn as GO_TESTING_VALUES, ft as ELIXIR_EMAIL_VALUES, gr as PYTHON_API_VALUES, gt as ELIXIR_LIBRARIES_VALUES, hr as PYTHON_AI_VALUES, ht as ELIXIR_JSON_VALUES, i as AI_VALUES, ia as VECTOR_DB_VALUES, ii as RUST_MESSAGE_QUEUE_VALUES, in as GO_CACHING_VALUES, ji as SHADCN_COLOR_THEME_VALUES, jn as JAVA_BUILD_TOOL_VALUES, k as CSS_FRAMEWORK_VALUES, ki as SHADCN_BASE_COLOR_VALUES, kn as JAVA_API_VALUES, l as ASTRO_INTEGRATION_VALUES, la as WEB_DEPLOY_VALUES, li as RUST_WEB_FRAMEWORK_VALUES, ln as GO_OBSERVABILITY_VALUES, lr as OBSERVABILITY_VALUES, lt as ELIXIR_AUTH_VALUES, mr as PAYMENTS_VALUES, mt as ELIXIR_JOBS_VALUES, na as UI_LIBRARY_VALUES, ni as RUST_LIBRARIES_VALUES, nn as GO_API_VALUES, o as ANIMATION_VALUES, oi as RUST_ORM_VALUES, on as GO_CONFIG_VALUES, pn as GO_WEB_FRAMEWORK_VALUES, pr as PACKAGE_MANAGER_VALUES, pt as ELIXIR_HTTP_VALUES, qn as LOGGING_VALUES, qr as RATE_LIMIT_VALUES, qt as FILE_STORAGE_VALUES, r as AI_DOCS_VALUES, ra as VALIDATION_VALUES, ri as RUST_LOGGING_VALUES, rn as GO_AUTH_VALUES, si as RUST_REALTIME_VALUES, sn as GO_LOGGING_VALUES, st as EFFECT_VALUES, ti as RUST_FRONTEND_VALUES, tr as MOBILE_UI_VALUES, u as AUTH_VALUES, un as GO_ORM_VALUES, ut as ELIXIR_CACHING_VALUES, vr as PYTHON_CACHING_VALUES, vt as ELIXIR_ORM_VALUES, w as CACHING_VALUES, wr as PYTHON_REALTIME_VALUES, wt as EMAIL_VALUES, xr as PYTHON_OBSERVABILITY_VALUES, xt as ELIXIR_TESTING_VALUES, yr as PYTHON_CLI_VALUES, yt as ELIXIR_QUALITY_VALUES, z as DOTNET_JOB_QUEUE_VALUES } from "./schemas-ZxRzd5TP.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-BwtoYnJg.mjs";
3
- import { t as createCliDefaultProjectConfigBase } from "./defaults-u9UAambo.mjs";
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 (Core)",
886
- "effect-full": "Effect Full"
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 (Core)",
1051
- "effect-full": "Effect Full"
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: { "spring-graphql": "Spring for GraphQL" },
1292
- javaLogging: { logback: "Logback" },
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
- if (!new Set([
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
- ]).has(category) && optionId !== "none" && optionId !== "false") return "React Native ecosystem only supports native mobile options";
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
- const graphDisabledReason = getGraphDisabledReason(currentStack, category, optionId);
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 ${selection.backendLibraries}`,
6400
+ `--effect ${effectSelection}`,
6157
6401
  `--ai ${selection.aiSdk}`,
6158
6402
  `--state-management ${selection.stateManagement}`,
6159
6403
  `--forms ${selection.forms}`,
6160
- `--validation ${selection.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 { getCategoryDisplayName as $, getCompatibleFormLibraries as A, validateAddonCompatibility as B, allowedApisForFrontends as C, getApiFrontendCompatibilityIssue as D, getAIFrontendCompatibilityIssue as E, isOptionCompatible as F, GO_CATEGORY_ORDER as G, CATEGORY_ORDER as H, isWebFrontend as I, PYTHON_CATEGORY_ORDER as J, JAVA_CATEGORY_ORDER as K, requiresChatSdkVercelAI as L, getDisabledReason as M, hasWebStyling as N, getCompatibleAddons as O, isFrontendAllowedWithBackend as P, getCategoryCliValues as Q, requiresChatSdkVercelAIForSelection as R, usesVirtualNoneStackSelection as S, evaluateCompatibility as T, DOTNET_CATEGORY_ORDER as U, validateProjectName as V, ELIXIR_CATEGORY_ORDER as W, RUST_CATEGORY_ORDER as X, REACT_NATIVE_CATEGORY_ORDER as Y, TYPESCRIPT_CATEGORY_ORDER as Z, parseStackSelectionFromSearch as _, STACK_SELECTION_URL_KEYS as a, getCapabilityDefinitions as at, stackSelectionToCliComparableConfig as b, cloneDefaultStackSelection as c, normalizeCapabilitySelection as ct, isArrayStackSelectionKey as d, getCategoryOptionIds as et, isCliDefaultStackSelection as f, normalizeStackSelectionValue as g, normalizeStackSelection as h, STACK_SELECTION_OPTION_CATEGORY_BY_KEY as i, normalizeOptionId as it, getCompatibleUILibraries as j, getCompatibleCSSFrameworks as k, createStackSelectionSearchParams as l, isStackSelectionDefault as m, NON_OPTION_STACK_SELECTION_KEYS as n, getOptionMetadata as nt, VIRTUAL_NONE_MULTI_SELECT_STACK_SELECTION_KEYS as o, getCapabilityDisabledReason as ot, isGraphStackSelection as p, OPTION_CATEGORY_METADATA as q, STACK_SELECTION_KEYS as r, isMultiSelectCategory as rt, cliInputToProjectConfigPartial as s, getSupportedCapabilityOptions as st, DEFAULT_STACK_SELECTION as t, getCategoryOrderForEcosystem as tt, generateStackSelectionCommand as u, parseStackSelectionFromUrlRecord as v, analyzeStackCompatibility as w, stackSelectionToProjectConfig as x, processCliArrayOption as y, splitFrontends as z };
6363
- //# sourceMappingURL=stack-translation-DNT-iMAE.mjs.map
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