@specific.dev/cli 0.1.37 → 0.1.39

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 (173) hide show
  1. package/dist/admin/404/index.html +1 -1
  2. package/dist/admin/404.html +1 -1
  3. package/dist/admin/__next.__PAGE__.txt +2 -2
  4. package/dist/admin/__next._full.txt +3 -3
  5. package/dist/admin/__next._head.txt +1 -1
  6. package/dist/admin/__next._index.txt +2 -2
  7. package/dist/admin/__next._tree.txt +2 -2
  8. package/dist/admin/_next/static/chunks/{de6af6d8adf8b50a.js → 0476153b08658d87.js} +2 -2
  9. package/dist/admin/_next/static/chunks/{4ab079bdcb131778.js → 1de437acc5206b1f.js} +2 -2
  10. package/dist/admin/_next/static/chunks/5ff94899b8b7a03a.css +3 -0
  11. package/dist/admin/_next/static/chunks/{895a6f91f0b479fb.js → 6aae09c9429b9f24.js} +2 -2
  12. package/dist/admin/_next/static/chunks/b71388016463cab2.js +1 -0
  13. package/dist/admin/_not-found/__next._full.txt +2 -2
  14. package/dist/admin/_not-found/__next._head.txt +1 -1
  15. package/dist/admin/_not-found/__next._index.txt +2 -2
  16. package/dist/admin/_not-found/__next._not-found.__PAGE__.txt +1 -1
  17. package/dist/admin/_not-found/__next._not-found.txt +1 -1
  18. package/dist/admin/_not-found/__next._tree.txt +2 -2
  19. package/dist/admin/_not-found/index.html +1 -1
  20. package/dist/admin/_not-found/index.txt +2 -2
  21. package/dist/admin/databases/__next._full.txt +3 -3
  22. package/dist/admin/databases/__next._head.txt +1 -1
  23. package/dist/admin/databases/__next._index.txt +2 -2
  24. package/dist/admin/databases/__next._tree.txt +2 -2
  25. package/dist/admin/databases/__next.databases.__PAGE__.txt +2 -2
  26. package/dist/admin/databases/__next.databases.txt +1 -1
  27. package/dist/admin/databases/index.html +1 -1
  28. package/dist/admin/databases/index.txt +3 -3
  29. package/dist/admin/index.html +1 -1
  30. package/dist/admin/index.txt +3 -3
  31. package/dist/cli.js +1527 -719
  32. package/package.json +3 -2
  33. package/dist/admin/_next/static/1o2O2QPOKhuZyxcNaCjq8/_buildManifest.js +0 -11
  34. package/dist/admin/_next/static/1o2O2QPOKhuZyxcNaCjq8/_clientMiddlewareManifest.json +0 -1
  35. package/dist/admin/_next/static/1o2O2QPOKhuZyxcNaCjq8/_ssgManifest.js +0 -1
  36. package/dist/admin/_next/static/2ZtqtFX2EkuM82mTM7NWT/_buildManifest.js +0 -11
  37. package/dist/admin/_next/static/2ZtqtFX2EkuM82mTM7NWT/_clientMiddlewareManifest.json +0 -1
  38. package/dist/admin/_next/static/2ZtqtFX2EkuM82mTM7NWT/_ssgManifest.js +0 -1
  39. package/dist/admin/_next/static/2vLF5bo4ZtUfhs8bdQBoF/_buildManifest.js +0 -11
  40. package/dist/admin/_next/static/2vLF5bo4ZtUfhs8bdQBoF/_clientMiddlewareManifest.json +0 -1
  41. package/dist/admin/_next/static/2vLF5bo4ZtUfhs8bdQBoF/_ssgManifest.js +0 -1
  42. package/dist/admin/_next/static/8_8s51m7RbLVvbIechG-b/_buildManifest.js +0 -11
  43. package/dist/admin/_next/static/8_8s51m7RbLVvbIechG-b/_clientMiddlewareManifest.json +0 -1
  44. package/dist/admin/_next/static/8_8s51m7RbLVvbIechG-b/_ssgManifest.js +0 -1
  45. package/dist/admin/_next/static/C4Y44KtLnP684m57gN3Ga/_buildManifest.js +0 -11
  46. package/dist/admin/_next/static/C4Y44KtLnP684m57gN3Ga/_clientMiddlewareManifest.json +0 -1
  47. package/dist/admin/_next/static/C4Y44KtLnP684m57gN3Ga/_ssgManifest.js +0 -1
  48. package/dist/admin/_next/static/DBeh36kAJnZBeBMJSPBW8/_buildManifest.js +0 -11
  49. package/dist/admin/_next/static/DBeh36kAJnZBeBMJSPBW8/_clientMiddlewareManifest.json +0 -1
  50. package/dist/admin/_next/static/DBeh36kAJnZBeBMJSPBW8/_ssgManifest.js +0 -1
  51. package/dist/admin/_next/static/REKEUu6DP2t99jKSAqNOu/_buildManifest.js +0 -11
  52. package/dist/admin/_next/static/REKEUu6DP2t99jKSAqNOu/_clientMiddlewareManifest.json +0 -1
  53. package/dist/admin/_next/static/REKEUu6DP2t99jKSAqNOu/_ssgManifest.js +0 -1
  54. package/dist/admin/_next/static/TDGT3mkKtTe0w_CxujLxI/_buildManifest.js +0 -11
  55. package/dist/admin/_next/static/TDGT3mkKtTe0w_CxujLxI/_clientMiddlewareManifest.json +0 -1
  56. package/dist/admin/_next/static/TDGT3mkKtTe0w_CxujLxI/_ssgManifest.js +0 -1
  57. package/dist/admin/_next/static/ZHMJ-g7mAlAMt_2uCXeEk/_buildManifest.js +0 -11
  58. package/dist/admin/_next/static/ZHMJ-g7mAlAMt_2uCXeEk/_clientMiddlewareManifest.json +0 -1
  59. package/dist/admin/_next/static/ZHMJ-g7mAlAMt_2uCXeEk/_ssgManifest.js +0 -1
  60. package/dist/admin/_next/static/a6JDAB-CdvWPvS4sBgJji/_buildManifest.js +0 -11
  61. package/dist/admin/_next/static/a6JDAB-CdvWPvS4sBgJji/_clientMiddlewareManifest.json +0 -1
  62. package/dist/admin/_next/static/a6JDAB-CdvWPvS4sBgJji/_ssgManifest.js +0 -1
  63. package/dist/admin/_next/static/abFUeBpymhlx-IxygVnM9/_buildManifest.js +0 -11
  64. package/dist/admin/_next/static/abFUeBpymhlx-IxygVnM9/_clientMiddlewareManifest.json +0 -1
  65. package/dist/admin/_next/static/abFUeBpymhlx-IxygVnM9/_ssgManifest.js +0 -1
  66. package/dist/admin/_next/static/chunks/1584f10ea1cebcb2.js +0 -4
  67. package/dist/admin/_next/static/chunks/195bbec70cfcd241.js +0 -2
  68. package/dist/admin/_next/static/chunks/2583656ea9ac4ad6.js +0 -5
  69. package/dist/admin/_next/static/chunks/605800ff25160d05.js +0 -1
  70. package/dist/admin/_next/static/chunks/656b870f0567ed5f.js +0 -1
  71. package/dist/admin/_next/static/chunks/71098a6cd6181738.css +0 -3
  72. package/dist/admin/_next/static/chunks/9032f4a1aac1ca5d.css +0 -3
  73. package/dist/admin/_next/static/chunks/a28af2dc6f5fbaad.js +0 -1
  74. package/dist/admin/_next/static/chunks/b4205fc2f84bda68.css +0 -3
  75. package/dist/admin/_next/static/chunks/c1a750c25bc8d092.js +0 -1
  76. package/dist/admin/_next/static/chunks/c3d30f6f144dca51.js +0 -2
  77. package/dist/admin/_next/static/chunks/cbf55ce8731457ae.js +0 -2
  78. package/dist/admin/_next/static/chunks/f0c001244d275aab.js +0 -5
  79. package/dist/admin/_next/static/chunks/fde89fd76ad6a3d0.css +0 -3
  80. package/dist/admin/_next/static/chunks/turbopack-a3d691c83d4b1778.js +0 -4
  81. package/dist/admin/_next/static/dcjrfD44GuB6g8bZ6BcFm/_buildManifest.js +0 -11
  82. package/dist/admin/_next/static/dcjrfD44GuB6g8bZ6BcFm/_clientMiddlewareManifest.json +0 -1
  83. package/dist/admin/_next/static/dcjrfD44GuB6g8bZ6BcFm/_ssgManifest.js +0 -1
  84. package/dist/admin/_next/static/fTEa8Scx922n-dMuqN3Vc/_buildManifest.js +0 -11
  85. package/dist/admin/_next/static/fTEa8Scx922n-dMuqN3Vc/_clientMiddlewareManifest.json +0 -1
  86. package/dist/admin/_next/static/fTEa8Scx922n-dMuqN3Vc/_ssgManifest.js +0 -1
  87. package/dist/admin/_next/static/kZNwyhHft01wPtJ_AvqQT/_buildManifest.js +0 -11
  88. package/dist/admin/_next/static/kZNwyhHft01wPtJ_AvqQT/_clientMiddlewareManifest.json +0 -1
  89. package/dist/admin/_next/static/kZNwyhHft01wPtJ_AvqQT/_ssgManifest.js +0 -1
  90. package/dist/admin/_next/static/kyVInC6N3DY6NWnjkLQ4J/_buildManifest.js +0 -11
  91. package/dist/admin/_next/static/kyVInC6N3DY6NWnjkLQ4J/_clientMiddlewareManifest.json +0 -1
  92. package/dist/admin/_next/static/kyVInC6N3DY6NWnjkLQ4J/_ssgManifest.js +0 -1
  93. package/dist/admin/_next/static/twedXBdhyxpjS68UQoNAc/_buildManifest.js +0 -11
  94. package/dist/admin/_next/static/twedXBdhyxpjS68UQoNAc/_clientMiddlewareManifest.json +0 -1
  95. package/dist/admin/_next/static/twedXBdhyxpjS68UQoNAc/_ssgManifest.js +0 -1
  96. package/dist/cli.d.ts +0 -3
  97. package/dist/cli.d.ts.map +0 -1
  98. package/dist/cli.js.map +0 -1
  99. package/dist/commands/check.d.ts +0 -2
  100. package/dist/commands/check.d.ts.map +0 -1
  101. package/dist/commands/check.js +0 -104
  102. package/dist/commands/check.js.map +0 -1
  103. package/dist/commands/clean.d.ts +0 -2
  104. package/dist/commands/clean.d.ts.map +0 -1
  105. package/dist/commands/clean.js +0 -70
  106. package/dist/commands/clean.js.map +0 -1
  107. package/dist/commands/deploy.d.ts +0 -2
  108. package/dist/commands/deploy.d.ts.map +0 -1
  109. package/dist/commands/deploy.js +0 -11
  110. package/dist/commands/deploy.js.map +0 -1
  111. package/dist/commands/dev.d.ts +0 -2
  112. package/dist/commands/dev.d.ts.map +0 -1
  113. package/dist/commands/dev.js +0 -398
  114. package/dist/commands/dev.js.map +0 -1
  115. package/dist/commands/docs.d.ts +0 -2
  116. package/dist/commands/docs.d.ts.map +0 -1
  117. package/dist/commands/docs.js +0 -32
  118. package/dist/commands/docs.js.map +0 -1
  119. package/dist/commands/exec.d.ts +0 -2
  120. package/dist/commands/exec.d.ts.map +0 -1
  121. package/dist/commands/exec.js +0 -178
  122. package/dist/commands/exec.js.map +0 -1
  123. package/dist/commands/init.d.ts +0 -2
  124. package/dist/commands/init.d.ts.map +0 -1
  125. package/dist/commands/init.js +0 -339
  126. package/dist/commands/init.js.map +0 -1
  127. package/dist/commands/psql.d.ts +0 -2
  128. package/dist/commands/psql.d.ts.map +0 -1
  129. package/dist/commands/psql.js +0 -53
  130. package/dist/commands/psql.js.map +0 -1
  131. package/dist/commands/secrets.d.ts +0 -3
  132. package/dist/commands/secrets.d.ts.map +0 -1
  133. package/dist/commands/secrets.js +0 -136
  134. package/dist/commands/secrets.js.map +0 -1
  135. package/dist/lib/dev/database-manager.d.ts +0 -17
  136. package/dist/lib/dev/database-manager.d.ts.map +0 -1
  137. package/dist/lib/dev/database-manager.js +0 -114
  138. package/dist/lib/dev/database-manager.js.map +0 -1
  139. package/dist/lib/dev/env-resolver.d.ts +0 -14
  140. package/dist/lib/dev/env-resolver.d.ts.map +0 -1
  141. package/dist/lib/dev/env-resolver.js +0 -109
  142. package/dist/lib/dev/env-resolver.js.map +0 -1
  143. package/dist/lib/dev/http-proxy.d.ts +0 -11
  144. package/dist/lib/dev/http-proxy.d.ts.map +0 -1
  145. package/dist/lib/dev/http-proxy.js +0 -165
  146. package/dist/lib/dev/http-proxy.js.map +0 -1
  147. package/dist/lib/dev/index.d.ts +0 -11
  148. package/dist/lib/dev/index.d.ts.map +0 -1
  149. package/dist/lib/dev/index.js +0 -7
  150. package/dist/lib/dev/index.js.map +0 -1
  151. package/dist/lib/dev/instance-state.d.ts +0 -45
  152. package/dist/lib/dev/instance-state.d.ts.map +0 -1
  153. package/dist/lib/dev/instance-state.js +0 -213
  154. package/dist/lib/dev/instance-state.js.map +0 -1
  155. package/dist/lib/dev/port-allocator.d.ts +0 -5
  156. package/dist/lib/dev/port-allocator.d.ts.map +0 -1
  157. package/dist/lib/dev/port-allocator.js +0 -21
  158. package/dist/lib/dev/port-allocator.js.map +0 -1
  159. package/dist/lib/dev/service-runner.d.ts +0 -16
  160. package/dist/lib/dev/service-runner.d.ts.map +0 -1
  161. package/dist/lib/dev/service-runner.js +0 -61
  162. package/dist/lib/dev/service-runner.js.map +0 -1
  163. package/dist/lib/secrets/index.d.ts +0 -2
  164. package/dist/lib/secrets/index.d.ts.map +0 -1
  165. package/dist/lib/secrets/index.js +0 -2
  166. package/dist/lib/secrets/index.js.map +0 -1
  167. package/dist/lib/secrets/parser.d.ts +0 -37
  168. package/dist/lib/secrets/parser.d.ts.map +0 -1
  169. package/dist/lib/secrets/parser.js +0 -116
  170. package/dist/lib/secrets/parser.js.map +0 -1
  171. /package/dist/admin/_next/static/{0zkv3YeV6IWOWVWE1S1A1 → cNL40bpv360RCjyOls7vD}/_buildManifest.js +0 -0
  172. /package/dist/admin/_next/static/{0zkv3YeV6IWOWVWE1S1A1 → cNL40bpv360RCjyOls7vD}/_clientMiddlewareManifest.json +0 -0
  173. /package/dist/admin/_next/static/{0zkv3YeV6IWOWVWE1S1A1 → cNL40bpv360RCjyOls7vD}/_ssgManifest.js +0 -0
