@jsondb-cloud/cli 1.0.14 → 1.0.15
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/documents.js +4 -2
- package/dist/commands/keys.js +2 -1
- package/dist/index.js +6 -2
- package/dist/lib/client.d.ts +3 -0
- package/dist/lib/client.js +22 -32
- package/package.json +1 -1
|
@@ -134,7 +134,8 @@ async function listCollectionsCommand(client) {
|
|
|
134
134
|
// List documents and extract unique collection names
|
|
135
135
|
const res = await client.get("?limit=100");
|
|
136
136
|
if (!res.ok) {
|
|
137
|
-
|
|
137
|
+
const data = await res.json().catch(() => ({}));
|
|
138
|
+
(0, output_1.error)(data.error?.message || `Failed to list collections: ${res.status}`);
|
|
138
139
|
process.exit(1);
|
|
139
140
|
}
|
|
140
141
|
const data = await res.json();
|
|
@@ -151,7 +152,8 @@ async function listDocumentsCommand(collection, client, options) {
|
|
|
151
152
|
const limit = options.limit || "20";
|
|
152
153
|
const res = await client.get(`${collection}?limit=${limit}`);
|
|
153
154
|
if (!res.ok) {
|
|
154
|
-
|
|
155
|
+
const data = await res.json().catch(() => ({}));
|
|
156
|
+
(0, output_1.error)(data.error?.message || `Failed to list documents: ${res.status}`);
|
|
155
157
|
process.exit(1);
|
|
156
158
|
}
|
|
157
159
|
const data = await res.json();
|
package/dist/commands/keys.js
CHANGED
|
@@ -7,7 +7,8 @@ const output_1 = require("../lib/output");
|
|
|
7
7
|
async function listKeysCommand(client) {
|
|
8
8
|
const res = await client.rawGet("/api/keys");
|
|
9
9
|
if (!res.ok) {
|
|
10
|
-
|
|
10
|
+
const errData = await res.json().catch(() => ({}));
|
|
11
|
+
(0, output_1.error)(errData.error?.message || `Failed to list API keys: ${res.status}`);
|
|
11
12
|
process.exit(1);
|
|
12
13
|
}
|
|
13
14
|
const data = await res.json();
|
package/dist/index.js
CHANGED
|
@@ -21,7 +21,8 @@ program
|
|
|
21
21
|
.option("--api-key <key>", "Use a specific API key")
|
|
22
22
|
.option("--project <ns>", 'Target project (default: "default")')
|
|
23
23
|
.option("--base-url <url>", "API base URL")
|
|
24
|
-
.option("--format <fmt>", "Output format: json, raw, ndjson, table")
|
|
24
|
+
.option("--format <fmt>", "Output format: json, raw, ndjson, table")
|
|
25
|
+
.option("--verbose", "Show debug info (request URLs, status codes)");
|
|
25
26
|
function getClient() {
|
|
26
27
|
const opts = program.opts();
|
|
27
28
|
const config = (0, config_1.loadConfig)();
|
|
@@ -30,11 +31,14 @@ function getClient() {
|
|
|
30
31
|
(0, output_1.error)("Not authenticated", "Run `jsondb login` to authenticate, or pass --api-key");
|
|
31
32
|
process.exit(1);
|
|
32
33
|
}
|
|
33
|
-
|
|
34
|
+
const client = new client_1.ApiClient({
|
|
34
35
|
apiKey,
|
|
35
36
|
project: opts.project || config?.project || "default",
|
|
36
37
|
baseUrl: opts.baseUrl || config?.baseUrl || "https://api.jsondb.cloud",
|
|
37
38
|
});
|
|
39
|
+
if (opts.verbose)
|
|
40
|
+
client.verbose = true;
|
|
41
|
+
return client;
|
|
38
42
|
}
|
|
39
43
|
// ─── Auth commands ───
|
|
40
44
|
program
|
package/dist/lib/client.d.ts
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import type { CliConfig } from "./config";
|
|
2
2
|
export declare class ApiClient {
|
|
3
3
|
private config;
|
|
4
|
+
verbose: boolean;
|
|
4
5
|
constructor(config: CliConfig);
|
|
6
|
+
private log;
|
|
5
7
|
private url;
|
|
6
8
|
private headers;
|
|
9
|
+
private request;
|
|
7
10
|
get(path: string, accept?: string): Promise<Response>;
|
|
8
11
|
post(path: string, body?: unknown, extraHeaders?: Record<string, string>): Promise<Response>;
|
|
9
12
|
postRaw(path: string, body: string, contentType: string): Promise<Response>;
|
package/dist/lib/client.js
CHANGED
|
@@ -3,9 +3,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.ApiClient = void 0;
|
|
4
4
|
class ApiClient {
|
|
5
5
|
config;
|
|
6
|
+
verbose = false;
|
|
6
7
|
constructor(config) {
|
|
7
8
|
this.config = config;
|
|
8
9
|
}
|
|
10
|
+
log(msg) {
|
|
11
|
+
if (this.verbose) {
|
|
12
|
+
console.error(`\x1b[2m[debug] ${msg}\x1b[0m`);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
9
15
|
url(path) {
|
|
10
16
|
const base = this.config.baseUrl.replace(/\/$/, "");
|
|
11
17
|
return `${base}/${this.config.project}/${path}`;
|
|
@@ -17,54 +23,38 @@ class ApiClient {
|
|
|
17
23
|
...extra,
|
|
18
24
|
};
|
|
19
25
|
}
|
|
26
|
+
async request(method, url, headers, body) {
|
|
27
|
+
this.log(`${method} ${url}`);
|
|
28
|
+
const res = await fetch(url, { method, headers, body });
|
|
29
|
+
this.log(`${res.status} ${res.statusText}`);
|
|
30
|
+
return res;
|
|
31
|
+
}
|
|
20
32
|
async get(path, accept) {
|
|
21
33
|
const headers = this.headers(accept ? { Accept: accept } : undefined);
|
|
22
|
-
return
|
|
34
|
+
return this.request("GET", this.url(path), headers);
|
|
23
35
|
}
|
|
24
36
|
async post(path, body, extraHeaders) {
|
|
25
|
-
return
|
|
26
|
-
method: "POST",
|
|
27
|
-
headers: this.headers(extraHeaders),
|
|
28
|
-
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
29
|
-
});
|
|
37
|
+
return this.request("POST", this.url(path), this.headers(extraHeaders), body !== undefined ? JSON.stringify(body) : undefined);
|
|
30
38
|
}
|
|
31
39
|
async postRaw(path, body, contentType) {
|
|
32
|
-
return
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
"Content-Type": contentType,
|
|
37
|
-
},
|
|
38
|
-
body,
|
|
39
|
-
});
|
|
40
|
+
return this.request("POST", this.url(path), {
|
|
41
|
+
Authorization: `Bearer ${this.config.apiKey}`,
|
|
42
|
+
"Content-Type": contentType,
|
|
43
|
+
}, body);
|
|
40
44
|
}
|
|
41
45
|
async put(path, body) {
|
|
42
|
-
return
|
|
43
|
-
method: "PUT",
|
|
44
|
-
headers: this.headers(),
|
|
45
|
-
body: JSON.stringify(body),
|
|
46
|
-
});
|
|
46
|
+
return this.request("PUT", this.url(path), this.headers(), JSON.stringify(body));
|
|
47
47
|
}
|
|
48
48
|
async patch(path, body, contentType) {
|
|
49
|
-
return
|
|
50
|
-
method: "PATCH",
|
|
51
|
-
headers: this.headers(contentType ? { "Content-Type": contentType } : undefined),
|
|
52
|
-
body: JSON.stringify(body),
|
|
53
|
-
});
|
|
49
|
+
return this.request("PATCH", this.url(path), this.headers(contentType ? { "Content-Type": contentType } : undefined), JSON.stringify(body));
|
|
54
50
|
}
|
|
55
51
|
async delete(path) {
|
|
56
|
-
return
|
|
57
|
-
method: "DELETE",
|
|
58
|
-
headers: this.headers(),
|
|
59
|
-
});
|
|
52
|
+
return this.request("DELETE", this.url(path), this.headers());
|
|
60
53
|
}
|
|
61
54
|
/** Raw API call without project prefix */
|
|
62
55
|
async rawGet(fullPath) {
|
|
63
56
|
const base = this.config.baseUrl.replace(/\/$/, "");
|
|
64
|
-
return
|
|
65
|
-
method: "GET",
|
|
66
|
-
headers: this.headers(),
|
|
67
|
-
});
|
|
57
|
+
return this.request("GET", `${base}${fullPath}`, this.headers());
|
|
68
58
|
}
|
|
69
59
|
}
|
|
70
60
|
exports.ApiClient = ApiClient;
|