dev.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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. /* eslint-disable no-console */
  24. process.on('unhandledRejection', console.dir);
  25. /* eslint-enable */
  26. }
  27. initSwig() {
  28. swig.setDefaults({ cache: false });
  29. }
  30. /**
  31. * require files for node-dev auto reloading
  32. */
  33. requireForAutoReloadServer() {
  34. // load all json files for live reloading
  35. fs.readdirSync(this.crowi.localeDir).map((dirname) => {
  36. require(path.join(this.crowi.localeDir, dirname, 'translation.json'));
  37. });
  38. }
  39. /**
  40. *
  41. *
  42. * @param {any} server http server
  43. * @param {any} app express
  44. *
  45. * @memberOf CrowiDev
  46. */
  47. setup(server, app) {
  48. this.setupHeaderDebugger(app);
  49. this.setupBrowserSync(app);
  50. }
  51. setupHeaderDebugger(app) {
  52. debug('setupHeaderDebugger');
  53. app.use((req, res, next) => {
  54. onHeaders(res, () => {
  55. debug('HEADERS GOING TO BE WRITTEN');
  56. });
  57. next();
  58. });
  59. }
  60. setupBrowserSync(app) {
  61. debug('setupBrowserSync');
  62. const browserSync = require('browser-sync');
  63. const bs = browserSync.create().init({
  64. logSnippet: false,
  65. notify: false,
  66. files: [
  67. `${this.crowi.viewsDir}/**/*.html`,
  68. `${this.crowi.publicDir}/**/*.js`,
  69. `${this.crowi.publicDir}/**/*.css`,
  70. ]
  71. });
  72. app.use(require('connect-browser-sync')(bs));
  73. }
  74. loadPlugins(app) {
  75. if (process.env.PLUGIN_NAMES_TOBE_LOADED !== undefined
  76. && process.env.PLUGIN_NAMES_TOBE_LOADED.length > 0) {
  77. const pluginNames = process.env.PLUGIN_NAMES_TOBE_LOADED.split(',');
  78. debug('loading Plugins for development', pluginNames);
  79. // merge and remove duplicates
  80. if (pluginNames.length > 0) {
  81. var PluginService = require('../plugins/plugin.service');
  82. var pluginService = new PluginService(this.crowi, app);
  83. pluginService.loadPlugins(pluginNames);
  84. }
  85. }
  86. }
  87. }
  88. module.exports = CrowiDev;