UNPKG

52.7 kBJavaScriptView Raw
1'use strict';
2
3var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray');
4
5var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
6
7var _defineProperty2 = require('babel-runtime/helpers/defineProperty');
8
9var _defineProperty3 = _interopRequireDefault(_defineProperty2);
10
11var _objectWithoutProperties2 = require('babel-runtime/helpers/objectWithoutProperties');
12
13var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2);
14
15var _regenerator = require('babel-runtime/regenerator');
16
17var _regenerator2 = _interopRequireDefault(_regenerator);
18
19var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator');
20
21var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);
22
23var _extends2 = require('babel-runtime/helpers/extends');
24
25var _extends3 = _interopRequireDefault(_extends2);
26
27var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
28
29var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
30
31var _createClass2 = require('babel-runtime/helpers/createClass');
32
33var _createClass3 = _interopRequireDefault(_createClass2);
34
35var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
36
37var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
38
39var _inherits2 = require('babel-runtime/helpers/inherits');
40
41var _inherits3 = _interopRequireDefault(_inherits2);
42
43var _class, _temp;
44// import createGlobalRequire from './lib/utils/createGlobalRequire'
45
46
47var _events = require('events');
48
49var _mkdirp = require('mkdirp');
50
51var _path = require('path');
52
53var _path2 = _interopRequireDefault(_path);
54
55var _webpackServer = require('./lib/webpack-server');
56
57var _webpackServer2 = _interopRequireDefault(_webpackServer);
58
59var _webpack = require('webpack');
60
61var _webpack2 = _interopRequireDefault(_webpack);
62
63var _build2 = require('./lib/webpack-server/build');
64
65var _build3 = _interopRequireDefault(_build2);
66
67var _fs = require('./lib/utils/fs');
68
69var _fs2 = _interopRequireDefault(_fs);
70
71var _Error = require('./lib/utils/Error');
72
73var _Error2 = _interopRequireDefault(_Error);
74
75var _arrayAppendAssign = require('./lib/utils/array-append-assign');
76
77var _arrayAppendAssign2 = _interopRequireDefault(_arrayAppendAssign);
78
79var _utils = require('./lib/utils');
80
81var _context7 = require('./lib/utils/context');
82
83var _console = require('./lib/utils/console');
84
85var _console2 = _interopRequireDefault(_console);
86
87var _resolvePath = require('./lib/utils/resolve-path');
88
89var _resolvePath2 = _interopRequireDefault(_resolvePath);
90
91var _filesToTree = require('./lib/utils/files-to-tree');
92
93var _filesToTree2 = _interopRequireDefault(_filesToTree);
94
95var _seoHelper = require('./lib/utils/seo-helper');
96
97var _each = require('./lib/utils/each');
98
99var _each2 = _interopRequireDefault(_each);
100
101var _parseQuery = require('./lib/utils/parse-query');
102
103var _parseQuery2 = _interopRequireDefault(_parseQuery);
104
105var _ruleMatch = require('./lib/utils/rule-match');
106
107var _ruleMatch2 = _interopRequireDefault(_ruleMatch);
108
109var _chcwdFlow = require('./lib/utils/chcwd-flow');
110
111var _chcwdFlow2 = _interopRequireDefault(_chcwdFlow);
112
113var _arrayUnique = require('./lib/utils/array-unique');
114
115var _arrayUnique2 = _interopRequireDefault(_arrayUnique);
116
117var _boss = require('./lib/loaders/common/boss');
118
119var _boss2 = _interopRequireDefault(_boss);
120
121var _summaryGenerator = require('./lib/loaders/data-loader/summary-generator');
122
123var _summaryGenerator2 = _interopRequireDefault(_summaryGenerator);
124
125var _ssr = require('./lib/utils/ssr');
126
127var _ssr2 = _interopRequireDefault(_ssr);
128
129var _checkThemeConfigFile = require('./lib/utils/check-theme-config-file');
130
131var _checkThemeConfigFile2 = _interopRequireDefault(_checkThemeConfigFile);
132
133var _externalExports = require('./lib/utils/externalExports');
134
135var _externalExports2 = _interopRequireDefault(_externalExports);
136
137var _overwriteRequire = require('./lib/utils/overwrite-require');
138
139var over = _interopRequireWildcard(_overwriteRequire);
140
141var _context8 = require('./lib/context');
142
143var _context9 = _interopRequireDefault(_context8);
144
145var _defaultConfig = require('./lib/default-config');
146
147var _chokidar = require('chokidar');
148
149var _chokidar2 = _interopRequireDefault(_chokidar);
150
151var _propTypes = require('prop-types');
152
153var _propTypes2 = _interopRequireDefault(_propTypes);
154
155var _url = require('url');
156
157var _url2 = _interopRequireDefault(_url);
158
159var _chalk = require('chalk');
160
161var _chalk2 = _interopRequireDefault(_chalk);
162
163function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
164
165function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
166
167var isDebug = !!process.env.PICIDAE_DEBUG;
168// const require = createGlobalRequire(__dirname)
169
170process.on('uncaughtException', _console2.default.error);
171process.on('unhandledRejection', function (err) {
172 throw err;
173});
174over.register();
175
176function _webpackConfigGetter() {
177 var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
178
179 // console.log(config.module.loaders)
180 return config;
181}
182
183function looseRoutesMap() {
184 var map = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
185
186 Object.keys(map).forEach(function (key) {
187 map[key.replace(/^\/+/, '').replace(/\/+$/, '')] = map[key];
188 });
189 return map;
190}
191
192function generateEntry(fileTree) {
193 var routesMap = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
194
195 if (typeof routesMap !== 'function') {
196 routesMap = looseRoutesMap(routesMap);
197 }
198
199 // console.log(routesMap);
200 function replace(pathname) {
201 if (typeof routesMap === 'function') {
202 return routesMap(pathname) || pathname;
203 }
204
205 var matched = false;
206 return pathname.split('/').map(function (chunk) {
207 // console.log(chunk);
208 if (!matched) {
209 if (routesMap[chunk]) {
210 matched = true;
211 }
212 return typeof routesMap[chunk] === 'string' ? routesMap[chunk] : chunk;
213 } else {
214 return chunk;
215 }
216 }).join('/').replace(/\/\//, '/');
217 }
218
219 function generateKey() {
220 var container = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
221 var key = arguments[1];
222
223 var id = 1;
224 var newKey = key;
225 while (newKey in container) {
226 newKey = key + '-' + id++;
227 }
228 return newKey;
229 }
230
231 function generateEntryInner(root, fileTree) {
232 var container = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
233
234 if (fileTree.files) {
235 fileTree.files.forEach(function (ent) {
236 generateEntryInner(_path2.default.join(root, ent.file), ent, container);
237 });
238 } else {
239 var key = replace(root.substring(outRoot.length + 1)).replace(/\.(md|markdown)$/i, '');
240 // if (nps.basename(key) === 'index') {
241 // // `api/index` -> 'api/'
242 // key = key.replace(/\/index\s*$/, '/');
243 // }
244 container[generateKey(container, key)] = {
245 path: root,
246 lastmod: fileTree.lastmod
247 };
248 }
249 return container;
250 }
251
252 var outRoot = fileTree.file;
253 /*.replace(/\..*$/, '');*/
254 return generateEntryInner(fileTree.file, fileTree);
255}
256
257function assignOption(opts) {
258 return (0, _arrayAppendAssign2.default)({}, _defaultConfig.value, opts);
259}
260
261var Picidae = (_temp = _class = function (_EventEmitter) {
262 (0, _inherits3.default)(Picidae, _EventEmitter);
263
264 function Picidae(opts) {
265 (0, _classCallCheck3.default)(this, Picidae);
266
267 var _this = (0, _possibleConstructorReturn3.default)(this, (Picidae.__proto__ || Object.getPrototypeOf(Picidae)).call(this));
268
269 _context9.default.__init({ picidae: _this });
270
271 _propTypes2.default.checkPropTypes(_defaultConfig.type, opts, 'config', 'Picidae Configuration');
272
273 _this.opts = assignOption(opts);
274 _this.id = _this.opts.id || 'ID';
275
276 // process.stdout.write(chalk.yellow(logoText));
277 _this.tmpPath = _path2.default.join(_context7.tmpPath); //, '..', require('md5')(Date.now()).substr(0, 15))
278 (0, _mkdirp.sync)(_this.tmpPath);
279 var entryFile = _path2.default.join(_this.tmpPath, 'entry.' + _this.id + '.js');
280 var tmpThemeDataPath = _path2.default.join(_this.tmpPath, 'theme-data.' + _this.id + '.js');
281 var tplHtmlPath = _path2.default.join(_context7.templatePath, 'template.html');
282 var customTplHtmlPath = _path2.default.join(_this.opts.templateRoot, 'index.html');
283 (0, _mkdirp.sync)(_this.opts.templateRoot);
284
285 !_fs2.default.existsSync(customTplHtmlPath) && _fs2.default.copySync(tplHtmlPath, customTplHtmlPath);
286
287 _this.htmlTempate = customTplHtmlPath;
288 _this.themeDataPath = tmpThemeDataPath;
289 _this.docPath = _path2.default.resolve(_this.opts.docRoot);
290 _this.distRoot = _path2.default.resolve(_this.opts.distRoot);
291
292 // initial webpackServer
293 _this.wpServer = new _webpackServer2.default((0, _extends3.default)({}, _this.opts, {
294 static: _path2.default.resolve(_this.opts.extraRoot),
295 dev: _this.opts.watch,
296 webpackConfigGetter: function webpackConfigGetter(config) {
297 config.entry = (0, _extends3.default)({}, config.entry, {
298 PICIDAE_ENTRY: entryFile
299 // ...generateEntry(tree)
300 });
301 config.output.publicPath = _this.opts.publicPath || config.output.publicPath;
302 config.output.path = _this.distRoot;
303
304 if (_this.opts.webpackConfigUpdater) {
305 config = _this.opts.webpackConfigUpdater(config, require('webpack'));
306 }
307 config = _webpackConfigGetter(config);
308 return config;
309 }
310 }));
311
312 _this.opts.transformers = _this.opts.transformers || [];
313
314 function getTransformers(transformers, suffix) {
315 transformers = transformers.map(function (str, index) {
316 var pureName = str.replace(/\?.*?$/, '');
317 var moduleName = _parseQuery2.default.autoPrefix(pureName, 'picidae-transformer-');
318 var modulePath = '';
319 if (suffix === 'node.js') {
320 try {
321 return (0, _extends3.default)({}, (0, _parseQuery2.default)(str), {
322 path: require.resolve(_resolvePath2.default.isNodeModule(str) ? str : _path2.default.resolve(str)),
323 index: index
324 });
325 } catch (ex) {
326 if (ex.code !== 'MODULE_NOT_FOUND') {
327 _console2.default.error(ex);
328 }
329 }
330 }
331 try {
332 var name = _parseQuery2.default.injectJoin(moduleName, suffix);
333 modulePath = (0, _resolvePath2.default)(name);
334
335 if (!_fs2.default.isFile(modulePath)) {
336 return false;
337 }
338 } catch (ex) {
339 if (ex.code === 'MODULE_NOT_FOUND') {
340 isDebug && _console2.default.warn('`' + moduleName + '/' + suffix + '` transformer is not found.');
341 } else {
342 _console2.default.error(ex);
343 }
344 return false;
345 }
346
347 return (0, _extends3.default)({}, (0, _parseQuery2.default)(_parseQuery2.default.injectJoin(str, suffix), 'picidae-transformer-', { allowNotExists: true }), {
348 index: index
349 });
350 }).filter(Boolean);
351
352 var map = {};
353 var uniques = [];
354 transformers.forEach(function (t) {
355 if (!map[t.path]) {
356 uniques.push(t);
357 }
358 map[t.path] = true;
359 });
360 return uniques;
361 }
362
363 var transformers = _this.opts.transformers.slice();
364 transformers = [_path2.default.join(__dirname, 'transformers', 'img-loader')].concat(transformers);
365 _this.nodeTransformers = getTransformers(transformers, 'node.js');
366 (0, _externalExports2.default)(_this.nodeTransformers, transformers);
367 _this.nodeTransformers = getTransformers(transformers, 'node.js');
368 _this.browserTransformers = getTransformers(transformers, 'browser.js');
369
370 if (isDebug) {
371 _console2.default.debug('nodeTransformers', _this.nodeTransformers);
372 _console2.default.debug('browserTransformers', _this.browserTransformers);
373 }
374
375 _this.watchTheme().then(function () {
376 return _this.watchSummary();
377 });
378
379 // Write Files for Webpack
380 (0, _utils.renderTemplate)(_path2.default.join(_context7.templatePath, 'entry.template.js'), {
381 root: _this.opts.publicPath,
382 themeDataPath: _resolvePath2.default.toUriPath(tmpThemeDataPath),
383 dataSuffix: _this.id,
384 sw: !_this.opts.noSw
385 }, entryFile);
386
387 return _this;
388 }
389
390 (0, _createClass3.default)(Picidae, [{
391 key: 'generateSummary',
392 value: function () {
393 var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee() {
394 var _this2 = this;
395
396 var plugins = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.initialThemeConfig().plugins;
397 var tree, opt, result, str, lazyresult;
398 return _regenerator2.default.wrap(function _callee$(_context) {
399 while (1) {
400 switch (_context.prev = _context.next) {
401 case 0:
402 this.summaryPath = _path2.default.join(this.tmpPath, 'data.' + this.id + '.js');
403 this.summarySSrPath = _path2.default.join(this.tmpPath, 'data.' + this.id + '.ssr.js');
404 tree = (0, _filesToTree2.default)(this.docPath, function (filename) {
405 return (0, _utils.fileIsMarkdown)(filename) && !(0, _ruleMatch2.default)(_this2.opts.excludes, filename);
406 });
407
408 this.docsEntityEntry = generateEntry(tree, this.routesMap);
409
410 this.docsEntry = {};
411 (0, _each2.default)(this.docsEntityEntry, function (_ref2, key, index, data) {
412 var path = _ref2.path;
413
414 _this2.docsEntry[key] = path;
415 });
416
417 opt = {
418 plugins: plugins,
419 transformers: this.browserTransformers,
420 nodeTransformers: this.nodeTransformers,
421 picker: this.opts.picker || function (a) {
422 return a;
423 },
424 docRoot: this.docPath
425 };
426
427 if (!this.opts.ssr) {
428 _context.next = 13;
429 break;
430 }
431
432 _context.next = 10;
433 return (0, _summaryGenerator2.default)(this.docsEntry, opt, false);
434
435 case 10:
436 result = _context.sent;
437 str = _fs2.default.readFileSync(_path2.default.join(_context7.templatePath, 'data-ssr.template.js')).toString();
438
439 _fs2.default.writeFileSync(this.summarySSrPath, str + '\nmodule.exports = ' + result);
440
441 case 13:
442 _context.next = 15;
443 return (0, _summaryGenerator2.default)(this.docsEntry, opt, true);
444
445 case 15:
446 lazyresult = _context.sent;
447
448
449 // console.log(`\`${nps.resolve(process.cwd(), this.summaryPath)}\` Updated.`)
450 _fs2.default.writeFileSync(this.summaryPath, 'module.exports = ' + lazyresult);
451
452 case 17:
453 case 'end':
454 return _context.stop();
455 }
456 }
457 }, _callee, this);
458 }));
459
460 function generateSummary() {
461 return _ref.apply(this, arguments);
462 }
463
464 return generateSummary;
465 }()
466 }, {
467 key: 'watchSummary',
468 value: function watchSummary() {
469 var _this3 = this;
470
471 if (this.opts.watch) {
472 this.summaryLock = false;
473 this.summaryWatcher = _chokidar2.default.watch(this.docPath, { ignoreInitial: true });
474 this.summaryWatcher.on('all', function () {
475 var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(event, path) {
476 return _regenerator2.default.wrap(function _callee2$(_context2) {
477 while (1) {
478 switch (_context2.prev = _context2.next) {
479 case 0:
480 if (!(0, _ruleMatch2.default)(_this3.opts.hotReloadTests, path)) {
481 _context2.next = 11;
482 break;
483 }
484
485 _console2.default.log('Detect File ' + event + ' :', _path2.default.relative(_this3.docPath, path));
486 _context2.prev = 2;
487 _context2.next = 5;
488 return _this3.generateSummary();
489
490 case 5:
491 _context2.next = 10;
492 break;
493
494 case 7:
495 _context2.prev = 7;
496 _context2.t0 = _context2['catch'](2);
497
498 _console2.default.error(_context2.t0);
499
500 case 10:
501 _this3.summaryLock = true;
502
503 case 11:
504 case 'end':
505 return _context2.stop();
506 }
507 }
508 }, _callee2, _this3, [[2, 7]]);
509 }));
510
511 return function (_x7, _x8) {
512 return _ref3.apply(this, arguments);
513 };
514 }());
515 }
516 }
517 }, {
518 key: 'watchTheme',
519 value: function () {
520 var _ref4 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3() {
521 var _this4 = this;
522
523 var _initialThemeConfig, themeConfigFiles, root, notFound, routes, themeConfig, plugins, _themeConfig$routesMa, routesMap, config;
524
525 return _regenerator2.default.wrap(function _callee3$(_context3) {
526 while (1) {
527 switch (_context3.prev = _context3.next) {
528 case 0:
529 _initialThemeConfig = this.initialThemeConfig(), themeConfigFiles = _initialThemeConfig.themeConfigFiles, root = _initialThemeConfig.root, notFound = _initialThemeConfig.notFound, routes = _initialThemeConfig.routes, themeConfig = _initialThemeConfig.themeConfig, plugins = _initialThemeConfig.plugins;
530
531
532 try {
533 delete require.cache[require.resolve(this.themeDataPath)];
534 } catch (ex) {}
535
536 // initial Watcher
537 if (this.opts.watch && themeConfigFiles.length) {
538 this.themeWatcher = _chokidar2.default.watch(themeConfigFiles, { persistent: true, ignoreInitial: true });
539 this.themeWatcher.on('all', function (event, path, stat) {
540 _console2.default.log(path, ':', event);
541 _this4.themeWatcher.close();
542 _this4.themeWatcher = null;
543 _this4.watchTheme();
544 });
545 }
546
547 // Write Routes/ThemeConfig to file
548 _themeConfig$routesMa = themeConfig.routesMap, routesMap = _themeConfig$routesMa === undefined ? {} : _themeConfig$routesMa, config = (0, _objectWithoutProperties3.default)(themeConfig, ['routesMap']);
549
550 this.routesMap = routesMap;
551 (0, _utils.renderTemplate)(_path2.default.join(_context7.templatePath, 'commonjs.template.js'), { body: JSON.stringify({ root: _resolvePath2.default.toUriPath(root), notFound: notFound, routes: routes, themeConfig: config }) }, this.themeDataPath);
552
553 this.opts.ssr && (0, _utils.renderTemplate)(_path2.default.join(_context7.templatePath, 'routes-generator.template.js'), { root: _resolvePath2.default.toUriPath(root), /*routesMap: JSON.stringify(routesMap), */dataSuffix: this.id + '.ssr' }, _path2.default.join(this.tmpPath, 'routes-generator.' + this.id + '.ssr.js'));
554
555 (0, _utils.renderTemplate)(_path2.default.join(_context7.templatePath, 'routes-generator.template.js'), { root: _resolvePath2.default.toUriPath(root), /*routesMap: JSON.stringify(routesMap), */dataSuffix: this.id }, _path2.default.join(this.tmpPath, 'routes-generator.' + this.id + '.js'));
556 _context3.prev = 8;
557 _context3.next = 11;
558 return this.generateSummary(plugins);
559
560 case 11:
561 _context3.next = 17;
562 break;
563
564 case 13:
565 _context3.prev = 13;
566 _context3.t0 = _context3['catch'](8);
567
568 _console2.default.error(_context3.t0);
569 return _context3.abrupt('return');
570
571 case 17:
572 case 'end':
573 return _context3.stop();
574 }
575 }
576 }, _callee3, this, [[8, 13]]);
577 }));
578
579 function watchTheme() {
580 return _ref4.apply(this, arguments);
581 }
582
583 return watchTheme;
584 }()
585 }, {
586 key: 'clearTmp',
587 value: function clearTmp() {
588 !isDebug && require('del').sync([_path2.default.join(this.tmpPath, '*' + this.id + '*')], { force: true });
589 }
590 }, {
591 key: 'build',
592 value: function build(callback) {
593 var _this5 = this;
594
595 _console2.default.log(_chalk2.default.green('Building...'));
596 if (this.opts.force) {
597 _console2.default.log(_chalk2.default.red(' FORCE Mode is OPEN'));
598 require('del').sync([_path2.default.join(this.distRoot, '*'), '!' + _path2.default.join(this.distRoot, '.git')], { force: true });
599 }
600 if (!this.opts.ssr) {
601 _console2.default.log(_chalk2.default.red(' SSR Mode is CLOSED'));
602 }
603 if (!this.opts.noSpider) {
604 _console2.default.log(_chalk2.default.green(' Spider Mode is OPEN'));
605 }
606
607 var webpackConfig = this.wpServer.getWebpackConfig();
608 if (this.opts.sourceMap) {
609 webpackConfig.devtool = 'source-map';
610 }
611 (0, _build3.default)(webpackConfig, function () {
612 _console2.default.log(_chalk2.default.green('\n Webpack Build successfully.') + '\n');
613
614 // let
615 var ssrWebpackConfig = webpackConfig;
616 var ssrEntryName = 'node-routes-generator.' + _this5.id;
617 var ssrEntryPath = _path2.default.join(_this5.tmpPath, 'routes-generator.' + _this5.id + '.ssr.js');
618 ssrWebpackConfig.devtool = null;
619 ssrWebpackConfig.entry = (0, _defineProperty3.default)({}, ssrEntryName, [ssrEntryPath]);
620 ssrWebpackConfig.target = 'node';
621 // // https://github.com/webpack/webpack/issues/1599
622 // ssrWebpackConfig.node = {
623 // __dirname: false,
624 // __filename: false
625 // };
626 ssrWebpackConfig.output = Object.assign({}, ssrWebpackConfig.output, {
627 path: _this5.tmpPath,
628 library: 'ssr',
629 libraryTarget: 'commonjs'
630 });
631
632 var ignorePluginsType = isDebug ? [_webpack2.default.optimize.CommonsChunkPlugin, _webpack2.default.DefinePlugin, _webpack2.default.optimize.UglifyJsPlugin] : [_webpack2.default.optimize.CommonsChunkPlugin, _webpack2.default.optimize.UglifyJsPlugin];
633
634 ssrWebpackConfig.plugins = ssrWebpackConfig.plugins.filter(function (plugin) {
635 return ignorePluginsType.findIndex(function (Type) {
636 return plugin instanceof Type;
637 }) < 0;
638 });
639
640 if (isDebug) {
641 ssrWebpackConfig.debug = true;
642 ssrWebpackConfig.plugins.push(new _webpack2.default.DefinePlugin({
643 'process.env.NODE_ENV': '"development"'
644 }));
645 }
646
647 var themeSSR = null;
648 try {
649 _this5.themeSSRPath = (0, _resolvePath2.default)(_this5.themeSSRPath);
650 themeSSR = require(_this5.themeSSRPath);
651 _console2.default.log('Found ssr module of theme:\n ', _path2.default.relative(process.cwd(), _this5.themeSSRPath));
652 } catch (ex) {
653 if (ex.code !== 'MODULE_NOT_FOUND') {
654 _console2.default.error(ex);
655 }
656 _this5.themeSSRPath = null;
657 }
658
659 ssrWebpackConfig.externals = ssrWebpackConfig.externals || [];
660 if (!Array.isArray(ssrWebpackConfig.externals)) {
661 ssrWebpackConfig.externals = [ssrWebpackConfig.externals];
662 }
663
664 var configExternals = ssrWebpackConfig.externals;
665 configExternals.push([function (context, request, callback) {
666 if (/^\s*picidae-/.test(request)) {
667 return callback();
668 }
669 if (/^\s*!/.test(request)) {
670 return callback();
671 }
672 if (_resolvePath2.default.isNodeModule(request)) {
673 // external!
674 return callback(null, 'commonjs ' + request);
675 }
676 return callback();
677 }]);
678
679 var externals = themeSSR && themeSSR.externals;
680 if (externals) {
681 configExternals.push(externals);
682
683 if (isDebug) {
684 _console2.default.debug('webpack.externals', ssrWebpackConfig.externals);
685 } else {
686 _console2.default.log('theme ssr\'s externals: ', externals);
687 }
688 }
689
690 if (typeof _this5.opts.ssrWebpackConfigUpdater === 'function') {
691 ssrWebpackConfig = _this5.opts.ssrWebpackConfigUpdater(ssrWebpackConfig);
692 }
693
694 var themeNodeModulePath = _path2.default.join(_path2.default.dirname(_this5.themePath), 'node_modules');
695 if (!!ssrWebpackConfig.resolve && !!ssrWebpackConfig.resolve.root) {
696 if (!Array.isArray(ssrWebpackConfig.resolve.root)) {
697 ssrWebpackConfig.resolve.root = [ssrWebpackConfig.resolve.root];
698 }
699 !ssrWebpackConfig.resolve.root.includes(themeNodeModulePath) && ssrWebpackConfig.resolve.root.push(themeNodeModulePath);
700 }
701 if (!!ssrWebpackConfig.resolveLoader && !!ssrWebpackConfig.resolveLoader.root) {
702 if (!Array.isArray(ssrWebpackConfig.resolveLoader.root)) {
703 ssrWebpackConfig.resolveLoader.root = [ssrWebpackConfig.resolveLoader.root];
704 }
705 !ssrWebpackConfig.resolveLoader.root.includes(themeNodeModulePath) && ssrWebpackConfig.resolveLoader.root.push(themeNodeModulePath);
706 }
707
708 var buildMethod = _this5.opts.ssr ? _build3.default : function (config, callback) {
709 return callback(null);
710 };
711 buildMethod(ssrWebpackConfig, function () {
712 var _pool;
713
714 var routes = require(_this5.themeDataPath).routes;
715 var method = function method(url, callback) {
716 return callback('');
717 };
718 var sitemap = require('./lib/utils/sitemap-generator');
719 if (_this5.opts.ssr) {
720 over.logout();
721 over.register(_this5.themeSSRPath || void 0);
722 var gen = require(_path2.default.join(_this5.tmpPath, ssrEntryName)).ssr;
723 routes = gen(require(_this5.themeDataPath));
724 method = (0, _ssr2.default)(routes, false, _this5.opts.publicPath);
725 }
726
727 var methodProm = function methodProm(path) {
728 return new Promise(function (resolve, reject) {
729 method(path, function (content, props) {
730 if (content == null) {
731 resolve();
732 }
733 resolve(content);
734 });
735 });
736 };
737
738 var sites = sitemap(routes, _this5.docsEntry);
739 var tpl = _fs2.default.readFileSync(_this5.htmlTempate).toString();
740
741 var pool = [];
742 (_pool = pool).push.apply(_pool, (0, _toConsumableArray3.default)(sites));
743
744 var count = 1;
745
746 function logPath(path) {
747 count++;
748 _console2.default.log(_chalk2.default.green(' `' + _path2.default.relative(process.cwd(), path) + '`'), 'File Created successfully.');
749 }
750
751 var createProm = function createProm(sites, ctxData) {
752 var opt = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
753 var publicPath = ctxData.publicPath,
754 dirRoot = ctxData.dirRoot,
755 templateData = ctxData.templateData;
756 var _opt$noSpider = opt.noSpider,
757 noSpider = _opt$noSpider === undefined ? false : _opt$noSpider;
758
759
760 return Promise.all(sites.map(function (_ref5) {
761 var path = _ref5.path,
762 html = _ref5.html;
763
764 var absoluteHtml = _path2.default.join(dirRoot, html.replace(/^\/+/, ''));
765 (0, _mkdirp.sync)(_path2.default.dirname(absoluteHtml));
766 return new Promise(function (resolve, reject) {
767 method('/' + path.replace(/^\/+/, ''), function () {
768 var _ref6 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee4(content, renderProps) {
769 var opts, inputArg, themeTemplateData, actualTemplateData;
770 return _regenerator2.default.wrap(function _callee4$(_context4) {
771 while (1) {
772 switch (_context4.prev = _context4.next) {
773 case 0:
774 if (content == null) {
775 resolve();
776 } else {
777 opts = { path: absoluteHtml, pathname: path, spider: true
778 // try {
779 };
780 inputArg = (0, _extends3.default)({}, renderProps);
781 themeTemplateData = null;
782
783 if (themeSSR && typeof themeSSR === 'function') {
784 themeTemplateData = themeSSR(inputArg);
785 }
786 actualTemplateData = typeof templateData === 'function' ? templateData(inputArg, 'prod') : templateData;
787
788 actualTemplateData = (0, _extends3.default)({}, actualTemplateData) || {};
789 actualTemplateData.themeData = themeTemplateData || {};
790 _boss2.default.queue({
791 type: 'renderHtml',
792 args: [tpl, (0, _extends3.default)({ content: content, root: publicPath }, actualTemplateData), opts],
793 callback: function callback(err, obj) {
794 if (err || !obj) resolve();else {
795 logPath(obj.path);
796 if (!noSpider) {
797 var newSites = obj.hrefList.map(function (href) {
798 if (href.startsWith(publicPath)) {
799 href = href.substring(publicPath.length);
800 href = href.startsWith('/') ? href : '/' + href;
801 }
802 return href;
803 }).filter(function (href) {
804 return !pool.find(function (x) {
805 return x.path === decodeURIComponent(href);
806 });
807 });
808 newSites = newSites.map(sitemap.transform);
809 if (newSites && newSites.length) {
810 _console2.default.log(path, '->', newSites);
811 pool = pool.concat(newSites);
812 resolve(createProm(newSites, ctxData, { noSpider: noSpider }));
813 return;
814 }
815 }
816 resolve(obj.path);
817 }
818 }
819 });
820 }
821
822 case 1:
823 case 'end':
824 return _context4.stop();
825 }
826 }
827 }, _callee4, _this5);
828 }));
829
830 return function (_x10, _x11) {
831 return _ref6.apply(this, arguments);
832 };
833 }());
834 }).catch(_console2.default.error);
835 }));
836 };
837
838 var ctxData = {
839 dirRoot: _this5.distRoot,
840 publicPath: _this5.opts.publicPath,
841 templateData: _this5.opts.templateData
842 };
843 createProm(sites, ctxData, { noSpider: _this5.opts.noSpider }).then((0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee5() {
844 var src, target, _sites, host, sitemapText, robotsText, writeFile;
845
846 return _regenerator2.default.wrap(function _callee5$(_context5) {
847 while (1) {
848 switch (_context5.prev = _context5.next) {
849 case 0:
850 over.logout();
851 _boss2.default.jobDone();
852 src = _path2.default.resolve(_this5.opts.extraRoot);
853 target = _path2.default.join(_this5.distRoot);
854
855
856 _console2.default.log('');
857 _console2.default.log(_chalk2.default.green(' ' + count), 'Files Created successfully\n');
858
859 // precache services-worker.js
860
861 if (_this5.opts.noSw) {
862 _context5.next = 9;
863 break;
864 }
865
866 _context5.next = 9;
867 return require('sw-precache').write(_path2.default.join(_this5.distRoot, 'service-worker.js'), {
868 staticFileGlobs: [_path2.default.join(_this5.distRoot, '/**/*.{js,html,css,png,jpg,gif,svg,eot,ttf,woff}')],
869 stripPrefix: _this5.distRoot,
870 navigateFallback: _path2.default.join(_this5.opts.publicPath, 'index.html'),
871 replacePrefix: _this5.opts.publicPath.replace(/\/+$/, ''),
872 templateFilePath: _path2.default.join(_context7.templatePath, 'service-worker.tmpl'),
873 logger: function logger(message) {
874 _console2.default.log(message);
875 },
876 maximumFileSizeToCacheInBytes: 4194304 // 4MB
877 });
878
879 case 9:
880
881 if (_this5.opts.ssr && _this5.opts.host) {
882 if (_this5.docsEntityEntry['index']) {
883 _this5.docsEntityEntry[''] = _this5.docsEntityEntry['index'];
884 delete _this5.docsEntityEntry['index'];
885 }
886 _sites = [];
887
888 (0, _each2.default)(_this5.docsEntityEntry, function (val, key) {
889 _sites.push({
890 loc: key,
891 lastmod: val.lastmod
892 });
893 });
894
895 host = _url2.default.resolve(_this5.opts.host, _this5.opts.publicPath);
896
897 _sites = (0, _arrayUnique2.default)(_sites.concat(pool.filter(function (_ref8) {
898 var path = _ref8.path;
899 return path !== 'NOT_FOUND_PAGE';
900 }).map(function (_ref9) {
901 var path = _ref9.path;
902 return path.replace(/^\/*/, '');
903 })), function (obj) {
904 return typeof obj === 'string' ? obj : obj.loc;
905 });
906 sitemapText = (0, _seoHelper.toSitemap)({ host: host, minify: true, sites: _sites });
907 robotsText = (0, _seoHelper.toRobots)(host);
908
909 writeFile = function writeFile(filename, data, logText) {
910 _fs2.default.writeFileSync(filename, data);
911 _console2.default.log(_chalk2.default.cyan(logText), 'File Created');
912 };
913
914 writeFile(_path2.default.join(_this5.distRoot, 'robots.txt'), robotsText, 'robots.txt');
915 writeFile(_path2.default.join(_this5.distRoot, 'sitemap.xml'), sitemapText, 'sitemap.xml');
916 }
917
918 if (_fs2.default.existsSync(src) && _fs2.default.statSync(src).isDirectory()) {
919 _console2.default.log(_chalk2.default.green(' Copying Extra Directory'));
920 (0, _mkdirp.sync)(target);
921 require('copy-dir').sync(src, target);
922 }
923
924 _console2.default.log(_chalk2.default.green(' Done! :P'));
925 callback && callback();
926
927 case 13:
928 case 'end':
929 return _context5.stop();
930 }
931 }
932 }, _callee5, _this5);
933 }))).catch(_console2.default.error);
934 });
935 });
936 }
937 }, {
938 key: 'initialThemeConfig',
939 value: function initialThemeConfig() {
940 var theme = _parseQuery2.default.autoPrefix(this.opts.theme, 'picidae-theme-');
941 var themeKey = _resolvePath2.default.isNodeModule(this.opts.theme) ? theme : 'default';
942 var themePath = this.themePath = _resolvePath2.default.isNodeModule(this.opts.theme) ? (0, _resolvePath2.default)(theme) : _path2.default.join((0, _resolvePath2.default)(this.opts.theme), 'index.js');
943 this.themeSSRPath = _resolvePath2.default.isNodeModule(theme) ? _parseQuery2.default.injectJoin(theme, 'ssr.js') : _parseQuery2.default.injectJoin(theme, 'ssr.js');
944
945 var themeConfigsRoot = _path2.default.resolve(this.opts.themeConfigsRoot);
946 var themeConfigFile = _path2.default.join(themeConfigsRoot, themeKey);
947 var themeConfigFiles = [themePath, themeConfigFile];
948
949 if (this.opts.watch) {
950 try {
951 delete require.cache[require.resolve(themePath)];
952 delete require.cache[require.resolve(themeConfigFile)];
953 } catch (ex) {}
954 }
955
956 var themeConfigOrigin = require(themePath).default || require(themePath);
957 (0, _checkThemeConfigFile2.default)(themeConfigOrigin);
958 var root = themeConfigOrigin.root,
959 routes = themeConfigOrigin.routes,
960 notFound = themeConfigOrigin.notFound,
961 picker = themeConfigOrigin.picker,
962 _themeConfigOrigin$co = themeConfigOrigin.config,
963 themeConfig = _themeConfigOrigin$co === undefined ? {} : _themeConfigOrigin$co,
964 _themeConfigOrigin$pl = themeConfigOrigin.plugins,
965 plugins = _themeConfigOrigin$pl === undefined ? [] : _themeConfigOrigin$pl;
966
967
968 (0, _chcwdFlow2.default)(_path2.default.dirname(themePath), function () {
969 plugins = ['utils'].concat(plugins);
970 plugins = plugins.map(function (f) {
971 return (0, _parseQuery2.default)(f, 'picidae-plugin-');
972 });
973 root = _path2.default.resolve(root);
974 });
975
976 this.opts.picker = picker;
977
978 var found = false;
979 try {
980 themeConfigFile = require.resolve(themeConfigFile);
981 found = true;
982 } catch (ex) {
983 themeConfigFile = themePath;
984 }
985 if (found) {
986 themeConfig = require(themeConfigFile);
987 }
988 _console2.default.log(_chalk2.default.gray('Theme Configuration In File: '));
989 _console2.default.log(' ', _chalk2.default.green(_path2.default.relative(process.cwd(), require.resolve(themeConfigFile))));
990
991 this.opts.themeConfig = themeConfig;
992
993 themeConfigFiles = themeConfigFiles.map(function (x) {
994 try {
995 return require.resolve(x);
996 } catch (ex) {
997 return false;
998 }
999 }).filter(Boolean);
1000
1001 return {
1002 themeConfigFiles: themeConfigFiles,
1003 root: root,
1004 notFound: notFound,
1005 routes: routes,
1006 themeConfig: themeConfig,
1007 plugins: plugins
1008 };
1009 }
1010 }, {
1011 key: 'start',
1012 value: function start(callback) {
1013 var _this6 = this;
1014
1015 if (this.opts.ssr) {
1016 _console2.default.log(_chalk2.default.underline.blue('Server Side Render Model is OPEN.'));
1017 }
1018
1019 this.wpServer.start(callback);
1020 if (typeof this.opts.expressSetup === 'function') {
1021 this.opts.expressSetup(this.wpServer.app);
1022 }
1023 this.wpServer.inject(function () {
1024 var _ref10 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee6(req, res) {
1025 var templateData, gen, routes;
1026 return _regenerator2.default.wrap(function _callee6$(_context6) {
1027 while (1) {
1028 switch (_context6.prev = _context6.next) {
1029 case 0:
1030 res.type('html');
1031
1032 templateData = _this6.opts.templateData || {};
1033
1034 if (!(typeof templateData === 'function')) {
1035 _context6.next = 8;
1036 break;
1037 }
1038
1039 _context6.next = 5;
1040 return templateData({}, 'dev');
1041
1042 case 5:
1043 _context6.t0 = _context6.sent;
1044 _context6.next = 9;
1045 break;
1046
1047 case 8:
1048 _context6.t0 = (0, _extends3.default)({}, templateData);
1049
1050 case 9:
1051 templateData = _context6.t0;
1052
1053 // Fake ThemeData
1054 templateData.themeData = {};
1055
1056 if (!_this6.opts.ssr) {
1057 _context6.next = 16;
1058 break;
1059 }
1060
1061 gen = require(_path2.default.join(_this6.tmpPath, 'routes-generator.' + _this6.id + '.ssr.js'));
1062 routes = gen(require(_this6.themeDataPath));
1063
1064 (0, _ssr2.default)(routes, true, _this6.opts.publicPath)(req.url, function (content) {
1065 res.send((0, _utils.renderTemplate)(_this6.htmlTempate, (0, _extends3.default)({
1066 content: content,
1067 root: _this6.opts.publicPath
1068 }, templateData)));
1069 });
1070 return _context6.abrupt('return');
1071
1072 case 16:
1073
1074 res.send((0, _utils.renderTemplate)(_this6.htmlTempate, (0, _extends3.default)({
1075 content: '',
1076 root: _this6.opts.publicPath
1077 }, templateData)));
1078
1079 case 17:
1080 case 'end':
1081 return _context6.stop();
1082 }
1083 }
1084 }, _callee6, _this6);
1085 }));
1086
1087 return function (_x12, _x13) {
1088 return _ref10.apply(this, arguments);
1089 };
1090 }());
1091 }
1092 }, {
1093 key: 'stop',
1094 value: function stop(callback) {
1095 if (!this.wpServer) {
1096 // throw new Error('WebpackServer is NOT running currently!')
1097 }
1098 this.clearTmp();
1099 this.themeWatcher && this.themeWatcher.close();
1100 this.themeWatcher = null;
1101 this.summaryWatcher && this.summaryWatcher.close();
1102 this.summaryWatcher = null;
1103 this.wpServer && this.wpServer.stop(callback);
1104 this.wpServer = null;
1105 }
1106 }]);
1107 return Picidae;
1108}(_events.EventEmitter), _class.assignOption = assignOption, _temp);
1109
1110
1111module.exports = Picidae;
\No newline at end of file