buncargo 1.0.29 → 3.2.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 (246) 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 +317 -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 +30 -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/quick-tunnel/cloudflared-process.d.ts +10 -0
  29. package/dist/core/quick-tunnel/constants.d.ts +9 -0
  30. package/dist/core/quick-tunnel/index.d.ts +17 -0
  31. package/dist/core/quick-tunnel/install.d.ts +1 -0
  32. package/dist/core/tunnel.d.ts +34 -0
  33. package/dist/core/utils.js +2 -2
  34. package/dist/core/watchdog-runner.js +45 -42
  35. package/dist/core/watchdog.d.ts +1 -0
  36. package/dist/core/watchdog.js +4 -2
  37. package/dist/docker/index.d.ts +1 -0
  38. package/dist/docker/index.js +38 -0
  39. package/dist/docker/runtime.d.ts +87 -0
  40. package/dist/docker/runtime.js +37 -0
  41. package/dist/docker-compose/compose.d.ts +1 -0
  42. package/dist/docker-compose/generated-file.d.ts +7 -0
  43. package/dist/docker-compose/index.d.ts +3 -0
  44. package/dist/docker-compose/index.js +15 -0
  45. package/dist/docker-compose/model.d.ts +6 -0
  46. package/dist/docker-compose/services/clickhouse.d.ts +16 -0
  47. package/dist/docker-compose/services/define-docker-service.d.ts +41 -0
  48. package/dist/docker-compose/services/index.d.ts +23 -0
  49. package/dist/docker-compose/services/index.js +17 -0
  50. package/dist/docker-compose/services/postgres.d.ts +12 -0
  51. package/dist/docker-compose/services/redis.d.ts +12 -0
  52. package/dist/docker-compose/services/shared.d.ts +7 -0
  53. package/dist/docker-compose/yaml.d.ts +2 -0
  54. package/dist/environment/create-dev-environment.d.ts +23 -0
  55. package/dist/environment/index.d.ts +1 -0
  56. package/dist/environment/index.js +15 -0
  57. package/dist/environment/logging.d.ts +17 -0
  58. package/dist/environment/only-apps.d.ts +10 -0
  59. package/dist/environment/seeding.d.ts +9 -0
  60. package/dist/environment.d.ts +1 -23
  61. package/dist/environment.js +12 -14
  62. package/dist/index-045jksh5.js +147 -0
  63. package/dist/index-08wa79cs.js +125 -117
  64. package/dist/index-0kxnae3z.js +335 -0
  65. package/dist/index-1mdrf7nz.js +51 -43
  66. package/dist/index-1yvbwj4k.js +262 -242
  67. package/dist/index-23ev345g.js +475 -0
  68. package/dist/index-2ckr49sf.js +228 -0
  69. package/dist/index-2f47khe5.js +376 -369
  70. package/dist/index-2fr3g85b.js +220 -183
  71. package/dist/index-38xnzpa6.js +450 -0
  72. package/dist/index-3eyrdxw9.js +577 -0
  73. package/dist/index-3h3dhtf2.js +51 -43
  74. package/dist/index-42x95209.js +51 -43
  75. package/dist/index-4gp0az1g.js +145 -0
  76. package/dist/index-4xrxh8yv.js +72 -0
  77. package/dist/index-5aq985p4.js +250 -0
  78. package/dist/index-5gmws6ah.js +181 -0
  79. package/dist/index-5hka0tff.js +78 -76
  80. package/dist/index-5rfqps4b.js +3 -0
  81. package/dist/index-5t9jxqm0.js +428 -0
  82. package/dist/index-6c1w1xk5.js +101 -0
  83. package/dist/index-6cmex7m5.js +72 -0
  84. package/dist/index-6d6x175r.js +572 -0
  85. package/dist/index-6fm7mvwj.js +118 -97
  86. package/dist/index-6srpc523.js +127 -128
  87. package/dist/index-731rzzfp.js +157 -142
  88. package/dist/index-75y4cg2z.js +51 -43
  89. package/dist/index-7ja4ywyj.js +126 -127
  90. package/dist/index-7v19es2e.js +666 -0
  91. package/dist/index-8bw1cmz4.js +531 -0
  92. package/dist/index-8hbbj1mp.js +120 -121
  93. package/dist/index-8xj2p5n5.js +118 -97
  94. package/dist/index-9wyhzw0h.js +574 -0
  95. package/dist/index-ag90ry8t.js +576 -0
  96. package/dist/index-bj79tw5w.js +0 -0
  97. package/dist/index-bnk6nr0g.js +73 -0
  98. package/dist/index-brbbzyks.js +72 -0
  99. package/dist/index-byeqyjrz.js +72 -0
  100. package/dist/index-c0dr6mcv.js +123 -0
  101. package/dist/index-cty0bcry.js +235 -218
  102. package/dist/index-d8tyv5se.js +228 -0
  103. package/dist/index-d9efy0n4.js +176 -150
  104. package/dist/index-enj4zdma.js +574 -0
  105. package/dist/index-etfmqjjf.js +427 -0
  106. package/dist/index-fb29934k.js +172 -0
  107. package/dist/index-g50jw1yf.js +72 -0
  108. package/dist/index-g6eb5wdw.js +118 -117
  109. package/dist/index-ggq3yryx.js +99 -95
  110. package/dist/index-h70tce00.js +177 -0
  111. package/dist/index-hkxtfqtc.js +333 -0
  112. package/dist/index-k370bech.js +72 -0
  113. package/dist/index-kf3dhser.js +146 -143
  114. package/dist/index-ma6tgdb2.js +500 -0
  115. package/dist/index-mam0bcyz.js +123 -0
  116. package/dist/index-mm412dkp.js +274 -0
  117. package/dist/index-n8v18aeb.js +0 -0
  118. package/dist/index-ndnmnsej.js +378 -371
  119. package/dist/index-p8wty0e2.js +389 -379
  120. package/dist/index-qa8akv6y.js +666 -0
  121. package/dist/index-qfphr2fd.js +78 -76
  122. package/dist/index-qqmms8rs.js +51 -43
  123. package/dist/index-qw4093g2.js +51 -43
  124. package/dist/index-qzwpzjbx.js +121 -122
  125. package/dist/index-segbnm0h.js +146 -143
  126. package/dist/index-t0fj6gg1.js +112 -0
  127. package/dist/index-thdkwnv7.js +122 -0
  128. package/dist/index-tjbx2r2t.js +270 -0
  129. package/dist/index-tjqw9vtj.js +62 -54
  130. package/dist/index-vbpb89jy.js +248 -0
  131. package/dist/index-vg55rq0y.js +250 -0
  132. package/dist/index-vhs88xhe.js +99 -95
  133. package/dist/index-vs81yaks.js +244 -0
  134. package/dist/index-w8zxnjka.js +249 -0
  135. package/dist/index-wk2na3t9.js +385 -375
  136. package/dist/index-wz9x8g7z.js +383 -373
  137. package/dist/index-x249gyde.js +388 -378
  138. package/dist/index-x54nbgs7.js +355 -0
  139. package/dist/index-xkvd0nsd.js +187 -0
  140. package/dist/index-yedqxm1z.js +80 -0
  141. package/dist/index-yz4jfz7z.js +338 -0
  142. package/dist/index-zfjzzjkf.js +240 -199
  143. package/dist/index.d.ts +12 -8
  144. package/dist/index.js +56 -34
  145. package/dist/lint.d.ts +1 -46
  146. package/dist/lint.js +3 -7
  147. package/dist/loader/cache.d.ts +4 -0
  148. package/dist/loader/find-config-file.d.ts +2 -0
  149. package/dist/loader/index.d.ts +5 -0
  150. package/dist/loader/index.js +24 -0
  151. package/dist/loader/load-dev-env.d.ts +5 -0
  152. package/dist/loader/loader.d.ts +1 -0
  153. package/dist/loader.d.ts +1 -45
  154. package/dist/loader.js +22 -20
  155. package/dist/prisma/index.d.ts +1 -0
  156. package/dist/prisma/prisma.d.ts +29 -0
  157. package/dist/prisma.d.ts +1 -29
  158. package/dist/prisma.js +6 -10
  159. package/dist/src/bin.js +309 -0
  160. package/dist/src/cli.js +5 -0
  161. package/dist/src/config.js +15 -0
  162. package/dist/src/core/docker.js +38 -0
  163. package/dist/src/core/index.js +130 -0
  164. package/dist/src/core/network.js +9 -0
  165. package/dist/src/core/ports.js +23 -0
  166. package/dist/src/core/process.js +31 -0
  167. package/dist/src/core/utils.js +11 -0
  168. package/dist/src/core/watchdog-runner.js +69 -0
  169. package/dist/src/core/watchdog.js +28 -0
  170. package/dist/src/docker/runtime.js +37 -0
  171. package/dist/src/docker-compose/index.js +16 -0
  172. package/dist/src/docker-compose/services/index.js +17 -0
  173. package/dist/src/environment.js +12 -0
  174. package/dist/src/index.js +122 -0
  175. package/dist/src/lint.js +3 -0
  176. package/dist/src/loader.js +25 -0
  177. package/dist/src/prisma.js +6 -0
  178. package/dist/src/types.js +0 -0
  179. package/dist/typecheck/index.d.ts +1 -0
  180. package/dist/typecheck/index.js +7 -0
  181. package/dist/typecheck/typecheck.d.ts +46 -0
  182. package/dist/types/all-types.d.ts +544 -0
  183. package/dist/types/cli.d.ts +1 -0
  184. package/dist/types/config.d.ts +6 -0
  185. package/dist/types/docker.d.ts +15 -0
  186. package/dist/types/environment.d.ts +8 -0
  187. package/dist/types/hooks.d.ts +9 -0
  188. package/dist/types/index.d.ts +1 -0
  189. package/dist/types/index.js +0 -0
  190. package/dist/types/prisma.d.ts +1 -0
  191. package/dist/types.d.ts +1 -399
  192. package/package.json +55 -48
  193. package/readme.md +365 -109
  194. package/src/cli/bin.ts +77 -0
  195. package/src/cli/commands/help.ts +39 -0
  196. package/src/cli/commands/runtime.ts +72 -0
  197. package/src/cli/commands/version.ts +4 -0
  198. package/src/cli/index.ts +1 -0
  199. package/{cli.ts → src/cli/run-cli.ts} +114 -10
  200. package/src/config/define-config.ts +30 -0
  201. package/src/config/index.ts +3 -0
  202. package/src/config/merge-configs.ts +33 -0
  203. package/src/config/validate-config.ts +136 -0
  204. package/{core → src/core}/index.ts +2 -2
  205. package/{core → src/core}/ports.ts +5 -2
  206. package/{core → src/core}/process.ts +6 -2
  207. package/src/core/quick-tunnel/cloudflared-process.ts +83 -0
  208. package/src/core/quick-tunnel/constants.ts +31 -0
  209. package/src/core/quick-tunnel/index.ts +96 -0
  210. package/src/core/quick-tunnel/install.ts +160 -0
  211. package/src/core/tunnel.ts +165 -0
  212. package/{core → src/core}/utils.ts +1 -0
  213. package/{core → src/core}/watchdog.ts +5 -1
  214. package/src/docker/index.ts +1 -0
  215. package/{core/docker.ts → src/docker/runtime.ts} +11 -4
  216. package/src/docker-compose/generated-file.ts +45 -0
  217. package/src/docker-compose/index.ts +7 -0
  218. package/src/docker-compose/model.ts +197 -0
  219. package/src/docker-compose/services/clickhouse.ts +79 -0
  220. package/src/docker-compose/services/define-docker-service.ts +109 -0
  221. package/src/docker-compose/services/index.ts +67 -0
  222. package/src/docker-compose/services/postgres.ts +60 -0
  223. package/src/docker-compose/services/redis.ts +48 -0
  224. package/src/docker-compose/services/shared.ts +79 -0
  225. package/src/docker-compose/yaml.ts +88 -0
  226. package/{environment.ts → src/environment/create-dev-environment.ts} +214 -141
  227. package/src/environment/index.ts +1 -0
  228. package/src/environment/logging.ts +115 -0
  229. package/src/environment/only-apps.ts +34 -0
  230. package/src/environment/seeding.ts +57 -0
  231. package/{index.ts → src/index.ts} +52 -20
  232. package/src/loader/cache.ts +23 -0
  233. package/src/loader/find-config-file.ts +29 -0
  234. package/src/loader/index.ts +17 -0
  235. package/src/loader/load-dev-env.ts +38 -0
  236. package/src/prisma/index.ts +1 -0
  237. package/{prisma.ts → src/prisma/prisma.ts} +4 -2
  238. package/src/typecheck/index.ts +1 -0
  239. package/{types.ts → src/types/all-types.ts} +186 -8
  240. package/src/types/index.ts +1 -0
  241. package/bin.ts +0 -192
  242. package/config.ts +0 -194
  243. package/loader.ts +0 -126
  244. /package/{core → src/core}/network.ts +0 -0
  245. /package/{core → src/core}/watchdog-runner.ts +0 -0
  246. /package/{lint.ts → src/typecheck/typecheck.ts} +0 -0
