buncargo 1.0.29 → 3.0.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 (221) hide show
  1. package/dist/bin.d.ts +1 -12
  2. package/dist/bin.js +261 -253
  3. package/dist/cli/bin.d.ts +13 -0
  4. package/dist/cli/bin.js +315 -0
  5. package/dist/cli/commands/help.d.ts +1 -0
  6. package/dist/cli/commands/runtime.d.ts +5 -0
  7. package/dist/cli/commands/version.d.ts +1 -0
  8. package/dist/cli/index.d.ts +1 -0
  9. package/dist/cli/index.js +14 -0
  10. package/dist/cli/run-cli.d.ts +22 -0
  11. package/dist/cli.d.ts +1 -22
  12. package/dist/cli.js +5 -13
  13. package/dist/config/config.d.ts +1 -0
  14. package/dist/config/define-config.d.ts +13 -0
  15. package/dist/config/index.d.ts +3 -0
  16. package/dist/config/index.js +15 -0
  17. package/dist/config/merge-configs.d.ts +3 -0
  18. package/dist/config/validate-config.d.ts +3 -0
  19. package/dist/config.d.ts +1 -72
  20. package/dist/config.js +12 -12
  21. package/dist/core/docker.d.ts +1 -83
  22. package/dist/core/docker.js +35 -32
  23. package/dist/core/index.d.ts +1 -1
  24. package/dist/core/index.js +123 -118
  25. package/dist/core/network.js +2 -2
  26. package/dist/core/ports.js +1 -1
  27. package/dist/core/process.js +1 -1
  28. package/dist/core/tunnel.d.ts +33 -0
  29. package/dist/core/utils.js +2 -2
  30. package/dist/core/watchdog-runner.js +45 -42
  31. package/dist/core/watchdog.d.ts +1 -0
  32. package/dist/core/watchdog.js +4 -2
  33. package/dist/docker/index.d.ts +1 -0
  34. package/dist/docker/index.js +38 -0
  35. package/dist/docker/runtime.d.ts +87 -0
  36. package/dist/docker/runtime.js +37 -0
  37. package/dist/docker-compose/compose.d.ts +1 -0
  38. package/dist/docker-compose/generated-file.d.ts +7 -0
  39. package/dist/docker-compose/index.d.ts +3 -0
  40. package/dist/docker-compose/index.js +15 -0
  41. package/dist/docker-compose/model.d.ts +6 -0
  42. package/dist/docker-compose/services/clickhouse.d.ts +16 -0
  43. package/dist/docker-compose/services/define-docker-service.d.ts +41 -0
  44. package/dist/docker-compose/services/index.d.ts +23 -0
  45. package/dist/docker-compose/services/index.js +17 -0
  46. package/dist/docker-compose/services/postgres.d.ts +12 -0
  47. package/dist/docker-compose/services/redis.d.ts +12 -0
  48. package/dist/docker-compose/services/shared.d.ts +7 -0
  49. package/dist/docker-compose/yaml.d.ts +2 -0
  50. package/dist/environment/create-dev-environment.d.ts +23 -0
  51. package/dist/environment/index.d.ts +1 -0
  52. package/dist/environment/index.js +15 -0
  53. package/dist/environment/logging.d.ts +17 -0
  54. package/dist/environment/seeding.d.ts +9 -0
  55. package/dist/environment.d.ts +1 -23
  56. package/dist/environment.js +12 -14
  57. package/dist/index-045jksh5.js +147 -0
  58. package/dist/index-08wa79cs.js +125 -117
  59. package/dist/index-0kxnae3z.js +335 -0
  60. package/dist/index-1mdrf7nz.js +51 -43
  61. package/dist/index-1yvbwj4k.js +262 -242
  62. package/dist/index-23ev345g.js +475 -0
  63. package/dist/index-2ckr49sf.js +228 -0
  64. package/dist/index-2f47khe5.js +376 -369
  65. package/dist/index-2fr3g85b.js +220 -183
  66. package/dist/index-38xnzpa6.js +450 -0
  67. package/dist/index-3h3dhtf2.js +51 -43
  68. package/dist/index-42x95209.js +51 -43
  69. package/dist/index-4gp0az1g.js +145 -0
  70. package/dist/index-4xrxh8yv.js +72 -0
  71. package/dist/index-5gmws6ah.js +181 -0
  72. package/dist/index-5hka0tff.js +78 -76
  73. package/dist/index-5rfqps4b.js +3 -0
  74. package/dist/index-5t9jxqm0.js +428 -0
  75. package/dist/index-6c1w1xk5.js +101 -0
  76. package/dist/index-6fm7mvwj.js +118 -97
  77. package/dist/index-6srpc523.js +127 -128
  78. package/dist/index-731rzzfp.js +157 -142
  79. package/dist/index-75y4cg2z.js +51 -43
  80. package/dist/index-7ja4ywyj.js +126 -127
  81. package/dist/index-8bw1cmz4.js +531 -0
  82. package/dist/index-8hbbj1mp.js +120 -121
  83. package/dist/index-8xj2p5n5.js +118 -97
  84. package/dist/index-bj79tw5w.js +0 -0
  85. package/dist/index-bnk6nr0g.js +73 -0
  86. package/dist/index-brbbzyks.js +72 -0
  87. package/dist/index-c0dr6mcv.js +123 -0
  88. package/dist/index-cty0bcry.js +235 -218
  89. package/dist/index-d8tyv5se.js +228 -0
  90. package/dist/index-d9efy0n4.js +176 -150
  91. package/dist/index-etfmqjjf.js +427 -0
  92. package/dist/index-fb29934k.js +172 -0
  93. package/dist/index-g50jw1yf.js +72 -0
  94. package/dist/index-g6eb5wdw.js +118 -117
  95. package/dist/index-ggq3yryx.js +99 -95
  96. package/dist/index-h70tce00.js +177 -0
  97. package/dist/index-hkxtfqtc.js +333 -0
  98. package/dist/index-kf3dhser.js +146 -143
  99. package/dist/index-ma6tgdb2.js +500 -0
  100. package/dist/index-mam0bcyz.js +123 -0
  101. package/dist/index-mm412dkp.js +274 -0
  102. package/dist/index-n8v18aeb.js +0 -0
  103. package/dist/index-ndnmnsej.js +378 -371
  104. package/dist/index-p8wty0e2.js +389 -379
  105. package/dist/index-qfphr2fd.js +78 -76
  106. package/dist/index-qqmms8rs.js +51 -43
  107. package/dist/index-qw4093g2.js +51 -43
  108. package/dist/index-qzwpzjbx.js +121 -122
  109. package/dist/index-segbnm0h.js +146 -143
  110. package/dist/index-t0fj6gg1.js +112 -0
  111. package/dist/index-thdkwnv7.js +122 -0
  112. package/dist/index-tjbx2r2t.js +270 -0
  113. package/dist/index-tjqw9vtj.js +62 -54
  114. package/dist/index-vbpb89jy.js +248 -0
  115. package/dist/index-vhs88xhe.js +99 -95
  116. package/dist/index-w8zxnjka.js +249 -0
  117. package/dist/index-wk2na3t9.js +385 -375
  118. package/dist/index-wz9x8g7z.js +383 -373
  119. package/dist/index-x249gyde.js +388 -378
  120. package/dist/index-xkvd0nsd.js +187 -0
  121. package/dist/index-yedqxm1z.js +80 -0
  122. package/dist/index-zfjzzjkf.js +240 -199
  123. package/dist/index.d.ts +12 -8
  124. package/dist/index.js +56 -35
  125. package/dist/lint.d.ts +1 -46
  126. package/dist/lint.js +3 -7
  127. package/dist/loader/cache.d.ts +4 -0
  128. package/dist/loader/find-config-file.d.ts +2 -0
  129. package/dist/loader/index.d.ts +5 -0
  130. package/dist/loader/index.js +24 -0
  131. package/dist/loader/load-dev-env.d.ts +5 -0
  132. package/dist/loader/loader.d.ts +1 -0
  133. package/dist/loader.d.ts +1 -45
  134. package/dist/loader.js +22 -20
  135. package/dist/prisma/index.d.ts +1 -0
  136. package/dist/prisma/prisma.d.ts +29 -0
  137. package/dist/prisma.d.ts +1 -29
  138. package/dist/prisma.js +6 -10
  139. package/dist/src/bin.js +309 -0
  140. package/dist/src/cli.js +5 -0
  141. package/dist/src/config.js +15 -0
  142. package/dist/src/core/docker.js +38 -0
  143. package/dist/src/core/index.js +130 -0
  144. package/dist/src/core/network.js +9 -0
  145. package/dist/src/core/ports.js +23 -0
  146. package/dist/src/core/process.js +31 -0
  147. package/dist/src/core/utils.js +11 -0
  148. package/dist/src/core/watchdog-runner.js +69 -0
  149. package/dist/src/core/watchdog.js +28 -0
  150. package/dist/src/docker/runtime.js +37 -0
  151. package/dist/src/docker-compose/index.js +16 -0
  152. package/dist/src/docker-compose/services/index.js +17 -0
  153. package/dist/src/environment.js +12 -0
  154. package/dist/src/index.js +122 -0
  155. package/dist/src/lint.js +3 -0
  156. package/dist/src/loader.js +25 -0
  157. package/dist/src/prisma.js +6 -0
  158. package/dist/src/types.js +0 -0
  159. package/dist/typecheck/index.d.ts +1 -0
  160. package/dist/typecheck/index.js +7 -0
  161. package/dist/typecheck/typecheck.d.ts +46 -0
  162. package/dist/types/all-types.d.ts +501 -0
  163. package/dist/types/cli.d.ts +1 -0
  164. package/dist/types/config.d.ts +6 -0
  165. package/dist/types/docker.d.ts +15 -0
  166. package/dist/types/environment.d.ts +8 -0
  167. package/dist/types/hooks.d.ts +9 -0
  168. package/dist/types/index.d.ts +1 -0
  169. package/dist/types/index.js +0 -0
  170. package/dist/types/prisma.d.ts +1 -0
  171. package/dist/types.d.ts +1 -399
  172. package/package.json +145 -140
  173. package/readme.md +349 -109
  174. package/src/cli/bin.ts +77 -0
  175. package/src/cli/commands/help.ts +39 -0
  176. package/src/cli/commands/runtime.ts +72 -0
  177. package/src/cli/commands/version.ts +4 -0
  178. package/src/cli/index.ts +1 -0
  179. package/{cli.ts → src/cli/run-cli.ts} +95 -6
  180. package/src/config/define-config.ts +30 -0
  181. package/src/config/index.ts +3 -0
  182. package/src/config/merge-configs.ts +33 -0
  183. package/src/config/validate-config.ts +136 -0
  184. package/{core → src/core}/index.ts +2 -2
  185. package/{core → src/core}/ports.ts +5 -2
  186. package/{core → src/core}/process.ts +6 -2
  187. package/src/core/tunnel.ts +151 -0
  188. package/{core → src/core}/utils.ts +1 -0
  189. package/{core → src/core}/watchdog.ts +5 -1
  190. package/src/docker/index.ts +1 -0
  191. package/{core/docker.ts → src/docker/runtime.ts} +11 -4
  192. package/src/docker-compose/generated-file.ts +45 -0
  193. package/src/docker-compose/index.ts +7 -0
  194. package/src/docker-compose/model.ts +197 -0
  195. package/src/docker-compose/services/clickhouse.ts +79 -0
  196. package/src/docker-compose/services/define-docker-service.ts +109 -0
  197. package/src/docker-compose/services/index.ts +67 -0
  198. package/src/docker-compose/services/postgres.ts +60 -0
  199. package/src/docker-compose/services/redis.ts +48 -0
  200. package/src/docker-compose/services/shared.ts +79 -0
  201. package/src/docker-compose/yaml.ts +88 -0
  202. package/{environment.ts → src/environment/create-dev-environment.ts} +93 -130
  203. package/src/environment/index.ts +1 -0
  204. package/src/environment/logging.ts +101 -0
  205. package/src/environment/seeding.ts +57 -0
  206. package/{index.ts → src/index.ts} +49 -20
  207. package/src/loader/cache.ts +23 -0
  208. package/src/loader/find-config-file.ts +29 -0
  209. package/src/loader/index.ts +17 -0
  210. package/src/loader/load-dev-env.ts +38 -0
  211. package/src/prisma/index.ts +1 -0
  212. package/{prisma.ts → src/prisma/prisma.ts} +4 -2
  213. package/src/typecheck/index.ts +1 -0
  214. package/{types.ts → src/types/all-types.ts} +130 -5
  215. package/src/types/index.ts +1 -0
  216. package/bin.ts +0 -192
  217. package/config.ts +0 -194
  218. package/loader.ts +0 -126
  219. /package/{core → src/core}/network.ts +0 -0
  220. /package/{core → src/core}/watchdog-runner.ts +0 -0
  221. /package/{lint.ts → src/typecheck/typecheck.ts} +0 -0
