create-better-fullstack 2.1.8 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/README.md +4 -4
  2. package/dist/{add-handler-ztNjzoMN.mjs → add-handler-z4NCxoq6.mjs} +9 -8
  3. package/dist/addons-setup-COE1e1db.mjs +7 -0
  4. package/dist/{addons-setup-LaAj43NP.mjs → addons-setup-DKtiNexf.mjs} +1 -1
  5. package/dist/{analytics-DVltG11u.mjs → analytics-BD8hZvIj.mjs} +1 -1
  6. package/dist/{bts-config-DQVWvPDs.mjs → bts-config-Bwd6GB7B.mjs} +59 -0
  7. package/dist/cli.mjs +2 -2
  8. package/dist/command-exists-DtX9ldL8.mjs +15 -0
  9. package/dist/{config-processing-D9-F2Us9.mjs → config-processing-B-RT_mVE.mjs} +32 -3
  10. package/dist/{doctor-a4ca3SMd.mjs → doctor-LmNs-hDr.mjs} +4 -3
  11. package/dist/{file-formatter-gvmrpd-g.mjs → file-formatter-DxF56-mO.mjs} +550 -24
  12. package/dist/{gen-CCClL7Ve.mjs → gen-CQfQU0uZ.mjs} +1 -1
  13. package/dist/{generated-checks-BV9jol5h.mjs → generated-checks-BUcI5VM2.mjs} +55 -22
  14. package/dist/index.d.mts +741 -211
  15. package/dist/index.mjs +30 -9
  16. package/dist/{install-dependencies-RoUyaE8o.mjs → install-dependencies-CJiUklm3.mjs} +132 -23
  17. package/dist/{mcp-492OkjcS.mjs → mcp-BBammItk.mjs} +5 -5
  18. package/dist/mcp-entry.mjs +76 -236
  19. package/dist/{registry-DSf2CEaU.mjs → registry-D0JfLCoH.mjs} +1 -1
  20. package/dist/{run-T6g1jkfy.mjs → run-BAIeghcU.mjs} +1948 -318
  21. package/dist/run-CAl4L4uU.mjs +16 -0
  22. package/dist/scaffold-manifest-CQwvyttq.mjs +4 -0
  23. package/dist/{scaffold-manifest-Dyi0voqE.mjs → scaffold-manifest-Dr3Anmlf.mjs} +34 -5
  24. package/dist/{update-DJ8CI5KW.mjs → update-CnrBdWrh.mjs} +182 -25
  25. package/package.json +24 -7
  26. package/dist/addons-setup-DnLjAzTw.mjs +0 -7
  27. package/dist/run-CD8f7PHh.mjs +0 -15
  28. package/dist/scaffold-manifest-DGRyepdb.mjs +0 -4
  29. /package/dist/{update-deps-aD-iQw4U.mjs → update-deps-G3FgqBlW.mjs} +0 -0
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Better Fullstack
2
2
 
3
- Scaffold production-ready fullstack apps in seconds. Pick your stack from 425 options — the CLI wires everything together.
3
+ Scaffold configurable fullstack apps across web, mobile, and backend ecosystems — the CLI wires your selected stack together.
4
4
 
5
5
  ## Quick Start
6
6
 
@@ -31,8 +31,8 @@ Configure your stack visually — pick every option from a UI, preview your choi
31
31
 
32
32
  ## Features
33
33
 
34
- - **425 options** — frontend, backend, database, auth, payments, AI, DevOps, and more
35
- - **7 ecosystems** — TypeScript, React Native, Rust, Python, Go, Java, Elixir
34
+ - **Broad stack catalog** — frontend, backend, database, auth, payments, AI, DevOps, and more
35
+ - **Multi-ecosystem projects** — compose web, mobile, and backend stacks across supported ecosystems
36
36
  - **Visual builder** — configure your stack in the browser
37
37
  - **Wired for you** — every picked integration is preconfigured and working out of the box
38
38
 
