import { Reporter, UploadSummary, ConsoleReporter } from '../core/reporter'; import { createStorageClient } from '../core/StorageFactory'; import type { FileProcessor } from '../core/fileProcessor'; import { ProviderConfigResolverImpl } from '../config/ProviderConfigResolverImpl'; import { type UploadDirectoryOptions as BaseOptions } from '../core/UploadService'; import { DirectoryUploadFlow } from '../core/DirectoryUploadFlow'; // ============ 对外类型与门面 ============ /** 上传目录入参:含可选 reporter / fileProcessor,不传则用默认控制台上报 */ export interface UploadDirectoryOptions extends BaseOptions { reporter?: Reporter; fileProcessor?: FileProcessor; } /** * 一行调用即可上传:内部使用默认配置解析器 + 控制台 Reporter。 */ export async function uploadDirectory( options: UploadDirectoryOptions, ): Promise { return new OssService(options.env || 'dev').uploadDirectory(options); } // ============ 具体服务类:默认装配 ============ /** * OSS 上传服务:解析配置并委托 DirectoryUploadFlow(继承 UploadService)执行上传。 */ export class OssService { private readonly resolver: ProviderConfigResolverImpl; constructor(readonly env: string) { this.resolver = new ProviderConfigResolverImpl(env) } async uploadDirectory(options: UploadDirectoryOptions): Promise { const resolved = this.resolver.resolve(); const client = createStorageClient(resolved.providerConfig); const reporter = options.reporter ?? new ConsoleReporter(); const flow = new DirectoryUploadFlow( client, resolved.basePrefix, resolved.cdnBaseUrl, reporter, options.fileProcessor, ); return flow.uploadDirectory({ bucket: options.bucket, localDir: options.localDir, env: options.env || 'dev', pathPrefix: options.pathPrefix, include: options.include, exclude: options.exclude, hash: options.hash, forceUploadPatterns: getForceUploadPatterns(), }); } } function getForceUploadPatterns(): string[] { try { const raw = process.env.FILE_RE_WHITE_LIST; if (!raw) return []; return JSON.parse(raw); } catch { return []; } }