UNPKG

reacthtmlpack

Version:

Using HTML templates as entry points for webpack

372 lines (285 loc) 13.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); 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"); } }; })(); 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; }; exports.buildToDir = buildToDir; exports.watchAndBuildToDir = watchAndBuildToDir; exports.devServer = devServer; exports.getMatchResult = getMatchResult; exports.srcPatternToMatchResult = srcPatternToMatchResult; exports.matchResultToMatchesFilepathReducer = matchResultToMatchesFilepathReducer; exports.replaceWithHtmlExt = replaceWithHtmlExt; exports.createWriteStaticMarkup$ToDestDir = createWriteStaticMarkup$ToDestDir; exports.watchMultiCompiler$ToChildrenStats$ = watchMultiCompiler$ToChildrenStats$; exports.addDevServerToEntryMapperCreator = addDevServerToEntryMapperCreator; exports.startDevServerWithMultiCompiler$ToChildrenStats$MapperCreator = startDevServerWithMultiCompiler$ToChildrenStats$MapperCreator; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; } 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); } } var _path = require("path"); var _fs = require("fs"); var _glob = require("glob"); var _glob2base = require("glob2base"); var _glob2base2 = _interopRequireDefault(_glob2base); var _rx = require("rx"); var _rx2 = _interopRequireDefault(_rx); var _transducersJs = require("transducers-js"); var _webpackDevServer = require("webpack-dev-server"); var _webpackDevServer2 = _interopRequireDefault(_webpackDevServer); var _webpack = require("webpack"); var _webpack2 = _interopRequireDefault(_webpack); var _lodash = require("lodash"); var _lodash2 = _interopRequireDefault(_lodash); var _core = require("./core"); var writeFile = _rx.Observable.fromNodeCallback(_fs.writeFile); /** * @public */ function buildToDir(destDir, srcPatternList) { var _getMatchResult = getMatchResult(srcPatternList); var filepath$ = _getMatchResult.filepath$; var relativePathByMatch$ = _getMatchResult.relativePathByMatch$; var xf = _transducersJs.comp.apply(undefined, [_core.xfFilepath$ToWebpackConfig$, (0, _transducersJs.map)(_core.webpackConfig$ToChunkList$), (0, _transducersJs.map)(_core.chunkList$ToStaticMarkup$), (0, _transducersJs.map)(createWriteStaticMarkup$ToDestDir(relativePathByMatch$, destDir))]); _rx.Observable.of(filepath$).transduce(xf).concatAll().subscribe(console.log.bind(console), console.error.bind(console), function () { console.log("done!"); }); } /** * @public */ function watchAndBuildToDir(destDir, srcPatternList) { var _getMatchResult2 = getMatchResult(srcPatternList); var filepath$ = _getMatchResult2.filepath$; var relativePathByMatch$ = _getMatchResult2.relativePathByMatch$; var xf = _transducersJs.comp.apply(undefined, [(0, _transducersJs.map)(_core.chunkList$ToStaticMarkup$), (0, _transducersJs.map)(createWriteStaticMarkup$ToDestDir(relativePathByMatch$, destDir))]); _rx.Observable.of(filepath$).transduce(_core.xfFilepath$ToWebpackConfig$).selectMany(function (webpackConfig$) { // Why selectMany? Because watch could be repeative. // Instead of wrapping one value, now a series of values are emitted. return _rx.Observable.of(webpackConfig$).map(_core.webpackConfig$ToWebpackCompiler$).combineLatest(webpackConfig$.count(), function (webpackCompiler$, count) { return { webpackCompiler$: webpackCompiler$, count: count }; }).selectMany(function (_ref) { var webpackCompiler$ = _ref.webpackCompiler$; var count = _ref.count; return _rx.Observable.of(webpackCompiler$).map(watchMultiCompiler$ToChildrenStats$).selectMany(_transducersJs.identity).scan(function (acc, it) { acc = [].concat(_toConsumableArray(acc)); var index = it.index; var rest = _objectWithoutProperties(it, ["index"]); acc[index] = rest; return acc; }, new Array(count)).takeWhile(function (acc) { return acc.every(_transducersJs.identity); }).map(function (acc) { return _rx.Observable.fromArray(acc); }); }).map((0, _core.mergeWebpackStats$ToChunkList$WithWebpackConfig$)(webpackConfig$)); }).transduce(xf).concatAll().subscribe(console.log.bind(console), console.error.bind(console), function () { console.log("done!"); }); } /** * @public */ function devServer(relativeDevServerConfigFilepath, destDir, srcPatternList) { var devServerConfigFilepath = (0, _path.resolve)(process.cwd(), relativeDevServerConfigFilepath); var _getMatchResult3 = getMatchResult(srcPatternList); var filepath$ = _getMatchResult3.filepath$; var relativePathByMatch$ = _getMatchResult3.relativePathByMatch$; var xf = _transducersJs.comp.apply(undefined, [(0, _transducersJs.map)(_core.chunkList$ToStaticMarkup$), (0, _transducersJs.map)(createWriteStaticMarkup$ToDestDir(relativePathByMatch$, destDir))]); _rx.Observable.of(filepath$).transduce(_core.xfFilepath$ToWebpackConfig$).selectMany(function (webpackConfig$) { // Why selectMany? Because devServer is watching and could be repeative. // Instead of wrapping one value, now a series of values are emitted. return _rx.Observable.of(webpackConfig$).map(addDevServerToEntryMapperCreator(devServerConfigFilepath)).map(_core.webpackConfig$ToWebpackCompiler$).combineLatest(webpackConfig$.count(), function (webpackCompiler$, count) { return { webpackCompiler$: webpackCompiler$, count: count }; }).selectMany(function (_ref2) { var webpackCompiler$ = _ref2.webpackCompiler$; var count = _ref2.count; return _rx.Observable.of(webpackCompiler$).selectMany(startDevServerWithMultiCompiler$ToChildrenStats$MapperCreator(devServerConfigFilepath)); }).map((0, _core.mergeWebpackStats$ToChunkList$WithWebpackConfig$)(webpackConfig$)); }).transduce(xf).concatAll().subscribe(console.log.bind(console), console.error.bind(console), function () { console.log("done!"); }); } /** * @private */ function getMatchResult(srcPatternList) { var matchResult$ = _rx.Observable.fromArray(srcPatternList).selectMany(srcPatternToMatchResult).reduce(matchResultToMatchesFilepathReducer, { matches: [], relativePathByMatch: {} }).first(); var filepath$ = matchResult$.selectMany(function (_ref3) { var matches = _ref3.matches; return _rx.Observable.fromArray(matches); }); var relativePathByMatch$ = matchResult$.map(function (_ref4) { var relativePathByMatch = _ref4.relativePathByMatch; return relativePathByMatch; }); return { filepath$: filepath$, relativePathByMatch$: relativePathByMatch$ }; } /** * @private */ function srcPatternToMatchResult(srcPattern) { var globber = new _glob.Glob(srcPattern); var base = (0, _glob2base2["default"])(globber); return _rx2["default"].Observable.create(function (observer) { function callback(matches) { observer.onNext({ base: base, matches: matches }); observer.onCompleted(); }; globber.once("end", callback); return globber.removeListener.bind(globber, "end", callback); }); } /** * @private */ function matchResultToMatchesFilepathReducer(acc, _ref5) { var _acc$matches; var base = _ref5.base; var matches = _ref5.matches; (_acc$matches = acc.matches).push.apply(_acc$matches, _toConsumableArray(matches)); matches.forEach(function (match) { var filepath = replaceWithHtmlExt(match); acc.relativePathByMatch[match] = (0, _path.relative)(base, filepath); }); return acc; } /** * @private */ function replaceWithHtmlExt(filepath) { var dirpath = (0, _path.dirname)(filepath); var basename = (0, _path.basename)(filepath); while (true) { var ext = (0, _path.extname)(basename); if (ext) { basename = (0, _path.basename)(basename, ext); } else { return (0, _path.resolve)(dirpath, basename + ".html"); } } } /** * @private */ function createWriteStaticMarkup$ToDestDir(relativePathByMatch$, destDir) { return function (staticMarkup$) { return staticMarkup$.combineLatest(relativePathByMatch$, function (_ref6, relativePathByMatch) { var filepath = _ref6.filepath; var markup = _ref6.markup; var relativePath = relativePathByMatch[filepath]; return { filepath: (0, _path.resolve)(destDir, relativePath), markup: markup }; }).selectMany(function (_ref7) { var filepath = _ref7.filepath; var markup = _ref7.markup; return writeFile(filepath, markup); }); }; } /** * @private */ function watchMultiCompiler$ToChildrenStats$(webpackCompiler$) { // return Observable.create(observer => { // function callback (err, stats) { // if (err) { // observer.onError(err); // } else { // observer.onNext(stats); // } // } // const watcher = webpackCompiler.watch({}, callback); // return watcher.close.bind(watcher); // }); // We cannot use the above code because we want every results in a sub compiler. // This is an issue of implementation details of webpack return webpackCompiler$.selectMany(function (webpackCompiler) { return _rx.Observable.fromArray(webpackCompiler.compilers); }).selectMany(function (compiler, index) { return _rx.Observable.create(function (observer) { function callback(err, stats) { if (err) { observer.onError(err); } else { observer.onNext({ index: index, stats: stats, statsJson: stats.toJson() }); } } var watcher = compiler.watch({}, callback); return watcher.close.bind(watcher); }); }); } /** * @private */ function addDevServerToEntryMapperCreator(devServerConfigFilepath) { return function (webpackConfig$) { return webpackConfig$.map(function (it) { if (it.webpackConfigFilepath === devServerConfigFilepath) { var _ret = (function () { var webpackConfig = it.webpackConfig; var devServer = webpackConfig.devServer; var inlineDevServerChunkList = [require.resolve("webpack-dev-server/client/") + ("?http://" + devServer.host + ":" + devServer.port), "webpack/hot/dev-server"]; return { v: _extends({}, it, { webpackConfig: _extends({}, webpackConfig, { reacthtmlpackDevServer: true, entry: _lodash2["default"].mapValues(webpackConfig.entry, function (filepathList) { return inlineDevServerChunkList.concat(filepathList); }), plugins: [].concat(_toConsumableArray(webpackConfig.plugins), [new _webpack2["default"].HotModuleReplacementPlugin()]) }) }) }; })(); if (typeof _ret === "object") return _ret.v; } else { return it; } }); }; } /** * @private */ function startDevServerWithMultiCompiler$ToChildrenStats$MapperCreator(devServerConfigFilepath) { return function (webpackCompiler$) { return webpackCompiler$.selectMany(function (webpackCompiler) { var _webpackCompiler$compilers$filter$map = webpackCompiler.compilers.filter(function (compiler) { return compiler.options.reacthtmlpackDevServer; }).map(function (compiler) { return compiler.options.devServer; }); var _webpackCompiler$compilers$filter$map2 = _slicedToArray(_webpackCompiler$compilers$filter$map, 1); var devServer = _webpackCompiler$compilers$filter$map2[0]; var wDS = new _webpackDevServer2["default"](webpackCompiler, devServer); return _rx.Observable.create(function (observer) { wDS.listen(devServer.port, devServer.host, function (err) { if (err) { observer.onError(err); } }); webpackCompiler.plugin("done", function (multiStats) { observer.onNext(_rx.Observable.fromArray(multiStats.stats).map(function (stats) { return { stats: stats, statsJson: stats.toJson() }; })); }); }); }); }; } // @package