@@ -1,124 +1,145 @@
1
- import {
2
- calculatePortOffset,
3
- computePorts,
4
- computeUrls
5
- } from "./index-08wa79cs.js";
6
-
7
1
  // core/network.ts
8
2
  import { networkInterfaces } from "node:os";
3
+ import {
4
+ calculatePortOffset,
5
+ computePorts,
6
+ computeUrls,
7
+ } from "./index-08wa79cs.js";
9
8
 
10
9
  // core/utils.ts
11
10
  function sleep(ms) {
12
- return new Promise((resolve) => setTimeout(resolve, ms));
11
+ return new Promise((resolve) => setTimeout(resolve, ms));
13
12
  }
14
13
  function isCI() {
15
- return process.env.CI === "true" || process.env.CI === "1" || process.env.GITHUB_ACTIONS === "true" || process.env.GITLAB_CI === "true" || process.env.CIRCLECI === "true" || process.env.JENKINS_URL !== undefined;
14
+ return (
15
+ process.env.CI === "true" ||
16
+ process.env.CI === "1" ||
17
+ process.env.GITHUB_ACTIONS === "true" ||
18
+ process.env.GITLAB_CI === "true" ||
19
+ process.env.CIRCLECI === "true" ||
20
+ process.env.JENKINS_URL !== undefined
21
+ );
16
22
  }
