@better-fullstack/types 2.5.0 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/{defaults-CbLlpynl.d.mts → defaults-7VECSARb.d.mts} +2 -2
  2. package/dist/defaults-7VECSARb.d.mts.map +1 -0
  3. package/dist/{defaults-BzWJP6p0.mjs → defaults-Bp46Ajyg.mjs} +2 -1
  4. package/dist/defaults-Bp46Ajyg.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 +52 -6
  8. package/dist/index.d.mts.map +1 -1
  9. package/dist/index.mjs +22 -20
  10. package/dist/index.mjs.map +1 -1
  11. package/dist/json-schema.d.mts +180 -0
  12. package/dist/json-schema.d.mts.map +1 -1
  13. package/dist/json-schema.mjs +1 -1
  14. package/dist/{schemas-CtieNRfz.mjs → schemas-CH1UszP5.mjs} +36 -9
  15. package/dist/schemas-CH1UszP5.mjs.map +1 -0
  16. package/dist/{schemas-BRAokgPa.d.mts → schemas-CY0MaZmU.d.mts} +191 -10
  17. package/dist/schemas-CY0MaZmU.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-CXTiPofQ.mjs → stack-graph-AWbdUrN3.mjs} +615 -131
  21. package/dist/stack-graph-AWbdUrN3.mjs.map +1 -0
  22. package/dist/{stack-graph-BPw9KsNm.d.mts → stack-graph-DkJ944IX.d.mts} +7 -3
  23. package/dist/stack-graph-DkJ944IX.d.mts.map +1 -0
  24. package/dist/stack-graph.d.mts +4 -4
  25. package/dist/stack-graph.mjs +3 -3
  26. package/dist/{stack-translation-D7KkQm8W.d.mts → stack-translation-C9yYLNwM.d.mts} +27 -7
  27. package/dist/stack-translation-C9yYLNwM.d.mts.map +1 -0
  28. package/dist/{stack-translation-B-zArJLM.mjs → stack-translation-Cn6zGJ5q.mjs} +253 -26
  29. package/dist/stack-translation-Cn6zGJ5q.mjs.map +1 -0
  30. package/dist/stack-translation.d.mts +5 -5
  31. package/dist/stack-translation.mjs +4 -4
  32. package/dist/{types-Br0NsnBr.d.mts → types-fGT5qf7O.d.mts} +5 -3
  33. package/dist/types-fGT5qf7O.d.mts.map +1 -0
  34. package/dist/types.d.mts +3 -3
  35. package/package.json +1 -1
  36. package/dist/defaults-BzWJP6p0.mjs.map +0 -1
  37. package/dist/defaults-CbLlpynl.d.mts.map +0 -1
  38. package/dist/schemas-BRAokgPa.d.mts.map +0 -1
  39. package/dist/schemas-CtieNRfz.mjs.map +0 -1
  40. package/dist/stack-graph-BPw9KsNm.d.mts.map +0 -1
  41. package/dist/stack-graph-CXTiPofQ.mjs.map +0 -1
  42. package/dist/stack-translation-B-zArJLM.mjs.map +0 -1
  43. package/dist/stack-translation-D7KkQm8W.d.mts.map +0 -1
  44. package/dist/types-Br0NsnBr.d.mts.map +0 -1
