dev.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import express from 'express';
  2. import path from 'path';
  3. import loggerFactory from '~/utils/logger';
  4. import nextFactory from '../routes/next';
  5. const logger = loggerFactory('growi:crowi:dev');
  6. class CrowiDev {
  7. /**
  8. * @param {import('~/server/crowi').default} crowi Crowi instance
  9. *
  10. * @memberOf CrowiDev
  11. */
  12. constructor(crowi) {
  13. this.crowi = crowi;
  14. }
  15. init() {
  16. this.initPromiseRejectionWarningHandler();
  17. }
  18. initPromiseRejectionWarningHandler() {
  19. // https://qiita.com/syuilo/items/0800d7e44e93203c7285
  20. process.on('unhandledRejection', console.dir); // eslint-disable-line no-console
  21. }
  22. /**
  23. *
  24. * @param {any} app express
  25. */
  26. setupServer(app) {
  27. const port = this.crowi.port;
  28. let server = app;
  29. this.setupExpressBeforeListening(app);
  30. // for log
  31. let serverUrl = `http://localhost:${port}}`;
  32. if (this.crowi.env.DEV_HTTPS) {
  33. logger.info(
  34. `[${this.crowi.node_env}] Express server will start with HTTPS Self-Signed Certification`,
  35. );
  36. serverUrl = `https://localhost:${port}}`;
  37. const fs = require('graceful-fs');
  38. const https = require('https');
  39. const options = {
  40. key: fs.readFileSync(
  41. path.join(this.crowi.rootDir, './resource/certs/localhost/key.pem'),
  42. ),
  43. cert: fs.readFileSync(
  44. path.join(this.crowi.rootDir, './resource/certs/localhost/cert.pem'),
  45. ),
  46. };
  47. server = https.createServer(options, app);
  48. }
  49. const eazyLogger = require('eazy-logger').Logger({
  50. prefix: '[{green:GROWI}] ',
  51. useLevelPrefixes: false,
  52. });
  53. eazyLogger.info('{bold:Server URLs:}');
  54. eazyLogger.unprefixed(
  55. 'info',
  56. '{grey:=======================================}',
  57. );
  58. eazyLogger.unprefixed('info', ` APP: {magenta:${serverUrl}}`);
  59. eazyLogger.unprefixed(
  60. 'info',
  61. '{grey:=======================================}',
  62. );
  63. return server;
  64. }
  65. setupExpressBeforeListening(app) {
  66. this.setupNextBundleAnalyzer(app);
  67. }
  68. setupExpressAfterListening(app) {
  69. this.setupNextjsStackFrame(app);
  70. }
  71. setupNextBundleAnalyzer(app) {
  72. const next = nextFactory(this.crowi);
  73. app.use(
  74. '/analyze',
  75. express.static(path.resolve(__dirname, '../../../.next/analyze')),
  76. );
  77. }
  78. setupNextjsStackFrame(app) {
  79. const next = nextFactory(this.crowi);
  80. app.get('/__nextjs_original-stack-frame', next.delegateToNext);
  81. }
  82. }
  83. module.exports = CrowiDev;