dev.js 3.5 KB

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