mydrive-cli 1.0.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.
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=clitool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clitool.d.ts","sourceRoot":"","sources":["../src/clitool.ts"],"names":[],"mappings":""}
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import figlet from "figlet";
4
+ import gradient from "gradient-string";
5
+ import { login } from "./commands/login.js";
6
+ import { fetchFiles } from "./commands/fetchFiles.js";
7
+ import { fileUpload, folderUpload } from "./commands/fileUpload.js";
8
+ console.log(gradient.pastel.multiline(figlet.textSync("MyDrive", { horizontalLayout: "full" })));
9
+ const program = new Command();
10
+ program
11
+ .name("mydrive")
12
+ .description("CLI for myDrive")
13
+ .version("1.0.0");
14
+ program
15
+ .command("login")
16
+ .description("Login to MyDrive")
17
+ .action(login);
18
+ program
19
+ .command("listFiles")
20
+ .description("List your files")
21
+ .action(fetchFiles);
22
+ program
23
+ .command("upload <filePath>")
24
+ .description("Upload your files")
25
+ .option("-d --dir", "Upload a directory")
26
+ .action((path, option) => {
27
+ if (option.dir) {
28
+ folderUpload(path);
29
+ }
30
+ else {
31
+ fileUpload(path);
32
+ }
33
+ });
34
+ program.parse();
35
+ //# sourceMappingURL=clitool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clitool.js","sourceRoot":"","sources":["../src/clitool.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,QAAQ,MAAM,iBAAiB,CAAC;AAGvC,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAEpE,OAAO,CAAC,GAAG,CACT,QAAQ,CAAC,MAAM,CAAC,SAAS,CACvB,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,gBAAgB,EAAE,MAAM,EAAE,CAAC,CACzD,CACF,CAAC;AAEF,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,iBAAiB,CAAC;KAC9B,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,kBAAkB,CAAC;KAC/B,MAAM,CAAC,KAAK,CAAC,CAAC;AAEjB,OAAO;KACF,OAAO,CAAC,WAAW,CAAC;KACpB,WAAW,CAAC,iBAAiB,CAAC;KAC9B,MAAM,CAAC,UAAU,CAAC,CAAC;AAExB,OAAO;KACF,OAAO,CAAC,mBAAmB,CAAC;KAC5B,WAAW,CAAC,mBAAmB,CAAC;KAChC,MAAM,CAAC,UAAU,EAAC,oBAAoB,CAAC;KACvC,MAAM,CAAC,CAAC,IAAI,EAAC,MAAM,EAAE,EAAE;IACtB,IAAG,MAAM,CAAC,GAAG,EAAE,CAAC;QACd,YAAY,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;SAAK,CAAC;QACL,UAAU,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;AACH,CAAC,CAAC,CAAA;AAEN,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function fetchFiles(): Promise<void>;
2
+ //# sourceMappingURL=fetchFiles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchFiles.d.ts","sourceRoot":"","sources":["../../src/commands/fetchFiles.ts"],"names":[],"mappings":"AAMA,wBAAsB,UAAU,kBAgE/B"}
@@ -0,0 +1,51 @@
1
+ import { api } from "../utils/apiClient.js";
2
+ import Table from "cli-table3";
3
+ import chalk from "chalk";
4
+ import ora from "ora";
5
+ import gradient from "gradient-string";
6
+ export async function fetchFiles() {
7
+ console.log(gradient.atlas("\nšŸ“‚ MyDrive Files\n"));
8
+ const spinner = ora({
9
+ text: chalk.cyan("Fetching files from cloud..."),
10
+ spinner: "dots"
11
+ }).start();
12
+ const table = new Table({
13
+ head: [
14
+ chalk.cyan.bold("File Name"),
15
+ chalk.magenta.bold("Type"),
16
+ chalk.blue.bold("Size"),
17
+ chalk.gray.bold("Created At")
18
+ ],
19
+ colWidths: [35, 15, 12, 28],
20
+ wordWrap: true
21
+ });
22
+ try {
23
+ const url = "/s3/fetchList";
24
+ const response = await api.get(url);
25
+ spinner.succeed(chalk.green("Files fetched successfully"));
26
+ if (!response.files || response.files.length === 0) {
27
+ console.log(chalk.yellow("\nNo files found in your drive.\n"));
28
+ return;
29
+ }
30
+ response.files.forEach((file) => {
31
+ const sizeKB = (file.size / 1024).toFixed(2) + " KB";
32
+ const formattedDate = new Date(file.createdAt)
33
+ .toLocaleString();
34
+ const icon = file.file_type === "folder"
35
+ ? "šŸ“"
36
+ : "šŸ“„";
37
+ table.push([
38
+ chalk.green(`${icon} ${file.file_original_name}`),
39
+ chalk.magenta(file.file_type),
40
+ chalk.blue(sizeKB),
41
+ chalk.gray(formattedDate)
42
+ ]);
43
+ });
44
+ console.log("\n" + table.toString() + "\n");
45
+ }
46
+ catch (error) {
47
+ spinner.fail(chalk.red("Error fetching files"));
48
+ console.error(chalk.red("Something went wrong while fetching files."));
49
+ }
50
+ }
51
+ //# sourceMappingURL=fetchFiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchFiles.js","sourceRoot":"","sources":["../../src/commands/fetchFiles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAC5C,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,QAAQ,MAAM,iBAAiB,CAAC;AAEvC,MAAM,CAAC,KAAK,UAAU,UAAU;IAE5B,OAAO,CAAC,GAAG,CACP,QAAQ,CAAC,KAAK,CAAC,sBAAsB,CAAC,CACzC,CAAC;IAEF,MAAM,OAAO,GAAG,GAAG,CAAC;QAChB,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC;QAChD,OAAO,EAAE,MAAM;KAClB,CAAC,CAAC,KAAK,EAAE,CAAC;IAEX,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;QACpB,IAAI,EAAE;YACF,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;YAC5B,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;SAChC;QACD,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;QAC3B,QAAQ,EAAE,IAAI;KACjB,CAAC,CAAC;IAEH,IAAI,CAAC;QAED,MAAM,GAAG,GAAG,eAAe,CAAC;QAC5B,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEpC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAC;QAE3D,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,mCAAmC,CAAC,CAAC,CAAC;YAC/D,OAAO;QACX,CAAC;QAED,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAS,EAAE,EAAE;YAEjC,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;YAErD,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;iBACzC,cAAc,EAAE,CAAC;YAEtB,MAAM,IAAI,GACN,IAAI,CAAC,SAAS,KAAK,QAAQ;gBACvB,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,IAAI,CAAC;YAEf,KAAK,CAAC,IAAI,CAAC;gBACP,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACjD,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;gBAC7B,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;gBAClB,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC;aAC5B,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,CAAC;IAEhD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAEb,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAEhD,OAAO,CAAC,KAAK,CACT,KAAK,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAC1D,CAAC;IACN,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare const fileUpload: (filePath: string) => Promise<void>;
2
+ export declare const folderUpload: (dirPath: string) => Promise<void>;
3
+ //# sourceMappingURL=fileUpload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileUpload.d.ts","sourceRoot":"","sources":["../../src/commands/fileUpload.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,UAAU,GAAU,UAAU,MAAM,kBAuEhD,CAAC;AAEF,eAAO,MAAM,YAAY,GAAU,SAAS,MAAM,kBAqDjD,CAAC"}
@@ -0,0 +1,111 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import mime from "mime-types";
4
+ import { api } from "../utils/apiClient.js";
5
+ import axios from "axios";
6
+ import cliProgress from "cli-progress";
7
+ import ora from "ora";
8
+ import chalk from "chalk";
9
+ export const fileUpload = async (filePath) => {
10
+ const absPath = path.resolve(filePath);
11
+ if (!fs.existsSync(absPath)) {
12
+ console.log(chalk.red("āŒ File not found:"), absPath);
13
+ return;
14
+ }
15
+ const meta = fs.statSync(absPath);
16
+ const file_name = path.basename(absPath);
17
+ const file_size = meta.size;
18
+ const file_type = mime.lookup(absPath) || "application/octet-stream";
19
+ console.log(chalk.cyan(`\nUploading: ${file_name}\n`));
20
+ const spinner = ora({
21
+ text: chalk.yellow("Requesting upload URL..."),
22
+ spinner: "dots"
23
+ }).start();
24
+ const res = await api.post("/s3/fetchUrl", {
25
+ file_name,
26
+ file_type,
27
+ file_size
28
+ });
29
+ spinner.succeed(chalk.green("Upload URL received"));
30
+ const fileStream = fs.createReadStream(absPath);
31
+ const progressBar = new cliProgress.SingleBar({
32
+ format: chalk.green("Uploading") +
33
+ " |{bar}| {percentage}% || {value}/{total} bytes",
34
+ barCompleteChar: "ā–ˆ",
35
+ barIncompleteChar: "ā–‘"
36
+ }, cliProgress.Presets.shades_classic);
37
+ progressBar.start(file_size, 0);
38
+ let uploadedBytes = 0;
39
+ fileStream.on("data", (chunk) => {
40
+ uploadedBytes += chunk.length;
41
+ progressBar.update(uploadedBytes);
42
+ });
43
+ try {
44
+ await axios.put(res.url, fileStream, {
45
+ headers: {
46
+ "Content-Type": file_type,
47
+ "Content-Length": file_size,
48
+ "x-amz-server-side-encryption": "AES256"
49
+ }
50
+ });
51
+ progressBar.stop();
52
+ console.log(chalk.green.bold("\nāœ” Upload complete šŸš€\n"));
53
+ }
54
+ catch (err) {
55
+ progressBar.stop();
56
+ console.log(chalk.red("\nāŒ Upload failed\n"));
57
+ }
58
+ };
59
+ export const folderUpload = async (dirPath) => {
60
+ console.log(chalk.cyan(`\nScanning folder: ${dirPath}\n`));
61
+ const spinner = ora("Preparing files...").start();
62
+ try {
63
+ const files = await uploadDir(dirPath);
64
+ spinner.succeed(`${files.length} files discovered`);
65
+ const presigned = await api.post("/s3/fetchBulkUrl", files);
66
+ console.log(chalk.yellow(`Uploading ${files.length} files...\n`));
67
+ let uploaded = 0;
68
+ await Promise.all(presigned.url.map(async (urlObj) => {
69
+ const base_name = path.basename(dirPath);
70
+ const relative = urlObj.filename.substring(base_name.length + 1);
71
+ const absolute = path.join(dirPath, relative);
72
+ const stream = fs.createReadStream(absolute);
73
+ await axios.put(urlObj.url, stream, {
74
+ headers: {
75
+ "Content-Type": urlObj.fileType,
76
+ "Content-Length": urlObj.size
77
+ }
78
+ });
79
+ uploaded++;
80
+ console.log(chalk.green(`āœ” Uploaded (${uploaded}/${files.length})`), chalk.gray(urlObj.filename));
81
+ }));
82
+ console.log(chalk.green.bold("\nšŸŽ‰ Folder upload completed\n"));
83
+ }
84
+ catch (error) {
85
+ spinner.fail("Upload failed");
86
+ console.log(chalk.red("āŒ Couldn't upload folder. Please try again."));
87
+ }
88
+ };
89
+ const uploadDir = async (dirPath, base = "") => {
90
+ const entries = await fs.promises.readdir(dirPath);
91
+ let files = [];
92
+ await Promise.all(entries.map(async (name) => {
93
+ const abs = path.join(dirPath, name);
94
+ const stat = await fs.promises.stat(abs);
95
+ const relPath = base ? `${base}/${name}` : `${path.basename(dirPath)}/${name}`;
96
+ if (stat.isFile()) {
97
+ const file_type = mime.lookup(abs) || "application/octet-stream";
98
+ files.push({
99
+ file_name: relPath,
100
+ file_size: stat.size,
101
+ file_type
102
+ });
103
+ }
104
+ else if (stat.isDirectory()) {
105
+ const nested = await uploadDir(abs, relPath);
106
+ files.push(...nested);
107
+ }
108
+ }));
109
+ return files;
110
+ };
111
+ //# sourceMappingURL=fileUpload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileUpload.js","sourceRoot":"","sources":["../../src/commands/fileUpload.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function login(): Promise<void>;
2
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AASA,wBAAsB,KAAK,kBAkF1B"}
@@ -0,0 +1,57 @@
1
+ import { api } from "../utils/apiClient.js";
2
+ import { saveToken } from "../utils/config.js";
3
+ import open from "open";
4
+ import ora, {} from "ora";
5
+ import chalk from "chalk";
6
+ import boxen from 'boxen';
7
+ export async function login() {
8
+ const spinner = ora({
9
+ text: chalk.cyan("Requesting device authorization..."),
10
+ spinner: "dots"
11
+ }).start();
12
+ const response = await fetch("https://mystore-3-7114.onrender.com/api/v1/auth/cli/getCliToken");
13
+ const data = await response.json();
14
+ spinner.succeed(chalk.green("Device authorization received"));
15
+ const device_code = data.deviceId;
16
+ const user_code = data.userCode;
17
+ const verification_url = data.verificationUrl;
18
+ console.log(boxen(chalk.bold.cyan(user_code), {
19
+ padding: 1,
20
+ margin: 1,
21
+ borderStyle: "round",
22
+ borderColor: "yellow",
23
+ title: "Verification Code",
24
+ titleAlignment: "center"
25
+ }));
26
+ console.log("Open:", verification_url);
27
+ console.log(chalk.gray("Opening browser for verification..."));
28
+ await open(verification_url);
29
+ const url = "/auth/cli/verification";
30
+ const spinner1 = ora("Waiting for authentication...").start();
31
+ const colors = ["yellow", "cyan", "magenta", "green"];
32
+ let index = 0;
33
+ while (index < 25) {
34
+ // const response = await fetch(url,{
35
+ // method:"POST",
36
+ // headers:{
37
+ // "Content-Type":"application/json"
38
+ // },
39
+ // body:JSON.stringify({
40
+ // device_code
41
+ // })
42
+ // });
43
+ spinner1.color = colors[index % colors.length] ?? "cyan";
44
+ const response = await api.post(url, { device_code });
45
+ const data = response;
46
+ if (data.verified) {
47
+ spinner1.succeed("Login successful!");
48
+ saveToken(data.token);
49
+ spinner.succeed("Done");
50
+ return;
51
+ }
52
+ index++;
53
+ await new Promise(r => setTimeout(r, 5000));
54
+ }
55
+ spinner1.fail(chalk.red("Login timeout. Please try again."));
56
+ }
57
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,GAAG,EAAE,EAAc,MAAM,KAAK,CAAC;AACtC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,MAAM,CAAC,KAAK,UAAU,KAAK;IAEvB,MAAM,OAAO,GAAG,GAAG,CAAC;QAChB,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC;QACtD,OAAO,EAAE,MAAM;KAClB,CAAC,CAAC,KAAK,EAAE,CAAC;IAEX,MAAM,QAAQ,GAAG,MAAM,KAAK,CACxB,iEAAiE,CACpE,CAAC;IAEF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAEnC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC;IAE9D,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC;IAClC,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC;IAChC,MAAM,gBAAgB,GAAG,IAAI,CAAC,eAAe,CAAC;IAE/C,OAAO,CAAC,GAAG,CACZ,KAAK,CACH,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAC1B;QACE,OAAO,EAAE,CAAC;QACV,MAAM,EAAE,CAAC;QACT,WAAW,EAAE,OAAO;QACpB,WAAW,EAAE,QAAQ;QACrB,KAAK,EAAE,mBAAmB;QAC1B,cAAc,EAAE,QAAQ;KACzB,CACF,CACF,CAAC;IACE,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;IAEvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC,CAAC;IAE/D,MAAM,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAE7B,MAAM,GAAG,GAAG,wBAAwB,CAAC;IAEvC,MAAM,QAAQ,GAAG,GAAG,CAAC,+BAA+B,CAAC,CAAC,KAAK,EAAE,CAAC;IAE5D,MAAM,MAAM,GAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAElE,IAAI,KAAK,GAAG,CAAC,CAAC;IAEV,OAAO,KAAK,GAAG,EAAE,EAAE,CAAC;QAEhB,qCAAqC;QACrC,qBAAqB;QACrB,gBAAgB;QAChB,4CAA4C;QAC5C,SAAS;QACT,4BAA4B;QAC5B,sBAAsB;QACtB,SAAS;QACT,MAAM;QAER,QAAQ,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC;QAEvD,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,EAAC,EAAC,WAAW,EAAC,CAAC,CAAC;QAGnD,MAAM,IAAI,GAAG,QAAQ,CAAC;QAEtB,IAAG,IAAI,CAAC,QAAQ,EAAC,CAAC;YAEX,QAAQ,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;YAEzC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAEtB,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAExB,OAAO;QACX,CAAC;QAED,KAAK,EAAE,CAAC;QAER,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAC,IAAI,CAAC,CAAC,CAAC;IAC/C,CAAC;IAEA,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC,CAAC;AAClE,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const api: {
2
+ get(endpoint: string): Promise<any>;
3
+ post(endpoint: string, body: any): Promise<any>;
4
+ };
5
+ //# sourceMappingURL=apiClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiClient.d.ts","sourceRoot":"","sources":["../../src/utils/apiClient.ts"],"names":[],"mappings":"AAmCA,eAAO,MAAM,GAAG;kBACE,MAAM;mBAGL,MAAM,QAAS,GAAG;CAOpC,CAAA"}
@@ -0,0 +1,37 @@
1
+ import { getToken } from "./config.js";
2
+ const BASE_URL = "https://mystore-3-7114.onrender.com/api/v1";
3
+ async function request(endpoint, options = {}) {
4
+ const token = getToken();
5
+ // console.log("this is token ",token);
6
+ const headers = {
7
+ "Content-Type": "application/json",
8
+ ...(token && { authorization: `Bearer ${token}` }),
9
+ ...options.headers
10
+ };
11
+ const response = await fetch(`${BASE_URL}${endpoint}`, {
12
+ ...options,
13
+ headers
14
+ });
15
+ // console.log("real response is ",response);
16
+ if (response.status === 401) {
17
+ console.log("You are not logged in. Run:");
18
+ console.log("mydrive --login");
19
+ process.exit(1);
20
+ }
21
+ ;
22
+ return response.json();
23
+ }
24
+ ;
25
+ export const api = {
26
+ get(endpoint) {
27
+ return request(endpoint, { method: "GET" });
28
+ },
29
+ post(endpoint, body) {
30
+ // console.log("body is ",body);
31
+ return request(endpoint, {
32
+ method: "POST",
33
+ body: JSON.stringify(body)
34
+ });
35
+ }
36
+ };
37
+ //# sourceMappingURL=apiClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiClient.js","sourceRoot":"","sources":["../../src/utils/apiClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC,MAAM,QAAQ,GAAG,4CAA4C,CAAC;AAE9D,KAAK,UAAU,OAAO,CAAC,QAAgB,EAAC,UAAgB,EAAE;IAEtD,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IAEzB,uCAAuC;IAEvC,MAAM,OAAO,GAAG;QACZ,cAAc,EAAE,kBAAkB;QAClC,GAAG,CAAC,KAAK,IAAI,EAAC,aAAa,EAAE,UAAU,KAAK,EAAE,EAAC,CAAC;QAChD,GAAG,OAAO,CAAC,OAAO;KACrB,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,GAAG,QAAQ,EAAE,EACjD;QACI,GAAG,OAAO;QACV,OAAO;KACV,CACJ,CAAC;IAEF,6CAA6C;IAC7C,IAAG,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAAA,CAAC;IAEF,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AAE3B,CAAC;AAAA,CAAC;AAEF,MAAM,CAAC,MAAM,GAAG,GAAG;IACf,GAAG,CAAC,QAAgB;QAChB,OAAO,OAAO,CAAC,QAAQ,EAAC,EAAC,MAAM,EAAE,KAAK,EAAC,CAAC,CAAA;IAC5C,CAAC;IACD,IAAI,CAAC,QAAgB,EAAG,IAAS;QAC7B,gCAAgC;QAChC,OAAO,OAAO,CAAC,QAAQ,EAAC;YACpB,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC7B,CAAC,CAAA;IACN,CAAC;CACJ,CAAA"}
@@ -0,0 +1,3 @@
1
+ export declare function saveToken(token: string): void;
2
+ export declare function getToken(): any;
3
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAWA,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,QAStC;AAED,wBAAgB,QAAQ,QAWvB"}
@@ -0,0 +1,21 @@
1
+ // utils/config.ts
2
+ import fs from "fs";
3
+ import os from "os";
4
+ import path from "path";
5
+ const CONFIG_DIR = process.env.APPDATA || path.join(os.homedir(), ".config");
6
+ const APP_DIR = path.join(CONFIG_DIR, "mydrive");
7
+ const CONFIG_FILE = path.join(APP_DIR, "config.json");
8
+ export function saveToken(token) {
9
+ if (!fs.existsSync(APP_DIR)) {
10
+ fs.mkdirSync(APP_DIR, { recursive: true });
11
+ }
12
+ fs.writeFileSync(CONFIG_FILE, JSON.stringify({ token }, null, 2));
13
+ }
14
+ export function getToken() {
15
+ if (!fs.existsSync(CONFIG_FILE)) {
16
+ return null;
17
+ }
18
+ const data = JSON.parse(fs.readFileSync(CONFIG_FILE, "utf-8"));
19
+ return data.token;
20
+ }
21
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAClB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,UAAU,GACd,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AAE5D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;AACjD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;AAEtD,MAAM,UAAU,SAAS,CAAC,KAAa;IAEnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,EAAE,CAAC,aAAa,CAAC,WAAW,EACxB,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CACrC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,QAAQ;IAEpB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CACnB,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CACxC,CAAC;IAEF,OAAO,IAAI,CAAC,KAAK,CAAC;AACtB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,62 @@
1
+ {
2
+ "dependencies": {
3
+ "@aws-sdk/client-s3": "^3.997.0",
4
+ "@aws-sdk/s3-request-presigner": "^3.997.0",
5
+ "@prisma/adapter-pg": "^7.4.1",
6
+ "@prisma/client": "^7.4.1",
7
+ "@types/cookie-parser": "^1.4.10",
8
+ "@types/cors": "^2.8.19",
9
+ "@types/express": "^5.0.6",
10
+ "@types/jsonwebtoken": "^9.0.10",
11
+ "axios": "^1.13.6",
12
+ "bcrypt": "^6.0.0",
13
+ "boxen": "^8.0.1",
14
+ "chalk": "^5.6.2",
15
+ "cli-progress": "^3.12.0",
16
+ "cli-table3": "^0.6.5",
17
+ "commander": "^14.0.3",
18
+ "cookie-parser": "^1.4.7",
19
+ "cors": "^2.8.6",
20
+ "crypto": "^1.0.1",
21
+ "dotenv": "^17.3.1",
22
+ "express": "^5.2.1",
23
+ "figlet": "^1.10.0",
24
+ "fs-extra": "^11.3.4",
25
+ "gradient-string": "^3.0.0",
26
+ "jsonwebtoken": "^9.0.3",
27
+ "mime-types": "^3.0.2",
28
+ "open": "^11.0.0",
29
+ "ora": "^9.3.0",
30
+ "os": "^0.1.2",
31
+ "path": "^0.12.7",
32
+ "pg": "^8.18.0",
33
+ "stream": "^0.0.3",
34
+ "typescript": "^5.9.3"
35
+ },
36
+ "devDependencies": {
37
+ "@types/bcrypt": "^6.0.0",
38
+ "@types/cli-progress": "^3.11.6",
39
+ "@types/mime-types": "^3.0.1",
40
+ "@types/node": "^25.3.1",
41
+ "@types/pg": "^8.16.0",
42
+ "prisma": "^7.4.1"
43
+ },
44
+ "name": "mydrive-cli",
45
+ "version": "1.0.0",
46
+ "description": "CLI for MyDrive",
47
+ "main": "dist/clitool.js",
48
+ "bin": {
49
+ "mydrive": "dist/clitool.js"
50
+ },
51
+ "files": [
52
+ "dist"
53
+ ],
54
+ "scripts": {
55
+ "test": "echo \"Error: no test specified\" && exit 1",
56
+ "build": "tsc"
57
+ },
58
+ "keywords": [],
59
+ "author": "",
60
+ "license": "ISC",
61
+ "type": "module"
62
+ }