@@ -1,225 +1,266 @@
1
- import {
2
- sleep
3
- } from "./index-8xj2p5n5.js";
4
-
5
1
  // core/docker.ts
6
2
  import { execSync } from "node:child_process";
3
+ import { sleep } from "./index-8xj2p5n5.js";
4
+
7
5
  var POLL_INTERVAL = 250;
8
6
  var MAX_ATTEMPTS = 120;
9
- var DOCKER_NOT_RUNNING_MESSAGE = "Docker is not running. Please start Docker and try again.";
7
+ var DOCKER_NOT_RUNNING_MESSAGE =
8
+ "Docker is not running. Please start Docker and try again.";
10
9
  async function isContainerRunning(project, service) {
11
- try {
12
- const result = execSync(`docker ps --filter "label=com.docker.compose.project=${project}" --filter "label=com.docker.compose.service=${service}" --format "{{.State}}"`, { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] });
13
- return result.trim() === "running";
14
- } catch {
15
- return false;
16
- }
10
+ try {
11
+ const result = execSync(
12
+ `docker ps --filter "label=com.docker.compose.project=${project}" --filter "label=com.docker.compose.service=${service}" --format "{{.State}}"`,
13
+ { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] },
14
+ );
15
+ return result.trim() === "running";
16
+ } catch {
17
+ return false;
18
+ }
17
19
  }