@@ -1,398 +0,0 @@
1
- import React, { useState, useEffect, useRef } from "react";
2
- import { render, Text, Box, useApp, Static } from "ink";
3
- import Spinner from "ink-spinner";
4
- import * as fs from "fs";
5
- import * as path from "path";
6
- import { parseConfig } from "@specific/config";
7
- import { PortAllocator, startDatabase, startService, startHttpProxy, InstanceStateManager, } from "../lib/dev/index.js";
8
- import { prepareSecrets } from "../lib/secrets/index.js";
9
- // Colors for service prefixes
10
- const COLORS = ["cyan", "yellow", "green", "magenta", "blue"];
11
- function DevUI() {
12
- const { exit } = useApp();
13
- const [state, setState] = useState({
14
- status: "loading",
15
- databases: new Map(),
16
- services: [],
17
- output: [],
18
- colorMap: new Map(),
19
- });
20
- // Track if shutdown is in progress
21
- const shuttingDown = useRef(false);
22
- const stateManagerRef = useRef(null);
23
- const shutdown = async () => {
24
- if (shuttingDown.current)
25
- return;
26
- shuttingDown.current = true;
27
- setState((s) => ({ ...s, status: "stopping" }));
28
- // Stop proxy first (stop accepting new requests)
29
- if (state.proxy) {
30
- await state.proxy.stop();
31
- }
32
- // Stop services
33
- for (const service of state.services) {
34
- await service.stop();
35
- }
36
- // Then stop databases
37
- for (const db of state.databases.values()) {
38
- await db.stop();
39
- }
40
- // Release ownership
41
- if (stateManagerRef.current) {
42
- await stateManagerRef.current.releaseOwnership();
43
- }
44
- exit();
45
- };
46
- // Handle SIGINT/SIGTERM for graceful shutdown
47
- useEffect(() => {
48
- const handleSignal = () => {
49
- shutdown();
50
- };
51
- process.on("SIGINT", handleSignal);
52
- process.on("SIGTERM", handleSignal);
53
- return () => {
54
- process.off("SIGINT", handleSignal);
55
- process.off("SIGTERM", handleSignal);
56
- };
57
- }, [state.services, state.databases]);
58
- const addLog = (line, colorMap) => {
59
- const color = colorMap.get(`svc:${line.service}`) || "cyan";
60
- setState((s) => ({
61
- ...s,
62
- output: [
63
- ...s.output,
64
- { type: "log", service: line.service, text: line.text, color },
65
- ],
66
- }));
67
- };
68
- useEffect(() => {
69
- let cancelled = false;
70
- const startedDatabases = [];
71
- const startedServices = [];
72
- let startedProxy = null;
73
- const stateManager = new InstanceStateManager(process.cwd());
74
- stateManagerRef.current = stateManager;
75
- async function start() {
76
- // Phase 0: Check for existing instances
77
- await stateManager.cleanStaleState();
78
- const existing = await stateManager.getExistingInstances();
79
- if (existing) {
80
- setState((s) => ({
81
- ...s,
82
- status: "error",
83
- error: `Development environment already running (owned by PID ${existing.owner.pid})`,
84
- }));
85
- return;
86
- }
87
- try {
88
- await stateManager.claimOwnership("dev");
89
- }
90
- catch (err) {
91
- setState((s) => ({
92
- ...s,
93
- status: "error",
94
- error: err instanceof Error ? err.message : String(err),
95
- }));
96
- return;
97
- }
98
- // Phase 1: Load config
99
- const configPath = path.join(process.cwd(), "specific.hcl");
100
- if (!fs.existsSync(configPath)) {
101
- setState((s) => ({
102
- ...s,
103
- status: "error",
104
- error: "No specific.hcl found in current directory",
105
- }));
106
- return;
107
- }
108
- let config;
109
- try {
110
- const hcl = fs.readFileSync(configPath, "utf-8");
111
- config = await parseConfig(hcl);
112
- }
113
- catch (err) {
114
- setState((s) => ({
115
- ...s,
116
- status: "error",
117
- error: err instanceof Error ? err.message : String(err),
118
- }));
119
- return;
120
- }
121
- if (cancelled)
122
- return;
123
- // Assign colors to databases and services
124
- const colorMap = new Map();
125
- let colorIndex = 0;
126
- for (const db of config.databases) {
127
- colorMap.set(`db:${db.name}`, COLORS[colorIndex % COLORS.length]);
128
- colorIndex++;
129
- }
130
- for (const service of config.services) {
131
- colorMap.set(`svc:${service.name}`, COLORS[colorIndex % COLORS.length]);
132
- colorIndex++;
133
- }
134
- setState((s) => ({ ...s, status: "starting", config, colorMap }));
135
- // Phase 2: Start databases
136
- const portAllocator = new PortAllocator();
137
- const databases = new Map();
138
- for (const db of config.databases) {
139
- if (cancelled)
140
- break;
141
- try {
142
- const port = portAllocator.allocate();
143
- const instance = await startDatabase(db, port);
144
- databases.set(db.name, instance);
145
- startedDatabases.push(instance);
146
- // Update state immediately so UI shows this database as ready
147
- setState((s) => ({ ...s, databases: new Map(databases) }));
148
- const dbState = {
149
- engine: instance.engine,
150
- port: instance.port,
151
- host: instance.host,
152
- user: instance.user,
153
- password: instance.password,
154
- dbName: instance.dbName,
155
- url: instance.url,
156
- };
157
- if (instance.endpoint)
158
- dbState.endpoint = instance.endpoint;
159
- if (instance.accessKey)
160
- dbState.accessKey = instance.accessKey;
161
- if (instance.secretKey)
162
- dbState.secretKey = instance.secretKey;
163
- await stateManager.registerDatabase(db.name, dbState);
164
- }
165
- catch (err) {
166
- setState((s) => ({
167
- ...s,
168
- status: "error",
169
- error: `Failed to start database "${db.name}": ${err instanceof Error ? err.message : String(err)}`,
170
- }));
171
- return;
172
- }
173
- }
174
- if (cancelled)
175
- return;
176
- // Phase 3: Prepare secrets (loads user secrets + handles generated ones)
177
- const secrets = await prepareSecrets(config.secrets);
178
- // Phase 4: Start services
179
- const services = [];
180
- for (const service of config.services) {
181
- if (cancelled)
182
- break;
183
- // Skip static services for now
184
- if (service.serve) {
185
- continue;
186
- }
187
- // Skip services without a command
188
- if (!service.command && !service.dev?.command) {
189
- continue;
190
- }
191
- try {
192
- // Allocate port for services with expose
193
- const port = service.expose ? portAllocator.allocate() : undefined;
194
- const running = startService(service, databases, secrets, port, (line) => addLog(line, colorMap));
195
- services.push(running);
196
- startedServices.push(running);
197
- // Update state immediately so UI shows this service as ready
198
- setState((s) => ({ ...s, services: [...services] }));
199
- if (running.process.pid) {
200
- const serviceState = {
201
- pid: running.process.pid,
202
- };
203
- if (running.port !== undefined) {
204
- serviceState.port = running.port;
205
- }
206
- await stateManager.registerService(service.name, serviceState);
207
- }
208
- }
209
- catch (err) {
210
- setState((s) => ({
211
- ...s,
212
- status: "error",
213
- error: `Failed to start service "${service.name}": ${err instanceof Error ? err.message : String(err)}`,
214
- }));
215
- return;
216
- }
217
- }
218
- if (cancelled)
219
- return;
220
- // Phase 5: Start HTTP proxy for exposed services
221
- const exposedServices = services
222
- .filter((s) => s.port !== undefined)
223
- .map((s) => ({ name: s.name, port: s.port }));
224
- if (exposedServices.length > 0) {
225
- try {
226
- const proxy = await startHttpProxy(exposedServices);
227
- startedProxy = proxy;
228
- setState((s) => ({ ...s, proxy }));
229
- }
230
- catch (err) {
231
- setState((s) => ({
232
- ...s,
233
- status: "error",
234
- error: `Failed to start HTTP proxy: ${err instanceof Error ? err.message : String(err)}`,
235
- }));
236
- return;
237
- }
238
- }
239
- if (cancelled)
240
- return;
241
- setState((s) => ({ ...s, status: "running", services }));
242
- }
243
- start();
244
- return () => {
245
- cancelled = true;
246
- // Cleanup on unmount
247
- if (startedProxy) {
248
- startedProxy.stop().catch(() => { });
249
- }
250
- for (const service of startedServices) {
251
- service.stop().catch(() => { });
252
- }
253
- for (const db of startedDatabases) {
254
- db.stop().catch(() => { });
255
- }
256
- stateManager.releaseOwnership().catch(() => { });
257
- };
258
- }, []);
259
- if (state.status === "loading") {
260
- return (React.createElement(Box, null,
261
- React.createElement(Text, { color: "blue" },
262
- React.createElement(Spinner, { type: "dots" }))));
263
- }
264
- if (state.status === "error") {
265
- return (React.createElement(Box, { flexDirection: "column" },
266
- React.createElement(Text, { color: "red" },
267
- "Error: ",
268
- state.error)));
269
- }
270
- if (state.status === "stopping") {
271
- return (React.createElement(Box, null,
272
- React.createElement(Text, { color: "yellow" },
273
- React.createElement(Spinner, { type: "dots" })),
274
- React.createElement(Text, null, " Shutting down...")));
275
- }
276
- const { config, databases, services, proxy, output } = state;
277
- // Show spinner while starting if no config yet
278
- if (!config) {
279
- return (React.createElement(Box, null,
280
- React.createElement(Text, { color: "blue" },
281
- React.createElement(Spinner, { type: "dots" }))));
282
- }
283
- // During starting phase, show dynamic view (no logs yet)
284
- if (state.status === "starting") {
285
- return (React.createElement(Box, { flexDirection: "column" },
286
- React.createElement(Text, null,
287
- React.createElement(Text, { bold: true, color: "cyan" }, "Specific dev server"),
288
- React.createElement(Text, { dimColor: true }, " (Ctrl+C to stop)")),
289
- React.createElement(Text, null, " "),
290
- config.databases.length > 0 && (React.createElement(React.Fragment, null,
291
- React.createElement(Text, { bold: true }, "Databases:"),
292
- config.databases.map((db) => {
293
- const instance = databases.get(db.name);
294
- const isReady = !!instance;
295
- return (React.createElement(Text, { key: db.name },
296
- React.createElement(Text, { color: isReady ? "green" : "gray" }, " \u25CF "),
297
- React.createElement(Text, null,
298
- db.name,
299
- " (",
300
- db.engine,
301
- ")"),
302
- instance && React.createElement(Text, null,
303
- " \u2192 localhost:",
304
- instance.port)));
305
- }),
306
- React.createElement(Text, null, " "))),
307
- config.services.length > 0 && (React.createElement(React.Fragment, null,
308
- React.createElement(Text, { bold: true }, "Services:"),
309
- config.services.map((svc) => {
310
- const running = services.find((s) => s.name === svc.name);
311
- const isReady = !!running;
312
- const portInfo = running?.port
313
- ? ` → localhost:${running.port}`
314
- : "";
315
- return (React.createElement(Text, { key: svc.name },
316
- React.createElement(Text, { color: isReady ? "green" : "gray" }, " \u25CF "),
317
- React.createElement(Text, null,
318
- svc.name,
319
- portInfo)));
320
- }),
321
- React.createElement(Text, null, " "))),
322
- React.createElement(Box, null,
323
- React.createElement(Text, { color: "blue" },
324
- React.createElement(Spinner, { type: "dots" })),
325
- React.createElement(Text, null, " Starting..."))));
326
- }
327
- const staticItems = [
328
- {
329
- key: "title",
330
- content: (React.createElement(Text, null,
331
- React.createElement(Text, { bold: true, color: "cyan" }, "Specific dev server"),
332
- React.createElement(Text, { dimColor: true }, " (Ctrl+C to stop)"))),
333
- },
334
- { key: "space1", content: React.createElement(Text, null, " ") },
335
- ...(config.databases.length > 0
336
- ? [
337
- { key: "db-header", content: React.createElement(Text, { bold: true }, "Databases:") },
338
- ...config.databases.map((db) => {
339
- const instance = databases.get(db.name);
340
- return {
341
- key: `db-${db.name}`,
342
- content: (React.createElement(Text, null,
343
- React.createElement(Text, { color: "green" }, " \u25CF "),
344
- React.createElement(Text, null,
345
- db.name,
346
- " (",
347
- db.engine,
348
- ")"),
349
- instance && React.createElement(Text, null,
350
- " \u2192 localhost:",
351
- instance.port))),
352
- };
353
- }),
354
- { key: "space2", content: React.createElement(Text, null, " ") },
355
- ]
356
- : []),
357
- ...(services.length > 0
358
- ? [
359
- { key: "svc-header", content: React.createElement(Text, { bold: true }, "Services:") },
360
- ...services.map((svc) => ({
361
- key: `svc-${svc.name}`,
362
- content: (React.createElement(Text, null,
363
- React.createElement(Text, { color: "green" }, " \u25CF "),
364
- React.createElement(Text, null,
365
- svc.name,
366
- svc.port ? (proxy ? (React.createElement(React.Fragment, null,
367
- " → ",
368
- React.createElement(Text, { bold: true },
369
- "https://",
370
- svc.name,
371
- ".local.spcf.app"),
372
- React.createElement(Text, { dimColor: true },
373
- " (localhost:",
374
- svc.port,
375
- ")"))) : (` → localhost:${svc.port}`)) : ("")))),
376
- })),
377
- { key: "space3", content: React.createElement(Text, null, " ") },
378
- ]
379
- : []),
380
- { key: "separator", content: React.createElement(Text, { dimColor: true }, "─".repeat(50)) },
381
- ...output.map((line, i) => ({
382
- key: `log-${i}`,
383
- content: (React.createElement(Text, null,
384
- React.createElement(Text, { color: line.color },
385
- "[",
386
- line.service,
387
- "]"),
388
- " ",
389
- line.text)),
390
- })),
391
- ];
392
- return (React.createElement(Box, { flexDirection: "column" },
393
- React.createElement(Static, { items: staticItems }, (item) => React.createElement(Box, { key: item.key }, item.content))));
394
- }
395
- export function devCommand() {
396
- render(React.createElement(DevUI, null));
397
- }
398
- //# sourceMappingURL=dev.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AACxD,OAAO,OAAO,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAuB,MAAM,kBAAkB,CAAC;AACpE,OAAO,EACL,aAAa,EACb,aAAa,EACb,YAAY,EACZ,cAAc,EACd,oBAAoB,GAKrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD,8BAA8B;AAC9B,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,CAAU,CAAC;AAiBvE,SAAS,KAAK;IACZ,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;IAC1B,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAW;QAC3C,MAAM,EAAE,SAAS;QACjB,SAAS,EAAE,IAAI,GAAG,EAAE;QACpB,QAAQ,EAAE,EAAE;QACZ,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE,IAAI,GAAG,EAAE;KACpB,CAAC,CAAC;IAEH,mCAAmC;IACnC,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,eAAe,GAAG,MAAM,CAA8B,IAAI,CAAC,CAAC;IAElE,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,IAAI,YAAY,CAAC,OAAO;YAAE,OAAO;QACjC,YAAY,CAAC,OAAO,GAAG,IAAI,CAAC;QAC5B,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;QAEhD,iDAAiD;QACjD,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC3B,CAAC;QAED,gBAAgB;QAChB,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACrC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QACvB,CAAC;QAED,sBAAsB;QACtB,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1C,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;QAClB,CAAC;QAED,oBAAoB;QACpB,IAAI,eAAe,CAAC,OAAO,EAAE,CAAC;YAC5B,MAAM,eAAe,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;QACnD,CAAC;QAED,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;IAEF,8CAA8C;IAC9C,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,YAAY,GAAG,GAAG,EAAE;YACxB,QAAQ,EAAE,CAAC;QACb,CAAC,CAAC;QAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACnC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAEpC,OAAO,GAAG,EAAE;YACV,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QACvC,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;IAEtC,MAAM,MAAM,GAAG,CAAC,IAAa,EAAE,QAA4B,EAAE,EAAE;QAC7D,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,MAAM,CAAC;QAC5D,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACf,GAAG,CAAC;YACJ,MAAM,EAAE;gBACN,GAAG,CAAC,CAAC,MAAM;gBACX,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;aAC/D;SACF,CAAC,CAAC,CAAC;IACN,CAAC,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,MAAM,gBAAgB,GAAuB,EAAE,CAAC;QAChD,MAAM,eAAe,GAAqB,EAAE,CAAC;QAC7C,IAAI,YAAY,GAA6B,IAAI,CAAC;QAClD,MAAM,YAAY,GAAG,IAAI,oBAAoB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAC7D,eAAe,CAAC,OAAO,GAAG,YAAY,CAAC;QAEvC,KAAK,UAAU,KAAK;YAClB,wCAAwC;YACxC,MAAM,YAAY,CAAC,eAAe,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,oBAAoB,EAAE,CAAC;YAC3D,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACf,GAAG,CAAC;oBACJ,MAAM,EAAE,OAAO;oBACf,KAAK,EAAE,yDAAyD,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG;iBACtF,CAAC,CAAC,CAAC;gBACJ,OAAO;YACT,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,YAAY,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YAC3C,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACf,GAAG,CAAC;oBACJ,MAAM,EAAE,OAAO;oBACf,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACxD,CAAC,CAAC,CAAC;gBACJ,OAAO;YACT,CAAC;YAED,uBAAuB;YACvB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;YAE5D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC/B,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACf,GAAG,CAAC;oBACJ,MAAM,EAAE,OAAO;oBACf,KAAK,EAAE,4CAA4C;iBACpD,CAAC,CAAC,CAAC;gBACJ,OAAO;YACT,CAAC;YAED,IAAI,MAAsB,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBACjD,MAAM,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;YAClC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACf,GAAG,CAAC;oBACJ,MAAM,EAAE,OAAO;oBACf,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACxD,CAAC,CAAC,CAAC;gBACJ,OAAO;YACT,CAAC;YAED,IAAI,SAAS;gBAAE,OAAO;YAEtB,0CAA0C;YAC1C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAiB,CAAC;YAC1C,IAAI,UAAU,GAAG,CAAC,CAAC;YACnB,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;gBAClC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,CAAE,CAAC,CAAC;gBACnE,UAAU,EAAE,CAAC;YACf,CAAC;YACD,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACtC,QAAQ,CAAC,GAAG,CACV,OAAO,OAAO,CAAC,IAAI,EAAE,EACrB,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,CAAE,CACpC,CAAC;gBACF,UAAU,EAAE,CAAC;YACf,CAAC;YAED,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;YAElE,2BAA2B;YAC3B,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;YAC1C,MAAM,SAAS,GAAG,IAAI,GAAG,EAA4B,CAAC;YAEtD,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;gBAClC,IAAI,SAAS;oBAAE,MAAM;gBAErB,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC;oBACtC,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;oBAC/C,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;oBACjC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAChC,8DAA8D;oBAC9D,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;oBAC3D,MAAM,OAAO,GAAwD;wBACnE,MAAM,EAAE,QAAQ,CAAC,MAAM;wBACvB,IAAI,EAAE,QAAQ,CAAC,IAAI;wBACnB,IAAI,EAAE,QAAQ,CAAC,IAAI;wBACnB,IAAI,EAAE,QAAQ,CAAC,IAAI;wBACnB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;wBAC3B,MAAM,EAAE,QAAQ,CAAC,MAAM;wBACvB,GAAG,EAAE,QAAQ,CAAC,GAAG;qBAClB,CAAC;oBACF,IAAI,QAAQ,CAAC,QAAQ;wBAAE,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;oBAC5D,IAAI,QAAQ,CAAC,SAAS;wBAAE,OAAO,CAAC,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;oBAC/D,IAAI,QAAQ,CAAC,SAAS;wBAAE,OAAO,CAAC,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;oBAC/D,MAAM,YAAY,CAAC,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBACxD,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBACf,GAAG,CAAC;wBACJ,MAAM,EAAE,OAAO;wBACf,KAAK,EAAE,6BAA6B,EAAE,CAAC,IAAI,MACzC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CACjD,EAAE;qBACH,CAAC,CAAC,CAAC;oBACJ,OAAO;gBACT,CAAC;YACH,CAAC;YAED,IAAI,SAAS;gBAAE,OAAO;YAEtB,yEAAyE;YACzE,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAErD,0BAA0B;YAC1B,MAAM,QAAQ,GAAqB,EAAE,CAAC;YAEtC,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACtC,IAAI,SAAS;oBAAE,MAAM;gBAErB,+BAA+B;gBAC/B,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;oBAClB,SAAS;gBACX,CAAC;gBAED,kCAAkC;gBAClC,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC;oBAC9C,SAAS;gBACX,CAAC;gBAED,IAAI,CAAC;oBACH,yCAAyC;oBACzC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;oBAEnE,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CACvE,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CACvB,CAAC;oBACF,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBACvB,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBAC9B,6DAA6D;oBAC7D,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;oBACrD,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;wBACxB,MAAM,YAAY,GAAmC;4BACnD,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG;yBACzB,CAAC;wBACF,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;4BAC/B,YAAY,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;wBACnC,CAAC;wBACD,MAAM,YAAY,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;oBACjE,CAAC;gBACH,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBACf,GAAG,CAAC;wBACJ,MAAM,EAAE,OAAO;wBACf,KAAK,EAAE,4BAA4B,OAAO,CAAC,IAAI,MAC7C,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CACjD,EAAE;qBACH,CAAC,CAAC,CAAC;oBACJ,OAAO;gBACT,CAAC;YACH,CAAC;YAED,IAAI,SAAS;gBAAE,OAAO;YAEtB,iDAAiD;YACjD,MAAM,eAAe,GAAG,QAAQ;iBAC7B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC;iBACnC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAK,EAAE,CAAC,CAAC,CAAC;YAEjD,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/B,IAAI,CAAC;oBACH,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,eAAe,CAAC,CAAC;oBACpD,YAAY,GAAG,KAAK,CAAC;oBACrB,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;gBACrC,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBACf,GAAG,CAAC;wBACJ,MAAM,EAAE,OAAO;wBACf,KAAK,EAAE,+BACL,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CACjD,EAAE;qBACH,CAAC,CAAC,CAAC;oBACJ,OAAO;gBACT,CAAC;YACH,CAAC;YAED,IAAI,SAAS;gBAAE,OAAO;YAEtB,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC3D,CAAC;QAED,KAAK,EAAE,CAAC;QAER,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAC;YACjB,qBAAqB;YACrB,IAAI,YAAY,EAAE,CAAC;gBACjB,YAAY,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACtC,CAAC;YACD,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;gBACtC,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACjC,CAAC;YACD,KAAK,MAAM,EAAE,IAAI,gBAAgB,EAAE,CAAC;gBAClC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC5B,CAAC;YACD,YAAY,CAAC,gBAAgB,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAClD,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,CACL,oBAAC,GAAG;YACF,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM;gBAChB,oBAAC,OAAO,IAAC,IAAI,EAAC,MAAM,GAAG,CAClB,CACH,CACP,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QAC7B,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ;YACzB,oBAAC,IAAI,IAAC,KAAK,EAAC,KAAK;;gBAAS,KAAK,CAAC,KAAK,CAAQ,CACzC,CACP,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QAChC,OAAO,CACL,oBAAC,GAAG;YACF,oBAAC,IAAI,IAAC,KAAK,EAAC,QAAQ;gBAClB,oBAAC,OAAO,IAAC,IAAI,EAAC,MAAM,GAAG,CAClB;YACP,oBAAC,IAAI,4BAAyB,CAC1B,CACP,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAE7D,+CAA+C;IAC/C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CACL,oBAAC,GAAG;YACF,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM;gBAChB,oBAAC,OAAO,IAAC,IAAI,EAAC,MAAM,GAAG,CAClB,CACH,CACP,CAAC;IACJ,CAAC;IAED,yDAAyD;IACzD,IAAI,KAAK,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QAChC,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ;YACzB,oBAAC,IAAI;gBACH,oBAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,MAAM,0BAEhB;gBACP,oBAAC,IAAI,IAAC,QAAQ,8BAAyB,CAClC;YACP,oBAAC,IAAI,YAAS;YAEb,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,CAC9B;gBACE,oBAAC,IAAI,IAAC,IAAI,uBAAkB;gBAC3B,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;oBAC3B,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;oBACxC,MAAM,OAAO,GAAG,CAAC,CAAC,QAAQ,CAAC;oBAC3B,OAAO,CACL,oBAAC,IAAI,IAAC,GAAG,EAAE,EAAE,CAAC,IAAI;wBAChB,oBAAC,IAAI,IAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,eAAY;wBACnD,oBAAC,IAAI;4BACF,EAAE,CAAC,IAAI;;4BAAI,EAAE,CAAC,MAAM;gCAChB;wBACN,QAAQ,IAAI,oBAAC,IAAI;;4BAAe,QAAQ,CAAC,IAAI,CAAQ,CACjD,CACR,CAAC;gBACJ,CAAC,CAAC;gBACF,oBAAC,IAAI,YAAS,CACb,CACJ;YAEA,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CAC7B;gBACE,oBAAC,IAAI,IAAC,IAAI,sBAAiB;gBAC1B,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;oBAC3B,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC;oBAC1D,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;oBAC1B,MAAM,QAAQ,GAAG,OAAO,EAAE,IAAI;wBAC5B,CAAC,CAAC,gBAAgB,OAAO,CAAC,IAAI,EAAE;wBAChC,CAAC,CAAC,EAAE,CAAC;oBACP,OAAO,CACL,oBAAC,IAAI,IAAC,GAAG,EAAE,GAAG,CAAC,IAAI;wBACjB,oBAAC,IAAI,IAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,eAAY;wBACnD,oBAAC,IAAI;4BACF,GAAG,CAAC,IAAI;4BACR,QAAQ,CACJ,CACF,CACR,CAAC;gBACJ,CAAC,CAAC;gBACF,oBAAC,IAAI,YAAS,CACb,CACJ;YAED,oBAAC,GAAG;gBACF,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM;oBAChB,oBAAC,OAAO,IAAC,IAAI,EAAC,MAAM,GAAG,CAClB;gBACP,oBAAC,IAAI,uBAAoB,CACrB,CACF,CACP,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG;QAClB;YACE,GAAG,EAAE,OAAO;YACZ,OAAO,EAAE,CACP,oBAAC,IAAI;gBACH,oBAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,MAAM,0BAEhB;gBACP,oBAAC,IAAI,IAAC,QAAQ,8BAAyB,CAClC,CACR;SACF;QACD,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,oBAAC,IAAI,YAAS,EAAE;QAE1C,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;YAC7B,CAAC,CAAC;gBACE,EAAE,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,oBAAC,IAAI,IAAC,IAAI,uBAAkB,EAAE;gBAC3D,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;oBAC7B,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;oBACxC,OAAO;wBACL,GAAG,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE;wBACpB,OAAO,EAAE,CACP,oBAAC,IAAI;4BACH,oBAAC,IAAI,IAAC,KAAK,EAAC,OAAO,eAAW;4BAC9B,oBAAC,IAAI;gCACF,EAAE,CAAC,IAAI;;gCAAI,EAAE,CAAC,MAAM;oCAChB;4BACN,QAAQ,IAAI,oBAAC,IAAI;;gCAAe,QAAQ,CAAC,IAAI,CAAQ,CACjD,CACR;qBACF,CAAC;gBACJ,CAAC,CAAC;gBACF,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,oBAAC,IAAI,YAAS,EAAE;aAC3C;YACH,CAAC,CAAC,EAAE,CAAC;QAEP,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;YACrB,CAAC,CAAC;gBACE,EAAE,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,oBAAC,IAAI,IAAC,IAAI,sBAAiB,EAAE;gBAC3D,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;oBACxB,GAAG,EAAE,OAAO,GAAG,CAAC,IAAI,EAAE;oBACtB,OAAO,EAAE,CACP,oBAAC,IAAI;wBACH,oBAAC,IAAI,IAAC,KAAK,EAAC,OAAO,eAAW;wBAC9B,oBAAC,IAAI;4BACF,GAAG,CAAC,IAAI;4BACR,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CACV,KAAK,CAAC,CAAC,CAAC,CACN;gCACG,KAAK;gCACN,oBAAC,IAAI,IAAC,IAAI;;oCAAU,GAAG,CAAC,IAAI;sDAAuB;gCACnD,oBAAC,IAAI,IAAC,QAAQ;;oCAAc,GAAG,CAAC,IAAI;wCAAS,CAC5C,CACJ,CAAC,CAAC,CAAC,CACF,gBAAgB,GAAG,CAAC,IAAI,EAAE,CAC3B,CACF,CAAC,CAAC,CAAC,CACF,EAAE,CACH,CACI,CACF,CACR;iBACF,CAAC,CAAC;gBACH,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,oBAAC,IAAI,YAAS,EAAE;aAC3C;YACH,CAAC,CAAC,EAAE,CAAC;QAEP,EAAE,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,oBAAC,IAAI,IAAC,QAAQ,UAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAQ,EAAE;QAErE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1B,GAAG,EAAE,OAAO,CAAC,EAAE;YACf,OAAO,EAAE,CACP,oBAAC,IAAI;gBACH,oBAAC,IAAI,IAAC,KAAK,EAAE,IAAI,CAAC,KAAK;;oBAAI,IAAI,CAAC,OAAO;wBAAS;;gBAAE,IAAI,CAAC,IAAI,CACtD,CACR;SACF,CAAC,CAAC;KACJ,CAAC;IAEF,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ;QACzB,oBAAC,MAAM,IAAC,KAAK,EAAE,WAAW,IACvB,CAAC,IAAI,EAAE,EAAE,CAAC,oBAAC,GAAG,IAAC,GAAG,EAAE,IAAI,CAAC,GAAG,IAAG,IAAI,CAAC,OAAO,CAAO,CAC5C,CACL,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,MAAM,CAAC,oBAAC,KAAK,OAAG,CAAC,CAAC;AACpB,CAAC"}
@@ -1,2 +0,0 @@
1
- export declare function docsCommand(path?: string): void;
2
- //# sourceMappingURL=docs.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../../src/commands/docs.tsx"],"names":[],"mappings":"AAOA,wBAAgB,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,QAYxC"}
@@ -1,32 +0,0 @@
1
- import { readFileSync, existsSync } from "fs";
2
- import { join, dirname } from "path";
3
- import { fileURLToPath } from "url";
4
- const __dirname = dirname(fileURLToPath(import.meta.url));
5
- const docsDir = join(__dirname, "..", "docs");
6
- export function docsCommand(path) {
7
- const docPath = resolveDocPath(path);
8
- if (!docPath) {
9
- console.error(`Documentation not found: ${path || "index"}\n\nRun 'specific docs' to see available topics.`);
10
- process.exit(1);
11
- }
12
- const content = readFileSync(docPath, "utf-8");
13
- console.log(content);
14
- }
15
- function resolveDocPath(path) {
16
- if (!path) {
17
- const indexPath = join(docsDir, "index.md");
18
- return existsSync(indexPath) ? indexPath : null;
19
- }
20
- // Try path.md first
21
- const directPath = join(docsDir, `${path}.md`);
22
- if (existsSync(directPath)) {
23
- return directPath;
24
- }
25
- // Try path/index.md for directories
26
- const indexPath = join(docsDir, path, "index.md");
27
- if (existsSync(indexPath)) {
28
- return indexPath;
29
- }
30
- return null;
31
- }
32
- //# sourceMappingURL=docs.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/commands/docs.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAE9C,MAAM,UAAU,WAAW,CAAC,IAAa;IACvC,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAErC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACX,4BAA4B,IAAI,IAAI,OAAO,kDAAkD,CAC9F,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACvB,CAAC;AAED,SAAS,cAAc,CAAC,IAAa;IACnC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAC5C,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IAClD,CAAC;IAED,oBAAoB;IACpB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC;IAC/C,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,oCAAoC;IACpC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IAClD,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -1,2 +0,0 @@
1
- export declare function execCommand(serviceName: string, command: string[]): Promise<void>;
2
- //# sourceMappingURL=exec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/commands/exec.tsx"],"names":[],"mappings":"AA2BA,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,iBAmMvE"}
@@ -1,178 +0,0 @@
1
- import { spawn } from "child_process";
2
- import * as fs from "fs";
3
- import * as path from "path";
4
- import { parseConfig } from "@specific/config";
5
- import { PortAllocator, startDatabase, resolveEnvForExec, InstanceStateManager, } from "../lib/dev/index.js";
6
- import { prepareSecrets } from "../lib/secrets/index.js";
7
- function findRequiredDatabases(service) {
8
- const requiredNames = new Set();
9
- if (service.env) {
10
- for (const value of Object.values(service.env)) {
11
- if (typeof value === "object" && value.type === "database") {
12
- requiredNames.add(value.name);
13
- }
14
- }
15
- }
16
- return Array.from(requiredNames);
17
- }
18
- export async function execCommand(serviceName, command) {
19
- if (command.length === 0) {
20
- console.error("Error: No command provided. Usage: specific exec <service> -- <command>");
21
- process.exit(1);
22
- }
23
- const startedDatabases = [];
24
- let ownsInstances = false;
25
- let stateManager = null;
26
- const cleanup = async () => {
27
- if (ownsInstances) {
28
- for (const db of startedDatabases) {
29
- await db.stop().catch(() => { });
30
- }
31
- if (stateManager) {
32
- await stateManager.releaseOwnership().catch(() => { });
33
- }
34
- }
35
- };
36
- // Load config
37
- const configPath = path.join(process.cwd(), "specific.hcl");
38
- if (!fs.existsSync(configPath)) {
39
- console.error("Error: No specific.hcl found in current directory");
40
- process.exit(1);
41
- }
42
- let config;
43
- try {
44
- const hcl = fs.readFileSync(configPath, "utf-8");
45
- config = await parseConfig(hcl);
46
- }
47
- catch (err) {
48
- console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);
49
- process.exit(1);
50
- }
51
- // Find service
52
- const service = config.services.find((s) => s.name === serviceName);
53
- if (!service) {
54
- const available = config.services.map((s) => s.name).join(", ");
55
- console.error(`Error: Service "${serviceName}" not found. Available services: ${available || "none"}`);
56
- process.exit(1);
57
- }
58
- // Identify required databases
59
- const requiredDbNames = findRequiredDatabases(service);
60
- const databases = new Map();
61
- // Check for existing instances
62
- stateManager = new InstanceStateManager(process.cwd());
63
- await stateManager.cleanStaleState();
64
- const existingInstances = await stateManager.getExistingInstances();
65
- if (requiredDbNames.length > 0) {
66
- if (existingInstances) {
67
- // Use existing instances
68
- console.error("Using existing database instances...");
69
- for (const dbName of requiredDbNames) {
70
- const dbState = existingInstances.databases[dbName];
71
- if (!dbState) {
72
- console.error(`Error: Required database "${dbName}" not found in running instances`);
73
- process.exit(1);
74
- }
75
- // Create a DatabaseInstance that doesn't own the underlying database
76
- databases.set(dbName, {
77
- name: dbName,
78
- engine: dbState.engine,
79
- port: dbState.port,
80
- host: dbState.host,
81
- user: dbState.user,
82
- password: dbState.password,
83
- dbName: dbState.dbName,
84
- url: dbState.url,
85
- async stop() {
86
- // No-op: we don't own this instance
87
- },
88
- });
89
- }
90
- }
91
- else {
92
- // No existing instances - claim ownership and start our own
93
- console.error("Starting databases...");
94
- try {
95
- await stateManager.claimOwnership("exec");
96
- ownsInstances = true;
97
- }
98
- catch (err) {
99
- console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);
100
- process.exit(1);
101
- }
102
- const portAllocator = new PortAllocator();
103
- for (const dbName of requiredDbNames) {
104
- const dbConfig = config.databases.find((d) => d.name === dbName);
105
- if (!dbConfig) {
106
- console.error(`Error: Database "${dbName}" referenced by service "${serviceName}" not found in config`);
107
- await cleanup();
108
- process.exit(1);
109
- }
110
- try {
111
- const port = portAllocator.allocate();
112
- const instance = await startDatabase(dbConfig, port);
113
- databases.set(dbName, instance);
114
- startedDatabases.push(instance);
115
- await stateManager.registerDatabase(dbName, {
116
- engine: instance.engine,
117
- port: instance.port,
118
- host: instance.host,
119
- user: instance.user,
120
- password: instance.password,
121
- dbName: instance.dbName,
122
- url: instance.url,
123
- });
124
- }
125
- catch (err) {
126
- console.error(`Error: Failed to start database "${dbName}": ${err instanceof Error ? err.message : String(err)}`);
127
- await cleanup();
128
- process.exit(1);
129
- }
130
- }
131
- }
132
- }
133
- // Prepare secrets and resolve environment variables
134
- let resolvedEnv;
135
- try {
136
- const secrets = await prepareSecrets(config.secrets);
137
- resolvedEnv = resolveEnvForExec(service.env, databases, secrets);
138
- }
139
- catch (err) {
140
- console.error(`Error: Failed to resolve environment variables: ${err instanceof Error ? err.message : String(err)}`);
141
- await cleanup();
142
- process.exit(1);
143
- }
144
- // Handle signals - forward to child and cleanup
145
- let child = null;
146
- const handleSignal = async (signal) => {
147
- if (child && !child.killed) {
148
- child.kill(signal);
149
- }
150
- await cleanup();
151
- };
152
- process.on("SIGINT", () => handleSignal("SIGINT"));
153
- process.on("SIGTERM", () => handleSignal("SIGTERM"));
154
- // Execute command with inherited stdio for full interactivity
155
- child = spawn(command[0], command.slice(1), {
156
- cwd: process.cwd(),
157
- env: {
158
- ...process.env,
159
- ...resolvedEnv,
160
- },
161
- stdio: "inherit",
162
- });
163
- child.on("exit", async (code, signal) => {
164
- await cleanup();
165
- if (signal) {
166
- process.kill(process.pid, signal);
167
- }
168
- else {
169
- process.exit(code ?? 0);
170
- }
171
- });
172
- child.on("error", async (err) => {
173
- console.error(`Error: Failed to execute command: ${err.message}`);
174
- await cleanup();
175
- process.exit(1);
176
- });
177
- }
178
- //# sourceMappingURL=exec.js.map