2
0

dev.js 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import path from 'path';
  2. import express from 'express';
  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(`[${this.crowi.node_env}] Express server will start with HTTPS Self-Signed Certification`);
  34. serverUrl = `https://localhost:${port}}`;
  35. const fs = require('graceful-fs');
  36. const https = require('https');
  37. const options = {
  38. key: fs.readFileSync(path.join(this.crowi.rootDir, './resource/certs/localhost/key.pem')),
  39. cert: fs.readFileSync(path.join(this.crowi.rootDir, './resource/certs/localhost/cert.pem')),
  40. };
  41. server = https.createServer(options, app);
  42. }
  43. const eazyLogger = require('eazy-logger').Logger({
  44. prefix: '[{green:GROWI}] ',
  45. useLevelPrefixes: false,
  46. });
  47. eazyLogger.info('{bold:Server URLs:}');
  48. eazyLogger.unprefixed('info', '{grey:=======================================}');
  49. eazyLogger.unprefixed('info', ` APP: {magenta:${serverUrl}}`);
  50. eazyLogger.unprefixed('info', '{grey:=======================================}');
  51. return server;
  52. }
  53. setupExpressBeforeListening(app) {
  54. this.setupNextBundleAnalyzer(app);
  55. }
  56. setupExpressAfterListening(app) {
  57. this.setupNextjsStackFrame(app);
  58. }
  59. setupNextBundleAnalyzer(app) {
  60. const next = nextFactory(this.crowi);
  61. app.use('/analyze', express.static(path.resolve(__dirname, '../../../.next/analyze')));
  62. }
  63. setupNextjsStackFrame(app) {
  64. const next = nextFactory(this.crowi);
  65. app.get('/__nextjs_original-stack-frame', next.delegateToNext);
  66. }
  67. }
  68. module.exports = CrowiDev;