18
20
  function isDockerRunning() {
19
- try {
20
- execSync('docker info --format "{{.ServerVersion}}"', {
21
- encoding: "utf-8",
22
- stdio: ["pipe", "pipe", "pipe"]
23
- });
24
- return true;
25
- } catch {
26
- return false;
27
- }
21
+ try {
22
+ execSync('docker info --format "{{.ServerVersion}}"', {
23
+ encoding: "utf-8",
24
+ stdio: ["pipe", "pipe", "pipe"],
25
+ });
26
+ return true;
27
+ } catch {
28
+ return false;
29
+ }
28
30
  }
29
31
  function assertDockerRunning() {
30
- if (!isDockerRunning()) {
31
- throw new Error(DOCKER_NOT_RUNNING_MESSAGE);
32
- }
32
+ if (!isDockerRunning()) {
33
+ throw new Error(DOCKER_NOT_RUNNING_MESSAGE);
34
+ }
33
35
  }
34
36
  async function areContainersRunning(project, minCount = 1) {
35
- try {
36
- const result = execSync(`docker ps --filter "label=com.docker.compose.project=${project}" --format "{{.State}}"`, { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] });
37
- const states = result.trim().split(`
38
- `).filter(Boolean);
39
- if (states.length < minCount)
40
- return false;
41
- return states.every((state) => state === "running");
42
- } catch {
43
- return false;
44
- }
37
+ try {
38
+ const result = execSync(
39
+ `docker ps --filter "label=com.docker.compose.project=${project}" --format "{{.State}}"`,
40
+ { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] },
41
+ );
42
+ const states = result
43
+ .trim()
44
+ .split(`
45
+ `)
46
+ .filter(Boolean);
47
+ if (states.length < minCount) return false;
48
+ return states.every((state) => state === "running");
49
+ } catch {
50
+ return false;
51
+ }
45
52
  }