@@ -42,7 +42,7 @@ Configure your stack visually — pick every option from a UI, preview your choi
42
42
  --yes # Accept all defaults
43
43
  --yolo # Scaffold a random stack — good for exploring
44
44
  --template <name> # Use a preset (t3, mern, pern, uniwind)
45
- --ecosystem <lang> # Start in typescript, react-native, rust, python, go, java, or elixir mode
45
+ --ecosystem <lang> # Choose the primary project ecosystem
46
46
  --part <binding> # Add a multi-ecosystem stack part, e.g. frontend:typescript:next
47
47
  --version-channel # Dependency channel: stable, latest, beta
48
48
  --no-git # Skip git initialization
@@ -1,14 +1,15 @@
1
1
  #!/usr/bin/env node
2
- import { a as updateBtsConfig, r as readBtsConfig, v as getDefaultConfig } from "./bts-config-DQVWvPDs.mjs";
2
+ import { a as updateBtsConfig, r as readBtsConfig, v as getDefaultConfig } from "./bts-config-Bwd6GB7B.mjs";
3
3
  import { t as renderTitle } from "./render-title-zvyKC1ej.mjs";
4
4
  import { c as isSilent, l as runWithContextAsync, n as UserCancelledError, t as CLIError } from "./errors-ns_o2OKg.mjs";
5
5
  import "./prompt-environment-BR0Kkw2W.mjs";
6
- import { i as trackEvent, r as maybeShowTelemetryNotice } from "./analytics-DVltG11u.mjs";
7
- import "./file-formatter-gvmrpd-g.mjs";
8
- import { c as applyDependencyVersionChannel, t as installDependencies, u as getAddonsToAdd } from "./install-dependencies-RoUyaE8o.mjs";
9
- import "./scaffold-manifest-Dyi0voqE.mjs";
10
- import { t as setupAddons } from "./addons-setup-LaAj43NP.mjs";
11
- import { o as applyStackUpdate, u as planStackUpdate } from "./mcp-entry.mjs";
6
+ import { i as trackEvent, r as maybeShowTelemetryNotice } from "./analytics-BD8hZvIj.mjs";
7
+ import "./file-formatter-DxF56-mO.mjs";
8
+ import { c as applyDependencyVersionChannel, t as installDependencies, u as getAddonsToAdd } from "./install-dependencies-CJiUklm3.mjs";
9
+ import "./command-exists-DtX9ldL8.mjs";
10
+ import "./scaffold-manifest-Dr3Anmlf.mjs";
11
+ import { t as setupAddons } from "./addons-setup-DKtiNexf.mjs";
12
+ import { p as planStackUpdate, s as applyStackUpdate } from "./mcp-entry.mjs";
12
13
  import { intro, log, outro } from "@clack/prompts";
13
14
  import pc from "picocolors";
14
15
  import fs from "fs-extra";
