umi-plugin-upload-build
Version:
打包之后自动上传
144 lines (143 loc) • 5.92 kB
JavaScript
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;
}
}
};
;