46
53
  function startContainers(root, projectName, envVars, options = {}) {
47
- const { verbose = true, wait = true, composeFile } = options;
48
- assertDockerRunning();
49
- if (verbose)
50
- console.log("\uD83D\uDC33 Starting Docker containers...");
51
- const composeArg = composeFile ? `-f ${composeFile}` : "";
52
- const waitFlag = wait ? "--wait" : "";
53
- const cmd = `docker compose ${composeArg} up -d ${waitFlag}`.trim();
54
- execSync(cmd, {
55
- cwd: root,
56
- env: { ...process.env, ...envVars, COMPOSE_PROJECT_NAME: projectName },
57
- stdio: verbose ? "inherit" : "ignore"
58
- });
59
- if (verbose)
60
- console.log("✓ Containers started");
54
+ const { verbose = true, wait = true, composeFile } = options;
55
+ assertDockerRunning();
56
+ if (verbose) console.log("\uD83D\uDC33 Starting Docker containers...");
57
+ const composeArg = composeFile ? `-f ${composeFile}` : "";
58
+ const waitFlag = wait ? "--wait" : "";
59
+ const cmd = `docker compose ${composeArg} up -d ${waitFlag}`.trim();
60
+ execSync(cmd, {
61
+ cwd: root,
62
+ env: { ...process.env, ...envVars, COMPOSE_PROJECT_NAME: projectName },
63
+ stdio: verbose ? "inherit" : "ignore",
64
+ });
65
+ if (verbose) console.log("✓ Containers started");
61
66
  }
62
67
  function stopContainers(root, projectName, options = {}) {
63
- const { verbose = true, removeVolumes = false, composeFile } = options;
64
- assertDockerRunning();
65
- if (verbose) {
66
- console.log(removeVolumes ? "\uD83D\uDDD1️ Stopping containers and removing volumes..." : "\uD83D\uDED1 Stopping containers...");
67
- }
68
- const composeArg = composeFile ? `-f ${composeFile}` : "";
69
- const volumeFlag = removeVolumes ? "-v" : "";
70
- const cmd = `docker compose ${composeArg} down ${volumeFlag}`.trim();
71
- execSync(cmd, {
72
- cwd: root,
73
- env: { ...process.env, COMPOSE_PROJECT_NAME: projectName },
74
- stdio: verbose ? "inherit" : "ignore"
75
- });
76
- if (verbose)
77
- console.log("✓ Containers stopped");
68
+ const { verbose = true, removeVolumes = false, composeFile } = options;
69
+ assertDockerRunning();
70
+ if (verbose) {
71
+ console.log(
72
+ removeVolumes
73
+ ? "\uD83D\uDDD1️ Stopping containers and removing volumes..."
74
+ : "\uD83D\uDED1 Stopping containers...",
75
+ );
76
+ }
77
+ const composeArg = composeFile ? `-f ${composeFile}` : "";
78
+ const volumeFlag = removeVolumes ? "-v" : "";
79
+ const cmd = `docker compose ${composeArg} down ${volumeFlag}`.trim();
80
+ execSync(cmd, {
81
+ cwd: root,
82
+ env: { ...process.env, COMPOSE_PROJECT_NAME: projectName },
83
+ stdio: verbose ? "inherit" : "ignore",
84
+ });
85
+ if (verbose) console.log("✓ Containers stopped");
78
86
  }
79
87
  function startService(root, projectName, serviceName, envVars, options = {}) {
80
- const { verbose = true, composeFile } = options;
81
- assertDockerRunning();
82
- if (verbose)
83
- console.log(`\uD83D\uDC33 Starting ${serviceName}...`);
84
- const composeArg = composeFile ? `-f ${composeFile}` : "";
85
- const cmd = `docker compose ${composeArg} up -d ${serviceName}`.trim();
86
- execSync(cmd, {
87
- cwd: root,
88
- env: { ...process.env, ...envVars, COMPOSE_PROJECT_NAME: projectName },
89
- stdio: verbose ? "inherit" : "ignore"
90
- });
88
+ const { verbose = true, composeFile } = options;
89
+ assertDockerRunning();
90
+ if (verbose) console.log(`\uD83D\uDC33 Starting ${serviceName}...`);
91
+ const composeArg = composeFile ? `-f ${composeFile}` : "";
92
+ const cmd = `docker compose ${composeArg} up -d ${serviceName}`.trim();
93
+ execSync(cmd, {
94
+ cwd: root,
95
+ env: { ...process.env, ...envVars, COMPOSE_PROJECT_NAME: projectName },
96
+ stdio: verbose ? "inherit" : "ignore",
97
+ });
91
98
  }
