@suronai/cli 0.1.5 → 0.1.7
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/commands/init.js +7 -15
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.js +29 -51
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/rotate.js +1 -11
- package/dist/commands/rotate.js.map +1 -1
- package/dist/commands/set-telegram.d.ts +0 -0
- package/dist/commands/set-telegram.js +3 -0
- package/dist/commands/set-telegram.js.map +1 -0
- package/dist/commands/whoami.js +3 -28
- package/dist/commands/whoami.js.map +1 -1
- package/dist/utils/config.d.ts +8 -6
- package/dist/utils/config.js +40 -49
- package/dist/utils/config.js.map +1 -1
- package/package.json +7 -7
package/dist/commands/init.js
CHANGED
|
@@ -8,12 +8,10 @@ const config_1 = require("../utils/config");
|
|
|
8
8
|
const dotenvx_1 = require("../utils/dotenvx");
|
|
9
9
|
exports.initCommand = new commander_1.Command("init")
|
|
10
10
|
.description("Encrypt .env and register this app with Suron")
|
|
11
|
-
.option("--name <
|
|
11
|
+
.option("--name <n>", "App name (defaults to current directory name)")
|
|
12
12
|
.action(async (opts) => {
|
|
13
13
|
const cwd = process.cwd();
|
|
14
|
-
const apiKey = (0, config_1.requireApiKey)();
|
|
15
14
|
const apiUrl = (0, config_1.requireApiUrl)();
|
|
16
|
-
// 1. Check .env exists
|
|
17
15
|
if (!(0, fs_1.existsSync)((0, path_1.join)(cwd, ".env"))) {
|
|
18
16
|
console.error("error: .env not found in current directory");
|
|
19
17
|
console.error(" Create a .env file first, then run: suron init");
|
|
@@ -21,7 +19,6 @@ exports.initCommand = new commander_1.Command("init")
|
|
|
21
19
|
}
|
|
22
20
|
const appName = opts.name ?? require("path").basename(cwd) ?? "my-project";
|
|
23
21
|
console.log(`[suron] Encrypting .env with dotenvx...`);
|
|
24
|
-
// 2. Encrypt .env → produces encrypted .env + .env.keys
|
|
25
22
|
try {
|
|
26
23
|
(0, dotenvx_1.encryptDotenv)(cwd);
|
|
27
24
|
}
|
|
@@ -29,7 +26,6 @@ exports.initCommand = new commander_1.Command("init")
|
|
|
29
26
|
console.error(`error: dotenvx encryption failed: ${err}`);
|
|
30
27
|
process.exit(1);
|
|
31
28
|
}
|
|
32
|
-
// 3. Read private key from .env.keys
|
|
33
29
|
let privateKey;
|
|
34
30
|
try {
|
|
35
31
|
privateKey = (0, dotenvx_1.readPrivateKey)(cwd);
|
|
@@ -39,16 +35,15 @@ exports.initCommand = new commander_1.Command("init")
|
|
|
39
35
|
process.exit(1);
|
|
40
36
|
}
|
|
41
37
|
console.log("[suron] Registering app...");
|
|
42
|
-
// 4. Register app in Convex — backend encrypts privateKey with MASTER_KEY
|
|
43
38
|
let res;
|
|
44
39
|
try {
|
|
45
40
|
res = await fetch(`${apiUrl}/cli/register-app`, {
|
|
46
41
|
method: "POST",
|
|
47
|
-
headers: {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
42
|
+
headers: { "Content-Type": "application/json" },
|
|
43
|
+
body: JSON.stringify({
|
|
44
|
+
name: appName,
|
|
45
|
+
private_key: privateKey,
|
|
46
|
+
}),
|
|
52
47
|
});
|
|
53
48
|
}
|
|
54
49
|
catch (err) {
|
|
@@ -61,11 +56,8 @@ exports.initCommand = new commander_1.Command("init")
|
|
|
61
56
|
process.exit(1);
|
|
62
57
|
}
|
|
63
58
|
const data = (await res.json());
|
|
64
|
-
// 5. Delete .env.keys — private key now lives encrypted in Convex
|
|
65
59
|
(0, dotenvx_1.deleteKeysFile)(cwd);
|
|
66
|
-
|
|
67
|
-
const suronJson = { app: appName, id: data.app_id };
|
|
68
|
-
(0, fs_1.writeFileSync)((0, path_1.join)(cwd, ".suron.json"), JSON.stringify(suronJson, null, 2) + "\n", "utf-8");
|
|
60
|
+
(0, fs_1.writeFileSync)((0, path_1.join)(cwd, ".suron.json"), JSON.stringify({ app: appName, id: data.app_id }, null, 2) + "\n", "utf-8");
|
|
69
61
|
console.log(`[suron] Done.`);
|
|
70
62
|
console.log(` .env is encrypted — safe to commit`);
|
|
71
63
|
console.log(` .env.keys deleted`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":";;;AAAA,yCAAoC;AACpC,2BAA+C;AAC/C,+BAA4B;AAC5B,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/login.js
CHANGED
|
@@ -2,13 +2,11 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.loginCommand = void 0;
|
|
4
4
|
const commander_1 = require("commander");
|
|
5
|
-
const child_process_1 = require("child_process");
|
|
6
5
|
const config_1 = require("../utils/config");
|
|
7
6
|
exports.loginCommand = new commander_1.Command("login")
|
|
8
|
-
.description("
|
|
7
|
+
.description("Configure the Suron API URL")
|
|
9
8
|
.action(async () => {
|
|
10
|
-
console.log("\n Suron
|
|
11
|
-
// Step 1: Get the API URL — prompt if not already saved
|
|
9
|
+
console.log("\n Suron Setup\n");
|
|
12
10
|
let apiUrl = (0, config_1.getApiUrl)();
|
|
13
11
|
if (!apiUrl) {
|
|
14
12
|
const input = await (0, config_1.prompt)(" Convex deployment URL (https://xxx.convex.site): ");
|
|
@@ -17,62 +15,42 @@ exports.loginCommand = new commander_1.Command("login")
|
|
|
17
15
|
process.exit(1);
|
|
18
16
|
}
|
|
19
17
|
apiUrl = input.replace(/\/$/, "");
|
|
20
|
-
(0, config_1.saveConfig)({ apiUrl });
|
|
21
|
-
console.log(` Saved to ~/.suron-config\n`);
|
|
22
18
|
}
|
|
23
19
|
else {
|
|
24
|
-
console.log(`
|
|
20
|
+
console.log(` Convex URL: ${apiUrl}`);
|
|
21
|
+
const change = await (0, config_1.prompt)(" Change it? (y/N): ");
|
|
22
|
+
if (change.toLowerCase() === "y") {
|
|
23
|
+
const input = await (0, config_1.prompt)(" New URL: ");
|
|
24
|
+
if (!input) {
|
|
25
|
+
console.error("\nerror: URL required");
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
apiUrl = input.replace(/\/$/, "");
|
|
29
|
+
}
|
|
25
30
|
}
|
|
26
|
-
//
|
|
27
|
-
console.log("
|
|
28
|
-
let res;
|
|
31
|
+
// Verify the backend is reachable
|
|
32
|
+
console.log("\n Verifying connection...");
|
|
29
33
|
try {
|
|
30
|
-
res = await fetch(`${apiUrl}/cli/
|
|
34
|
+
const res = await fetch(`${apiUrl}/cli/verify`, {
|
|
35
|
+
method: "POST",
|
|
36
|
+
headers: { "Content-Type": "application/json" },
|
|
37
|
+
body: JSON.stringify({}),
|
|
38
|
+
});
|
|
39
|
+
// A 400 (missing telegram_id) means the route exists and backend is up
|
|
40
|
+
if (!res.ok && res.status !== 400) {
|
|
41
|
+
const text = await res.text().catch(() => "");
|
|
42
|
+
console.error(`\nerror: backend returned (${res.status}): ${text}`);
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
31
45
|
}
|
|
32
46
|
catch (err) {
|
|
33
47
|
console.error(`\nerror: could not reach ${apiUrl}`);
|
|
34
48
|
console.error(` Is the Convex deployment running?`);
|
|
35
49
|
process.exit(1);
|
|
36
50
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
}
|
|
42
|
-
const data = (await res.json());
|
|
43
|
-
const telegramUrl = `https://t.me/${data.bot_username}?start=${data.token}`;
|
|
44
|
-
console.log(`\n Open this URL in Telegram and tap Start:\n`);
|
|
45
|
-
console.log(` ${telegramUrl}\n`);
|
|
46
|
-
// Try to open browser automatically (best effort)
|
|
47
|
-
const opener = process.platform === "win32" ? "start" :
|
|
48
|
-
process.platform === "darwin" ? "open" : "xdg-open";
|
|
49
|
-
(0, child_process_1.exec)(`${opener} "${telegramUrl}"`);
|
|
50
|
-
await (0, config_1.prompt)(" Press Enter once you have tapped Start in Telegram...");
|
|
51
|
-
// Step 3: Poll until Telegram confirms the link
|
|
52
|
-
console.log("\n Waiting for Telegram confirmation...");
|
|
53
|
-
const deadline = Date.now() + 120000;
|
|
54
|
-
while (Date.now() < deadline) {
|
|
55
|
-
await sleep(2000);
|
|
56
|
-
let statusRes;
|
|
57
|
-
try {
|
|
58
|
-
statusRes = await fetch(`${apiUrl}/cli/login-status?token=${encodeURIComponent(data.token)}`);
|
|
59
|
-
}
|
|
60
|
-
catch {
|
|
61
|
-
continue;
|
|
62
|
-
}
|
|
63
|
-
if (!statusRes.ok)
|
|
64
|
-
continue;
|
|
65
|
-
const status = (await statusRes.json());
|
|
66
|
-
if (status.confirmed && status.api_key) {
|
|
67
|
-
(0, config_1.saveConfig)({ apiKey: status.api_key });
|
|
68
|
-
console.log("\n Logged in. Credentials saved to ~/.suron-config\n");
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
console.error("\nerror: login timed out after 2 minutes. Run: suron login");
|
|
73
|
-
process.exit(1);
|
|
51
|
+
(0, config_1.saveConfig)({ apiUrl });
|
|
52
|
+
console.log("\n Saved to ~/.suron-config");
|
|
53
|
+
console.log(" Setup complete.\n");
|
|
54
|
+
console.log(" Next: cd your-project && suron init\n");
|
|
74
55
|
});
|
|
75
|
-
function sleep(ms) {
|
|
76
|
-
return new Promise((r) => setTimeout(r, ms));
|
|
77
|
-
}
|
|
78
56
|
//# sourceMappingURL=login.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":";;;AAAA,yCAAoC;AACpC,
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":";;;AAAA,yCAAoC;AACpC,4CAAgE;AAEnD,QAAA,YAAY,GAAG,IAAI,mBAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAEjC,IAAI,MAAM,GAAG,IAAA,kBAAS,GAAE,CAAC;IACzB,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,MAAM,IAAA,eAAM,EAAC,qDAAqD,CAAC,CAAC;QAClF,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACpC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,EAAE,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,MAAM,IAAA,eAAM,EAAC,sBAAsB,CAAC,CAAC;QACpD,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE,CAAC;YACjC,MAAM,KAAK,GAAG,MAAM,IAAA,eAAM,EAAC,aAAa,CAAC,CAAC;YAC1C,IAAI,CAAC,KAAK,EAAE,CAAC;gBAAC,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;gBAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAAC,CAAC;YACxE,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,kCAAkC;IAClC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,aAAa,EAAE;YAC9C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;SACzB,CAAC,CAAC;QACH,uEAAuE;QACvE,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9C,OAAO,CAAC,KAAK,CAAC,8BAA8B,GAAG,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;YACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,4BAA4B,MAAM,EAAE,CAAC,CAAC;QACpD,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAA,mBAAU,EAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IACvB,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;AACzD,CAAC,CAAC,CAAC"}
|
package/dist/commands/rotate.js
CHANGED
|
@@ -10,9 +10,7 @@ exports.rotateCommand = new commander_1.Command("rotate")
|
|
|
10
10
|
.description("Re-encrypt .env with a new private key and update Suron")
|
|
11
11
|
.action(async () => {
|
|
12
12
|
const cwd = process.cwd();
|
|
13
|
-
const apiKey = (0, config_1.requireApiKey)();
|
|
14
13
|
const apiUrl = (0, config_1.requireApiUrl)();
|
|
15
|
-
// 1. Read existing .suron.json
|
|
16
14
|
const suronJsonPath = (0, path_1.join)(cwd, ".suron.json");
|
|
17
15
|
if (!(0, fs_1.existsSync)(suronJsonPath)) {
|
|
18
16
|
console.error("error: .suron.json not found. Run: suron init first");
|
|
@@ -26,13 +24,11 @@ exports.rotateCommand = new commander_1.Command("rotate")
|
|
|
26
24
|
console.error("error: .suron.json is malformed");
|
|
27
25
|
process.exit(1);
|
|
28
26
|
}
|
|
29
|
-
// 2. Check .env exists
|
|
30
27
|
if (!(0, fs_1.existsSync)((0, path_1.join)(cwd, ".env"))) {
|
|
31
28
|
console.error("error: .env not found");
|
|
32
29
|
process.exit(1);
|
|
33
30
|
}
|
|
34
31
|
console.log("[suron] Re-encrypting .env with a new private key...");
|
|
35
|
-
// 3. Re-encrypt — dotenvx generates a new private key
|
|
36
32
|
try {
|
|
37
33
|
(0, dotenvx_1.encryptDotenv)(cwd);
|
|
38
34
|
}
|
|
@@ -40,7 +36,6 @@ exports.rotateCommand = new commander_1.Command("rotate")
|
|
|
40
36
|
console.error(`error: dotenvx encryption failed: ${err}`);
|
|
41
37
|
process.exit(1);
|
|
42
38
|
}
|
|
43
|
-
// 4. Read new private key
|
|
44
39
|
let newPrivateKey;
|
|
45
40
|
try {
|
|
46
41
|
newPrivateKey = (0, dotenvx_1.readPrivateKey)(cwd);
|
|
@@ -50,15 +45,11 @@ exports.rotateCommand = new commander_1.Command("rotate")
|
|
|
50
45
|
process.exit(1);
|
|
51
46
|
}
|
|
52
47
|
console.log("[suron] Updating private key in Suron...");
|
|
53
|
-
// 5. Send new private key to Convex (backend encrypts it with MASTER_KEY)
|
|
54
48
|
let res;
|
|
55
49
|
try {
|
|
56
50
|
res = await fetch(`${apiUrl}/cli/rotate-key`, {
|
|
57
51
|
method: "POST",
|
|
58
|
-
headers: {
|
|
59
|
-
"Content-Type": "application/json",
|
|
60
|
-
Authorization: `Bearer ${apiKey}`,
|
|
61
|
-
},
|
|
52
|
+
headers: { "Content-Type": "application/json" },
|
|
62
53
|
body: JSON.stringify({
|
|
63
54
|
app_id: suronConfig.id,
|
|
64
55
|
private_key: newPrivateKey,
|
|
@@ -74,7 +65,6 @@ exports.rotateCommand = new commander_1.Command("rotate")
|
|
|
74
65
|
console.error(`error: rotate-key failed (${res.status}): ${text}`);
|
|
75
66
|
process.exit(1);
|
|
76
67
|
}
|
|
77
|
-
// 6. Delete .env.keys
|
|
78
68
|
(0, dotenvx_1.deleteKeysFile)(cwd);
|
|
79
69
|
console.log("[suron] Key rotated.");
|
|
80
70
|
console.log(" .env re-encrypted — safe to commit");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rotate.js","sourceRoot":"","sources":["../../src/commands/rotate.ts"],"names":[],"mappings":";;;AAAA,yCAAoC;AACpC,2BAA8C;AAC9C,+BAA4B;AAC5B,
|
|
1
|
+
{"version":3,"file":"rotate.js","sourceRoot":"","sources":["../../src/commands/rotate.ts"],"names":[],"mappings":"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"}
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set-telegram.js","sourceRoot":"","sources":["../../src/commands/set-telegram.ts"],"names":[],"mappings":";AAAA,UAAU"}
|
package/dist/commands/whoami.js
CHANGED
|
@@ -4,35 +4,10 @@ exports.whoamiCommand = void 0;
|
|
|
4
4
|
const commander_1 = require("commander");
|
|
5
5
|
const config_1 = require("../utils/config");
|
|
6
6
|
exports.whoamiCommand = new commander_1.Command("whoami")
|
|
7
|
-
.description("Show your
|
|
7
|
+
.description("Show your configured account info")
|
|
8
8
|
.action(async () => {
|
|
9
|
-
const apiKey = (0, config_1.requireApiKey)();
|
|
10
9
|
const apiUrl = (0, config_1.requireApiUrl)();
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
res = await fetch(`${apiUrl}/cli/whoami`, {
|
|
14
|
-
method: "POST",
|
|
15
|
-
headers: {
|
|
16
|
-
"Content-Type": "application/json",
|
|
17
|
-
Authorization: `Bearer ${apiKey}`,
|
|
18
|
-
},
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
catch (err) {
|
|
22
|
-
console.error(`error: could not reach Suron API: ${err}`);
|
|
23
|
-
process.exit(1);
|
|
24
|
-
}
|
|
25
|
-
if (res.status === 401) {
|
|
26
|
-
console.error("error: invalid API key. Run: suron login");
|
|
27
|
-
process.exit(1);
|
|
28
|
-
}
|
|
29
|
-
if (!res.ok) {
|
|
30
|
-
const text = await res.text().catch(() => "");
|
|
31
|
-
console.error(`error: whoami failed (${res.status}): ${text}`);
|
|
32
|
-
process.exit(1);
|
|
33
|
-
}
|
|
34
|
-
const data = (await res.json());
|
|
35
|
-
console.log(`telegram: @${data.telegram_username}`);
|
|
36
|
-
console.log(`id: ${data.telegram_id}`);
|
|
10
|
+
console.log(`api url: ${apiUrl}`);
|
|
11
|
+
console.log(`config file: ~/.suron-config`);
|
|
37
12
|
});
|
|
38
13
|
//# sourceMappingURL=whoami.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":";;;AAAA,yCAAoC;AACpC,
|
|
1
|
+
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":";;;AAAA,yCAAoC;AACpC,4CAAgD;AAEnC,QAAA,aAAa,GAAG,IAAI,mBAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,mCAAmC,CAAC;KAChD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,MAAM,GAAG,IAAA,sBAAa,GAAE,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,EAAE,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;AAC9C,CAAC,CAAC,CAAC"}
|
package/dist/utils/config.d.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
export declare function getApiUrl(): string | null;
|
|
3
|
-
export declare function saveConfig(values: {
|
|
4
|
-
apiKey?: string;
|
|
1
|
+
interface Config {
|
|
5
2
|
apiUrl?: string;
|
|
6
|
-
|
|
3
|
+
apiKey?: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function saveConfig(values: Partial<Config>): void;
|
|
6
|
+
export declare function getApiUrl(): string | null;
|
|
7
|
+
export declare function getApiKey(): string | null;
|
|
7
8
|
export declare function saveApiKey(key: string): void;
|
|
8
|
-
export declare function requireApiKey(): string;
|
|
9
9
|
export declare function requireApiUrl(): string;
|
|
10
|
+
export declare function requireApiKey(): string;
|
|
10
11
|
export declare function prompt(question: string): Promise<string>;
|
|
12
|
+
export {};
|
package/dist/utils/config.js
CHANGED
|
@@ -33,68 +33,67 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.getApiKey = getApiKey;
|
|
37
|
-
exports.getApiUrl = getApiUrl;
|
|
38
36
|
exports.saveConfig = saveConfig;
|
|
37
|
+
exports.getApiUrl = getApiUrl;
|
|
38
|
+
exports.getApiKey = getApiKey;
|
|
39
39
|
exports.saveApiKey = saveApiKey;
|
|
40
|
-
exports.requireApiKey = requireApiKey;
|
|
41
40
|
exports.requireApiUrl = requireApiUrl;
|
|
41
|
+
exports.requireApiKey = requireApiKey;
|
|
42
42
|
exports.prompt = prompt;
|
|
43
43
|
const os_1 = require("os");
|
|
44
44
|
const path_1 = require("path");
|
|
45
45
|
const fs_1 = require("fs");
|
|
46
46
|
const readline = __importStar(require("readline"));
|
|
47
47
|
const CONFIG_PATH = (0, path_1.join)((0, os_1.homedir)(), ".suron-config");
|
|
48
|
-
function
|
|
48
|
+
function readConfig() {
|
|
49
49
|
if (!(0, fs_1.existsSync)(CONFIG_PATH))
|
|
50
|
-
return
|
|
50
|
+
return {};
|
|
51
51
|
try {
|
|
52
|
-
const
|
|
53
|
-
const
|
|
54
|
-
|
|
52
|
+
const lines = (0, fs_1.readFileSync)(CONFIG_PATH, "utf-8").split("\n");
|
|
53
|
+
const config = {};
|
|
54
|
+
for (const line of lines) {
|
|
55
|
+
const [key, ...rest] = line.split("=");
|
|
56
|
+
const value = rest.join("=").trim();
|
|
57
|
+
if (!value)
|
|
58
|
+
continue;
|
|
59
|
+
if (key === "SURON_API_URL")
|
|
60
|
+
config.apiUrl = value;
|
|
61
|
+
if (key === "VAULT_API_KEY")
|
|
62
|
+
config.apiKey = value;
|
|
63
|
+
}
|
|
64
|
+
return config;
|
|
55
65
|
}
|
|
56
66
|
catch {
|
|
57
|
-
return
|
|
67
|
+
return {};
|
|
58
68
|
}
|
|
59
69
|
}
|
|
70
|
+
function saveConfig(values) {
|
|
71
|
+
const current = readConfig();
|
|
72
|
+
const merged = { ...current, ...values };
|
|
73
|
+
const lines = [];
|
|
74
|
+
if (merged.apiUrl)
|
|
75
|
+
lines.push(`SURON_API_URL=${merged.apiUrl}`);
|
|
76
|
+
if (merged.apiKey)
|
|
77
|
+
lines.push(`VAULT_API_KEY=${merged.apiKey}`);
|
|
78
|
+
(0, fs_1.writeFileSync)(CONFIG_PATH, lines.join("\n") + "\n", { mode: 0o600 });
|
|
79
|
+
}
|
|
60
80
|
function getApiUrl() {
|
|
61
|
-
|
|
62
|
-
if (process.env.SURON_API_URL)
|
|
63
|
-
return process.env.SURON_API_URL.replace(/\/$/, "");
|
|
64
|
-
if (!(0, fs_1.existsSync)(CONFIG_PATH))
|
|
65
|
-
return null;
|
|
66
|
-
try {
|
|
67
|
-
const content = (0, fs_1.readFileSync)(CONFIG_PATH, "utf-8");
|
|
68
|
-
const match = content.match(/SURON_API_URL=(.+)/);
|
|
69
|
-
return match?.[1]?.trim() ?? null;
|
|
70
|
-
}
|
|
71
|
-
catch {
|
|
72
|
-
return null;
|
|
73
|
-
}
|
|
81
|
+
return process.env.SURON_API_URL?.replace(/\/$/, "") ?? readConfig().apiUrl ?? null;
|
|
74
82
|
}
|
|
75
|
-
function
|
|
76
|
-
|
|
77
|
-
if (values.apiUrl) {
|
|
78
|
-
if (content.match(/SURON_API_URL=.*/)) {
|
|
79
|
-
content = content.replace(/SURON_API_URL=.*/, `SURON_API_URL=${values.apiUrl}`);
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
content += `SURON_API_URL=${values.apiUrl}\n`;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
if (values.apiKey) {
|
|
86
|
-
if (content.match(/VAULT_API_KEY=.*/)) {
|
|
87
|
-
content = content.replace(/VAULT_API_KEY=.*/, `VAULT_API_KEY=${values.apiKey}`);
|
|
88
|
-
}
|
|
89
|
-
else {
|
|
90
|
-
content += `VAULT_API_KEY=${values.apiKey}\n`;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
(0, fs_1.writeFileSync)(CONFIG_PATH, content, { mode: 0o600 });
|
|
83
|
+
function getApiKey() {
|
|
84
|
+
return readConfig().apiKey ?? null;
|
|
94
85
|
}
|
|
95
86
|
function saveApiKey(key) {
|
|
96
87
|
saveConfig({ apiKey: key });
|
|
97
88
|
}
|
|
89
|
+
function requireApiUrl() {
|
|
90
|
+
const url = getApiUrl();
|
|
91
|
+
if (!url) {
|
|
92
|
+
console.error("error: not configured. Run: suron login");
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
return url;
|
|
96
|
+
}
|
|
98
97
|
function requireApiKey() {
|
|
99
98
|
const key = getApiKey();
|
|
100
99
|
if (!key) {
|
|
@@ -103,14 +102,6 @@ function requireApiKey() {
|
|
|
103
102
|
}
|
|
104
103
|
return key;
|
|
105
104
|
}
|
|
106
|
-
function requireApiUrl() {
|
|
107
|
-
const url = getApiUrl();
|
|
108
|
-
if (!url) {
|
|
109
|
-
console.error("error: SURON_API_URL not set. Run: suron login");
|
|
110
|
-
process.exit(1);
|
|
111
|
-
}
|
|
112
|
-
return url;
|
|
113
|
-
}
|
|
114
105
|
function prompt(question) {
|
|
115
106
|
const rl = readline.createInterface({
|
|
116
107
|
input: process.stdin,
|
package/dist/utils/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@suronai/cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.7",
|
|
4
4
|
"description": "CLI for Suron — suron login, init, whoami, rotate",
|
|
5
5
|
"bin": {
|
|
6
6
|
"suron": "./dist/index.js"
|
|
@@ -9,19 +9,19 @@
|
|
|
9
9
|
"dist"
|
|
10
10
|
],
|
|
11
11
|
"scripts": {
|
|
12
|
-
"build": "tsc && node -e \"const fs=require('fs'),f='dist/index.js',c=fs.readFileSync(f,'utf8');if(!c.startsWith('#!/usr/bin/env node'))fs.writeFileSync(f,'#!/usr/bin/env node\\n'+c)\"",
|
|
13
|
-
"dev": "tsc --watch",
|
|
12
|
+
"build": "node ../../node_modules/typescript/bin/tsc && node -e \"const fs=require('fs'),f='dist/index.js',c=fs.readFileSync(f,'utf8');if(!c.startsWith('#!/usr/bin/env node'))fs.writeFileSync(f,'#!/usr/bin/env node\\n'+c)\"",
|
|
13
|
+
"dev": "node ../../node_modules/typescript/bin/tsc --watch",
|
|
14
14
|
"clean": "rimraf dist"
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"
|
|
17
|
+
"@dotenvx/dotenvx": "^1.0.0",
|
|
18
18
|
"chalk": "^5.3.0",
|
|
19
|
-
"
|
|
19
|
+
"commander": "^12.0.0"
|
|
20
20
|
},
|
|
21
21
|
"devDependencies": {
|
|
22
|
-
"typescript": "*",
|
|
23
22
|
"@types/node": "^20.0.0",
|
|
24
|
-
"rimraf": "^5.0.0"
|
|
23
|
+
"rimraf": "^5.0.0",
|
|
24
|
+
"typescript": "^5.9.3"
|
|
25
25
|
},
|
|
26
26
|
"engines": {
|
|
27
27
|
"node": ">=18.0.0"
|