dev.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. import path from 'path';
  2. import { allLocales } from '~/next-i18next.config';
  3. import loggerFactory from '~/utils/logger';
  4. const onHeaders = require('on-headers');
  5. const swig = require('swig-templates');
  6. const logger = loggerFactory('growi:crowi:dev');
  7. class CrowiDev {
  8. /**
  9. * Creates an instance of CrowiDev.
  10. * @param {Crowi} crowi
  11. *
  12. * @memberOf CrowiDev
  13. */
  14. constructor(crowi) {
  15. this.crowi = crowi;
  16. }
  17. init() {
  18. this.requireForAutoReloadServer();
  19. this.initPromiseRejectionWarningHandler();
  20. this.initSwig();
  21. }
  22. initPromiseRejectionWarningHandler() {
  23. // https://qiita.com/syuilo/items/0800d7e44e93203c7285
  24. process.on('unhandledRejection', console.dir); // eslint-disable-line no-console
  25. }
  26. initSwig() {
  27. swig.setDefaults({ cache: false });
  28. }
  29. /**
  30. * require files for node-dev auto reloading
  31. */
  32. requireForAutoReloadServer() {
  33. // load all json files for live reloading
  34. allLocales
  35. .forEach((localeId) => {
  36. require(path.join(this.crowi.publicDir, 'static/locales', localeId, 'translation.json'));
  37. });
  38. }
  39. /**
  40. *
  41. * @param {any} app express
  42. */
  43. setupServer(app) {
  44. const port = this.crowi.port;
  45. let server = app;
  46. // for log
  47. let serverUrl = `http://localhost:${port}}`;
  48. if (this.crowi.env.DEV_HTTPS) {
  49. logger.info(`[${this.crowi.node_env}] Express server will start with HTTPS Self-Signed Certification`);
  50. serverUrl = `https://localhost:${port}}`;
  51. const fs = require('graceful-fs');
  52. const https = require('https');
  53. const options = {
  54. key: fs.readFileSync(path.join(this.crowi.rootDir, './resource/certs/localhost/key.pem')),
  55. cert: fs.readFileSync(path.join(this.crowi.rootDir, './resource/certs/localhost/cert.pem')),
  56. };
  57. server = https.createServer(options, app);
  58. }
  59. const eazyLogger = require('eazy-logger').Logger({
  60. prefix: '[{green:GROWI}] ',
  61. useLevelPrefixes: false,
  62. });
  63. eazyLogger.info('{bold:Server URLs:}');
  64. eazyLogger.unprefixed('info', '{grey:=======================================}');
  65. eazyLogger.unprefixed('info', ` APP: {magenta:${serverUrl}}`);
  66. eazyLogger.unprefixed('info', '{grey:=======================================}');
  67. return server;
  68. }
  69. /**
  70. *
  71. * @param {any} app express
  72. */
  73. setupExpressAfterListening(app) {
  74. this.setupHeaderDebugger(app);
  75. this.setupBrowserSync(app);
  76. }
  77. setupHeaderDebugger(app) {
  78. logger.debug('setupHeaderDebugger');
  79. app.use((req, res, next) => {
  80. onHeaders(res, () => {
  81. logger.debug('HEADERS GOING TO BE WRITTEN');
  82. });
  83. next();
  84. });
  85. }
  86. setupBrowserSync(app) {
  87. logger.debug('setupBrowserSync');
  88. const browserSync = require('browser-sync');
  89. const bs = browserSync.create().init({
  90. logSnippet: false,
  91. notify: false,
  92. files: [
  93. `${this.crowi.viewsDir}/**/*.html`,
  94. `${this.crowi.publicDir}/**/*.js`,
  95. `${this.crowi.publicDir}/**/*.css`,
  96. ],
  97. });
  98. app.use(require('connect-browser-sync')(bs));
  99. }
  100. }
  101. module.exports = CrowiDev;