92
99
  function createBuiltInHealthCheck(type, serviceName, context = {}) {
93
- const { projectName, root } = context;
94
- switch (type) {
95
- case "pg_isready":
96
- return async () => {
97
- try {
98
- const projectArg = projectName ? `-p ${projectName}` : "";
99
- execSync(`docker compose ${projectArg} exec -T ${serviceName} pg_isready -U postgres`, {
100
- cwd: root,
101
- stdio: ["pipe", "pipe", "pipe"]
102
- });
103
- return true;
104
- } catch {
105
- return false;
106
- }
107
- };
108
- case "redis-cli":
109
- return async () => {
110
- try {
111
- const projectArg = projectName ? `-p ${projectName}` : "";
112
- execSync(`docker compose ${projectArg} exec -T ${serviceName} redis-cli ping`, {
113
- cwd: root,
114
- stdio: ["pipe", "pipe", "pipe"]
115
- });
116
- return true;
117
- } catch {
118
- return false;
119
- }
120
- };
121
- case "http":
122
- return async (port) => {
123
- try {
124
- const controller = new AbortController;
125
- const timeoutId = setTimeout(() => controller.abort(), 2000);
126
- try {
127
- const response = await fetch(`http://localhost:${port}/`, {
128
- signal: controller.signal
129
- });
130
- clearTimeout(timeoutId);
131
- return response.ok || response.status === 404;
132
- } catch {
133
- clearTimeout(timeoutId);
134
- return false;
135
- }
136
- } catch {
137
- return false;
138
- }
139
- };
140
- case "tcp":
141
- return async (port) => {
142
- try {
143
- const controller = new AbortController;
144
- const timeoutId = setTimeout(() => controller.abort(), 1000);
145
- try {
146
- await fetch(`http://localhost:${port}/`, {
147
- signal: controller.signal
148
- });
149
- clearTimeout(timeoutId);
150
- return true;
151
- } catch (error) {
152
- clearTimeout(timeoutId);
153
- if (error instanceof Error && error.message.includes("ECONNREFUSED")) {
154
- return false;
155
- }
156
- return true;
157
- }
158
- } catch {
159
- return false;
160
- }
161
- };
162
- default:
163
- return async () => true;
164
- }
100
+ const { projectName, root } = context;
101
+ switch (type) {
102
+ case "pg_isready":
103
+ return async () => {
104
+ try {
105
+ const projectArg = projectName ? `-p ${projectName}` : "";
106
+ execSync(
107
+ `docker compose ${projectArg} exec -T ${serviceName} pg_isready -U postgres`,
108
+ {
109
+ cwd: root,
110
+ stdio: ["pipe", "pipe", "pipe"],
111
+ },
112
+ );
113
+ return true;
114
+ } catch {
115
+ return false;
116
+ }
117
+ };
118
+ case "redis-cli":
119
+ return async () => {
120
+ try {
121
+ const projectArg = projectName ? `-p ${projectName}` : "";
122
+ execSync(
123
+ `docker compose ${projectArg} exec -T ${serviceName} redis-cli ping`,
124
+ {
125
+ cwd: root,
126
+ stdio: ["pipe", "pipe", "pipe"],
127
+ },
128
+ );
129
+ return true;
130
+ } catch {
131
+ return false;
132
+ }
133
+ };
134
+ case "http":
135
+ return async (port) => {
136
+ try {
137
+ const controller = new AbortController();
138
+ const timeoutId = setTimeout(() => controller.abort(), 2000);
139
+ try {
140
+ const response = await fetch(`http://localhost:${port}/`, {
141
+ signal: controller.signal,
142
+ });
143
+ clearTimeout(timeoutId);
144
+ return response.ok || response.status === 404;
145
+ } catch {
146
+ clearTimeout(timeoutId);
147
+ return false;
148
+ }
149
+ } catch {
150
+ return false;
151
+ }
152
+ };
153
+ case "tcp":
154
+ return async (port) => {
155
+ try {
156
+ const controller = new AbortController();
157
+ const timeoutId = setTimeout(() => controller.abort(), 1000);
158
+ try {
159
+ await fetch(`http://localhost:${port}/`, {
160
+ signal: controller.signal,
161
+ });
162
+ clearTimeout(timeoutId);
163
+ return true;
164
+ } catch (error) {
165
+ clearTimeout(timeoutId);
166
+ if (
167
+ error instanceof Error &&
168
+ error.message.includes("ECONNREFUSED")
169
+ ) {
170
+ return false;
171
+ }
172
+ return true;
173
+ }
174
+ } catch {
175
+ return false;
176
+ }
177
+ };
178
+ default:
179
+ return async () => true;
180
+ }
165
181
  }