17
23
  function logFrontendPort(port) {
18
- console.log(`using_frontend_port:${port}`);
24
+ console.log(`using_frontend_port:${port}`);
19
25
  }
20
26
  function getEnvVar(config, name, options = {}) {
21
- const { log = true } = options;
22
- const offset = calculatePortOffset();
23
- const localIp = getLocalIp();
24
- const ports = computePorts(config.services, config.apps, offset);
25
- const urls = computeUrls(config.services, config.apps, ports, localIp);
26
- const envVars = config.envVars?.(ports, urls, {
27
- projectName: config.projectPrefix,
28
- localIp,
29
- portOffset: offset
30
- });
31
- const value = envVars?.[name];
32
- if (log && name === "VITE_PORT" && typeof value === "number") {
33
- logFrontendPort(value);
34
- }
35
- return value;
27
+ const { log = true } = options;
28
+ const offset = calculatePortOffset();
29
+ const localIp = getLocalIp();
30
+ const ports = computePorts(config.services, config.apps, offset);
31
+ const urls = computeUrls(config.services, config.apps, ports, localIp);
32
+ const envVars = config.envVars?.(ports, urls, {
33
+ projectName: config.projectPrefix,
34
+ localIp,
35
+ portOffset: offset,
36
+ });
37
+ const value = envVars?.[name];
38
+ if (log && name === "VITE_PORT" && typeof value === "number") {
39
+ logFrontendPort(value);
40
+ }
41
+ return value;
36
42
  }
