@jsondb-cloud/cli 1.0.14 → 1.0.16

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.
@@ -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
- (0, output_1.error)("Failed to list collections");
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
- (0, output_1.error)("Failed to list documents");
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();
@@ -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
- (0, output_1.error)("Failed to list API keys");
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
@@ -4,6 +4,7 @@ const commander_1 = require("commander");
4
4
  const config_1 = require("./lib/config");
5
5
  const client_1 = require("./lib/client");
6
6
  const output_1 = require("./lib/output");
7
+ const package_json_1 = require("../package.json");
7
8
  const login_1 = require("./commands/login");
8
9
  const documents_1 = require("./commands/documents");
9
10
  const push_1 = require("./commands/push");
@@ -17,11 +18,12 @@ const program = new commander_1.Command();
17
18
  program
18
19
  .name("jsondb")
19
20
  .description("The jsondb.cloud CLI — manage your JSON database from the terminal")
20
- .version("1.0.0")
21
+ .version(package_json_1.version)
21
22
  .option("--api-key <key>", "Use a specific API key")
22
23
  .option("--project <ns>", 'Target project (default: "default")')
23
24
  .option("--base-url <url>", "API base URL")
24
- .option("--format <fmt>", "Output format: json, raw, ndjson, table");
25
+ .option("--format <fmt>", "Output format: json, raw, ndjson, table")
26
+ .option("--verbose", "Show debug info (request URLs, status codes)");
25
27
  function getClient() {
26
28
  const opts = program.opts();
27
29
  const config = (0, config_1.loadConfig)();
@@ -30,11 +32,14 @@ function getClient() {
30
32
  (0, output_1.error)("Not authenticated", "Run `jsondb login` to authenticate, or pass --api-key");
31
33
  process.exit(1);
32
34
  }
33
- return new client_1.ApiClient({
35
+ const client = new client_1.ApiClient({
34
36
  apiKey,
35
37
  project: opts.project || config?.project || "default",
36
38
  baseUrl: opts.baseUrl || config?.baseUrl || "https://api.jsondb.cloud",
37
39
  });
40
+ if (opts.verbose)
41
+ client.verbose = true;
42
+ return client;
38
43
  }
39
44
  // ─── Auth commands ───
40
45
  program
@@ -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>;
@@ -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 fetch(this.url(path), { method: "GET", headers });
34
+ return this.request("GET", this.url(path), headers);
23
35
  }
24
36
  async post(path, body, extraHeaders) {
25
- return fetch(this.url(path), {
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 fetch(this.url(path), {
33
- method: "POST",
34
- headers: {
35
- Authorization: `Bearer ${this.config.apiKey}`,
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 fetch(this.url(path), {
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 fetch(this.url(path), {
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 fetch(this.url(path), {
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 fetch(`${base}${fullPath}`, {
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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jsondb-cloud/cli",
3
- "version": "1.0.14",
3
+ "version": "1.0.16",
4
4
  "description": "CLI tool for jsondb.cloud — push, pull, manage your JSON database from the terminal",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",