dev.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. const debug = require('debug')('crowi:crowi:dev');
  2. const path = require('path');
  3. const webpack = require('webpack');
  4. const helpers = require('./helpers');
  5. const swig = require('swig-templates');
  6. const LRWebSocketServer = require('livereload-server/lib/server');
  7. class CrowiDev {
  8. /**
  9. * Creates an instance of CrowiDev.
  10. * @param {Crowi} crowi
  11. *
  12. * @memberOf CrowiDev
  13. */
  14. constructor(crowi) {
  15. this.crowi = crowi;
  16. }
  17. init() {
  18. this.initPromiseRejectionWarningHandler();
  19. this.initSwig();
  20. this.hackLRWebSocketServer();
  21. }
  22. initPromiseRejectionWarningHandler() {
  23. // https://qiita.com/syuilo/items/0800d7e44e93203c7285
  24. process.on('unhandledRejection', console.dir);
  25. }
  26. initSwig() {
  27. swig.setDefaults({ cache: false });
  28. }
  29. /**
  30. * prevent to crash socket with:
  31. * -------------------------------------------------
  32. * Error: read ECONNRESET
  33. * at exports._errnoException (util.js:1022:11)
  34. * at TCP.onread (net.js:569:26)
  35. * -------------------------------------------------
  36. *
  37. * @see https://github.com/napcs/node-livereload/pull/15
  38. *
  39. * @memberOf CrowiDev
  40. */
  41. hackLRWebSocketServer() {
  42. const orgCreateConnection = LRWebSocketServer.prototype._createConnection;
  43. // replace https://github.com/livereload/livereload-server/blob/v0.2.3/lib/server.coffee#L74
  44. LRWebSocketServer.prototype._createConnection = function(socket) {
  45. // call original method with substituting 'this' obj
  46. orgCreateConnection.call(this, socket);
  47. socket.on('error', (err) => {
  48. console.warn(`[WARN] An insignificant error occured in client socket: '${err}'`);
  49. });
  50. }
  51. }
  52. /**
  53. *
  54. *
  55. * @param {any} server http server
  56. * @param {any} app express
  57. *
  58. * @memberOf CrowiDev
  59. */
  60. setup(server, app) {
  61. this.setupEasyLiveReload(app);
  62. }
  63. setupEasyLiveReload(app) {
  64. if (!helpers.hasProcessFlag('livereload')) {
  65. return;
  66. }
  67. const livereload = require('easy-livereload');
  68. app.use(livereload({
  69. watchDirs: [
  70. path.join(this.crowi.viewsDir),
  71. path.join(this.crowi.publicDir),
  72. ],
  73. checkFunc: function(x) {
  74. return /\.(html|css|js)$/.test(x);
  75. },
  76. }));
  77. }
  78. loadPlugins(app) {
  79. if (process.env.PLUGIN_NAMES_TOBE_LOADED !== undefined
  80. && process.env.PLUGIN_NAMES_TOBE_LOADED.length > 0) {
  81. const pluginNames = process.env.PLUGIN_NAMES_TOBE_LOADED.split(',');
  82. // merge and remove duplicates
  83. if (pluginNames.length > 0) {
  84. var PluginService = require('../plugins/plugin.service');
  85. var pluginService = new PluginService(this.crowi, app);
  86. pluginService.loadPlugins(pluginNames);
  87. }
  88. }
  89. }
  90. }
  91. module.exports = CrowiDev