dev.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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 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. }
  21. initPromiseRejectionWarningHandler() {
  22. // https://qiita.com/syuilo/items/0800d7e44e93203c7285
  23. process.on('unhandledRejection', console.dir); // eslint-disable-line no-console
  24. }
  25. /**
  26. * require files for node-dev auto reloading
  27. */
  28. requireForAutoReloadServer() {
  29. // load all json files for live reloading
  30. i18n.locales
  31. .forEach((localeId) => {
  32. require(path.join(this.crowi.publicDir, 'static/locales', localeId, 'translation.json'));
  33. });
  34. }
  35. /**
  36. *
  37. * @param {any} app express
  38. */
  39. setupServer(app) {
  40. const port = this.crowi.port;
  41. let server = app;
  42. this.setupExpressBeforeListening(app);
  43. // for log
  44. let serverUrl = `http://localhost:${port}}`;
  45. if (this.crowi.env.DEV_HTTPS) {
  46. logger.info(`[${this.crowi.node_env}] Express server will start with HTTPS Self-Signed Certification`);
  47. serverUrl = `https://localhost:${port}}`;
  48. const fs = require('graceful-fs');
  49. const https = require('https');
  50. const options = {
  51. key: fs.readFileSync(path.join(this.crowi.rootDir, './resource/certs/localhost/key.pem')),
  52. cert: fs.readFileSync(path.join(this.crowi.rootDir, './resource/certs/localhost/cert.pem')),
  53. };
  54. server = https.createServer(options, app);
  55. }
  56. const eazyLogger = require('eazy-logger').Logger({
  57. prefix: '[{green:GROWI}] ',
  58. useLevelPrefixes: false,
  59. });
  60. eazyLogger.info('{bold:Server URLs:}');
  61. eazyLogger.unprefixed('info', '{grey:=======================================}');
  62. eazyLogger.unprefixed('info', ` APP: {magenta:${serverUrl}}`);
  63. eazyLogger.unprefixed('info', '{grey:=======================================}');
  64. return server;
  65. }
  66. setupExpressBeforeListening(app) {
  67. this.setupNextBundleAnalyzer(app);
  68. }
  69. setupExpressAfterListening(app) {
  70. // this.setupBrowserSync(app);
  71. this.setupWebpackHmr(app);
  72. this.setupNextjsStackFrame(app);
  73. }
  74. setupNextBundleAnalyzer(app) {
  75. const next = nextFactory(this.crowi);
  76. app.use('/analyze', express.static(path.resolve(__dirname, '../../../.next/analyze')));
  77. }
  78. setupWebpackHmr(app) {
  79. const next = nextFactory(this.crowi);
  80. app.all('/_next/webpack-hmr', next.delegateToNext);
  81. }
  82. setupNextjsStackFrame(app) {
  83. const next = nextFactory(this.crowi);
  84. app.get('/__nextjs_original-stack-frame', next.delegateToNext);
  85. }
  86. }
  87. module.exports = CrowiDev;