dev.js 3.1 KB

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