bitgo
Version:
BitGo JavaScript SDK
94 lines (79 loc) • 2.61 kB
JavaScript
const path = require('path');
const fs = require('fs');
const S3 = require('aws-sdk/clients/s3');
const { version } = require('../package.json');
const { promisify } = require('util');
const { reports_s3_akid, reports_s3_sak } = process.env;
const s3 = new S3({
accessKeyId: reports_s3_akid,
secretAccessKey: reports_s3_sak,
signatureVersion: 'v4',
});
const readdir = promisify(fs.readdir);
const readFile = promisify(fs.readFile);
const stat = promisify(fs.stat);
const ROOTDIR = path.dirname(path.dirname(require.main.filename));
const MODULE = path.basename(ROOTDIR);
const OBJECT_ROOT = `${MODULE}/${version}`;
const DOCS_ROOT = `${ROOTDIR}/docs/`;
async function walk(currentDirPath, seen = []) {
const files = await readdir(currentDirPath);
for (const file of files) {
const filePath = path.join(currentDirPath, file);
const fileStat = await stat(filePath);
if (fileStat.isFile()) {
seen.push({ filePath, stat: fileStat });
} else if (fileStat.isDirectory()) {
await walk(filePath, seen);
}
}
return seen;
}
async function upload(uploadParams) {
try {
await s3.putObject(uploadParams).promise();
} catch (e) {
console.error(`S3 error: ${e}\n${e.stack}`);
throw e;
}
}
const contentTypes = {
js: 'text/javascript',
css: 'text/css',
png: 'image/png',
html: 'text/html',
};
function contentType(filePath) {
const search = filePath.match(/\.([a-z0-9]+)$/i);
if (search && search[1] && search[1] in contentTypes) {
return contentTypes[search[1]];
}
return 'text/html';
}
async function uploadDocs(root, key) {
const uploadPromises = [];
const now = Date.now();
const files = await walk(root);
console.log(`Uploading ${files.length} documentation source files to S3`);
for (const { filePath } of files) {
const bucketPath = `${key}/${filePath.replace(DOCS_ROOT, '')}`;
const uploadParams = {
Body: await readFile(filePath),
Bucket: 'bitgo-sdk-docs',
Key: bucketPath,
ACL: 'public-read',
ContentType: contentType(filePath),
};
uploadPromises.push(upload(uploadParams));
}
await Promise.all(uploadPromises);
console.log();
console.log(`=== DOCS UPLOADED SUCCESSFULLY (${Date.now() - now} ms) ===`);
console.log(`https://bitgo-sdk-docs.s3.amazonaws.com/${key}/index.html`);
console.log();
}
if (!fs.existsSync(DOCS_ROOT) || !fs.statSync(DOCS_ROOT).isDirectory()) {
console.warn(`Docs directory '${DOCS_ROOT}' not found. Skipping docs upload...`);
} else {
uploadDocs(DOCS_ROOT, OBJECT_ROOT).catch((e) => console.error('fatal', e, e.stack));
}