dev.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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)
  36. .filter(filename => {
  37. return fs.statSync(path.join(this.crowi.localeDir, filename)).isDirectory();
  38. })
  39. .map((dirname) => {
  40. require(path.join(this.crowi.localeDir, dirname, 'translation.json'));
  41. });
  42. }
  43. /**
  44. *
  45. *
  46. * @param {any} server http server
  47. * @param {any} app express
  48. *
  49. * @memberOf CrowiDev
  50. */
  51. setup(server, app) {
  52. this.setupHeaderDebugger(app);
  53. this.setupBrowserSync(app);
  54. }
  55. setupHeaderDebugger(app) {
  56. debug('setupHeaderDebugger');
  57. app.use((req, res, next) => {
  58. onHeaders(res, () => {
  59. debug('HEADERS GOING TO BE WRITTEN');
  60. });
  61. next();
  62. });
  63. }
  64. setupBrowserSync(app) {
  65. debug('setupBrowserSync');
  66. const browserSync = require('browser-sync');
  67. const bs = browserSync.create().init({
  68. logSnippet: false,
  69. notify: false,
  70. files: [
  71. `${this.crowi.viewsDir}/**/*.html`,
  72. `${this.crowi.publicDir}/**/*.js`,
  73. `${this.crowi.publicDir}/**/*.css`,
  74. ]
  75. });
  76. app.use(require('connect-browser-sync')(bs));
  77. }
  78. loadPlugins(app) {
  79. if (process.env.PLUGIN_NAMES_TOBE_LOADED !== undefined
  80. && process.env.PLUGIN_NAMES_TOBE_LOADED.length > 0) {
  81. const pluginNames = process.env.PLUGIN_NAMES_TOBE_LOADED.split(',');
  82. debug('loading Plugins for development', pluginNames);
  83. // merge and remove duplicates
  84. if (pluginNames.length > 0) {
  85. var PluginService = require('../plugins/plugin.service');
  86. var pluginService = new PluginService(this.crowi, app);
  87. pluginService.loadPlugins(pluginNames);
  88. }
  89. }
  90. }
  91. }
  92. module.exports = CrowiDev;