cfpan-cli 0.1.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.
Files changed (74) hide show
  1. package/README.md +69 -0
  2. package/dist/api/auth.d.ts +15 -0
  3. package/dist/api/auth.d.ts.map +1 -0
  4. package/dist/api/auth.js +20 -0
  5. package/dist/api/auth.js.map +1 -0
  6. package/dist/api/client.d.ts +20 -0
  7. package/dist/api/client.d.ts.map +1 -0
  8. package/dist/api/client.js +81 -0
  9. package/dist/api/client.js.map +1 -0
  10. package/dist/api/download.d.ts +3 -0
  11. package/dist/api/download.d.ts.map +1 -0
  12. package/dist/api/download.js +50 -0
  13. package/dist/api/download.js.map +1 -0
  14. package/dist/api/files.d.ts +50 -0
  15. package/dist/api/files.d.ts.map +1 -0
  16. package/dist/api/files.js +56 -0
  17. package/dist/api/files.js.map +1 -0
  18. package/dist/api/share.d.ts +15 -0
  19. package/dist/api/share.d.ts.map +1 -0
  20. package/dist/api/share.js +21 -0
  21. package/dist/api/share.js.map +1 -0
  22. package/dist/api/upload.d.ts +35 -0
  23. package/dist/api/upload.d.ts.map +1 -0
  24. package/dist/api/upload.js +65 -0
  25. package/dist/api/upload.js.map +1 -0
  26. package/dist/commands/download.d.ts +3 -0
  27. package/dist/commands/download.d.ts.map +1 -0
  28. package/dist/commands/download.js +33 -0
  29. package/dist/commands/download.js.map +1 -0
  30. package/dist/commands/login.d.ts +3 -0
  31. package/dist/commands/login.d.ts.map +1 -0
  32. package/dist/commands/login.js +35 -0
  33. package/dist/commands/login.js.map +1 -0
  34. package/dist/commands/logout.d.ts +3 -0
  35. package/dist/commands/logout.d.ts.map +1 -0
  36. package/dist/commands/logout.js +16 -0
  37. package/dist/commands/logout.js.map +1 -0
  38. package/dist/commands/ls.d.ts +3 -0
  39. package/dist/commands/ls.d.ts.map +1 -0
  40. package/dist/commands/ls.js +92 -0
  41. package/dist/commands/ls.js.map +1 -0
  42. package/dist/commands/mkdir.d.ts +3 -0
  43. package/dist/commands/mkdir.d.ts.map +1 -0
  44. package/dist/commands/mkdir.js +29 -0
  45. package/dist/commands/mkdir.js.map +1 -0
  46. package/dist/commands/rm.d.ts +4 -0
  47. package/dist/commands/rm.d.ts.map +1 -0
  48. package/dist/commands/rm.js +69 -0
  49. package/dist/commands/rm.js.map +1 -0
  50. package/dist/commands/share.d.ts +3 -0
  51. package/dist/commands/share.d.ts.map +1 -0
  52. package/dist/commands/share.js +64 -0
  53. package/dist/commands/share.js.map +1 -0
  54. package/dist/commands/upload.d.ts +3 -0
  55. package/dist/commands/upload.d.ts.map +1 -0
  56. package/dist/commands/upload.js +44 -0
  57. package/dist/commands/upload.js.map +1 -0
  58. package/dist/config.d.ts +15 -0
  59. package/dist/config.d.ts.map +1 -0
  60. package/dist/config.js +52 -0
  61. package/dist/config.js.map +1 -0
  62. package/dist/index.d.ts +3 -0
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +27 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/utils/format.d.ts +10 -0
  67. package/dist/utils/format.d.ts.map +1 -0
  68. package/dist/utils/format.js +66 -0
  69. package/dist/utils/format.js.map +1 -0
  70. package/dist/utils/progress.d.ts +8 -0
  71. package/dist/utils/progress.d.ts.map +1 -0
  72. package/dist/utils/progress.js +40 -0
  73. package/dist/utils/progress.js.map +1 -0
  74. package/package.json +40 -0