@@ -1,6 +1,6 @@
1
- import { $i as RUST_CACHING_VALUES, A as CSS_FRAMEWORK_VALUES, Aa as SHADCN_BASE_COLOR_VALUES, An as GO_OBSERVABILITY_VALUES, At as ELIXIR_OBSERVABILITY_VALUES, B as DOTNET_DEPLOY_VALUES, Br as MOBILE_TESTING_VALUES, Cn as GO_CACHING_VALUES, Ct as ELIXIR_EMAIL_VALUES, Dn as GO_LOGGING_VALUES, Dt as ELIXIR_JOBS_VALUES, En as GO_DI_VALUES, Et as ELIXIR_I18N_VALUES, F as DATABASE_VALUES, Fa as SHADCN_RADIUS_VALUES, Fn as GO_TEMPLATING_VALUES, Fr as MOBILE_LIBRARIES_VALUES, Ft as ELIXIR_VALIDATION_VALUES, G as DOTNET_ORM_VALUES, H as DOTNET_JOB_QUEUE_VALUES, Ia as SHADCN_STYLE_VALUES, In as GO_TESTING_VALUES, Ir as MOBILE_NAVIGATION_VALUES, It as ELIXIR_WEB_FRAMEWORK_VALUES, J as DOTNET_VALIDATION_VALUES, Ji as RATE_LIMIT_VALUES, K as DOTNET_REALTIME_VALUES, L as DOTNET_API_VALUES, La as STATE_MANAGEMENT_VALUES, Ln as GO_VALIDATION_VALUES, Lr as MOBILE_OTA_VALUES, Lt as EMAIL_VALUES, Ma as SHADCN_COLOR_THEME_VALUES, Mn as GO_PROTO_TOOLING_VALUES, Mr as LOGGING_VALUES, Mt as ELIXIR_QUALITY_VALUES, N as DART_MOBILE_VALUES, Na as SHADCN_FONT_VALUES, Nn as GO_QUALITY_VALUES, Nt as ELIXIR_REALTIME_VALUES, O as CMS_VALUES, Oa as SEARCH_VALUES, On as GO_MESSAGE_QUEUE_VALUES, Or as KOTLIN_MOBILE_LIBRARIES_VALUES, Ot as ELIXIR_JSON_VALUES, P as DATABASE_SETUP_VALUES, Pa as SHADCN_ICON_LIBRARY_VALUES, Pn as GO_REALTIME_VALUES, Pr as MOBILE_DEEP_LINKING_VALUES, Pt as ELIXIR_TESTING_VALUES, Qi as RUST_AUTH_VALUES, Qr as ORM_VALUES, R as DOTNET_AUTH_VALUES, Ra as SWIFT_MOBILE_VALUES, Rn as GO_WEB_FRAMEWORK_VALUES, Rr as MOBILE_PUSH_VALUES, Si as PYTHON_WEB_FRAMEWORK_VALUES, Sn as GO_AUTH_VALUES, St as ELIXIR_DOCUMENTATION_VALUES, T as CACHING_VALUES, Tn as GO_CONFIG_VALUES, Tt as ELIXIR_HTTP_VALUES, U as DOTNET_LIBRARIES_VALUES, V as DOTNET_FRONTEND_VALUES, Vr as MOBILE_UI_VALUES, W as DOTNET_OBSERVABILITY_VALUES, Xi as RUNTIME_VALUES, Xr as OBSERVABILITY_VALUES, Y as DOTNET_WEB_FRAMEWORK_VALUES, Yi as REALTIME_VALUES, Zi as RUST_API_VALUES, _i as PYTHON_REALTIME_VALUES, _r as JOB_QUEUE_VALUES, _t as ELIXIR_APPLICATION_FRAMEWORK_VALUES, a as ANALYTICS_VALUES, aa as RUST_MESSAGE_QUEUE_VALUES, ai as PYTHON_CACHING_VALUES, ao as UI_LIBRARY_VALUES, ar as INTEGRATIONS_VALUES, bi as PYTHON_TESTING_VALUES, bt as ELIXIR_CLUSTERING_VALUES, c as API_VALUES, ca as RUST_REALTIME_VALUES, ci as PYTHON_DATA_VALUES, co as VERSION_CHANNEL_VALUES, cr as JAVA_API_VALUES, d as AUTH_VALUES, di as PYTHON_MEDIA_VALUES, dn as FEATURE_FLAGS_VALUES, dr as JAVA_LANGUAGE_VALUES, ea as RUST_CLI_VALUES, ei as PACKAGE_MANAGER_VALUES, fi as PYTHON_MESSAGE_QUEUE_VALUES, fn as FILE_STORAGE_VALUES, fo as WEB_DEPLOY_VALUES, fr as JAVA_LIBRARIES_VALUES, gi as PYTHON_QUALITY_VALUES, gr as JAVA_WEB_FRAMEWORK_VALUES, gt as ELIXIR_API_VALUES, hi as PYTHON_PACKAGE_MANAGER_VALUES, hr as JAVA_TESTING_LIBRARIES_VALUES, ht as EFFECT_VALUES, i as AI_VALUES, ia as RUST_LOGGING_VALUES, ii as PYTHON_AUTH_VALUES, ja as SHADCN_BASE_VALUES, jn as GO_ORM_VALUES, jt as ELIXIR_ORM_VALUES, ka as SERVER_DEPLOY_VALUES, kn as GO_MIGRATIONS_VALUES, kr as KOTLIN_MOBILE_VALUES, kt as ELIXIR_LIBRARIES_VALUES, l as APP_PLATFORM_ADDON_VALUES, la as RUST_TEMPLATING_VALUES, li as PYTHON_GRAPHQL_VALUES, lr as JAVA_AUTH_VALUES, mi as PYTHON_ORM_VALUES, mn as FORMS_VALUES, mr as JAVA_ORM_VALUES, na as RUST_FRONTEND_VALUES, ni as PYTHON_AI_VALUES, o as ANIMATION_VALUES, oa as RUST_OBSERVABILITY_VALUES, oi as PYTHON_CLI_VALUES, oo as VALIDATION_VALUES, pi as PYTHON_OBSERVABILITY_VALUES, pn as FILE_UPLOAD_VALUES, po as WORKSPACE_SHAPE_VALUES, pr as JAVA_LOGGING_VALUES, pt as ECOMMERCE_VALUES, q as DOTNET_TESTING_VALUES, r as AI_DOCS_VALUES, ra as RUST_LIBRARIES_VALUES, ri as PYTHON_API_VALUES, rr as I18N_VALUES, sa as RUST_ORM_VALUES, si as PYTHON_CLOUD_SDK_VALUES, so as VECTOR_DB_VALUES, ta as RUST_ERROR_HANDLING_VALUES, ti as PAYMENTS_VALUES, to as TESTING_VALUES, u as ASTRO_INTEGRATION_VALUES, ua as RUST_WEB_FRAMEWORK_VALUES, ui as PYTHON_HTTP_CLIENT_VALUES, ur as JAVA_BUILD_TOOL_VALUES, vi as PYTHON_SERVER_VALUES, vt as ELIXIR_AUTH_VALUES, wn as GO_CLI_VALUES, wt as ELIXIR_HTTP_SERVER_VALUES, xi as PYTHON_VALIDATION_VALUES, xn as GO_API_VALUES, xt as ELIXIR_DEPLOY_VALUES, yi as PYTHON_TASK_QUEUE_VALUES, yt as ELIXIR_CACHING_VALUES, z as DOTNET_CACHING_VALUES, zr as MOBILE_STORAGE_VALUES } from "./schemas-CtieNRfz.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-CXTiPofQ.mjs";
3
- import { t as createCliDefaultProjectConfigBase } from "./defaults-BzWJP6p0.mjs";
1
+ import { $i as REALTIME_VALUES, A as CMS_VALUES, An as GO_MESSAGE_QUEUE_VALUES, Ar as KOTLIN_MOBILE_LIBRARIES_VALUES, At as ELIXIR_JSON_VALUES, B as DOTNET_AUTH_VALUES, Ba as SHADCN_STYLE_VALUES, Bn as GO_WEB_FRAMEWORK_VALUES, Br as MOBILE_PUSH_VALUES, Ci as PYTHON_TESTING_VALUES, Cn as GO_API_VALUES, Ct as ELIXIR_DEPLOY_VALUES, D as CACHING_VALUES, Dn as GO_CONFIG_VALUES, Dt as ELIXIR_HTTP_VALUES, En as GO_CLI_VALUES, Et as ELIXIR_HTTP_SERVER_VALUES, F as DART_MOBILE_VALUES, Fa as SHADCN_BASE_VALUES, Fn as GO_QUALITY_VALUES, Ft as ELIXIR_REALTIME_VALUES, G as DOTNET_LIBRARIES_VALUES, H as DOTNET_DEPLOY_VALUES, Ha as SWIFT_MOBILE_VALUES, Hr as MOBILE_TESTING_VALUES, I as DATABASE_SETUP_VALUES, Ia as SHADCN_COLOR_THEME_VALUES, In as GO_REALTIME_VALUES, Ir as MOBILE_DEEP_LINKING_VALUES, It as ELIXIR_TESTING_VALUES, J as DOTNET_REALTIME_VALUES, K as DOTNET_OBSERVABILITY_VALUES, L as DATABASE_VALUES, La as SHADCN_FONT_VALUES, Ln as GO_TEMPLATING_VALUES, Lr as MOBILE_LIBRARIES_VALUES, Lt as ELIXIR_VALIDATION_VALUES, M as CSS_FRAMEWORK_VALUES, Ma as SEARCH_VALUES, Mn as GO_OBSERVABILITY_VALUES, Mt as ELIXIR_OBSERVABILITY_VALUES, Na as SERVER_DEPLOY_VALUES, Nn as GO_ORM_VALUES, Nt as ELIXIR_ORM_VALUES, On as GO_DI_VALUES, Ot as ELIXIR_I18N_VALUES, Pa as SHADCN_BASE_COLOR_VALUES, Pn as GO_PROTO_TOOLING_VALUES, Pr as LOGGING_VALUES, Pt as ELIXIR_QUALITY_VALUES, Qi as RATE_LIMIT_VALUES, Qr as OBSERVABILITY_VALUES, Ra as SHADCN_ICON_LIBRARY_VALUES, Rn as GO_TESTING_VALUES, Rr as MOBILE_NAVIGATION_VALUES, Rt as ELIXIR_WEB_FRAMEWORK_VALUES, Si as PYTHON_TASK_QUEUE_VALUES, St as ELIXIR_CLUSTERING_VALUES, Ti as PYTHON_WEB_FRAMEWORK_VALUES, Tn as GO_CACHING_VALUES, Tt as ELIXIR_EMAIL_VALUES, U as DOTNET_FRONTEND_VALUES, Ur as MOBILE_UI_VALUES, V as DOTNET_CACHING_VALUES, Va as STATE_MANAGEMENT_VALUES, Vr as MOBILE_STORAGE_VALUES, W as DOTNET_JOB_QUEUE_VALUES, X as DOTNET_VALIDATION_VALUES, Y as DOTNET_TESTING_VALUES, Z as DOTNET_WEB_FRAMEWORK_VALUES, _i as PYTHON_ORM_VALUES, _o as WORKSPACE_SHAPE_VALUES, _r as JAVA_TESTING_LIBRARIES_VALUES, _t as EFFECT_VALUES, a as ANALYTICS_VALUES, aa as RUST_ERROR_HANDLING_VALUES, ai as PYTHON_AI_VALUES, ao as TESTING_VALUES, ar as I18N_VALUES, b as BOT_PROTECTION_VALUES, bi as PYTHON_REALTIME_VALUES, bt as ELIXIR_AUTH_VALUES, c as API_VALUES, ca as RUST_LOGGING_VALUES, ci as PYTHON_CACHING_VALUES, d as AUTH_VALUES, da as RUST_ORM_VALUES, di as PYTHON_DATA_VALUES, do as VECTOR_DB_VALUES, dr as JAVA_AUTH_VALUES, ea as RUNTIME_VALUES, ei as ORM_VALUES, fa as RUST_REALTIME_VALUES, fi as PYTHON_GRAPHQL_VALUES, fo as VERSION_CHANNEL_VALUES, fr as JAVA_BUILD_TOOL_VALUES, gi as PYTHON_OBSERVABILITY_VALUES, gn as FORMS_VALUES, go as WEB_DEPLOY_VALUES, gr as JAVA_ORM_VALUES, hi as PYTHON_MESSAGE_QUEUE_VALUES, hn as FILE_UPLOAD_VALUES, hr as JAVA_LOGGING_VALUES, ht as ECOMMERCE_VALUES, i as AI_VALUES, ia as RUST_CLI_VALUES, jn as GO_MIGRATIONS_VALUES, jr as KOTLIN_MOBILE_VALUES, jt as ELIXIR_LIBRARIES_VALUES, kn as GO_LOGGING_VALUES, kt as ELIXIR_JOBS_VALUES, l as APP_PLATFORM_ADDON_VALUES, la as RUST_MESSAGE_QUEUE_VALUES, li as PYTHON_CLI_VALUES, lo as UI_LIBRARY_VALUES, ma as RUST_WEB_FRAMEWORK_VALUES, mi as PYTHON_MEDIA_VALUES, mn as FILE_STORAGE_VALUES, mr as JAVA_LIBRARIES_VALUES, na as RUST_AUTH_VALUES, ni as PACKAGE_MANAGER_VALUES, o as ANIMATION_VALUES, oa as RUST_FRONTEND_VALUES, oi as PYTHON_API_VALUES, pa as RUST_TEMPLATING_VALUES, pi as PYTHON_HTTP_CLIENT_VALUES, pn as FEATURE_FLAGS_VALUES, pr as JAVA_LANGUAGE_VALUES, q as DOTNET_ORM_VALUES, r as AI_DOCS_VALUES, ra as RUST_CACHING_VALUES, ri as PAYMENTS_VALUES, sa as RUST_LIBRARIES_VALUES, si as PYTHON_AUTH_VALUES, sr as INTEGRATIONS_VALUES, ta as RUST_API_VALUES, u as ASTRO_INTEGRATION_VALUES, ua as RUST_OBSERVABILITY_VALUES, ui as PYTHON_CLOUD_SDK_VALUES, uo as VALIDATION_VALUES, ur as JAVA_API_VALUES, vi as PYTHON_PACKAGE_MANAGER_VALUES, vr as JAVA_WEB_FRAMEWORK_VALUES, vt as ELIXIR_API_VALUES, wi as PYTHON_VALIDATION_VALUES, wn as GO_AUTH_VALUES, wt as ELIXIR_DOCUMENTATION_VALUES, xi as PYTHON_SERVER_VALUES, xt as ELIXIR_CACHING_VALUES, yi as PYTHON_QUALITY_VALUES, yr as JOB_QUEUE_VALUES, yt as ELIXIR_APPLICATION_FRAMEWORK_VALUES, z as DOTNET_API_VALUES, za as SHADCN_RADIUS_VALUES, zn as GO_VALIDATION_VALUES, zr as MOBILE_OTA_VALUES, zt as EMAIL_VALUES } from "./schemas-CH1UszP5.mjs";
2
+ import { B as isToolingOverlayOnly, C as hasPWACompatibleFrontend, L as getToolingCapability, T as hasTauriCompatibleFrontend, a as getAddonStackPartBinding, b as UI_LIBRARY_COMPATIBILITY, f as legacyProjectConfigToStackParts, g as stackPartsToLegacyProjectConfigPartial, i as formatStackPartSpec, k as requiresChatSdkVercelAIForExamples, m as parseStackPartSpecs, s as getStackPartCompatibilityIssueForPart, v as validateStackParts, w as hasTanStackAICompatibleFrontend, x as getUnsupportedWebDeployFrontend, z as getToolingSelectionOptions } from "./stack-graph-AWbdUrN3.mjs";
3
+ import { t as createCliDefaultProjectConfigBase } from "./defaults-Bp46Ajyg.mjs";
4
4
 