37
43
  function logApiUrl(url) {
38
- console.log(`using_api_url:${url}`);
44
+ console.log(`using_api_url:${url}`);
39
45
  }
40
46
  function logExpoApiUrl(url) {
41
- console.log(`using_expo_api_url:${url}`);
47
+ console.log(`using_expo_api_url:${url}`);
42
48
  }
43
49
 
44
50
  // core/network.ts
45
51
  function getLocalIp() {
46
- const interfaces = networkInterfaces();
47
- for (const name of Object.keys(interfaces)) {
48
- const nets = interfaces[name];
49
- if (!nets)
50
- continue;
51
- for (const net of nets) {
52
- if (net.family === "IPv4" && !net.internal) {
53
- return net.address;
54
- }
55
- }
56
- }
57
- return "127.0.0.1";
52
+ const interfaces = networkInterfaces();
53
+ for (const name of Object.keys(interfaces)) {
54
+ const nets = interfaces[name];
55
+ if (!nets) continue;
56
+ for (const net of nets) {
57
+ if (net.family === "IPv4" && !net.internal) {
58
+ return net.address;
59
+ }
60
+ }
61
+ }
62
+ return "127.0.0.1";
58
63
  }
59
64
  async function waitForServer(url, options = {}) {
60
- const { timeout = 30000, interval = 2000, verbose = false } = options;
61
- const start = Date.now();
62
- let attempts = 0;
63
- while (Date.now() - start < timeout) {
64
- attempts++;
65
- const controller = new AbortController;
66
- const timeoutId = setTimeout(() => controller.abort(), 5000);
67
- try {
68
- const response = await fetch(url, {
69
- signal: controller.signal
70
- });
71
- clearTimeout(timeoutId);
72
- if (response.ok || response.status === 404) {
73
- if (verbose) {
74
- console.log(` ✓ ${url} ready after ${attempts} attempts`);
75
- }
76
- return;
77
- }
78
- } catch {
79
- clearTimeout(timeoutId);
80
- if (verbose && attempts % 5 === 0) {
81
- console.log(` ⏳ Waiting for ${url}... (${Math.round((Date.now() - start) / 1000)}s)`);
82
- }
83
- }
84
- await sleep(interval);
85
- }
86
- throw new Error(`Server at ${url} did not respond within ${timeout}ms after ${attempts} attempts`);
65
+ const { timeout = 30000, interval = 2000, verbose = false } = options;
66
+ const start = Date.now();
67
+ let attempts = 0;
68
+ while (Date.now() - start < timeout) {
69
+ attempts++;
70
+ const controller = new AbortController();
71
+ const timeoutId = setTimeout(() => controller.abort(), 5000);
72
+ try {
73
+ const response = await fetch(url, {
74
+ signal: controller.signal,
75
+ });
76
+ clearTimeout(timeoutId);
77
+ if (response.ok || response.status === 404) {
78
+ if (verbose) {
79
+ console.log(` ✓ ${url} ready after ${attempts} attempts`);
80
+ }
81
+ return;
82
+ }
83
+ } catch {
84
+ clearTimeout(timeoutId);
85
+ if (verbose && attempts % 5 === 0) {
86
+ console.log(
87
+ ` ⏳ Waiting for ${url}... (${Math.round((Date.now() - start) / 1000)}s)`,
88
+ );
89
+ }
90
+ }
91
+ await sleep(interval);
92
+ }
93
+ throw new Error(
94
+ `Server at ${url} did not respond within ${timeout}ms after ${attempts} attempts`,
95
+ );
87
96
  }
