react-middleware
Version:
Connect middleware for serving React components from a standard folder structure.
150 lines (130 loc) • 4.51 kB
JavaScript
;
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);
});
};