yx-oss-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,171 @@
1
+ /**
2
+ * OssService - 阿里云 OSS 操作服务
3
+ * 封装上传、删除、连接测试等操作
4
+ */
5
+ import OSS from 'ali-oss';
6
+ import pLimit from 'p-limit';
7
+ import { FileService, HTML_CACHE_HEADERS } from './file.service.js';
8
+ import { Logger } from '../utils/logger.js';
9
+ export class OssService {
10
+ client;
11
+ config;
12
+ constructor(config) {
13
+ this.config = config;
14
+ this.client = new OSS({
15
+ region: config.region,
16
+ accessKeyId: config.accessKeyId,
17
+ accessKeySecret: config.accessKeySecret,
18
+ bucket: config.bucket,
19
+ timeout: config.timeout,
20
+ });
21
+ }
22
+ /**
23
+ * 测试 OSS 连接
24
+ */
25
+ async testConnection() {
26
+ Logger.info('正在测试 OSS 连接...');
27
+ Logger.envCheck('系统时间', new Date().toISOString());
28
+ Logger.envCheck('Bucket', this.config.bucket);
29
+ Logger.envCheck('Region', this.config.region);
30
+ try {
31
+ const result = await this.client.getBucketInfo();
32
+ const bucketInfo = {
33
+ name: result.bucket.Name,
34
+ region: result.bucket.Location,
35
+ creationDate: result.bucket.CreationDate,
36
+ };
37
+ Logger.success('OSS 连接成功');
38
+ Logger.info(`Bucket 名称: ${bucketInfo.name}`);
39
+ Logger.info(`区域: ${bucketInfo.region}`);
40
+ Logger.info(`创建时间: ${bucketInfo.creationDate}`);
41
+ return bucketInfo;
42
+ }
43
+ catch (error) {
44
+ const err = error;
45
+ Logger.errorWithSuggestions(`OSS 连接失败: ${err.message}`, [
46
+ 'AccessKey ID/Secret 配置错误',
47
+ `Bucket 区域配置错误 (当前: ${this.config.region})`,
48
+ '系统时间与网络时间不同步',
49
+ '网络连接问题',
50
+ ], '请检查凭证配置和网络连接');
51
+ throw error;
52
+ }
53
+ }
54
+ /**
55
+ * 上传单个文件
56
+ */
57
+ async uploadFile(localPath, ossPath, headers) {
58
+ const options = headers ? { headers } : undefined;
59
+ await this.client.put(ossPath, localPath, options);
60
+ }
61
+ /**
62
+ * 上传目录
63
+ */
64
+ async uploadDirectory(localDir, ossDir, options) {
65
+ const files = await FileService.walkDirectory(localDir, options.ignorePatterns);
66
+ const limit = pLimit(options.concurrency);
67
+ let success = 0;
68
+ let failed = 0;
69
+ const uploadedFiles = [];
70
+ Logger.info(`找到 ${files.length} 个文件待上传`);
71
+ const tasks = files.map((file) => limit(async () => {
72
+ const ossPath = `${ossDir}/${file.relativePath}`;
73
+ try {
74
+ const headers = file.isHtml ? HTML_CACHE_HEADERS : undefined;
75
+ await this.uploadFile(file.path, ossPath, headers);
76
+ success++;
77
+ uploadedFiles.push(ossPath);
78
+ Logger.upload(`上传: ${ossPath}`);
79
+ }
80
+ catch (error) {
81
+ failed++;
82
+ const err = error;
83
+ Logger.error(`上传失败: ${ossPath} - ${err.message}`);
84
+ }
85
+ }));
86
+ await Promise.all(tasks);
87
+ return {
88
+ success,
89
+ failed,
90
+ files: uploadedFiles,
91
+ };
92
+ }
93
+ /**
94
+ * 列出指定前缀的所有文件
95
+ */
96
+ async listFiles(prefix) {
97
+ const files = [];
98
+ let marker;
99
+ do {
100
+ const result = await this.client.list({
101
+ prefix: prefix + '/',
102
+ 'max-keys': 1000,
103
+ marker,
104
+ }, {});
105
+ if (result.objects) {
106
+ files.push(...result.objects.map((obj) => obj.name));
107
+ }
108
+ marker = result.nextMarker;
109
+ } while (marker);
110
+ return files;
111
+ }
112
+ /**
113
+ * 删除目录下的所有文件
114
+ */
115
+ async deleteDirectory(ossDir) {
116
+ Logger.delete(`开始删除 OSS 目录: ${ossDir}`);
117
+ try {
118
+ const files = await this.listFiles(ossDir);
119
+ Logger.info(`找到 ${files.length} 个文件`);
120
+ if (files.length === 0) {
121
+ Logger.info('目录为空,无需删除');
122
+ return { success: true, deletedCount: 0 };
123
+ }
124
+ let deletedCount = 0;
125
+ for (const file of files) {
126
+ try {
127
+ await this.client.delete(file);
128
+ deletedCount++;
129
+ Logger.delete(`删除: ${file}`);
130
+ }
131
+ catch (error) {
132
+ const err = error;
133
+ Logger.error(`删除失败: ${file} - ${err.message}`);
134
+ }
135
+ }
136
+ Logger.success(`已删除 ${deletedCount} 个文件`);
137
+ return { success: true, deletedCount };
138
+ }
139
+ catch (error) {
140
+ const err = error;
141
+ Logger.errorWithSuggestions(`删除操作失败: ${err.message}`, [
142
+ 'AccessKey ID/Secret 配置错误',
143
+ 'Bucket 区域配置错误',
144
+ '系统时间与网络时间不同步',
145
+ '网络连接问题',
146
+ ]);
147
+ return { success: false, deletedCount: 0, error: err.message };
148
+ }
149
+ }
150
+ /**
151
+ * 同步目录(先删除再上传)
152
+ */
153
+ async syncDirectory(localDir, ossDir, options) {
154
+ Logger.title(`同步目录: ${localDir} -> ${ossDir}`);
155
+ // 先删除旧文件
156
+ Logger.info('步骤 1/2: 删除旧文件...');
157
+ const deleteResult = await this.deleteDirectory(ossDir);
158
+ if (!deleteResult.success) {
159
+ throw new Error(`删除操作失败: ${deleteResult.error}`);
160
+ }
161
+ // 再上传新文件
162
+ Logger.info('步骤 2/2: 上传新文件...');
163
+ const uploadResult = await this.uploadDirectory(localDir, ossDir, options);
164
+ Logger.separator();
165
+ Logger.success('同步完成!');
166
+ Logger.info(`删除: ${deleteResult.deletedCount} 个文件`);
167
+ Logger.info(`上传: ${uploadResult.success} 成功, ${uploadResult.failed} 失败`);
168
+ return { deleteResult, uploadResult };
169
+ }
170
+ }
171
+ //# sourceMappingURL=oss.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oss.service.js","sourceRoot":"","sources":["../../src/services/oss.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Logger - 统一的日志输出工具
3
+ * 使用 emoji 美化输出,支持进度显示
4
+ */
5
+ export declare class Logger {
6
+ /**
7
+ * 普通信息
8
+ */
9
+ static info(message: string): void;
10
+ /**
11
+ * 成功信息
12
+ */
13
+ static success(message: string): void;
14
+ /**
15
+ * 错误信息
16
+ */
17
+ static error(message: string): void;
18
+ /**
19
+ * 警告信息
20
+ */
21
+ static warn(message: string): void;
22
+ /**
23
+ * 上传信息
24
+ */
25
+ static upload(message: string): void;
26
+ /**
27
+ * 删除信息
28
+ */
29
+ static delete(message: string): void;
30
+ /**
31
+ * 进度显示
32
+ */
33
+ static progress(current: number, total: number, message?: string): void;
34
+ /**
35
+ * 显示详细错误信息和排查建议
36
+ */
37
+ static errorWithSuggestions(message: string, reasons: string[], solution?: string): void;
38
+ /**
39
+ * 显示环境检查信息
40
+ */
41
+ static envCheck(label: string, value: string | undefined, masked?: boolean): void;
42
+ /**
43
+ * 显示分隔线
44
+ */
45
+ static separator(): void;
46
+ /**
47
+ * 显示标题
48
+ */
49
+ static title(message: string): void;
50
+ /**
51
+ * 显示完成信息
52
+ */
53
+ static done(successCount: number, failCount: number): void;
54
+ }
55
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,qBAAa,MAAM;IACf;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIlC;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIrC;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAInC;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIlC;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIpC;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIpC;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IASvE;;OAEG;IACH,MAAM,CAAC,oBAAoB,CACvB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EAAE,EACjB,QAAQ,CAAC,EAAE,MAAM,GAClB,IAAI;IAcP;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,UAAQ,GAAG,IAAI;IAW/E;;OAEG;IACH,MAAM,CAAC,SAAS,IAAI,IAAI;IAIxB;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKnC;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;CAG7D"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Logger - 统一的日志输出工具
3
+ * 使用 emoji 美化输出,支持进度显示
4
+ */
5
+ export class Logger {
6
+ /**
7
+ * 普通信息
8
+ */
9
+ static info(message) {
10
+ console.log(`🔍 ${message}`);
11
+ }
12
+ /**
13
+ * 成功信息
14
+ */
15
+ static success(message) {
16
+ console.log(`✅ ${message}`);
17
+ }
18
+ /**
19
+ * 错误信息
20
+ */
21
+ static error(message) {
22
+ console.error(`❌ ${message}`);
23
+ }
24
+ /**
25
+ * 警告信息
26
+ */
27
+ static warn(message) {
28
+ console.warn(`⚠️ ${message}`);
29
+ }
30
+ /**
31
+ * 上传信息
32
+ */
33
+ static upload(message) {
34
+ console.log(`📤 ${message}`);
35
+ }
36
+ /**
37
+ * 删除信息
38
+ */
39
+ static delete(message) {
40
+ console.log(`🗑️ ${message}`);
41
+ }
42
+ /**
43
+ * 进度显示
44
+ */
45
+ static progress(current, total, message) {
46
+ const percent = Math.round((current / total) * 100);
47
+ const msg = message ? ` - ${message}` : '';
48
+ process.stdout.write(`\r📊 进度: ${current}/${total} (${percent}%)${msg}`);
49
+ if (current === total) {
50
+ console.log(); // 换行
51
+ }
52
+ }
53
+ /**
54
+ * 显示详细错误信息和排查建议
55
+ */
56
+ static errorWithSuggestions(message, reasons, solution) {
57
+ console.error(`\n❌ 错误: ${message}`);
58
+ if (reasons.length > 0) {
59
+ console.error('🔧 可能的原因:');
60
+ reasons.forEach((reason, index) => {
61
+ console.error(` ${index + 1}. ${reason}`);
62
+ });
63
+ }
64
+ if (solution) {
65
+ console.error(`📋 解决方案: ${solution}`);
66
+ }
67
+ console.error();
68
+ }
69
+ /**
70
+ * 显示环境检查信息
71
+ */
72
+ static envCheck(label, value, masked = false) {
73
+ if (value) {
74
+ const displayValue = masked
75
+ ? value.substring(0, 4) + '...' + value.substring(value.length - 4)
76
+ : value;
77
+ console.log(` ${label}: ${displayValue}`);
78
+ }
79
+ else {
80
+ console.log(` ${label}: 未设置`);
81
+ }
82
+ }
83
+ /**
84
+ * 显示分隔线
85
+ */
86
+ static separator() {
87
+ console.log('─'.repeat(50));
88
+ }
89
+ /**
90
+ * 显示标题
91
+ */
92
+ static title(message) {
93
+ console.log(`\n🎯 ${message}`);
94
+ this.separator();
95
+ }
96
+ /**
97
+ * 显示完成信息
98
+ */
99
+ static done(successCount, failCount) {
100
+ console.log(`\n🎉 完成!成功 ${successCount} 个,失败 ${failCount} 个`);
101
+ }
102
+ }
103
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "yx-oss-cli",
3
+ "version": "1.0.0",
4
+ "description": "阿里云 OSS 命令行工具,支持文件上传、删除、同步等操作",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "bin": {
9
+ "oss-cli": "./dist/bin/oss-cli.js"
10
+ },
11
+ "scripts": {
12
+ "build": "tsc",
13
+ "dev": "tsc --watch",
14
+ "test": "vitest run",
15
+ "test:watch": "vitest",
16
+ "lint": "tsc --noEmit"
17
+ },
18
+ "keywords": [
19
+ "oss",
20
+ "aliyun",
21
+ "cli",
22
+ "upload",
23
+ "deploy"
24
+ ],
25
+ "author": "",
26
+ "license": "MIT",
27
+ "dependencies": {
28
+ "ali-oss": "^6.21.0",
29
+ "commander": "^12.1.0",
30
+ "p-limit": "^6.1.0"
31
+ },
32
+ "devDependencies": {
33
+ "@types/node": "^22.10.0",
34
+ "fast-check": "^3.23.0",
35
+ "typescript": "^5.7.0",
36
+ "vitest": "^2.1.0"
37
+ },
38
+ "engines": {
39
+ "node": ">=18.0.0"
40
+ },
41
+ "files": [
42
+ "dist"
43
+ ]
44
+ }