88
97
  async function waitForDevServers(apps, ports, options = {}) {
89
- const { timeout = 60000, verbose = true } = options;
90
- if (verbose)
91
- console.log("⏳ Waiting for servers to be ready...");
92
- const promises = [];
93
- for (const [name, config] of Object.entries(apps)) {
94
- const port = ports[name];
95
- const healthPath = config.healthEndpoint ?? "/";
96
- const url = `http://localhost:${port}${healthPath}`;
97
- const appTimeout = config.healthTimeout ?? timeout;
98
- promises.push(waitForServer(url, { timeout: appTimeout, verbose }));
99
- }
100
- await Promise.all(promises);
101
- if (verbose)
102
- console.log("✓ All servers ready");
98
+ const { timeout = 60000, verbose = true } = options;
99
+ if (verbose) console.log("⏳ Waiting for servers to be ready...");
100
+ const promises = [];
101
+ for (const [name, config] of Object.entries(apps)) {
102
+ const port = ports[name];
103
+ const healthPath = config.healthEndpoint ?? "/";
104
+ const url = `http://localhost:${port}${healthPath}`;
105
+ const appTimeout = config.healthTimeout ?? timeout;
106
+ promises.push(waitForServer(url, { timeout: appTimeout, verbose }));
107
+ }
108
+ await Promise.all(promises);
109
+ if (verbose) console.log("✓ All servers ready");
103
110
  }
