From 237637a40e02c9c54ba8f417c9264f0e17a9bdf3 Mon Sep 17 00:00:00 2001 From: Cory LaViska Date: Fri, 18 Aug 2017 14:49:20 -0400 Subject: [PATCH] Add back --s3 option --- .env.example | 6 +++ .gitignore | 1 + build.js | 48 +++++++++++++++++++++ package-lock.json | 104 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 2 + 5 files changed, 161 insertions(+) create mode 100644 .env.example diff --git a/.env.example b/.env.example new file mode 100644 index 000000000..1f869bd7b --- /dev/null +++ b/.env.example @@ -0,0 +1,6 @@ +S3_BUCKET= +S3_URL= +S3_ACL= +S3_REGION= +S3_ACCESS_KEY= +S3_SECRET_KEY= diff --git a/.gitignore b/.gitignore index 835d6b7f5..387593460 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .DS_Store +.env .htaccess node_modules/ diff --git a/build.js b/build.js index 625ec203f..2ddccc4fc 100644 --- a/build.js +++ b/build.js @@ -3,6 +3,7 @@ global.__version = require('./package.json').version; +require('dotenv').config(); const Promise = require('bluebird'); const AtImport = require('postcss-import'); const Chalk = require('chalk'); @@ -16,6 +17,7 @@ const Metalsmith = require('metalsmith'); const Path = require('path'); const PostCSS = require('postcss'); const Program = require('commander'); +const S3 = require('s3'); const UglifyJS = require('uglify-js'); const Watch = require('watch'); @@ -163,6 +165,42 @@ function buildStyles() { }); } +// +// Publishes the dist folder to an S3 bucket. +// +// +// +function publishToS3() { + return new Promise((resolve, reject) => { + const client = S3.createClient({ + s3Options: { + accessKeyId: process.env.S3_ACCESS_KEY, + secretAccessKey: process.env.S3_SECRET_KEY + } + }); + + // Sync the local /dist directory to /{version} in the S3 bucket + let uploader = client.uploadDir({ + localDir: Path.join(__dirname, 'dist'), + deleteRemoved: true, + s3Params: { + ACL: process.env.S3_ACL, + Prefix: __version, + Bucket: process.env.S3_BUCKET + } + }); + + uploader.on('error', (err) => { + reject(err); + }); + + uploader.on('end', () => { + console.log(Chalk.green('%s has been published to S3! ☁️'), __version); + resolve(); + }); + }); +} + // // Watches a directory for changes // @@ -197,6 +235,7 @@ Program .version(__version) .option('--build', 'Builds a release') .option('--clean', 'Removes existing release') + .option('--s3', 'Publish lastest release to an S3 bucket (requires .env)') .option('--watch', 'Watch for changes and build automatically') .on('--help', () => { console.log(Chalk.cyan('\n Version %s\n'), __version); @@ -225,6 +264,9 @@ if(Program.build) { // Generate docs .then(() => buildDocs()) + // Publish to S3 if --s3 flag is set + .then(() => Program.s3 ? publishToS3() : null) + // Exit with success .then(() => process.exit(1)) @@ -233,6 +275,12 @@ if(Program.build) { console.error(Chalk.red(err)); process.exit(-1); }); +} else { + // Can't use the --s3 options without --build + if(Program.s3) { + console.error(Chalk.yellow('The --s3 flag can only be used with --build')); + process.exit(-1); + } } // Clean diff --git a/package-lock.json b/package-lock.json index 165860eed..d8c12b6b4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -185,6 +185,16 @@ } } }, + "aws-sdk": { + "version": "2.0.31", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.0.31.tgz", + "integrity": "sha1-5yzx/caQFb2f0r3z07iMFlB9Jo4=", + "dev": true, + "requires": { + "xml2js": "0.2.6", + "xmlbuilder": "0.4.2" + } + }, "babel-cli": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.24.1.tgz", @@ -1422,6 +1432,12 @@ "repeating": "2.0.1" } }, + "dotenv": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-4.0.0.tgz", + "integrity": "sha1-hk7xN5rO1Vzm+V3r7NzhefegzR0=", + "dev": true + }, "electron-to-chromium": { "version": "1.3.16", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.16.tgz", @@ -1506,6 +1522,15 @@ "is-extglob": "1.0.0" } }, + "fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "dev": true, + "requires": { + "pend": "1.2.0" + } + }, "filename-regex": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", @@ -1527,6 +1552,12 @@ "repeat-string": "1.6.1" } }, + "findit2": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/findit2/-/findit2-2.2.3.tgz", + "integrity": "sha1-WKRmaX34piBc39vzlVNri9d3pfY=", + "dev": true + }, "flatten": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", @@ -3191,6 +3222,12 @@ "regex-cache": "0.4.3" } }, + "mime": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", + "integrity": "sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA=", + "dev": true + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -3240,6 +3277,12 @@ "dev": true, "optional": true }, + "natives": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.0.tgz", + "integrity": "sha1-6f+EFBimsux6SV6TmYT3jxY+bjE=", + "dev": true + }, "normalize-path": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", @@ -3381,6 +3424,12 @@ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", "dev": true }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", @@ -5917,12 +5966,46 @@ "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", "dev": true }, + "s3": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/s3/-/s3-4.4.0.tgz", + "integrity": "sha1-VqT3dVFae2ucjlxrGrUfkDdmnx8=", + "dev": true, + "requires": { + "aws-sdk": "2.0.31", + "fd-slicer": "1.0.1", + "findit2": "2.2.3", + "graceful-fs": "3.0.11", + "mime": "1.2.11", + "mkdirp": "0.5.1", + "pend": "1.2.0", + "rimraf": "2.2.8", + "streamsink": "1.2.0" + }, + "dependencies": { + "graceful-fs": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", + "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", + "dev": true, + "requires": { + "natives": "1.1.0" + } + } + } + }, "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", "dev": true }, + "sax": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/sax/-/sax-0.4.2.tgz", + "integrity": "sha1-OfO2AXM9a+yXEFskKipA/Wl4rDw=", + "dev": true + }, "semver": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", @@ -5987,6 +6070,12 @@ "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=", "dev": true }, + "streamsink": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/streamsink/-/streamsink-1.2.0.tgz", + "integrity": "sha1-76/unx4i01ke1949yqlcP1559zw=", + "dev": true + }, "strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", @@ -6250,6 +6339,21 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "xml2js": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.2.6.tgz", + "integrity": "sha1-0gnE5N2h/JxFIUHvQcB39a399sQ=", + "dev": true, + "requires": { + "sax": "0.4.2" + } + }, + "xmlbuilder": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-0.4.2.tgz", + "integrity": "sha1-F3bWXz/brUcKCNhgTN6xxOVA/4M=", + "dev": true + }, "yargs": { "version": "3.10.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", diff --git a/package.json b/package.json index bb01f73f2..d413d61ef 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "commander": "^2.11.0", "cssnano": "^3.10.0", "del": "^3.0.0", + "dotenv": "^4.0.0", "fs": "0.0.1-security", "handlebars": "^4.0.10", "metalsmith": "^2.3.0", @@ -24,6 +25,7 @@ "postcss": "^6.0.8", "postcss-cssnext": "^3.0.2", "postcss-import": "^10.0.0", + "s3": "^4.4.0", "stylelint-config-standard": "^17.0.0", "uglify-js": "^3.0.27", "watch": "^1.0.2"