@cloak-db/app 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/cli.d.ts +1 -0
- package/dist/cli.js +130 -0
- package/package.json +41 -0
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/cli.ts
|
|
4
|
+
import { spawn, execSync } from "child_process";
|
|
5
|
+
import { parseArgs } from "util";
|
|
6
|
+
var IMAGE_NAME = "ghcr.io/cloak-db/app";
|
|
7
|
+
var DEFAULT_PORT = 3e3;
|
|
8
|
+
function printHelp() {
|
|
9
|
+
console.log(`
|
|
10
|
+
Cloak DB - Local-first database studio
|
|
11
|
+
|
|
12
|
+
Usage: cloak-app [options]
|
|
13
|
+
|
|
14
|
+
Options:
|
|
15
|
+
-p, --port <port> Port to run on (default: ${DEFAULT_PORT})
|
|
16
|
+
-v, --version <tag> Docker image version/tag (default: latest)
|
|
17
|
+
-h, --help Show this help message
|
|
18
|
+
|
|
19
|
+
Examples:
|
|
20
|
+
cloak-app # Run on port ${DEFAULT_PORT}
|
|
21
|
+
cloak-app --port 8080 # Run on port 8080
|
|
22
|
+
cloak-app --version v0.2.0 # Run specific version
|
|
23
|
+
|
|
24
|
+
Requirements:
|
|
25
|
+
Docker must be installed and running.
|
|
26
|
+
Install from https://docker.com
|
|
27
|
+
`);
|
|
28
|
+
}
|
|
29
|
+
function parseCliArgs() {
|
|
30
|
+
try {
|
|
31
|
+
const { values } = parseArgs({
|
|
32
|
+
options: {
|
|
33
|
+
port: { type: "string", short: "p", default: String(DEFAULT_PORT) },
|
|
34
|
+
version: { type: "string", short: "v", default: "latest" },
|
|
35
|
+
help: { type: "boolean", short: "h", default: false }
|
|
36
|
+
},
|
|
37
|
+
allowPositionals: false
|
|
38
|
+
});
|
|
39
|
+
return {
|
|
40
|
+
port: parseInt(values.port, 10),
|
|
41
|
+
version: values.version,
|
|
42
|
+
help: values.help
|
|
43
|
+
};
|
|
44
|
+
} catch {
|
|
45
|
+
console.error("Error parsing arguments. Use --help for usage information.");
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function checkDocker() {
|
|
50
|
+
try {
|
|
51
|
+
execSync("docker --version", { stdio: "ignore" });
|
|
52
|
+
return true;
|
|
53
|
+
} catch {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function checkDockerRunning() {
|
|
58
|
+
try {
|
|
59
|
+
execSync("docker info", { stdio: "ignore" });
|
|
60
|
+
return true;
|
|
61
|
+
} catch {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function runContainer(options) {
|
|
66
|
+
const image = `${IMAGE_NAME}:${options.version}`;
|
|
67
|
+
const containerName = `cloak-app-${Date.now()}`;
|
|
68
|
+
console.log(`
|
|
69
|
+
\u{1F680} Starting Cloak DB on port ${options.port}...`);
|
|
70
|
+
console.log(` Image: ${image}
|
|
71
|
+
`);
|
|
72
|
+
const dockerProcess = spawn(
|
|
73
|
+
"docker",
|
|
74
|
+
[
|
|
75
|
+
"run",
|
|
76
|
+
"--rm",
|
|
77
|
+
"--name",
|
|
78
|
+
containerName,
|
|
79
|
+
"-p",
|
|
80
|
+
`${options.port}:3000`,
|
|
81
|
+
image
|
|
82
|
+
],
|
|
83
|
+
{ stdio: "inherit" }
|
|
84
|
+
);
|
|
85
|
+
const cleanup = () => {
|
|
86
|
+
console.log("\n\n\u{1F6D1} Stopping Cloak DB...");
|
|
87
|
+
try {
|
|
88
|
+
execSync(`docker stop ${containerName}`, { stdio: "ignore" });
|
|
89
|
+
} catch {
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
process.on("SIGINT", cleanup);
|
|
93
|
+
process.on("SIGTERM", cleanup);
|
|
94
|
+
dockerProcess.on("error", (err) => {
|
|
95
|
+
console.error(`Failed to start container: ${err.message}`);
|
|
96
|
+
process.exit(1);
|
|
97
|
+
});
|
|
98
|
+
dockerProcess.on("close", (code) => {
|
|
99
|
+
process.exit(code ?? 0);
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
function main() {
|
|
103
|
+
const options = parseCliArgs();
|
|
104
|
+
if (options.help) {
|
|
105
|
+
printHelp();
|
|
106
|
+
process.exit(0);
|
|
107
|
+
}
|
|
108
|
+
if (!checkDocker()) {
|
|
109
|
+
console.error(`
|
|
110
|
+
\u274C Docker is required to run Cloak DB.
|
|
111
|
+
|
|
112
|
+
Install Docker from: https://docker.com
|
|
113
|
+
`);
|
|
114
|
+
process.exit(1);
|
|
115
|
+
}
|
|
116
|
+
if (!checkDockerRunning()) {
|
|
117
|
+
console.error(`
|
|
118
|
+
\u274C Docker is installed but not running.
|
|
119
|
+
|
|
120
|
+
Please start Docker Desktop or the Docker daemon.
|
|
121
|
+
`);
|
|
122
|
+
process.exit(1);
|
|
123
|
+
}
|
|
124
|
+
if (isNaN(options.port) || options.port < 1 || options.port > 65535) {
|
|
125
|
+
console.error(`\u274C Invalid port: ${options.port}. Must be between 1 and 65535.`);
|
|
126
|
+
process.exit(1);
|
|
127
|
+
}
|
|
128
|
+
runContainer(options);
|
|
129
|
+
}
|
|
130
|
+
main();
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@cloak-db/app",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Run Cloak DB locally with Docker",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"cloak-app": "./dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist"
|
|
11
|
+
],
|
|
12
|
+
"scripts": {
|
|
13
|
+
"build": "tsup src/cli.ts --format esm --dts",
|
|
14
|
+
"dev": "tsup src/cli.ts --format esm --watch",
|
|
15
|
+
"typecheck": "tsc --noEmit",
|
|
16
|
+
"prepublishOnly": "pnpm build"
|
|
17
|
+
},
|
|
18
|
+
"keywords": [
|
|
19
|
+
"cloak-db",
|
|
20
|
+
"database",
|
|
21
|
+
"postgres",
|
|
22
|
+
"docker",
|
|
23
|
+
"cli"
|
|
24
|
+
],
|
|
25
|
+
"author": "Cloak DB",
|
|
26
|
+
"license": "MIT",
|
|
27
|
+
"repository": {
|
|
28
|
+
"type": "git",
|
|
29
|
+
"url": "https://github.com/cloak-db/cloak-db.git",
|
|
30
|
+
"directory": "packages/cli"
|
|
31
|
+
},
|
|
32
|
+
"homepage": "https://cloak-db.com",
|
|
33
|
+
"engines": {
|
|
34
|
+
"node": ">=18"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"@types/node": "^22.0.0",
|
|
38
|
+
"tsup": "^8.0.0",
|
|
39
|
+
"typescript": "^5.9.2"
|
|
40
|
+
}
|
|
41
|
+
}
|