5
5
  //#region src/capabilities.ts
6
6
  const CAPABILITY_DEFINITIONS = { auth: [
@@ -287,15 +287,30 @@ const TYPESCRIPT_CATEGORY_ORDER = [
287
287
  "jobQueue",
288
288
  "caching",
289
289
  "rateLimit",
290
+ "botProtection",
290
291
  "i18n",
291
292
  "search",
292
293
  "vectorDb",
293
294
  "fileStorage",
294
295
  "animation",
295
296
  "cms",
296
- "codeQuality",
297
+ "toolchainProfile",
298
+ "workspaceRunner",
299
+ "codeQualityProfile",
300
+ "gitHooks",
301
+ "staticAnalysis",
302
+ "aiTooling",
297
303
  "documentation",
298
- "appPlatforms",
304
+ "testingTools",
305
+ "dataClient",
306
+ "frontendUtilities",
307
+ "httpClientTool",
308
+ "codeGeneration",
309
+ "developerEnvironment",
310
+ "containerOrchestration",
311
+ "apiGateway",
312
+ "continuousIntegration",
313
+ "backendUtilitiesTool",
299
314
  "workspaceShape",
300
315
  "packageManager",
301
316
  "examples",
@@ -494,7 +509,23 @@ function getCategoryDisplayName(categoryKey) {
494
509
  const customName = {
495
510
  i18n: "Internationalization (i18n)",
496
511
  appShells: "App Platforms",
497
- appPlatforms: "Addons",
512
+ appPlatforms: "Legacy Capabilities",
513
+ toolchainProfile: "JavaScript Toolchain",
514
+ workspaceRunner: "Workspace Runner",
515
+ codeQualityProfile: "Code Quality",
516
+ gitHooks: "Git Hooks",
517
+ staticAnalysis: "Static Analysis",
518
+ aiTooling: "AI Tooling",
519
+ testingTools: "Testing Support",
520
+ dataClient: "Data Client",
521
+ frontendUtilities: "Frontend Utilities",
522
+ httpClientTool: "HTTP Client",
523
+ codeGeneration: "API Code Generation",
524
+ developerEnvironment: "Developer Environment",
525
+ containerOrchestration: "Local Containers",
526
+ apiGateway: "API Gateway",
527
+ continuousIntegration: "Continuous Integration",
528
+ backendUtilitiesTool: "Backend Utilities",
498
529
  mobileNavigation: "Mobile Navigation",
499
530
  mobileUI: "Mobile UI",
500
531
  mobileStorage: "Mobile Storage",
@@ -673,6 +704,7 @@ const APP_SHELL_VALUES = APP_PLATFORM_ADDON_VALUES;
673
704
  const APP_PLATFORM_VALUES = [
674
705
  "turborepo",
675
706
  "nx",
707
+ "vite-plus",
676
708
  "mcp",
677
709
  "skills",
678
710
  "msw",
@@ -694,15 +726,22 @@ const APP_PLATFORM_VALUES = [
694
726
  "openapi-typescript",
695
727
  "apollo-client"
696
728
  ];
729
+ const toolingSelectionIds = (category) => getToolingSelectionOptions(category).map((selection) => selection.id);
697
730
  const EXAMPLE_VALUES = ["ai", "chat-sdk"];
698
731
  const BOOLEAN_OPTION_VALUES = ["true", "false"];
699
732
  const MULTI_SELECT_CATEGORIES = new Set([
700
733
  "webFrontend",
701
734
  "nativeFrontend",
702
735
  "codeQuality",
703
- "documentation",
704
736
  "appShells",
705
737
  "appPlatforms",
738
+ "staticAnalysis",
739
+ "aiTooling",
740
+ "testingTools",
741
+ "frontendUtilities",
742
+ "codeGeneration",
743
+ "developerEnvironment",
744
+ "backendUtilitiesTool",
706
745
  "examples",
707
746
  "aiDocs",
708
747
  "rustLibraries",
@@ -747,6 +786,7 @@ const CATEGORY_VALUE_IDS = {
747
786
  jobQueue: JOB_QUEUE_VALUES,
748
787
  caching: CACHING_VALUES,
749
788
  rateLimit: RATE_LIMIT_VALUES,
789
+ botProtection: BOT_PROTECTION_VALUES,
750
790
  i18n: I18N_VALUES,
751
791
  search: SEARCH_VALUES,
752
792
  vectorDb: VECTOR_DB_VALUES,
@@ -771,6 +811,22 @@ const CATEGORY_VALUE_IDS = {
771
811
  documentation: DOCUMENTATION_VALUES,
772
812
  appShells: APP_SHELL_VALUES,
773
813
  appPlatforms: APP_PLATFORM_VALUES,
814
+ toolchainProfile: toolingSelectionIds("toolchain"),
815
+ workspaceRunner: toolingSelectionIds("workspaceRunner"),
816
+ codeQualityProfile: toolingSelectionIds("codeQuality"),
817
+ gitHooks: toolingSelectionIds("gitHooks"),
818
+ staticAnalysis: toolingSelectionIds("staticAnalysis"),
819
+ aiTooling: toolingSelectionIds("aiTooling"),
820
+ testingTools: toolingSelectionIds("testingTools"),
821
+ dataClient: toolingSelectionIds("dataClient"),
822
+ frontendUtilities: toolingSelectionIds("frontendUtilities"),
823
+ httpClientTool: toolingSelectionIds("httpClient"),
824
+ codeGeneration: toolingSelectionIds("codeGeneration"),
825
+ developerEnvironment: toolingSelectionIds("developerEnvironment"),
826
+ containerOrchestration: toolingSelectionIds("containerOrchestration"),
827
+ apiGateway: toolingSelectionIds("apiGateway"),
828
+ continuousIntegration: toolingSelectionIds("continuousIntegration"),
829
+ backendUtilitiesTool: toolingSelectionIds("backendUtilities"),
774
830
  packageManager: PACKAGE_MANAGER_VALUES,
775
831
  workspaceShape: WORKSPACE_SHAPE_VALUES,
776
832
  versionChannel: VERSION_CHANNEL_VALUES,
@@ -1004,6 +1060,10 @@ const EXACT_LABEL_OVERRIDES = {
1004
1060
  arcjet: "Arcjet",
1005
1061
  "upstash-ratelimit": "Upstash Ratelimit"
1006
1062
  },
1063
+ botProtection: {
1064
+ botid: "Vercel BotID",
1065
+ turnstile: "Cloudflare Turnstile"
1066
+ },
1007
1067
  backendLibraries: {
1008
1068
  effect: "Effect Core",
1009
1069
  "effect-full": "Effect Platform + SQL"
@@ -1095,7 +1155,8 @@ const EXACT_LABEL_OVERRIDES = {
1095
1155
  analytics: {
1096
1156
  plausible: "Plausible",
1097
1157
  umami: "Umami",
1098
- ga4: "Google Analytics 4"
1158
+ ga4: "Google Analytics 4",
1159
+ "vercel-analytics": "Vercel Analytics"
1099
1160
  },
1100
1161
  mobileNavigation: {
1101
1162
  "expo-router": "Expo Router",
@@ -1163,6 +1224,9 @@ const EXACT_LABEL_OVERRIDES = {
1163
1224
  opentui: "OpenTUI"
1164
1225
  },
1165
1226
  appPlatforms: {
1227
+ turborepo: "Turborepo",
1228
+ nx: "Nx",
1229
+ "vite-plus": "Vite+",
1166
1230
  mcp: "MCP",
1167
1231
  msw: "MSW",
1168
1232
  swr: "SWR",
@@ -1878,6 +1942,7 @@ const OPTION_CATEGORY_METADATA = {
1878
1942
  jobQueue: buildCategoryMetadata("jobQueue"),
1879
1943
  caching: buildCategoryMetadata("caching"),
1880
1944
  rateLimit: buildCategoryMetadata("rateLimit"),
1945
+ botProtection: buildCategoryMetadata("botProtection"),
1881
1946
  i18n: buildCategoryMetadata("i18n"),
1882
1947
  search: buildCategoryMetadata("search"),
1883
1948
  vectorDb: buildCategoryMetadata("vectorDb"),
@@ -1902,6 +1967,22 @@ const OPTION_CATEGORY_METADATA = {
1902
1967
  documentation: buildCategoryMetadata("documentation"),
1903
1968
  appShells: buildCategoryMetadata("appShells"),
1904
1969
  appPlatforms: buildCategoryMetadata("appPlatforms"),
1970
+ toolchainProfile: buildCategoryMetadata("toolchainProfile"),
1971
+ workspaceRunner: buildCategoryMetadata("workspaceRunner"),
1972
+ codeQualityProfile: buildCategoryMetadata("codeQualityProfile"),
1973
+ gitHooks: buildCategoryMetadata("gitHooks"),
1974
+ staticAnalysis: buildCategoryMetadata("staticAnalysis"),
1975
+ aiTooling: buildCategoryMetadata("aiTooling"),
1976
+ testingTools: buildCategoryMetadata("testingTools"),
1977
+ dataClient: buildCategoryMetadata("dataClient"),
1978
+ frontendUtilities: buildCategoryMetadata("frontendUtilities"),
1979
+ httpClientTool: buildCategoryMetadata("httpClientTool"),
1980
+ codeGeneration: buildCategoryMetadata("codeGeneration"),
1981
+ developerEnvironment: buildCategoryMetadata("developerEnvironment"),
1982
+ containerOrchestration: buildCategoryMetadata("containerOrchestration"),
1983
+ apiGateway: buildCategoryMetadata("apiGateway"),
1984
+ continuousIntegration: buildCategoryMetadata("continuousIntegration"),
1985
+ backendUtilitiesTool: buildCategoryMetadata("backendUtilitiesTool"),
1905
1986
  packageManager: buildCategoryMetadata("packageManager"),
1906
1987
  workspaceShape: buildCategoryMetadata("workspaceShape"),
1907
1988
  versionChannel: buildCategoryMetadata("versionChannel"),
@@ -2046,6 +2127,61 @@ const SIGNOZ_SUPPORTED_GO_WEB_FRAMEWORKS = new Set([
2046
2127
  "stdlib"
2047
2128
  ]);
2048
2129
  const SIGNOZ_SUPPORTED_PYTHON_WEB_FRAMEWORKS = new Set(["fastapi"]);
2130
+ const VERCEL_ANALYTICS_FRONTENDS = new Set([
2131
+ "next",
2132
+ "vinext",
2133
+ "tanstack-router",
2134
+ "tanstack-start",
2135
+ "react-router",
2136
+ "react-vite",
2137
+ "svelte",
2138
+ "nuxt",
2139
+ "vue",
2140
+ "solid",
2141
+ "solid-start",
2142
+ "astro"
2143
+ ]);
2144
+ const REACT_ANALYTICS_FRONTENDS = new Set([
2145
+ "tanstack-router",
2146
+ "react-router",
2147
+ "react-vite",
2148
+ "tanstack-start",
2149
+ "next",
2150
+ "vinext"
2151
+ ]);
2152
+ const GA4_FRONTENDS = new Set([
2153
+ ...VERCEL_ANALYTICS_FRONTENDS,
2154
+ "vanilla-vite",
2155
+ "qwik",
2156
+ "angular",
2157
+ "redwood",
2158
+ "fresh"
2159
+ ]);
2160
+ const STANDARD_ANALYTICS_FRONTENDS = new Set([
2161
+ ...REACT_ANALYTICS_FRONTENDS,
2162
+ "svelte",
2163
+ "nuxt",
2164
+ "vue",
2165
+ "solid",
2166
+ "solid-start"
2167
+ ]);
2168
+ const ANALYTICS_FRONTEND_SUPPORT = {
2169
+ ga4: GA4_FRONTENDS,
2170
+ plausible: REACT_ANALYTICS_FRONTENDS,
2171
+ posthog: STANDARD_ANALYTICS_FRONTENDS,
2172
+ umami: STANDARD_ANALYTICS_FRONTENDS,
2173
+ "vercel-analytics": VERCEL_ANALYTICS_FRONTENDS
2174
+ };
2175
+ function isAnalyticsFrontendSupported(analytics, frontend) {
2176
+ return analytics !== "none" && ANALYTICS_FRONTEND_SUPPORT[analytics].has(frontend);
2177
+ }
2178
+ function supportsAnalyticsFrontends(analytics, frontends) {
2179
+ const webFrontends = frontends.filter((frontend) => frontend !== "none" && !frontend.startsWith("native-"));
2180
+ return webFrontends.length > 0 && webFrontends.every((frontend) => isAnalyticsFrontendSupported(analytics, frontend));
2181
+ }
2182
+ function isVercelAnalyticsFrontend(frontend) {
2183
+ return isAnalyticsFrontendSupported("vercel-analytics", frontend);
2184
+ }
2049
2185
  function isSignozSupportedGoWebFramework(framework) {
2050
2186
  return SIGNOZ_SUPPORTED_GO_WEB_FRAMEWORKS.has(framework);
2051
2187
  }
@@ -2077,6 +2213,19 @@ function getKotlinJavaIncompatibilityReason(stack) {
2077
2213
  if (unsupportedTestingLibrary) return `The '${unsupportedTestingLibrary}' testing library is not wired for the Kotlin scaffold`;
2078
2214
  return null;
2079
2215
  }
2216
+ const TURNSTILE_WEB_FRONTENDS = new Set([
2217
+ "next",
2218
+ "react-router",
2219
+ "react-vite",
2220
+ "tanstack-router",
2221
+ "tanstack-start"
2222
+ ]);
2223
+ function isTurnstileWebFrontend(frontend) {
2224
+ return TURNSTILE_WEB_FRONTENDS.has(frontend);
2225
+ }
2226
+ function isBotIdWebFrontend(frontend) {
2227
+ return frontend === "next";
2228
+ }
2080
2229
  const DEFAULT_RUNTIME = "bun";
2081
2230
  const REVENUECAT_NATIVE_FRONTENDS = new Set([
2082
2231
  "native-bare",
@@ -2183,6 +2332,7 @@ function stackQualifiesForSingleApp(stack) {
2183
2332
  const webFrontends = (stack.webFrontend ?? []).filter((f) => f && f !== "none");
2184
2333
  if (webFrontends.length !== 1) return false;
2185
2334
  if (webFrontends[0] !== SINGLE_APP_WEB_FRONTEND_BY_BACKEND[stack.backend]) return false;
2335
+ if (stack.analytics !== "none" && stack.analytics !== "vercel-analytics") return false;
2186
2336
  if ([
2187
2337
  stack.api,
2188
2338
  stack.database,
@@ -2201,7 +2351,6 @@ function stackQualifiesForSingleApp(stack) {
2201
2351
  stack.fileStorage,
2202
2352
  stack.cms,
2203
2353
  stack.aiSdk,
2204
- stack.analytics,
2205
2354
  stack.featureFlags,
2206
2355
  stack.integrations,
2207
2356
  stack.ecommerce,
@@ -3329,14 +3478,15 @@ const analyzeStackCompatibility = (stack) => {
3329
3478
  for (const platform of [
3330
3479
  "docker-compose",
3331
3480
  "devcontainer",
3332
- "kong"
3481
+ "kong",
3482
+ "vite-plus"
3333
3483
  ]) {
3334
3484
  if (!nextStack.appPlatforms.includes(platform)) continue;
3335
3485
  const reason = getDisabledReason(nextStack, "appPlatforms", platform);
3336
3486
  if (!reason) continue;
3337
3487
  nextStack.appPlatforms = nextStack.appPlatforms.filter((addon) => addon !== platform);
3338
3488
  changed = true;
3339
- const label = platform === "docker-compose" ? "Docker Compose" : platform === "devcontainer" ? "DevContainer" : "Kong Gateway";
3489
+ const label = platform === "docker-compose" ? "Docker Compose" : platform === "devcontainer" ? "DevContainer" : platform === "kong" ? "Kong Gateway" : "Vite+";
3340
3490
  changes.push({
3341
3491
  category: "appPlatforms",
3342
3492
  message: `${label} removed (${reason})`
@@ -3750,6 +3900,22 @@ const analyzeStackCompatibility = (stack) => {
3750
3900
  message: `Web deploy set to 'None' ('${webDeploy}' is not wired for the '${unsupportedWebDeployFrontend}' frontend)`
3751
3901
  });
3752
3902
  }
3903
+ if (nextStack.botProtection && nextStack.botProtection !== "none") {
3904
+ const webFrontends = nextStack.webFrontend.filter((frontend) => frontend !== "none");
3905
+ const hasNativeFrontend$1 = nextStack.nativeFrontend.some((frontend) => frontend !== "none");
3906
+ const hasBetterAuth = nextStack.auth === "better-auth" || nextStack.auth === "better-auth-organizations";
3907
+ const invalidBotId = nextStack.botProtection === "botid" && (hasNativeFrontend$1 || webFrontends.length === 0 || webFrontends.some((frontend) => !isBotIdWebFrontend(frontend)) || nextStack.backend !== "self-next" || nextStack.webDeploy !== "none" && nextStack.webDeploy !== "vercel");
3908
+ const invalidTurnstile = nextStack.botProtection === "turnstile" && (hasNativeFrontend$1 || webFrontends.length === 0 || webFrontends.some((frontend) => !isTurnstileWebFrontend(frontend)) || nextStack.backend === "none" || nextStack.backend === "convex");
3909
+ if (!hasBetterAuth || invalidBotId || invalidTurnstile) {
3910
+ const provider = nextStack.botProtection;
3911
+ nextStack.botProtection = "none";
3912
+ changed = true;
3913
+ changes.push({
3914
+ category: "botProtection",
3915
+ message: `Bot protection set to 'None' ('${provider}' is not wired for the selected frontend, auth, backend, or deployment)`
3916
+ });
3917
+ }
3918
+ }
3753
3919
  if (nextStack.serverDeploy === "cloudflare") {
3754
3920
  if (nextStack.runtime !== "workers" || nextStack.backend !== "hono") {
3755
3921
  nextStack.serverDeploy = "none";
@@ -3778,6 +3944,16 @@ const analyzeStackCompatibility = (stack) => {
3778
3944
  message: "Server deploy set to 'None' (not needed for this backend)"
3779
3945
  });
3780
3946
  }
3947
+ const selectedAnalytics = ANALYTICS_VALUES.find((value) => value === nextStack.analytics);
3948
+ if (selectedAnalytics && selectedAnalytics !== "none" && !supportsAnalyticsFrontends(selectedAnalytics, nextStack.webFrontend)) {
3949
+ const wasVercel = selectedAnalytics === "vercel-analytics";
3950
+ nextStack.analytics = "none";
3951
+ changed = true;
3952
+ changes.push({
3953
+ category: "analytics",
3954
+ message: wasVercel ? "Analytics set to 'None' (Vercel Analytics is not mounted for this frontend)" : "Analytics set to 'None' (no analytics template for this frontend)"
3955
+ });
3956
+ }
3781
3957
  if (nextStack.workspaceShape === "single-app" && !stackQualifiesForSingleApp(nextStack)) {
3782
3958
  nextStack.workspaceShape = "monorepo";
3783
3959
  changed = true;
@@ -3803,6 +3979,7 @@ const analyzeStackCompatibility = (stack) => {
3803
3979
  const getDisabledReason = (currentStack, category, optionId) => {
3804
3980
  if (currentStack.ecosystem === "react-native" && category === "codeQuality" && optionId !== "knip" && optionId !== "gitleaks") return "React Native code quality currently supports Knip and Gitleaks only";
3805
3981
  if (category === "codeQuality" && optionId === "knip" && currentStack.ecosystem !== "typescript" && currentStack.ecosystem !== "react-native") return "Knip requires a TypeScript or React Native workspace";
3982
+ if (category === "appPlatforms" && optionId === "vite-plus" && (currentStack.ecosystem !== "typescript" || !currentStack.webFrontend.some((frontend) => frontend !== "none"))) return "Vite+ requires a generated TypeScript web frontend";
3806
3983
  if ((category === "observability" && optionId === "signoz" || category === "backend" && currentStack.observability === "signoz") && (category === "backend" ? optionId === "none" || optionId === "convex" : currentStack.backend === "none" || currentStack.backend === "convex")) return "SigNoz tracing requires a generated server target";
3807
3984
  if ((category === "observability" && optionId === "signoz" || category === "backend" && currentStack.observability === "signoz") && (category === "backend" ? optionId === "self-tanstack-start" || optionId === "self-astro" : currentStack.backend === "self-tanstack-start" || currentStack.backend === "self-astro")) return "SigNoz tracing is not yet bootstrapped for TanStack Start or Astro fullstack apps";
3808
3985
  const signozBackend = category === "backend" ? optionId : currentStack.backend;
@@ -3927,6 +4104,13 @@ const getDisabledReason = (currentStack, category, optionId) => {
3927
4104
  if ((category === "pythonObservability" && optionId === "signoz" || category === "pythonWebFramework" && currentStack.pythonObservability === "signoz") && !isSignozSupportedPythonWebFramework(category === "pythonWebFramework" ? optionId : currentStack.pythonWebFramework)) return "SigNoz request tracing is currently wired for FastAPI";
3928
4105
  if (category === "integrations" && optionId === "nango" && usesCloudflareFullstackRuntime(currentStack)) return "Nango's Node SDK is not available on Cloudflare Workers";
3929
4106
  if (category === "webDeploy" && optionId === "cloudflare" && currentStack.integrations === "nango" && FULLSTACK_SELF_BACKENDS.has(currentStack.backend)) return "Nango's Node SDK is not available on Cloudflare Workers";
4107
+ if (category === "webFrontend" && currentStack.botProtection === "botid" && optionId !== "none" && !isBotIdWebFrontend(optionId)) return "Vercel BotID is only available for Next.js frontends";
4108
+ if (category === "webDeploy" && currentStack.botProtection === "botid" && optionId !== "none" && optionId !== "vercel") return "Vercel BotID requires Vercel deployment";
4109
+ if (category === "analytics" && optionId === "vercel-analytics") {
4110
+ if (!currentStack.webFrontend.some((frontend) => frontend !== "none")) return "Vercel Analytics requires a web frontend";
4111
+ if (!supportsAnalyticsFrontends("vercel-analytics", currentStack.webFrontend)) return "Vercel Analytics is not yet mounted for the selected frontend";
4112
+ }
4113
+ if (category === "webFrontend" && currentStack.analytics === "vercel-analytics" && optionId !== "none" && !isVercelAnalyticsFrontend(optionId)) return "The selected frontend does not yet mount Vercel Analytics";
3930
4114
  const graphDisabledReason = category === "payments" && optionId === "revenuecat" || category === "i18n" && optionId === "intlayer" ? {
3931
4115
  handled: false,
3932
4116
  authoritative: false,
@@ -4077,8 +4261,17 @@ const getDisabledReason = (currentStack, category, optionId) => {
4077
4261
  "elysia"
4078
4262
  ].includes(currentStack.backend)) return "Apollo Server currently supports Hono, Effect, Express, Fastify, and Elysia backends";
4079
4263
  }
4080
- if (category === "appPlatforms" && optionId === "nx" && currentStack.appPlatforms.includes("turborepo")) return "Choose either Nx or Turborepo, not both";
4081
- if (category === "appPlatforms" && optionId === "turborepo" && currentStack.appPlatforms.includes("nx")) return "Choose either Turborepo or Nx, not both";
4264
+ if (category === "appPlatforms" && [
4265
+ "turborepo",
4266
+ "nx",
4267
+ "vite-plus"
4268
+ ].includes(optionId)) {
4269
+ if (currentStack.appPlatforms.find((selected) => selected !== optionId && [
4270
+ "turborepo",
4271
+ "nx",
4272
+ "vite-plus"
4273
+ ].includes(selected))) return "Choose one workspace runner: Turborepo, Nx, or Vite+";
4274
+ }
4082
4275
  if (category === "astroIntegration") {
4083
4276
  if (!currentStack.webFrontend.includes("astro") && optionId !== "none") return "Astro integration requires Astro frontend";
4084
4277
  if (currentStack.webFrontend.includes("astro") && currentStack.api === "apollo-server" && optionId !== "react") return "Apollo Server requires React integration with Astro";
@@ -4147,6 +4340,19 @@ const getDisabledReason = (currentStack, category, optionId) => {
4147
4340
  if (currentStack.backend === "convex") return "Rate limiting helpers are not generated with Convex backend";
4148
4341
  if (currentStack.backend === "none") return "Rate limiting requires a backend";
4149
4342
  }
4343
+ if (category === "botProtection" && optionId !== "none") {
4344
+ if (currentStack.ecosystem !== "typescript") return "Bot protection is currently available for TypeScript web applications";
4345
+ const webFrontends = currentStack.webFrontend.filter((frontend) => frontend !== "none");
4346
+ if (webFrontends.length === 0) return "Bot protection requires a web frontend";
4347
+ if (currentStack.nativeFrontend.some((frontend) => frontend !== "none")) return "Bot protection is not supported when a native frontend is selected";
4348
+ if (currentStack.auth !== "better-auth" && currentStack.auth !== "better-auth-organizations") return "Bot protection requires Better Auth";
4349
+ if (optionId === "botid" && webFrontends.some((frontend) => !isBotIdWebFrontend(frontend))) return "Vercel BotID is only available for Next.js frontends";
4350
+ if (optionId === "botid" && currentStack.backend !== "self-next") return "Vercel BotID requires the self-hosted Next.js backend";
4351
+ if (optionId === "botid" && currentStack.webDeploy !== "none" && currentStack.webDeploy !== "vercel") return "Vercel BotID requires Vercel deployment when a web deployment is selected";
4352
+ if (optionId === "turnstile" && webFrontends.some((frontend) => !isTurnstileWebFrontend(frontend))) return "Cloudflare Turnstile is currently wired for React web frontends only";
4353
+ if (optionId === "turnstile" && currentStack.backend === "convex") return "Cloudflare Turnstile is not wired for Convex auth forms";
4354
+ if (optionId === "turnstile" && currentStack.backend === "none") return "Cloudflare Turnstile requires a backend for server-side verification";
4355
+ }
4150
4356
  if (category === "search" && optionId === "bleve" && currentStack.ecosystem !== "go") return "Bleve is an embedded Go search engine, only available for the Go ecosystem";
4151
4357
  if (category === "search" && optionId !== "none") {
4152
4358
  if (currentStack.ecosystem !== "typescript") return null;
@@ -4500,7 +4706,7 @@ function getAddonOrExampleGraphBinding(category, optionId) {
4500
4706
  ecosystem: binding.ecosystem,
4501
4707
  ownerRole: binding.ownerRole,
4502
4708
  ownerEcosystem: binding.ownerRole ? binding.ecosystem : void 0,
4503
- allowOwnerlessCandidate: binding.ownerRole === void 0,
4709
+ allowOwnerlessCandidate: binding.ownerRole !== "frontend",
4504
4710
  authoritative: true,
4505
4711
  missingOwnerReason: binding.ownerRole === "frontend" ? `${optionId} requires a web frontend` : void 0
4506
4712
  };
@@ -5204,6 +5410,7 @@ const ADDON_COMPATIBILITY = {
5204
5410
  gitleaks: [],
5205
5411
  turborepo: [],
5206
5412
  nx: [],
5413
+ "vite-plus": [],
5207
5414
  starlight: [],
5208
5415
  ultracite: [],
5209
5416
  ruler: [],
@@ -5583,7 +5790,7 @@ function validateAddonCompatibility(addon, frontend, _auth) {
5583
5790
  if (compatibleFrontends.length > 0) {
5584
5791
  if (!frontend.some((f) => compatibleFrontends.includes(f))) return {
5585
5792
  isCompatible: false,
5586
- reason: `${addon} addon requires one of these frontends: ${compatibleFrontends.join(", ")}`
5793
+ reason: `${addon} requires one of these frontends: ${compatibleFrontends.join(", ")}`
5587
5794
  };
5588
5795
  }
5589
5796
  return { isCompatible: true };
@@ -5689,6 +5896,7 @@ function evaluateCompatibility(input) {
5689
5896
  ["featureFlags", input.featureFlags],
5690
5897
  ["integrations", input.integrations],
5691
5898
  ["ecommerce", input.ecommerce],
5899
+ ["botProtection", input.botProtection],
5692
5900
  ["pythonApi", input.pythonApi],
5693
5901
  ["javaWebFramework", input.javaWebFramework],
5694
5902
  ["javaBuildTool", input.javaBuildTool],
@@ -5866,6 +6074,7 @@ const DEFAULT_STACK_SELECTION = {
5866
6074
  jobQueue: "none",
5867
6075
  caching: "none",
5868
6076
  rateLimit: "none",
6077
+ botProtection: "none",
5869
6078
  i18n: "none",
5870
6079
  animation: "none",
5871
6080
  cssFramework: "tailwind",
@@ -6040,6 +6249,7 @@ const STACK_SELECTION_OPTION_CATEGORY_BY_KEY = {
6040
6249
  jobQueue: "jobQueue",
6041
6250
  caching: "caching",
6042
6251
  rateLimit: "rateLimit",
6252
+ botProtection: "botProtection",
6043
6253
  i18n: "i18n",
6044
6254
  animation: "animation",
6045
6255
  cssFramework: "cssFramework",
@@ -6227,6 +6437,7 @@ const STACK_SELECTION_URL_KEYS = {
6227
6437
  jobQueue: "jq",
6228
6438
  caching: "cache",
6229
6439
  rateLimit: "rl",
6440
+ botProtection: "bp",
6230
6441
  i18n: "i18n",
6231
6442
  animation: "anim",
6232
6443
  cssFramework: "css",
@@ -6484,6 +6695,7 @@ const CLI_SCALAR_CONFIG_FIELDS = [
6484
6695
  ["vectorDb", "vectorDb"],
6485
6696
  ["fileStorage", "fileStorage"],
6486
6697
  ["analytics", "analytics"],
6698
+ ["botProtection", "botProtection"],
6487
6699
  ["mobileNavigation", "mobileNavigation"],
6488
6700
  ["mobileUI", "mobileUI"],
6489
6701
  ["mobileStorage", "mobileStorage"],
@@ -6770,14 +6982,21 @@ function toUniqueNonNoneArray(values) {
6770
6982
  function formatArrayFlag(flag, values) {
6771
6983
  return `--${flag} ${toUniqueNonNoneArray(values).join(" ") || "none"}`;
6772
6984
  }
6773
- function formatTypeScriptAddonsFlag(selection) {
6774
- const addons = [
6985
+ function formatTypeScriptCapabilityParts(selection) {
6986
+ const selectedAddons = toUniqueNonNoneArray([
6775
6987
  ...selection.codeQuality,
6776
6988
  ...selection.documentation,
6777
6989
  ...selection.appPlatforms
6778
- ];
6779
- if (addons.length === 0) return "--addons none";
6780
- return `--addons ${toUniqueNonNoneArray(addons).join(" ") || "none"}`;
6990
+ ]);
6991
+ const specs = selectedAddons.flatMap((toolId) => {
6992
+ const binding = getAddonStackPartBinding(toolId);
6993
+ if (!binding) return [];
6994
+ return [`--part ${binding.ownerRole ? `${binding.ownerRole}.` : ""}${binding.role}:${binding.ecosystem}:${toolId}`];
6995
+ });
6996
+ return [...selectedAddons.some((toolId) => {
6997
+ const category = getToolingCapability(toolId)?.category;
6998
+ return category === "workspaceRunner" || category === "toolchain";
6999
+ }) ? [] : ["--addons none"], ...specs].join(" ");
6781
7000
  }
6782
7001
  const GRAPH_SHADCN_FLAG_KEYS = [
6783
7002
  ["shadcnBase", "shadcn-base"],
@@ -6812,7 +7031,8 @@ const GRAPH_TYPESCRIPT_FRONTEND_PART_SELECTION_KEYS = [
6812
7031
  ["animation", "animation"],
6813
7032
  ["fileUpload", "fileUpload"],
6814
7033
  ["i18n", "i18n"],
6815
- ["analytics", "analytics"]
7034
+ ["analytics", "analytics"],
7035
+ ["botProtection", "botProtection"]
6816
7036
  ];
6817
7037
  const GRAPH_TYPESCRIPT_BACKEND_PART_SELECTION_KEYS = [
6818
7038
  ["runtime", "runtime"],
@@ -6964,6 +7184,7 @@ const GRAPH_TYPESCRIPT_FRONTEND_PART_CLI_KEYS = [
6964
7184
  ["fileUpload", "fileUpload"],
6965
7185
  ["i18n", "i18n"],
6966
7186
  ["analytics", "analytics"],
7187
+ ["botProtection", "botProtection"],
6967
7188
  ["validation", "validation"],
6968
7189
  ["testing", "testing"]
6969
7190
  ];
@@ -7475,8 +7696,12 @@ function cliInputToProjectConfigPartial(input, projectName) {
7475
7696
  if (Array.isArray(value)) assignableConfig[configKey] = processCliArrayOption(value);
7476
7697
  }
7477
7698
  if (Array.isArray(input.part) && input.part.length > 0) {
7478
- const stackParts = getCliGraphStackParts(input);
7479
- Object.assign(config, stackPartsToLegacyProjectConfigPartial(stackParts), { stackParts });
7699
+ const providedStackParts = parseStackPartSpecs(input.part, "selected");
7700
+ if (isToolingOverlayOnly(providedStackParts)) config.stackParts = providedStackParts;
7701
+ else {
7702
+ const stackParts = getCliGraphStackParts(input);
7703
+ Object.assign(config, stackPartsToLegacyProjectConfigPartial(stackParts), { stackParts });
7704
+ }
7480
7705
  }
7481
7706
  return config;
7482
7707
  }
@@ -7593,6 +7818,7 @@ function buildProjectConfigBase(selection, projectName, relativePath, install) {
7593
7818
  cms: stack.cms,
7594
7819
  caching: stack.caching,
7595
7820
  rateLimit: stack.rateLimit,
7821
+ botProtection: stack.botProtection,
7596
7822
  i18n: stack.i18n,
7597
7823
  search: stack.search,
7598
7824
  vectorDb: stack.vectorDb,
@@ -7829,6 +8055,7 @@ function generateTypeScriptCommand(selection, projectName) {
7829
8055
  `--job-queue ${selection.jobQueue}`,
7830
8056
  `--caching ${selection.caching}`,
7831
8057
  `--rate-limit ${selection.rateLimit}`,
8058
+ `--bot-protection ${selection.botProtection}`,
7832
8059
  `--i18n ${selection.i18n}`,
7833
8060
  `--search ${selection.search}`,
7834
8061
  `--vector-db ${selection.vectorDb}`,
@@ -7851,7 +8078,7 @@ function generateTypeScriptCommand(selection, projectName) {
7851
8078
  `--web-deploy ${selection.webDeploy}`,
7852
8079
  `--server-deploy ${selection.serverDeploy}`,
7853
8080
  selection.install === "false" ? "--no-install" : "--install",
7854
- formatTypeScriptAddonsFlag(selection),
8081
+ formatTypeScriptCapabilityParts(selection),
7855
8082
  formatArrayFlag("examples", selection.examples),
7856
8083
  formatArrayFlag("ai-docs", selection.aiDocs)
7857
8084
  ];
@@ -8070,5 +8297,5 @@ function generateStackSelectionCommand(selection) {
8070
8297
  }
8071
8298
 
8072
8299
  //#endregion
8073
- export { JAVA_CATEGORY_ORDER as $, getCompatibleAddons as A, isSignozSupportedGoWebFramework as B, KOTLIN_DROPPED_JAVA_LIBRARIES as C, evaluateCompatibility as D, analyzeStackCompatibility as E, getKotlinJavaIncompatibilityReason as F, splitFrontends as G, isWebFrontend as H, hasSignozSupportedGoServerTarget as I, validateProjectName as J, stackQualifiesForSingleApp as K, hasWebStyling as L, getCompatibleFormLibraries as M, getCompatibleUILibraries as N, getAIFrontendCompatibilityIssue as O, getDisabledReason as P, GO_CATEGORY_ORDER as Q, isFrontendAllowedWithBackend as R, usesVirtualNoneStackSelection as S, allowedApisForFrontends as T, requiresChatSdkVercelAI as U, isSignozSupportedPythonWebFramework as V, requiresChatSdkVercelAIForSelection as W, DOTNET_CATEGORY_ORDER as X, CATEGORY_ORDER as Y, ELIXIR_CATEGORY_ORDER as Z, parseStackSelectionFromSearch as _, STACK_SELECTION_URL_KEYS as a, getCategoryCliValues as at, stackSelectionToCliComparableConfig as b, cloneDefaultStackSelection as c, getCategoryOrderForEcosystem as ct, isArrayStackSelectionKey as d, normalizeOptionId as dt, OPTION_CATEGORY_METADATA as et, isCliDefaultStackSelection as f, getCapabilityDefinitions as ft, normalizeStackSelectionValue as g, normalizeStackSelection as h, normalizeCapabilitySelection as ht, STACK_SELECTION_OPTION_CATEGORY_BY_KEY as i, TYPESCRIPT_CATEGORY_ORDER as it, getCompatibleCSSFrameworks as j, getApiFrontendCompatibilityIssue as k, createStackSelectionSearchParams as l, getOptionMetadata as lt, isStackSelectionDefault as m, getSupportedCapabilityOptions as mt, NON_OPTION_STACK_SELECTION_KEYS as n, REACT_NATIVE_CATEGORY_ORDER as nt, VIRTUAL_NONE_MULTI_SELECT_STACK_SELECTION_KEYS as o, getCategoryDisplayName as ot, isGraphStackSelection as p, getCapabilityDisabledReason as pt, validateAddonCompatibility as q, STACK_SELECTION_KEYS as r, RUST_CATEGORY_ORDER as rt, cliInputToProjectConfigPartial as s, getCategoryOptionIds as st, DEFAULT_STACK_SELECTION as t, PYTHON_CATEGORY_ORDER as tt, generateStackSelectionCommand as u, isMultiSelectCategory as ut, parseStackSelectionFromUrlRecord as v, KOTLIN_UNSUPPORTED_JAVA_TESTING_LIBRARIES as w, stackSelectionToProjectConfig as x, processCliArrayOption as y, isOptionCompatible as z };
8074
- //# sourceMappingURL=stack-translation-B-zArJLM.mjs.map
8300
+ export { supportsAnalyticsFrontends as $, getAIFrontendCompatibilityIssue as A, isAnalyticsFrontendSupported as B, usesVirtualNoneStackSelection as C, allowedApisForFrontends as D, KOTLIN_UNSUPPORTED_JAVA_TESTING_LIBRARIES as E, getCompatibleUILibraries as F, isSignozSupportedPythonWebFramework as G, isFrontendAllowedWithBackend as H, getDisabledReason as I, isWebFrontend as J, isTurnstileWebFrontend as K, getKotlinJavaIncompatibilityReason as L, getCompatibleAddons as M, getCompatibleCSSFrameworks as N, analyzeStackCompatibility as O, getCompatibleFormLibraries as P, stackQualifiesForSingleApp as Q, hasSignozSupportedGoServerTarget as R, stackSelectionToProjectConfig as S, normalizeCapabilitySelection as St, KOTLIN_DROPPED_JAVA_LIBRARIES as T, isOptionCompatible as U, isBotIdWebFrontend as V, isSignozSupportedGoWebFramework as W, requiresChatSdkVercelAIForSelection as X, requiresChatSdkVercelAI as Y, splitFrontends as Z, normalizeStackSelectionValue as _, isMultiSelectCategory as _t, STACK_SELECTION_OPTION_CATEGORY_BY_KEY as a, GO_CATEGORY_ORDER as at, processCliArrayOption as b, getCapabilityDisabledReason as bt, cliInputToProjectConfigPartial as c, PYTHON_CATEGORY_ORDER as ct, generateStackSelectionCommand as d, TYPESCRIPT_CATEGORY_ORDER as dt, validateAddonCompatibility as et, isArrayStackSelectionKey as f, getCategoryCliValues as ft, normalizeStackSelection as g, getOptionMetadata as gt, isStackSelectionDefault as h, getCategoryOrderForEcosystem as ht, STACK_SELECTION_KEYS as i, ELIXIR_CATEGORY_ORDER as it, getApiFrontendCompatibilityIssue as j, evaluateCompatibility as k, cloneDefaultStackSelection as l, REACT_NATIVE_CATEGORY_ORDER as lt, isGraphStackSelection as m, getCategoryOptionIds as mt, NON_OPTION_STACK_SELECTION_KEYS as n, CATEGORY_ORDER as nt, STACK_SELECTION_URL_KEYS as o, JAVA_CATEGORY_ORDER as ot, isCliDefaultStackSelection as p, getCategoryDisplayName as pt, isVercelAnalyticsFrontend as q, PACKAGE_MANAGER_COMMANDS as r, DOTNET_CATEGORY_ORDER as rt, VIRTUAL_NONE_MULTI_SELECT_STACK_SELECTION_KEYS as s, OPTION_CATEGORY_METADATA as st, DEFAULT_STACK_SELECTION as t, validateProjectName as tt, createStackSelectionSearchParams as u, RUST_CATEGORY_ORDER as ut, parseStackSelectionFromSearch as v, normalizeOptionId as vt, ANALYTICS_FRONTEND_SUPPORT as w, stackSelectionToCliComparableConfig as x, getSupportedCapabilityOptions as xt, parseStackSelectionFromUrlRecord as y, getCapabilityDefinitions as yt, hasWebStyling as z };
8301
+ //# sourceMappingURL=stack-translation-Cn6zGJ5q.mjs.map