UNPKG

56.6 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 _context8 = 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 _context9 = require('./lib/context');
142
143var _context10 = _interopRequireDefault(_context9);
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 _context10.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(_context8.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(_context8.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
366 // recursively exports.use
367 var len = void 0;
368 do {
369 len = transformers.length;
370 _this.nodeTransformers = getTransformers(transformers, 'node.js');
371 (0, _externalExports2.default)(_this.nodeTransformers, transformers);
372 } while (transformers.length !== len);
373 _this.browserTransformers = getTransformers(transformers, 'browser.js');
374
375 if (isDebug) {
376 _console2.default.debug('nodeTransformers', _this.nodeTransformers);
377 _console2.default.debug('browserTransformers', _this.browserTransformers);
378 }
379
380 _this.watchTheme().then(function () {
381 return _this.watchSummary();
382 });
383
384 // Write Files for Webpack
385 (0, _utils.renderTemplate)(_path2.default.join(_context8.templatePath, 'entry.template.js'), {
386 root: _this.opts.publicPath,
387 themeDataPath: _resolvePath2.default.toUriPath(tmpThemeDataPath),
388 dataSuffix: _this.id,
389 sw: !_this.opts.noSw
390 }, entryFile);
391
392 return _this;
393 }
394
395 (0, _createClass3.default)(Picidae, [{
396 key: 'generateSummary',
397 value: function () {
398 var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee() {
399 var _this2 = this;
400
401 var plugins = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.initialThemeConfig().plugins;
402 var tree, opt, result, str, lazyresult;
403 return _regenerator2.default.wrap(function _callee$(_context) {
404 while (1) {
405 switch (_context.prev = _context.next) {
406 case 0:
407 this.summaryPath = _path2.default.join(this.tmpPath, 'data.' + this.id + '.js');
408 this.summarySSrPath = _path2.default.join(this.tmpPath, 'data.' + this.id + '.ssr.js');
409 tree = (0, _filesToTree2.default)(this.docPath, function (filename) {
410 return (0, _utils.fileIsMarkdown)(filename) && !(0, _ruleMatch2.default)(_this2.opts.excludes, filename);
411 });
412
413 this.docsEntityEntry = generateEntry(tree, this.routesMap);
414
415 this.docsEntry = {};
416 (0, _each2.default)(this.docsEntityEntry, function (_ref2, key, index, data) {
417 var path = _ref2.path;
418
419 _this2.docsEntry[key] = path;
420 });
421
422 opt = {
423 plugins: plugins,
424 transformers: this.browserTransformers,
425 nodeTransformers: this.nodeTransformers,
426 picker: this.opts.picker || function (a) {
427 return a;
428 },
429 docRoot: this.docPath
430 };
431
432 if (!this.opts.ssr) {
433 _context.next = 13;
434 break;
435 }
436
437 _context.next = 10;
438 return (0, _summaryGenerator2.default)(this.docsEntry, opt, false);
439
440 case 10:
441 result = _context.sent;
442 str = _fs2.default.readFileSync(_path2.default.join(_context8.templatePath, 'data-ssr.template.js')).toString();
443
444 _fs2.default.writeFileSync(this.summarySSrPath, str + '\nmodule.exports = ' + result);
445
446 case 13:
447 _context.next = 15;
448 return (0, _summaryGenerator2.default)(this.docsEntry, opt, true);
449
450 case 15:
451 lazyresult = _context.sent;
452
453
454 // console.log(`\`${nps.resolve(process.cwd(), this.summaryPath)}\` Updated.`)
455 _fs2.default.writeFileSync(this.summaryPath, 'module.exports = ' + lazyresult);
456
457 case 17:
458 case 'end':
459 return _context.stop();
460 }
461 }
462 }, _callee, this);
463 }));
464
465 function generateSummary() {
466 return _ref.apply(this, arguments);
467 }
468
469 return generateSummary;
470 }()
471 }, {
472 key: 'watchSummary',
473 value: function watchSummary() {
474 var _this3 = this;
475
476 if (this.opts.watch) {
477 this.summaryLock = false;
478 this.summaryWatcher = _chokidar2.default.watch(this.docPath, { ignoreInitial: true });
479
480 this.summaryWatcher.on('all', function () {
481 var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(event, path) {
482 var generateSummary;
483 return _regenerator2.default.wrap(function _callee3$(_context3) {
484 while (1) {
485 switch (_context3.prev = _context3.next) {
486 case 0:
487 // change
488 // add
489 // remove
490 // ...
491
492 // TODO
493 // this.docsEntry -> should fill assets firstly
494 generateSummary = function () {
495 var _ref4 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2() {
496 return _regenerator2.default.wrap(function _callee2$(_context2) {
497 while (1) {
498 switch (_context2.prev = _context2.next) {
499 case 0:
500 _context2.prev = 0;
501 _context2.next = 3;
502 return _this3.generateSummary();
503
504 case 3:
505 _context2.next = 8;
506 break;
507
508 case 5:
509 _context2.prev = 5;
510 _context2.t0 = _context2['catch'](0);
511
512 _console2.default.error(_context2.t0);
513
514 case 8:
515 case 'end':
516 return _context2.stop();
517 }
518 }
519 }, _callee2, _this3, [[0, 5]]);
520 }));
521
522 return function generateSummary() {
523 return _ref4.apply(this, arguments);
524 };
525 }();
526
527 if (!(0, _ruleMatch2.default)(_this3.opts.hotReloadTests, path)) {
528 _context3.next = 19;
529 break;
530 }
531
532 _console2.default.log('Detect File ' + event + ' :', _path2.default.relative(_this3.docPath, path));
533
534 if (!_this3.opts.quickHot) {
535 _context3.next = 17;
536 break;
537 }
538
539 _context3.t0 = event;
540 _context3.next = _context3.t0 === 'add' ? 7 : _context3.t0 === 'unlink' ? 7 : 10;
541 break;
542
543 case 7:
544 _context3.next = 9;
545 return generateSummary();
546
547 case 9:
548 return _context3.abrupt('break', 15);
549
550 case 10:
551 _context3.t1 = !path.startsWith(_this3.docPath);
552
553 if (!_context3.t1) {
554 _context3.next = 14;
555 break;
556 }
557
558 _context3.next = 14;
559 return generateSummary();
560
561 case 14:
562 return _context3.abrupt('break', 15);
563
564 case 15:
565 _context3.next = 19;
566 break;
567
568 case 17:
569 _context3.next = 19;
570 return generateSummary();
571
572 case 19:
573 case 'end':
574 return _context3.stop();
575 }
576 }
577 }, _callee3, _this3);
578 }));
579
580 return function (_x7, _x8) {
581 return _ref3.apply(this, arguments);
582 };
583 }()
584 // quick
585 );
586 }
587 }
588 }, {
589 key: 'watchTheme',
590 value: function () {
591 var _ref5 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee4() {
592 var _this4 = this;
593
594 var _initialThemeConfig, themeConfigFiles, root, notFound, routes, themeConfig, plugins, _themeConfig$routesMa, routesMap, config;
595
596 return _regenerator2.default.wrap(function _callee4$(_context4) {
597 while (1) {
598 switch (_context4.prev = _context4.next) {
599 case 0:
600 _initialThemeConfig = this.initialThemeConfig(), themeConfigFiles = _initialThemeConfig.themeConfigFiles, root = _initialThemeConfig.root, notFound = _initialThemeConfig.notFound, routes = _initialThemeConfig.routes, themeConfig = _initialThemeConfig.themeConfig, plugins = _initialThemeConfig.plugins;
601
602
603 try {
604 delete require.cache[require.resolve(this.themeDataPath)];
605 } catch (ex) {}
606
607 // initial Watcher
608 if (this.opts.watch && themeConfigFiles.length) {
609 this.themeWatcher = _chokidar2.default.watch(themeConfigFiles, { persistent: true, ignoreInitial: true });
610 this.themeWatcher.on('all', function (event, path, stat) {
611 _console2.default.log(path, ':', event);
612 _this4.themeWatcher.close();
613 _this4.themeWatcher = null;
614 _this4.watchTheme();
615 });
616 }
617
618 // Write Routes/ThemeConfig to file
619 _themeConfig$routesMa = themeConfig.routesMap, routesMap = _themeConfig$routesMa === undefined ? {} : _themeConfig$routesMa, config = (0, _objectWithoutProperties3.default)(themeConfig, ['routesMap']);
620
621 this.routesMap = routesMap;
622 (0, _utils.renderTemplate)(_path2.default.join(_context8.templatePath, 'commonjs.template.js'), { body: JSON.stringify({ root: _resolvePath2.default.toUriPath(root), notFound: notFound, routes: routes, themeConfig: config }) }, this.themeDataPath);
623
624 this.opts.ssr && (0, _utils.renderTemplate)(_path2.default.join(_context8.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'));
625
626 (0, _utils.renderTemplate)(_path2.default.join(_context8.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'));
627 _context4.prev = 8;
628 _context4.next = 11;
629 return this.generateSummary(plugins);
630
631 case 11:
632 _context4.next = 17;
633 break;
634
635 case 13:
636 _context4.prev = 13;
637 _context4.t0 = _context4['catch'](8);
638
639 _console2.default.error(_context4.t0);
640 return _context4.abrupt('return');
641
642 case 17:
643 case 'end':
644 return _context4.stop();
645 }
646 }
647 }, _callee4, this, [[8, 13]]);
648 }));
649
650 function watchTheme() {
651 return _ref5.apply(this, arguments);
652 }
653
654 return watchTheme;
655 }()
656 }, {
657 key: 'clearTmp',
658 value: function clearTmp() {
659 !isDebug && require('del').sync([_path2.default.join(this.tmpPath, '*' + this.id + '*')], { force: true });
660 }
661 }, {
662 key: 'build',
663 value: function build(callback) {
664 var _this5 = this;
665
666 _console2.default.log(_chalk2.default.green('Building...'));
667 if (this.opts.force) {
668 _console2.default.log(_chalk2.default.red(' FORCE Mode is OPEN'));
669 require('del').sync([_path2.default.join(this.distRoot, '*'), '!' + _path2.default.join(this.distRoot, '.git')], { force: true });
670 }
671 if (!this.opts.ssr) {
672 _console2.default.log(_chalk2.default.red(' SSR Mode is CLOSED'));
673 }
674 if (!this.opts.noSpider) {
675 _console2.default.log(_chalk2.default.green(' Spider Mode is OPEN'));
676 }
677
678 var webpackConfig = this.wpServer.getWebpackConfig();
679 if (this.opts.sourceMap) {
680 webpackConfig.devtool = 'source-map';
681 }
682 (0, _build3.default)(webpackConfig, function () {
683 _console2.default.log(_chalk2.default.green('\n Webpack Build successfully.') + '\n');
684
685 // let
686 var ssrWebpackConfig = webpackConfig;
687 var ssrEntryName = 'node-routes-generator.' + _this5.id;
688 var ssrEntryPath = _path2.default.join(_this5.tmpPath, 'routes-generator.' + _this5.id + '.ssr.js');
689 ssrWebpackConfig.devtool = null;
690 ssrWebpackConfig.entry = (0, _defineProperty3.default)({}, ssrEntryName, [ssrEntryPath]);
691 ssrWebpackConfig.target = 'node';
692 // // https://github.com/webpack/webpack/issues/1599
693 // ssrWebpackConfig.node = {
694 // __dirname: false,
695 // __filename: false
696 // };
697 ssrWebpackConfig.output = Object.assign({}, ssrWebpackConfig.output, {
698 path: _this5.tmpPath,
699 library: 'ssr',
700 libraryTarget: 'commonjs'
701 });
702
703 var ignorePluginsType = isDebug ? [_webpack2.default.optimize.CommonsChunkPlugin, _webpack2.default.DefinePlugin, _webpack2.default.optimize.UglifyJsPlugin] : [_webpack2.default.optimize.CommonsChunkPlugin, _webpack2.default.optimize.UglifyJsPlugin];
704
705 ssrWebpackConfig.plugins = ssrWebpackConfig.plugins.filter(function (plugin) {
706 return ignorePluginsType.findIndex(function (Type) {
707 return plugin instanceof Type;
708 }) < 0;
709 });
710
711 if (isDebug) {
712 ssrWebpackConfig.debug = true;
713 ssrWebpackConfig.plugins.push(new _webpack2.default.DefinePlugin({
714 'process.env.NODE_ENV': '"development"'
715 }));
716 }
717
718 var themeSSR = null;
719 try {
720 _this5.themeSSRPath = (0, _resolvePath2.default)(_this5.themeSSRPath);
721 themeSSR = require(_this5.themeSSRPath);
722 _console2.default.log('Found ssr module of theme:\n ', _path2.default.relative(process.cwd(), _this5.themeSSRPath));
723 } catch (ex) {
724 if (ex.code !== 'MODULE_NOT_FOUND') {
725 _console2.default.error(ex);
726 }
727 _this5.themeSSRPath = null;
728 }
729
730 ssrWebpackConfig.externals = ssrWebpackConfig.externals || [];
731 if (!Array.isArray(ssrWebpackConfig.externals)) {
732 ssrWebpackConfig.externals = [ssrWebpackConfig.externals];
733 }
734
735 var configExternals = ssrWebpackConfig.externals;
736 configExternals.push([function (context, request, callback) {
737 if (/^\s*picidae-/.test(request)) {
738 return callback();
739 }
740 if (/^\s*!/.test(request)) {
741 return callback();
742 }
743 if (_resolvePath2.default.isNodeModule(request)) {
744 // external!
745 return callback(null, 'commonjs ' + request);
746 }
747 return callback();
748 }]);
749
750 var externals = themeSSR && themeSSR.externals;
751 if (externals) {
752 configExternals.push(externals);
753
754 if (isDebug) {
755 _console2.default.debug('webpack.externals', ssrWebpackConfig.externals);
756 } else {
757 _console2.default.log('theme ssr\'s externals: ', externals);
758 }
759 }
760
761 if (typeof _this5.opts.ssrWebpackConfigUpdater === 'function') {
762 ssrWebpackConfig = _this5.opts.ssrWebpackConfigUpdater(ssrWebpackConfig);
763 }
764
765 var themeNodeModulePath = _path2.default.join(_path2.default.dirname(_this5.themePath), 'node_modules');
766 if (!!ssrWebpackConfig.resolve && !!ssrWebpackConfig.resolve.root) {
767 if (!Array.isArray(ssrWebpackConfig.resolve.root)) {
768 ssrWebpackConfig.resolve.root = [ssrWebpackConfig.resolve.root];
769 }
770 !ssrWebpackConfig.resolve.root.includes(themeNodeModulePath) && ssrWebpackConfig.resolve.root.push(themeNodeModulePath);
771 }
772 if (!!ssrWebpackConfig.resolveLoader && !!ssrWebpackConfig.resolveLoader.root) {
773 if (!Array.isArray(ssrWebpackConfig.resolveLoader.root)) {
774 ssrWebpackConfig.resolveLoader.root = [ssrWebpackConfig.resolveLoader.root];
775 }
776 !ssrWebpackConfig.resolveLoader.root.includes(themeNodeModulePath) && ssrWebpackConfig.resolveLoader.root.push(themeNodeModulePath);
777 }
778
779 var buildMethod = _this5.opts.ssr ? _build3.default : function (config, callback) {
780 return callback(null);
781 };
782 buildMethod(ssrWebpackConfig, function () {
783 var _pool;
784
785 var routes = require(_this5.themeDataPath).routes;
786 var method = function method(url, callback) {
787 return callback('');
788 };
789 var sitemap = require('./lib/utils/sitemap-generator');
790 if (_this5.opts.ssr) {
791 over.logout();
792 over.register(_this5.themeSSRPath || void 0);
793 var gen = require(_path2.default.join(_this5.tmpPath, ssrEntryName)).ssr;
794 routes = gen(require(_this5.themeDataPath));
795 method = (0, _ssr2.default)(routes, false, _this5.opts.publicPath);
796 }
797
798 var methodProm = function methodProm(path) {
799 return new Promise(function (resolve, reject) {
800 method(path, function (content, props) {
801 if (content == null) {
802 resolve();
803 }
804 resolve(content);
805 });
806 });
807 };
808
809 var sites = sitemap(routes, _this5.docsEntry);
810 var tpl = _fs2.default.readFileSync(_this5.htmlTempate).toString();
811
812 var pool = [];
813 (_pool = pool).push.apply(_pool, (0, _toConsumableArray3.default)(sites));
814
815 var count = 1;
816
817 function logPath(path) {
818 count++;
819 _console2.default.log(_chalk2.default.green(' `' + _path2.default.relative(process.cwd(), path) + '`'), 'File Created successfully.');
820 }
821
822 var createProm = function createProm(sites, ctxData) {
823 var opt = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
824 var publicPath = ctxData.publicPath,
825 dirRoot = ctxData.dirRoot,
826 templateData = ctxData.templateData;
827 var _opt$noSpider = opt.noSpider,
828 noSpider = _opt$noSpider === undefined ? false : _opt$noSpider;
829
830
831 return Promise.all(sites.map(function (_ref6) {
832 var path = _ref6.path,
833 html = _ref6.html;
834
835 var absoluteHtml = _path2.default.join(dirRoot, html.replace(/^\/+/, ''));
836 (0, _mkdirp.sync)(_path2.default.dirname(absoluteHtml));
837 return new Promise(function (resolve, reject) {
838 method('/' + path.replace(/^\/+/, ''), function () {
839 var _ref7 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee5(content, renderProps) {
840 var opts, inputArg, themeTemplateData, actualTemplateData;
841 return _regenerator2.default.wrap(function _callee5$(_context5) {
842 while (1) {
843 switch (_context5.prev = _context5.next) {
844 case 0:
845 if (content == null) {
846 resolve();
847 } else {
848 opts = { path: absoluteHtml, pathname: path, spider: true
849 // try {
850 };
851 inputArg = (0, _extends3.default)({}, renderProps);
852 themeTemplateData = null;
853
854 if (themeSSR && typeof themeSSR === 'function') {
855 themeTemplateData = themeSSR(inputArg);
856 }
857 actualTemplateData = typeof templateData === 'function' ? templateData(inputArg, 'prod') : templateData;
858
859 actualTemplateData = (0, _extends3.default)({}, actualTemplateData) || {};
860 actualTemplateData.themeData = themeTemplateData || {};
861 _boss2.default.queue({
862 type: 'renderHtml',
863 args: [tpl, (0, _extends3.default)({ content: content, root: publicPath }, actualTemplateData), opts],
864 callback: function callback(err, obj) {
865 if (err || !obj) resolve();else {
866 logPath(obj.path);
867 if (!noSpider) {
868 var newSites = obj.hrefList.map(function (href) {
869 if (href.startsWith(publicPath)) {
870 href = href.substring(publicPath.length);
871 href = href.startsWith('/') ? href : '/' + href;
872 }
873 return href;
874 }).filter(function (href) {
875 return !pool.find(function (x) {
876 return x.path === decodeURIComponent(href);
877 });
878 });
879 newSites = newSites.map(sitemap.transform);
880 if (newSites && newSites.length) {
881 _console2.default.log(path, '->', newSites);
882 pool = pool.concat(newSites);
883 resolve(createProm(newSites, ctxData, { noSpider: noSpider }));
884 return;
885 }
886 }
887 resolve(obj.path);
888 }
889 }
890 });
891 }
892
893 case 1:
894 case 'end':
895 return _context5.stop();
896 }
897 }
898 }, _callee5, _this5);
899 }));
900
901 return function (_x10, _x11) {
902 return _ref7.apply(this, arguments);
903 };
904 }());
905 }).catch(_console2.default.error);
906 }));
907 };
908
909 var ctxData = {
910 dirRoot: _this5.distRoot,
911 publicPath: _this5.opts.publicPath,
912 templateData: _this5.opts.templateData
913 };
914 createProm(sites, ctxData, { noSpider: _this5.opts.noSpider }).then((0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee6() {
915 var src, target, _sites, host, sitemapText, robotsText, writeFile;
916
917 return _regenerator2.default.wrap(function _callee6$(_context6) {
918 while (1) {
919 switch (_context6.prev = _context6.next) {
920 case 0:
921 over.logout();
922 _boss2.default.jobDone();
923 src = _path2.default.resolve(_this5.opts.extraRoot);
924 target = _path2.default.join(_this5.distRoot);
925
926
927 _console2.default.log('');
928 _console2.default.log(_chalk2.default.green(' ' + count), 'Files Created successfully\n');
929
930 // precache services-worker.js
931
932 if (_this5.opts.noSw) {
933 _context6.next = 9;
934 break;
935 }
936
937 _context6.next = 9;
938 return require('sw-precache').write(_path2.default.join(_this5.distRoot, 'service-worker.js'), {
939 staticFileGlobs: [_path2.default.join(_this5.distRoot, '/**/*.{js,html,css,png,jpg,gif,svg,eot,ttf,woff}')],
940 stripPrefix: _this5.distRoot,
941 navigateFallback: _path2.default.join(_this5.opts.publicPath, 'index.html'),
942 replacePrefix: _this5.opts.publicPath.replace(/\/+$/, ''),
943 templateFilePath: _path2.default.join(_context8.templatePath, 'service-worker.tmpl'),
944 logger: function logger(message) {
945 _console2.default.log(message);
946 },
947 maximumFileSizeToCacheInBytes: 4194304 // 4MB
948 });
949
950 case 9:
951
952 if (_this5.opts.ssr && _this5.opts.host) {
953 if (_this5.docsEntityEntry['index']) {
954 _this5.docsEntityEntry[''] = _this5.docsEntityEntry['index'];
955 delete _this5.docsEntityEntry['index'];
956 }
957 _sites = [];
958
959 (0, _each2.default)(_this5.docsEntityEntry, function (val, key) {
960 _sites.push({
961 loc: key,
962 lastmod: val.lastmod
963 });
964 });
965
966 host = _url2.default.resolve(_this5.opts.host, _this5.opts.publicPath);
967
968 _sites = (0, _arrayUnique2.default)(_sites.concat(pool.filter(function (_ref9) {
969 var path = _ref9.path;
970 return path !== 'NOT_FOUND_PAGE';
971 }).map(function (_ref10) {
972 var path = _ref10.path;
973 return path.replace(/^\/*/, '');
974 })), function (obj) {
975 return typeof obj === 'string' ? obj : obj.loc;
976 });
977 sitemapText = (0, _seoHelper.toSitemap)({ host: host, minify: true, sites: _sites });
978 robotsText = (0, _seoHelper.toRobots)(host);
979
980 writeFile = function writeFile(filename, data, logText) {
981 _fs2.default.writeFileSync(filename, data);
982 _console2.default.log(_chalk2.default.cyan(logText), 'File Created');
983 };
984
985 writeFile(_path2.default.join(_this5.distRoot, 'robots.txt'), robotsText, 'robots.txt');
986 writeFile(_path2.default.join(_this5.distRoot, 'sitemap.xml'), sitemapText, 'sitemap.xml');
987 }
988
989 if (_fs2.default.existsSync(src) && _fs2.default.statSync(src).isDirectory()) {
990 _console2.default.log(_chalk2.default.green(' Copying Extra Directory'));
991 (0, _mkdirp.sync)(target);
992 require('copy-dir').sync(src, target);
993 }
994
995 _console2.default.log(_chalk2.default.green(' Done! :P'));
996 callback && callback();
997
998 case 13:
999 case 'end':
1000 return _context6.stop();
1001 }
1002 }
1003 }, _callee6, _this5);
1004 }))).catch(_console2.default.error);
1005 });
1006 });
1007 }
1008 }, {
1009 key: 'initialThemeConfig',
1010 value: function initialThemeConfig() {
1011 var theme = _parseQuery2.default.autoPrefix(this.opts.theme, 'picidae-theme-');
1012 var themeKey = _resolvePath2.default.isNodeModule(this.opts.theme) ? theme : 'default';
1013 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');
1014 this.themeSSRPath = _resolvePath2.default.isNodeModule(theme) ? _parseQuery2.default.injectJoin(theme, 'ssr.js') : _parseQuery2.default.injectJoin(theme, 'ssr.js');
1015
1016 var themeConfigsRoot = _path2.default.resolve(this.opts.themeConfigsRoot);
1017 var themeConfigFile = _path2.default.join(themeConfigsRoot, themeKey);
1018 var themeConfigFiles = [themePath, themeConfigFile];
1019
1020 if (this.opts.watch) {
1021 try {
1022 delete require.cache[require.resolve(themePath)];
1023 delete require.cache[require.resolve(themeConfigFile)];
1024 } catch (ex) {}
1025 }
1026
1027 var themeConfigOrigin = require(themePath).default || require(themePath);
1028 (0, _checkThemeConfigFile2.default)(themeConfigOrigin);
1029 var root = themeConfigOrigin.root,
1030 routes = themeConfigOrigin.routes,
1031 notFound = themeConfigOrigin.notFound,
1032 picker = themeConfigOrigin.picker,
1033 _themeConfigOrigin$co = themeConfigOrigin.config,
1034 themeConfig = _themeConfigOrigin$co === undefined ? {} : _themeConfigOrigin$co,
1035 _themeConfigOrigin$pl = themeConfigOrigin.plugins,
1036 plugins = _themeConfigOrigin$pl === undefined ? [] : _themeConfigOrigin$pl;
1037
1038
1039 (0, _chcwdFlow2.default)(_path2.default.dirname(themePath), function () {
1040 plugins = ['utils'].concat(plugins);
1041 plugins = plugins.map(function (f) {
1042 return (0, _parseQuery2.default)(f, 'picidae-plugin-');
1043 });
1044 root = _path2.default.resolve(root);
1045 });
1046
1047 this.opts.picker = picker;
1048
1049 var found = false;
1050 try {
1051 themeConfigFile = require.resolve(themeConfigFile);
1052 found = true;
1053 } catch (ex) {
1054 themeConfigFile = themePath;
1055 }
1056 if (found) {
1057 themeConfig = require(themeConfigFile);
1058 }
1059 _console2.default.log(_chalk2.default.gray('Theme Configuration In File: '));
1060 _console2.default.log(' ', _chalk2.default.green(_path2.default.relative(process.cwd(), require.resolve(themeConfigFile))));
1061
1062 this.opts.themeConfig = themeConfig;
1063
1064 themeConfigFiles = themeConfigFiles.map(function (x) {
1065 try {
1066 return require.resolve(x);
1067 } catch (ex) {
1068 return false;
1069 }
1070 }).filter(Boolean);
1071
1072 return {
1073 themeConfigFiles: themeConfigFiles,
1074 root: root,
1075 notFound: notFound,
1076 routes: routes,
1077 themeConfig: themeConfig,
1078 plugins: plugins
1079 };
1080 }
1081 }, {
1082 key: 'start',
1083 value: function start(callback) {
1084 var _this6 = this;
1085
1086 if (this.opts.ssr) {
1087 _console2.default.log(_chalk2.default.underline.blue('Server Side Render Model is OPEN.'));
1088 }
1089
1090 this.wpServer.start(callback);
1091 Object.defineProperty(this, 'compiler', {
1092 enumerable: true,
1093 configurable: false,
1094 get: function get() {
1095 return _this6.wpServer.app.compiler;
1096 }
1097 });
1098 if (typeof this.opts.expressSetup === 'function') {
1099 this.opts.expressSetup(this.wpServer.app);
1100 }
1101 this.wpServer.inject(function () {
1102 var _ref11 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee7(req, res) {
1103 var templateData, gen, routes;
1104 return _regenerator2.default.wrap(function _callee7$(_context7) {
1105 while (1) {
1106 switch (_context7.prev = _context7.next) {
1107 case 0:
1108 res.type('html');
1109
1110 templateData = _this6.opts.templateData || {};
1111
1112 if (!(typeof templateData === 'function')) {
1113 _context7.next = 8;
1114 break;
1115 }
1116
1117 _context7.next = 5;
1118 return templateData({}, 'dev');
1119
1120 case 5:
1121 _context7.t0 = _context7.sent;
1122 _context7.next = 9;
1123 break;
1124
1125 case 8:
1126 _context7.t0 = (0, _extends3.default)({}, templateData);
1127
1128 case 9:
1129 templateData = _context7.t0;
1130
1131 // Fake ThemeData
1132 templateData.themeData = {};
1133
1134 if (!_this6.opts.ssr) {
1135 _context7.next = 16;
1136 break;
1137 }
1138
1139 gen = require(_path2.default.join(_this6.tmpPath, 'routes-generator.' + _this6.id + '.ssr.js'));
1140 routes = gen(require(_this6.themeDataPath));
1141
1142 (0, _ssr2.default)(routes, true, _this6.opts.publicPath)(req.url, function (content) {
1143 res.send((0, _utils.renderTemplate)(_this6.htmlTempate, (0, _extends3.default)({
1144 content: content,
1145 root: _this6.opts.publicPath
1146 }, templateData)));
1147 });
1148 return _context7.abrupt('return');
1149
1150 case 16:
1151
1152 res.send((0, _utils.renderTemplate)(_this6.htmlTempate, (0, _extends3.default)({
1153 content: '',
1154 root: _this6.opts.publicPath
1155 }, templateData)));
1156
1157 case 17:
1158 case 'end':
1159 return _context7.stop();
1160 }
1161 }
1162 }, _callee7, _this6);
1163 }));
1164
1165 return function (_x12, _x13) {
1166 return _ref11.apply(this, arguments);
1167 };
1168 }());
1169 }
1170 }, {
1171 key: 'stop',
1172 value: function stop(callback) {
1173 if (!this.wpServer) {
1174 // throw new Error('WebpackServer is NOT running currently!')
1175 }
1176 this.clearTmp();
1177 this.themeWatcher && this.themeWatcher.close();
1178 this.themeWatcher = null;
1179 this.summaryWatcher && this.summaryWatcher.close();
1180 this.summaryWatcher = null;
1181 this.wpServer && this.wpServer.stop(callback);
1182 this.wpServer = null;
1183 }
1184 }]);
1185 return Picidae;
1186}(_events.EventEmitter), _class.assignOption = assignOption, _temp);
1187
1188
1189module.exports = Picidae;
\No newline at end of file