gia-cli
Version:
Guardian US Interactive CLI tool
102 lines (78 loc) • 2.29 kB
JavaScript
/*global require, module, process */
const path = require( 'path' );
const fs = require( 'fs' );
const mime = require( 'mime' );
const AWS = require( 'aws-sdk' );
const glob = require( 'glob' );
const filesize = require( 'filesize' );
const stevedore = require( 'stevedore' );
const chalk = require( 'chalk' );
const BUCKET = 'gdn-cdn';
const BASE_DIR = path.resolve( '.deploy' );
const MAX_CONCURRENT_UPLOADS = 8;
try {
AWS.config.credentials = new AWS.SharedIniFileCredentials({ profile: 'default' });
} catch ( err ) {
console.log( // eslint-disable-line no-console
`Expected to find AWS credentials in ~/.aws/credentials:
[default]
aws_access_key_id = AKID...
aws_secret_access_key = YOUR_SECRET_KEY` );
process.exit( 1 );
}
const s3 = new AWS.S3();
module.exports = function uploadToS3 ( thingsToUpload, dest ) {
const uploadQueue = [];
thingsToUpload.forEach( thing => {
glob.sync( thing.files, {
cwd: BASE_DIR,
nodir: true
}).forEach( file => {
uploadQueue.push({ file, headers: thing.headers });
});
});
let inFlight = 0;
let loader;
while ( inFlight < MAX_CONCURRENT_UPLOADS && uploadQueue.length ) {
uploadNextItem();
}
function uploadNextItem () {
const item = uploadQueue.shift();
if ( !item ) {
if ( !loader ) {
loader = stevedore();
}
loader.message( `${inFlight} items remaining ` );
if ( !inFlight ) {
loader.stop();
console.log( `\nupload complete! type ${chalk.cyan( 'npm run open' )} to view the project` ); // eslint-disable-line no-console
}
return;
}
inFlight += 1;
const data = fs.readFileSync( path.join( BASE_DIR, item.file ) );
const options = {
Bucket: BUCKET,
ACL: 'public-read',
Key: `${dest}/${item.file}`,
Body: data,
ContentType: mime.lookup( item.file )
};
Object.keys( item.headers ).forEach( header => {
options[ header ] = item.headers[ header ];
});
console.log( `* ${pad( filesize( data.length ), 12 )} : ${item.file}` ); // eslint-disable-line no-console
s3.putObject( options, err => {
if ( err ) {
console.log( 'err', err ); // eslint-disable-line no-console
throw err;
}
inFlight -= 1;
uploadNextItem();
});
}
};
function pad ( str, len ) {
while ( str.length < len ) str += ' ';
return str;
}