UNPKG

build-boiler

Version:

Build Boilerplate using Webpack, Eslint, Assemble, Nunjucks, and BrowserSync

341 lines (276 loc) 12.9 kB
'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'];