@@ -211,7 +212,7 @@ async function addHandlerInternal(input) {
211
212
  const existingAddons = btsConfig.addons || [];
212
213
  let addonsToAdd = [];
213
214
  if (input.addons && input.addons.length > 0) addonsToAdd = input.addons.filter((addon) => addon !== "none" && !existingAddons.includes(addon));
214
- else addonsToAdd = (await getAddonsToAdd(btsConfig.frontend || [], existingAddons, btsConfig.auth)).filter((addon) => addon !== "none");
215
+ else addonsToAdd = (await getAddonsToAdd(btsConfig.frontend || [], existingAddons, btsConfig.auth, btsConfig.backend, btsConfig.runtime, btsConfig.api ?? "none")).filter((addon) => addon !== "none");
215
216
  if (addonsToAdd.length === 0) {
216
217
  if (!isSilent()) {
217
218
  log.info(pc.dim("No new addons selected."));
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ import "./bts-config-Bwd6GB7B.mjs";
3
+ import "./errors-ns_o2OKg.mjs";
4
+ import "./prompt-environment-BR0Kkw2W.mjs";
5
+ import { t as setupAddons } from "./addons-setup-DKtiNexf.mjs";
6
+
7
+ export { setupAddons };
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { r as readBtsConfig } from "./bts-config-DQVWvPDs.mjs";
2
+ import { r as readBtsConfig } from "./bts-config-Bwd6GB7B.mjs";
3
3
  import { c as isSilent, r as exitCancelled } from "./errors-ns_o2OKg.mjs";
4
4
  import { t as canPromptInteractively } from "./prompt-environment-BR0Kkw2W.mjs";
5
5
  import { autocompleteMultiselect, group, isCancel, log, multiselect, select, spinner } from "@clack/prompts";
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { m as getLatestCLIVersion } from "./bts-config-DQVWvPDs.mjs";
2
+ import { m as getLatestCLIVersion } from "./bts-config-Bwd6GB7B.mjs";
3
3
  import { t as canPromptInteractively } from "./prompt-environment-BR0Kkw2W.mjs";
4
4
  import { log } from "@clack/prompts";
5
5
  import pc from "picocolors";
@@ -40,6 +40,8 @@ function getDefaultConfig() {
40
40
  pythonAi: [...DEFAULT_CONFIG_BASE.pythonAi],
41
41
  javaLibraries: [...DEFAULT_CONFIG_BASE.javaLibraries],
42
42
  javaTestingLibraries: [...DEFAULT_CONFIG_BASE.javaTestingLibraries],
43
+ mobileLibraries: [...DEFAULT_CONFIG_BASE.mobileLibraries],
44
+ dotnetLibraries: [...DEFAULT_CONFIG_BASE.dotnetLibraries],
43
45
  aiDocs: [...DEFAULT_CONFIG_BASE.aiDocs]
44
46
  };
45
47
  }
@@ -52,6 +54,8 @@ const DEFAULT_UI_LIBRARY_BY_FRONTEND = {
52
54
  "tanstack-router": "shadcn-ui",
53
55
  "react-router": "shadcn-ui",
54
56
  "react-vite": "shadcn-ui",
57
+ "vanilla-vite": "none",
58
+ vue: "none",
55
59
  "tanstack-start": "shadcn-ui",
56
60
  next: "shadcn-ui",
57
61
  vinext: "shadcn-ui",
@@ -299,6 +303,13 @@ function normalizeGraphConfigForPersistence(projectConfig, stackParts) {
299
303
  normalized.pythonRealtime = "none";
300
304
  normalized.pythonObservability = "none";
301
305
  normalized.pythonCli = [];
306
+ normalized.pythonCloudSdk = "none";
307
+ normalized.pythonHttpClient = "none";
308
+ normalized.pythonData = [];
309
+ normalized.pythonMedia = "none";
310
+ normalized.pythonServer = "none";
311
+ normalized.pythonPackageManager = "uv";
312
+ normalized.pythonMessageQueue = "none";
302
313
  }
303
314
  if (!selectedEcosystems.has("go")) {
304
315
  normalized.goWebFramework = "none";
@@ -313,6 +324,12 @@ function normalizeGraphConfigForPersistence(projectConfig, stackParts) {
313
324
  normalized.goCaching = "none";
314
325
  normalized.goConfig = "none";
315
326
  normalized.goObservability = "none";
327
+ normalized.goValidation = "none";
328
+ normalized.goQuality = "none";
329
+ normalized.goMigrations = "none";
330
+ normalized.goTemplating = "none";
331
+ normalized.goProtoTooling = "none";
332
+ normalized.goDI = "none";
316
333
  }
317
334
  if (selectedEcosystems.has("go") && projectConfig.auth === "go-better-auth" && legacyConfig.auth === "none") normalized.auth = projectConfig.auth;
318
335
  if (!selectedEcosystems.has("java")) {
@@ -338,6 +355,7 @@ function normalizeGraphConfigForPersistence(projectConfig, stackParts) {
338
355
  normalized.dotnetValidation = "none";
339
356
  normalized.dotnetCaching = "none";
340
357
  normalized.dotnetDeploy = "none";
358
+ normalized.dotnetLibraries = [];
341
359
  }
342
360
  if (!selectedEcosystems.has("elixir")) {
343
361
  normalized.elixirWebFramework = "none";
@@ -373,6 +391,7 @@ function normalizeGraphConfigForPersistence(projectConfig, stackParts) {
373
391
  normalized.mobilePush = "none";
374
392
  normalized.mobileOTA = "none";
375
393
  normalized.mobileDeepLinking = "none";
394
+ normalized.mobileLibraries = [];
376
395
  }
377
396
  return normalized;
378
397
  }
@@ -489,6 +508,7 @@ function buildBtsConfigForPersistence(projectConfig, metadata = {}) {
489
508
  mobilePush: persistedConfig.mobilePush,
490
509
  mobileOTA: persistedConfig.mobileOTA,
491
510
  mobileDeepLinking: persistedConfig.mobileDeepLinking,
511
+ mobileLibraries: persistedConfig.mobileLibraries,
492
512
  cms: persistedConfig.cms,
493
513
  caching: persistedConfig.caching,
494
514
  rateLimit: persistedConfig.rateLimit,
@@ -524,6 +544,13 @@ function buildBtsConfigForPersistence(projectConfig, metadata = {}) {
524
544
  pythonRealtime: persistedConfig.pythonRealtime,
525
545
  pythonObservability: persistedConfig.pythonObservability,
526
546
  pythonCli: persistedConfig.pythonCli,
547
+ pythonCloudSdk: persistedConfig.pythonCloudSdk,
548
+ pythonHttpClient: persistedConfig.pythonHttpClient,
549
+ pythonData: persistedConfig.pythonData,
550
+ pythonMedia: persistedConfig.pythonMedia,
551
+ pythonServer: persistedConfig.pythonServer,
552
+ pythonPackageManager: persistedConfig.pythonPackageManager,
553
+ pythonMessageQueue: persistedConfig.pythonMessageQueue,
527
554
  goWebFramework: persistedConfig.goWebFramework,
528
555
  goOrm: persistedConfig.goOrm,
529
556
  goApi: persistedConfig.goApi,
@@ -536,6 +563,12 @@ function buildBtsConfigForPersistence(projectConfig, metadata = {}) {
536
563
  goCaching: persistedConfig.goCaching,
537
564
  goConfig: persistedConfig.goConfig,
538
565
  goObservability: persistedConfig.goObservability,
566
+ goValidation: persistedConfig.goValidation,
567
+ goQuality: persistedConfig.goQuality,
568
+ goMigrations: persistedConfig.goMigrations,
569
+ goTemplating: persistedConfig.goTemplating,
570
+ goProtoTooling: persistedConfig.goProtoTooling,
571
+ goDI: persistedConfig.goDI,
539
572
  javaLanguage: persistedConfig.javaLanguage,
540
573
  javaWebFramework: persistedConfig.javaWebFramework,
541
574
  javaBuildTool: persistedConfig.javaBuildTool,
@@ -556,6 +589,7 @@ function buildBtsConfigForPersistence(projectConfig, metadata = {}) {
556
589
  dotnetValidation: persistedConfig.dotnetValidation,
557
590
  dotnetCaching: persistedConfig.dotnetCaching,
558
591
  dotnetDeploy: persistedConfig.dotnetDeploy,
592
+ dotnetLibraries: persistedConfig.dotnetLibraries,
559
593
  elixirWebFramework: persistedConfig.elixirWebFramework,
560
594
  elixirOrm: persistedConfig.elixirOrm,
561
595
  elixirAuth: persistedConfig.elixirAuth,
@@ -570,6 +604,11 @@ function buildBtsConfigForPersistence(projectConfig, metadata = {}) {
570
604
  elixirObservability: persistedConfig.elixirObservability,
571
605
  elixirTesting: persistedConfig.elixirTesting,
572
606
  elixirQuality: persistedConfig.elixirQuality,
607
+ elixirI18n: persistedConfig.elixirI18n,
608
+ elixirHttpServer: persistedConfig.elixirHttpServer,
609
+ elixirApplicationFramework: persistedConfig.elixirApplicationFramework,
610
+ elixirDocumentation: persistedConfig.elixirDocumentation,
611
+ elixirClustering: persistedConfig.elixirClustering,
573
612
  elixirDeploy: persistedConfig.elixirDeploy,
574
613
  elixirLibraries: persistedConfig.elixirLibraries,
575
614
  aiDocs: persistedConfig.aiDocs,
@@ -646,6 +685,7 @@ async function writeBtsConfig(projectConfig, metadata = {}) {
646
685
  mobilePush: btsConfig.mobilePush,
647
686
  mobileOTA: btsConfig.mobileOTA,
648
687
  mobileDeepLinking: btsConfig.mobileDeepLinking,
688
+ mobileLibraries: btsConfig.mobileLibraries,
649
689
  cms: btsConfig.cms,
650
690
  caching: btsConfig.caching,
651
691
  rateLimit: btsConfig.rateLimit,
@@ -681,6 +721,13 @@ async function writeBtsConfig(projectConfig, metadata = {}) {
681
721
  pythonRealtime: btsConfig.pythonRealtime,
682
722
  pythonObservability: btsConfig.pythonObservability,
683
723
  pythonCli: btsConfig.pythonCli,
724
+ pythonCloudSdk: btsConfig.pythonCloudSdk,
725
+ pythonHttpClient: btsConfig.pythonHttpClient,
726
+ pythonData: btsConfig.pythonData,
727
+ pythonMedia: btsConfig.pythonMedia,
728
+ pythonServer: btsConfig.pythonServer,
729
+ pythonPackageManager: btsConfig.pythonPackageManager,
730
+ pythonMessageQueue: btsConfig.pythonMessageQueue,
684
731
  goWebFramework: btsConfig.goWebFramework,
685
732
  goOrm: btsConfig.goOrm,
686
733
  goApi: btsConfig.goApi,
@@ -693,6 +740,12 @@ async function writeBtsConfig(projectConfig, metadata = {}) {
693
740
  goCaching: btsConfig.goCaching,
694
741
  goConfig: btsConfig.goConfig,
695
742
  goObservability: btsConfig.goObservability,
743
+ goValidation: btsConfig.goValidation,
744
+ goQuality: btsConfig.goQuality,
745
+ goMigrations: btsConfig.goMigrations,
746
+ goTemplating: btsConfig.goTemplating,
747
+ goProtoTooling: btsConfig.goProtoTooling,
748
+ goDI: btsConfig.goDI,
696
749
  javaLanguage: btsConfig.javaLanguage,
697
750
  javaWebFramework: btsConfig.javaWebFramework,
698
751
  javaBuildTool: btsConfig.javaBuildTool,
@@ -713,6 +766,7 @@ async function writeBtsConfig(projectConfig, metadata = {}) {
713
766
  dotnetValidation: btsConfig.dotnetValidation,
714
767
  dotnetCaching: btsConfig.dotnetCaching,
715
768
  dotnetDeploy: btsConfig.dotnetDeploy,
769
+ dotnetLibraries: btsConfig.dotnetLibraries,
716
770
  elixirWebFramework: btsConfig.elixirWebFramework,
717
771
  elixirOrm: btsConfig.elixirOrm,
718
772
  elixirAuth: btsConfig.elixirAuth,
@@ -727,6 +781,11 @@ async function writeBtsConfig(projectConfig, metadata = {}) {
727
781
  elixirObservability: btsConfig.elixirObservability,
728
782
  elixirTesting: btsConfig.elixirTesting,
729
783
  elixirQuality: btsConfig.elixirQuality,
784
+ elixirI18n: btsConfig.elixirI18n,
785
+ elixirHttpServer: btsConfig.elixirHttpServer,
786
+ elixirApplicationFramework: btsConfig.elixirApplicationFramework,
787
+ elixirDocumentation: btsConfig.elixirDocumentation,
788
+ elixirClustering: btsConfig.elixirClustering,
730
789
  elixirDeploy: btsConfig.elixirDeploy,
731
790
  elixirLibraries: btsConfig.elixirLibraries,
732
791
  aiDocs: btsConfig.aiDocs,
package/dist/cli.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  //#region src/cli.ts
3
- if (process.argv[2] === "mcp" && process.argv.length === 3) import("./mcp-492OkjcS.mjs").then((m) => m.startMcpServer());
4
- else import("./run-CD8f7PHh.mjs").then((m) => m.createBtsCli().run());
3
+ if (process.argv[2] === "mcp" && process.argv.length === 3) import("./mcp-BBammItk.mjs").then((m) => m.startMcpServer());
4
+ else import("./run-CAl4L4uU.mjs").then((m) => m.createBtsCli().run());
5
5
 
6
6
  //#endregion
7
7
  export { };
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env node
2
+ import { $ } from "execa";
3
+
4
+ //#region src/utils/command-exists.ts
5
+ async function commandExists(command) {
6
+ try {
7
+ if (process.platform === "win32") return (await $({ reject: false })`where ${command}`).exitCode === 0;
8
+ return (await $({ reject: false })`which ${command}`).exitCode === 0;
9
+ } catch {
10
+ return false;
11
+ }
12
+ }
13
+
14
+ //#endregion
15
+ export { commandExists as t };
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { b as types_exports } from "./bts-config-DQVWvPDs.mjs";
2
+ import { b as types_exports } from "./bts-config-Bwd6GB7B.mjs";
3
3
  import path from "node:path";
4
4
  import { cliInputToProjectConfigPartial } from "@better-fullstack/types/stack-translation";
5
5
 
@@ -13,7 +13,7 @@ function getBaseCommand(packageManager) {
13
13
  default: return "npx create-better-fullstack@latest";
14
14
  }
15
15
  }
16
- function formatArrayFlag(flag, values) {
16
+ function formatArrayFlag(flag, values = []) {
17
17
  const normalizedValues = values.filter((value) => value !== "none");
18
18
  if (normalizedValues.length === 0) return `--${flag} none`;
19
19
  return `--${flag} ${normalizedValues.join(" ")}`;
@@ -75,7 +75,7 @@ function hasAnyOwnedGraphArrayPart(config, ownerRole, role, ecosystem) {
75
75
  }
76
76
  function appendChangedOwnedGraphArrayFlag(flags, config, ownerRole, role, ecosystem, flag, values, defaultValues) {
77
77
  if (hasAnyOwnedGraphArrayPart(config, ownerRole, role, ecosystem)) return;
78
- appendChangedArrayFlag(flags, flag, values, defaultValues);
78
+ appendChangedArrayFlag(flags, flag, values ?? [], defaultValues);
79
79
  }
80
80
  function appendChangedArrayFlag(flags, flag, values, defaultValues) {
81
81
  if (values.length !== defaultValues.length || values.some((value, index) => value !== defaultValues[index])) flags.push(formatArrayFlag(flag, values));
@@ -141,6 +141,7 @@ function appendGraphExtraFlags(flags, config) {
141
141
  appendChangedOwnedGraphStringFlag(flags, config, "mobile", "push", "react-native", "mobile-push", config.mobilePush, "none");
142
142
  appendChangedOwnedGraphStringFlag(flags, config, "mobile", "ota", "react-native", "mobile-ota", config.mobileOTA, "none");
143
143
  appendChangedOwnedGraphStringFlag(flags, config, "mobile", "deepLinking", "react-native", "mobile-deep-linking", config.mobileDeepLinking, "none");
144
+ appendChangedOwnedGraphArrayFlag(flags, config, "mobile", "libraries", "react-native", "mobile-libraries", config.mobileLibraries, []);
144
145
  }
145
146
  if (hasGraphPrimaryPart(config, "frontend", "rust")) appendChangedStringFlag(flags, "rust-frontend", config.rustFrontend, "none");
146
147
  if (hasGraphPrimaryPart(config, "backend", "rust")) {
@@ -177,6 +178,11 @@ function appendGraphExtraFlags(flags, config) {
177
178
  appendChangedGraphStringFlag(flags, config, "observability", "elixir", "elixir-observability", config.elixirObservability, "telemetry");
178
179
  appendChangedGraphStringFlag(flags, config, "testing", "elixir", "elixir-testing", config.elixirTesting, "ex_unit");
179
180
  appendChangedOwnedGraphStringFlag(flags, config, "backend", "codeQuality", "elixir", "elixir-quality", config.elixirQuality, "credo");
181
+ appendChangedGraphStringFlag(flags, config, "i18n", "elixir", "elixir-i18n", config.elixirI18n, "none");
182
+ appendChangedGraphStringFlag(flags, config, "runtime", "elixir", "elixir-http-server", config.elixirHttpServer, "cowboy");
183
+ appendChangedGraphStringFlag(flags, config, "libraries", "elixir", "elixir-application-framework", config.elixirApplicationFramework, "none");
184
+ appendChangedGraphStringFlag(flags, config, "documentation", "elixir", "elixir-documentation", config.elixirDocumentation, "none");
185
+ appendChangedGraphStringFlag(flags, config, "config", "elixir", "elixir-clustering", config.elixirClustering, "none");
180
186
  appendChangedGraphStringFlag(flags, config, "deploy", "elixir", "elixir-deploy", config.elixirDeploy, "none");
181
187
  }
182
188
  }
@@ -242,6 +248,7 @@ function getTypeScriptFlags(config) {
242
248
  flags.push(`--mobile-push ${config.mobilePush}`);
243
249
  flags.push(`--mobile-ota ${config.mobileOTA}`);
244
250
  flags.push(`--mobile-deep-linking ${config.mobileDeepLinking}`);
251
+ if (config.mobileLibraries) flags.push(formatArrayFlag("mobile-libraries", config.mobileLibraries));
245
252
  if (config.addons && config.addons.length > 0) flags.push(`--addons ${config.addons.join(" ")}`);
246
253
  else flags.push("--addons none");
247
254
  if (config.examples && config.examples.length > 0) flags.push(`--examples ${config.examples.join(" ")}`);
@@ -264,6 +271,7 @@ function getReactNativeFlags(config) {
264
271
  flags.push(`--mobile-push ${config.mobilePush}`);
265
272
  flags.push(`--mobile-ota ${config.mobileOTA}`);
266
273
  flags.push(`--mobile-deep-linking ${config.mobileDeepLinking}`);
274
+ flags.push(formatArrayFlag("mobile-libraries", config.mobileLibraries));
267
275
  appendCommonFlags(flags, config);
268
276
  return flags;
269
277
  }
@@ -303,6 +311,13 @@ function getPythonFlags(config) {
303
311
  flags.push(`--python-realtime ${config.pythonRealtime}`);
304
312
  flags.push(`--python-observability ${config.pythonObservability}`);
305
313
  flags.push(formatArrayFlag("python-cli", config.pythonCli));
314
+ flags.push(`--python-cloud-sdk ${config.pythonCloudSdk}`);
315
+ flags.push(`--python-http-client ${config.pythonHttpClient}`);
316
+ flags.push(formatArrayFlag("python-data", config.pythonData));
317
+ flags.push(`--python-media ${config.pythonMedia}`);
318
+ flags.push(`--python-server ${config.pythonServer}`);
319
+ flags.push(`--python-package-manager ${config.pythonPackageManager}`);
320
+ flags.push(`--python-message-queue ${config.pythonMessageQueue}`);
306
321
  appendSharedNonTypeScriptFlags(flags, config);
307
322
  appendCommonFlags(flags, config);
308
323
  return flags;
@@ -321,6 +336,12 @@ function getGoFlags(config) {
321
336
  flags.push(`--go-caching ${config.goCaching}`);
322
337
  flags.push(`--go-config ${config.goConfig}`);
323
338
  flags.push(`--go-observability ${config.goObservability}`);
339
+ flags.push(`--go-validation ${config.goValidation ?? "none"}`);
340
+ flags.push(`--go-quality ${config.goQuality ?? "none"}`);
341
+ flags.push(`--go-migrations ${config.goMigrations ?? "none"}`);
342
+ flags.push(`--go-templating ${config.goTemplating ?? "none"}`);
343
+ flags.push(`--go-proto-tooling ${config.goProtoTooling ?? "none"}`);
344
+ flags.push(`--go-di ${config.goDI ?? "none"}`);
324
345
  flags.push(`--auth ${config.auth}`);
325
346
  appendSharedNonTypeScriptFlags(flags, config);
326
347
  appendCommonFlags(flags, config);
@@ -354,6 +375,7 @@ function getDotnetFlags(config) {
354
375
  flags.push(`--dotnet-validation ${config.dotnetValidation}`);
355
376
  flags.push(`--dotnet-caching ${config.dotnetCaching}`);
356
377
  flags.push(`--dotnet-deploy ${config.dotnetDeploy}`);
378
+ if (config.dotnetLibraries) flags.push(formatArrayFlag("dotnet-libraries", config.dotnetLibraries));
357
379
  appendCommonFlags(flags, config);
358
380
  return flags;
359
381
  }
@@ -373,6 +395,11 @@ function getElixirFlags(config) {
373
395
  flags.push(`--elixir-observability ${config.elixirObservability}`);
374
396
  flags.push(`--elixir-testing ${config.elixirTesting}`);
375
397
  flags.push(`--elixir-quality ${config.elixirQuality}`);
398
+ flags.push(`--elixir-i18n ${config.elixirI18n}`);
399
+ flags.push(`--elixir-http-server ${config.elixirHttpServer}`);
400
+ flags.push(`--elixir-application-framework ${config.elixirApplicationFramework}`);
401
+ flags.push(`--elixir-documentation ${config.elixirDocumentation}`);
402
+ flags.push(`--elixir-clustering ${config.elixirClustering}`);
376
403
  flags.push(`--elixir-deploy ${config.elixirDeploy}`);
377
404
  flags.push(formatArrayFlag("elixir-libraries", config.elixirLibraries));
378
405
  appendCommonFlags(flags, config);
@@ -546,6 +573,8 @@ function validateArrayOptions(options) {
546
573
  validateNoneExclusivity(options.pythonAi, "python ai libraries");
547
574
  validateNoneExclusivity(options.javaLibraries, "java libraries");
548
575
  validateNoneExclusivity(options.javaTestingLibraries, "java testing libraries");
576
+ validateNoneExclusivity(options.mobileLibraries, "mobile libraries");
577
+ validateNoneExclusivity(options.dotnetLibraries, ".NET libraries");
549
578
  }
550
579
 
551
580
  //#endregion
@@ -1,8 +1,9 @@
1
1
  #!/usr/bin/env node
2
- import { r as readBtsConfig } from "./bts-config-DQVWvPDs.mjs";
2
+ import { r as readBtsConfig } from "./bts-config-Bwd6GB7B.mjs";
3
3
  import { t as renderTitle } from "./render-title-zvyKC1ej.mjs";
4
4
  import { a as handleError } from "./errors-ns_o2OKg.mjs";
5
- import { t as runGeneratedChecks } from "./generated-checks-BV9jol5h.mjs";
5
+ import "./command-exists-DtX9ldL8.mjs";
6
+ import { t as runGeneratedChecks } from "./generated-checks-BUcI5VM2.mjs";
6
7
  import { intro, log, spinner } from "@clack/prompts";
7
8
  import pc from "picocolors";
8
9
  import fs from "fs-extra";
@@ -49,7 +50,7 @@ const NATIVE_LOCKFILES = {
49
50
  },
50
51
  python: {
51
52
  file: "uv.lock",
52
- hint: "uv sync"
53
+ hint: "uv sync --extra dev"
53
54
  },
54
55
  elixir: {
55
56
  file: "mix.lock",