build-boiler
Version:
Build Boilerplate using Webpack, Eslint, Assemble, Nunjucks, and BrowserSync
341 lines (276 loc) • 12.9 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
exports.default = function (config, rootDir) {
var _defaultEntry;
var parentConfig = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
var ENV = config.ENV;
var browser = config.browser;
var entry = config.entry;
var log = _gulpUtil2.default.log;
var colors = _gulpUtil2.default.colors;
var magenta = colors.magenta;
var blue = colors.blue;
var hfaDefaults = {
shouldRev: true,
devAssets: '//hrc-assets.hfa.io/',
prodAssets: '//a.hrc.onl/',
devPath: 'www.hfa.io', //ex => 'www.hfa.io'
prodPath: 'www.hillaryclinton.com', //ex => 'www.hillaryclinton.com'
internalHost: 'local.hfa.io'
};
if (parentConfig.isHfa) {
Object.keys(hfaDefaults).forEach(function (key) {
var parentVal = parentConfig[key];
var hfaVal = hfaDefaults[key];
if (!parentVal) {
parentConfig[key] = hfaVal;
}
});
}
var _parentConfig$isHfa = parentConfig.isHfa;
var isHfa = _parentConfig$isHfa === undefined ? false : _parentConfig$isHfa;
var _parentConfig$shouldR = parentConfig.shouldRev;
var
//if a "project" not a "module" turn on file reving
shouldRev = _parentConfig$shouldR === undefined ? false : _parentConfig$shouldR;
var _parentConfig$bucketB = parentConfig.bucketBase;
var bucketBase = _parentConfig$bucketB === undefined ? '' : _parentConfig$bucketB;
var _parentConfig$devAsse = parentConfig.devAssets;
var devAssets = _parentConfig$devAsse === undefined ? '/' : _parentConfig$devAsse;
var _parentConfig$prodAss = parentConfig.prodAssets;
var prodAssets = _parentConfig$prodAss === undefined ? '/' : _parentConfig$prodAss;
var _parentConfig$devPath = parentConfig.devPath;
var devPath = _parentConfig$devPath === undefined ? '' : _parentConfig$devPath;
var _parentConfig$prodPat = parentConfig.prodPath;
var //ex => 'www.hfa.io'
prodPath = _parentConfig$prodPat === undefined ? '' : _parentConfig$prodPat;
var _parentConfig$interna = parentConfig.internalHost;
var //ex => 'www.hillaryclinton.com'
internalHost = _parentConfig$interna === undefined ? 'localhost' : _parentConfig$interna;
var _parentConfig$include = parentConfig.includePaths;
var includePaths = _parentConfig$include === undefined ? [] : _parentConfig$include;
var _parentConfig$isomorp = parentConfig.isomorphic;
var isomorphic = _parentConfig$isomorp === undefined ? {} : _parentConfig$isomorp;
var _parentConfig$assembl = parentConfig.assemble;
var assemble = _parentConfig$assembl === undefined ? {} : _parentConfig$assembl;
var _parentConfig$browser = parentConfig.browserSync;
var browserSync = _parentConfig$browser === undefined ? {} : _parentConfig$browser;
var _parentConfig$eslint = parentConfig.eslint;
var eslint = _parentConfig$eslint === undefined ? {} : _parentConfig$eslint;
var _parentConfig$webpack = parentConfig.webpack;
var webpack = _parentConfig$webpack === undefined ? {} : _parentConfig$webpack;
var cb = parentConfig.cb;
//enable Assemble to build isomorphic application
var enableIsomorphic = _lodash2.default.isPlainObject(isomorphic) && Object.keys(isomorphic).length > 0;
var globalBundleName = 'global';
var devUrl = (0, _path.join)(devPath, bucketBase);
var prodUrl = (0, _path.join)(prodPath, bucketBase);
var mainBundleName = 'main';
var isDev = ENV === 'development';
var isServer = ENV === 'server';
var isIE = browser === 'ie' || browser === 'internet explorer';
var scriptDir = 'js';
var _process$env = process.env;
var BROWSERSTACK_USERNAME = _process$env.BROWSERSTACK_USERNAME;
var BROWSERSTACK_API = _process$env.BROWSERSTACK_API;
var localIdentifier = _process$env.localIdentifier;
var TRAVIS_BRANCH = _process$env.TRAVIS_BRANCH;
var devBranch = 'devel';
var isMaster = TRAVIS_BRANCH === 'master';
var isDevRoot = TRAVIS_BRANCH === devBranch;
var isModule = /\/node_modules\//.test(rootDir);
var babelrc = '{\n "presets": ["react", "es2015", "stage-0"],\n "env": {\n "development": {\n "plugins": [\n "rewire",\n "transform-decorators-legacy",\n "typecheck",\n ["react-transform",\n {\n "transforms": [{\n "transform": "react-transform-hmr",\n "imports": ["react"],\n "locals": ["module"]\n }, {\n "transform": "react-transform-catch-errors",\n "imports": ["react", "redbox-react"]\n }]\n }]\n ]\n },\n "production": {\n "plugins": [\n "transform-decorators-legacy"\n ]\n }\n }\n }';
var defaultEntry = (_defaultEntry = {}, _defineProperty(_defaultEntry, mainBundleName, ['./' + scriptDir + '/index.js']), _defineProperty(_defaultEntry, globalBundleName, [(0, _path.join)(rootDir, 'global-' + (isModule ? 'prod' : 'dev') + '.js')]), _defaultEntry);
var sources = {
buckets: {
prod: '', //enter prod bucket here
dev: '' //enter dev bucket here
},
coverageDir: 'coverage',
babelrc: JSON.parse(babelrc),
componentEntries: ['**/{,*-}entry.{js,jsx}'],
devUrl: devUrl,
prodUrl: prodUrl,
rootDir: rootDir,
scriptDir: scriptDir,
srcDir: './src',
templateDir: 'templates',
statsFile: 'webpack-main-stats.json',
globalStatsFile: 'webpack-global-stats.json',
testDir: './test',
taskDir: './gulp',
buildDir: './dist',
internalHost: internalHost,
devHost: 'localhost',
devPort: 8000,
hotPort: 8080,
includePaths: includePaths,
globalBundleName: globalBundleName,
mainBundleName: mainBundleName,
entry: entry || defaultEntry
};
var trim = function trim(fp) {
return fp.lastIndexOf('/') === fp.length - 1 ? fp.slice(0, -1) : fp;
};
var utils = {
addbase: function addbase() {
var base = [process.cwd()];
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
var allArgs = [].concat(base, args);
return _path.join.apply(undefined, _toConsumableArray(allArgs));
},
addroot: function addroot() {
var base = [rootDir];
for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
args[_key2] = arguments[_key2];
}
var allArgs = [].concat(base, args);
return _path.join.apply(undefined, _toConsumableArray(allArgs));
},
getTaskName: function getTaskName(task) {
var split = task.name.split(':');
var len = split.length;
var ret = undefined;
if (len === 2) {
ret = split.slice(-1)[0];
} else if (len > 2) {
ret = split.slice(1);
}
return ret;
},
logError: function logError(_ref) {
var err = _ref.err;
var plugin = _ref.plugin;
var pluginErr = new _gulpUtil.PluginError(plugin, err, { showStack: true });
log(magenta(pluginErr.plugin));
log(blue(pluginErr.message));
log(pluginErr.stack);
process.exit(1);
},
trim: trim
};
var environment = {
asset_path: '/', // path for assets => local_dev: '', dev: hrc-assets.hfa.io/contribute, prod: a.hrc.onl/contribute
link_path: TRAVIS_BRANCH ? 'TRAVIS_BRANCH' : '',
image_dir: 'img',
template_env: ENV,
isHfa: isHfa,
isDev: isDev,
isServer: isServer,
isIE: isIE,
isMaster: isMaster,
isDevRoot: isDevRoot,
enableIsomorphic: enableIsomorphic
};
if (!isDev && TRAVIS_BRANCH) {
var bucketPath = !!bucketBase ? bucketBase + '/' : '';
var devAssetPath = trim(devAssets) + '/' + bucketPath;
var prodAssetPath = trim(prodAssets) + '/' + bucketPath;
// if branch is not `devel` or `master` add the branch name to the asset path
if (!isDevRoot && !isMaster) {
devAssetPath += TRAVIS_BRANCH + '/';
}
Object.assign(environment, {
asset_path: !isMaster ? devAssetPath : prodAssetPath,
branch: TRAVIS_BRANCH,
link_path: isDevRoot || isMaster ? '' : '/' + TRAVIS_BRANCH // for creating <a href={{link_path}}/something
});
}
var bsConfig = {
BROWSERSTACK_API: BROWSERSTACK_API,
BROWSERSTACK_USERNAME: BROWSERSTACK_USERNAME,
localIdentifier: localIdentifier
};
var webpackPaths = {
fileLoader: ['file-loader?name=[path][name].[ext]', 'file-loader?name=[path][name]-[sha256:hash].[ext]'],
cssBundleName: ['css/[name].css', 'css/[name]-[chunkhash].css'],
jsBundleName: ['[name].js', '[name]-[chunkhash].js']
};
var webpackConfig = {
alias: {},
hashFunction: 'sha256',
expose: {},
moduleRoot: [],
multipleBundles: false,
node: {
fs: 'empty',
__filename: true,
__dirname: true
},
paths: Object.keys(webpackPaths).reduce(function (acc, key) {
var _webpackPaths$key = _slicedToArray(webpackPaths[key], 2);
var devPath = _webpackPaths$key[0];
var prodPath = _webpackPaths$key[1];
var revProd = !isDev && shouldRev;
if (key === 'fileLoader') {
Object.assign(acc, _defineProperty({}, key, devPath));
} else {
Object.assign(acc, _defineProperty({}, key, revProd && !isServer ? prodPath : devPath));
}
return acc;
}, {}),
vendors: ['lodash', 'react', 'react-dom'],
webpackPaths: webpackPaths
};
if (webpack) {
_lodash2.default.merge(webpackConfig, webpack);
}
var packagePath = utils.addbase('package.json');
var pkgInfo = {};
try {
pkgInfo = (0, _fsExtra.readJsonSync)(packagePath);
} catch (err) {
log(magenta('[build-boiler]') + ': No package.json at ' + blue(packagePath));
}
var _pkgInfo = pkgInfo;
var _pkgInfo$devDependenc = _pkgInfo.devDependencies;
var devDependencies = _pkgInfo$devDependenc === undefined ? {} : _pkgInfo$devDependenc;
var _pkgInfo$dependencies = _pkgInfo.dependencies;
var dependencies = _pkgInfo$dependencies === undefined ? {} : _pkgInfo$dependencies;
var _pkgInfo$main = _pkgInfo.main;
var main = _pkgInfo$main === undefined ? '' : _pkgInfo$main;
var _pkgInfo$name = _pkgInfo.name;
var name = _pkgInfo$name === undefined ? '' : _pkgInfo$name;
var _pkgInfo$version = _pkgInfo.version;
var version = _pkgInfo$version === undefined ? '' : _pkgInfo$version;
var pkg = {
devDependencies: Object.keys(devDependencies),
dependencies: Object.keys(dependencies),
name: name,
version: version,
main: main
};
var baseConfig = _extends({}, config, {
bsConfig: bsConfig,
environment: environment,
pkg: pkg,
sources: sources,
utils: utils,
isomorphic: isomorphic,
assemble: assemble,
browserSync: browserSync,
eslint: eslint,
webpackConfig: webpackConfig
});
var finalConfig = _lodash2.default.isFunction(cb) ? cb(baseConfig) : baseConfig;
if (_lodash2.default.isUndefined(finalConfig)) {
log('[gulp-config]: Config values are undefined, ' + magenta('did you forget to return an object from the cb?'));
}
return finalConfig || baseConfig;
};
var _lodash = require('lodash');
var _lodash2 = _interopRequireDefault(_lodash);
var _path = require('path');
var _gulpUtil = require('gulp-util');
var _gulpUtil2 = _interopRequireDefault(_gulpUtil);
var _fsExtra = require('fs-extra');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
module.exports = exports['default'];