@cospacehq/cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config.d.ts +23 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +72 -0
- package/dist/config.js.map +1 -0
- package/dist/doctor.d.ts +5 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +99 -0
- package/dist/doctor.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +248 -0
- package/dist/index.js.map +1 -0
- package/dist/postinstall.d.ts +3 -0
- package/dist/postinstall.d.ts.map +1 -0
- package/dist/postinstall.js +26 -0
- package/dist/postinstall.js.map +1 -0
- package/dist/tunnel.d.ts +18 -0
- package/dist/tunnel.d.ts.map +1 -0
- package/dist/tunnel.js +103 -0
- package/dist/tunnel.js.map +1 -0
- package/package.json +33 -0
- package/web-dist/assets/index-C1jgYY2x.css +1 -0
- package/web-dist/assets/index-tgwWzseM.js +65 -0
- package/web-dist/index.html +13 -0
package/dist/tunnel.js
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import process from "node:process";
|
|
3
|
+
function commandExists(command) {
|
|
4
|
+
return new Promise((resolve) => {
|
|
5
|
+
const child = spawn(command, ["--version"], { stdio: "ignore" });
|
|
6
|
+
child.on("error", () => resolve(false));
|
|
7
|
+
child.on("exit", (code) => resolve(code === 0));
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
function waitForUrl(processRef, regex, timeoutMs, provider) {
|
|
11
|
+
return new Promise((resolve, reject) => {
|
|
12
|
+
const timer = setTimeout(() => {
|
|
13
|
+
reject(new Error(`${provider} tunnel did not return a public URL in time`));
|
|
14
|
+
}, timeoutMs);
|
|
15
|
+
const stop = async () => {
|
|
16
|
+
if (!processRef.killed) {
|
|
17
|
+
processRef.kill("SIGTERM");
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
const handleData = (chunk) => {
|
|
21
|
+
const text = chunk.toString("utf8");
|
|
22
|
+
const match = text.match(regex);
|
|
23
|
+
if (!match) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
clearTimeout(timer);
|
|
27
|
+
resolve({
|
|
28
|
+
publicUrl: match[0],
|
|
29
|
+
provider,
|
|
30
|
+
stop
|
|
31
|
+
});
|
|
32
|
+
};
|
|
33
|
+
processRef.stdout.on("data", handleData);
|
|
34
|
+
processRef.stderr.on("data", handleData);
|
|
35
|
+
processRef.on("error", (error) => {
|
|
36
|
+
clearTimeout(timer);
|
|
37
|
+
reject(error);
|
|
38
|
+
});
|
|
39
|
+
processRef.on("exit", (code) => {
|
|
40
|
+
if (code !== 0) {
|
|
41
|
+
clearTimeout(timer);
|
|
42
|
+
reject(new Error(`${provider} process exited with code ${code}`));
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
async function startCloudflare(localUrl) {
|
|
48
|
+
const installed = await commandExists("cloudflared");
|
|
49
|
+
if (!installed) {
|
|
50
|
+
throw new Error("cloudflared is not installed");
|
|
51
|
+
}
|
|
52
|
+
const proc = spawn("cloudflared", ["tunnel", "--url", localUrl, "--no-autoupdate"], {
|
|
53
|
+
stdio: "pipe",
|
|
54
|
+
env: process.env
|
|
55
|
+
});
|
|
56
|
+
return waitForUrl(proc, /https:\/\/[a-zA-Z0-9-]+\.trycloudflare\.com/, 15_000, "cloudflare");
|
|
57
|
+
}
|
|
58
|
+
async function startNgrok(localPort, apiKey) {
|
|
59
|
+
const installed = await commandExists("ngrok");
|
|
60
|
+
if (!installed) {
|
|
61
|
+
throw new Error("ngrok is not installed");
|
|
62
|
+
}
|
|
63
|
+
if (!apiKey) {
|
|
64
|
+
throw new Error("ngrok requires an api key/authtoken");
|
|
65
|
+
}
|
|
66
|
+
await new Promise((resolve, reject) => {
|
|
67
|
+
const setup = spawn("ngrok", ["config", "add-authtoken", apiKey], { stdio: "ignore" });
|
|
68
|
+
setup.on("error", reject);
|
|
69
|
+
setup.on("exit", (code) => {
|
|
70
|
+
if (code === 0) {
|
|
71
|
+
resolve();
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
reject(new Error(`ngrok authtoken setup failed with code ${code}`));
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
const proc = spawn("ngrok", ["http", String(localPort), "--log", "stdout"], {
|
|
79
|
+
stdio: "pipe",
|
|
80
|
+
env: process.env
|
|
81
|
+
});
|
|
82
|
+
return waitForUrl(proc, /https:\/\/[a-zA-Z0-9-]+\.ngrok(?:-free)?\.app/, 15_000, "ngrok");
|
|
83
|
+
}
|
|
84
|
+
export async function maybeStartTunnel(input) {
|
|
85
|
+
if (input.noTunnel || input.provider === "none") {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
if (input.provider === "cloudflare") {
|
|
89
|
+
return startCloudflare(input.localUrl);
|
|
90
|
+
}
|
|
91
|
+
return startNgrok(input.port, input.apiKey);
|
|
92
|
+
}
|
|
93
|
+
export async function tunnelDoctor(provider) {
|
|
94
|
+
if (provider === "none") {
|
|
95
|
+
return { ok: true, detail: "Tunnel disabled" };
|
|
96
|
+
}
|
|
97
|
+
const binary = provider === "cloudflare" ? "cloudflared" : "ngrok";
|
|
98
|
+
const exists = await commandExists(binary);
|
|
99
|
+
return exists
|
|
100
|
+
? { ok: true, detail: `${binary} detected` }
|
|
101
|
+
: { ok: false, detail: `${binary} is not installed` };
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=tunnel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../src/tunnel.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@cospacehq/cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"files": [
|
|
6
|
+
"dist",
|
|
7
|
+
"web-dist"
|
|
8
|
+
],
|
|
9
|
+
"bin": {
|
|
10
|
+
"cospace": "dist/index.js"
|
|
11
|
+
},
|
|
12
|
+
"scripts": {
|
|
13
|
+
"build": "tsc -p tsconfig.json",
|
|
14
|
+
"sync:web-dist": "node ./scripts/sync-web-dist.mjs",
|
|
15
|
+
"prepack": "pnpm --dir ../web build && pnpm run build && pnpm run sync:web-dist",
|
|
16
|
+
"dev": "tsx src/index.ts",
|
|
17
|
+
"start": "node dist/index.js",
|
|
18
|
+
"postinstall": "node dist/postinstall.js || true",
|
|
19
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
20
|
+
"lint": "echo \"No lint configured for @cospacehq/cli\""
|
|
21
|
+
},
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"@cospacehq/server": "workspace:*",
|
|
24
|
+
"@cospacehq/shared": "workspace:*",
|
|
25
|
+
"commander": "^14.0.1",
|
|
26
|
+
"enquirer": "^2.4.1"
|
|
27
|
+
},
|
|
28
|
+
"devDependencies": {
|
|
29
|
+
"@types/node": "^22.13.10",
|
|
30
|
+
"tsx": "^4.19.3",
|
|
31
|
+
"typescript": "^5.8.2"
|
|
32
|
+
}
|
|
33
|
+
}
|