166
182
  async function waitForService(serviceName, config, port, options = {}) {
167
- const {
168
- maxAttempts = MAX_ATTEMPTS,
169
- pollInterval = POLL_INTERVAL,
170
- projectName,
171
- root
172
- } = options;
173
- if (config.healthCheck === false || config.healthCheck === undefined) {
174
- return;
175
- }
176
- const healthCheckFn = typeof config.healthCheck === "function" ? config.healthCheck : createBuiltInHealthCheck(config.healthCheck, config.serviceName ?? serviceName, { projectName, root });
177
- for (let i = 0;i < maxAttempts; i++) {
178
- const isHealthy = await healthCheckFn(port);
179
- if (isHealthy)
180
- return;
181
- await sleep(pollInterval);
182
- }
183
- throw new Error(`Service ${serviceName} did not become ready in time`);
183
+ const {
184
+ maxAttempts = MAX_ATTEMPTS,
185
+ pollInterval = POLL_INTERVAL,
186
+ projectName,
187
+ root,
188
+ } = options;
189
+ if (config.healthCheck === false || config.healthCheck === undefined) {
190
+ return;
191
+ }
192
+ const healthCheckFn =
193
+ typeof config.healthCheck === "function"
194
+ ? config.healthCheck
195
+ : createBuiltInHealthCheck(
196
+ config.healthCheck,
197
+ config.serviceName ?? serviceName,
198
+ { projectName, root },
199
+ );
200
+ for (let i = 0; i < maxAttempts; i++) {
201
+ const isHealthy = await healthCheckFn(port);
202
+ if (isHealthy) return;
203
+ await sleep(pollInterval);
204
+ }
205
+ throw new Error(`Service ${serviceName} did not become ready in time`);
184
206
  }
185
207
  async function waitForAllServices(services, ports, options = {}) {
186
- const { verbose = true, ...waitOptions } = options;
187
- if (verbose)
188
- console.log("⏳ Waiting for services to be healthy...");
189
- const promises = Object.entries(services).map(([name, config]) => {
190
- const port = ports[name];
191
- if (port === undefined) {
192
- console.warn(`⚠️ No port found for service ${name}, skipping health check`);
193
- return Promise.resolve();
194
- }
195
- return waitForService(name, config, port, waitOptions);
196
- });
197
- await Promise.all(promises);
198
- if (verbose)
199
- console.log("✓ All services healthy");
208
+ const { verbose = true, ...waitOptions } = options;
209
+ if (verbose) console.log("⏳ Waiting for services to be healthy...");
210
+ const promises = Object.entries(services).map(([name, config]) => {
211
+ const port = ports[name];
212
+ if (port === undefined) {
213
+ console.warn(
214
+ `⚠️ No port found for service ${name}, skipping health check`,
215
+ );
216
+ return Promise.resolve();
217
+ }
218
+ return waitForService(name, config, port, waitOptions);
219
+ });
220
+ await Promise.all(promises);
221
+ if (verbose) console.log("✓ All services healthy");
200
222
  }
