2
0

dev.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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. 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.requireForAutoReloadServer();
  20. this.initPromiseRejectionWarningHandler();
  21. this.initSwig();
  22. }
  23. initPromiseRejectionWarningHandler() {
  24. // https://qiita.com/syuilo/items/0800d7e44e93203c7285
  25. process.on('unhandledRejection', console.dir);
  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