@@ -0,0 +1,35 @@
1
+ import { Command } from 'commander';
2
+ import { login } from '../api/auth.js';
3
+ import { setProfile } from '../config.js';
4
+ import { success, error } from '../utils/format.js';
5
+ import * as readline from 'node:readline/promises';
6
+ import { stdin as input, stdout as output } from 'node:process';
7
+ export const loginCommand = new Command('login')
8
+ .description('Login to CFpan instance')
9
+ .argument('<endpoint>', 'CFpan endpoint URL (e.g., https://cfpan.example.com)')
10
+ .option('-u, --username <username>', 'Admin username')
11
+ .option('-p, --password <password>', 'Admin password')
12
+ .action(async (endpoint, options) => {
13
+ try {
14
+ const rl = readline.createInterface({ input, output });
15
+ const username = options.username || (await rl.question('Username: '));
16
+ const password = options.password || (await rl.question('Password: '));
17
+ rl.close();
18
+ // Clean endpoint URL
19
+ const cleanEndpoint = endpoint.replace(/\/$/, '');
20
+ // Perform login and get token
21
+ const response = await login(cleanEndpoint, username, password);
22
+ // Save profile
23
+ await setProfile('default', {
24
+ endpoint: cleanEndpoint,
25
+ token: response.token,
26
+ });
27
+ success(`Logged in to ${cleanEndpoint}`);
28
+ success(`Token expires at: ${new Date(response.expiresAt).toLocaleString()}`);
29
+ }
30
+ catch (err) {
31
+ error(`Login failed: ${err instanceof Error ? err.message : String(err)}`);
32
+ process.exit(1);
33
+ }
34
+ });
35
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,QAAQ,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,KAAK,IAAI,KAAK,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,cAAc,CAAC;AAEhE,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CAAC,yBAAyB,CAAC;KACtC,QAAQ,CACP,YAAY,EACZ,sDAAsD,CACvD;KACA,MAAM,CAAC,2BAA2B,EAAE,gBAAgB,CAAC;KACrD,MAAM,CAAC,2BAA2B,EAAE,gBAAgB,CAAC;KACrD,MAAM,CACL,KAAK,EACH,QAAgB,EAChB,OAAiD,EACjD,EAAE;IACF,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAEvD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;QACvE,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;QAEvE,EAAE,CAAC,KAAK,EAAE,CAAC;QAEX,qBAAqB;QACrB,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAElD,8BAA8B;QAC9B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,aAAa,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAEhE,eAAe;QACf,MAAM,UAAU,CAAC,SAAS,EAAE;YAC1B,QAAQ,EAAE,aAAa;YACvB,KAAK,EAAE,QAAQ,CAAC,KAAK;SACtB,CAAC,CAAC;QAEH,OAAO,CAAC,gBAAgB,aAAa,EAAE,CAAC,CAAC;QACzC,OAAO,CACL,qBAAqB,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE,EAAE,CACrE,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,KAAK,CACH,iBAAiB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACpE,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const logoutCommand: Command;
3
+ //# sourceMappingURL=logout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,aAAa,SAYtB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { Command } from 'commander';
2
+ import { removeProfile } from '../config.js';
3
+ import { success, error } from '../utils/format.js';
4
+ export const logoutCommand = new Command('logout')
5
+ .description('Logout from current session')
6
+ .action(async () => {
7
+ try {
8
+ await removeProfile('default');
9
+ success('Logged out successfully');
10
+ }
11
+ catch (err) {
12
+ error(`Logout failed: ${err instanceof Error ? err.message : String(err)}`);
13
+ process.exit(1);
14
+ }
15
+ });
16
+ //# sourceMappingURL=logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,SAAS,CAAC,CAAC;QAC/B,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,KAAK,CACH,kBAAkB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACrE,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const lsCommand: Command;
3
+ //# sourceMappingURL=ls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ls.d.ts","sourceRoot":"","sources":["../../src/commands/ls.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,SAAS,SAiHnB,CAAC"}
@@ -0,0 +1,92 @@
1
+ import { Command } from 'commander';
2
+ import { ApiClient } from '../api/client.js';
3
+ import { getActiveProfile } from '../config.js';
4
+ import { listFiles } from '../api/files.js';
5
+ import { error, table, formatSize, formatDate } from '../utils/format.js';
6
+ import chalk from 'chalk';
7
+ export const lsCommand = new Command('ls')
8
+ .description('List files and folders')
9
+ .argument('[path]', 'Remote path (default: root)', '/')
10
+ .option('--trash', 'Show trash')
11
+ .option('--favorites', 'Show favorites')
12
+ .option('--shared', 'Show shared files')
13
+ .option('--recent', 'Show recent files')
14
+ .option('-l, --long', 'Show detailed information')
15
+ .action(async (path, options) => {
16
+ try {
17
+ const profile = await getActiveProfile();
18
+ if (!profile) {
19
+ error('Not logged in. Run: cfpan login <endpoint>');
20
+ process.exit(1);
21
+ }
22
+ const client = new ApiClient(profile);
23
+ let view = 'files';
24
+ if (options.trash)
25
+ view = 'trash';
26
+ else if (options.favorites)
27
+ view = 'favorites';
28
+ else if (options.shared)
29
+ view = 'shared';
30
+ else if (options.recent)
31
+ view = 'recent';
32
+ const response = await listFiles(client, {
33
+ view,
34
+ limit: 100,
35
+ });
36
+ // Print breadcrumbs
37
+ if (response.breadcrumbs.length > 0) {
38
+ const breadcrumbPath = response.breadcrumbs
39
+ .map((b) => b.name || 'Root')
40
+ .join(' / ');
41
+ console.log(chalk.gray(`Path: /${breadcrumbPath}`));
42
+ console.log();
43
+ }
44
+ // Print storage info
45
+ console.log(chalk.gray(`Storage: ${formatSize(response.used)} / ${formatSize(response.capacity)} (${Math.round((response.used / response.capacity) * 100)}%)`));
46
+ console.log();
47
+ if (response.folders.length === 0 && response.files.length === 0) {
48
+ console.log(chalk.gray('(empty)'));
49
+ return;
50
+ }
51
+ if (options.long) {
52
+ // Detailed view
53
+ const rows = [];
54
+ for (const folder of response.folders) {
55
+ rows.push([
56
+ chalk.blue('📁'),
57
+ chalk.blue(folder.name),
58
+ '-',
59
+ formatDate(folder.createdAt),
60
+ folder.favorite ? chalk.yellow('★') : '',
61
+ ]);
62
+ }
63
+ for (const file of response.files) {
64
+ rows.push([
65
+ '📄',
66
+ file.name,
67
+ formatSize(file.size),
68
+ formatDate(file.createdAt),
69
+ file.favorite ? chalk.yellow('★') : '',
70
+ file.shared ? chalk.green('🔗') : '',
71
+ ]);
72
+ }
73
+ table(['', 'Name', 'Size', 'Modified', 'Fav', 'Shared'], rows);
74
+ }
75
+ else {
76
+ // Simple view
77
+ for (const folder of response.folders) {
78
+ console.log(chalk.blue('📁 ' + folder.name + '/'));
79
+ }
80
+ for (const file of response.files) {
81
+ console.log(`📄 ${file.name} ${chalk.gray(`(${formatSize(file.size)})`)}`);
82
+ }
83
+ }
84
+ console.log();
85
+ console.log(chalk.gray(`Total: ${response.folders.length} folders, ${response.files.length} files`));
86
+ }
87
+ catch (err) {
88
+ error(`Failed to list files: ${err instanceof Error ? err.message : String(err)}`);
89
+ process.exit(1);
90
+ }
91
+ });
92
+ //# sourceMappingURL=ls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ls.js","sourceRoot":"","sources":["../../src/commands/ls.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const mkdirCommand: Command;
3
+ //# sourceMappingURL=mkdir.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mkdir.d.ts","sourceRoot":"","sources":["../../src/commands/mkdir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,YAAY,SA0BrB,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { Command } from 'commander';
2
+ import { ApiClient } from '../api/client.js';
3
+ import { getActiveProfile } from '../config.js';
4
+ import { createFolder } from '../api/files.js';
5
+ import { error, success } from '../utils/format.js';
6
+ export const mkdirCommand = new Command('mkdir')
7
+ .description('Create a new folder')
8
+ .argument('<path>', 'Folder name')
9
+ .option('--parent-id <id>', 'Parent folder ID')
10
+ .action(async (path, options) => {
11
+ try {
12
+ const profile = await getActiveProfile();
13
+ if (!profile) {
14
+ error('Not logged in. Run: cfpan login <endpoint>');
15
+ process.exit(1);
16
+ }
17
+ const client = new ApiClient(profile);
18
+ await createFolder(client, {
19
+ name: path,
20
+ parentId: options.parentId ?? null,
21
+ });
22
+ success(`Created folder: ${path}`);
23
+ }
24
+ catch (err) {
25
+ error(`Failed to create folder: ${err instanceof Error ? err.message : String(err)}`);
26
+ process.exit(1);
27
+ }
28
+ });
29
+ //# sourceMappingURL=mkdir.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mkdir.js","sourceRoot":"","sources":["../../src/commands/mkdir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CAAC,qBAAqB,CAAC;KAClC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;KACjC,MAAM,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;KAC9C,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,OAA8B,EAAE,EAAE;IAC7D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,gBAAgB,EAAE,CAAC;QACzC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,KAAK,CAAC,4CAA4C,CAAC,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC;QAEtC,MAAM,YAAY,CAAC,MAAM,EAAE;YACzB,IAAI,EAAE,IAAI;YACV,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI;SACnC,CAAC,CAAC;QAEH,OAAO,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,KAAK,CACH,4BAA4B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAC/E,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Command } from 'commander';
2
+ export declare const rmCommand: Command;
3
+ export declare const restoreCommand: Command;
4
+ //# sourceMappingURL=rm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rm.d.ts","sourceRoot":"","sources":["../../src/commands/rm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,eAAO,MAAM,SAAS,SAwCnB,CAAC;AAEJ,eAAO,MAAM,cAAc,SA2BvB,CAAC"}
@@ -0,0 +1,69 @@
1
+ import { Command } from 'commander';
2
+ import { ApiClient } from '../api/client.js';
3
+ import { getActiveProfile } from '../config.js';
4
+ import { deleteFile, deleteFolder, restoreFile, restoreFolder, } from '../api/files.js';
5
+ import { error, success, warn } from '../utils/format.js';
6
+ export const rmCommand = new Command('rm')
7
+ .description('Delete file or folder (move to trash)')
8
+ .argument('<id>', 'File or folder ID')
9
+ .option('-f, --folder', 'Target is a folder')
10
+ .option('--permanent', 'Permanently delete (cannot be restored)')
11
+ .action(async (id, options) => {
12
+ try {
13
+ const profile = await getActiveProfile();
14
+ if (!profile) {
15
+ error('Not logged in. Run: cfpan login <endpoint>');
16
+ process.exit(1);
17
+ }
18
+ const client = new ApiClient(profile);
19
+ if (options.permanent) {
20
+ warn('Permanent deletion is not yet implemented in CLI');
21
+ warn('Use the web interface for permanent deletion');
22
+ process.exit(1);
23
+ }
24
+ if (options.folder) {
25
+ await deleteFolder(client, id);
26
+ success('Folder moved to trash');
27
+ }
28
+ else {
29
+ const result = await deleteFile(client, id);
30
+ if (result.status === 'deleting') {
31
+ success('File deletion pending (large file cleanup in progress)');
32
+ }
33
+ else {
34
+ success('File moved to trash');
35
+ }
36
+ }
37
+ }
38
+ catch (err) {
39
+ error(`Delete failed: ${err instanceof Error ? err.message : String(err)}`);
40
+ process.exit(1);
41
+ }
42
+ });
43
+ export const restoreCommand = new Command('restore')
44
+ .description('Restore file or folder from trash')
45
+ .argument('<id>', 'File or folder ID')
46
+ .option('-f, --folder', 'Target is a folder')
47
+ .action(async (id, options) => {
48
+ try {
49
+ const profile = await getActiveProfile();
50
+ if (!profile) {
51
+ error('Not logged in. Run: cfpan login <endpoint>');
52
+ process.exit(1);
53
+ }
54
+ const client = new ApiClient(profile);
55
+ if (options.folder) {
56
+ await restoreFolder(client, id);
57
+ success('Folder restored');
58
+ }
59
+ else {
60
+ await restoreFile(client, id);
61
+ success('File restored');
62
+ }
63
+ }
64
+ catch (err) {
65
+ error(`Restore failed: ${err instanceof Error ? err.message : String(err)}`);
66
+ process.exit(1);
67
+ }
68
+ });
69
+ //# sourceMappingURL=rm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rm.js","sourceRoot":"","sources":["../../src/commands/rm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const shareCommand: Command;
3
+ //# sourceMappingURL=share.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"share.d.ts","sourceRoot":"","sources":["../../src/commands/share.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,YAAY,SAkFtB,CAAC"}
@@ -0,0 +1,64 @@
1
+ import { Command } from 'commander';
2
+ import { ApiClient } from '../api/client.js';
3
+ import { getActiveProfile } from '../config.js';
4
+ import { createFileShare, createFolderShare } from '../api/share.js';
5
+ import { error, success, info } from '../utils/format.js';
6
+ import chalk from 'chalk';
7
+ export const shareCommand = new Command('share')
8
+ .description('Create share link for file or folder')
9
+ .argument('<id>', 'File or folder ID')
10
+ .option('-f, --folder', 'Target is a folder')
11
+ .option('-c, --code <code>', 'Access code (6 digits, or "random")')
12
+ .option('-e, --expires <duration>', 'Expiration duration (1h, 5h, 24h, 3d, 7d, permanent)', 'permanent')
13
+ .action(async (id, options) => {
14
+ try {
15
+ const profile = await getActiveProfile();
16
+ if (!profile) {
17
+ error('Not logged in. Run: cfpan login <endpoint>');
18
+ process.exit(1);
19
+ }
20
+ const client = new ApiClient(profile);
21
+ const validExpiries = ['1h', '5h', '24h', '3d', '7d', 'permanent'];
22
+ if (!validExpiries.includes(options.expires)) {
23
+ error(`Invalid expiry duration. Must be one of: ${validExpiries.join(', ')}`);
24
+ process.exit(1);
25
+ }
26
+ const shareOptions = {
27
+ expiry: options.expires,
28
+ };
29
+ if (options.code) {
30
+ if (options.code === 'random') {
31
+ shareOptions.accessCode = 'random';
32
+ }
33
+ else if (/^\d{6}$/.test(options.code)) {
34
+ shareOptions.accessCode = options.code;
35
+ }
36
+ else {
37
+ error('Access code must be 6 digits or "random"');
38
+ process.exit(1);
39
+ }
40
+ }
41
+ const response = options.folder
42
+ ? await createFolderShare(client, id, shareOptions)
43
+ : await createFileShare(client, id, shareOptions);
44
+ console.log();
45
+ success('Share link created!');
46
+ console.log();
47
+ info(`URL: ${chalk.cyan(response.shareUrl)}`);
48
+ if (response.accessCode) {
49
+ info(`Access code: ${chalk.yellow(response.accessCode)}`);
50
+ }
51
+ if (response.expiresAt) {
52
+ info(`Expires: ${new Date(response.expiresAt).toLocaleString()}`);
53
+ }
54
+ else {
55
+ info('Expires: Never (permanent)');
56
+ }
57
+ console.log();
58
+ }
59
+ catch (err) {
60
+ error(`Share failed: ${err instanceof Error ? err.message : String(err)}`);
61
+ process.exit(1);
62
+ }
63
+ });
64
+ //# sourceMappingURL=share.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"share.js","sourceRoot":"","sources":["../../src/commands/share.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const uploadCommand: Command;
3
+ //# sourceMappingURL=upload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/commands/upload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,eAAO,MAAM,aAAa,SAgDvB,CAAC"}
@@ -0,0 +1,44 @@
1
+ import { Command } from 'commander';
2
+ import { ApiClient } from '../api/client.js';
3
+ import { getActiveProfile } from '../config.js';
4
+ import { uploadFile } from '../api/upload.js';
5
+ import { error, success } from '../utils/format.js';
6
+ import { createFileProgressBar } from '../utils/progress.js';
7
+ import { existsSync, statSync } from 'node:fs';
8
+ import { basename } from 'node:path';
9
+ export const uploadCommand = new Command('upload')
10
+ .description('Upload file to CFpan')
11
+ .argument('<local>', 'Local file path')
12
+ .argument('<remote>', 'Remote file path')
13
+ .option('--folder-id <id>', 'Target folder ID')
14
+ .action(async (local, remote, options) => {
15
+ try {
16
+ const profile = await getActiveProfile();
17
+ if (!profile) {
18
+ error('Not logged in. Run: cfpan login <endpoint>');
19
+ process.exit(1);
20
+ }
21
+ if (!existsSync(local)) {
22
+ error(`File not found: ${local}`);
23
+ process.exit(1);
24
+ }
25
+ const stats = statSync(local);
26
+ if (!stats.isFile()) {
27
+ error(`Not a file: ${local}`);
28
+ process.exit(1);
29
+ }
30
+ const client = new ApiClient(profile);
31
+ const fileName = basename(remote);
32
+ const progress = createFileProgressBar(fileName);
33
+ await uploadFile(client, local, fileName, options.folderId ?? null, (uploaded, total) => {
34
+ progress.update(uploaded, total);
35
+ });
36
+ progress.finish();
37
+ success(`Uploaded: ${fileName}`);
38
+ }
39
+ catch (err) {
40
+ error(`Upload failed: ${err instanceof Error ? err.message : String(err)}`);
41
+ process.exit(1);
42
+ }
43
+ });
44
+ //# sourceMappingURL=upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/commands/upload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,sBAAsB,CAAC;KACnC,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC;KACtC,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC;KACxC,MAAM,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;KAC9C,MAAM,CACL,KAAK,EAAE,KAAa,EAAE,MAAc,EAAE,OAA8B,EAAE,EAAE;IACtE,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,gBAAgB,EAAE,CAAC;QACzC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,KAAK,CAAC,4CAA4C,CAAC,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACvB,KAAK,CAAC,mBAAmB,KAAK,EAAE,CAAC,CAAC;YAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACpB,KAAK,CAAC,eAAe,KAAK,EAAE,CAAC,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,QAAQ,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;QAEjD,MAAM,UAAU,CACd,MAAM,EACN,KAAK,EACL,QAAQ,EACR,OAAO,CAAC,QAAQ,IAAI,IAAI,EACxB,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;YAClB,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACnC,CAAC,CACF,CAAC;QAEF,QAAQ,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,CAAC,aAAa,QAAQ,EAAE,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,KAAK,CACH,kBAAkB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACrE,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CACF,CAAC"}
@@ -0,0 +1,15 @@
1
+ export interface ProfileConfig {
2
+ endpoint: string;
3
+ token: string;
4
+ }
5
+ export interface Config {
6
+ profiles: Record<string, ProfileConfig>;
7
+ activeProfile: string;
8
+ }
9
+ export declare function ensureConfigDir(): Promise<void>;
10
+ export declare function loadConfig(): Promise<Config>;
11
+ export declare function saveConfig(config: Config): Promise<void>;
12
+ export declare function getActiveProfile(): Promise<ProfileConfig | null>;
13
+ export declare function setProfile(profileName: string, profile: ProfileConfig): Promise<void>;
14
+ export declare function removeProfile(profileName: string): Promise<void>;
15
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,MAAM;IACrB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACxC,aAAa,EAAE,MAAM,CAAC;CACvB;AAUD,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAIrD;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAalD;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG9D;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAGtE;AAED,wBAAsB,UAAU,CAC9B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUtE"}
package/dist/config.js ADDED
@@ -0,0 +1,52 @@
1
+ import { homedir } from 'node:os';
2
+ import { join } from 'node:path';
3
+ import { readFile, writeFile, mkdir } from 'node:fs/promises';
4
+ import { existsSync } from 'node:fs';
5
+ const CONFIG_DIR = join(homedir(), '.cfpan');
6
+ const CONFIG_FILE = join(CONFIG_DIR, 'config.json');
7
+ const DEFAULT_CONFIG = {
8
+ profiles: {},
9
+ activeProfile: 'default',
10
+ };
11
+ export async function ensureConfigDir() {
12
+ if (!existsSync(CONFIG_DIR)) {
13
+ await mkdir(CONFIG_DIR, { recursive: true });
14
+ }
15
+ }
16
+ export async function loadConfig() {
17
+ await ensureConfigDir();
18
+ if (!existsSync(CONFIG_FILE)) {
19
+ return DEFAULT_CONFIG;
20
+ }
21
+ try {
22
+ const content = await readFile(CONFIG_FILE, 'utf-8');
23
+ return JSON.parse(content);
24
+ }
25
+ catch {
26
+ return DEFAULT_CONFIG;
27
+ }
28
+ }
29
+ export async function saveConfig(config) {
30
+ await ensureConfigDir();
31
+ await writeFile(CONFIG_FILE, JSON.stringify(config, null, 2), 'utf-8');
32
+ }
33
+ export async function getActiveProfile() {
34
+ const config = await loadConfig();
35
+ return config.profiles[config.activeProfile] ?? null;
36
+ }
37
+ export async function setProfile(profileName, profile) {
38
+ const config = await loadConfig();
39
+ config.profiles[profileName] = profile;
40
+ config.activeProfile = profileName;
41
+ await saveConfig(config);
42
+ }
43
+ export async function removeProfile(profileName) {
44
+ const config = await loadConfig();
45
+ delete config.profiles[profileName];
46
+ if (config.activeProfile === profileName) {
47
+ const remaining = Object.keys(config.profiles);
48
+ config.activeProfile = remaining.length > 0 ? remaining[0] : 'default';
49
+ }
50
+ await saveConfig(config);
51
+ }
52
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAYrC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEpD,MAAM,cAAc,GAAW;IAC7B,QAAQ,EAAE,EAAE;IACZ,aAAa,EAAE,SAAS;CACzB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,eAAe,EAAE,CAAC;IAExB,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAW,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,cAAc,CAAC;IACxB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAc;IAC7C,MAAM,eAAe,EAAE,CAAC;IACxB,MAAM,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC;AACvD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,WAAmB,EACnB,OAAsB;IAEtB,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC;IACvC,MAAM,CAAC,aAAa,GAAG,WAAW,CAAC;IACnC,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,WAAmB;IACrD,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,OAAO,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAEpC,IAAI,MAAM,CAAC,aAAa,KAAK,WAAW,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,CAAC,aAAa,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1E,CAAC;IAED,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { loginCommand } from './commands/login.js';
4
+ import { logoutCommand } from './commands/logout.js';
5
+ import { lsCommand } from './commands/ls.js';
6
+ import { uploadCommand } from './commands/upload.js';
7
+ import { downloadCommand } from './commands/download.js';
8
+ import { mkdirCommand } from './commands/mkdir.js';
9
+ import { rmCommand, restoreCommand } from './commands/rm.js';
10
+ import { shareCommand } from './commands/share.js';
11
+ const program = new Command();
12
+ program
13
+ .name('cfpan')
14
+ .description('CLI tool for CFpan - self-hosted netdisk on Cloudflare Workers')
15
+ .version('0.1.0');
16
+ // Register commands
17
+ program.addCommand(loginCommand);
18
+ program.addCommand(logoutCommand);
19
+ program.addCommand(lsCommand);
20
+ program.addCommand(uploadCommand);
21
+ program.addCommand(downloadCommand);
22
+ program.addCommand(mkdirCommand);
23
+ program.addCommand(rmCommand);
24
+ program.addCommand(restoreCommand);
25
+ program.addCommand(shareCommand);
26
+ program.parse();
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,gEAAgE,CAAC;KAC7E,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,oBAAoB;AACpB,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;AAC9B,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;AAC9B,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AAEjC,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,10 @@
1
+ export declare function formatSize(bytes: number): string;
2
+ export declare function formatDate(dateString: string): string;
3
+ export declare function success(message: string): void;
4
+ export declare function error(message: string): void;
5
+ export declare function info(message: string): void;
6
+ export declare function warn(message: string): void;
7
+ export declare function table(headers: string[], rows: string[][], options?: {
8
+ padding?: number;
9
+ }): void;
10
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"AAEA,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMhD;AAED,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAkBrD;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED,wBAAgB,KAAK,CACnB,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,EAAE,MAAM,EAAE,EAAE,EAChB,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GACjC,IAAI,CA6BN"}