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.
- package/README.md +255 -0
- package/dist/api.d.ts +115 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +176 -0
- package/dist/api.js.map +1 -0
- package/dist/bin/oss-cli.d.ts +7 -0
- package/dist/bin/oss-cli.d.ts.map +1 -0
- package/dist/bin/oss-cli.js +178 -0
- package/dist/bin/oss-cli.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/services/config.service.d.ts +56 -0
- package/dist/services/config.service.d.ts.map +1 -0
- package/dist/services/config.service.js +115 -0
- package/dist/services/config.service.js.map +1 -0
- package/dist/services/file.service.d.ts +46 -0
- package/dist/services/file.service.d.ts.map +1 -0
- package/dist/services/file.service.js +94 -0
- package/dist/services/file.service.js.map +1 -0
- package/dist/services/oss.service.d.ts +53 -0
- package/dist/services/oss.service.d.ts.map +1 -0
- package/dist/services/oss.service.js +171 -0
- package/dist/services/oss.service.js.map +1 -0
- package/dist/utils/logger.d.ts +55 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +103 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* OSS CLI - 阿里云 OSS 命令行工具
|
|
4
|
+
* 支持文件上传、删除、同步等操作
|
|
5
|
+
*/
|
|
6
|
+
import { Command } from 'commander';
|
|
7
|
+
import { ConfigService } from '../services/config.service.js';
|
|
8
|
+
import { OssService } from '../services/oss.service.js';
|
|
9
|
+
import { FileService } from '../services/file.service.js';
|
|
10
|
+
import { Logger } from '../utils/logger.js';
|
|
11
|
+
const program = new Command();
|
|
12
|
+
program
|
|
13
|
+
.name('oss-cli')
|
|
14
|
+
.description('阿里云 OSS 命令行工具')
|
|
15
|
+
.version('1.0.0');
|
|
16
|
+
// 全局选项
|
|
17
|
+
program
|
|
18
|
+
.option('--access-key-id <id>', 'AccessKey ID')
|
|
19
|
+
.option('--access-key-secret <secret>', 'AccessKey Secret')
|
|
20
|
+
.option('--bucket <name>', 'Bucket 名称')
|
|
21
|
+
.option('--region <region>', '区域', 'oss-cn-shanghai')
|
|
22
|
+
.option('--concurrency <n>', '并发数', '10');
|
|
23
|
+
/**
|
|
24
|
+
* test 命令 - 测试 OSS 连接
|
|
25
|
+
*/
|
|
26
|
+
program
|
|
27
|
+
.command('test')
|
|
28
|
+
.description('测试 OSS 连接')
|
|
29
|
+
.action(async () => {
|
|
30
|
+
try {
|
|
31
|
+
const opts = program.opts();
|
|
32
|
+
const ossConfig = ConfigService.getOssConfig({
|
|
33
|
+
accessKeyId: opts.accessKeyId,
|
|
34
|
+
accessKeySecret: opts.accessKeySecret,
|
|
35
|
+
bucket: opts.bucket,
|
|
36
|
+
region: opts.region,
|
|
37
|
+
});
|
|
38
|
+
const validation = ConfigService.validateConfig(ossConfig);
|
|
39
|
+
if (!validation.valid) {
|
|
40
|
+
validation.errors.forEach((err) => Logger.error(err));
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
const ossService = new OssService(ossConfig);
|
|
44
|
+
await ossService.testConnection();
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
/**
|
|
51
|
+
* sync 命令 - 同步目录(先删除再上传)
|
|
52
|
+
*/
|
|
53
|
+
program
|
|
54
|
+
.command('sync <localPath> <ossPath>')
|
|
55
|
+
.description('同步本地目录到 OSS(先删除目标目录,再上传)')
|
|
56
|
+
.action(async (localPath, ossPath) => {
|
|
57
|
+
try {
|
|
58
|
+
const opts = program.opts();
|
|
59
|
+
const ossConfig = ConfigService.getOssConfig({
|
|
60
|
+
accessKeyId: opts.accessKeyId,
|
|
61
|
+
accessKeySecret: opts.accessKeySecret,
|
|
62
|
+
bucket: opts.bucket,
|
|
63
|
+
region: opts.region,
|
|
64
|
+
});
|
|
65
|
+
const validation = ConfigService.validateConfig(ossConfig);
|
|
66
|
+
if (!validation.valid) {
|
|
67
|
+
validation.errors.forEach((err) => Logger.error(err));
|
|
68
|
+
process.exit(1);
|
|
69
|
+
}
|
|
70
|
+
// 检查本地路径是否存在
|
|
71
|
+
if (!(await FileService.exists(localPath))) {
|
|
72
|
+
Logger.error(`本地路径不存在: ${localPath}`);
|
|
73
|
+
process.exit(1);
|
|
74
|
+
}
|
|
75
|
+
if (!(await FileService.isDirectory(localPath))) {
|
|
76
|
+
Logger.error(`本地路径不是目录: ${localPath}`);
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
const cliOptions = ConfigService.getCliOptions({
|
|
80
|
+
concurrency: parseInt(opts.concurrency, 10),
|
|
81
|
+
});
|
|
82
|
+
const ossService = new OssService(ossConfig);
|
|
83
|
+
const result = await ossService.syncDirectory(localPath, ossPath, cliOptions);
|
|
84
|
+
if (result.uploadResult.failed > 0) {
|
|
85
|
+
process.exit(1);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
const err = error;
|
|
90
|
+
Logger.error(err.message);
|
|
91
|
+
process.exit(1);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
/**
|
|
95
|
+
* upload 命令 - 上传文件或目录
|
|
96
|
+
*/
|
|
97
|
+
program
|
|
98
|
+
.command('upload <localPath> <ossPath>')
|
|
99
|
+
.description('上传本地文件或目录到 OSS')
|
|
100
|
+
.action(async (localPath, ossPath) => {
|
|
101
|
+
try {
|
|
102
|
+
const opts = program.opts();
|
|
103
|
+
const ossConfig = ConfigService.getOssConfig({
|
|
104
|
+
accessKeyId: opts.accessKeyId,
|
|
105
|
+
accessKeySecret: opts.accessKeySecret,
|
|
106
|
+
bucket: opts.bucket,
|
|
107
|
+
region: opts.region,
|
|
108
|
+
});
|
|
109
|
+
const validation = ConfigService.validateConfig(ossConfig);
|
|
110
|
+
if (!validation.valid) {
|
|
111
|
+
validation.errors.forEach((err) => Logger.error(err));
|
|
112
|
+
process.exit(1);
|
|
113
|
+
}
|
|
114
|
+
// 检查本地路径是否存在
|
|
115
|
+
if (!(await FileService.exists(localPath))) {
|
|
116
|
+
Logger.error(`本地路径不存在: ${localPath}`);
|
|
117
|
+
process.exit(1);
|
|
118
|
+
}
|
|
119
|
+
const cliOptions = ConfigService.getCliOptions({
|
|
120
|
+
concurrency: parseInt(opts.concurrency, 10),
|
|
121
|
+
});
|
|
122
|
+
const ossService = new OssService(ossConfig);
|
|
123
|
+
if (await FileService.isDirectory(localPath)) {
|
|
124
|
+
Logger.title(`上传目录: ${localPath} -> ${ossPath}`);
|
|
125
|
+
const result = await ossService.uploadDirectory(localPath, ossPath, cliOptions);
|
|
126
|
+
Logger.done(result.success, result.failed);
|
|
127
|
+
if (result.failed > 0) {
|
|
128
|
+
process.exit(1);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
Logger.title(`上传文件: ${localPath} -> ${ossPath}`);
|
|
133
|
+
const headers = FileService.getUploadHeaders(localPath);
|
|
134
|
+
await ossService.uploadFile(localPath, ossPath, headers);
|
|
135
|
+
Logger.success('上传完成');
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
const err = error;
|
|
140
|
+
Logger.error(err.message);
|
|
141
|
+
process.exit(1);
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
/**
|
|
145
|
+
* delete 命令 - 删除 OSS 路径
|
|
146
|
+
*/
|
|
147
|
+
program
|
|
148
|
+
.command('delete <ossPath>')
|
|
149
|
+
.description('删除 OSS 路径下的所有文件')
|
|
150
|
+
.action(async (ossPath) => {
|
|
151
|
+
try {
|
|
152
|
+
const opts = program.opts();
|
|
153
|
+
const ossConfig = ConfigService.getOssConfig({
|
|
154
|
+
accessKeyId: opts.accessKeyId,
|
|
155
|
+
accessKeySecret: opts.accessKeySecret,
|
|
156
|
+
bucket: opts.bucket,
|
|
157
|
+
region: opts.region,
|
|
158
|
+
});
|
|
159
|
+
const validation = ConfigService.validateConfig(ossConfig);
|
|
160
|
+
if (!validation.valid) {
|
|
161
|
+
validation.errors.forEach((err) => Logger.error(err));
|
|
162
|
+
process.exit(1);
|
|
163
|
+
}
|
|
164
|
+
const ossService = new OssService(ossConfig);
|
|
165
|
+
Logger.title(`删除 OSS 路径: ${ossPath}`);
|
|
166
|
+
const result = await ossService.deleteDirectory(ossPath);
|
|
167
|
+
if (!result.success) {
|
|
168
|
+
process.exit(1);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
const err = error;
|
|
173
|
+
Logger.error(err.message);
|
|
174
|
+
process.exit(1);
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
program.parse();
|
|
178
|
+
//# sourceMappingURL=oss-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oss-cli.js","sourceRoot":"","sources":["../../src/bin/oss-cli.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OSS CLI - 阿里云 OSS 命令行工具
|
|
3
|
+
* 导出所有服务和工具类,支持编程方式使用
|
|
4
|
+
*/
|
|
5
|
+
export { syncToOss, uploadToOss, deleteFromOss, testOssConnection } from './api.js';
|
|
6
|
+
export type { SyncOptions, SyncResult, UploadToOssResult } from './api.js';
|
|
7
|
+
export { ConfigService } from './services/config.service.js';
|
|
8
|
+
export type { OssConfig, CliOptions, ValidationResult } from './services/config.service.js';
|
|
9
|
+
export { FileService, HTML_CACHE_HEADERS, DEFAULT_IGNORE_PATTERNS } from './services/file.service.js';
|
|
10
|
+
export type { FileInfo } from './services/file.service.js';
|
|
11
|
+
export { OssService } from './services/oss.service.js';
|
|
12
|
+
export type { UploadResult, DeleteResult, BucketInfo } from './services/oss.service.js';
|
|
13
|
+
export { Logger } from './utils/logger.js';
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AACpF,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAG3E,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAE5F,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACtG,YAAY,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAE3D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAExF,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OSS CLI - 阿里云 OSS 命令行工具
|
|
3
|
+
* 导出所有服务和工具类,支持编程方式使用
|
|
4
|
+
*/
|
|
5
|
+
// 简化 API(推荐使用)
|
|
6
|
+
export { syncToOss, uploadToOss, deleteFromOss, testOssConnection } from './api.js';
|
|
7
|
+
// 底层服务(高级用法)
|
|
8
|
+
export { ConfigService } from './services/config.service.js';
|
|
9
|
+
export { FileService, HTML_CACHE_HEADERS, DEFAULT_IGNORE_PATTERNS } from './services/file.service.js';
|
|
10
|
+
export { OssService } from './services/oss.service.js';
|
|
11
|
+
export { Logger } from './utils/logger.js';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAe;AACf,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAGpF,aAAa;AACb,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAG7D,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAGtG,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAGvD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ConfigService - 配置管理服务
|
|
3
|
+
* 负责合并命令行参数和环境变量,验证配置完整性
|
|
4
|
+
*/
|
|
5
|
+
export interface OssConfig {
|
|
6
|
+
accessKeyId: string;
|
|
7
|
+
accessKeySecret: string;
|
|
8
|
+
bucket: string;
|
|
9
|
+
region: string;
|
|
10
|
+
timeout: number;
|
|
11
|
+
}
|
|
12
|
+
export interface CliOptions {
|
|
13
|
+
concurrency: number;
|
|
14
|
+
ignorePatterns: RegExp[];
|
|
15
|
+
}
|
|
16
|
+
export interface ValidationResult {
|
|
17
|
+
valid: boolean;
|
|
18
|
+
errors: string[];
|
|
19
|
+
}
|
|
20
|
+
export declare class ConfigService {
|
|
21
|
+
/**
|
|
22
|
+
* 从命令行和环境变量获取 OSS 配置
|
|
23
|
+
* 优先级:命令行参数 > 环境变量 > 默认值
|
|
24
|
+
*/
|
|
25
|
+
static getOssConfig(cliOptions?: Partial<OssConfig>): OssConfig;
|
|
26
|
+
/**
|
|
27
|
+
* 从环境变量读取配置
|
|
28
|
+
*/
|
|
29
|
+
private static getEnvConfig;
|
|
30
|
+
/**
|
|
31
|
+
* 获取 CLI 选项
|
|
32
|
+
*/
|
|
33
|
+
static getCliOptions(options?: Partial<CliOptions>): CliOptions;
|
|
34
|
+
/**
|
|
35
|
+
* 解析环境(从分支名或直接指定)
|
|
36
|
+
*/
|
|
37
|
+
static resolveEnvironment(branch?: string, env?: string, customMapping?: Record<string, string>): string;
|
|
38
|
+
/**
|
|
39
|
+
* 验证配置完整性
|
|
40
|
+
*/
|
|
41
|
+
static validateConfig(config: OssConfig): ValidationResult;
|
|
42
|
+
/**
|
|
43
|
+
* 获取预定义的分支环境映射
|
|
44
|
+
*/
|
|
45
|
+
static getBranchEnvMap(): Record<string, string>;
|
|
46
|
+
/**
|
|
47
|
+
* 获取默认配置
|
|
48
|
+
*/
|
|
49
|
+
static getDefaults(): {
|
|
50
|
+
bucket: string;
|
|
51
|
+
region: string;
|
|
52
|
+
concurrency: number;
|
|
53
|
+
timeout: number;
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=config.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.service.d.ts","sourceRoot":"","sources":["../../src/services/config.service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,SAAS;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CACpB;AA+BD,qBAAa,aAAa;IACtB;;;OAGG;IACH,MAAM,CAAC,YAAY,CAAC,UAAU,GAAE,OAAO,CAAC,SAAS,CAAM,GAAG,SAAS;IAYnE;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,YAAY;IAa3B;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,OAAO,GAAE,OAAO,CAAC,UAAU,CAAM,GAAG,UAAU;IAOnE;;OAEG;IACH,MAAM,CAAC,kBAAkB,CACrB,MAAM,CAAC,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,MAAM,EACZ,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACvC,MAAM;IAoBT;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,gBAAgB;IAmB1D;;OAEG;IACH,MAAM,CAAC,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAIhD;;OAEG;IACH,MAAM,CAAC,WAAW;;;;;;CAGrB"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ConfigService - 配置管理服务
|
|
3
|
+
* 负责合并命令行参数和环境变量,验证配置完整性
|
|
4
|
+
*/
|
|
5
|
+
// 环境变量映射
|
|
6
|
+
const ENV_VARS = {
|
|
7
|
+
OSS_ACCESS_KEY_ID: 'accessKeyId',
|
|
8
|
+
OSS_ACCESS_KEY_SECRET: 'accessKeySecret',
|
|
9
|
+
OSS_BUCKET: 'bucket',
|
|
10
|
+
OSS_REGION: 'region',
|
|
11
|
+
};
|
|
12
|
+
// 默认配置
|
|
13
|
+
const DEFAULTS = {
|
|
14
|
+
bucket: 'czxvasfile',
|
|
15
|
+
region: 'oss-cn-shanghai',
|
|
16
|
+
concurrency: 10,
|
|
17
|
+
timeout: 60000,
|
|
18
|
+
};
|
|
19
|
+
// 默认忽略模式
|
|
20
|
+
const DEFAULT_IGNORE_PATTERNS = [/\.DS_Store$/i, /\.map$/i];
|
|
21
|
+
// 分支到环境映射
|
|
22
|
+
const BRANCH_ENV_MAP = {
|
|
23
|
+
develop: 'test',
|
|
24
|
+
pre: 'pre',
|
|
25
|
+
test: 'test',
|
|
26
|
+
uat: 'pre',
|
|
27
|
+
master: 'prod',
|
|
28
|
+
'master-next': 'prod',
|
|
29
|
+
};
|
|
30
|
+
export class ConfigService {
|
|
31
|
+
/**
|
|
32
|
+
* 从命令行和环境变量获取 OSS 配置
|
|
33
|
+
* 优先级:命令行参数 > 环境变量 > 默认值
|
|
34
|
+
*/
|
|
35
|
+
static getOssConfig(cliOptions = {}) {
|
|
36
|
+
const envConfig = this.getEnvConfig();
|
|
37
|
+
return {
|
|
38
|
+
accessKeyId: cliOptions.accessKeyId ?? envConfig.accessKeyId ?? '',
|
|
39
|
+
accessKeySecret: cliOptions.accessKeySecret ?? envConfig.accessKeySecret ?? '',
|
|
40
|
+
bucket: cliOptions.bucket ?? envConfig.bucket ?? DEFAULTS.bucket,
|
|
41
|
+
region: cliOptions.region ?? envConfig.region ?? DEFAULTS.region,
|
|
42
|
+
timeout: cliOptions.timeout ?? DEFAULTS.timeout,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* 从环境变量读取配置
|
|
47
|
+
*/
|
|
48
|
+
static getEnvConfig() {
|
|
49
|
+
const config = {};
|
|
50
|
+
for (const [envKey, configKey] of Object.entries(ENV_VARS)) {
|
|
51
|
+
const value = process.env[envKey];
|
|
52
|
+
if (value) {
|
|
53
|
+
config[configKey] = value;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return config;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* 获取 CLI 选项
|
|
60
|
+
*/
|
|
61
|
+
static getCliOptions(options = {}) {
|
|
62
|
+
return {
|
|
63
|
+
concurrency: options.concurrency ?? DEFAULTS.concurrency,
|
|
64
|
+
ignorePatterns: options.ignorePatterns ?? DEFAULT_IGNORE_PATTERNS,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* 解析环境(从分支名或直接指定)
|
|
69
|
+
*/
|
|
70
|
+
static resolveEnvironment(branch, env, customMapping) {
|
|
71
|
+
// 直接指定环境优先
|
|
72
|
+
if (env) {
|
|
73
|
+
return env;
|
|
74
|
+
}
|
|
75
|
+
// 使用自定义映射
|
|
76
|
+
if (branch && customMapping && customMapping[branch]) {
|
|
77
|
+
return customMapping[branch];
|
|
78
|
+
}
|
|
79
|
+
// 使用预定义映射
|
|
80
|
+
if (branch && BRANCH_ENV_MAP[branch]) {
|
|
81
|
+
return BRANCH_ENV_MAP[branch];
|
|
82
|
+
}
|
|
83
|
+
// 默认返回 test
|
|
84
|
+
return 'test';
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* 验证配置完整性
|
|
88
|
+
*/
|
|
89
|
+
static validateConfig(config) {
|
|
90
|
+
const errors = [];
|
|
91
|
+
if (!config.accessKeyId) {
|
|
92
|
+
errors.push('请指定 AccessKey ID: --access-key-id=xxx 或设置环境变量 OSS_ACCESS_KEY_ID');
|
|
93
|
+
}
|
|
94
|
+
if (!config.accessKeySecret) {
|
|
95
|
+
errors.push('请指定 AccessKey Secret: --access-key-secret=xxx 或设置环境变量 OSS_ACCESS_KEY_SECRET');
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
valid: errors.length === 0,
|
|
99
|
+
errors,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* 获取预定义的分支环境映射
|
|
104
|
+
*/
|
|
105
|
+
static getBranchEnvMap() {
|
|
106
|
+
return { ...BRANCH_ENV_MAP };
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* 获取默认配置
|
|
110
|
+
*/
|
|
111
|
+
static getDefaults() {
|
|
112
|
+
return { ...DEFAULTS };
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=config.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.service.js","sourceRoot":"","sources":["../../src/services/config.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FileService - 本地文件操作服务
|
|
3
|
+
* 负责文件遍历、忽略模式匹配、MIME 类型检测
|
|
4
|
+
*/
|
|
5
|
+
export interface FileInfo {
|
|
6
|
+
path: string;
|
|
7
|
+
relativePath: string;
|
|
8
|
+
isHtml: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare const HTML_CACHE_HEADERS: {
|
|
11
|
+
'Cache-Control': string;
|
|
12
|
+
Pragma: string;
|
|
13
|
+
Expires: string;
|
|
14
|
+
};
|
|
15
|
+
export declare const DEFAULT_IGNORE_PATTERNS: RegExp[];
|
|
16
|
+
export declare class FileService {
|
|
17
|
+
/**
|
|
18
|
+
* 检查文件是否应该被忽略
|
|
19
|
+
*/
|
|
20
|
+
static shouldIgnore(filename: string, patterns: RegExp[]): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* 检查文件是否为 HTML 文件(不区分大小写)
|
|
23
|
+
*/
|
|
24
|
+
static isHtmlFile(filename: string): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* 获取 HTML 文件的上传选项(缓存控制头)
|
|
27
|
+
*/
|
|
28
|
+
static getUploadHeaders(filename: string): Record<string, string> | undefined;
|
|
29
|
+
/**
|
|
30
|
+
* 递归遍历目录,获取所有文件
|
|
31
|
+
*/
|
|
32
|
+
static walkDirectory(dir: string, ignorePatterns?: RegExp[]): Promise<FileInfo[]>;
|
|
33
|
+
/**
|
|
34
|
+
* 递归遍历目录的内部实现
|
|
35
|
+
*/
|
|
36
|
+
private static walkDirectoryRecursive;
|
|
37
|
+
/**
|
|
38
|
+
* 检查路径是否存在
|
|
39
|
+
*/
|
|
40
|
+
static exists(filePath: string): Promise<boolean>;
|
|
41
|
+
/**
|
|
42
|
+
* 检查路径是否为目录
|
|
43
|
+
*/
|
|
44
|
+
static isDirectory(filePath: string): Promise<boolean>;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=file.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file.service.d.ts","sourceRoot":"","sources":["../../src/services/file.service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,QAAQ;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;CACnB;AAGD,eAAO,MAAM,kBAAkB;;;;CAI9B,CAAC;AAGF,eAAO,MAAM,uBAAuB,UAA8B,CAAC;AAEnE,qBAAa,WAAW;IACpB;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO;IAIlE;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAI5C;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS;IAO7E;;OAEG;WACU,aAAa,CACtB,GAAG,EAAE,MAAM,EACX,cAAc,GAAE,MAAM,EAA4B,GACnD,OAAO,CAAC,QAAQ,EAAE,CAAC;IAMtB;;OAEG;mBACkB,sBAAsB;IA4B3C;;OAEG;WACU,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASvD;;OAEG;WACU,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAQ/D"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FileService - 本地文件操作服务
|
|
3
|
+
* 负责文件遍历、忽略模式匹配、MIME 类型检测
|
|
4
|
+
*/
|
|
5
|
+
import fs from 'fs/promises';
|
|
6
|
+
import path from 'path';
|
|
7
|
+
// HTML 文件的缓存控制头
|
|
8
|
+
export const HTML_CACHE_HEADERS = {
|
|
9
|
+
'Cache-Control': 'no-cache, no-store, must-revalidate',
|
|
10
|
+
Pragma: 'no-cache',
|
|
11
|
+
Expires: '0',
|
|
12
|
+
};
|
|
13
|
+
// 默认忽略模式
|
|
14
|
+
export const DEFAULT_IGNORE_PATTERNS = [/\.DS_Store$/i, /\.map$/i];
|
|
15
|
+
export class FileService {
|
|
16
|
+
/**
|
|
17
|
+
* 检查文件是否应该被忽略
|
|
18
|
+
*/
|
|
19
|
+
static shouldIgnore(filename, patterns) {
|
|
20
|
+
return patterns.some((pattern) => pattern.test(filename));
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 检查文件是否为 HTML 文件(不区分大小写)
|
|
24
|
+
*/
|
|
25
|
+
static isHtmlFile(filename) {
|
|
26
|
+
return /\.html?$/i.test(filename);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 获取 HTML 文件的上传选项(缓存控制头)
|
|
30
|
+
*/
|
|
31
|
+
static getUploadHeaders(filename) {
|
|
32
|
+
if (this.isHtmlFile(filename)) {
|
|
33
|
+
return { ...HTML_CACHE_HEADERS };
|
|
34
|
+
}
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 递归遍历目录,获取所有文件
|
|
39
|
+
*/
|
|
40
|
+
static async walkDirectory(dir, ignorePatterns = DEFAULT_IGNORE_PATTERNS) {
|
|
41
|
+
const results = [];
|
|
42
|
+
await this.walkDirectoryRecursive(dir, dir, ignorePatterns, results);
|
|
43
|
+
return results;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* 递归遍历目录的内部实现
|
|
47
|
+
*/
|
|
48
|
+
static async walkDirectoryRecursive(baseDir, currentDir, ignorePatterns, results) {
|
|
49
|
+
const entries = await fs.readdir(currentDir, { withFileTypes: true });
|
|
50
|
+
for (const entry of entries) {
|
|
51
|
+
const fullPath = path.join(currentDir, entry.name);
|
|
52
|
+
if (entry.isDirectory()) {
|
|
53
|
+
// 递归处理子目录
|
|
54
|
+
await this.walkDirectoryRecursive(baseDir, fullPath, ignorePatterns, results);
|
|
55
|
+
}
|
|
56
|
+
else if (entry.isFile()) {
|
|
57
|
+
// 检查是否应该忽略
|
|
58
|
+
if (!this.shouldIgnore(entry.name, ignorePatterns)) {
|
|
59
|
+
const relativePath = path.relative(baseDir, fullPath).replace(/\\/g, '/');
|
|
60
|
+
results.push({
|
|
61
|
+
path: fullPath,
|
|
62
|
+
relativePath,
|
|
63
|
+
isHtml: this.isHtmlFile(entry.name),
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* 检查路径是否存在
|
|
71
|
+
*/
|
|
72
|
+
static async exists(filePath) {
|
|
73
|
+
try {
|
|
74
|
+
await fs.access(filePath);
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* 检查路径是否为目录
|
|
83
|
+
*/
|
|
84
|
+
static async isDirectory(filePath) {
|
|
85
|
+
try {
|
|
86
|
+
const stat = await fs.stat(filePath);
|
|
87
|
+
return stat.isDirectory();
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=file.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file.service.js","sourceRoot":"","sources":["../../src/services/file.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OssService - 阿里云 OSS 操作服务
|
|
3
|
+
* 封装上传、删除、连接测试等操作
|
|
4
|
+
*/
|
|
5
|
+
import { OssConfig, CliOptions } from './config.service.js';
|
|
6
|
+
export interface UploadResult {
|
|
7
|
+
success: number;
|
|
8
|
+
failed: number;
|
|
9
|
+
files: string[];
|
|
10
|
+
}
|
|
11
|
+
export interface DeleteResult {
|
|
12
|
+
success: boolean;
|
|
13
|
+
deletedCount: number;
|
|
14
|
+
error?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface BucketInfo {
|
|
17
|
+
name: string;
|
|
18
|
+
region: string;
|
|
19
|
+
creationDate: string;
|
|
20
|
+
}
|
|
21
|
+
export declare class OssService {
|
|
22
|
+
private client;
|
|
23
|
+
private config;
|
|
24
|
+
constructor(config: OssConfig);
|
|
25
|
+
/**
|
|
26
|
+
* 测试 OSS 连接
|
|
27
|
+
*/
|
|
28
|
+
testConnection(): Promise<BucketInfo>;
|
|
29
|
+
/**
|
|
30
|
+
* 上传单个文件
|
|
31
|
+
*/
|
|
32
|
+
uploadFile(localPath: string, ossPath: string, headers?: Record<string, string>): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* 上传目录
|
|
35
|
+
*/
|
|
36
|
+
uploadDirectory(localDir: string, ossDir: string, options: CliOptions): Promise<UploadResult>;
|
|
37
|
+
/**
|
|
38
|
+
* 列出指定前缀的所有文件
|
|
39
|
+
*/
|
|
40
|
+
listFiles(prefix: string): Promise<string[]>;
|
|
41
|
+
/**
|
|
42
|
+
* 删除目录下的所有文件
|
|
43
|
+
*/
|
|
44
|
+
deleteDirectory(ossDir: string): Promise<DeleteResult>;
|
|
45
|
+
/**
|
|
46
|
+
* 同步目录(先删除再上传)
|
|
47
|
+
*/
|
|
48
|
+
syncDirectory(localDir: string, ossDir: string, options: CliOptions): Promise<{
|
|
49
|
+
deleteResult: DeleteResult;
|
|
50
|
+
uploadResult: UploadResult;
|
|
51
|
+
}>;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=oss.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oss.service.d.ts","sourceRoot":"","sources":["../../src/services/oss.service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAI5D,MAAM,WAAW,YAAY;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,UAAU;IACnB,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,MAAM,CAAY;gBAEd,MAAM,EAAE,SAAS;IAW7B;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,UAAU,CAAC;IAoC3C;;OAEG;IACG,UAAU,CACZ,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC;IAKhB;;OAEG;IACG,eAAe,CACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,UAAU,GACpB,OAAO,CAAC,YAAY,CAAC;IAoCxB;;OAEG;IACG,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAwBlD;;OAEG;IACG,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IA0C5D;;OAEG;IACG,aAAa,CACf,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,UAAU,GACpB,OAAO,CAAC;QAAE,YAAY,EAAE,YAAY,CAAC;QAAC,YAAY,EAAE,YAAY,CAAA;KAAE,CAAC;CAsBzE"}
|