@specific.dev/cli 0.1.73 → 0.1.74
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.
- package/dist/admin/404/index.html +1 -1
- package/dist/admin/404.html +1 -1
- package/dist/admin/__next.!KGRlZmF1bHQp.__PAGE__.txt +1 -1
- package/dist/admin/__next.!KGRlZmF1bHQp.txt +1 -1
- package/dist/admin/__next._full.txt +1 -1
- package/dist/admin/__next._head.txt +1 -1
- package/dist/admin/__next._index.txt +1 -1
- package/dist/admin/__next._tree.txt +1 -1
- package/dist/admin/_not-found/__next._full.txt +1 -1
- package/dist/admin/_not-found/__next._head.txt +1 -1
- package/dist/admin/_not-found/__next._index.txt +1 -1
- package/dist/admin/_not-found/__next._not-found.__PAGE__.txt +1 -1
- package/dist/admin/_not-found/__next._not-found.txt +1 -1
- package/dist/admin/_not-found/__next._tree.txt +1 -1
- package/dist/admin/_not-found/index.html +1 -1
- package/dist/admin/_not-found/index.txt +1 -1
- package/dist/admin/databases/__next.!KGRlZmF1bHQp.databases.__PAGE__.txt +1 -1
- package/dist/admin/databases/__next.!KGRlZmF1bHQp.databases.txt +1 -1
- package/dist/admin/databases/__next.!KGRlZmF1bHQp.txt +1 -1
- package/dist/admin/databases/__next._full.txt +1 -1
- package/dist/admin/databases/__next._head.txt +1 -1
- package/dist/admin/databases/__next._index.txt +1 -1
- package/dist/admin/databases/__next._tree.txt +1 -1
- package/dist/admin/databases/index.html +1 -1
- package/dist/admin/databases/index.txt +1 -1
- package/dist/admin/fullscreen/__next._full.txt +1 -1
- package/dist/admin/fullscreen/__next._head.txt +1 -1
- package/dist/admin/fullscreen/__next._index.txt +1 -1
- package/dist/admin/fullscreen/__next._tree.txt +1 -1
- package/dist/admin/fullscreen/__next.fullscreen.__PAGE__.txt +1 -1
- package/dist/admin/fullscreen/__next.fullscreen.txt +1 -1
- package/dist/admin/fullscreen/databases/__next._full.txt +1 -1
- package/dist/admin/fullscreen/databases/__next._head.txt +1 -1
- package/dist/admin/fullscreen/databases/__next._index.txt +1 -1
- package/dist/admin/fullscreen/databases/__next._tree.txt +1 -1
- package/dist/admin/fullscreen/databases/__next.fullscreen.databases.__PAGE__.txt +1 -1
- package/dist/admin/fullscreen/databases/__next.fullscreen.databases.txt +1 -1
- package/dist/admin/fullscreen/databases/__next.fullscreen.txt +1 -1
- package/dist/admin/fullscreen/databases/index.html +1 -1
- package/dist/admin/fullscreen/databases/index.txt +1 -1
- package/dist/admin/fullscreen/index.html +1 -1
- package/dist/admin/fullscreen/index.txt +1 -1
- package/dist/admin/index.html +1 -1
- package/dist/admin/index.txt +1 -1
- package/dist/admin/mail/__next.!KGRlZmF1bHQp.mail.__PAGE__.txt +1 -1
- package/dist/admin/mail/__next.!KGRlZmF1bHQp.mail.txt +1 -1
- package/dist/admin/mail/__next.!KGRlZmF1bHQp.txt +1 -1
- package/dist/admin/mail/__next._full.txt +1 -1
- package/dist/admin/mail/__next._head.txt +1 -1
- package/dist/admin/mail/__next._index.txt +1 -1
- package/dist/admin/mail/__next._tree.txt +1 -1
- package/dist/admin/mail/index.html +1 -1
- package/dist/admin/mail/index.txt +1 -1
- package/dist/admin/workflows/__next.!KGRlZmF1bHQp.txt +1 -1
- package/dist/admin/workflows/__next.!KGRlZmF1bHQp.workflows.__PAGE__.txt +1 -1
- package/dist/admin/workflows/__next.!KGRlZmF1bHQp.workflows.txt +1 -1
- package/dist/admin/workflows/__next._full.txt +1 -1
- package/dist/admin/workflows/__next._head.txt +1 -1
- package/dist/admin/workflows/__next._index.txt +1 -1
- package/dist/admin/workflows/__next._tree.txt +1 -1
- package/dist/admin/workflows/index.html +1 -1
- package/dist/admin/workflows/index.txt +1 -1
- package/dist/cli.js +102 -324
- package/dist/postinstall.js +1 -1
- package/package.json +1 -1
- /package/dist/admin/_next/static/{2GhRJUspcGN_TKmFF6ihm → rlz8iRhM93pN2MuVf1ScD}/_buildManifest.js +0 -0
- /package/dist/admin/_next/static/{2GhRJUspcGN_TKmFF6ihm → rlz8iRhM93pN2MuVf1ScD}/_clientMiddlewareManifest.json +0 -0
- /package/dist/admin/_next/static/{2GhRJUspcGN_TKmFF6ihm → rlz8iRhM93pN2MuVf1ScD}/_ssgManifest.js +0 -0
package/dist/cli.js
CHANGED
|
@@ -637,19 +637,19 @@ var init_open = __esm({
|
|
|
637
637
|
}
|
|
638
638
|
const subprocess = childProcess3.spawn(command, cliArguments, childProcessOptions);
|
|
639
639
|
if (options2.wait) {
|
|
640
|
-
return new Promise((
|
|
640
|
+
return new Promise((resolve9, reject) => {
|
|
641
641
|
subprocess.once("error", reject);
|
|
642
642
|
subprocess.once("close", (exitCode) => {
|
|
643
643
|
if (!options2.allowNonzeroExitCode && exitCode !== 0) {
|
|
644
644
|
reject(new Error(`Exited with code ${exitCode}`));
|
|
645
645
|
return;
|
|
646
646
|
}
|
|
647
|
-
|
|
647
|
+
resolve9(subprocess);
|
|
648
648
|
});
|
|
649
649
|
});
|
|
650
650
|
}
|
|
651
651
|
if (isFallbackAttempt) {
|
|
652
|
-
return new Promise((
|
|
652
|
+
return new Promise((resolve9, reject) => {
|
|
653
653
|
subprocess.once("error", reject);
|
|
654
654
|
subprocess.once("spawn", () => {
|
|
655
655
|
subprocess.once("close", (exitCode) => {
|
|
@@ -659,17 +659,17 @@ var init_open = __esm({
|
|
|
659
659
|
return;
|
|
660
660
|
}
|
|
661
661
|
subprocess.unref();
|
|
662
|
-
|
|
662
|
+
resolve9(subprocess);
|
|
663
663
|
});
|
|
664
664
|
});
|
|
665
665
|
});
|
|
666
666
|
}
|
|
667
667
|
subprocess.unref();
|
|
668
|
-
return new Promise((
|
|
668
|
+
return new Promise((resolve9, reject) => {
|
|
669
669
|
subprocess.once("error", reject);
|
|
670
670
|
subprocess.once("spawn", () => {
|
|
671
671
|
subprocess.off("error", reject);
|
|
672
|
-
|
|
672
|
+
resolve9(subprocess);
|
|
673
673
|
});
|
|
674
674
|
});
|
|
675
675
|
};
|
|
@@ -184046,7 +184046,7 @@ async function pollUntilToken(deviceAuth, isCancelled) {
|
|
|
184046
184046
|
return null;
|
|
184047
184047
|
}
|
|
184048
184048
|
function sleep(ms) {
|
|
184049
|
-
return new Promise((
|
|
184049
|
+
return new Promise((resolve9) => setTimeout(resolve9, ms));
|
|
184050
184050
|
}
|
|
184051
184051
|
|
|
184052
184052
|
// src/lib/auth/login.tsx
|
|
@@ -184063,7 +184063,7 @@ function LoginUI({
|
|
|
184063
184063
|
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", gap: 1 }, isReauthentication && /* @__PURE__ */ React.createElement(Text, { color: "yellow" }, "Session expired. Please log in again."), /* @__PURE__ */ React.createElement(Text, { bold: true }, "Log in to Specific"), state.phase === "waiting-for-browser" ? /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, null, "Your authentication code:", " ", /* @__PURE__ */ React.createElement(Text, { color: "cyan", bold: true }, state.userCode))), /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: "blue" }, /* @__PURE__ */ React.createElement(Spinner, { type: "dots" })), /* @__PURE__ */ React.createElement(Text, null, " Waiting for authentication in browser...")), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "If the browser didn't open, visit: ", state.verificationUri)) : /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: "blue" }, /* @__PURE__ */ React.createElement(Spinner, { type: "dots" })), /* @__PURE__ */ React.createElement(Text, null, " Initiating login...")));
|
|
184064
184064
|
}
|
|
184065
184065
|
function performLogin(options2 = {}) {
|
|
184066
|
-
return new Promise((
|
|
184066
|
+
return new Promise((resolve9) => {
|
|
184067
184067
|
let currentState = { phase: "initiating" };
|
|
184068
184068
|
let flowHandle;
|
|
184069
184069
|
const instance = render(
|
|
@@ -184103,14 +184103,14 @@ function performLogin(options2 = {}) {
|
|
|
184103
184103
|
process.off("SIGINT", handleExit);
|
|
184104
184104
|
process.off("SIGTERM", handleExit);
|
|
184105
184105
|
instance.unmount();
|
|
184106
|
-
|
|
184106
|
+
resolve9({ success: true, userEmail: newState.email });
|
|
184107
184107
|
}, 100);
|
|
184108
184108
|
} else if (newState.phase === "error") {
|
|
184109
184109
|
setTimeout(() => {
|
|
184110
184110
|
process.off("SIGINT", handleExit);
|
|
184111
184111
|
process.off("SIGTERM", handleExit);
|
|
184112
184112
|
instance.unmount();
|
|
184113
|
-
|
|
184113
|
+
resolve9({ success: false, error: new Error(newState.message) });
|
|
184114
184114
|
}, 100);
|
|
184115
184115
|
}
|
|
184116
184116
|
}
|
|
@@ -184587,7 +184587,7 @@ function trackEvent(event, properties) {
|
|
|
184587
184587
|
event,
|
|
184588
184588
|
properties: {
|
|
184589
184589
|
...properties,
|
|
184590
|
-
cli_version: "0.1.
|
|
184590
|
+
cli_version: "0.1.74",
|
|
184591
184591
|
platform: process.platform,
|
|
184592
184592
|
node_version: process.version,
|
|
184593
184593
|
project_id: getProjectId()
|
|
@@ -186048,10 +186048,10 @@ async function downloadFile(url, destPath, onProgress) {
|
|
|
186048
186048
|
});
|
|
186049
186049
|
}
|
|
186050
186050
|
}
|
|
186051
|
-
await new Promise((
|
|
186051
|
+
await new Promise((resolve9, reject) => {
|
|
186052
186052
|
fileStream.end((err) => {
|
|
186053
186053
|
if (err) reject(err);
|
|
186054
|
-
else
|
|
186054
|
+
else resolve9();
|
|
186055
186055
|
});
|
|
186056
186056
|
});
|
|
186057
186057
|
fs13.renameSync(partPath, destPath);
|
|
@@ -186277,13 +186277,13 @@ async function runReshapeCheck(migrationsDir) {
|
|
|
186277
186277
|
try {
|
|
186278
186278
|
const binary = await ensureBinary(reshapeBinary);
|
|
186279
186279
|
const reshapePath = binary.executables["reshape"];
|
|
186280
|
-
return new Promise((
|
|
186280
|
+
return new Promise((resolve9) => {
|
|
186281
186281
|
execFile7(reshapePath, ["check", "--dirs", migrationsDir], (err, _stdout, stderr) => {
|
|
186282
186282
|
if (err) {
|
|
186283
186283
|
const errorMsg = stderr.trim() || err.message;
|
|
186284
|
-
|
|
186284
|
+
resolve9({ success: false, error: errorMsg });
|
|
186285
186285
|
} else {
|
|
186286
|
-
|
|
186286
|
+
resolve9({ success: true });
|
|
186287
186287
|
}
|
|
186288
186288
|
});
|
|
186289
186289
|
});
|
|
@@ -187252,7 +187252,7 @@ var NodeFsHandler = class {
|
|
|
187252
187252
|
this._addToNodeFs(path30, initialAdd, wh, depth + 1);
|
|
187253
187253
|
}
|
|
187254
187254
|
}).on(EV.ERROR, this._boundHandleError);
|
|
187255
|
-
return new Promise((
|
|
187255
|
+
return new Promise((resolve9, reject) => {
|
|
187256
187256
|
if (!stream)
|
|
187257
187257
|
return reject();
|
|
187258
187258
|
stream.once(STR_END, () => {
|
|
@@ -187261,7 +187261,7 @@ var NodeFsHandler = class {
|
|
|
187261
187261
|
return;
|
|
187262
187262
|
}
|
|
187263
187263
|
const wasThrottled = throttler ? throttler.clear() : false;
|
|
187264
|
-
|
|
187264
|
+
resolve9(void 0);
|
|
187265
187265
|
previous.getChildren().filter((item) => {
|
|
187266
187266
|
return item !== directory && !current.has(item);
|
|
187267
187267
|
}).forEach((item) => {
|
|
@@ -188325,7 +188325,7 @@ async function startStorage(storage, port, dataDir) {
|
|
|
188325
188325
|
};
|
|
188326
188326
|
}
|
|
188327
188327
|
async function runCommand(command, args, env2) {
|
|
188328
|
-
return new Promise((
|
|
188328
|
+
return new Promise((resolve9, reject) => {
|
|
188329
188329
|
const proc = spawn(command, args, {
|
|
188330
188330
|
stdio: ["ignore", "pipe", "pipe"],
|
|
188331
188331
|
env: env2
|
|
@@ -188336,7 +188336,7 @@ async function runCommand(command, args, env2) {
|
|
|
188336
188336
|
});
|
|
188337
188337
|
proc.on("close", (code) => {
|
|
188338
188338
|
if (code === 0) {
|
|
188339
|
-
|
|
188339
|
+
resolve9();
|
|
188340
188340
|
} else {
|
|
188341
188341
|
reject(new Error(`Command failed with code ${code}: ${stderr}`));
|
|
188342
188342
|
}
|
|
@@ -188345,7 +188345,7 @@ async function runCommand(command, args, env2) {
|
|
|
188345
188345
|
});
|
|
188346
188346
|
}
|
|
188347
188347
|
async function createPostgresDatabase(postgresPath, dataDir, dbName, env2) {
|
|
188348
|
-
return new Promise((
|
|
188348
|
+
return new Promise((resolve9, reject) => {
|
|
188349
188349
|
const proc = spawn(
|
|
188350
188350
|
postgresPath,
|
|
188351
188351
|
["--single", "-D", dataDir, "postgres"],
|
|
@@ -188359,7 +188359,7 @@ async function createPostgresDatabase(postgresPath, dataDir, dbName, env2) {
|
|
|
188359
188359
|
stderr += data.toString();
|
|
188360
188360
|
});
|
|
188361
188361
|
proc.on("close", (code) => {
|
|
188362
|
-
|
|
188362
|
+
resolve9();
|
|
188363
188363
|
});
|
|
188364
188364
|
proc.on("error", reject);
|
|
188365
188365
|
proc.stdin?.write(`CREATE DATABASE "${dbName}";
|
|
@@ -188379,33 +188379,33 @@ async function waitForTcpPort(host, port, timeoutMs = 3e4) {
|
|
|
188379
188379
|
throw new Error(`Port ${port} did not become available within timeout`);
|
|
188380
188380
|
}
|
|
188381
188381
|
function checkTcpPort(host, port) {
|
|
188382
|
-
return new Promise((
|
|
188382
|
+
return new Promise((resolve9) => {
|
|
188383
188383
|
const socket = new net.Socket();
|
|
188384
188384
|
socket.setTimeout(1e3);
|
|
188385
188385
|
socket.on("connect", () => {
|
|
188386
188386
|
socket.destroy();
|
|
188387
|
-
|
|
188387
|
+
resolve9(true);
|
|
188388
188388
|
});
|
|
188389
188389
|
socket.on("timeout", () => {
|
|
188390
188390
|
socket.destroy();
|
|
188391
|
-
|
|
188391
|
+
resolve9(false);
|
|
188392
188392
|
});
|
|
188393
188393
|
socket.on("error", () => {
|
|
188394
188394
|
socket.destroy();
|
|
188395
|
-
|
|
188395
|
+
resolve9(false);
|
|
188396
188396
|
});
|
|
188397
188397
|
socket.connect(port, host);
|
|
188398
188398
|
});
|
|
188399
188399
|
}
|
|
188400
188400
|
async function stopProcess(proc) {
|
|
188401
|
-
return new Promise((
|
|
188401
|
+
return new Promise((resolve9) => {
|
|
188402
188402
|
if (proc.killed || proc.exitCode !== null) {
|
|
188403
|
-
|
|
188403
|
+
resolve9();
|
|
188404
188404
|
return;
|
|
188405
188405
|
}
|
|
188406
188406
|
proc.once("exit", () => {
|
|
188407
188407
|
clearTimeout(forceKillTimeout);
|
|
188408
|
-
|
|
188408
|
+
resolve9();
|
|
188409
188409
|
});
|
|
188410
188410
|
proc.kill("SIGTERM");
|
|
188411
188411
|
const forceKillTimeout = setTimeout(() => {
|
|
@@ -188416,7 +188416,7 @@ async function stopProcess(proc) {
|
|
|
188416
188416
|
});
|
|
188417
188417
|
}
|
|
188418
188418
|
function sleep2(ms) {
|
|
188419
|
-
return new Promise((
|
|
188419
|
+
return new Promise((resolve9) => setTimeout(resolve9, ms));
|
|
188420
188420
|
}
|
|
188421
188421
|
|
|
188422
188422
|
// src/lib/dev/service-runner.ts
|
|
@@ -188900,14 +188900,14 @@ function startService(service, resources, secrets, configs, endpointPorts, servi
|
|
|
188900
188900
|
ports: endpointPorts,
|
|
188901
188901
|
process: child,
|
|
188902
188902
|
async stop() {
|
|
188903
|
-
return new Promise((
|
|
188903
|
+
return new Promise((resolve9) => {
|
|
188904
188904
|
if (child.killed || child.exitCode !== null) {
|
|
188905
|
-
|
|
188905
|
+
resolve9();
|
|
188906
188906
|
return;
|
|
188907
188907
|
}
|
|
188908
188908
|
child.once("exit", () => {
|
|
188909
188909
|
clearTimeout(forceKillTimeout);
|
|
188910
|
-
|
|
188910
|
+
resolve9();
|
|
188911
188911
|
});
|
|
188912
188912
|
const pid = child.pid;
|
|
188913
188913
|
if (pid) {
|
|
@@ -189001,7 +189001,7 @@ var InstanceStateManager = class {
|
|
|
189001
189001
|
}
|
|
189002
189002
|
continue;
|
|
189003
189003
|
}
|
|
189004
|
-
await new Promise((
|
|
189004
|
+
await new Promise((resolve9) => setTimeout(resolve9, 100));
|
|
189005
189005
|
} else {
|
|
189006
189006
|
throw e;
|
|
189007
189007
|
}
|
|
@@ -189334,7 +189334,7 @@ async function startHttpProxy(services, certificate, getState, instanceKey = "de
|
|
|
189334
189334
|
handleRequest
|
|
189335
189335
|
);
|
|
189336
189336
|
httpsServer.on("upgrade", handleUpgrade);
|
|
189337
|
-
return new Promise((
|
|
189337
|
+
return new Promise((resolve9, reject) => {
|
|
189338
189338
|
let httpStarted = false;
|
|
189339
189339
|
let httpsStarted = false;
|
|
189340
189340
|
let failed = false;
|
|
@@ -189345,7 +189345,7 @@ async function startHttpProxy(services, certificate, getState, instanceKey = "de
|
|
|
189345
189345
|
"proxy",
|
|
189346
189346
|
`HTTP/HTTPS proxy started on ports ${HTTP_PORT}/${HTTPS_PORT}`
|
|
189347
189347
|
);
|
|
189348
|
-
|
|
189348
|
+
resolve9({
|
|
189349
189349
|
httpPort: HTTP_PORT,
|
|
189350
189350
|
httpsPort: HTTPS_PORT,
|
|
189351
189351
|
updateServices,
|
|
@@ -189357,13 +189357,13 @@ async function startHttpProxy(services, certificate, getState, instanceKey = "de
|
|
|
189357
189357
|
writeLog("proxy", "Certificate updated");
|
|
189358
189358
|
},
|
|
189359
189359
|
async stop() {
|
|
189360
|
-
return new Promise((
|
|
189360
|
+
return new Promise((resolve10) => {
|
|
189361
189361
|
let closed = 0;
|
|
189362
189362
|
const onClose = () => {
|
|
189363
189363
|
closed++;
|
|
189364
189364
|
if (closed === 2) {
|
|
189365
189365
|
clearTimeout(forceCloseTimeout);
|
|
189366
|
-
|
|
189366
|
+
resolve10();
|
|
189367
189367
|
}
|
|
189368
189368
|
};
|
|
189369
189369
|
httpServer.close(onClose);
|
|
@@ -189371,7 +189371,7 @@ async function startHttpProxy(services, certificate, getState, instanceKey = "de
|
|
|
189371
189371
|
const forceCloseTimeout = setTimeout(() => {
|
|
189372
189372
|
httpServer.closeAllConnections?.();
|
|
189373
189373
|
httpsServer.closeAllConnections?.();
|
|
189374
|
-
|
|
189374
|
+
resolve10();
|
|
189375
189375
|
}, 2e3);
|
|
189376
189376
|
});
|
|
189377
189377
|
}
|
|
@@ -189599,7 +189599,7 @@ function serveFileContent(res, filePath, contentType, statusCode = 200) {
|
|
|
189599
189599
|
}
|
|
189600
189600
|
}
|
|
189601
189601
|
async function startAdminServer(getState) {
|
|
189602
|
-
return new Promise((
|
|
189602
|
+
return new Promise((resolve9, reject) => {
|
|
189603
189603
|
const server = http.createServer((req, res) => {
|
|
189604
189604
|
const url = new URL(req.url || "/", "http://localhost");
|
|
189605
189605
|
res.setHeader("Access-Control-Allow-Origin", "*");
|
|
@@ -189631,7 +189631,7 @@ async function startAdminServer(getState) {
|
|
|
189631
189631
|
}
|
|
189632
189632
|
const port = addr.port;
|
|
189633
189633
|
writeLog("admin", `Admin API server started on port ${port}`);
|
|
189634
|
-
|
|
189634
|
+
resolve9({
|
|
189635
189635
|
port,
|
|
189636
189636
|
stop: () => new Promise((res, rej) => {
|
|
189637
189637
|
server.close((err) => err ? rej(err) : res());
|
|
@@ -189792,33 +189792,33 @@ async function waitForTcpPort2(host, port, timeoutMs = 3e4) {
|
|
|
189792
189792
|
throw new Error(`Electric port ${port} did not become available within timeout`);
|
|
189793
189793
|
}
|
|
189794
189794
|
function checkTcpPort2(host, port) {
|
|
189795
|
-
return new Promise((
|
|
189795
|
+
return new Promise((resolve9) => {
|
|
189796
189796
|
const socket = new net2.Socket();
|
|
189797
189797
|
socket.setTimeout(1e3);
|
|
189798
189798
|
socket.on("connect", () => {
|
|
189799
189799
|
socket.destroy();
|
|
189800
|
-
|
|
189800
|
+
resolve9(true);
|
|
189801
189801
|
});
|
|
189802
189802
|
socket.on("timeout", () => {
|
|
189803
189803
|
socket.destroy();
|
|
189804
|
-
|
|
189804
|
+
resolve9(false);
|
|
189805
189805
|
});
|
|
189806
189806
|
socket.on("error", () => {
|
|
189807
189807
|
socket.destroy();
|
|
189808
|
-
|
|
189808
|
+
resolve9(false);
|
|
189809
189809
|
});
|
|
189810
189810
|
socket.connect(port, host);
|
|
189811
189811
|
});
|
|
189812
189812
|
}
|
|
189813
189813
|
async function stopProcess2(proc) {
|
|
189814
|
-
return new Promise((
|
|
189814
|
+
return new Promise((resolve9) => {
|
|
189815
189815
|
if (proc.killed || proc.exitCode !== null) {
|
|
189816
|
-
|
|
189816
|
+
resolve9();
|
|
189817
189817
|
return;
|
|
189818
189818
|
}
|
|
189819
189819
|
proc.once("exit", () => {
|
|
189820
189820
|
clearTimeout(forceKillTimeout);
|
|
189821
|
-
|
|
189821
|
+
resolve9();
|
|
189822
189822
|
});
|
|
189823
189823
|
proc.kill("SIGTERM");
|
|
189824
189824
|
const forceKillTimeout = setTimeout(() => {
|
|
@@ -189829,7 +189829,7 @@ async function stopProcess2(proc) {
|
|
|
189829
189829
|
});
|
|
189830
189830
|
}
|
|
189831
189831
|
function sleep3(ms) {
|
|
189832
|
-
return new Promise((
|
|
189832
|
+
return new Promise((resolve9) => setTimeout(resolve9, ms));
|
|
189833
189833
|
}
|
|
189834
189834
|
|
|
189835
189835
|
// src/lib/dev/mail-manager.ts
|
|
@@ -189924,20 +189924,20 @@ async function startMailServer(mail, smtpPort, apiPort) {
|
|
|
189924
189924
|
res.writeHead(404);
|
|
189925
189925
|
res.end();
|
|
189926
189926
|
});
|
|
189927
|
-
await new Promise((
|
|
189928
|
-
smtpServer.listen(smtpPort, "127.0.0.1", () =>
|
|
189927
|
+
await new Promise((resolve9, reject) => {
|
|
189928
|
+
smtpServer.listen(smtpPort, "127.0.0.1", () => resolve9());
|
|
189929
189929
|
smtpServer.on("error", reject);
|
|
189930
189930
|
});
|
|
189931
|
-
await new Promise((
|
|
189932
|
-
httpServer.listen(apiPort, "127.0.0.1", () =>
|
|
189931
|
+
await new Promise((resolve9, reject) => {
|
|
189932
|
+
httpServer.listen(apiPort, "127.0.0.1", () => resolve9());
|
|
189933
189933
|
httpServer.on("error", reject);
|
|
189934
189934
|
});
|
|
189935
189935
|
const stop = async () => {
|
|
189936
|
-
await new Promise((
|
|
189937
|
-
smtpServer.close(() =>
|
|
189936
|
+
await new Promise((resolve9) => {
|
|
189937
|
+
smtpServer.close(() => resolve9());
|
|
189938
189938
|
});
|
|
189939
|
-
await new Promise((
|
|
189940
|
-
httpServer.close(() =>
|
|
189939
|
+
await new Promise((resolve9) => {
|
|
189940
|
+
httpServer.close(() => resolve9());
|
|
189941
189941
|
});
|
|
189942
189942
|
};
|
|
189943
189943
|
const resource = {
|
|
@@ -190041,33 +190041,33 @@ async function waitForTcpPort3(host, port, timeoutMs = 3e4) {
|
|
|
190041
190041
|
);
|
|
190042
190042
|
}
|
|
190043
190043
|
function checkTcpPort3(host, port) {
|
|
190044
|
-
return new Promise((
|
|
190044
|
+
return new Promise((resolve9) => {
|
|
190045
190045
|
const socket = new net3.Socket();
|
|
190046
190046
|
socket.setTimeout(1e3);
|
|
190047
190047
|
socket.on("connect", () => {
|
|
190048
190048
|
socket.destroy();
|
|
190049
|
-
|
|
190049
|
+
resolve9(true);
|
|
190050
190050
|
});
|
|
190051
190051
|
socket.on("timeout", () => {
|
|
190052
190052
|
socket.destroy();
|
|
190053
|
-
|
|
190053
|
+
resolve9(false);
|
|
190054
190054
|
});
|
|
190055
190055
|
socket.on("error", () => {
|
|
190056
190056
|
socket.destroy();
|
|
190057
|
-
|
|
190057
|
+
resolve9(false);
|
|
190058
190058
|
});
|
|
190059
190059
|
socket.connect(port, host);
|
|
190060
190060
|
});
|
|
190061
190061
|
}
|
|
190062
190062
|
async function stopProcess3(proc) {
|
|
190063
|
-
return new Promise((
|
|
190063
|
+
return new Promise((resolve9) => {
|
|
190064
190064
|
if (proc.killed || proc.exitCode !== null) {
|
|
190065
|
-
|
|
190065
|
+
resolve9();
|
|
190066
190066
|
return;
|
|
190067
190067
|
}
|
|
190068
190068
|
proc.once("exit", () => {
|
|
190069
190069
|
clearTimeout(forceKillTimeout);
|
|
190070
|
-
|
|
190070
|
+
resolve9();
|
|
190071
190071
|
});
|
|
190072
190072
|
proc.kill("SIGTERM");
|
|
190073
190073
|
const forceKillTimeout = setTimeout(() => {
|
|
@@ -190078,7 +190078,7 @@ async function stopProcess3(proc) {
|
|
|
190078
190078
|
});
|
|
190079
190079
|
}
|
|
190080
190080
|
function sleep4(ms) {
|
|
190081
|
-
return new Promise((
|
|
190081
|
+
return new Promise((resolve9) => setTimeout(resolve9, ms));
|
|
190082
190082
|
}
|
|
190083
190083
|
|
|
190084
190084
|
// src/lib/dev/sync-detector.ts
|
|
@@ -190443,38 +190443,38 @@ async function waitForTcpPort4(host, port, timeoutMs = 3e4) {
|
|
|
190443
190443
|
if (isOpen) {
|
|
190444
190444
|
return;
|
|
190445
190445
|
}
|
|
190446
|
-
await new Promise((
|
|
190446
|
+
await new Promise((resolve9) => setTimeout(resolve9, 100));
|
|
190447
190447
|
}
|
|
190448
190448
|
throw new Error(`Temporal port ${port} did not become available within timeout`);
|
|
190449
190449
|
}
|
|
190450
190450
|
function checkTcpPort4(host, port) {
|
|
190451
|
-
return new Promise((
|
|
190451
|
+
return new Promise((resolve9) => {
|
|
190452
190452
|
const socket = new net4.Socket();
|
|
190453
190453
|
socket.setTimeout(1e3);
|
|
190454
190454
|
socket.on("connect", () => {
|
|
190455
190455
|
socket.destroy();
|
|
190456
|
-
|
|
190456
|
+
resolve9(true);
|
|
190457
190457
|
});
|
|
190458
190458
|
socket.on("timeout", () => {
|
|
190459
190459
|
socket.destroy();
|
|
190460
|
-
|
|
190460
|
+
resolve9(false);
|
|
190461
190461
|
});
|
|
190462
190462
|
socket.on("error", () => {
|
|
190463
190463
|
socket.destroy();
|
|
190464
|
-
|
|
190464
|
+
resolve9(false);
|
|
190465
190465
|
});
|
|
190466
190466
|
socket.connect(port, host);
|
|
190467
190467
|
});
|
|
190468
190468
|
}
|
|
190469
190469
|
async function stopProcess4(proc) {
|
|
190470
|
-
return new Promise((
|
|
190470
|
+
return new Promise((resolve9) => {
|
|
190471
190471
|
if (proc.killed || proc.exitCode !== null) {
|
|
190472
|
-
|
|
190472
|
+
resolve9();
|
|
190473
190473
|
return;
|
|
190474
190474
|
}
|
|
190475
190475
|
proc.once("exit", () => {
|
|
190476
190476
|
clearTimeout(forceKillTimeout);
|
|
190477
|
-
|
|
190477
|
+
resolve9();
|
|
190478
190478
|
});
|
|
190479
190479
|
proc.kill("SIGTERM");
|
|
190480
190480
|
const forceKillTimeout = setTimeout(() => {
|
|
@@ -190949,7 +190949,7 @@ var ProxyRegistryManager = class {
|
|
|
190949
190949
|
* This catches cases where the owner process is alive but the proxy has crashed.
|
|
190950
190950
|
*/
|
|
190951
190951
|
isProxyListening(port, timeoutMs = 1e3) {
|
|
190952
|
-
return new Promise((
|
|
190952
|
+
return new Promise((resolve9) => {
|
|
190953
190953
|
const socket = new net6.Socket();
|
|
190954
190954
|
let resolved = false;
|
|
190955
190955
|
const cleanup = () => {
|
|
@@ -190961,15 +190961,15 @@ var ProxyRegistryManager = class {
|
|
|
190961
190961
|
socket.setTimeout(timeoutMs);
|
|
190962
190962
|
socket.on("connect", () => {
|
|
190963
190963
|
cleanup();
|
|
190964
|
-
|
|
190964
|
+
resolve9(true);
|
|
190965
190965
|
});
|
|
190966
190966
|
socket.on("timeout", () => {
|
|
190967
190967
|
cleanup();
|
|
190968
|
-
|
|
190968
|
+
resolve9(false);
|
|
190969
190969
|
});
|
|
190970
190970
|
socket.on("error", () => {
|
|
190971
190971
|
cleanup();
|
|
190972
|
-
|
|
190972
|
+
resolve9(false);
|
|
190973
190973
|
});
|
|
190974
190974
|
socket.connect(port, "127.0.0.1");
|
|
190975
190975
|
});
|
|
@@ -191020,7 +191020,7 @@ var ProxyRegistryManager = class {
|
|
|
191020
191020
|
}
|
|
191021
191021
|
continue;
|
|
191022
191022
|
}
|
|
191023
|
-
await new Promise((
|
|
191023
|
+
await new Promise((resolve9) => setTimeout(resolve9, 100));
|
|
191024
191024
|
} else {
|
|
191025
191025
|
throw e;
|
|
191026
191026
|
}
|
|
@@ -192697,186 +192697,6 @@ import Spinner5 from "ink-spinner";
|
|
|
192697
192697
|
import * as fs26 from "fs";
|
|
192698
192698
|
import * as path23 from "path";
|
|
192699
192699
|
|
|
192700
|
-
// src/lib/deploy/build-tester.ts
|
|
192701
|
-
import { spawn as spawn6 } from "child_process";
|
|
192702
|
-
import { existsSync as existsSync22 } from "fs";
|
|
192703
|
-
import { join as join23, resolve as resolve7 } from "path";
|
|
192704
|
-
function getDependencyInstallCommand(build, projectDir) {
|
|
192705
|
-
if (!build.base) return null;
|
|
192706
|
-
switch (build.base) {
|
|
192707
|
-
case "node":
|
|
192708
|
-
if (existsSync22(join23(projectDir, "pnpm-lock.yaml"))) {
|
|
192709
|
-
return "pnpm install --frozen-lockfile";
|
|
192710
|
-
} else if (existsSync22(join23(projectDir, "yarn.lock"))) {
|
|
192711
|
-
return "yarn install --frozen-lockfile";
|
|
192712
|
-
} else if (existsSync22(join23(projectDir, "package-lock.json"))) {
|
|
192713
|
-
return "npm ci";
|
|
192714
|
-
} else if (existsSync22(join23(projectDir, "package.json"))) {
|
|
192715
|
-
return "npm install";
|
|
192716
|
-
}
|
|
192717
|
-
return null;
|
|
192718
|
-
case "python":
|
|
192719
|
-
if (existsSync22(join23(projectDir, "poetry.lock"))) {
|
|
192720
|
-
return "poetry install --no-interaction";
|
|
192721
|
-
} else if (existsSync22(join23(projectDir, "Pipfile.lock"))) {
|
|
192722
|
-
return "pipenv install --deploy";
|
|
192723
|
-
} else if (existsSync22(join23(projectDir, "Pipfile"))) {
|
|
192724
|
-
return "pipenv install";
|
|
192725
|
-
} else if (existsSync22(join23(projectDir, "pyproject.toml"))) {
|
|
192726
|
-
return "pip install .";
|
|
192727
|
-
} else if (existsSync22(join23(projectDir, "requirements.txt"))) {
|
|
192728
|
-
return "pip install -r requirements.txt";
|
|
192729
|
-
}
|
|
192730
|
-
return null;
|
|
192731
|
-
case "go":
|
|
192732
|
-
return "go mod download";
|
|
192733
|
-
case "rust":
|
|
192734
|
-
case "java":
|
|
192735
|
-
return null;
|
|
192736
|
-
default:
|
|
192737
|
-
return null;
|
|
192738
|
-
}
|
|
192739
|
-
}
|
|
192740
|
-
function runCommand2(command, projectDir, buildName) {
|
|
192741
|
-
return new Promise((resolve10) => {
|
|
192742
|
-
const stdout = [];
|
|
192743
|
-
const stderr = [];
|
|
192744
|
-
writeLog("build-test", `[${buildName}] Running: ${command}`);
|
|
192745
|
-
const child = spawn6(command, {
|
|
192746
|
-
shell: true,
|
|
192747
|
-
cwd: projectDir,
|
|
192748
|
-
env: { ...process.env },
|
|
192749
|
-
stdio: ["ignore", "pipe", "pipe"]
|
|
192750
|
-
});
|
|
192751
|
-
child.stdout?.on("data", (data) => {
|
|
192752
|
-
const text = data.toString();
|
|
192753
|
-
stdout.push(text);
|
|
192754
|
-
for (const line of text.split("\n")) {
|
|
192755
|
-
if (line.trim()) {
|
|
192756
|
-
writeLog(`build-test:${buildName}`, line);
|
|
192757
|
-
}
|
|
192758
|
-
}
|
|
192759
|
-
});
|
|
192760
|
-
child.stderr?.on("data", (data) => {
|
|
192761
|
-
const text = data.toString();
|
|
192762
|
-
stderr.push(text);
|
|
192763
|
-
for (const line of text.split("\n")) {
|
|
192764
|
-
if (line.trim()) {
|
|
192765
|
-
writeLog(`build-test:${buildName}`, line);
|
|
192766
|
-
}
|
|
192767
|
-
}
|
|
192768
|
-
});
|
|
192769
|
-
child.on("error", (err) => {
|
|
192770
|
-
writeLog("build-test:error", `[${buildName}] Failed to start: ${err.message}`);
|
|
192771
|
-
resolve10({
|
|
192772
|
-
success: false,
|
|
192773
|
-
output: `Failed to start command: ${err.message}`
|
|
192774
|
-
});
|
|
192775
|
-
});
|
|
192776
|
-
child.on("exit", (code) => {
|
|
192777
|
-
const output = [...stdout, ...stderr].join("");
|
|
192778
|
-
if (code === 0) {
|
|
192779
|
-
writeLog("build-test", `[${buildName}] Command succeeded (exit code 0)`);
|
|
192780
|
-
resolve10({ success: true, output });
|
|
192781
|
-
} else {
|
|
192782
|
-
writeLog("build-test:error", `[${buildName}] Command failed with exit code ${code}`);
|
|
192783
|
-
resolve10({
|
|
192784
|
-
success: false,
|
|
192785
|
-
output: output || `Exit code: ${code}`
|
|
192786
|
-
});
|
|
192787
|
-
}
|
|
192788
|
-
});
|
|
192789
|
-
});
|
|
192790
|
-
}
|
|
192791
|
-
async function testBuild(build, projectDir) {
|
|
192792
|
-
const startTime = Date.now();
|
|
192793
|
-
if (build.dockerfile) {
|
|
192794
|
-
writeLog("build-test", `Skipping test for build "${build.name}" (custom Dockerfile)`);
|
|
192795
|
-
return {
|
|
192796
|
-
buildName: build.name,
|
|
192797
|
-
success: true,
|
|
192798
|
-
output: "Skipped: custom Dockerfile build",
|
|
192799
|
-
durationMs: Date.now() - startTime
|
|
192800
|
-
};
|
|
192801
|
-
}
|
|
192802
|
-
const outputs = [];
|
|
192803
|
-
const workDir = build.root ? resolve7(projectDir, build.root) : projectDir;
|
|
192804
|
-
writeLog("build-test", `Starting test for build "${build.name}" (base: ${build.base}, workDir: ${workDir})`);
|
|
192805
|
-
const depsCommand = getDependencyInstallCommand(build, workDir);
|
|
192806
|
-
if (depsCommand) {
|
|
192807
|
-
writeLog("build-test", `[${build.name}] Installing dependencies...`);
|
|
192808
|
-
const depsResult = await runCommand2(depsCommand, workDir, build.name);
|
|
192809
|
-
outputs.push(`[${depsCommand}]
|
|
192810
|
-
${depsResult.output}`);
|
|
192811
|
-
if (!depsResult.success) {
|
|
192812
|
-
const duration2 = Date.now() - startTime;
|
|
192813
|
-
writeLog("build-test:error", `[${build.name}] Dependency installation failed after ${duration2}ms`);
|
|
192814
|
-
return {
|
|
192815
|
-
buildName: build.name,
|
|
192816
|
-
success: false,
|
|
192817
|
-
output: outputs.join("\n\n"),
|
|
192818
|
-
durationMs: duration2
|
|
192819
|
-
};
|
|
192820
|
-
}
|
|
192821
|
-
writeLog("build-test", `[${build.name}] Dependencies installed successfully`);
|
|
192822
|
-
} else {
|
|
192823
|
-
writeLog("build-test", `[${build.name}] No dependency installation needed for base "${build.base}"`);
|
|
192824
|
-
}
|
|
192825
|
-
if (build.command) {
|
|
192826
|
-
writeLog("build-test", `[${build.name}] Running build command...`);
|
|
192827
|
-
const buildResult = await runCommand2(build.command, workDir, build.name);
|
|
192828
|
-
outputs.push(`[${build.command}]
|
|
192829
|
-
${buildResult.output}`);
|
|
192830
|
-
if (!buildResult.success) {
|
|
192831
|
-
const duration2 = Date.now() - startTime;
|
|
192832
|
-
writeLog("build-test:error", `[${build.name}] Build command failed after ${duration2}ms`);
|
|
192833
|
-
return {
|
|
192834
|
-
buildName: build.name,
|
|
192835
|
-
success: false,
|
|
192836
|
-
output: outputs.join("\n\n"),
|
|
192837
|
-
durationMs: duration2
|
|
192838
|
-
};
|
|
192839
|
-
}
|
|
192840
|
-
writeLog("build-test", `[${build.name}] Build command completed successfully`);
|
|
192841
|
-
} else {
|
|
192842
|
-
writeLog("build-test", `[${build.name}] No build command defined, skipping`);
|
|
192843
|
-
}
|
|
192844
|
-
const duration = Date.now() - startTime;
|
|
192845
|
-
writeLog("build-test", `[${build.name}] Build test passed in ${duration}ms`);
|
|
192846
|
-
return {
|
|
192847
|
-
buildName: build.name,
|
|
192848
|
-
success: true,
|
|
192849
|
-
output: outputs.join("\n\n"),
|
|
192850
|
-
durationMs: duration
|
|
192851
|
-
};
|
|
192852
|
-
}
|
|
192853
|
-
async function testAllBuilds(builds, projectDir) {
|
|
192854
|
-
if (builds.length === 0) {
|
|
192855
|
-
writeLog("build-test", "No builds to test");
|
|
192856
|
-
return { results: [], allPassed: true };
|
|
192857
|
-
}
|
|
192858
|
-
writeLog("build-test", `Testing ${builds.length} build(s) in parallel: ${builds.map((b) => b.name).join(", ")}`);
|
|
192859
|
-
writeLog("build-test", `Project directory: ${projectDir}`);
|
|
192860
|
-
const results = await Promise.all(
|
|
192861
|
-
builds.map((build) => testBuild(build, projectDir))
|
|
192862
|
-
);
|
|
192863
|
-
const passed = results.filter((r) => r.success).length;
|
|
192864
|
-
const failed = results.filter((r) => !r.success).length;
|
|
192865
|
-
const totalDuration = results.reduce((sum, r) => sum + r.durationMs, 0);
|
|
192866
|
-
if (failed > 0) {
|
|
192867
|
-
writeLog("build-test:error", `Build tests completed: ${passed} passed, ${failed} failed`);
|
|
192868
|
-
for (const result of results.filter((r) => !r.success)) {
|
|
192869
|
-
writeLog("build-test:error", `Failed build: ${result.buildName}`);
|
|
192870
|
-
}
|
|
192871
|
-
} else {
|
|
192872
|
-
writeLog("build-test", `All ${passed} build(s) passed (total: ${totalDuration}ms)`);
|
|
192873
|
-
}
|
|
192874
|
-
return {
|
|
192875
|
-
results,
|
|
192876
|
-
allPassed: results.every((r) => r.success)
|
|
192877
|
-
};
|
|
192878
|
-
}
|
|
192879
|
-
|
|
192880
192700
|
// src/lib/tarball/create.ts
|
|
192881
192701
|
import { execSync as execSync4 } from "child_process";
|
|
192882
192702
|
import * as fs25 from "fs";
|
|
@@ -193017,7 +192837,6 @@ function PhaseIndicator({
|
|
|
193017
192837
|
showSpinner = true
|
|
193018
192838
|
}) {
|
|
193019
192839
|
const phases = [
|
|
193020
|
-
"testing-builds",
|
|
193021
192840
|
"creating-tarball",
|
|
193022
192841
|
"creating-deployment",
|
|
193023
192842
|
"uploading",
|
|
@@ -193129,7 +192948,7 @@ function formatErrorCode(code) {
|
|
|
193129
192948
|
function StructuredError({ error }) {
|
|
193130
192949
|
return /* @__PURE__ */ React7.createElement(Box7, { flexDirection: "column" }, /* @__PURE__ */ React7.createElement(Text7, { color: "red", bold: true }, formatErrorCode(error.code), ": ", error.message), error.resource && /* @__PURE__ */ React7.createElement(Text7, { dimColor: true }, "Resource: ", error.resource), error.output && /* @__PURE__ */ React7.createElement(Box7, { flexDirection: "column", marginTop: 1 }, /* @__PURE__ */ React7.createElement(Text7, { bold: true }, "Output:"), /* @__PURE__ */ React7.createElement(Text7, null, error.output)));
|
|
193131
192950
|
}
|
|
193132
|
-
function DeployUI({ environment, config
|
|
192951
|
+
function DeployUI({ environment, config }) {
|
|
193133
192952
|
const { exit } = useApp3();
|
|
193134
192953
|
const [state, setState] = useState6({ phase: "checking-auth" });
|
|
193135
192954
|
const clientRef = React7.useRef(null);
|
|
@@ -193140,7 +192959,7 @@ function DeployUI({ environment, config, skipBuildTest }) {
|
|
|
193140
192959
|
const projectId = readProjectId(projectDir);
|
|
193141
192960
|
if (isLoggedIn()) {
|
|
193142
192961
|
setState({
|
|
193143
|
-
phase: "
|
|
192962
|
+
phase: "creating-tarball",
|
|
193144
192963
|
projectId
|
|
193145
192964
|
});
|
|
193146
192965
|
} else {
|
|
@@ -193197,7 +193016,7 @@ function DeployUI({ environment, config, skipBuildTest }) {
|
|
|
193197
193016
|
const successResponse = response;
|
|
193198
193017
|
await saveCredentialsFromToken(successResponse);
|
|
193199
193018
|
setState(
|
|
193200
|
-
(s) => s.projectId ? { phase: "
|
|
193019
|
+
(s) => s.projectId ? { phase: "creating-tarball", projectId: s.projectId } : { phase: "loading-projects" }
|
|
193201
193020
|
);
|
|
193202
193021
|
}
|
|
193203
193022
|
};
|
|
@@ -193248,7 +193067,7 @@ function DeployUI({ environment, config, skipBuildTest }) {
|
|
|
193248
193067
|
} else {
|
|
193249
193068
|
writeProjectId(project.id);
|
|
193250
193069
|
setState({
|
|
193251
|
-
phase: "
|
|
193070
|
+
phase: "creating-tarball",
|
|
193252
193071
|
projectId: project.id
|
|
193253
193072
|
});
|
|
193254
193073
|
}
|
|
@@ -193271,7 +193090,7 @@ function DeployUI({ environment, config, skipBuildTest }) {
|
|
|
193271
193090
|
if (cancelled) return;
|
|
193272
193091
|
writeProjectId(project.id);
|
|
193273
193092
|
setState({
|
|
193274
|
-
phase: "
|
|
193093
|
+
phase: "creating-tarball",
|
|
193275
193094
|
projectId: project.id
|
|
193276
193095
|
});
|
|
193277
193096
|
} catch (err) {
|
|
@@ -193432,43 +193251,11 @@ function DeployUI({ environment, config, skipBuildTest }) {
|
|
|
193432
193251
|
})();
|
|
193433
193252
|
}, [state]);
|
|
193434
193253
|
useEffect4(() => {
|
|
193435
|
-
if (state.phase !== "
|
|
193254
|
+
if (state.phase !== "creating-tarball" || !state.projectId) return;
|
|
193436
193255
|
let cancelled = false;
|
|
193437
|
-
async function
|
|
193256
|
+
async function runDeploy() {
|
|
193438
193257
|
const projectDir = process.cwd();
|
|
193439
193258
|
const builds = config.builds || [];
|
|
193440
|
-
if (!skipBuildTest && builds.length > 0) {
|
|
193441
|
-
writeLog("deploy", `Testing ${builds.length} build(s) locally`);
|
|
193442
|
-
try {
|
|
193443
|
-
const results = await testAllBuilds(builds, projectDir);
|
|
193444
|
-
if (cancelled) return;
|
|
193445
|
-
if (!results.allPassed) {
|
|
193446
|
-
const failures = results.results.filter((r) => !r.success);
|
|
193447
|
-
const errorMsg = failures.map((f) => `Build "${f.buildName}" failed:
|
|
193448
|
-
${f.output}`).join("\n\n");
|
|
193449
|
-
writeLog("deploy:error", errorMsg);
|
|
193450
|
-
setState({
|
|
193451
|
-
phase: "error",
|
|
193452
|
-
error: `Build test failed:
|
|
193453
|
-
${errorMsg}`
|
|
193454
|
-
});
|
|
193455
|
-
return;
|
|
193456
|
-
}
|
|
193457
|
-
writeLog("deploy", "All builds passed local testing");
|
|
193458
|
-
} catch (err) {
|
|
193459
|
-
if (cancelled) return;
|
|
193460
|
-
const errorMsg = `Build test failed: ${err instanceof Error ? err.message : String(err)}`;
|
|
193461
|
-
writeLog("deploy:error", errorMsg);
|
|
193462
|
-
setState({
|
|
193463
|
-
phase: "error",
|
|
193464
|
-
error: errorMsg
|
|
193465
|
-
});
|
|
193466
|
-
return;
|
|
193467
|
-
}
|
|
193468
|
-
} else {
|
|
193469
|
-
writeLog("deploy", skipBuildTest ? "Skipping build tests (--skip-build-test)" : "No builds to test");
|
|
193470
|
-
}
|
|
193471
|
-
setState((s) => ({ ...s, phase: "creating-tarball" }));
|
|
193472
193259
|
writeLog("deploy", `Starting deployment to "${environment}"`);
|
|
193473
193260
|
writeLog("deploy", `Project directory: ${projectDir}`);
|
|
193474
193261
|
const client2 = new ApiClient();
|
|
@@ -193534,11 +193321,11 @@ ${errorMsg}`
|
|
|
193534
193321
|
writeLog("deploy", "Deployment in pending state, waiting for builds to complete");
|
|
193535
193322
|
setState((s) => ({ ...s, phase: "pending", deployment: deployment2 }));
|
|
193536
193323
|
}
|
|
193537
|
-
|
|
193324
|
+
runDeploy();
|
|
193538
193325
|
return () => {
|
|
193539
193326
|
cancelled = true;
|
|
193540
193327
|
};
|
|
193541
|
-
}, [state.projectId, environment, config.builds
|
|
193328
|
+
}, [state.projectId, environment, config.builds]);
|
|
193542
193329
|
useEffect4(() => {
|
|
193543
193330
|
if (state.phase !== "pending" || !state.deployment) return;
|
|
193544
193331
|
let pollInterval;
|
|
@@ -193732,7 +193519,7 @@ ${errorMsg}`
|
|
|
193732
193519
|
};
|
|
193733
193520
|
}, [state.phase, state.deployment?.id]);
|
|
193734
193521
|
useEffect4(() => {
|
|
193735
|
-
if (state.phase === "
|
|
193522
|
+
if (state.phase === "creating-tarball") {
|
|
193736
193523
|
trackEvent("deploy_started", { environment });
|
|
193737
193524
|
}
|
|
193738
193525
|
}, [state.phase, environment]);
|
|
@@ -193827,13 +193614,6 @@ ${errorMsg}`
|
|
|
193827
193614
|
return "Preparing";
|
|
193828
193615
|
};
|
|
193829
193616
|
return /* @__PURE__ */ React7.createElement(Box7, { flexDirection: "column", gap: 1 }, /* @__PURE__ */ React7.createElement(Text7, null, /* @__PURE__ */ React7.createElement(Text7, { bold: true, color: "cyan" }, "Deploying to ", environment), deployment && /* @__PURE__ */ React7.createElement(Text7, { dimColor: true }, " (", deployment.id, ")")), /* @__PURE__ */ React7.createElement(Box7, { flexDirection: "column" }, /* @__PURE__ */ React7.createElement(
|
|
193830
|
-
PhaseIndicator,
|
|
193831
|
-
{
|
|
193832
|
-
phase: "testing-builds",
|
|
193833
|
-
currentPhase: displayPhase,
|
|
193834
|
-
label: "Testing builds locally"
|
|
193835
|
-
}
|
|
193836
|
-
), /* @__PURE__ */ React7.createElement(
|
|
193837
193617
|
PhaseIndicator,
|
|
193838
193618
|
{
|
|
193839
193619
|
phase: "creating-tarball",
|
|
@@ -193887,7 +193667,7 @@ ${errorMsg}`
|
|
|
193887
193667
|
}
|
|
193888
193668
|
), phase === "error" && /* @__PURE__ */ React7.createElement(Box7, { marginTop: 1, flexDirection: "column" }, deployment?.error ? /* @__PURE__ */ React7.createElement(StructuredError, { error: deployment.error }) : /* @__PURE__ */ React7.createElement(Text7, { color: "red", bold: true }, error), buildOutput && /* @__PURE__ */ React7.createElement(Box7, { flexDirection: "column", marginTop: 1 }, /* @__PURE__ */ React7.createElement(Text7, { bold: true }, "Build output:"), /* @__PURE__ */ React7.createElement(Text7, null, buildOutput))), phase === "success" && /* @__PURE__ */ React7.createElement(Box7, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React7.createElement(Text7, { color: "green" }, "Deployment successful!"), deployment?.publicUrls && Object.keys(deployment.publicUrls).length > 0 && /* @__PURE__ */ React7.createElement(Box7, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React7.createElement(Text7, { bold: true }, "Public URLs:"), Object.entries(deployment.publicUrls).map(([name, url]) => /* @__PURE__ */ React7.createElement(Text7, { key: name }, " ", name, ": ", /* @__PURE__ */ React7.createElement(Text7, { color: "cyan" }, url))))));
|
|
193889
193669
|
}
|
|
193890
|
-
async function deployCommand(environment
|
|
193670
|
+
async function deployCommand(environment) {
|
|
193891
193671
|
const configPath = path23.join(process.cwd(), "specific.hcl");
|
|
193892
193672
|
if (!fs26.existsSync(configPath)) {
|
|
193893
193673
|
console.error("Error: No specific.hcl found in current directory");
|
|
@@ -193902,21 +193682,19 @@ async function deployCommand(environment, options2) {
|
|
|
193902
193682
|
process.exit(1);
|
|
193903
193683
|
}
|
|
193904
193684
|
const env2 = environment || "prod";
|
|
193905
|
-
const skipBuildTest = options2?.skipBuildTest ?? false;
|
|
193906
193685
|
render5(
|
|
193907
193686
|
/* @__PURE__ */ React7.createElement(
|
|
193908
193687
|
DeployUI,
|
|
193909
193688
|
{
|
|
193910
193689
|
environment: env2,
|
|
193911
|
-
config
|
|
193912
|
-
skipBuildTest
|
|
193690
|
+
config
|
|
193913
193691
|
}
|
|
193914
193692
|
)
|
|
193915
193693
|
);
|
|
193916
193694
|
}
|
|
193917
193695
|
|
|
193918
193696
|
// src/commands/exec.tsx
|
|
193919
|
-
import { spawn as
|
|
193697
|
+
import { spawn as spawn6 } from "child_process";
|
|
193920
193698
|
import * as fs27 from "fs";
|
|
193921
193699
|
import * as path24 from "path";
|
|
193922
193700
|
async function execCommand(serviceName, command, instanceKey = "default") {
|
|
@@ -194077,7 +193855,7 @@ async function execCommand(serviceName, command, instanceKey = "default") {
|
|
|
194077
193855
|
effectiveCwd = path24.resolve(process.cwd(), build.root);
|
|
194078
193856
|
}
|
|
194079
193857
|
}
|
|
194080
|
-
child =
|
|
193858
|
+
child = spawn6(command[0], command.slice(1), {
|
|
194081
193859
|
cwd: effectiveCwd,
|
|
194082
193860
|
env: {
|
|
194083
193861
|
...process.env,
|
|
@@ -194101,7 +193879,7 @@ async function execCommand(serviceName, command, instanceKey = "default") {
|
|
|
194101
193879
|
}
|
|
194102
193880
|
|
|
194103
193881
|
// src/commands/psql.tsx
|
|
194104
|
-
import { spawn as
|
|
193882
|
+
import { spawn as spawn7 } from "child_process";
|
|
194105
193883
|
import * as fs28 from "fs";
|
|
194106
193884
|
import * as path25 from "path";
|
|
194107
193885
|
async function psqlCommand(databaseName, instanceKey = "default", extraArgs = []) {
|
|
@@ -194224,7 +194002,7 @@ async function psqlCommand(databaseName, instanceKey = "default", extraArgs = []
|
|
|
194224
194002
|
};
|
|
194225
194003
|
process.on("SIGINT", () => handleSignal("SIGINT"));
|
|
194226
194004
|
process.on("SIGTERM", () => handleSignal("SIGTERM"));
|
|
194227
|
-
child =
|
|
194005
|
+
child = spawn7(psqlPath, ["-h", dbState.host, "-p", String(dbState.port), "-U", dbState.user, "-d", dbState.dbName, ...extraArgs], {
|
|
194228
194006
|
cwd: process.cwd(),
|
|
194229
194007
|
env: {
|
|
194230
194008
|
...process.env,
|
|
@@ -194249,7 +194027,7 @@ async function psqlCommand(databaseName, instanceKey = "default", extraArgs = []
|
|
|
194249
194027
|
}
|
|
194250
194028
|
|
|
194251
194029
|
// src/commands/reshape.tsx
|
|
194252
|
-
import { spawn as
|
|
194030
|
+
import { spawn as spawn8 } from "child_process";
|
|
194253
194031
|
import * as fs29 from "fs";
|
|
194254
194032
|
import * as path26 from "path";
|
|
194255
194033
|
var VALID_ACTIONS = ["start", "complete", "status", "abort", "check"];
|
|
@@ -194427,7 +194205,7 @@ async function reshapeCommand(action, databaseName, instanceKey = "default") {
|
|
|
194427
194205
|
};
|
|
194428
194206
|
process.on("SIGINT", () => handleSignal("SIGINT"));
|
|
194429
194207
|
process.on("SIGTERM", () => handleSignal("SIGTERM"));
|
|
194430
|
-
child =
|
|
194208
|
+
child = spawn8(reshapePath, reshapeArgs, {
|
|
194431
194209
|
cwd: process.cwd(),
|
|
194432
194210
|
env: {
|
|
194433
194211
|
...process.env,
|
|
@@ -194704,7 +194482,7 @@ function compareVersions(a, b) {
|
|
|
194704
194482
|
return 0;
|
|
194705
194483
|
}
|
|
194706
194484
|
async function checkForUpdate() {
|
|
194707
|
-
const currentVersion = "0.1.
|
|
194485
|
+
const currentVersion = "0.1.74";
|
|
194708
194486
|
const response = await fetch(`${BINARIES_BASE_URL}/latest?t=${Date.now()}`);
|
|
194709
194487
|
if (!response.ok) {
|
|
194710
194488
|
throw new Error(`Failed to check for updates: HTTP ${response.status}`);
|
|
@@ -194754,7 +194532,7 @@ async function performUpdate(version, onProgress) {
|
|
|
194754
194532
|
}
|
|
194755
194533
|
|
|
194756
194534
|
// src/lib/background-update.ts
|
|
194757
|
-
import { spawn as
|
|
194535
|
+
import { spawn as spawn9 } from "child_process";
|
|
194758
194536
|
import * as fs32 from "fs";
|
|
194759
194537
|
import * as path29 from "path";
|
|
194760
194538
|
import * as os10 from "os";
|
|
@@ -194783,7 +194561,7 @@ function maybeStartBackgroundUpdate() {
|
|
|
194783
194561
|
if (process.env.SPECIFIC_BACKGROUND_UPDATE === "1") return;
|
|
194784
194562
|
if (isRateLimited()) return;
|
|
194785
194563
|
if (!isBinaryWritable()) return;
|
|
194786
|
-
const child =
|
|
194564
|
+
const child = spawn9(process.execPath, [], {
|
|
194787
194565
|
detached: true,
|
|
194788
194566
|
stdio: "ignore",
|
|
194789
194567
|
env: {
|
|
@@ -194903,7 +194681,7 @@ function updateCommand() {
|
|
|
194903
194681
|
var program = new Command();
|
|
194904
194682
|
var env = "production";
|
|
194905
194683
|
var envLabel = env !== "production" ? `[${env.toUpperCase()}] ` : "";
|
|
194906
|
-
program.name("specific").description(`${envLabel}Infrastructure-as-code for coding agents`).version("0.1.
|
|
194684
|
+
program.name("specific").description(`${envLabel}Infrastructure-as-code for coding agents`).version("0.1.74").enablePositionalOptions();
|
|
194907
194685
|
program.command("init").description("Initialize project for use with a coding agent").option("--agent <name...>", "Agents to configure (cursor, claude, codex, other)").action((options2) => initCommand(options2));
|
|
194908
194686
|
program.command("docs [topic]").description("Fetch LLM-optimized documentation").action(docsCommand);
|
|
194909
194687
|
program.command("check").description("Validate specific.hcl configuration").action(checkCommand);
|
|
@@ -194911,8 +194689,8 @@ program.command("dev").description("Start local development environment").option
|
|
|
194911
194689
|
const key = options2.key ?? getDefaultKey();
|
|
194912
194690
|
devCommand(key, options2.tunnel ?? false);
|
|
194913
194691
|
});
|
|
194914
|
-
program.command("deploy [environment]").description("Deploy to Specific infrastructure").
|
|
194915
|
-
deployCommand(environment
|
|
194692
|
+
program.command("deploy [environment]").description("Deploy to Specific infrastructure").action((environment) => {
|
|
194693
|
+
deployCommand(environment);
|
|
194916
194694
|
});
|
|
194917
194695
|
program.command("exec <service> [args...]").description("Run a one-off command with service environment").option("-k, --key <key>", "Dev environment namespace (auto-detected from git worktree if not specified)").passThroughOptions().action(async (service, args, options2) => {
|
|
194918
194696
|
const filteredArgs = args[0] === "--" ? args.slice(1) : args;
|