104
111
  async function isPortAvailable(port) {
105
- const controller = new AbortController;
106
- const timeoutId = setTimeout(() => controller.abort(), 500);
107
- try {
108
- const _response = await fetch(`http://localhost:${port}/`, {
109
- signal: controller.signal
110
- });
111
- clearTimeout(timeoutId);
112
- return false;
113
- } catch (error) {
114
- clearTimeout(timeoutId);
115
- if (error instanceof Error) {
116
- if (error.message.includes("ECONNREFUSED") || error.message.includes("fetch failed")) {
117
- return true;
118
- }
119
- }
120
- return true;
121
- }
112
+ const controller = new AbortController();
113
+ const timeoutId = setTimeout(() => controller.abort(), 500);
114
+ try {
115
+ const _response = await fetch(`http://localhost:${port}/`, {
116
+ signal: controller.signal,
117
+ });
118
+ clearTimeout(timeoutId);
119
+ return false;
120
+ } catch (error) {
121
+ clearTimeout(timeoutId);
122
+ if (error instanceof Error) {
123
+ if (
124
+ error.message.includes("ECONNREFUSED") ||
125
+ error.message.includes("fetch failed")
126
+ ) {
127
+ return true;
128
+ }
129
+ }
130
+ return true;
131
+ }
122
132
  }
123
133
 
124
- export { getLocalIp, waitForServer, waitForDevServers, isPortAvailable, sleep, isCI, logFrontendPort, getEnvVar, logApiUrl, logExpoApiUrl };
134
+ export {
135
+ getLocalIp,
136
+ waitForServer,
137
+ waitForDevServers,
138
+ isPortAvailable,
139
+ sleep,
140
+ isCI,
141
+ logFrontendPort,
142
+ getEnvVar,
143
+ logApiUrl,
144
+ logExpoApiUrl,
145
+ };
@@ -1,143 +1,142 @@
1
+ // cli.ts
2
+ import { spawn } from "node:child_process";
3
+ import { __require } from "./index-qnx9j3qa.js";
1
4
  import {
2
- spawnWatchdog,
3
- startHeartbeat,
4
- stopHeartbeat
5
+ spawnWatchdog,
6
+ startHeartbeat,
7
+ stopHeartbeat,
5
8
  } from "./index-vhs88xhe.js";
6
- import {
7
- __require
8
- } from "./index-qnx9j3qa.js";
9
9
 