201
- async function waitForServiceByType(serviceName, healthCheckType, port, options = {}) {
202
- const {
203
- maxAttempts = MAX_ATTEMPTS,
204
- pollInterval = POLL_INTERVAL,
205
- verbose = false,
206
- projectName,
207
- root
208
- } = options;
209
- const healthCheckFn = createBuiltInHealthCheck(healthCheckType, serviceName, {
210
- projectName,
211
- root
212
- });
213
- for (let i = 0;i < maxAttempts; i++) {
214
- const isHealthy = await healthCheckFn(port);
215
- if (isHealthy) {
216
- if (verbose)
217
- console.log(`✓ ${serviceName} is ready`);
218
- return;
219
- }
220
- await sleep(pollInterval);
221
- }
222
- throw new Error(`Service ${serviceName} did not become ready in time`);
223
+ async function waitForServiceByType(
224
+ serviceName,
225
+ healthCheckType,
226
+ port,
227
+ options = {},
228
+ ) {
229
+ const {
230
+ maxAttempts = MAX_ATTEMPTS,
231
+ pollInterval = POLL_INTERVAL,
232
+ verbose = false,
233
+ projectName,
234
+ root,
235
+ } = options;
236
+ const healthCheckFn = createBuiltInHealthCheck(healthCheckType, serviceName, {
237
+ projectName,
238
+ root,
239
+ });
240
+ for (let i = 0; i < maxAttempts; i++) {
241
+ const isHealthy = await healthCheckFn(port);
242
+ if (isHealthy) {
243
+ if (verbose) console.log(`✓ ${serviceName} is ready`);
244
+ return;
245
+ }
246
+ await sleep(pollInterval);
247
+ }
248
+ throw new Error(`Service ${serviceName} did not become ready in time`);
223
249
  }
224
250
 
225
- export { POLL_INTERVAL, MAX_ATTEMPTS, DOCKER_NOT_RUNNING_MESSAGE, isContainerRunning, isDockerRunning, assertDockerRunning, areContainersRunning, startContainers, stopContainers, startService, createBuiltInHealthCheck, waitForService, waitForAllServices, waitForServiceByType };
251
+ export {
252
+ POLL_INTERVAL,
253
+ MAX_ATTEMPTS,
254
+ DOCKER_NOT_RUNNING_MESSAGE,
255
+ isContainerRunning,
256
+ isDockerRunning,
257
+ assertDockerRunning,
258
+ areContainersRunning,
259
+ startContainers,
260
+ stopContainers,
261
+ startService,
262
+ createBuiltInHealthCheck,
263
+ waitForService,
264
+ waitForAllServices,
265
+ waitForServiceByType,
266
+ };
package/dist/index.d.ts CHANGED
@@ -1,12 +1,16 @@
1
- export { getFlagValue, hasFlag, runCli } from "./cli";
2
- export { assertValidConfig, defineDevConfig, mergeConfigs, validateConfig, } from "./config";
3
- export { createDevEnvironment } from "./environment";
4
- export { runWorkspaceTypecheck, type TypecheckResult, type WorkspaceTypecheckOptions, type WorkspaceTypecheckResult, } from "./lint";
5
- export { clearDevEnvCache, getDevEnv, loadDevEnv } from "./loader";
6
- export type { AppConfig, BuiltInHealthCheck, CliOptions, ComputedPorts, ComputedUrls, DevConfig, DevEnvironment, DevHooks, DevOptions, DevServerPids, EnvVarsBuilder, ExecOptions, HealthCheckFn, HookContext, MigrationConfig, PrismaConfig, PrismaRunner, SeedCheckContext, SeedCheckHelpers, SeedConfig, ServiceConfig, StartOptions, StopOptions, UrlBuilderContext, UrlBuilderFn, } from "./types";
7
- export { areContainersRunning, assertDockerRunning, DOCKER_NOT_RUNNING_MESSAGE, isContainerRunning, isDockerRunning, MAX_ATTEMPTS, POLL_INTERVAL, } from "./core/docker";
1
+ export { getFlagValue, hasFlag, runCli } from "./cli/run-cli";
2
+ export { assertValidConfig, defineDevConfig, mergeConfigs, validateConfig, } from "./config/index";
3
+ export type { ClickhouseServiceOptions, CustomServiceOptions, PostgresServiceOptions, RedisServiceOptions, } from "./docker-compose/services";
4
+ export { service } from "./docker-compose/services";
5
+ export { createDevEnvironment } from "./environment/index";
6
+ export { clearDevEnvCache, getDevEnv, loadDevEnv } from "./loader/index";
7
+ export { runWorkspaceTypecheck, type TypecheckResult, type WorkspaceTypecheckOptions, type WorkspaceTypecheckResult, } from "./typecheck/index";
8
+ export type { AppConfig, BuiltInHealthCheck, CliOptions, ComputedPorts, ComputedPublicUrls, ComputedUrls, DevConfig, DevEnvironment, DevHooks, DevOptions, DevServerPids, DockerComposeGenerationOptions, DockerComposeHealthcheckRaw, DockerComposeNode, DockerComposeServiceRaw, DockerComposeVolumeRaw, DockerPresetName, DockerPresetServiceDefinition, DockerServiceDefinition, EnvVarsBuilder, ExecOptions, HealthCheckFn, HookContext, MigrationConfig, OpenPublicTunnelsOptions, OpenPublicTunnelsResult, PrismaConfig, PrismaRunner, PublicTunnelHandle, SeedCheckContext, SeedCheckHelpers, SeedConfig, ServiceConfig, StartOptions, StopOptions, UrlBuilderContext, UrlBuilderFn, } from "./types/index";
8
9
  export { getLocalIp, isPortAvailable, waitForServer } from "./core/network";
9
- export { computeDevIdentity, calculatePortOffset, findMonorepoRoot, getProjectName, getWorktreeProjectSuffix, getWorktreeName, isWorktree, } from "./core/ports";
10
+ export { calculatePortOffset, computeDevIdentity, findMonorepoRoot, getProjectName, getWorktreeName, getWorktreeProjectSuffix, isWorktree, } from "./core/ports";
10
11
  export { getProcessOnPort, isPortInUse, isProcessAlive, killProcessesOnAppPorts, killProcessOnPort, killProcessOnPortAndWait, } from "./core/process";
12
+ export { type PublicExposeTarget, type PublicTunnel, resolveExposeTargets, startPublicTunnels, stopPublicTunnels, } from "./core/tunnel";
11
13
  export { getEnvVar, isCI, logApiUrl, logExpoApiUrl, logFrontendPort, sleep, } from "./core/utils";
12
14
  export { getHeartbeatFile, getWatchdogPidFile, isWatchdogRunning, spawnWatchdog, startHeartbeat, stopHeartbeat, stopWatchdog, } from "./core/watchdog";
15
+ export { areContainersRunning, assertDockerRunning, DOCKER_NOT_RUNNING_MESSAGE, isContainerRunning, isDockerRunning, MAX_ATTEMPTS, POLL_INTERVAL, } from "./docker/index";
16
+ export { buildComposeModel, composeToYaml, DEFAULT_GENERATED_COMPOSE_FILE, getGeneratedComposePath, writeGeneratedComposeFile, } from "./docker-compose/index";
package/dist/index.js CHANGED
@@ -1,43 +1,17 @@
1
+ import"./index-bj79tw5w.js";
1
2
  import {
2
3
  getFlagValue,
3
4
  hasFlag,
4
5
  runCli
5
- } from "./index-segbnm0h.js";
6
- import {
7
- runWorkspaceTypecheck
8
- } from "./index-d9efy0n4.js";
6
+ } from "./index-5aq985p4.js";
9
7
  import {
10
8
  clearDevEnvCache,
11
9
  getDevEnv,
12
10
  loadDevEnv
13
- } from "./index-1mdrf7nz.js";
11
+ } from "./index-byeqyjrz.js";
14
12
  import {
15
13
  createDevEnvironment
16
- } from "./index-wk2na3t9.js";
17
- import {
18
- getHeartbeatFile,
19
- getWatchdogPidFile,
20
- isWatchdogRunning,
21
- spawnWatchdog,
22
- startHeartbeat,
23
- stopHeartbeat,
24
- stopWatchdog
25
- } from "./index-ggq3yryx.js";
26
- import {
27
- getProcessOnPort,
28
- isPortInUse,
29
- isProcessAlive,
30
- killProcessOnPort,
31
- killProcessOnPortAndWait,
32
- killProcessesOnAppPorts
33
- } from "./index-1yvbwj4k.js";
34
- import {
35
- assertValidConfig,
36
- defineDevConfig,
37
- mergeConfigs,
38
- validateConfig
39
- } from "./index-tjqw9vtj.js";
40
- import"./index-qfphr2fd.js";
14
+ } from "./index-7v19es2e.js";
41
15
  import {
42
16
  DOCKER_NOT_RUNNING_MESSAGE,
43
17
  MAX_ATTEMPTS,
@@ -46,7 +20,7 @@ import {
46
20
  assertDockerRunning,
47
21
  isContainerRunning,
48
22
  isDockerRunning
49
- } from "./index-zfjzzjkf.js";
23
+ } from "./index-d8tyv5se.js";
50
24
  import {
51
25
  getEnvVar,
52
26
  getLocalIp,
@@ -57,7 +31,7 @@ import {
57
31
  logFrontendPort,
58
32
  sleep,
59
33
  waitForServer
60
- } from "./index-8xj2p5n5.js";
34
+ } from "./index-c0dr6mcv.js";
61
35
  import {
62
36
  calculatePortOffset,
63
37
  computeDevIdentity,
@@ -66,18 +40,62 @@ import {
66
40
  getWorktreeName,
67
41
  getWorktreeProjectSuffix,
68
42
  isWorktree
69
- } from "./index-731rzzfp.js";
43
+ } from "./index-fb29934k.js";
44
+ import {
45
+ DEFAULT_GENERATED_COMPOSE_FILE,
46
+ buildComposeModel,
47
+ composeToYaml,
48
+ getGeneratedComposePath,
49
+ service,
50
+ writeGeneratedComposeFile
51
+ } from "./index-5t9jxqm0.js";
52
+ import {
53
+ resolveExposeTargets,
54
+ startPublicTunnels,
55
+ stopPublicTunnels
56
+ } from "./index-x54nbgs7.js";
57
+ import {
58
+ getHeartbeatFile,
59
+ getWatchdogPidFile,
60
+ isWatchdogRunning,
61
+ spawnWatchdog,
62
+ startHeartbeat,
63
+ stopHeartbeat,
64
+ stopWatchdog
65
+ } from "./index-mam0bcyz.js";
66
+ import {
67
+ getProcessOnPort,
68
+ isPortInUse,
69
+ isProcessAlive,
70
+ killProcessOnPort,
71
+ killProcessOnPortAndWait,
72
+ killProcessesOnAppPorts
73
+ } from "./index-mm412dkp.js";
74
+ import {
75
+ assertValidConfig,
76
+ defineDevConfig,
77
+ mergeConfigs,
78
+ validateConfig
79
+ } from "./index-t0fj6gg1.js";
80
+ import {
81
+ runWorkspaceTypecheck
82
+ } from "./index-h70tce00.js";
70
83
  import"./index-qnx9j3qa.js";
