dev.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. const debug = require('debug')('growi:crowi:dev');
  2. const fs = require('fs');
  3. const path = require('path');
  4. const swig = require('swig-templates');
  5. const onHeaders = require('on-headers');
  6. class CrowiDev {
  7. /**
  8. * Creates an instance of CrowiDev.
  9. * @param {Crowi} crowi
  10. *
  11. * @memberOf CrowiDev
  12. */
  13. constructor(crowi) {
  14. this.crowi = crowi;
  15. }
  16. init() {
  17. this.requireForAutoReloadServer();
  18. this.initPromiseRejectionWarningHandler();
  19. this.initSwig();
  20. }
  21. initPromiseRejectionWarningHandler() {
  22. // https://qiita.com/syuilo/items/0800d7e44e93203c7285
  23. process.on('unhandledRejection', console.dir); // eslint-disable-line no-console
  24. }
  25. initSwig() {
  26. swig.setDefaults({ cache: false });
  27. }
  28. /**
  29. * require files for node-dev auto reloading
  30. */
  31. requireForAutoReloadServer() {
  32. // load all json files for live reloading
  33. fs.readdirSync(this.crowi.localeDir)
  34. .filter(filename => {
  35. return fs.statSync(path.join(this.crowi.localeDir, filename)).isDirectory();
  36. })
  37. .map((dirname) => {
  38. require(path.join(this.crowi.localeDir, dirname, 'translation.json'));
  39. });
  40. }
  41. /**
  42. *
  43. *
  44. * @param {any} server http server
  45. * @param {any} app express
  46. *
  47. * @memberOf CrowiDev
  48. */
  49. setup(server, app) {
  50. this.setupHeaderDebugger(app);
  51. this.setupBrowserSync(app);
  52. }
  53. setupHeaderDebugger(app) {
  54. debug('setupHeaderDebugger');
  55. app.use((req, res, next) => {
  56. onHeaders(res, () => {
  57. debug('HEADERS GOING TO BE WRITTEN');
  58. });
  59. next();
  60. });
  61. }
  62. setupBrowserSync(app) {
  63. debug('setupBrowserSync');
  64. const browserSync = require('browser-sync');
  65. const bs = browserSync.create().init({
  66. logSnippet: false,
  67. notify: false,
  68. files: [
  69. `${this.crowi.viewsDir}/**/*.html`,
  70. `${this.crowi.publicDir}/**/*.js`,
  71. `${this.crowi.publicDir}/**/*.css`,
  72. ]
  73. });
  74. app.use(require('connect-browser-sync')(bs));
  75. }
  76. loadPlugins(app) {
  77. if (process.env.PLUGIN_NAMES_TOBE_LOADED !== undefined
  78. && process.env.PLUGIN_NAMES_TOBE_LOADED.length > 0) {
  79. const pluginNames = process.env.PLUGIN_NAMES_TOBE_LOADED.split(',');
  80. debug('loading Plugins for development', pluginNames);
  81. // merge and remove duplicates
  82. if (pluginNames.length > 0) {
  83. var PluginService = require('../plugins/plugin.service');
  84. var pluginService = new PluginService(this.crowi, app);
  85. pluginService.loadPlugins(pluginNames);
  86. }
  87. }
  88. }
  89. }
  90. module.exports = CrowiDev;