Browse Source

configure biome for app crowi dir

Futa Arai 5 months ago
parent
commit
c105cbc278

+ 6 - 4
apps/app/src/server/app.ts

@@ -1,12 +1,15 @@
 import type Logger from 'bunyan';
 import type Logger from 'bunyan';
 
 
-import { initInstrumentation, setupAdditionalResourceAttributes, startOpenTelemetry } from '~/features/opentelemetry/server';
+import {
+  initInstrumentation,
+  setupAdditionalResourceAttributes,
+  startOpenTelemetry,
+} from '~/features/opentelemetry/server';
 import loggerFactory from '~/utils/logger';
 import loggerFactory from '~/utils/logger';
 import { hasProcessFlag } from '~/utils/process-utils';
 import { hasProcessFlag } from '~/utils/process-utils';
 
 
 const logger: Logger = loggerFactory('growi');
 const logger: Logger = loggerFactory('growi');
 
 
-
 /** **********************************
 /** **********************************
  *          Main Process
  *          Main Process
  ********************************** */
  ********************************** */
@@ -37,8 +40,7 @@ async function main() {
         process.exit();
         process.exit();
       });
       });
     }
     }
-  }
-  catch (err) {
+  } catch (err) {
     logger.error('An error occurred, unable to start the server');
     logger.error('An error occurred, unable to start the server');
     logger.error(err);
     logger.error(err);
     process.exit(1);
     process.exit(1);

+ 22 - 11
apps/app/src/server/crowi/dev.js

@@ -1,6 +1,5 @@
-import path from 'path';
-
 import express from 'express';
 import express from 'express';
+import path from 'path';
 
 
 import loggerFactory from '~/utils/logger';
 import loggerFactory from '~/utils/logger';
 
 
@@ -8,9 +7,7 @@ import nextFactory from '../routes/next';
 
 
 const logger = loggerFactory('growi:crowi:dev');
 const logger = loggerFactory('growi:crowi:dev');
 
 
-
 class CrowiDev {
 class CrowiDev {
-
   /**
   /**
    * @param {import('~/server/crowi').default} crowi Crowi instance
    * @param {import('~/server/crowi').default} crowi Crowi instance
    *
    *
@@ -43,7 +40,9 @@ class CrowiDev {
     let serverUrl = `http://localhost:${port}}`;
     let serverUrl = `http://localhost:${port}}`;
 
 
     if (this.crowi.env.DEV_HTTPS) {
     if (this.crowi.env.DEV_HTTPS) {
-      logger.info(`[${this.crowi.node_env}] Express server will start with HTTPS Self-Signed Certification`);
+      logger.info(
+        `[${this.crowi.node_env}] Express server will start with HTTPS Self-Signed Certification`,
+      );
 
 
       serverUrl = `https://localhost:${port}}`;
       serverUrl = `https://localhost:${port}}`;
 
 
@@ -51,8 +50,12 @@ class CrowiDev {
       const https = require('https');
       const https = require('https');
 
 
       const options = {
       const options = {
-        key: fs.readFileSync(path.join(this.crowi.rootDir, './resource/certs/localhost/key.pem')),
-        cert: fs.readFileSync(path.join(this.crowi.rootDir, './resource/certs/localhost/cert.pem')),
+        key: fs.readFileSync(
+          path.join(this.crowi.rootDir, './resource/certs/localhost/key.pem'),
+        ),
+        cert: fs.readFileSync(
+          path.join(this.crowi.rootDir, './resource/certs/localhost/cert.pem'),
+        ),
       };
       };
 
 
       server = https.createServer(options, app);
       server = https.createServer(options, app);
@@ -64,9 +67,15 @@ class CrowiDev {
     });
     });
 
 
     eazyLogger.info('{bold:Server URLs:}');
     eazyLogger.info('{bold:Server URLs:}');
-    eazyLogger.unprefixed('info', '{grey:=======================================}');
+    eazyLogger.unprefixed(
+      'info',
+      '{grey:=======================================}',
+    );
     eazyLogger.unprefixed('info', `         APP: {magenta:${serverUrl}}`);
     eazyLogger.unprefixed('info', `         APP: {magenta:${serverUrl}}`);
-    eazyLogger.unprefixed('info', '{grey:=======================================}');
+    eazyLogger.unprefixed(
+      'info',
+      '{grey:=======================================}',
+    );
 
 
     return server;
     return server;
   }
   }
@@ -81,14 +90,16 @@ class CrowiDev {
 
 
   setupNextBundleAnalyzer(app) {
   setupNextBundleAnalyzer(app) {
     const next = nextFactory(this.crowi);
     const next = nextFactory(this.crowi);
-    app.use('/analyze', express.static(path.resolve(__dirname, '../../../.next/analyze')));
+    app.use(
+      '/analyze',
+      express.static(path.resolve(__dirname, '../../../.next/analyze')),
+    );
   }
   }
 
 
   setupNextjsStackFrame(app) {
   setupNextjsStackFrame(app) {
     const next = nextFactory(this.crowi);
     const next = nextFactory(this.crowi);
     app.get('/__nextjs_original-stack-frame', next.delegateToNext);
     app.get('/__nextjs_original-stack-frame', next.delegateToNext);
   }
   }
-
 }
 }
 
 
 module.exports = CrowiDev;
 module.exports = CrowiDev;

+ 42 - 23
apps/app/src/server/crowi/express-init.js

@@ -2,18 +2,20 @@ import { themesRootPath as presetThemesRootPath } from '@growi/preset-themes';
 import csrf from 'csurf';
 import csrf from 'csurf';
 import qs from 'qs';
 import qs from 'qs';
 
 
+import { resolveFromRoot } from '~/server/util/project-dir-utils';
 
 
-import { PLUGIN_EXPRESS_STATIC_DIR, PLUGIN_STORING_PATH } from '../../features/growi-plugin/server/consts';
+import {
+  PLUGIN_EXPRESS_STATIC_DIR,
+  PLUGIN_STORING_PATH,
+} from '../../features/growi-plugin/server/consts';
 import loggerFactory from '../../utils/logger';
 import loggerFactory from '../../utils/logger';
-import { resolveFromRoot } from '~/server/util/project-dir-utils';
 import CertifyOrigin from '../middlewares/certify-origin';
 import CertifyOrigin from '../middlewares/certify-origin';
-
 import registerSafeRedirectFactory from '../middlewares/safe-redirect';
 import registerSafeRedirectFactory from '../middlewares/safe-redirect';
 
 
 const logger = loggerFactory('growi:crowi:express-init');
 const logger = loggerFactory('growi:crowi:express-init');
 
 
 /** @param {import('./index').default} crowi Crowi instance */
 /** @param {import('./index').default} crowi Crowi instance */
-module.exports = function(crowi, app) {
+module.exports = (crowi, app) => {
   const express = require('express');
   const express = require('express');
   const compression = require('compression');
   const compression = require('compression');
   const helmet = require('helmet');
   const helmet = require('helmet');
@@ -26,19 +28,20 @@ module.exports = function(crowi, app) {
   const mongoSanitize = require('express-mongo-sanitize');
   const mongoSanitize = require('express-mongo-sanitize');
 
 
   const registerSafeRedirect = registerSafeRedirectFactory();
   const registerSafeRedirect = registerSafeRedirectFactory();
-  const injectCurrentuserToLocalvars = require('../middlewares/inject-currentuser-to-localvars')();
-  const autoReconnectToS2sMsgServer = require('../middlewares/auto-reconnect-to-s2s-msg-server')(crowi);
+  const injectCurrentuserToLocalvars =
+    require('../middlewares/inject-currentuser-to-localvars')();
+  const autoReconnectToS2sMsgServer =
+    require('../middlewares/auto-reconnect-to-s2s-msg-server')(crowi);
   const avoidSessionRoutes = require('../routes/avoid-session-routes');
   const avoidSessionRoutes = require('../routes/avoid-session-routes');
 
 
   const env = crowi.node_env;
   const env = crowi.node_env;
 
 
   // see: https://qiita.com/nazomikan/items/9458d591a4831480098d
   // see: https://qiita.com/nazomikan/items/9458d591a4831480098d
   // Cannot set a custom query parser after app.use() has been called: https://github.com/expressjs/express/issues/3454
   // Cannot set a custom query parser after app.use() has been called: https://github.com/expressjs/express/issues/3454
-  app.set('query parser', str => qs.parse(str, { arrayLimit: Infinity }));
+  app.set('query parser', (str) => qs.parse(str, { arrayLimit: Infinity }));
 
 
   app.use(compression());
   app.use(compression());
 
 
-
   const { configManager } = crowi;
   const { configManager } = crowi;
 
 
   const trustProxyBool = configManager.getConfig('security:trustProxyBool');
   const trustProxyBool = configManager.getConfig('security:trustProxyBool');
@@ -49,24 +52,30 @@ module.exports = function(crowi, app) {
 
 
   try {
   try {
     if (trustProxy != null) {
     if (trustProxy != null) {
-      const isNotSpec = [trustProxyBool, trustProxyCsv, trustProxyHops].filter(trustProxy => trustProxy != null).length !== 1;
+      const isNotSpec =
+        [trustProxyBool, trustProxyCsv, trustProxyHops].filter(
+          (trustProxy) => trustProxy != null,
+        ).length !== 1;
       if (isNotSpec) {
       if (isNotSpec) {
         // eslint-disable-next-line max-len
         // eslint-disable-next-line max-len
-        logger.warn(`If more than one TRUST_PROXY_ ~ environment variable is set, the values are set in the following order of inequality size (BOOL > CSV > HOPS) first. Set value: ${trustProxy}`);
+        logger.warn(
+          `If more than one TRUST_PROXY_ ~ environment variable is set, the values are set in the following order of inequality size (BOOL > CSV > HOPS) first. Set value: ${trustProxy}`,
+        );
       }
       }
       app.set('trust proxy', trustProxy);
       app.set('trust proxy', trustProxy);
     }
     }
-  }
-  catch (err) {
+  } catch (err) {
     logger.error(err);
     logger.error(err);
   }
   }
 
 
-  app.use(helmet({
-    contentSecurityPolicy: false,
-    expectCt: false,
-    referrerPolicy: false,
-    permittedCrossDomainPolicies: false,
-  }));
+  app.use(
+    helmet({
+      contentSecurityPolicy: false,
+      expectCt: false,
+      referrerPolicy: false,
+      permittedCrossDomainPolicies: false,
+    }),
+  );
 
 
   app.use((req, res, next) => {
   app.use((req, res, next) => {
     const now = new Date();
     const now = new Date();
@@ -83,11 +92,16 @@ module.exports = function(crowi, app) {
 
 
   app.set('port', crowi.port);
   app.set('port', crowi.port);
 
 
-  const staticOption = (crowi.node_env === 'production') ? { maxAge: '30d' } : {};
+  const staticOption = crowi.node_env === 'production' ? { maxAge: '30d' } : {};
   app.use(express.static(crowi.publicDir, staticOption));
   app.use(express.static(crowi.publicDir, staticOption));
-  app.use('/static/preset-themes', express.static(
-    resolveFromRoot(`node_modules/@growi/preset-themes/${presetThemesRootPath}`),
-  ));
+  app.use(
+    '/static/preset-themes',
+    express.static(
+      resolveFromRoot(
+        `node_modules/@growi/preset-themes/${presetThemesRootPath}`,
+      ),
+    ),
+  );
   app.use(PLUGIN_EXPRESS_STATIC_DIR, express.static(PLUGIN_STORING_PATH));
   app.use(PLUGIN_EXPRESS_STATIC_DIR, express.static(PLUGIN_STORING_PATH));
 
 
   app.use(methodOverride());
   app.use(methodOverride());
@@ -122,7 +136,12 @@ module.exports = function(crowi, app) {
 
 
   // csurf should be initialized after express-session
   // csurf should be initialized after express-session
   // default methods + PUT. See: https://expressjs.com/en/resources/middleware/csurf.html#ignoremethods
   // default methods + PUT. See: https://expressjs.com/en/resources/middleware/csurf.html#ignoremethods
-  app.use(csrf({ ignoreMethods: ['GET', 'HEAD', 'OPTIONS', 'PUT', 'POST', 'DELETE'], cookie: false }));
+  app.use(
+    csrf({
+      ignoreMethods: ['GET', 'HEAD', 'OPTIONS', 'PUT', 'POST', 'DELETE'],
+      cookie: false,
+    }),
+  );
 
 
   app.use('/_api', CertifyOrigin);
   app.use('/_api', CertifyOrigin);
 
 

+ 122 - 99
apps/app/src/server/crowi/index.js

@@ -1,12 +1,12 @@
 /* eslint-disable @typescript-eslint/no-this-alias */
 /* eslint-disable @typescript-eslint/no-this-alias */
-import http from 'http';
-import path from 'path';
 
 
+import next from 'next';
 import { createTerminus } from '@godaddy/terminus';
 import { createTerminus } from '@godaddy/terminus';
 import attachmentRoutes from '@growi/remark-attachment-refs/dist/server';
 import attachmentRoutes from '@growi/remark-attachment-refs/dist/server';
 import lsxRoutes from '@growi/remark-lsx/dist/server/index.cjs';
 import lsxRoutes from '@growi/remark-lsx/dist/server/index.cjs';
+import http from 'http';
 import mongoose from 'mongoose';
 import mongoose from 'mongoose';
-import next from 'next';
+import path from 'path';
 
 
 import { KeycloakUserGroupSyncService } from '~/features/external-user-group/server/service/keycloak-user-group-sync';
 import { KeycloakUserGroupSyncService } from '~/features/external-user-group/server/service/keycloak-user-group-sync';
 import { LdapUserGroupSyncService } from '~/features/external-user-group/server/service/ldap-user-group-sync';
 import { LdapUserGroupSyncService } from '~/features/external-user-group/server/service/ldap-user-group-sync';
@@ -31,7 +31,10 @@ import { configManager as configManagerSingletonInstance } from '../service/conf
 import instanciateExportService from '../service/export';
 import instanciateExportService from '../service/export';
 import instanciateExternalAccountService from '../service/external-account';
 import instanciateExternalAccountService from '../service/external-account';
 import { FileUploader, getUploader } from '../service/file-uploader'; // eslint-disable-line no-unused-vars
 import { FileUploader, getUploader } from '../service/file-uploader'; // eslint-disable-line no-unused-vars
-import { G2GTransferPusherService, G2GTransferReceiverService } from '../service/g2g-transfer';
+import {
+  G2GTransferPusherService,
+  G2GTransferReceiverService,
+} from '../service/g2g-transfer';
 import { GrowiBridgeService } from '../service/growi-bridge';
 import { GrowiBridgeService } from '../service/growi-bridge';
 import { initializeImportService } from '../service/import';
 import { initializeImportService } from '../service/import';
 import { InstallerService } from '../service/installer';
 import { InstallerService } from '../service/installer';
@@ -46,18 +49,19 @@ import { SocketIoService } from '../service/socket-io';
 import UserGroupService from '../service/user-group';
 import UserGroupService from '../service/user-group';
 import { UserNotificationService } from '../service/user-notification';
 import { UserNotificationService } from '../service/user-notification';
 import { initializeYjsService } from '../service/yjs';
 import { initializeYjsService } from '../service/yjs';
-import { getModelSafely, getMongoUri, mongoOptions } from '../util/mongoose-utils';
-
+import {
+  getModelSafely,
+  getMongoUri,
+  mongoOptions,
+} from '../util/mongoose-utils';
 import { setupModelsDependentOnCrowi } from './setup-models';
 import { setupModelsDependentOnCrowi } from './setup-models';
 
 
-
 const logger = loggerFactory('growi:crowi');
 const logger = loggerFactory('growi:crowi');
 const httpErrorHandler = require('../middlewares/http-error-handler');
 const httpErrorHandler = require('../middlewares/http-error-handler');
 
 
 const sep = path.sep;
 const sep = path.sep;
 
 
 class Crowi {
 class Crowi {
-
   /**
   /**
    * For retrieving other packages
    * For retrieving other packages
    * @type {import('~/server/middlewares/access-token-parser').AccessTokenParser}
    * @type {import('~/server/middlewares/access-token-parser').AccessTokenParser}
@@ -167,10 +171,9 @@ class Crowi {
       admin: new (require('../events/admin'))(this),
       admin: new (require('../events/admin'))(this),
     };
     };
   }
   }
-
 }
 }
 
 
-Crowi.prototype.init = async function() {
+Crowi.prototype.init = async function () {
   await this.setupDatabase();
   await this.setupDatabase();
   this.models = await setupModelsDependentOnCrowi(this);
   this.models = await setupModelsDependentOnCrowi(this);
   await this.setupConfigManager();
   await this.setupConfigManager();
@@ -183,10 +186,7 @@ Crowi.prototype.init = async function() {
   // customizeService depends on AppService
   // customizeService depends on AppService
   // passportService depends on appService
   // passportService depends on appService
   // export and import depends on setUpGrowiBridge
   // export and import depends on setUpGrowiBridge
-  await Promise.all([
-    this.setUpApp(),
-    this.setUpGrowiBridge(),
-  ]);
+  await Promise.all([this.setUpApp(), this.setUpGrowiBridge()]);
 
 
   await Promise.all([
   await Promise.all([
     this.setupGrowiInfoService(),
     this.setupGrowiInfoService(),
@@ -232,14 +232,13 @@ Crowi.prototype.init = async function() {
 /**
 /**
  * Execute functions that should be run after the express server is ready.
  * Execute functions that should be run after the express server is ready.
  */
  */
-Crowi.prototype.asyncAfterExpressServerReady = async function() {
+Crowi.prototype.asyncAfterExpressServerReady = async function () {
   if (this.pageOperationService != null) {
   if (this.pageOperationService != null) {
     await this.pageOperationService.afterExpressServerReady();
     await this.pageOperationService.afterExpressServerReady();
   }
   }
 };
 };
 
 
-
-Crowi.prototype.isPageId = function(pageId) {
+Crowi.prototype.isPageId = (pageId) => {
   if (!pageId) {
   if (!pageId) {
     return false;
     return false;
   }
   }
@@ -251,15 +250,15 @@ Crowi.prototype.isPageId = function(pageId) {
   return false;
   return false;
 };
 };
 
 
-Crowi.prototype.setConfig = function(config) {
+Crowi.prototype.setConfig = function (config) {
   this.config = config;
   this.config = config;
 };
 };
 
 
-Crowi.prototype.getConfig = function() {
+Crowi.prototype.getConfig = function () {
   return this.config;
   return this.config;
 };
 };
 
 
-Crowi.prototype.getEnv = function() {
+Crowi.prototype.getEnv = function () {
   return this.env;
   return this.env;
 };
 };
 
 
@@ -268,12 +267,10 @@ Crowi.prototype.getEnv = function() {
  * @param {string} modelName
  * @param {string} modelName
  * @returns {mongoose.Model}
  * @returns {mongoose.Model}
  */
  */
-Crowi.prototype.model = function(modelName) {
-  return getModelSafely(modelName);
-};
+Crowi.prototype.model = (modelName) => getModelSafely(modelName);
 
 
 // getter/setter of event instance
 // getter/setter of event instance
-Crowi.prototype.event = function(name, event) {
+Crowi.prototype.event = function (name, event) {
   if (event) {
   if (event) {
     this.events[name] = event;
     this.events[name] = event;
   }
   }
@@ -281,7 +278,7 @@ Crowi.prototype.event = function(name, event) {
   return this.events[name];
   return this.events[name];
 };
 };
 
 
-Crowi.prototype.setupDatabase = function() {
+Crowi.prototype.setupDatabase = () => {
   mongoose.Promise = global.Promise;
   mongoose.Promise = global.Promise;
 
 
   // mongoUri = mongodb://user:password@host/dbname
   // mongoUri = mongodb://user:password@host/dbname
@@ -290,10 +287,12 @@ Crowi.prototype.setupDatabase = function() {
   return mongoose.connect(mongoUri, mongoOptions);
   return mongoose.connect(mongoUri, mongoOptions);
 };
 };
 
 
-Crowi.prototype.setupSessionConfig = async function() {
+Crowi.prototype.setupSessionConfig = async function () {
   const session = require('express-session');
   const session = require('express-session');
-  const sessionMaxAge = this.configManager.getConfig('security:sessionMaxAge') || 2592000000; // default: 30days
-  const redisUrl = this.env.REDISTOGO_URL || this.env.REDIS_URI || this.env.REDIS_URL || null;
+  const sessionMaxAge =
+    this.configManager.getConfig('security:sessionMaxAge') || 2592000000; // default: 30days
+  const redisUrl =
+    this.env.REDISTOGO_URL || this.env.REDIS_URI || this.env.REDIS_URL || null;
   const uid = require('uid-safe').sync;
   const uid = require('uid-safe').sync;
 
 
   // generate pre-defined uid for healthcheck
   // generate pre-defined uid for healthcheck
@@ -330,18 +329,20 @@ Crowi.prototype.setupSessionConfig = async function() {
   // use MongoDB for session store
   // use MongoDB for session store
   else {
   else {
     const MongoStore = require('connect-mongo');
     const MongoStore = require('connect-mongo');
-    sessionConfig.store = MongoStore.create({ client: mongoose.connection.getClient() });
+    sessionConfig.store = MongoStore.create({
+      client: mongoose.connection.getClient(),
+    });
   }
   }
 
 
   this.sessionConfig = sessionConfig;
   this.sessionConfig = sessionConfig;
 };
 };
 
 
-Crowi.prototype.setupConfigManager = async function() {
+Crowi.prototype.setupConfigManager = async function () {
   this.configManager = configManagerSingletonInstance;
   this.configManager = configManagerSingletonInstance;
   return this.configManager.loadConfigs();
   return this.configManager.loadConfigs();
 };
 };
 
 
-Crowi.prototype.setupS2sMessagingService = async function() {
+Crowi.prototype.setupS2sMessagingService = async function () {
   const s2sMessagingService = require('../service/s2s-messaging')(this);
   const s2sMessagingService = require('../service/s2s-messaging')(this);
   if (s2sMessagingService != null) {
   if (s2sMessagingService != null) {
     s2sMessagingService.subscribe();
     s2sMessagingService.subscribe();
@@ -353,11 +354,11 @@ Crowi.prototype.setupS2sMessagingService = async function() {
   }
   }
 };
 };
 
 
-Crowi.prototype.setupSocketIoService = async function() {
+Crowi.prototype.setupSocketIoService = async function () {
   this.socketIoService = new SocketIoService(this);
   this.socketIoService = new SocketIoService(this);
 };
 };
 
 
-Crowi.prototype.setupCron = function() {
+Crowi.prototype.setupCron = function () {
   instanciatePageBulkExportJobCronService(this);
   instanciatePageBulkExportJobCronService(this);
   checkPageBulkExportJobInProgressCronService.startCron();
   checkPageBulkExportJobInProgressCronService.startCron();
 
 
@@ -368,23 +369,23 @@ Crowi.prototype.setupCron = function() {
   startAccessTokenCron();
   startAccessTokenCron();
 };
 };
 
 
-Crowi.prototype.getSlack = function() {
+Crowi.prototype.getSlack = function () {
   return this.slack;
   return this.slack;
 };
 };
 
 
-Crowi.prototype.getSlackLegacy = function() {
+Crowi.prototype.getSlackLegacy = function () {
   return this.slackLegacy;
   return this.slackLegacy;
 };
 };
 
 
-Crowi.prototype.getGlobalNotificationService = function() {
+Crowi.prototype.getGlobalNotificationService = function () {
   return this.globalNotificationService;
   return this.globalNotificationService;
 };
 };
 
 
-Crowi.prototype.getUserNotificationService = function() {
+Crowi.prototype.getUserNotificationService = function () {
   return this.userNotificationService;
   return this.userNotificationService;
 };
 };
 
 
-Crowi.prototype.setupPassport = async function() {
+Crowi.prototype.setupPassport = async function () {
   logger.debug('Passport is enabled');
   logger.debug('Passport is enabled');
 
 
   // initialize service
   // initialize service
@@ -400,8 +401,7 @@ Crowi.prototype.setupPassport = async function() {
     this.passportService.setupStrategyById('oidc');
     this.passportService.setupStrategyById('oidc');
     this.passportService.setupStrategyById('google');
     this.passportService.setupStrategyById('google');
     this.passportService.setupStrategyById('github');
     this.passportService.setupStrategyById('github');
-  }
-  catch (err) {
+  } catch (err) {
     logger.error(err);
     logger.error(err);
   }
   }
 
 
@@ -413,11 +413,11 @@ Crowi.prototype.setupPassport = async function() {
   return Promise.resolve();
   return Promise.resolve();
 };
 };
 
 
-Crowi.prototype.setupSearcher = async function() {
+Crowi.prototype.setupSearcher = async function () {
   this.searchService = new SearchService(this);
   this.searchService = new SearchService(this);
 };
 };
 
 
-Crowi.prototype.setupMailer = async function() {
+Crowi.prototype.setupMailer = async function () {
   const MailService = require('~/server/service/mail');
   const MailService = require('~/server/service/mail');
   this.mailService = new MailService(this);
   this.mailService = new MailService(this);
 
 
@@ -427,7 +427,7 @@ Crowi.prototype.setupMailer = async function() {
   }
   }
 };
 };
 
 
-Crowi.prototype.autoInstall = async function() {
+Crowi.prototype.autoInstall = async function () {
   const isInstalled = this.configManager.getConfig('app:installed');
   const isInstalled = this.configManager.getConfig('app:installed');
   const username = this.configManager.getConfig('autoInstall:adminUsername');
   const username = this.configManager.getConfig('autoInstall:adminUsername');
 
 
@@ -445,27 +445,32 @@ Crowi.prototype.autoInstall = async function() {
     admin: true,
     admin: true,
   };
   };
   const globalLang = this.configManager.getConfig('autoInstall:globalLang');
   const globalLang = this.configManager.getConfig('autoInstall:globalLang');
-  const allowGuestMode = this.configManager.getConfig('autoInstall:allowGuestMode');
+  const allowGuestMode = this.configManager.getConfig(
+    'autoInstall:allowGuestMode',
+  );
   const serverDate = this.configManager.getConfig('autoInstall:serverDate');
   const serverDate = this.configManager.getConfig('autoInstall:serverDate');
 
 
   const installerService = new InstallerService(this);
   const installerService = new InstallerService(this);
 
 
   try {
   try {
-    await installerService.install(firstAdminUserToSave, globalLang ?? 'en_US', {
-      allowGuestMode,
-      serverDate,
-    });
-  }
-  catch (err) {
+    await installerService.install(
+      firstAdminUserToSave,
+      globalLang ?? 'en_US',
+      {
+        allowGuestMode,
+        serverDate,
+      },
+    );
+  } catch (err) {
     logger.warn('Automatic installation failed.', err);
     logger.warn('Automatic installation failed.', err);
   }
   }
 };
 };
 
 
-Crowi.prototype.getTokens = function() {
+Crowi.prototype.getTokens = function () {
   return this.tokens;
   return this.tokens;
 };
 };
 
 
-Crowi.prototype.start = async function() {
+Crowi.prototype.start = async function () {
   const dev = process.env.NODE_ENV !== 'production';
   const dev = process.env.NODE_ENV !== 'production';
 
 
   await this.init();
   await this.init();
@@ -484,7 +489,10 @@ Crowi.prototype.start = async function() {
 
 
   const { express } = this;
   const { express } = this;
 
 
-  const app = (this.node_env === 'development') ? this.crowiDev.setupServer(express) : express;
+  const app =
+    this.node_env === 'development'
+      ? this.crowiDev.setupServer(express)
+      : express;
 
 
   const httpServer = http.createServer(app);
   const httpServer = http.createServer(app);
 
 
@@ -501,7 +509,9 @@ Crowi.prototype.start = async function() {
 
 
   // listen
   // listen
   const serverListening = httpServer.listen(this.port, () => {
   const serverListening = httpServer.listen(this.port, () => {
-    logger.info(`[${this.node_env}] Express server is listening on port ${this.port}`);
+    logger.info(
+      `[${this.node_env}] Express server is listening on port ${this.port}`,
+    );
     if (this.node_env === 'development') {
     if (this.node_env === 'development') {
       this.crowiDev.setupExpressAfterListening(express);
       this.crowiDev.setupExpressAfterListening(express);
     }
     }
@@ -520,7 +530,7 @@ Crowi.prototype.start = async function() {
   return serverListening;
   return serverListening;
 };
 };
 
 
-Crowi.prototype.buildServer = async function() {
+Crowi.prototype.buildServer = async function () {
   const env = this.node_env;
   const env = this.node_env;
   const express = require('express')();
   const express = require('express')();
 
 
@@ -530,10 +540,12 @@ Crowi.prototype.buildServer = async function() {
   if (env === 'production') {
   if (env === 'production') {
     const expressBunyanLogger = require('express-bunyan-logger');
     const expressBunyanLogger = require('express-bunyan-logger');
     const logger = loggerFactory('express');
     const logger = loggerFactory('express');
-    express.use(expressBunyanLogger({
-      logger,
-      excludes: ['*'],
-    }));
+    express.use(
+      expressBunyanLogger({
+        logger,
+        excludes: ['*'],
+      }),
+    );
   }
   }
   // use morgan
   // use morgan
   else {
   else {
@@ -544,22 +556,22 @@ Crowi.prototype.buildServer = async function() {
   this.express = express;
   this.express = express;
 };
 };
 
 
-Crowi.prototype.setupTerminus = function(server) {
+Crowi.prototype.setupTerminus = (server) => {
   createTerminus(server, {
   createTerminus(server, {
     signals: ['SIGINT', 'SIGTERM'],
     signals: ['SIGINT', 'SIGTERM'],
-    onSignal: async() => {
+    onSignal: async () => {
       logger.info('Server is starting cleanup');
       logger.info('Server is starting cleanup');
 
 
       await mongoose.disconnect();
       await mongoose.disconnect();
       return;
       return;
     },
     },
-    onShutdown: async() => {
+    onShutdown: async () => {
       logger.info('Cleanup finished, server is shutting down');
       logger.info('Cleanup finished, server is shutting down');
     },
     },
   });
   });
 };
 };
 
 
-Crowi.prototype.setupRoutesForPlugins = function() {
+Crowi.prototype.setupRoutesForPlugins = function () {
   lsxRoutes(this, this.express);
   lsxRoutes(this, this.express);
   attachmentRoutes(this, this.express);
   attachmentRoutes(this, this.express);
 };
 };
@@ -568,7 +580,7 @@ Crowi.prototype.setupRoutesForPlugins = function() {
  * setup Express Routes
  * setup Express Routes
  * !! this must be at last because it includes '/*' route !!
  * !! this must be at last because it includes '/*' route !!
  */
  */
-Crowi.prototype.setupRoutesAtLast = function() {
+Crowi.prototype.setupRoutesAtLast = function () {
   require('../routes')(this, this.express);
   require('../routes')(this, this.express);
 };
 };
 
 
@@ -576,7 +588,7 @@ Crowi.prototype.setupRoutesAtLast = function() {
  * setup global error handlers
  * setup global error handlers
  * !! this must be after the Routes setup !!
  * !! this must be after the Routes setup !!
  */
  */
-Crowi.prototype.setupGlobalErrorHandlers = function() {
+Crowi.prototype.setupGlobalErrorHandlers = function () {
   this.express.use(httpErrorHandler);
   this.express.use(httpErrorHandler);
 };
 };
 
 
@@ -588,14 +600,12 @@ Crowi.prototype.setupGlobalErrorHandlers = function() {
  *
  *
  * @memberof Crowi
  * @memberof Crowi
  */
  */
-Crowi.prototype.require = function(modulePath) {
-  return require(modulePath);
-};
+Crowi.prototype.require = (modulePath) => require(modulePath);
 
 
 /**
 /**
  * setup GlobalNotificationService
  * setup GlobalNotificationService
  */
  */
-Crowi.prototype.setUpGlobalNotification = async function() {
+Crowi.prototype.setUpGlobalNotification = async function () {
   const GlobalNotificationService = require('../service/global-notification');
   const GlobalNotificationService = require('../service/global-notification');
   if (this.globalNotificationService == null) {
   if (this.globalNotificationService == null) {
     this.globalNotificationService = new GlobalNotificationService(this);
     this.globalNotificationService = new GlobalNotificationService(this);
@@ -605,7 +615,7 @@ Crowi.prototype.setUpGlobalNotification = async function() {
 /**
 /**
  * setup UserNotificationService
  * setup UserNotificationService
  */
  */
-Crowi.prototype.setUpUserNotification = async function() {
+Crowi.prototype.setUpUserNotification = async function () {
   if (this.userNotificationService == null) {
   if (this.userNotificationService == null) {
     this.userNotificationService = new UserNotificationService(this);
     this.userNotificationService = new UserNotificationService(this);
   }
   }
@@ -614,14 +624,14 @@ Crowi.prototype.setUpUserNotification = async function() {
 /**
 /**
  * setup AclService
  * setup AclService
  */
  */
-Crowi.prototype.setUpAcl = async function() {
+Crowi.prototype.setUpAcl = async function () {
   this.aclService = aclServiceSingletonInstance;
   this.aclService = aclServiceSingletonInstance;
 };
 };
 
 
 /**
 /**
  * setup CustomizeService
  * setup CustomizeService
  */
  */
-Crowi.prototype.setUpCustomize = async function() {
+Crowi.prototype.setUpCustomize = async function () {
   const CustomizeService = require('../service/customize');
   const CustomizeService = require('../service/customize');
   if (this.customizeService == null) {
   if (this.customizeService == null) {
     this.customizeService = new CustomizeService(this);
     this.customizeService = new CustomizeService(this);
@@ -639,7 +649,7 @@ Crowi.prototype.setUpCustomize = async function() {
 /**
 /**
  * setup AppService
  * setup AppService
  */
  */
-Crowi.prototype.setUpApp = async function() {
+Crowi.prototype.setUpApp = async function () {
   if (this.appService == null) {
   if (this.appService == null) {
     this.appService = new AppService(this);
     this.appService = new AppService(this);
 
 
@@ -654,7 +664,7 @@ Crowi.prototype.setUpApp = async function() {
 /**
 /**
  * setup FileUploadService
  * setup FileUploadService
  */
  */
-Crowi.prototype.setUpFileUpload = async function(isForceUpdate = false) {
+Crowi.prototype.setUpFileUpload = async function (isForceUpdate = false) {
   if (this.fileUploadService == null || isForceUpdate) {
   if (this.fileUploadService == null || isForceUpdate) {
     this.fileUploadService = getUploader(this);
     this.fileUploadService = getUploader(this);
   }
   }
@@ -663,7 +673,7 @@ Crowi.prototype.setUpFileUpload = async function(isForceUpdate = false) {
 /**
 /**
  * setup FileUploaderSwitchService
  * setup FileUploaderSwitchService
  */
  */
-Crowi.prototype.setUpFileUploaderSwitchService = async function() {
+Crowi.prototype.setUpFileUploaderSwitchService = async function () {
   const FileUploaderSwitchService = require('../service/file-uploader-switch');
   const FileUploaderSwitchService = require('../service/file-uploader-switch');
   this.fileUploaderSwitchService = new FileUploaderSwitchService(this);
   this.fileUploaderSwitchService = new FileUploaderSwitchService(this);
   // add as a message handler
   // add as a message handler
@@ -672,7 +682,7 @@ Crowi.prototype.setUpFileUploaderSwitchService = async function() {
   }
   }
 };
 };
 
 
-Crowi.prototype.setupGrowiInfoService = async function() {
+Crowi.prototype.setupGrowiInfoService = async function () {
   const { growiInfoService } = await import('../service/growi-info');
   const { growiInfoService } = await import('../service/growi-info');
   this.growiInfoService = growiInfoService;
   this.growiInfoService = growiInfoService;
 };
 };
@@ -680,7 +690,7 @@ Crowi.prototype.setupGrowiInfoService = async function() {
 /**
 /**
  * setup AttachmentService
  * setup AttachmentService
  */
  */
-Crowi.prototype.setupAttachmentService = async function() {
+Crowi.prototype.setupAttachmentService = async function () {
   if (this.attachmentService == null) {
   if (this.attachmentService == null) {
     this.attachmentService = new AttachmentService(this);
     this.attachmentService = new AttachmentService(this);
   }
   }
@@ -689,43 +699,45 @@ Crowi.prototype.setupAttachmentService = async function() {
 /**
 /**
  * setup RestQiitaAPIService
  * setup RestQiitaAPIService
  */
  */
-Crowi.prototype.setUpRestQiitaAPI = async function() {
+Crowi.prototype.setUpRestQiitaAPI = async function () {
   const RestQiitaAPIService = require('../service/rest-qiita-API');
   const RestQiitaAPIService = require('../service/rest-qiita-API');
   if (this.restQiitaAPIService == null) {
   if (this.restQiitaAPIService == null) {
     this.restQiitaAPIService = new RestQiitaAPIService(this);
     this.restQiitaAPIService = new RestQiitaAPIService(this);
   }
   }
 };
 };
 
 
-Crowi.prototype.setupUserGroupService = async function() {
+Crowi.prototype.setupUserGroupService = async function () {
   if (this.userGroupService == null) {
   if (this.userGroupService == null) {
     this.userGroupService = new UserGroupService(this);
     this.userGroupService = new UserGroupService(this);
     return this.userGroupService.init();
     return this.userGroupService.init();
   }
   }
 };
 };
 
 
-Crowi.prototype.setUpGrowiBridge = async function() {
+Crowi.prototype.setUpGrowiBridge = async function () {
   if (this.growiBridgeService == null) {
   if (this.growiBridgeService == null) {
     this.growiBridgeService = new GrowiBridgeService(this);
     this.growiBridgeService = new GrowiBridgeService(this);
   }
   }
 };
 };
 
 
-Crowi.prototype.setupExport = async function() {
+Crowi.prototype.setupExport = async function () {
   instanciateExportService(this);
   instanciateExportService(this);
 };
 };
 
 
-Crowi.prototype.setupImport = async function() {
+Crowi.prototype.setupImport = async function () {
   initializeImportService(this);
   initializeImportService(this);
 };
 };
 
 
-Crowi.prototype.setupGrowiPluginService = async function() {
-  const growiPluginService = await import('~/features/growi-plugin/server/services').then(mod => mod.growiPluginService);
+Crowi.prototype.setupGrowiPluginService = async () => {
+  const growiPluginService = await import(
+    '~/features/growi-plugin/server/services'
+  ).then((mod) => mod.growiPluginService);
 
 
   // download plugin repositories, if document exists but there is no repository
   // download plugin repositories, if document exists but there is no repository
   // TODO: Cannot download unless connected to the Internet at setup.
   // TODO: Cannot download unless connected to the Internet at setup.
   await growiPluginService.downloadNotExistPluginRepositories();
   await growiPluginService.downloadNotExistPluginRepositories();
 };
 };
 
 
-Crowi.prototype.setupPageService = async function() {
+Crowi.prototype.setupPageService = async function () {
   if (this.pageGrantService == null) {
   if (this.pageGrantService == null) {
     this.pageGrantService = new PageGrantService(this);
     this.pageGrantService = new PageGrantService(this);
   }
   }
@@ -737,14 +749,14 @@ Crowi.prototype.setupPageService = async function() {
   this.pageOperationService = instanciatePageOperationService(this);
   this.pageOperationService = instanciatePageOperationService(this);
 };
 };
 
 
-Crowi.prototype.setupInAppNotificationService = async function() {
+Crowi.prototype.setupInAppNotificationService = async function () {
   const InAppNotificationService = require('../service/in-app-notification');
   const InAppNotificationService = require('../service/in-app-notification');
   if (this.inAppNotificationService == null) {
   if (this.inAppNotificationService == null) {
     this.inAppNotificationService = new InAppNotificationService(this);
     this.inAppNotificationService = new InAppNotificationService(this);
   }
   }
 };
 };
 
 
-Crowi.prototype.setupActivityService = async function() {
+Crowi.prototype.setupActivityService = async function () {
   const ActivityService = require('../service/activity');
   const ActivityService = require('../service/activity');
   if (this.activityService == null) {
   if (this.activityService == null) {
     this.activityService = new ActivityService(this);
     this.activityService = new ActivityService(this);
@@ -752,17 +764,21 @@ Crowi.prototype.setupActivityService = async function() {
   }
   }
 };
 };
 
 
-Crowi.prototype.setupCommentService = async function() {
+Crowi.prototype.setupCommentService = async function () {
   const CommentService = require('../service/comment');
   const CommentService = require('../service/comment');
   if (this.commentService == null) {
   if (this.commentService == null) {
     this.commentService = new CommentService(this);
     this.commentService = new CommentService(this);
   }
   }
 };
 };
 
 
-Crowi.prototype.setupSyncPageStatusService = async function() {
+Crowi.prototype.setupSyncPageStatusService = async function () {
   const SyncPageStatusService = require('../service/system-events/sync-page-status');
   const SyncPageStatusService = require('../service/system-events/sync-page-status');
   if (this.syncPageStatusService == null) {
   if (this.syncPageStatusService == null) {
-    this.syncPageStatusService = new SyncPageStatusService(this, this.s2sMessagingService, this.socketIoService);
+    this.syncPageStatusService = new SyncPageStatusService(
+      this,
+      this.s2sMessagingService,
+      this.socketIoService,
+    );
 
 
     // add as a message handler
     // add as a message handler
     if (this.s2sMessagingService != null) {
     if (this.s2sMessagingService != null) {
@@ -771,7 +787,7 @@ Crowi.prototype.setupSyncPageStatusService = async function() {
   }
   }
 };
 };
 
 
-Crowi.prototype.setupSlackIntegrationService = async function() {
+Crowi.prototype.setupSlackIntegrationService = async function () {
   if (this.slackIntegrationService == null) {
   if (this.slackIntegrationService == null) {
     this.slackIntegrationService = new SlackIntegrationService(this);
     this.slackIntegrationService = new SlackIntegrationService(this);
   }
   }
@@ -782,7 +798,7 @@ Crowi.prototype.setupSlackIntegrationService = async function() {
   }
   }
 };
 };
 
 
-Crowi.prototype.setupG2GTransferService = async function() {
+Crowi.prototype.setupG2GTransferService = async function () {
   if (this.g2gTransferPusherService == null) {
   if (this.g2gTransferPusherService == null) {
     this.g2gTransferPusherService = new G2GTransferPusherService(this);
     this.g2gTransferPusherService = new G2GTransferPusherService(this);
   }
   }
@@ -792,17 +808,24 @@ Crowi.prototype.setupG2GTransferService = async function() {
 };
 };
 
 
 // execute after setupPassport
 // execute after setupPassport
-Crowi.prototype.setupExternalAccountService = function() {
+Crowi.prototype.setupExternalAccountService = function () {
   instanciateExternalAccountService(this.passportService);
   instanciateExternalAccountService(this.passportService);
 };
 };
 
 
 // execute after setupPassport, s2sMessagingService, socketIoService
 // execute after setupPassport, s2sMessagingService, socketIoService
-Crowi.prototype.setupExternalUserGroupSyncService = function() {
-  this.ldapUserGroupSyncService = new LdapUserGroupSyncService(this.passportService, this.s2sMessagingService, this.socketIoService);
-  this.keycloakUserGroupSyncService = new KeycloakUserGroupSyncService(this.s2sMessagingService, this.socketIoService);
-};
-
-Crowi.prototype.setupOpenaiService = function() {
+Crowi.prototype.setupExternalUserGroupSyncService = function () {
+  this.ldapUserGroupSyncService = new LdapUserGroupSyncService(
+    this.passportService,
+    this.s2sMessagingService,
+    this.socketIoService,
+  );
+  this.keycloakUserGroupSyncService = new KeycloakUserGroupSyncService(
+    this.s2sMessagingService,
+    this.socketIoService,
+  );
+};
+
+Crowi.prototype.setupOpenaiService = function () {
   initializeOpenaiService(this);
   initializeOpenaiService(this);
 };
 };
 
 

+ 27 - 10
apps/app/src/server/crowi/setup-models.ts

@@ -8,27 +8,42 @@ const logger = loggerFactory('growi:crowi:setup-models');
 
 
 export type ModelsMapDependentOnCrowi = {
 export type ModelsMapDependentOnCrowi = {
   // eslint-disable-next-line @typescript-eslint/no-explicit-any
   // eslint-disable-next-line @typescript-eslint/no-explicit-any
-  [modelName: string]: Model<any>,
-}
+  [modelName: string]: Model<any>;
+};
 
 
-export const setupModelsDependentOnCrowi = async(crowi: Crowi): Promise<ModelsMapDependentOnCrowi> => {
+export const setupModelsDependentOnCrowi = async (
+  crowi: Crowi,
+): Promise<ModelsMapDependentOnCrowi> => {
   const modelsMap: ModelsMapDependentOnCrowi = {};
   const modelsMap: ModelsMapDependentOnCrowi = {};
 
 
   const modelsDependsOnCrowi = {
   const modelsDependsOnCrowi = {
     Page: (await import('../models/page')).default,
     Page: (await import('../models/page')).default,
     User: (await import('../models/user')).default,
     User: (await import('../models/user')).default,
     Bookmark: (await import('../models/bookmark')).default,
     Bookmark: (await import('../models/bookmark')).default,
-    GlobalNotificationSetting: (await import('../models/GlobalNotificationSetting')).default,
-    GlobalNotificationMailSetting: (await import('../models/GlobalNotificationSetting/GlobalNotificationMailSetting')).default,
-    GlobalNotificationSlackSetting: (await import('../models/GlobalNotificationSetting/GlobalNotificationSlackSetting')).default,
-    SlackAppIntegration: (await import('../models/slack-app-integration')).default,
+    GlobalNotificationSetting: (
+      await import('../models/GlobalNotificationSetting')
+    ).default,
+    GlobalNotificationMailSetting: (
+      await import(
+        '../models/GlobalNotificationSetting/GlobalNotificationMailSetting'
+      )
+    ).default,
+    GlobalNotificationSlackSetting: (
+      await import(
+        '../models/GlobalNotificationSetting/GlobalNotificationSlackSetting'
+      )
+    ).default,
+    SlackAppIntegration: (await import('../models/slack-app-integration'))
+      .default,
   };
   };
 
 
   Object.keys(modelsDependsOnCrowi).forEach((modelName) => {
   Object.keys(modelsDependsOnCrowi).forEach((modelName) => {
     const factory = modelsDependsOnCrowi[modelName];
     const factory = modelsDependsOnCrowi[modelName];
 
 
     if (!(factory instanceof Function)) {
     if (!(factory instanceof Function)) {
-      logger.warn(`modelsDependsOnCrowi['${modelName}'] is not a function. skipped.`);
+      logger.warn(
+        `modelsDependsOnCrowi['${modelName}'] is not a function. skipped.`,
+      );
       return;
       return;
     }
     }
 
 
@@ -38,10 +53,12 @@ export const setupModelsDependentOnCrowi = async(crowi: Crowi): Promise<ModelsMa
   return modelsMap;
   return modelsMap;
 };
 };
 
 
-export const setupIndependentModels = async(): Promise<void> => {
+export const setupIndependentModels = async (): Promise<void> => {
   await Promise.all([
   await Promise.all([
     import('~/features/comment/server/models'),
     import('~/features/comment/server/models'),
-    import('~/features/external-user-group/server/models/external-user-group-relation'),
+    import(
+      '~/features/external-user-group/server/models/external-user-group-relation'
+    ),
     import('~/features/external-user-group/server/models/external-user-group'),
     import('~/features/external-user-group/server/models/external-user-group'),
     import('~/features/growi-plugin/server/models'),
     import('~/features/growi-plugin/server/models'),
     import('../models/activity'),
     import('../models/activity'),

+ 6 - 10
apps/app/src/server/repl.ts

@@ -1,32 +1,28 @@
 import type { REPLServer } from 'node:repl';
 import type { REPLServer } from 'node:repl';
 import repl from 'node:repl';
 import repl from 'node:repl';
-
 import mongoose from 'mongoose';
 import mongoose from 'mongoose';
 
 
 import { getMongoUri, mongoOptions } from '~/server/util/mongoose-utils';
 import { getMongoUri, mongoOptions } from '~/server/util/mongoose-utils';
 
 
 import Crowi from './crowi';
 import Crowi from './crowi';
 
 
-
-const setupMongoose = async(replServer: REPLServer) => {
+const setupMongoose = async (replServer: REPLServer) => {
   mongoose.Promise = global.Promise;
   mongoose.Promise = global.Promise;
 
 
-  await mongoose.connect(getMongoUri(), mongoOptions)
-    .then(() => {
-      replServer.context.db = mongoose.connection.db;
-    });
+  await mongoose.connect(getMongoUri(), mongoOptions).then(() => {
+    replServer.context.db = mongoose.connection.db;
+  });
 
 
   replServer.context.mongoose = mongoose;
   replServer.context.mongoose = mongoose;
 };
 };
 
 
-
-const setupCrowi = async(replServer: REPLServer) => {
+const setupCrowi = async (replServer: REPLServer) => {
   const crowi = new Crowi();
   const crowi = new Crowi();
   await crowi.init();
   await crowi.init();
   replServer.context.crowi = crowi;
   replServer.context.crowi = crowi;
 };
 };
 
 
-const start = async() => {
+const start = async () => {
   const replServer = repl.start({
   const replServer = repl.start({
     prompt: `${process.env.NODE_ENV} > `,
     prompt: `${process.env.NODE_ENV} > `,
     ignoreUndefined: true,
     ignoreUndefined: true,

+ 7 - 1
biome.json

@@ -30,7 +30,13 @@
       "!apps/app/playwright",
       "!apps/app/playwright",
       "!apps/app/src/client",
       "!apps/app/src/client",
       "!apps/app/src/features/openai",
       "!apps/app/src/features/openai",
-      "!apps/app/src/server",
+      "!apps/app/src/server/events",
+      "!apps/app/src/server/interfaces",
+      "!apps/app/src/server/middlewares",
+      "!apps/app/src/server/models",
+      "!apps/app/src/server/routes",
+      "!apps/app/src/server/service",
+      "!apps/app/src/server/util",
       "!apps/app/src/services",
       "!apps/app/src/services",
       "!apps/app/src/stores"
       "!apps/app/src/stores"
     ]
     ]