stow-cli 1.0.2 → 1.0.3

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.
Files changed (56) hide show
  1. package/dist/{app-2A2CFVBC.js → app-JPUDM4LJ.js} +1 -1
  2. package/dist/backfill-QZTVNJZM.js +61 -0
  3. package/dist/buckets-JQKZ3PH3.js +63 -0
  4. package/dist/{chunk-ZDVARBCV.js → chunk-ELSDWMEB.js} +8 -2
  5. package/dist/chunk-WAQSCS57.js +38 -0
  6. package/dist/cli.js +508 -15
  7. package/dist/drops-QXGTYB5E.js +39 -0
  8. package/dist/files-OCYICIAM.js +165 -0
  9. package/dist/health-YMZTZUFX.js +52 -0
  10. package/dist/jobs-6JY4SVV5.js +92 -0
  11. package/dist/jobs-OKKGKSIH.js +83 -0
  12. package/dist/maintenance-EZUHQK5Q.js +86 -0
  13. package/dist/profiles-GWLBEEIT.js +50 -0
  14. package/dist/queues-EQX7EJZF.js +51 -0
  15. package/dist/search-2PXM6XQ6.js +108 -0
  16. package/dist/tags-LSVEIIUF.js +46 -0
  17. package/dist/{upload-MI6VFGTC.js → upload-ESYKBYHA.js} +3 -3
  18. package/dist/{whoami-754O5IML.js → whoami-4UYMSRVP.js} +1 -1
  19. package/package.json +1 -1
  20. package/dist/app-2H4TLSN7.js +0 -239
  21. package/dist/app-HYCPA7GA.js +0 -239
  22. package/dist/app-IZGSPZPX.js +0 -239
  23. package/dist/app-UGUM75MC.js +0 -239
  24. package/dist/app-XPOEAZJC.js +0 -239
  25. package/dist/app-YITP5APT.js +0 -233
  26. package/dist/chunk-2AORPTQB.js +0 -23
  27. package/dist/chunk-FEMMZ4YZ.js +0 -125
  28. package/dist/chunk-LYCXXF2T.js +0 -79
  29. package/dist/chunk-MHRMBH4Y.js +0 -36
  30. package/dist/chunk-R5CCBTXZ.js +0 -79
  31. package/dist/chunk-YRHPOFJT.js +0 -115
  32. package/dist/cli.d.ts +0 -1
  33. package/dist/delete-AECEJX5W.js +0 -18
  34. package/dist/delete-KYOZEODD.js +0 -18
  35. package/dist/delete-OLOAJRRO.js +0 -18
  36. package/dist/delete-V4EY4UBG.js +0 -18
  37. package/dist/list-7A3VZA2T.js +0 -97
  38. package/dist/list-DHXVIMRI.js +0 -94
  39. package/dist/list-DJEAKEZJ.js +0 -106
  40. package/dist/list-DQRU6QHO.js +0 -106
  41. package/dist/list-I5A6LTHX.js +0 -106
  42. package/dist/list-KEQPJY7I.js +0 -109
  43. package/dist/list-Z3MPT6MI.js +0 -109
  44. package/dist/open-2YNHG3MA.js +0 -15
  45. package/dist/upload-3NS5O3UL.js +0 -120
  46. package/dist/upload-B2PGW3AN.js +0 -125
  47. package/dist/upload-DQDBDIDI.js +0 -92
  48. package/dist/upload-FGNGNPC3.js +0 -93
  49. package/dist/upload-HKUPWTK2.js +0 -173
  50. package/dist/upload-JDVSJVWK.js +0 -173
  51. package/dist/upload-K4H7ZVRW.js +0 -98
  52. package/dist/whoami-2SLCNVKP.js +0 -27
  53. package/dist/whoami-DOMX3Z5K.js +0 -28
  54. package/dist/whoami-IPMCUEUH.js +0 -27
  55. package/dist/whoami-JSQA2IDN.js +0 -27
  56. package/dist/whoami-RKH5HHPR.js +0 -27
