UNPKG

react-middleware

Version:

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

150 lines (130 loc) 4.51 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.BUILD_PATH = undefined; var _ramda = require("ramda"); var _ramda2 = _interopRequireDefault(_ramda); 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); 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(path) { return _path2.default.join(NODE_MODULES_PATH, path); }; var SETTINGS = { resolveLoader: { fallback: NODE_MODULES_PATH }, resolve: { fallback: NODE_MODULES_PATH, extensions: ["", ".js", ".jsx", "json"], alias: { "react": modulePath("react"), "lodash": modulePath("lodash"), "ramda": modulePath("ramda") } }, module: { loaders: [ // ES6/JSX. { test: /\.js$/, exclude: /(node_modules)/, loader: "babel-loader" }, { test: /\.jsx$/, exclude: /(node_modules)/, loader: "babel-loader" }, { test: /\.json$/, loader: "json-loader" }] } }; 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 })]; } 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) { var minify = IS_PRODUCTION; var config = getSettings(entryPath, outputPath, { minify: minify }); return new Promise(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 }); } } }); }); }; exports.default = function (paths, 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).map(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 Promise(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).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); }); };