71
84
  export {
85
+ writeGeneratedComposeFile,
72
86
  waitForServer,
73
87
  validateConfig,
74
88
  stopWatchdog,
89
+ stopPublicTunnels,
75
90
  stopHeartbeat,
91
+ startPublicTunnels,
76
92
  startHeartbeat,
77
93
  spawnWatchdog,
78
94
  sleep,
95
+ service,
79
96
  runWorkspaceTypecheck,
80
97
  runCli,
98
+ resolveExposeTargets,
81
99
  mergeConfigs,
82
100
  logFrontendPort,
83
101
  logExpoApiUrl,
@@ -102,6 +120,7 @@ export {
102
120
  getProcessOnPort,
103
121
  getLocalIp,
104
122
  getHeartbeatFile,
123
+ getGeneratedComposePath,
105
124
  getFlagValue,
106
125
  getEnvVar,
107
126
  getDevEnv,
@@ -109,12 +128,15 @@ export {
109
128
  defineDevConfig,
110
129
  createDevEnvironment,
111
130
  computeDevIdentity,
131
+ composeToYaml,
112
132
  clearDevEnvCache,
113
133
  calculatePortOffset,
134
+ buildComposeModel,
114
135
  assertValidConfig,
115
136
  assertDockerRunning,
116
137
  areContainersRunning,
117
138
  POLL_INTERVAL,
118
139
  MAX_ATTEMPTS,
119
- DOCKER_NOT_RUNNING_MESSAGE
140
+ DOCKER_NOT_RUNNING_MESSAGE,
141
+ DEFAULT_GENERATED_COMPOSE_FILE
120
142
  };