buncargo 1.0.26 → 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 (222) hide show
  1. package/dist/bin.d.ts +1 -12
  2. package/dist/bin.js +261 -252
  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 -74
  22. package/dist/core/docker.js +35 -26
  23. package/dist/core/index.d.ts +1 -1
  24. package/dist/core/index.js +123 -108
  25. package/dist/core/network.js +2 -2
  26. package/dist/core/ports.d.ts +22 -0
  27. package/dist/core/ports.js +5 -1
  28. package/dist/core/process.js +1 -1
  29. package/dist/core/tunnel.d.ts +33 -0
  30. package/dist/core/utils.js +2 -2
  31. package/dist/core/watchdog-runner.js +45 -42
  32. package/dist/core/watchdog.d.ts +1 -0
  33. package/dist/core/watchdog.js +4 -2
  34. package/dist/docker/index.d.ts +1 -0
  35. package/dist/docker/index.js +38 -0
  36. package/dist/docker/runtime.d.ts +87 -0
  37. package/dist/docker/runtime.js +37 -0
  38. package/dist/docker-compose/compose.d.ts +1 -0
  39. package/dist/docker-compose/generated-file.d.ts +7 -0
  40. package/dist/docker-compose/index.d.ts +3 -0
  41. package/dist/docker-compose/index.js +15 -0
  42. package/dist/docker-compose/model.d.ts +6 -0
  43. package/dist/docker-compose/services/clickhouse.d.ts +16 -0
  44. package/dist/docker-compose/services/define-docker-service.d.ts +41 -0
  45. package/dist/docker-compose/services/index.d.ts +23 -0
  46. package/dist/docker-compose/services/index.js +17 -0
  47. package/dist/docker-compose/services/postgres.d.ts +12 -0
  48. package/dist/docker-compose/services/redis.d.ts +12 -0
  49. package/dist/docker-compose/services/shared.d.ts +7 -0
  50. package/dist/docker-compose/yaml.d.ts +2 -0
  51. package/dist/environment/create-dev-environment.d.ts +23 -0
  52. package/dist/environment/index.d.ts +1 -0
  53. package/dist/environment/index.js +15 -0
  54. package/dist/environment/logging.d.ts +17 -0
  55. package/dist/environment/seeding.d.ts +9 -0
  56. package/dist/environment.d.ts +1 -23
  57. package/dist/environment.js +12 -14
  58. package/dist/index-045jksh5.js +147 -0
  59. package/dist/index-08wa79cs.js +125 -117
  60. package/dist/index-0kxnae3z.js +335 -0
  61. package/dist/index-1mdrf7nz.js +66 -0
  62. package/dist/index-1yvbwj4k.js +262 -242
  63. package/dist/index-23ev345g.js +475 -0
  64. package/dist/index-2ckr49sf.js +228 -0
  65. package/dist/index-2f47khe5.js +376 -369
  66. package/dist/index-2fr3g85b.js +220 -183
  67. package/dist/index-38xnzpa6.js +450 -0
  68. package/dist/index-3h3dhtf2.js +51 -43
  69. package/dist/index-42x95209.js +51 -43
  70. package/dist/index-4gp0az1g.js +145 -0
  71. package/dist/index-4xrxh8yv.js +72 -0
  72. package/dist/index-5gmws6ah.js +181 -0
  73. package/dist/index-5hka0tff.js +78 -76
  74. package/dist/index-5rfqps4b.js +3 -0
  75. package/dist/index-5t9jxqm0.js +428 -0
  76. package/dist/index-6c1w1xk5.js +101 -0
  77. package/dist/index-6fm7mvwj.js +118 -97
  78. package/dist/index-6srpc523.js +127 -128
  79. package/dist/index-731rzzfp.js +187 -0
  80. package/dist/index-75y4cg2z.js +51 -43
  81. package/dist/index-7ja4ywyj.js +126 -127
  82. package/dist/index-8bw1cmz4.js +531 -0
  83. package/dist/index-8hbbj1mp.js +120 -121
  84. package/dist/index-8xj2p5n5.js +145 -0
  85. package/dist/index-bj79tw5w.js +0 -0
  86. package/dist/index-bnk6nr0g.js +73 -0
  87. package/dist/index-brbbzyks.js +72 -0
  88. package/dist/index-c0dr6mcv.js +123 -0
  89. package/dist/index-cty0bcry.js +235 -218
  90. package/dist/index-d8tyv5se.js +228 -0
  91. package/dist/index-d9efy0n4.js +176 -150
  92. package/dist/index-etfmqjjf.js +427 -0
  93. package/dist/index-fb29934k.js +172 -0
  94. package/dist/index-g50jw1yf.js +72 -0
  95. package/dist/index-g6eb5wdw.js +118 -117
  96. package/dist/index-ggq3yryx.js +99 -95
  97. package/dist/index-h70tce00.js +177 -0
  98. package/dist/index-hkxtfqtc.js +333 -0
  99. package/dist/index-kf3dhser.js +146 -143
  100. package/dist/index-ma6tgdb2.js +500 -0
  101. package/dist/index-mam0bcyz.js +123 -0
  102. package/dist/index-mm412dkp.js +274 -0
  103. package/dist/index-n8v18aeb.js +0 -0
  104. package/dist/index-ndnmnsej.js +378 -371
  105. package/dist/index-p8wty0e2.js +389 -379
  106. package/dist/index-qfphr2fd.js +100 -0
  107. package/dist/index-qqmms8rs.js +51 -43
  108. package/dist/index-qw4093g2.js +51 -43
  109. package/dist/index-qzwpzjbx.js +121 -122
  110. package/dist/index-segbnm0h.js +146 -143
  111. package/dist/index-t0fj6gg1.js +112 -0
  112. package/dist/index-thdkwnv7.js +122 -0
  113. package/dist/index-tjbx2r2t.js +270 -0
  114. package/dist/index-tjqw9vtj.js +62 -54
  115. package/dist/index-vbpb89jy.js +248 -0
  116. package/dist/index-vhs88xhe.js +99 -95
  117. package/dist/index-w8zxnjka.js +249 -0
  118. package/dist/index-wk2na3t9.js +404 -0
  119. package/dist/index-wz9x8g7z.js +383 -373
  120. package/dist/index-x249gyde.js +388 -378
  121. package/dist/index-xkvd0nsd.js +187 -0
  122. package/dist/index-yedqxm1z.js +80 -0
  123. package/dist/index-zfjzzjkf.js +266 -0
  124. package/dist/index.d.ts +12 -8
  125. package/dist/index.js +66 -35
  126. package/dist/lint.d.ts +1 -46
  127. package/dist/lint.js +3 -7
  128. package/dist/loader/cache.d.ts +4 -0
  129. package/dist/loader/find-config-file.d.ts +2 -0
  130. package/dist/loader/index.d.ts +5 -0
  131. package/dist/loader/index.js +24 -0
  132. package/dist/loader/load-dev-env.d.ts +5 -0
  133. package/dist/loader/loader.d.ts +1 -0
  134. package/dist/loader.d.ts +1 -45
  135. package/dist/loader.js +22 -20
  136. package/dist/prisma/index.d.ts +1 -0
  137. package/dist/prisma/prisma.d.ts +29 -0
  138. package/dist/prisma.d.ts +1 -29
  139. package/dist/prisma.js +6 -10
  140. package/dist/src/bin.js +309 -0
  141. package/dist/src/cli.js +5 -0
  142. package/dist/src/config.js +15 -0
  143. package/dist/src/core/docker.js +38 -0
  144. package/dist/src/core/index.js +130 -0
  145. package/dist/src/core/network.js +9 -0
  146. package/dist/src/core/ports.js +23 -0
  147. package/dist/src/core/process.js +31 -0
  148. package/dist/src/core/utils.js +11 -0
  149. package/dist/src/core/watchdog-runner.js +69 -0
  150. package/dist/src/core/watchdog.js +28 -0
  151. package/dist/src/docker/runtime.js +37 -0
  152. package/dist/src/docker-compose/index.js +16 -0
  153. package/dist/src/docker-compose/services/index.js +17 -0
  154. package/dist/src/environment.js +12 -0
  155. package/dist/src/index.js +122 -0
  156. package/dist/src/lint.js +3 -0
  157. package/dist/src/loader.js +25 -0
  158. package/dist/src/prisma.js +6 -0
  159. package/dist/src/types.js +0 -0
  160. package/dist/typecheck/index.d.ts +1 -0
  161. package/dist/typecheck/index.js +7 -0
  162. package/dist/typecheck/typecheck.d.ts +46 -0
  163. package/dist/types/all-types.d.ts +501 -0
  164. package/dist/types/cli.d.ts +1 -0
  165. package/dist/types/config.d.ts +6 -0
  166. package/dist/types/docker.d.ts +15 -0
  167. package/dist/types/environment.d.ts +8 -0
  168. package/dist/types/hooks.d.ts +9 -0
  169. package/dist/types/index.d.ts +1 -0
  170. package/dist/types/index.js +0 -0
  171. package/dist/types/prisma.d.ts +1 -0
  172. package/dist/types.d.ts +1 -393
  173. package/package.json +145 -140
  174. package/readme.md +358 -105
  175. package/src/cli/bin.ts +77 -0
  176. package/src/cli/commands/help.ts +39 -0
  177. package/src/cli/commands/runtime.ts +72 -0
  178. package/src/cli/commands/version.ts +4 -0
  179. package/src/cli/index.ts +1 -0
  180. package/{cli.ts → src/cli/run-cli.ts} +95 -6
  181. package/src/config/define-config.ts +30 -0
  182. package/src/config/index.ts +3 -0
  183. package/src/config/merge-configs.ts +33 -0
  184. package/src/config/validate-config.ts +136 -0
  185. package/{core → src/core}/index.ts +2 -2
  186. package/{core → src/core}/ports.ts +68 -1
  187. package/{core → src/core}/process.ts +6 -2
  188. package/src/core/tunnel.ts +151 -0
  189. package/{core → src/core}/utils.ts +1 -0
  190. package/{core → src/core}/watchdog.ts +5 -1
  191. package/src/docker/index.ts +1 -0
  192. package/{core/docker.ts → src/docker/runtime.ts} +40 -4
  193. package/src/docker-compose/generated-file.ts +45 -0
  194. package/src/docker-compose/index.ts +7 -0
  195. package/src/docker-compose/model.ts +197 -0
  196. package/src/docker-compose/services/clickhouse.ts +79 -0
  197. package/src/docker-compose/services/define-docker-service.ts +109 -0
  198. package/src/docker-compose/services/index.ts +67 -0
  199. package/src/docker-compose/services/postgres.ts +60 -0
  200. package/src/docker-compose/services/redis.ts +48 -0
  201. package/src/docker-compose/services/shared.ts +79 -0
  202. package/src/docker-compose/yaml.ts +88 -0
  203. package/{environment.ts → src/environment/create-dev-environment.ts} +101 -146
  204. package/src/environment/index.ts +1 -0
  205. package/src/environment/logging.ts +101 -0
  206. package/src/environment/seeding.ts +57 -0
  207. package/{index.ts → src/index.ts} +49 -15
  208. package/src/loader/cache.ts +23 -0
  209. package/src/loader/find-config-file.ts +29 -0
  210. package/src/loader/index.ts +17 -0
  211. package/src/loader/load-dev-env.ts +38 -0
  212. package/src/prisma/index.ts +1 -0
  213. package/{prisma.ts → src/prisma/prisma.ts} +4 -2
  214. package/src/typecheck/index.ts +1 -0
  215. package/{types.ts → src/types/all-types.ts} +137 -6
  216. package/src/types/index.ts +1 -0
  217. package/bin.ts +0 -191
  218. package/config.ts +0 -194
  219. package/loader.ts +0 -126
  220. /package/{core → src/core}/network.ts +0 -0
  221. /package/{core → src/core}/watchdog-runner.ts +0 -0
  222. /package/{lint.ts → src/typecheck/typecheck.ts} +0 -0
