dev.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. const logger = require('@alias/logger')('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. .forEach((dirname) => {
  38. require(path.join(this.crowi.localeDir, dirname, 'translation.json'));
  39. });
  40. }
  41. /**
  42. *
  43. * @param {any} app express
  44. */
  45. setupServer(app) {
  46. const port = this.crowi.port;
  47. let server = app;
  48. // for log
  49. let serverUrl = `http://localhost:${port}}`;
  50. if (this.crowi.env.DEV_HTTPS) {
  51. logger.info(`[${this.crowi.node_env}] Express server will start with HTTPS Self-Signed Certification`);
  52. serverUrl = `https://localhost:${port}}`;
  53. const fs = require('graceful-fs');
  54. const https = require('https');
  55. const options = {
  56. key: fs.readFileSync(path.join(this.crowi.rootDir, './resource/certs/localhost/key.pem')),
  57. cert: fs.readFileSync(path.join(this.crowi.rootDir, './resource/certs/localhost/cert.pem')),
  58. };
  59. server = https.createServer(options, app);
  60. }
  61. const eazyLogger = require('eazy-logger').Logger({
  62. prefix: '[{green:GROWI}] ',
  63. useLevelPrefixes: false,
  64. });
  65. eazyLogger.info('{bold:Server URLs:}');
  66. eazyLogger.unprefixed('info', '{grey:=======================================}');
  67. eazyLogger.unprefixed('info', ` APP: {magenta:${serverUrl}}`);
  68. eazyLogger.unprefixed('info', '{grey:=======================================}');
  69. return server;
  70. }
  71. /**
  72. *
  73. * @param {any} app express
  74. */
  75. setupExpressAfterListening(app) {
  76. this.setupHeaderDebugger(app);
  77. this.setupBrowserSync(app);
  78. }
  79. setupHeaderDebugger(app) {
  80. logger.debug('setupHeaderDebugger');
  81. app.use((req, res, next) => {
  82. onHeaders(res, () => {
  83. logger.debug('HEADERS GOING TO BE WRITTEN');
  84. });
  85. next();
  86. });
  87. }
  88. setupBrowserSync(app) {
  89. logger.debug('setupBrowserSync');
  90. const browserSync = require('browser-sync');
  91. const bs = browserSync.create().init({
  92. logSnippet: false,
  93. notify: false,
  94. files: [
  95. `${this.crowi.viewsDir}/**/*.html`,
  96. `${this.crowi.publicDir}/**/*.js`,
  97. `${this.crowi.publicDir}/**/*.css`,
  98. ],
  99. });
  100. app.use(require('connect-browser-sync')(bs));
  101. }
  102. loadPlugins(app) {
  103. if (process.env.PLUGIN_NAMES_TOBE_LOADED !== undefined
  104. && process.env.PLUGIN_NAMES_TOBE_LOADED.length > 0) {
  105. const pluginNames = process.env.PLUGIN_NAMES_TOBE_LOADED.split(',');
  106. logger.debug('[development] loading Plugins', pluginNames);
  107. // merge and remove duplicates
  108. if (pluginNames.length > 0) {
  109. const PluginService = require('../plugins/plugin.service');
  110. const pluginService = new PluginService(this.crowi, app);
  111. pluginService.loadPlugins(pluginNames);
  112. }
  113. }
  114. }
  115. }
  116. module.exports = CrowiDev;