10
- // cli.ts
11
- import { spawn } from "node:child_process";
12
10
  async function runCli(env, options = {}) {
13
- const {
14
- args = process.argv.slice(2),
15
- watchdog = true,
16
- watchdogTimeout = 10,
17
- devServersCommand
18
- } = options;
19
- env.logInfo();
20
- if (args.includes("--lint")) {
21
- const { runWorkspaceTypecheck } = await import("./lint.js");
22
- const result = await runWorkspaceTypecheck({
23
- root: env.root,
24
- verbose: true
25
- });
26
- process.exit(result.success ? 0 : 1);
27
- }
28
- if (args.includes("--down")) {
29
- await env.stop();
30
- process.exit(0);
31
- }
32
- if (args.includes("--reset")) {
33
- await env.stop({ removeVolumes: true });
34
- process.exit(0);
35
- }
36
- const running = await env.isRunning();
37
- if (running) {
38
- console.log("✓ Containers already running");
39
- } else {
40
- await env.start({ startServers: false, wait: true });
41
- }
42
- if (args.includes("--migrate")) {
43
- console.log("");
44
- console.log("✅ Migrations applied successfully");
45
- process.exit(0);
46
- }
47
- if (args.includes("--seed")) {
48
- console.log("\uD83C\uDF31 Running seeders...");
49
- const result = await env.exec("bun run run:seeder", {
50
- throwOnError: false
51
- });
52
- if (result.exitCode !== 0) {
53
- console.error("❌ Seeding failed");
54
- process.exit(1);
55
- }
56
- console.log("");
57
- console.log("✅ Seeding complete");
58
- process.exit(0);
59
- }
60
- if (args.includes("--up-only")) {
61
- console.log("");
62
- console.log("✅ Containers started. Environment ready.");
63
- console.log("");
64
- process.exit(0);
65
- }
66
- if (watchdog) {
67
- await spawnWatchdog(env.projectName, env.root, {
68
- timeoutMinutes: watchdogTimeout,
69
- verbose: true
70
- });
71
- startHeartbeat(env.projectName);
72
- }
73
- const command = devServersCommand ?? buildDevServersCommand(env.apps);
74
- if (!command) {
75
- console.log("✅ Containers ready. No apps configured.");
76
- await new Promise(() => {});
77
- return;
78
- }
79
- console.log("");
80
- console.log("\uD83D\uDD27 Starting dev servers...");
81
- console.log("");
82
- await runCommand(command, env.root, env.buildEnvVars());
83
- stopHeartbeat();
11
+ const {
12
+ args = process.argv.slice(2),
13
+ watchdog = true,
14
+ watchdogTimeout = 10,
15
+ devServersCommand,
16
+ } = options;
17
+ env.logInfo();
18
+ if (args.includes("--lint")) {
19
+ const { runWorkspaceTypecheck } = await import("./lint.js");
20
+ const result = await runWorkspaceTypecheck({
21
+ root: env.root,
22
+ verbose: true,
23
+ });
24
+ process.exit(result.success ? 0 : 1);
25
+ }
26
+ if (args.includes("--down")) {
27
+ await env.stop();
28
+ process.exit(0);
29
+ }
30
+ if (args.includes("--reset")) {
31
+ await env.stop({ removeVolumes: true });
32
+ process.exit(0);
33
+ }
34
+ const running = await env.isRunning();
35
+ if (running) {
36
+ console.log("✓ Containers already running");
37
+ } else {
38
+ await env.start({ startServers: false, wait: true });
39
+ }
40
+ if (args.includes("--migrate")) {
41
+ console.log("");
42
+ console.log("✅ Migrations applied successfully");
43
+ process.exit(0);
44
+ }
45
+ if (args.includes("--seed")) {
46
+ console.log("\uD83C\uDF31 Running seeders...");
47
+ const result = await env.exec("bun run run:seeder", {
48
+ throwOnError: false,
49
+ });
50
+ if (result.exitCode !== 0) {
51
+ console.error("❌ Seeding failed");
52
+ process.exit(1);
53
+ }
54
+ console.log("");
55
+ console.log("✅ Seeding complete");
56
+ process.exit(0);
57
+ }
58
+ if (args.includes("--up-only")) {
59
+ console.log("");
60
+ console.log("✅ Containers started. Environment ready.");
61
+ console.log("");
62
+ process.exit(0);
63
+ }
64
+ if (watchdog) {
65
+ await spawnWatchdog(env.projectName, env.root, {
66
+ timeoutMinutes: watchdogTimeout,
67
+ verbose: true,
68
+ });
69
+ startHeartbeat(env.projectName);
70
+ }
71
+ const command = devServersCommand ?? buildDevServersCommand(env.apps);
72
+ if (!command) {
73
+ console.log("✅ Containers ready. No apps configured.");
74
+ await new Promise(() => {});
75
+ return;
76
+ }
77
+ console.log("");
78
+ console.log("\uD83D\uDD27 Starting dev servers...");
79
+ console.log("");
80
+ await runCommand(command, env.root, env.buildEnvVars());
81
+ stopHeartbeat();
84
82
  }
