UNPKG

react-middleware

Version:

Connect middleware for serving React components from a standard folder structure.

173 lines (148 loc) 5.25 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.BUILD_PATH = undefined; var _ramda = require('ramda'); var _ramda2 = _interopRequireDefault(_ramda); var _bluebird = require('bluebird'); var _bluebird2 = _interopRequireDefault(_bluebird); var _webpack = require('webpack'); var _webpack2 = _interopRequireDefault(_webpack); var _fsExtra = require('fs-extra'); var _fsExtra2 = _interopRequireDefault(_fsExtra); var _path = require('path'); var _path2 = _interopRequireDefault(_path); var _paths = require('./paths'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var BUILD_PATH = exports.BUILD_PATH = _path2.default.resolve('./.build/webpack'); var NODE_MODULES_PATH = _path2.default.resolve('./node_modules'); var IS_PRODUCTION = process.env.NODE_ENV === 'production'; var modulePath = function modulePath(moduleName) { return (0, _paths.closestModulePath)(_path2.default.resolve('.'), moduleName); }; var SETTINGS = { resolveLoader: { fallback: NODE_MODULES_PATH }, resolve: { fallback: NODE_MODULES_PATH, extensions: ['', '.js', '.jsx', 'json'], alias: { react: modulePath('react'), ramda: modulePath('ramda') } }, module: { loaders: [ // ES6/JSX. { test: /\.js$/, exclude: /(node_modules)/, loader: 'babel' }, { test: /\.jsx$/, exclude: /(node_modules)/, loader: 'babel' }, { test: /\.json$/, loader: 'json' }] } }; var getSettings = function getSettings(entry, output) { var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2]; var config = _ramda2.default.merge(_ramda2.default.clone(SETTINGS), { entry: entry, output: { filename: _path2.default.basename(output), path: _path2.default.dirname(output) } }); if (options.minify) { config.plugins = [new _webpack2.default.optimize.UglifyJsPlugin({ minimize: true })]; } if (options.loaders) { config.module.loaders = options.loaders; } return config; }; var shortenError = function shortenError(error) { if (error.name === 'ModuleBuildError') { var index = error.message.indexOf(' at '); if (index > -1) { error.message = error.message.substr(0, index); } } }; var compile = function compile(entryPath, outputPath, loaders) { var minify = IS_PRODUCTION; var config = getSettings(entryPath, outputPath, { minify: minify, loaders: loaders }); return new _bluebird2.default(function (resolve, reject) { (0, _webpack2.default)(config, function (err, result) { if (err) { reject({ errors: [err] }); } else { var errors = result.compilation.errors; if (errors.length > 0) { errors.forEach(function (error) { return shortenError(error); }); reject({ errors: errors }); } else { var elapsed = result.endTime - result.startTime; var stats = _fsExtra2.default.lstatSync(outputPath); resolve({ elapsed: elapsed, fileSize: stats.size }); } } }); }); }; /** * Builder API. * @param {Object} settings: * - paths: {Object} of paths to known folders. * - routes: {Object} of routes. * - loaders: {Array} of webpack loaders to use. * Default loaders are replaced with this array. * */ exports.default = function () { var settings = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; var paths = settings.paths; var routes = settings.routes; // Build the list of paths to compile. var items = []; var add = function add(entry, outputFile) { items.push({ entry: entry, output: BUILD_PATH + '/' + outputFile }); }; add(paths.scripts + '/index.js', 'base.js'); _ramda2.default.values(routes).forEach(function (item) { var entry = paths.pages + '/' + item.page + '/' + (item.entry || 'entry.js'); if (_fsExtra2.default.existsSync(entry)) { add(entry, 'pages/' + item.page + '.js'); } }); return new _bluebird2.default(function (resolve, reject) { // Run each item through the webpack compiler. var response = { files: [] }; var compileItem = function compileItem(index) { if (index < items.length) { (function () { var item = items[index]; if (_fsExtra2.default.existsSync(item.entry)) { compile(item.entry, item.output, settings.loaders).then(function (result) { response.files.push({ path: item.entry.replace(paths.base, ''), elapsed: result.elapsed, fileSize: result.fileSize }); compileItem(index + 1); // <== RECURSION. }).catch(function (err) { return reject(err); }); } })(); } else { // Complete. var sumElapsed = function sumElapsed(result, item) { return result + item.elapsed; }; response.elapsed = _ramda2.default.reduce(sumElapsed, 0, response.files); resolve(response); } }; compileItem(0); }); }; //# sourceMappingURL=webpack-builder.js.map