dev.js 2.9 KB

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