85
83
  function buildDevServersCommand(apps) {
86
- const appEntries = Object.entries(apps);
87
- if (appEntries.length === 0)
88
- return null;
89
- const commands = [];
90
- const names = [];
91
- const colors = ["blue", "green", "yellow", "magenta", "cyan", "red"];
92
- for (const [name, config] of appEntries) {
93
- names.push(name);
94
- const cwdPart = config.cwd ? `--cwd ${config.cwd}` : "";
95
- commands.push(`"bun run ${cwdPart} ${config.devCommand}"`.replace(/\s+/g, " ").trim());
96
- }
97
- const namesArg = `-n ${names.join(",")}`;
98
- const colorsArg = `-c ${colors.slice(0, names.length).join(",")}`;
99
- const commandsArg = commands.join(" ");
100
- return `bun concurrently ${namesArg} ${colorsArg} ${commandsArg}`;
84
+ const appEntries = Object.entries(apps);
85
+ if (appEntries.length === 0) return null;
86
+ const commands = [];
87
+ const names = [];
88
+ const colors = ["blue", "green", "yellow", "magenta", "cyan", "red"];
89
+ for (const [name, config] of appEntries) {
90
+ names.push(name);
91
+ const cwdPart = config.cwd ? `--cwd ${config.cwd}` : "";
92
+ commands.push(
93
+ `"bun run ${cwdPart} ${config.devCommand}"`.replace(/\s+/g, " ").trim(),
94
+ );
95
+ }
96
+ const namesArg = `-n ${names.join(",")}`;
97
+ const colorsArg = `-c ${colors.slice(0, names.length).join(",")}`;
98
+ const commandsArg = commands.join(" ");
99
+ return `bun concurrently ${namesArg} ${colorsArg} ${commandsArg}`;
101
100
  }
102
101
  function runCommand(command, cwd, envVars) {
103
- return new Promise((resolve, reject) => {
104
- const proc = spawn(command, [], {
105
- cwd,
106
- env: { ...process.env, ...envVars },
107
- stdio: "inherit",
108
- shell: true
109
- });
110
- proc.on("close", (code) => {
111
- if (code === 0 || code === null) {
112
- resolve();
113
- } else {
114
- reject(new Error(`Command exited with code ${code}`));
115
- }
116
- });
117
- proc.on("error", reject);
118
- const cleanup = () => {
119
- proc.kill("SIGTERM");
120
- };
121
- process.on("SIGINT", cleanup);
122
- process.on("SIGTERM", cleanup);
123
- });
102
+ return new Promise((resolve, reject) => {
103
+ const proc = spawn(command, [], {
104
+ cwd,
105
+ env: { ...process.env, ...envVars },
106
+ stdio: "inherit",
107
+ shell: true,
108
+ });
109
+ proc.on("close", (code) => {
110
+ if (code === 0 || code === null) {
111
+ resolve();
112
+ } else {
113
+ reject(new Error(`Command exited with code ${code}`));
114
+ }
115
+ });
116
+ proc.on("error", reject);
117
+ const cleanup = () => {
118
+ proc.kill("SIGTERM");
119
+ };
120
+ process.on("SIGINT", cleanup);
121
+ process.on("SIGTERM", cleanup);
122
+ });
124
123
  }
125
124
  function hasFlag(args, flag) {
126
- return args.includes(flag);
125
+ return args.includes(flag);
127
126
  }
128
127
  function getFlagValue(args, flag) {
129
- const prefixed = args.find((arg) => arg.startsWith(`${flag}=`));
130
- if (prefixed) {
131
- return prefixed.split("=")[1];
132
- }
133
- const index = args.indexOf(flag);
134
- if (index !== -1 && index + 1 < args.length) {
135
- const nextArg = args[index + 1];
136
- if (nextArg !== undefined && !nextArg.startsWith("-")) {
137
- return nextArg;
138
- }
139
- }
140
- return;
128
+ const prefixed = args.find((arg) => arg.startsWith(`${flag}=`));
129
+ if (prefixed) {
130
+ return prefixed.split("=")[1];
131
+ }
132
+ const index = args.indexOf(flag);
133
+ if (index !== -1 && index + 1 < args.length) {
134
+ const nextArg = args[index + 1];
135
+ if (nextArg !== undefined && !nextArg.startsWith("-")) {
136
+ return nextArg;
137
+ }
138
+ }
139
+ return;
141
140
  }
142
141
 
143
142
  export { runCli, hasFlag, getFlagValue };