文件

79 行
2.3 KiB
JavaScript

const fs = require('fs')
const path = require('path')
const COS = require('cos-nodejs-sdk-v5')
const root = path.join(__dirname, '..', 'dist', 'build', 'h5')
const serverEnv = path.join(__dirname, '..', '..', 'server', '.env')
if (fs.existsSync(serverEnv)) {
require('dotenv').config({ path: serverEnv })
}
const bucket = process.env.COS_BUCKET
const region = process.env.COS_REGION || process.env.TENCENT_REGION
const secretId = process.env.TENCENT_SECRET_ID
const secretKey = process.env.TENCENT_SECRET_KEY
const prefix = process.env.ADMIN_COS_PREFIX || 'admin/'
if (!bucket || !region || !secretId || !secretKey) {
console.error('COS_BUCKET, COS_REGION, TENCENT_SECRET_ID and TENCENT_SECRET_KEY are required')
process.exit(1)
}
if (!fs.existsSync(root)) {
console.error('Build output not found: ' + root)
process.exit(1)
}
const cos = new COS({ SecretId: secretId, SecretKey: secretKey })
function walk(dir) {
const files = []
fs.readdirSync(dir).forEach(name => {
const file = path.join(dir, name)
const stat = fs.statSync(file)
if (stat.isDirectory()) files.push.apply(files, walk(file))
else files.push(file)
})
return files
}
function contentType(file) {
if (file.endsWith('.html')) return 'text/html; charset=utf-8'
if (file.endsWith('.js')) return 'application/javascript; charset=utf-8'
if (file.endsWith('.css')) return 'text/css; charset=utf-8'
if (file.endsWith('.json')) return 'application/json; charset=utf-8'
if (file.endsWith('.svg')) return 'image/svg+xml'
if (file.endsWith('.png')) return 'image/png'
if (file.endsWith('.jpg') || file.endsWith('.jpeg')) return 'image/jpeg'
return 'application/octet-stream'
}
async function upload(file) {
const relative = path.relative(root, file).replace(/\\/g, '/')
const key = prefix + relative
await new Promise((resolve, reject) => {
cos.putObject({
Bucket: bucket,
Region: region,
Key: key,
Body: fs.createReadStream(file),
ContentType: contentType(file)
}, err => err ? reject(err) : resolve())
})
console.log('uploaded ' + key)
}
async function main() {
const files = walk(root)
for (const file of files) {
await upload(file)
}
console.log('Admin console uploaded to cos://' + bucket + '/' + prefix)
}
main().catch(err => {
console.error(err.message || err)
process.exit(1)
})