vite-plugin-cos
Version:
A vite plugin for upload dist files to tencent cloud cos
104 lines (98 loc) • 3.58 kB
JavaScript
;
const fs = require('fs-extra');
const COS = require('cos-nodejs-sdk-v5');
const color = require('picocolors');
const fastGlob = require('fast-glob');
const url = require('url');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e["default"] : e; }
const fs__default = /*#__PURE__*/_interopDefaultLegacy(fs);
const COS__default = /*#__PURE__*/_interopDefaultLegacy(COS);
const color__default = /*#__PURE__*/_interopDefaultLegacy(color);
const fastGlob__default = /*#__PURE__*/_interopDefaultLegacy(fastGlob);
const vitePluginUploadToCos = (options) => {
let baseConfig = "/";
let buildConfig = {};
options = {
removePrevious: false,
...options
};
return {
name: "vite-plugin-upload-to-cos",
enforce: "post",
apply: "build",
configResolved(config) {
baseConfig = config.base;
buildConfig = config.build;
},
closeBundle: async () => {
const outDirPath = buildConfig.outDir || "";
const { pathname: cosBasePath, origin: cosOrigin } = new url.URL(baseConfig);
const cos = new COS__default({
SecretId: options.secretId,
SecretKey: options.secretKey
});
const files = await fastGlob__default(outDirPath + "/**/*", {
dot: true,
ignore: options.ignore || ["**/node_modules/**"]
});
if (options.removePrevious) {
let list = await cos.getBucket({
Bucket: options.bucket,
Region: options.region,
Prefix: cosBasePath.replace(/^\//, "")
});
if (list.Contents.length > 0) {
let data = await cos.deleteMultipleObject({
Bucket: options.bucket,
Region: options.region,
Objects: list.Contents.map((item) => {
return { Key: item.Key };
})
});
if (data.statusCode === 200) {
console.log(color__default.green("[vite-plugin-upload-to-cos]"), "remove previous assets success");
} else {
console.log(color__default.red("[vite-plugin-upload-to-cos]"), "remove previous assets failed");
}
}
}
console.log("");
console.log(color__default.green("[vite-plugin-upload-to-cos]"), "upload start");
console.log("");
const startTime = new Date().getTime();
for (const fileFullPath of files) {
const filePath = fileFullPath.split(outDirPath)[1];
const cosFilePath = cosBasePath.replace(/\/$/, "") + filePath;
const completePath = cosOrigin + cosFilePath;
const output = `${buildConfig.outDir + filePath} => ${color__default.green(completePath)}`;
let canUpload = false;
try {
await cos.headObject({
Bucket: options.bucket,
Region: options.region,
Key: cosFilePath
});
console.log(color__default.gray("[vite-plugin-upload-to-cos] existed in cos: "), filePath);
} catch (e) {
canUpload = true;
}
if (options.overwrite) {
canUpload = true;
}
if (canUpload) {
await cos.putObject({
Bucket: options.bucket,
Region: options.region,
Key: cosFilePath,
Body: fs__default.readFileSync(fileFullPath),
StorageClass: "STANDARD"
});
console.log(output);
}
}
const duration = (new Date().getTime() - startTime) / 1e3;
console.log("cost time: " + duration + "s");
}
};
};
module.exports = vitePluginUploadToCos;