UNPKG

gia-cli

Version:

Guardian US Interactive CLI tool

102 lines (78 loc) 2.29 kB
/*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; }