UNPKG

umi-plugin-upload-build

Version:

打包之后自动上传

144 lines (143 loc) 5.92 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const fs_1 = __importDefault(require("fs")); const path_1 = __importDefault(require("path")); exports.default = (api) => { api.describe({ key: 'uploadBuildConfig', config: { schema: (joi) => joi.object({ uploadUrl: joi.string(), uploadDir: joi.string(), targetDir: joi.string(), version: joi.string() }), }, }); api.onStart(() => { console.log('构建开始...'); }); api.onAllBuildComplete && api.onAllBuildComplete((err) => { completeBuildFun(err); }); api.onBuildComplete && api.onBuildComplete(async ({ err }) => { completeBuildFun(err); }); const completeBuildFun = async (err) => { console.log('打包完成,开始上传......'); if (err) { api.logger.error('构建失败,跳过上传'); return; } try { const uploadBuildConfig = api.config.uploadBuildConfig; if (!uploadBuildConfig.uploadUrl) { throw new Error('未配置上传接口URL (uploadUrl)'); } uploadBuildConfig.uploadUrl = uploadBuildConfig.uploadUrl + '/api/files-entries/'; // 读取package.json版本号 const version = getPackageVersion(api.cwd); if (version) { api.logger.info(`当前版本: ${version}`); } uploadBuildConfig.version = version; const files = getAllFiles(uploadBuildConfig.uploadDir); await uploadFiles(files, uploadBuildConfig, api.logger); api.logger.info(`文件上传完成 (${files.length} 个文件)`); } catch (error) { api.logger.error('上传失败:', error instanceof Error ? error.message : String(error)); } }; // 获取package.json版本号 function getPackageVersion(cwd) { try { const pkgPath = path_1.default.join(cwd, 'package.json'); if (fs_1.default.existsSync(pkgPath)) { const pkg = JSON.parse(fs_1.default.readFileSync(pkgPath, 'utf-8')); return pkg.version; } } catch (e) { console.warn('读取package.json版本失败:', e); } return undefined; } function getAllFiles(dir) { const entries = fs_1.default.readdirSync(dir, { withFileTypes: true }); return entries.flatMap(entry => { const fullPath = path_1.default.join(dir, entry.name); return entry.isDirectory() ? getAllFiles(fullPath) : { fullPath, relativePath: path_1.default.relative(dir, fullPath) }; }); } async function uploadFiles(files, uploadBuildConfig, logger) { const queue = [...files]; const workers = Array(5).fill(null).map(async () => { while (queue.length) { const file = queue.shift(); await uploadSingleFile(file, uploadBuildConfig, logger); } }); await Promise.all(workers); } async function uploadSingleFile(file, uploadBuildConfig, logger) { const { fullPath, relativePath } = file; const form = new FormData(); try { // 查看是否有对应的文件目录,没有则创建 let res = await fetch(uploadBuildConfig.uploadUrl + `by-name/${uploadBuildConfig.targetDir}`, { method: 'GET', }); let parentQueryResp = await res.json(); // return let parentEntry = parentQueryResp === null || parentQueryResp === void 0 ? void 0 : parentQueryResp.data; if (!parentEntry) { //没有则创建文件 let res = await fetch(uploadBuildConfig.uploadUrl, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ name: uploadBuildConfig.targetDir, is_directory: true }) }); const createdResp = await res.json(); parentEntry = (createdResp === null || createdResp === void 0 ? void 0 : createdResp.data) || createdResp; } const fileBuffer = await fs_1.default.promises.readFile(fullPath); const fileBlob = new Blob([new Uint8Array(fileBuffer)], { type: 'application/octet-stream' }); form.append('file', fileBlob, relativePath); // 添加版本号到表单数据 if (uploadBuildConfig.version) { form.append('name', uploadBuildConfig.version); } if (!(parentEntry === null || parentEntry === void 0 ? void 0 : parentEntry.id)) { throw new Error('未能获取到父目录ID,无法上传文件'); } form.append('parent_id', String(parentEntry.id)); const response = await fetch(uploadBuildConfig.uploadUrl + `by-parent`, { method: 'POST', body: form, }); const uploadResp = await response.json(); if (uploadResp.code !== 200) { throw new Error(`${uploadResp.message}`); } logger.info(`✓ ${relativePath} 上传成功`); } catch (error) { logger.error(`✕ ${relativePath} 上传失败: ${error instanceof Error ? error.message : String(error)}`); throw error; } } };