@@ -0,0 +1,87 @@
1
+ import type { BuiltInHealthCheck, HealthCheckFn, ServiceConfig } from "../types";
2
+ export declare const POLL_INTERVAL = 250;
3
+ export declare const MAX_ATTEMPTS = 120;
4
+ export declare const DOCKER_NOT_RUNNING_MESSAGE = "Docker is not running. Please start Docker and try again.";
5
+ /**
6
+ * Check if a specific container service is running using docker ps.
7
+ */
8
+ export declare function isContainerRunning(project: string, service: string): Promise<boolean>;
9
+ /**
10
+ * Check if Docker daemon is running and reachable.
11
+ */
12
+ export declare function isDockerRunning(): boolean;
13
+ /**
14
+ * Ensure Docker is running before attempting compose operations.
15
+ */
16
+ export declare function assertDockerRunning(): void;
17
+ /**
18
+ * Check if all expected containers are running.
19
+ */
20
+ export declare function areContainersRunning(project: string, minCount?: number): Promise<boolean>;
21
+ export interface StartContainersOptions {
22
+ verbose?: boolean;
23
+ wait?: boolean;
24
+ composeFile?: string;
25
+ }
26
+ /**
27
+ * Build `-f` argument for docker compose.
28
+ */
29
+ export declare function getComposeArg(composeFile?: string): string;
30
+ /**
31
+ * Start Docker Compose containers.
32
+ */
33
+ export declare function startContainers(root: string, projectName: string, envVars: Record<string, string>, options?: StartContainersOptions): void;
34
+ export interface StopContainersOptions {
35
+ verbose?: boolean;
36
+ removeVolumes?: boolean;
37
+ composeFile?: string;
38
+ }
39
+ /**
40
+ * Stop Docker Compose containers.
41
+ */
42
+ export declare function stopContainers(root: string, projectName: string, options?: StopContainersOptions): void;
43
+ /**
44
+ * Start a specific service only.
45
+ */
46
+ export declare function startService(root: string, projectName: string, serviceName: string, envVars: Record<string, string>, options?: {
47
+ verbose?: boolean;
48
+ composeFile?: string;
49
+ }): void;
50
+ export interface HealthCheckContext {
51
+ projectName?: string;
52
+ root?: string;
53
+ }
54
+ /**
55
+ * Create a health check function from a built-in type.
56
+ */
57
+ export declare function createBuiltInHealthCheck(type: BuiltInHealthCheck, serviceName: string, context?: HealthCheckContext): HealthCheckFn;
58
+ /**
59
+ * Wait for a service to be healthy.
60
+ */
61
+ export declare function waitForService(serviceName: string, config: ServiceConfig, port: number, options?: {
62
+ maxAttempts?: number;
63
+ pollInterval?: number;
64
+ projectName?: string;
65
+ root?: string;
66
+ }): Promise<void>;
67
+ /**
68
+ * Wait for all services to be healthy.
69
+ */
70
+ export declare function waitForAllServices(services: Record<string, ServiceConfig>, ports: Record<string, number>, options?: {
71
+ maxAttempts?: number;
72
+ pollInterval?: number;
73
+ verbose?: boolean;
74
+ projectName?: string;
75
+ root?: string;
76
+ }): Promise<void>;
77
+ /**
78
+ * Wait for a service to be healthy using a built-in health check type.
79
+ * Simpler API when you don't have a ServiceConfig object.
80
+ */
81
+ export declare function waitForServiceByType(serviceName: string, healthCheckType: BuiltInHealthCheck, port: number, options?: {
82
+ maxAttempts?: number;
83
+ pollInterval?: number;
84
+ verbose?: boolean;
85
+ projectName?: string;
86
+ root?: string;
87
+ }): Promise<void>;
@@ -0,0 +1,37 @@
1
+ import {
2
+ areContainersRunning,
3
+ assertDockerRunning,
4
+ createBuiltInHealthCheck,
5
+ DOCKER_NOT_RUNNING_MESSAGE,
6
+ getComposeArg,
7
+ isContainerRunning,
8
+ isDockerRunning,
9
+ MAX_ATTEMPTS,
10
+ POLL_INTERVAL,
11
+ startContainers,
12
+ startService,
13
+ stopContainers,
14
+ waitForAllServices,
15
+ waitForService,
16
+ waitForServiceByType,
17
+ } from "../index-tjbx2r2t.js";
18
+ import "../index-4gp0az1g.js";
19
+ import "../index-xkvd0nsd.js";
20
+ import "../index-qnx9j3qa.js";
21
+ export {
22
+ waitForServiceByType,
23
+ waitForService,
24
+ waitForAllServices,
25
+ stopContainers,
26
+ startService,
27
+ startContainers,
28
+ isDockerRunning,
29
+ isContainerRunning,
30
+ getComposeArg,
31
+ createBuiltInHealthCheck,
32
+ assertDockerRunning,
33
+ areContainersRunning,
34
+ POLL_INTERVAL,
35
+ MAX_ATTEMPTS,
36
+ DOCKER_NOT_RUNNING_MESSAGE,
37
+ };
@@ -0,0 +1 @@
1
+ export * from "./index";
@@ -0,0 +1,7 @@
1
+ import type { DockerComposeGenerationOptions, ServiceConfig } from "../types";
2
+ export declare const DEFAULT_GENERATED_COMPOSE_FILE = ".buncargo/docker-compose.generated.yml";
3
+ export declare function getGeneratedComposePath(root: string, docker?: DockerComposeGenerationOptions): {
4
+ absolutePath: string;
5
+ composeFileArg: string;
6
+ };
7
+ export declare function writeGeneratedComposeFile(root: string, services: Record<string, ServiceConfig>, docker?: DockerComposeGenerationOptions): string;
@@ -0,0 +1,3 @@
1
+ export { DEFAULT_GENERATED_COMPOSE_FILE, getGeneratedComposePath, writeGeneratedComposeFile, } from "./generated-file";
2
+ export { buildComposeModel } from "./model";
3
+ export { composeToYaml } from "./yaml";
@@ -0,0 +1,15 @@
1
+ import {
2
+ DEFAULT_GENERATED_COMPOSE_FILE,
3
+ buildComposeModel,
4
+ composeToYaml,
5
+ getGeneratedComposePath,
6
+ writeGeneratedComposeFile
7
+ } from "../index-5t9jxqm0.js";
8
+ import"../index-qnx9j3qa.js";
9
+ export {
10
+ writeGeneratedComposeFile,
11
+ getGeneratedComposePath,
12
+ composeToYaml,
13
+ buildComposeModel,
14
+ DEFAULT_GENERATED_COMPOSE_FILE
15
+ };
@@ -0,0 +1,6 @@
1
+ import type { DockerComposeGenerationOptions, DockerComposeServiceRaw, DockerComposeVolumeRaw, ServiceConfig } from "../types";
2
+ export type ComposeDocument = {
3
+ services: Record<string, DockerComposeServiceRaw>;
4
+ volumes?: Record<string, DockerComposeVolumeRaw>;
5
+ };
6
+ export declare function buildComposeModel(services: Record<string, ServiceConfig>, docker?: DockerComposeGenerationOptions): ComposeDocument;
@@ -0,0 +1,16 @@
1
+ import type { BuiltInHealthCheck, DockerComposeServiceRaw, ServiceConfig } from "../../types";
2
+ export type ClickhouseServiceOptions = {
3
+ port?: number;
4
+ secondaryPort?: number;
5
+ expose?: boolean;
6
+ healthCheck?: BuiltInHealthCheck | false;
7
+ serviceName?: string;
8
+ database?: string;
9
+ user?: string;
10
+ password?: string;
11
+ docker?: DockerComposeServiceRaw;
12
+ };
13
+ export type ClickhouseServiceConfig = ServiceConfig & {
14
+ secondaryPort: number;
15
+ };
16
+ export declare const clickhouseDockerService: import("./define-docker-service").DockerServicePreset<ClickhouseServiceOptions, ClickhouseServiceConfig>;
@@ -0,0 +1,41 @@
1
+ import type { BuiltInHealthCheck, DockerComposeServiceRaw, DockerPresetName, DockerPresetServiceDefinition, ServiceConfig } from "../../types";
2
+ export interface DockerServiceFactoryInput {
3
+ serviceKey: string;
4
+ config: ServiceConfig;
5
+ }
6
+ export interface DockerServiceFactoryOutput {
7
+ service: DockerComposeServiceRaw;
8
+ volume?: string;
9
+ }
10
+ export type DockerServiceFactory = (input: DockerServiceFactoryInput) => DockerServiceFactoryOutput;
11
+ export type PresetServiceSharedOptions = Pick<ServiceConfig, "serviceName" | "database" | "user" | "password" | "expose"> & {
12
+ port?: number;
13
+ healthCheck?: BuiltInHealthCheck | false;
14
+ docker?: DockerComposeServiceRaw;
15
+ };
16
+ export interface DockerServicePresetDefaults {
17
+ port: number;
18
+ healthCheck: BuiltInHealthCheck;
19
+ secondaryPort?: number;
20
+ }
21
+ export interface DockerServicePreset<TOptions extends PresetServiceSharedOptions = PresetServiceSharedOptions, TServiceConfig extends ServiceConfig = ServiceConfig> {
22
+ preset: DockerPresetName;
23
+ defaults: DockerServicePresetDefaults;
24
+ build: DockerServiceFactory;
25
+ createPresetDefinition(service?: DockerComposeServiceRaw): DockerPresetServiceDefinition;
26
+ toServiceConfig(options?: TOptions): TServiceConfig;
27
+ }
28
+ interface DefineDockerServiceInput<TOptions extends PresetServiceSharedOptions = PresetServiceSharedOptions, TServiceConfig extends ServiceConfig = ServiceConfig> {
29
+ preset: DockerPresetName;
30
+ defaults: DockerServicePresetDefaults;
31
+ build: DockerServiceFactory;
32
+ enhanceServiceConfig?: (base: ServiceConfig, options: TOptions) => TServiceConfig;
33
+ }
34
+ /**
35
+ * Define a docker service preset as single source of truth.
36
+ * The same definition powers:
37
+ * - compose generation (`build`)
38
+ * - typed config helper defaults (`toServiceConfig`)
39
+ */
40
+ export declare function defineDockerService<TOptions extends PresetServiceSharedOptions = PresetServiceSharedOptions, TServiceConfig extends ServiceConfig = ServiceConfig>(input: DefineDockerServiceInput<TOptions, TServiceConfig>): DockerServicePreset<TOptions, TServiceConfig>;
41
+ export {};
@@ -0,0 +1,23 @@
1
+ import type { DockerComposeServiceRaw, DockerPresetName, ServiceConfig } from "../../types";
2
+ import type { DockerServicePreset } from "./define-docker-service";
3
+ export type { DockerServicePreset, DockerServicePresetDefaults, PresetServiceSharedOptions, } from "./define-docker-service";
4
+ import { type ClickhouseServiceOptions, clickhouseDockerService } from "./clickhouse";
5
+ import { type PostgresServiceOptions, postgresDockerService } from "./postgres";
6
+ import { type RedisServiceOptions, redisDockerService } from "./redis";
7
+ export { clickhouseDockerService, postgresDockerService, redisDockerService };
8
+ export type { ClickhouseServiceOptions, PostgresServiceOptions, RedisServiceOptions, };
9
+ export type CustomServiceOptions = ServiceConfig & {
10
+ docker: DockerComposeServiceRaw;
11
+ };
12
+ /**
13
+ * Public service builders for dev.config.ts.
14
+ * Core owns this surface so defaults and preset mapping live in one place.
15
+ */
16
+ export declare const service: {
17
+ postgres: (options?: PostgresServiceOptions | undefined) => ServiceConfig;
18
+ redis: (options?: RedisServiceOptions | undefined) => ServiceConfig;
19
+ clickhouse: (options?: ClickhouseServiceOptions | undefined) => import("./clickhouse").ClickhouseServiceConfig;
20
+ custom(options: CustomServiceOptions): ServiceConfig;
21
+ };
22
+ export declare function inferDockerPreset(serviceKey: string): DockerPresetName | undefined;
23
+ export declare function buildPresetDockerService(preset: DockerPresetName, input: Parameters<DockerServicePreset["build"]>[0]): ReturnType<DockerServicePreset["build"]>;
@@ -0,0 +1,17 @@
1
+ import {
2
+ buildPresetDockerService,
3
+ clickhouseDockerService,
4
+ inferDockerPreset,
5
+ postgresDockerService,
6
+ redisDockerService,
7
+ service,
8
+ } from "../../index-w8zxnjka.js";
9
+ import "../../index-qnx9j3qa.js";
10
+ export {
11
+ service,
12
+ redisDockerService,
13
+ postgresDockerService,
14
+ inferDockerPreset,
15
+ clickhouseDockerService,
16
+ buildPresetDockerService,
17
+ };
@@ -0,0 +1,12 @@
1
+ import type { BuiltInHealthCheck, DockerComposeServiceRaw } from "../../types";
2
+ export type PostgresServiceOptions = {
3
+ port?: number;
4
+ expose?: boolean;
5
+ healthCheck?: BuiltInHealthCheck | false;
6
+ serviceName?: string;
7
+ database?: string;
8
+ user?: string;
9
+ password?: string;
10
+ docker?: DockerComposeServiceRaw;
11
+ };
12
+ export declare const postgresDockerService: import("./define-docker-service").DockerServicePreset<PostgresServiceOptions, import("../..").ServiceConfig>;
@@ -0,0 +1,12 @@
1
+ import type { BuiltInHealthCheck, DockerComposeServiceRaw } from "../../types";
2
+ export type RedisServiceOptions = {
3
+ port?: number;
4
+ expose?: boolean;
5
+ healthCheck?: BuiltInHealthCheck | false;
6
+ serviceName?: string;
7
+ database?: string;
8
+ user?: string;
9
+ password?: string;
10
+ docker?: DockerComposeServiceRaw;
11
+ };
12
+ export declare const redisDockerService: import("./define-docker-service").DockerServicePreset<RedisServiceOptions, import("../..").ServiceConfig>;
@@ -0,0 +1,7 @@
1
+ import type { DockerComposeHealthcheckRaw, DockerPresetName, ServiceConfig } from "../../types";
2
+ export declare function getPortEnvName(portKey: string): string;
3
+ export declare function getDefaultPortBindings(serviceKey: string, config: ServiceConfig, preset?: DockerPresetName): string[];
4
+ export declare function resolveHealthcheck(healthCheck: ServiceConfig["healthCheck"] | undefined, fallback: DockerComposeHealthcheckRaw | undefined, options: {
5
+ internalPort: number;
6
+ user?: string;
7
+ }): DockerComposeHealthcheckRaw | undefined;
@@ -0,0 +1,2 @@
1
+ import type { ComposeDocument } from "./model";
2
+ export declare function composeToYaml(document: ComposeDocument): string;
@@ -0,0 +1,23 @@
1
+ import type { AppConfig, DevConfig, DevEnvironment, ServiceConfig } from "../types";
2
+ /**
3
+ * Create a dev environment from a configuration.
4
+ *
5
+ * @example
6
+ * ```typescript
7
+ * import { defineDevConfig, createDevEnvironment } from 'buncargo'
8
+ *
9
+ * const config = defineDevConfig({
10
+ * projectPrefix: 'myapp',
11
+ * services: { postgres: { port: 5432 } },
12
+ * apps: { api: { port: 3000, devCommand: 'bun run dev' } }
13
+ * })
14
+ *
15
+ * export const dev = createDevEnvironment(config)
16
+ *
17
+ * // Usage
18
+ * await dev.start()
19
+ * ```
20
+ */
21
+ export declare function createDevEnvironment<TServices extends Record<string, ServiceConfig>, TApps extends Record<string, AppConfig>>(config: DevConfig<TServices, TApps>, options?: {
22
+ suffix?: string;
23
+ }): DevEnvironment<TServices, TApps>;
@@ -0,0 +1 @@
1
+ export { createDevEnvironment } from "./create-dev-environment";
@@ -0,0 +1,15 @@
1
+ import {
2
+ createDevEnvironment
3
+ } from "../index-ma6tgdb2.js";
4
+ import"../index-d8tyv5se.js";
5
+ import"../index-c0dr6mcv.js";
6
+ import"../index-fb29934k.js";
7
+ import"../index-5t9jxqm0.js";
8
+ import"../index-bnk6nr0g.js";
9
+ import"../index-mam0bcyz.js";
10
+ import"../index-mm412dkp.js";
11
+ import"../index-t0fj6gg1.js";
12
+ import"../index-qnx9j3qa.js";
13
+ export {
14
+ createDevEnvironment
15
+ };
@@ -0,0 +1,17 @@
1
+ export declare function logEnvironmentInfo(input: {
2
+ label: string;
3
+ projectName: string;
4
+ services: Record<string, unknown>;
5
+ apps: Record<string, unknown>;
6
+ ports: Record<string, number>;
7
+ localIp: string;
8
+ worktree: boolean;
9
+ portOffset: number;
10
+ projectSuffix?: string;
11
+ }): void;
12
+ export declare function logPublicUrls(tunnels: Array<{
13
+ kind: "service" | "app";
14
+ name: string;
15
+ publicUrl: string;
16
+ localUrl: string;
17
+ }>): void;
@@ -0,0 +1,9 @@
1
+ import type { AppConfig, HookContext, SeedCheckContext, ServiceConfig } from "../types";
2
+ export declare function createCheckTableHelper<TServices extends Record<string, ServiceConfig>, TApps extends Record<string, AppConfig>>(urls: Record<string, string>, exec: (cmd: string, options?: {
3
+ throwOnError?: boolean;
4
+ }) => Promise<{
5
+ exitCode: number;
6
+ stdout: string;
7
+ stderr: string;
8
+ }>): SeedCheckContext<TServices, TApps>["checkTable"];
9
+ export declare function createSeedCheckContext<TServices extends Record<string, ServiceConfig>, TApps extends Record<string, AppConfig>>(baseContext: HookContext<TServices, TApps>, checkTable: SeedCheckContext<TServices, TApps>["checkTable"]): SeedCheckContext<TServices, TApps>;
@@ -1,23 +1 @@
1
- import type { AppConfig, DevConfig, DevEnvironment, ServiceConfig } from "./types";
2
- /**
3
- * Create a dev environment from a configuration.
4
- *
5
- * @example
6
- * ```typescript
7
- * import { defineDevConfig, createDevEnvironment } from 'buncargo'
8
- *
9
- * const config = defineDevConfig({
10
- * projectPrefix: 'myapp',
11
- * services: { postgres: { port: 5432 } },
12
- * apps: { api: { port: 3000, devCommand: 'bun run dev' } }
13
- * })
14
- *
15
- * export const dev = createDevEnvironment(config)
16
- *
17
- * // Usage
18
- * await dev.start()
19
- * ```
20
- */
21
- export declare function createDevEnvironment<TServices extends Record<string, ServiceConfig>, TApps extends Record<string, AppConfig>>(config: DevConfig<TServices, TApps>, options?: {
22
- suffix?: string;
23
- }): DevEnvironment<TServices, TApps>;
1
+ export * from "./environment/index";
@@ -1,14 +1,12 @@
1
- import {
2
- createDevEnvironment
3
- } from "./index-p8wty0e2.js";
4
- import"./index-ggq3yryx.js";
5
- import"./index-1yvbwj4k.js";
6
- import"./index-tjqw9vtj.js";
7
- import"./index-5hka0tff.js";
8
- import"./index-2fr3g85b.js";
9
- import"./index-6fm7mvwj.js";
10
- import"./index-08wa79cs.js";
11
- import"./index-qnx9j3qa.js";
12
- export {
13
- createDevEnvironment
14
- };
1
+ import { createDevEnvironment } from "./index-38xnzpa6.js";
2
+ import "./index-vbpb89jy.js";
3
+ import "./index-w8zxnjka.js";
4
+ import "./index-mam0bcyz.js";
5
+ import "./index-mm412dkp.js";
6
+ import "./index-045jksh5.js";
7
+ import "./index-6c1w1xk5.js";
8
+ import "./index-tjbx2r2t.js";
9
+ import "./index-4gp0az1g.js";
10
+ import "./index-xkvd0nsd.js";
11
+ import "./index-qnx9j3qa.js";
12
+ export { createDevEnvironment };
@@ -0,0 +1,147 @@
1
+ // src/config/define-config.ts
2
+ function defineDevConfig(config) {
3
+ return config;
4
+ }
5
+
6
+ // src/config/validate-config.ts
7
+ import { isAbsolute, normalize } from "node:path";
8
+
9
+ var BUILTIN_DOCKER_PRESETS = new Set(["postgres", "redis", "clickhouse"]);
10
+ function inferBuiltInPreset(serviceName) {
11
+ const normalized = serviceName.toLowerCase();
12
+ return BUILTIN_DOCKER_PRESETS.has(normalized) ? normalized : null;
13
+ }
14
+ function validateConfig(config) {
15
+ const errors = [];
16
+ const composeServiceNames = new Set();
17
+ if (!config.projectPrefix) {
18
+ errors.push("projectPrefix is required");
19
+ } else if (!/^[a-z][a-z0-9-]*$/.test(config.projectPrefix)) {
20
+ errors.push(
21
+ "projectPrefix must start with a letter and contain only lowercase letters, numbers, and hyphens",
22
+ );
23
+ }
24
+ if (!config.services || Object.keys(config.services).length === 0) {
25
+ errors.push("At least one service is required");
26
+ }
27
+ for (const [name, service] of Object.entries(config.services ?? {})) {
28
+ if (!service.port || typeof service.port !== "number") {
29
+ errors.push(`Service "${name}" must have a valid port number`);
30
+ }
31
+ if (service.port < 1 || service.port > 65535) {
32
+ errors.push(`Service "${name}" port must be between 1 and 65535`);
33
+ }
34
+ if (
35
+ service.secondaryPort !== undefined &&
36
+ (service.secondaryPort < 1 || service.secondaryPort > 65535)
37
+ ) {
38
+ errors.push(
39
+ `Service "${name}" secondaryPort must be between 1 and 65535`,
40
+ );
41
+ }
42
+ const composeServiceName = service.serviceName ?? name;
43
+ if (composeServiceNames.has(composeServiceName)) {
44
+ errors.push(
45
+ `Duplicate compose service name "${composeServiceName}". Use unique serviceName values.`,
46
+ );
47
+ }
48
+ composeServiceNames.add(composeServiceName);
49
+ const dockerConfig = service.docker;
50
+ const preset = inferBuiltInPreset(name);
51
+ if (!dockerConfig && !preset) {
52
+ errors.push(
53
+ `Service "${name}" must define docker config (helper or raw) because it has no built-in preset.`,
54
+ );
55
+ }
56
+ if (
57
+ dockerConfig &&
58
+ typeof dockerConfig === "object" &&
59
+ "kind" in dockerConfig &&
60
+ dockerConfig.kind === "preset"
61
+ ) {
62
+ const presetName = dockerConfig.preset;
63
+ if (
64
+ typeof presetName !== "string" ||
65
+ !BUILTIN_DOCKER_PRESETS.has(presetName)
66
+ ) {
67
+ errors.push(
68
+ `Service "${name}" has invalid docker preset "${presetName}".`,
69
+ );
70
+ }
71
+ }
72
+ }
73
+ if (config.docker?.writeStrategy) {
74
+ const writeStrategy = config.docker.writeStrategy;
75
+ if (writeStrategy !== "always" && writeStrategy !== "if-missing") {
76
+ errors.push(
77
+ `docker.writeStrategy "${String(writeStrategy)}" is invalid. Use "always" or "if-missing".`,
78
+ );
79
+ }
80
+ }
81
+ if (config.docker?.generatedFile) {
82
+ const generatedFile = config.docker.generatedFile;
83
+ if (isAbsolute(generatedFile)) {
84
+ errors.push(
85
+ "docker.generatedFile must be a relative path inside the repo.",
86
+ );
87
+ }
88
+ const normalized = normalize(generatedFile).replace(/\\/g, "/");
89
+ if (normalized === ".." || normalized.startsWith("../")) {
90
+ errors.push(
91
+ "docker.generatedFile cannot point outside the repository root.",
92
+ );
93
+ }
94
+ }
95
+ for (const [name, app] of Object.entries(config.apps ?? {})) {
96
+ if (!app.port || typeof app.port !== "number") {
97
+ errors.push(`App "${name}" must have a valid port number`);
98
+ }
99
+ if (!app.devCommand) {
100
+ errors.push(`App "${name}" must have a devCommand`);
101
+ }
102
+ }
103
+ for (const migration of config.migrations ?? []) {
104
+ if (!migration.name) {
105
+ errors.push("Migration must have a name");
106
+ }
107
+ if (!migration.command) {
108
+ errors.push(`Migration "${migration.name}" must have a command`);
109
+ }
110
+ }
111
+ if (config.seed && !config.seed.command) {
112
+ errors.push("Seed must have a command");
113
+ }
114
+ return errors;
115
+ }
116
+ function assertValidConfig(config) {
117
+ const errors = validateConfig(config);
118
+ if (errors.length > 0) {
119
+ throw new Error(`Invalid dev config:
120
+ - ${errors.join(`
121
+ - `)}`);
122
+ }
123
+ }
124
+ // src/config/merge-configs.ts
125
+ function mergeConfigs(base, overrides) {
126
+ return {
127
+ ...base,
128
+ ...overrides,
129
+ services: { ...base.services, ...overrides.services },
130
+ apps: { ...base.apps, ...overrides.apps },
131
+ hooks: { ...base.hooks, ...overrides.hooks },
132
+ migrations: overrides.migrations ?? base.migrations,
133
+ seed: overrides.seed ?? base.seed,
134
+ options: { ...base.options, ...overrides.options },
135
+ docker: { ...base.docker, ...overrides.docker },
136
+ };
137
+ }
138
+ function definePartialConfig(config) {
139
+ return config;
140
+ }
141
+ export {
142
+ defineDevConfig,
143
+ validateConfig,
144
+ assertValidConfig,
145
+ mergeConfigs,
146
+ definePartialConfig,
147
+ };