dev.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. import path from 'path';
  2. import express from 'express';
  3. import { i18n } from '^/config/next-i18next.config';
  4. import loggerFactory from '~/utils/logger';
  5. import nextFactory from '../routes/next';
  6. const swig = require('swig-templates');
  7. const logger = loggerFactory('growi:crowi:dev');
  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. }
  22. initPromiseRejectionWarningHandler() {
  23. // https://qiita.com/syuilo/items/0800d7e44e93203c7285
  24. process.on('unhandledRejection', console.dir); // eslint-disable-line no-console
  25. }
  26. /**
  27. * require files for node-dev auto reloading
  28. */
  29. requireForAutoReloadServer() {
  30. // load all json files for live reloading
  31. i18n.locales
  32. .forEach((localeId) => {
  33. require(path.join(this.crowi.publicDir, 'static/locales', localeId, 'translation.json'));
  34. });
  35. }
  36. /**
  37. *
  38. * @param {any} app express
  39. */
  40. setupServer(app) {
  41. const port = this.crowi.port;
  42. let server = app;
  43. this.setupExpressBeforeListening(app);
  44. // for log
  45. let serverUrl = `http://localhost:${port}}`;
  46. if (this.crowi.env.DEV_HTTPS) {
  47. logger.info(`[${this.crowi.node_env}] Express server will start with HTTPS Self-Signed Certification`);
  48. serverUrl = `https://localhost:${port}}`;
  49. const fs = require('graceful-fs');
  50. const https = require('https');
  51. const options = {
  52. key: fs.readFileSync(path.join(this.crowi.rootDir, './resource/certs/localhost/key.pem')),
  53. cert: fs.readFileSync(path.join(this.crowi.rootDir, './resource/certs/localhost/cert.pem')),
  54. };
  55. server = https.createServer(options, app);
  56. }
  57. const eazyLogger = require('eazy-logger').Logger({
  58. prefix: '[{green:GROWI}] ',
  59. useLevelPrefixes: false,
  60. });
  61. eazyLogger.info('{bold:Server URLs:}');
  62. eazyLogger.unprefixed('info', '{grey:=======================================}');
  63. eazyLogger.unprefixed('info', ` APP: {magenta:${serverUrl}}`);
  64. eazyLogger.unprefixed('info', '{grey:=======================================}');
  65. return server;
  66. }
  67. setupExpressBeforeListening(app) {
  68. this.setupNextBundleAnalyzer(app);
  69. }
  70. setupExpressAfterListening(app) {
  71. // this.setupBrowserSync(app);
  72. this.setupWebpackHmr(app);
  73. this.setupNextjsStackFrame(app);
  74. }
  75. // setupHeaderDebugger(app) {
  76. // logger.debug('setupHeaderDebugger');
  77. // app.use((req, res, next) => {
  78. // onHeaders(res, () => {
  79. // logger.debug('HEADERS GOING TO BE WRITTEN');
  80. // });
  81. // next();
  82. // });
  83. // }
  84. // setupBrowserSync(app) {
  85. // logger.debug('setupBrowserSync');
  86. // const browserSync = require('browser-sync');
  87. // const bs = browserSync.create().init({
  88. // logSnippet: false,
  89. // notify: false,
  90. // files: [
  91. // `${this.crowi.viewsDir}/**/*.html`,
  92. // `${this.crowi.publicDir}/**/*.js`,
  93. // `${this.crowi.publicDir}/**/*.css`,
  94. // ],
  95. // });
  96. // app.use(require('connect-browser-sync')(bs));
  97. // }
  98. setupNextBundleAnalyzer(app) {
  99. const next = nextFactory(this.crowi);
  100. app.use('/analyze', express.static(path.resolve(__dirname, '../../../.next/analyze')));
  101. }
  102. setupWebpackHmr(app) {
  103. const next = nextFactory(this.crowi);
  104. app.all('/_next/webpack-hmr', next.delegateToNext);
  105. }
  106. setupNextjsStackFrame(app) {
  107. const next = nextFactory(this.crowi);
  108. app.get('/__nextjs_original-stack-frame', next.delegateToNext);
  109. }
  110. }
  111. module.exports = CrowiDev;