UNPKG

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