From 4c49b62ab700a1b81e966d80f6f304c789b9a80a Mon Sep 17 00:00:00 2001 From: liuyi Date: Sun, 14 Jan 2024 05:47:56 +0000 Subject: [PATCH] fix(server): node imports order (#5583) --- packages/backend/server/package.json | 4 +- packages/backend/server/src/app.module.ts | 38 ++++++++++ packages/backend/server/src/app.ts | 74 ++++++++++--------- packages/backend/server/src/data/app.ts | 19 +---- packages/backend/server/src/data/index.ts | 16 ++++ .../server/src/fundamentals/config/index.ts | 2 - packages/backend/server/src/index.ts | 40 +--------- packages/backend/server/tests/app.e2e.ts | 2 +- packages/backend/server/tests/mailer.spec.ts | 2 +- packages/backend/server/tests/sync.spec.ts | 2 +- packages/backend/server/tests/user.e2e.ts | 2 +- packages/backend/server/tests/utils/utils.ts | 2 +- .../server/tests/workspace-blobs.spec.ts | 2 +- .../server/tests/workspace-invite.e2e.ts | 2 +- .../backend/server/tests/workspace.e2e.ts | 2 +- packages/frontend/graphql/src/schema.ts | 1 + 16 files changed, 109 insertions(+), 101 deletions(-) create mode 100644 packages/backend/server/src/app.module.ts create mode 100644 packages/backend/server/src/data/index.ts diff --git a/packages/backend/server/package.json b/packages/backend/server/package.json index 7b85432795..cffb49d4d8 100644 --- a/packages/backend/server/package.json +++ b/packages/backend/server/package.json @@ -14,8 +14,8 @@ "test": "ava --concurrency 1 --serial", "test:coverage": "c8 ava --concurrency 1 --serial", "postinstall": "prisma generate", - "data-migration": "node --loader ts-node/esm/transpile-only.mjs --es-module-specifier-resolution node ./src/data/app.ts", - "predeploy": "yarn prisma migrate deploy && node --es-module-specifier-resolution node ./dist/data/app.js run" + "data-migration": "node --loader ts-node/esm/transpile-only.mjs --es-module-specifier-resolution node ./src/data/index.ts", + "predeploy": "yarn prisma migrate deploy && node --es-module-specifier-resolution node ./dist/data/index.js run" }, "dependencies": { "@apollo/server": "^4.9.5", diff --git a/packages/backend/server/src/app.module.ts b/packages/backend/server/src/app.module.ts new file mode 100644 index 0000000000..8efc1b1f32 --- /dev/null +++ b/packages/backend/server/src/app.module.ts @@ -0,0 +1,38 @@ +import { DynamicModule, Module, Type } from '@nestjs/common'; +import { APP_INTERCEPTOR } from '@nestjs/core'; + +import { AppController } from './app.controller'; +import { CacheInterceptor, CacheModule } from './fundamentals/cache'; +import { ConfigModule } from './fundamentals/config'; +import { EventModule } from './fundamentals/event'; +import { MailModule } from './fundamentals/mailer'; +import { MetricsModule } from './fundamentals/metrics'; +import { PrismaModule } from './fundamentals/prisma'; +import { SessionModule } from './fundamentals/session'; +import { RateLimiterModule } from './fundamentals/throttler'; +import { BusinessModules } from './modules'; +import { AuthModule } from './modules/auth'; + +export const FunctionalityModules: Array = [ + ConfigModule.forRoot(), + CacheModule, + PrismaModule, + MetricsModule, + EventModule, + SessionModule, + RateLimiterModule, + AuthModule, + MailModule, +]; + +@Module({ + providers: [ + { + provide: APP_INTERCEPTOR, + useClass: CacheInterceptor, + }, + ], + imports: [...FunctionalityModules, ...BusinessModules], + controllers: [AppController], +}) +export class AppModule {} diff --git a/packages/backend/server/src/app.ts b/packages/backend/server/src/app.ts index 8efc1b1f32..c3c8edbcd3 100644 --- a/packages/backend/server/src/app.ts +++ b/packages/backend/server/src/app.ts @@ -1,38 +1,42 @@ -import { DynamicModule, Module, Type } from '@nestjs/common'; -import { APP_INTERCEPTOR } from '@nestjs/core'; +import { NestFactory } from '@nestjs/core'; +import type { NestExpressApplication } from '@nestjs/platform-express'; +import cookieParser from 'cookie-parser'; +import graphqlUploadExpress from 'graphql-upload/graphqlUploadExpress.mjs'; -import { AppController } from './app.controller'; -import { CacheInterceptor, CacheModule } from './fundamentals/cache'; -import { ConfigModule } from './fundamentals/config'; -import { EventModule } from './fundamentals/event'; -import { MailModule } from './fundamentals/mailer'; -import { MetricsModule } from './fundamentals/metrics'; -import { PrismaModule } from './fundamentals/prisma'; -import { SessionModule } from './fundamentals/session'; -import { RateLimiterModule } from './fundamentals/throttler'; -import { BusinessModules } from './modules'; -import { AuthModule } from './modules/auth'; +import { CacheRedis } from './fundamentals/cache/redis'; +import { RedisIoAdapter } from './fundamentals/websocket'; +import { ExceptionLogger } from './middleware/exception-logger'; +import { serverTimingAndCache } from './middleware/timing'; -export const FunctionalityModules: Array = [ - ConfigModule.forRoot(), - CacheModule, - PrismaModule, - MetricsModule, - EventModule, - SessionModule, - RateLimiterModule, - AuthModule, - MailModule, -]; +export async function createApp() { + const { AppModule } = await import('./app.module'); -@Module({ - providers: [ - { - provide: APP_INTERCEPTOR, - useClass: CacheInterceptor, - }, - ], - imports: [...FunctionalityModules, ...BusinessModules], - controllers: [AppController], -}) -export class AppModule {} + const app = await NestFactory.create(AppModule, { + cors: true, + rawBody: true, + bodyParser: true, + logger: AFFiNE.affine.stable ? ['log'] : ['verbose'], + }); + + app.use(serverTimingAndCache); + + app.use( + graphqlUploadExpress({ + // TODO: dynamic limit by quota + maxFileSize: 100 * 1024 * 1024, + maxFiles: 5, + }) + ); + + app.useGlobalFilters(new ExceptionLogger()); + app.use(cookieParser()); + + if (AFFiNE.redis.enabled) { + const redis = app.get(CacheRedis, { strict: false }); + const redisIoAdapter = new RedisIoAdapter(app); + await redisIoAdapter.connectToRedis(redis); + app.useWebSocketAdapter(redisIoAdapter); + } + + return app; +} diff --git a/packages/backend/server/src/data/app.ts b/packages/backend/server/src/data/app.ts index 84c3027a3d..9fd4c58864 100644 --- a/packages/backend/server/src/data/app.ts +++ b/packages/backend/server/src/data/app.ts @@ -1,9 +1,6 @@ -import '../prelude'; +import { Module } from '@nestjs/common'; -import { Logger, Module } from '@nestjs/common'; -import { CommandFactory } from 'nest-commander'; - -import { AppModule as BusinessAppModule } from '../app'; +import { AppModule as BusinessAppModule } from '../app.module'; import { ConfigModule } from '../fundamentals/config'; import { CreateCommand, NameQuestion } from './commands/create'; import { RevertCommand, RunCommand } from './commands/run'; @@ -21,14 +18,4 @@ import { RevertCommand, RunCommand } from './commands/run'; ], providers: [NameQuestion, CreateCommand, RunCommand, RevertCommand], }) -class AppModule {} - -async function bootstrap() { - await CommandFactory.run(AppModule, new Logger()).catch(e => { - console.error(e); - process.exit(1); - }); - process.exit(0); -} - -await bootstrap(); +export class CliAppModule {} diff --git a/packages/backend/server/src/data/index.ts b/packages/backend/server/src/data/index.ts new file mode 100644 index 0000000000..2d2f324f52 --- /dev/null +++ b/packages/backend/server/src/data/index.ts @@ -0,0 +1,16 @@ +import '../prelude'; + +import { Logger } from '@nestjs/common'; +import { CommandFactory } from 'nest-commander'; + +import { CliAppModule } from './app'; + +async function bootstrap() { + await CommandFactory.run(CliAppModule, new Logger()).catch(e => { + console.error(e); + process.exit(1); + }); + process.exit(0); +} + +await bootstrap(); diff --git a/packages/backend/server/src/fundamentals/config/index.ts b/packages/backend/server/src/fundamentals/config/index.ts index 34fadc0421..9936b06f66 100644 --- a/packages/backend/server/src/fundamentals/config/index.ts +++ b/packages/backend/server/src/fundamentals/config/index.ts @@ -1,5 +1,3 @@ -// eslint-disable-next-line simple-import-sort/imports - export * from './def'; export * from './default'; export { applyEnvToConfig, parseEnvValue } from './env'; diff --git a/packages/backend/server/src/index.ts b/packages/backend/server/src/index.ts index 60a8ce3fb8..8499eec2d4 100644 --- a/packages/backend/server/src/index.ts +++ b/packages/backend/server/src/index.ts @@ -2,45 +2,9 @@ // keep the config import at the top // eslint-disable-next-line simple-import-sort/imports import './prelude'; +import { createApp } from './app'; -import { NestFactory } from '@nestjs/core'; -import type { NestExpressApplication } from '@nestjs/platform-express'; -import cookieParser from 'cookie-parser'; -import graphqlUploadExpress from 'graphql-upload/graphqlUploadExpress.mjs'; - -import { AppModule } from './app'; -import { RedisIoAdapter } from './fundamentals'; -import { CacheRedis } from './fundamentals/cache/redis'; -import { ExceptionLogger } from './middleware/exception-logger'; -import { serverTimingAndCache } from './middleware/timing'; - -const app = await NestFactory.create(AppModule, { - cors: true, - rawBody: true, - bodyParser: true, - logger: AFFiNE.affine.stable ? ['log'] : ['verbose'], -}); - -app.use(serverTimingAndCache); - -app.use( - graphqlUploadExpress({ - // TODO: dynamic limit by quota - maxFileSize: 100 * 1024 * 1024, - maxFiles: 5, - }) -); - -app.useGlobalFilters(new ExceptionLogger()); -app.use(cookieParser()); - -if (AFFiNE.redis.enabled) { - const redis = app.get(CacheRedis, { strict: false }); - const redisIoAdapter = new RedisIoAdapter(app); - await redisIoAdapter.connectToRedis(redis); - app.useWebSocketAdapter(redisIoAdapter); -} - +const app = await createApp(); await app.listen(AFFiNE.port, AFFiNE.host); console.log( diff --git a/packages/backend/server/tests/app.e2e.ts b/packages/backend/server/tests/app.e2e.ts index acd38d68e5..8a85bff345 100644 --- a/packages/backend/server/tests/app.e2e.ts +++ b/packages/backend/server/tests/app.e2e.ts @@ -9,7 +9,7 @@ import ava, { type TestFn } from 'ava'; import type { Express } from 'express'; import request from 'supertest'; -import { AppModule } from '../src/app'; +import { AppModule } from '../src/app.module'; import { FeatureManagementService } from '../src/modules/features'; import { createTestingApp } from './utils'; diff --git a/packages/backend/server/tests/mailer.spec.ts b/packages/backend/server/tests/mailer.spec.ts index b01bcfb931..6afa234e56 100644 --- a/packages/backend/server/tests/mailer.spec.ts +++ b/packages/backend/server/tests/mailer.spec.ts @@ -6,7 +6,7 @@ import { type User } from '@prisma/client'; import { PrismaClient } from '@prisma/client'; import ava, { type TestFn } from 'ava'; -import { AppModule } from '../src/app'; +import { AppModule } from '../src/app.module'; import { MailService } from '../src/fundamentals/mailer'; import { FeatureKind, FeatureManagementService } from '../src/modules/features'; import { Quotas } from '../src/modules/quota'; diff --git a/packages/backend/server/tests/sync.spec.ts b/packages/backend/server/tests/sync.spec.ts index fd15d0739d..d384199c88 100644 --- a/packages/backend/server/tests/sync.spec.ts +++ b/packages/backend/server/tests/sync.spec.ts @@ -4,7 +4,7 @@ import test from 'ava'; test('should be able to bootstrap sync server', async t => { // set env before import process.env.SERVER_FLAVOR = 'sync'; - const { AppModule } = await import('../src/app'); + const { AppModule } = await import('../src/app.module'); await t.notThrowsAsync(async () => { const module = await Test.createTestingModule({ imports: [AppModule], diff --git a/packages/backend/server/tests/user.e2e.ts b/packages/backend/server/tests/user.e2e.ts index 3932282a44..f4c61909a6 100644 --- a/packages/backend/server/tests/user.e2e.ts +++ b/packages/backend/server/tests/user.e2e.ts @@ -2,7 +2,7 @@ import type { INestApplication } from '@nestjs/common'; import test from 'ava'; import request from 'supertest'; -import { AppModule } from '../src/app'; +import { AppModule } from '../src/app.module'; import { createTestingApp, currentUser, signUp } from './utils'; let app: INestApplication; diff --git a/packages/backend/server/tests/utils/utils.ts b/packages/backend/server/tests/utils/utils.ts index fcfd25c3b6..55d3d23e9d 100644 --- a/packages/backend/server/tests/utils/utils.ts +++ b/packages/backend/server/tests/utils/utils.ts @@ -4,7 +4,7 @@ import { Test, TestingModuleBuilder } from '@nestjs/testing'; import { PrismaClient } from '@prisma/client'; import graphqlUploadExpress from 'graphql-upload/graphqlUploadExpress.mjs'; -import { AppModule, FunctionalityModules } from '../../src/app'; +import { AppModule, FunctionalityModules } from '../../src/app.module'; import { UserFeaturesInit1698652531198 } from '../../src/data/migrations/1698652531198-user-features-init'; import { GqlModule } from '../../src/fundamentals/graphql'; diff --git a/packages/backend/server/tests/workspace-blobs.spec.ts b/packages/backend/server/tests/workspace-blobs.spec.ts index 4a1969ed59..af0a341f11 100644 --- a/packages/backend/server/tests/workspace-blobs.spec.ts +++ b/packages/backend/server/tests/workspace-blobs.spec.ts @@ -2,7 +2,7 @@ import type { INestApplication } from '@nestjs/common'; import test from 'ava'; import request from 'supertest'; -import { AppModule } from '../src/app'; +import { AppModule } from '../src/app.module'; import { FeatureManagementService, FeatureType } from '../src/modules/features'; import { QuotaService, QuotaType } from '../src/modules/quota'; import { diff --git a/packages/backend/server/tests/workspace-invite.e2e.ts b/packages/backend/server/tests/workspace-invite.e2e.ts index 60e43175b0..2e9a9e78cf 100644 --- a/packages/backend/server/tests/workspace-invite.e2e.ts +++ b/packages/backend/server/tests/workspace-invite.e2e.ts @@ -6,7 +6,7 @@ import type { INestApplication } from '@nestjs/common'; import { PrismaClient } from '@prisma/client'; import ava, { type TestFn } from 'ava'; -import { AppModule } from '../src/app'; +import { AppModule } from '../src/app.module'; import { MailService } from '../src/fundamentals/mailer'; import { AuthService } from '../src/modules/auth/service'; import { diff --git a/packages/backend/server/tests/workspace.e2e.ts b/packages/backend/server/tests/workspace.e2e.ts index 4ea4e592eb..45a68ea6c5 100644 --- a/packages/backend/server/tests/workspace.e2e.ts +++ b/packages/backend/server/tests/workspace.e2e.ts @@ -3,7 +3,7 @@ import { PrismaClient } from '@prisma/client'; import ava, { type TestFn } from 'ava'; import request from 'supertest'; -import { AppModule } from '../src/app'; +import { AppModule } from '../src/app.module'; import { acceptInviteById, createTestingApp, diff --git a/packages/frontend/graphql/src/schema.ts b/packages/frontend/graphql/src/schema.ts index 5a279e5d43..cba95af545 100644 --- a/packages/frontend/graphql/src/schema.ts +++ b/packages/frontend/graphql/src/schema.ts @@ -36,6 +36,7 @@ export interface Scalars { export enum FeatureType { Copilot = 'Copilot', EarlyAccess = 'EarlyAccess', + UnlimitedWorkspace = 'UnlimitedWorkspace', } export enum InvoiceStatus {