@@ -1,36 +0,0 @@
1
- // src/lib/format.ts
2
- function formatBytes(bytes) {
3
- if (bytes === 0) return "0 B";
4
- const units = ["B", "KB", "MB", "GB", "TB"];
5
- const i = Math.floor(Math.log(bytes) / Math.log(1024));
6
- return `${(bytes / Math.pow(1024, i)).toFixed(i > 0 ? 1 : 0)} ${units[i]}`;
7
- }
8
- function formatTable(headers, rows) {
9
- if (rows.length === 0) return "";
10
- const widths = headers.map((h, i) => {
11
- const dataMax = rows.reduce((max, row) => Math.max(max, (row[i] || "").length), 0);
12
- return Math.max(h.length, dataMax);
13
- });
14
- const pad = (str, width) => str.padEnd(width);
15
- const sep = widths.map((w) => "\u2500".repeat(w)).join("\u2500\u2500");
16
- const lines = [];
17
- lines.push(headers.map((h, i) => pad(h, widths[i])).join(" "));
18
- lines.push(sep);
19
- for (const row of rows) {
20
- lines.push(row.map((cell, i) => pad(cell || "", widths[i])).join(" "));
21
- }
22
- return lines.join("\n");
23
- }
24
- function usageBar(used, total, width = 20) {
25
- const ratio = Math.min(used / total, 1);
26
- const filled = Math.round(ratio * width);
27
- const empty = width - filled;
28
- const pct = Math.round(ratio * 100);
29
- return `[${"\u2588".repeat(filled)}${"\u2591".repeat(empty)}] ${pct}%`;
30
- }
31
-
32
- export {
33
- formatBytes,
34
- formatTable,
35
- usageBar
36
- };
@@ -1,79 +0,0 @@
1
- import {
2
- getApiKey,
3
- getBaseUrl
4
- } from "./chunk-2AORPTQB.js";
5
-
6
- // src/lib/api.ts
7
- var StowApiError = class extends Error {
8
- status;
9
- code;
10
- constructor(status, message, code) {
11
- super(message);
12
- this.name = "StowApiError";
13
- this.status = status;
14
- this.code = code;
15
- }
16
- };
17
- function formatApiError(status, message) {
18
- switch (status) {
19
- case 401:
20
- return "Invalid API key. Set STOW_API_KEY or get one at stow.sh/dashboard/api-keys";
21
- case 403:
22
- return message || "Permission denied";
23
- case 404:
24
- return message || "Not found";
25
- case 413:
26
- return "File too large (max 50MB)";
27
- case 429:
28
- return "Rate limit exceeded. Try again shortly.";
29
- default:
30
- return message || `Request failed (${status})`;
31
- }
32
- }
33
- async function apiRequest(path, options = {}) {
34
- const apiKey = getApiKey();
35
- const baseUrl = getBaseUrl();
36
- const url = `${baseUrl}${path}`;
37
- const headers = {
38
- "x-api-key": apiKey,
39
- ...options.headers || {}
40
- };
41
- if (options.body && typeof options.body === "string") {
42
- headers["Content-Type"] = "application/json";
43
- }
44
- let response;
45
- try {
46
- response = await fetch(url, { ...options, headers });
47
- } catch (err) {
48
- const msg = err instanceof Error ? err.message : String(err);
49
- if (msg.includes("ECONNREFUSED")) {
50
- throw new StowApiError(
51
- 0,
52
- `Cannot connect to ${baseUrl}. Is the server running?`
53
- );
54
- }
55
- if (msg.includes("ENOTFOUND")) {
56
- throw new StowApiError(
57
- 0,
58
- `Cannot resolve ${baseUrl}. Check your STOW_API_URL or internet connection.`
59
- );
60
- }
61
- throw new StowApiError(0, `Network error: ${msg}`);
62
- }
63
- if (!response.ok) {
64
- const data = await response.json().catch(() => ({}));
65
- const serverMsg = data.error;
66
- const code = data.code;
67
- throw new StowApiError(
68
- response.status,
69
- formatApiError(response.status, serverMsg || ""),
70
- code
71
- );
72
- }
73
- return await response.json();
74
- }
75
-
76
- export {
77
- StowApiError,
78
- apiRequest
79
- };
@@ -1,115 +0,0 @@
1
- import {
2
- getApiKey,
3
- getBaseUrl
4
- } from "./chunk-2AORPTQB.js";
5
-
6
- // src/lib/api.ts
7
- var StowApiError = class extends Error {
8
- status;
9
- code;
10
- constructor(status, message, code) {
11
- super(message);
12
- this.name = "StowApiError";
13
- this.status = status;
14
- this.code = code;
15
- }
16
- };
17
- function formatApiError(status, message) {
18
- switch (status) {
19
- case 401:
20
- return "Invalid API key. Set STOW_API_KEY or get one at stow.sh/dashboard/api-keys";
21
- case 403:
22
- return message || "Permission denied";
23
- case 404:
24
- return message || "Not found";
25
- case 413:
26
- return "File too large (max 50MB)";
27
- case 429:
28
- return "Rate limit exceeded. Try again shortly.";
29
- default:
30
- return message || `Request failed (${status})`;
31
- }
32
- }
33
- async function apiRequest(path, options = {}) {
34
- const apiKey = getApiKey();
35
- const baseUrl = getBaseUrl();
36
- const url = `${baseUrl}${path}`;
37
- const headers = {
38
- "x-api-key": apiKey,
39
- ...options.headers || {}
40
- };
41
- if (options.body && typeof options.body === "string") {
42
- headers["Content-Type"] = "application/json";
43
- }
44
- let response;
45
- try {
46
- response = await fetch(url, { ...options, headers });
47
- } catch (err) {
48
- const msg = err instanceof Error ? err.message : String(err);
49
- if (msg.includes("ECONNREFUSED")) {
50
- throw new StowApiError(0, `Cannot connect to ${baseUrl}. Is the server running?`);
51
- }
52
- if (msg.includes("ENOTFOUND")) {
53
- throw new StowApiError(0, `Cannot resolve ${baseUrl}. Check your STOW_API_URL or internet connection.`);
54
- }
55
- throw new StowApiError(0, `Network error: ${msg}`);
56
- }
57
- if (!response.ok) {
58
- const data = await response.json().catch(() => ({}));
59
- const serverMsg = data.error;
60
- const code = data.code;
61
- throw new StowApiError(
62
- response.status,
63
- formatApiError(response.status, serverMsg || ""),
64
- code
65
- );
66
- }
67
- return await response.json();
68
- }
69
- async function apiUpload(path, fileBuffer, filename, contentType) {
70
- const apiKey = getApiKey();
71
- const baseUrl = getBaseUrl();
72
- const boundary = `----stow${Date.now()}`;
73
- const parts = [];
74
- parts.push(Buffer.from(`--${boundary}\r
75
- `));
76
- parts.push(Buffer.from(`Content-Disposition: form-data; name="file"; filename="${filename}"\r
77
- `));
78
- parts.push(Buffer.from(`Content-Type: ${contentType}\r
79
- \r
80
- `));
81
- parts.push(fileBuffer);
82
- parts.push(Buffer.from(`\r
83
- --${boundary}--\r
84
- `));
85
- const body = Buffer.concat(parts);
86
- let response;
87
- try {
88
- response = await fetch(`${baseUrl}${path}`, {
89
- method: "POST",
90
- headers: {
91
- "x-api-key": apiKey,
92
- "Content-Type": `multipart/form-data; boundary=${boundary}`
93
- },
94
- body
95
- });
96
- } catch (err) {
97
- const msg = err instanceof Error ? err.message : String(err);
98
- throw new StowApiError(0, `Network error: ${msg}`);
99
- }
100
- if (!response.ok) {
101
- const data = await response.json().catch(() => ({}));
102
- const serverMsg = data.error;
103
- throw new StowApiError(
104
- response.status,
105
- formatApiError(response.status, serverMsg || "")
106
- );
107
- }
108
- return await response.json();
109
- }
110
-
111
- export {
112
- StowApiError,
113
- apiRequest,
114
- apiUpload
115
- };
package/dist/cli.d.ts DELETED
@@ -1 +0,0 @@
1
- #!/usr/bin/env node
@@ -1,18 +0,0 @@
1
- import {
2
- apiRequest
3
- } from "./chunk-FEMMZ4YZ.js";
4
- import "./chunk-2AORPTQB.js";
5
-
6
- // src/commands/delete.ts
7
- async function deleteFile(bucket, key) {
8
- const encodedKey = encodeURIComponent(key);
9
- const params = new URLSearchParams({ bucket });
10
- await apiRequest(
11
- `/api/files/${encodedKey}?${params}`,
12
- { method: "DELETE" }
13
- );
14
- console.log(`Deleted: ${key} from ${bucket}`);
15
- }
16
- export {
17
- deleteFile
18
- };
@@ -1,18 +0,0 @@
1
- import {
2
- apiRequest
3
- } from "./chunk-R5CCBTXZ.js";
4
- import "./chunk-2AORPTQB.js";
5
-
6
- // src/commands/delete.ts
7
- async function deleteFile(bucket, key) {
8
- const encodedKey = encodeURIComponent(key);
9
- const params = new URLSearchParams({ bucket });
10
- await apiRequest(
11
- `/api/files/${encodedKey}?${params}`,
12
- { method: "DELETE" }
13
- );
14
- console.log(`Deleted: ${key} from ${bucket}`);
15
- }
16
- export {
17
- deleteFile
18
- };
@@ -1,18 +0,0 @@
1
- import {
2
- apiRequest
3
- } from "./chunk-LYCXXF2T.js";
4
- import "./chunk-OZ7QQTIZ.js";
5
-
6
- // src/commands/delete.ts
7
- async function deleteFile(bucket, key) {
8
- const encodedKey = encodeURIComponent(key);
9
- const params = new URLSearchParams({ bucket });
10
- await apiRequest(
11
- `/api/files/${encodedKey}?${params}`,
12
- { method: "DELETE" }
13
- );
14
- console.log(`Deleted: ${key} from ${bucket}`);
15
- }
16
- export {
17
- deleteFile
18
- };
@@ -1,18 +0,0 @@
1
- import {
2
- apiRequest
3
- } from "./chunk-YRHPOFJT.js";
4
- import "./chunk-2AORPTQB.js";
5
-
6
- // src/commands/delete.ts
7
- async function deleteFile(bucket, key) {
8
- const encodedKey = encodeURIComponent(key);
9
- const params = new URLSearchParams({ bucket });
10
- await apiRequest(
11
- `/api/files/${encodedKey}?${params}`,
12
- { method: "DELETE" }
13
- );
14
- console.log(`Deleted: ${key} from ${bucket}`);
15
- }
16
- export {
17
- deleteFile
18
- };
@@ -1,97 +0,0 @@
1
- import {
2
- createStow
3
- } from "./chunk-JYOMHKFS.js";
4
- import {
5
- formatBytes,
6
- formatTable,
7
- usageBar
8
- } from "./chunk-ZDVARBCV.js";
9
- import "./chunk-OZ7QQTIZ.js";
10
-
11
- // src/commands/list.ts
12
- async function listBuckets() {
13
- const stow = createStow();
14
- const data = await stow.listBuckets();
15
- if (data.buckets.length === 0) {
16
- console.log("No buckets yet. Create one with: stow buckets create <name>");
17
- return;
18
- }
19
- const rows = data.buckets.map((b) => [
20
- b.name,
21
- b.isPublic ? "public" : "private",
22
- `${b.fileCount ?? 0} files`,
23
- formatBytes(b.usageBytes ?? 0),
24
- b.description || ""
25
- ]);
26
- console.log(
27
- formatTable(["Name", "Access", "Files", "Size", "Description"], rows)
28
- );
29
- }
30
- async function createBucket(name, options) {
31
- const stow = createStow();
32
- const bucket = await stow.createBucket({
33
- name,
34
- ...options.description ? { description: options.description } : {},
35
- ...options.public ? { isPublic: true } : {}
36
- });
37
- console.log(`Created bucket: ${bucket.name}`);
38
- }
39
- async function renameBucket(name, newName, options) {
40
- if (!options.yes) {
41
- console.error(
42
- "Warning: Renaming a bucket will break any existing URLs using the old name."
43
- );
44
- console.error("Use --yes to skip this warning.");
45
- }
46
- const stow = createStow();
47
- const bucket = await stow.renameBucket(name, newName);
48
- console.log(`Renamed bucket: ${name} \u2192 ${bucket.name}`);
49
- }
50
- async function listFiles(bucket, options) {
51
- const stow = createStow();
52
- const parsedLimit = options.limit ? Number.parseInt(options.limit, 10) : null;
53
- const data = await stow.listFiles({
54
- bucket,
55
- ...options.search ? { prefix: options.search } : {},
56
- ...parsedLimit && Number.isFinite(parsedLimit) && parsedLimit > 0 ? { limit: parsedLimit } : {}
57
- });
58
- if (data.files.length === 0) {
59
- console.log(`No files in bucket '${bucket}'.`);
60
- return;
61
- }
62
- const rows = data.files.map((f) => [
63
- f.key,
64
- formatBytes(f.size),
65
- f.lastModified.split("T")[0]
66
- ]);
67
- console.log(formatTable(["Key", "Size", "Modified"], rows));
68
- if (data.nextCursor) {
69
- console.log("\n(more files available \u2014 use --limit to see more)");
70
- }
71
- }
72
- async function listDrops() {
73
- const stow = createStow();
74
- const data = await stow.listDrops();
75
- if (data.drops.length === 0) {
76
- console.log("No drops yet. Create one with: stow drop <file>");
77
- return;
78
- }
79
- const rows = data.drops.map((d) => [
80
- d.filename,
81
- formatBytes(Number(d.size)),
82
- d.contentType,
83
- d.url
84
- ]);
85
- console.log(formatTable(["Filename", "Size", "Type", "URL"], rows));
86
- console.log(
87
- `
88
- Storage: ${usageBar(data.usage.bytes, data.usage.limit)} ${formatBytes(data.usage.bytes)} / ${formatBytes(data.usage.limit)}`
89
- );
90
- }
91
- export {
92
- createBucket,
93
- listBuckets,
94
- listDrops,
95
- listFiles,
96
- renameBucket
97
- };
@@ -1,94 +0,0 @@
1
- import {
2
- formatBytes,
3
- formatTable,
4
- usageBar
5
- } from "./chunk-MHRMBH4Y.js";
6
- import {
7
- apiRequest
8
- } from "./chunk-YRHPOFJT.js";
9
- import "./chunk-2AORPTQB.js";
10
-
11
- // src/commands/list.ts
12
- async function listBuckets() {
13
- const data = await apiRequest("/api/buckets");
14
- if (data.buckets.length === 0) {
15
- console.log("No buckets yet. Create one with: stow buckets create <name>");
16
- return;
17
- }
18
- const rows = data.buckets.map((b) => [
19
- b.name,
20
- b.isPublic ? "public" : "private",
21
- `${b.fileCount} files`,
22
- formatBytes(b.usageBytes),
23
- b.description || ""
24
- ]);
25
- console.log(formatTable(["Name", "Access", "Files", "Size", "Description"], rows));
26
- }
27
- async function createBucket(name, options) {
28
- const body = { name };
29
- if (options.description) body.description = options.description;
30
- if (options.public) body.isPublic = true;
31
- const data = await apiRequest("/api/buckets", {
32
- method: "POST",
33
- body: JSON.stringify(body)
34
- });
35
- console.log(`Created bucket: ${data.bucket.name}`);
36
- }
37
- async function renameBucket(name, newName, options) {
38
- if (!options.yes) {
39
- console.error("Warning: Renaming a bucket will break any existing URLs using the old name.");
40
- console.error("Use --yes to skip this warning.");
41
- }
42
- const data = await apiRequest(`/api/buckets/_?bucket=${encodeURIComponent(name)}`, {
43
- method: "PATCH",
44
- body: JSON.stringify({ name: newName })
45
- });
46
- console.log(`Renamed bucket: ${name} \u2192 ${data.bucket.name}`);
47
- }
48
- async function listFiles(bucket, options) {
49
- const params = new URLSearchParams({ bucket });
50
- if (options.search) params.set("prefix", options.search);
51
- if (options.limit) params.set("limit", options.limit);
52
- const data = await apiRequest(
53
- `/api/files?${params}`
54
- );
55
- if (data.files.length === 0) {
56
- console.log(`No files in bucket '${bucket}'.`);
57
- return;
58
- }
59
- const rows = data.files.map((f) => [
60
- f.key,
61
- formatBytes(f.size),
62
- f.lastModified.split("T")[0]
63
- ]);
64
- console.log(formatTable(["Key", "Size", "Modified"], rows));
65
- if (data.nextCursor) {
66
- console.log(`
67
- (more files available \u2014 use --limit to see more)`);
68
- }
69
- }
70
- async function listDrops() {
71
- const data = await apiRequest("/api/drops");
72
- if (data.drops.length === 0) {
73
- console.log("No drops yet. Create one with: stow drop <file>");
74
- return;
75
- }
76
- const rows = data.drops.map((d) => [
77
- d.filename,
78
- formatBytes(Number(d.size)),
79
- d.contentType,
80
- d.url
81
- ]);
82
- console.log(formatTable(["Filename", "Size", "Type", "URL"], rows));
83
- console.log(
84
- `
85
- Storage: ${usageBar(data.usage.bytes, data.usage.limit)} ${formatBytes(data.usage.bytes)} / ${formatBytes(data.usage.limit)}`
86
- );
87
- }
88
- export {
89
- createBucket,
90
- listBuckets,
91
- listDrops,
92
- listFiles,
93
- renameBucket
94
- };
@@ -1,106 +0,0 @@
1
- import {
2
- formatBytes,
3
- formatTable,
4
- usageBar
5
- } from "./chunk-ZDVARBCV.js";
6
- import {
7
- apiRequest
8
- } from "./chunk-FEMMZ4YZ.js";
9
- import "./chunk-2AORPTQB.js";
10
-
11
- // src/commands/list.ts
12
- async function listBuckets() {
13
- const data = await apiRequest("/api/buckets");
14
- if (data.buckets.length === 0) {
15
- console.log("No buckets yet. Create one with: stow buckets create <name>");
16
- return;
17
- }
18
- const rows = data.buckets.map((b) => [
19
- b.name,
20
- b.isPublic ? "public" : "private",
21
- `${b.fileCount} files`,
22
- formatBytes(b.usageBytes),
23
- b.description || ""
24
- ]);
25
- console.log(
26
- formatTable(["Name", "Access", "Files", "Size", "Description"], rows)
27
- );
28
- }
29
- async function createBucket(name, options) {
30
- const body = { name };
31
- if (options.description) {
32
- body.description = options.description;
33
- }
34
- if (options.public) {
35
- body.isPublic = true;
36
- }
37
- const data = await apiRequest("/api/buckets", {
38
- method: "POST",
39
- body: JSON.stringify(body)
40
- });
41
- console.log(`Created bucket: ${data.bucket.name}`);
42
- }
43
- async function renameBucket(name, newName, options) {
44
- if (!options.yes) {
45
- console.error(
46
- "Warning: Renaming a bucket will break any existing URLs using the old name."
47
- );
48
- console.error("Use --yes to skip this warning.");
49
- }
50
- const data = await apiRequest(
51
- `/api/buckets/_?bucket=${encodeURIComponent(name)}`,
52
- {
53
- method: "PATCH",
54
- body: JSON.stringify({ name: newName })
55
- }
56
- );
57
- console.log(`Renamed bucket: ${name} \u2192 ${data.bucket.name}`);
58
- }
59
- async function listFiles(bucket, options) {
60
- const params = new URLSearchParams({ bucket });
61
- if (options.search) {
62
- params.set("prefix", options.search);
63
- }
64
- if (options.limit) {
65
- params.set("limit", options.limit);
66
- }
67
- const data = await apiRequest(`/api/files?${params}`);
68
- if (data.files.length === 0) {
69
- console.log(`No files in bucket '${bucket}'.`);
70
- return;
71
- }
72
- const rows = data.files.map((f) => [
73
- f.key,
74
- formatBytes(f.size),
75
- f.lastModified.split("T")[0]
76
- ]);
77
- console.log(formatTable(["Key", "Size", "Modified"], rows));
78
- if (data.nextCursor) {
79
- console.log("\n(more files available \u2014 use --limit to see more)");
80
- }
81
- }
82
- async function listDrops() {
83
- const data = await apiRequest("/api/drops");
84
- if (data.drops.length === 0) {
85
- console.log("No drops yet. Create one with: stow drop <file>");
86
- return;
87
- }
88
- const rows = data.drops.map((d) => [
89
- d.filename,
90
- formatBytes(Number(d.size)),
91
- d.contentType,
92
- d.url
93
- ]);
94
- console.log(formatTable(["Filename", "Size", "Type", "URL"], rows));
95
- console.log(
96
- `
97
- Storage: ${usageBar(data.usage.bytes, data.usage.limit)} ${formatBytes(data.usage.bytes)} / ${formatBytes(data.usage.limit)}`
98
- );
99
- }
100
- export {
101
- createBucket,
102
- listBuckets,
103
- listDrops,
104
- listFiles,
105
- renameBucket
106
- };