From 8df59c085de084a3acc251879de32474dc6a7352 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Malfait?= Date: Fri, 7 Feb 2025 10:05:07 +0100 Subject: [PATCH] Lingui working with NODE ENV=production again (#10067) Lingui now offers an option to disable stripping even in prod mode so we can bring it back --- package.json | 2 +- .../twenty-docker/k8s/terraform/deployment-server.tf | 4 ---- packages/twenty-server/.env.example | 5 +---- packages/twenty-server/.env.test | 1 - packages/twenty-server/.swcrc | 4 +++- packages/twenty-server/jest.config.ts | 9 ++++++++- .../src/database/typeorm/typeorm.service.ts | 9 ++++++--- .../graphql/graphql-config/graphql-config.service.ts | 5 ++++- .../src/engine/api/graphql/metadata.module-factory.ts | 2 +- .../client-config/client-config.resolver.ts | 7 +++++-- .../core-modules/environment/environment-variables.ts | 11 +---------- .../exception-handler.module-factory.ts | 2 +- .../utils/generate-graphql-error-from-error.util.ts | 4 +++- .../factories/workspace-datasource.factory.ts | 10 +++++++--- .../src/engine/utils/global-exception-handler.util.ts | 3 ++- packages/twenty-server/src/instrument.ts | 4 +++- packages/twenty-server/src/main.ts | 4 +++- .../src/app/_server-utils/get-posts.tsx | 2 +- .../src/app/releases/utils/get-releases.tsx | 2 +- .../src/content/developers/self-hosting/setup.mdx | 1 - yarn.lock | 10 +++++----- 21 files changed, 56 insertions(+), 45 deletions(-) diff --git a/package.json b/package.json index 37bca7333..134d5c4b8 100644 --- a/package.json +++ b/package.json @@ -206,7 +206,7 @@ "@graphql-codegen/typescript-operations": "^3.0.4", "@graphql-codegen/typescript-react-apollo": "^3.3.7", "@lingui/cli": "^5.1.2", - "@lingui/swc-plugin": "^5.0.2", + "@lingui/swc-plugin": "^5.1.0", "@lingui/vite-plugin": "^5.1.2", "@microsoft/microsoft-graph-types": "^2.40.0", "@nestjs/cli": "^9.0.0", diff --git a/packages/twenty-docker/k8s/terraform/deployment-server.tf b/packages/twenty-docker/k8s/terraform/deployment-server.tf index bfd0f0198..187698416 100644 --- a/packages/twenty-docker/k8s/terraform/deployment-server.tf +++ b/packages/twenty-docker/k8s/terraform/deployment-server.tf @@ -41,10 +41,6 @@ resource "kubernetes_deployment" "twentycrm_server" { name = "PORT" value = "3000" } - # env { - # name = "DEBUG_MODE" - # value = false - # } env { name = "SERVER_URL" diff --git a/packages/twenty-server/.env.example b/packages/twenty-server/.env.example index cefbe92cb..8618dd8ca 100644 --- a/packages/twenty-server/.env.example +++ b/packages/twenty-server/.env.example @@ -1,19 +1,16 @@ # Use this for local setup +NODE_ENV=development PG_DATABASE_URL=postgres://postgres:postgres@localhost:5432/default REDIS_URL=redis://localhost:6379 - APP_SECRET=replace_me_with_a_random_string SIGN_IN_PREFILLED=true -ACCESS_TOKEN_SECRET=replace_me_with_a_random_string_access - FRONT_PROTOCOL=http FRONT_DOMAIN=localhost FRONT_PORT=3001 # ———————— Optional ———————— # PORT=3000 -# DEBUG_MODE=true # ACCESS_TOKEN_EXPIRES_IN=30m # LOGIN_TOKEN_EXPIRES_IN=15m # REFRESH_TOKEN_EXPIRES_IN=90d diff --git a/packages/twenty-server/.env.test b/packages/twenty-server/.env.test index b73f5516e..d78464a75 100644 --- a/packages/twenty-server/.env.test +++ b/packages/twenty-server/.env.test @@ -1,7 +1,6 @@ PG_DATABASE_URL=postgres://postgres:postgres@localhost:5432/test REDIS_URL=redis://localhost:6379 -DEBUG_MODE=true APP_SECRET=replace_me_with_a_random_string SIGN_IN_PREFILLED=true EXCEPTION_HANDLER_DRIVER=console diff --git a/packages/twenty-server/.swcrc b/packages/twenty-server/.swcrc index ff20e40b1..562983435 100644 --- a/packages/twenty-server/.swcrc +++ b/packages/twenty-server/.swcrc @@ -10,7 +10,9 @@ "baseUrl": "./../../", "experimental": { "plugins": [ - ["@lingui/swc-plugin", {}] + ["@lingui/swc-plugin", { + "stripNonEssentialFields": false + }] ] } }, diff --git a/packages/twenty-server/jest.config.ts b/packages/twenty-server/jest.config.ts index 0bd9083d4..707af8934 100644 --- a/packages/twenty-server/jest.config.ts +++ b/packages/twenty-server/jest.config.ts @@ -21,7 +21,14 @@ const jestConfig = { decoratorMetadata: true, }, experimental: { - plugins: [['@lingui/swc-plugin', {}]], + plugins: [ + [ + '@lingui/swc-plugin', + { + stripNonEssentialFields: false, + }, + ], + ], }, }, }, diff --git a/packages/twenty-server/src/database/typeorm/typeorm.service.ts b/packages/twenty-server/src/database/typeorm/typeorm.service.ts index 23dca5fd3..3cf105e22 100644 --- a/packages/twenty-server/src/database/typeorm/typeorm.service.ts +++ b/packages/twenty-server/src/database/typeorm/typeorm.service.ts @@ -2,6 +2,8 @@ import { Injectable, OnModuleDestroy, OnModuleInit } from '@nestjs/common'; import { DataSource } from 'typeorm'; +import { NodeEnvironment } from 'src/engine/core-modules/environment/interfaces/node-environment.interface'; + import { AppToken } from 'src/engine/core-modules/app-token/app-token.entity'; import { BillingCustomer } from 'src/engine/core-modules/billing/entities/billing-customer.entity'; import { BillingEntitlement } from 'src/engine/core-modules/billing/entities/billing-entitlement.entity'; @@ -106,9 +108,10 @@ export class TypeORMService implements OnModuleInit, OnModuleDestroy { const workspaceDataSource = new DataSource({ url: dataSource.url ?? this.environmentService.get('PG_DATABASE_URL'), type: 'postgres', - logging: this.environmentService.get('DEBUG_MODE') - ? ['query', 'error'] - : ['error'], + logging: + this.environmentService.get('NODE_ENV') === NodeEnvironment.development + ? ['query', 'error'] + : ['error'], schema, ssl: this.environmentService.get('PG_SSL_ALLOW_SELF_SIGNED') ? { diff --git a/packages/twenty-server/src/engine/api/graphql/graphql-config/graphql-config.service.ts b/packages/twenty-server/src/engine/api/graphql/graphql-config/graphql-config.service.ts index d5752bc1d..a7e2b5d60 100644 --- a/packages/twenty-server/src/engine/api/graphql/graphql-config/graphql-config.service.ts +++ b/packages/twenty-server/src/engine/api/graphql/graphql-config/graphql-config.service.ts @@ -12,6 +12,8 @@ import GraphQLJSON from 'graphql-type-json'; import { GraphQLSchemaWithContext, YogaInitialContext } from 'graphql-yoga'; import { JsonWebTokenError, TokenExpiredError } from 'jsonwebtoken'; +import { NodeEnvironment } from 'src/engine/core-modules/environment/interfaces/node-environment.interface'; + import { useThrottler } from 'src/engine/api/graphql/graphql-config/hooks/use-throttler'; import { WorkspaceSchemaFactory } from 'src/engine/api/graphql/workspace-schema.factory'; import { AuthContext } from 'src/engine/core-modules/auth/types/auth-context.type'; @@ -41,7 +43,8 @@ export class GraphQLConfigService ) {} createGqlOptions(): YogaDriverConfig { - const isDebugMode = this.environmentService.get('DEBUG_MODE'); + const isDebugMode = + this.environmentService.get('NODE_ENV') === NodeEnvironment.development; const plugins = [ useThrottler({ ttl: this.environmentService.get('API_RATE_LIMITING_TTL'), diff --git a/packages/twenty-server/src/engine/api/graphql/metadata.module-factory.ts b/packages/twenty-server/src/engine/api/graphql/metadata.module-factory.ts index d11a092b7..f3d401fa1 100644 --- a/packages/twenty-server/src/engine/api/graphql/metadata.module-factory.ts +++ b/packages/twenty-server/src/engine/api/graphql/metadata.module-factory.ts @@ -47,7 +47,7 @@ export const metadataModuleFactory = async ( }), }; - if (environmentService.get('DEBUG_MODE')) { + if (environmentService.get('NODE_ENV') === 'development') { config.renderGraphiQL = () => { return renderApolloPlayground({ path: 'metadata' }); }; diff --git a/packages/twenty-server/src/engine/core-modules/client-config/client-config.resolver.ts b/packages/twenty-server/src/engine/core-modules/client-config/client-config.resolver.ts index 1b9577b61..2a195bbf8 100644 --- a/packages/twenty-server/src/engine/core-modules/client-config/client-config.resolver.ts +++ b/packages/twenty-server/src/engine/core-modules/client-config/client-config.resolver.ts @@ -1,5 +1,7 @@ import { Query, Resolver } from '@nestjs/graphql'; +import { NodeEnvironment } from 'src/engine/core-modules/environment/interfaces/node-environment.interface'; + import { DomainManagerService } from 'src/engine/core-modules/domain-manager/services/domain-manager.service'; import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { PUBLIC_FEATURE_FLAGS } from 'src/engine/core-modules/feature-flag/constants/public-feature-flag.const'; @@ -50,7 +52,7 @@ export class ClientConfigResolver { ), defaultSubdomain: this.environmentService.get('DEFAULT_SUBDOMAIN'), frontDomain: this.domainManagerService.getFrontUrl().hostname, - debugMode: this.environmentService.get('DEBUG_MODE'), + debugMode: this.environmentService.get('NODE_ENV') === 'development', support: { supportDriver: this.environmentService.get('SUPPORT_DRIVER'), supportFrontChatId: this.environmentService.get( @@ -74,7 +76,8 @@ export class ClientConfigResolver { }, analyticsEnabled: this.environmentService.get('ANALYTICS_ENABLED'), canManageFeatureFlags: - this.environmentService.get('DEBUG_MODE') || + this.environmentService.get('NODE_ENV') === + NodeEnvironment.development || this.environmentService.get('IS_BILLING_ENABLED'), publicFeatureFlags: PUBLIC_FEATURE_FLAGS, isMicrosoftMessagingEnabled: this.environmentService.get( diff --git a/packages/twenty-server/src/engine/core-modules/environment/environment-variables.ts b/packages/twenty-server/src/engine/core-modules/environment/environment-variables.ts index 8609eeb0e..49a0df311 100644 --- a/packages/twenty-server/src/engine/core-modules/environment/environment-variables.ts +++ b/packages/twenty-server/src/engine/core-modules/environment/environment-variables.ts @@ -795,22 +795,13 @@ export class EnvironmentVariables { }) REDIS_URL: string; - @EnvironmentVariablesMetadata({ - group: EnvironmentVariablesGroup.ServerConfig, - description: 'Enable or disable debug mode for the application', - }) - @CastToBoolean() - @IsOptional() - @IsBoolean() - DEBUG_MODE = false; - @EnvironmentVariablesMetadata({ group: EnvironmentVariablesGroup.ServerConfig, description: 'Node environment (development, production, etc.)', }) @IsEnum(NodeEnvironment) @IsString() - NODE_ENV: NodeEnvironment = NodeEnvironment.development; + NODE_ENV: NodeEnvironment = NodeEnvironment.production; @EnvironmentVariablesMetadata({ group: EnvironmentVariablesGroup.ServerConfig, diff --git a/packages/twenty-server/src/engine/core-modules/exception-handler/exception-handler.module-factory.ts b/packages/twenty-server/src/engine/core-modules/exception-handler/exception-handler.module-factory.ts index 006eb4c6c..54fb228d1 100644 --- a/packages/twenty-server/src/engine/core-modules/exception-handler/exception-handler.module-factory.ts +++ b/packages/twenty-server/src/engine/core-modules/exception-handler/exception-handler.module-factory.ts @@ -30,7 +30,7 @@ export const exceptionHandlerModuleFactory = async ( release: environmentService.get('SENTRY_RELEASE'), dsn: environmentService.get('SENTRY_DSN') ?? '', serverInstance: adapterHost.httpAdapter?.getInstance(), - debug: environmentService.get('DEBUG_MODE'), + debug: environmentService.get('NODE_ENV') === 'development', }, }; } diff --git a/packages/twenty-server/src/engine/core-modules/graphql/utils/generate-graphql-error-from-error.util.ts b/packages/twenty-server/src/engine/core-modules/graphql/utils/generate-graphql-error-from-error.util.ts index c9f104cf9..73f857b05 100644 --- a/packages/twenty-server/src/engine/core-modules/graphql/utils/generate-graphql-error-from-error.util.ts +++ b/packages/twenty-server/src/engine/core-modules/graphql/utils/generate-graphql-error-from-error.util.ts @@ -1,3 +1,5 @@ +import { NodeEnvironment } from 'src/engine/core-modules/environment/interfaces/node-environment.interface'; + import { BaseGraphQLError, ErrorCode, @@ -9,7 +11,7 @@ export const generateGraphQLErrorFromError = (error: Error) => { ErrorCode.INTERNAL_SERVER_ERROR, ); - if (process.env.NODE_ENV === 'development') { + if (process.env.NODE_ENV === NodeEnvironment.development) { graphqlError.stack = error.stack; graphqlError.extensions['response'] = error.message; } diff --git a/packages/twenty-server/src/engine/twenty-orm/factories/workspace-datasource.factory.ts b/packages/twenty-server/src/engine/twenty-orm/factories/workspace-datasource.factory.ts index 7a2dbbfa4..e9a2e226c 100644 --- a/packages/twenty-server/src/engine/twenty-orm/factories/workspace-datasource.factory.ts +++ b/packages/twenty-server/src/engine/twenty-orm/factories/workspace-datasource.factory.ts @@ -2,6 +2,8 @@ import { Injectable, Logger } from '@nestjs/common'; import { EntitySchema } from 'typeorm'; +import { NodeEnvironment } from 'src/engine/core-modules/environment/interfaces/node-environment.interface'; + import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; import { WorkspaceMetadataCacheService } from 'src/engine/metadata-modules/workspace-metadata-cache/services/workspace-metadata-cache.service'; @@ -135,9 +137,11 @@ export class WorkspaceDatasourceFactory { dataSourceMetadata.url ?? this.environmentService.get('PG_DATABASE_URL'), type: 'postgres', - logging: this.environmentService.get('DEBUG_MODE') - ? ['query', 'error'] - : ['error'], + logging: + this.environmentService.get('NODE_ENV') === + NodeEnvironment.development + ? ['query', 'error'] + : ['error'], schema: dataSourceMetadata.schema, entities: cachedEntitySchemas, ssl: this.environmentService.get('PG_SSL_ALLOW_SELF_SIGNED') diff --git a/packages/twenty-server/src/engine/utils/global-exception-handler.util.ts b/packages/twenty-server/src/engine/utils/global-exception-handler.util.ts index 0edd33762..613b0b381 100644 --- a/packages/twenty-server/src/engine/utils/global-exception-handler.util.ts +++ b/packages/twenty-server/src/engine/utils/global-exception-handler.util.ts @@ -2,6 +2,7 @@ import { HttpException } from '@nestjs/common'; import { GraphQLError } from 'graphql'; +import { NodeEnvironment } from 'src/engine/core-modules/environment/interfaces/node-environment.interface'; import { ExceptionHandlerUser } from 'src/engine/core-modules/exception-handler/interfaces/exception-handler-user.interface'; import { ExceptionHandlerWorkspace } from 'src/engine/core-modules/exception-handler/interfaces/exception-handler-workspace.interface'; @@ -114,7 +115,7 @@ const convertHttpExceptionToGraphql = (exception: HttpException) => { } // Only show the stack trace in development mode - if (process.env.NODE_ENV === 'development') { + if (process.env.NODE_ENV === NodeEnvironment.development) { error.stack = exception.stack; error.extensions['response'] = exception.getResponse(); } diff --git a/packages/twenty-server/src/instrument.ts b/packages/twenty-server/src/instrument.ts index 2fdbe0263..bd179aa56 100644 --- a/packages/twenty-server/src/instrument.ts +++ b/packages/twenty-server/src/instrument.ts @@ -1,6 +1,8 @@ import * as Sentry from '@sentry/nestjs'; import { nodeProfilingIntegration } from '@sentry/profiling-node'; +import { NodeEnvironment } from 'src/engine/core-modules/environment/interfaces/node-environment.interface'; + import { ExceptionHandlerDriver } from 'src/engine/core-modules/exception-handler/interfaces'; import { WorkspaceCacheKeys } from 'src/engine/workspace-cache-storage/workspace-cache-storage.service'; @@ -24,6 +26,6 @@ if (process.env.EXCEPTION_HANDLER_DRIVER === ExceptionHandlerDriver.Sentry) { ], tracesSampleRate: 0.1, profilesSampleRate: 0.3, - debug: process.env.DEBUG_MODE === 'true', + debug: process.env.NODE_ENV === NodeEnvironment.development, }); } diff --git a/packages/twenty-server/src/main.ts b/packages/twenty-server/src/main.ts index 90c189a9a..81c16f7dc 100644 --- a/packages/twenty-server/src/main.ts +++ b/packages/twenty-server/src/main.ts @@ -9,6 +9,8 @@ import { useContainer, ValidationError } from 'class-validator'; import session from 'express-session'; import { graphqlUploadExpress } from 'graphql-upload'; +import { NodeEnvironment } from 'src/engine/core-modules/environment/interfaces/node-environment.interface'; + import { EnvironmentService } from 'src/engine/core-modules/environment/environment.service'; import { LoggerService } from 'src/engine/core-modules/logger/logger.service'; import { getSessionStorageOptions } from 'src/engine/core-modules/session-storage/session-storage.module-factory'; @@ -25,7 +27,7 @@ const bootstrap = async () => { cors: true, bufferLogs: process.env.LOGGER_IS_BUFFER_ENABLED === 'true', rawBody: true, - snapshot: process.env.DEBUG_MODE === 'true', + snapshot: process.env.NODE_ENV === NodeEnvironment.development, ...(process.env.SSL_KEY_PATH && process.env.SSL_CERT_PATH ? { httpsOptions: { diff --git a/packages/twenty-website/src/app/_server-utils/get-posts.tsx b/packages/twenty-website/src/app/_server-utils/get-posts.tsx index ba631c45d..547ec930d 100644 --- a/packages/twenty-website/src/app/_server-utils/get-posts.tsx +++ b/packages/twenty-website/src/app/_server-utils/get-posts.tsx @@ -1,7 +1,7 @@ -import { ReactElement } from 'react'; import fs from 'fs'; import { compileMDX } from 'next-mdx-remote/rsc'; import path from 'path'; +import { ReactElement } from 'react'; import gfm from 'remark-gfm'; import ArticleEditContent from '@/app/_components/ui/layout/articles/ArticleEditContent'; diff --git a/packages/twenty-website/src/app/releases/utils/get-releases.tsx b/packages/twenty-website/src/app/releases/utils/get-releases.tsx index 58a2d5515..5df436357 100644 --- a/packages/twenty-website/src/app/releases/utils/get-releases.tsx +++ b/packages/twenty-website/src/app/releases/utils/get-releases.tsx @@ -1,7 +1,7 @@ -import { JSXElementConstructor, ReactElement } from 'react'; import fs from 'fs'; import matter from 'gray-matter'; import { compileMDX } from 'next-mdx-remote/rsc'; +import { JSXElementConstructor, ReactElement } from 'react'; import gfm from 'remark-gfm'; import { ReleaseNote } from '@/app/releases/api/route'; diff --git a/packages/twenty-website/src/content/developers/self-hosting/setup.mdx b/packages/twenty-website/src/content/developers/self-hosting/setup.mdx index 12c37745a..710260e6a 100644 --- a/packages/twenty-website/src/content/developers/self-hosting/setup.mdx +++ b/packages/twenty-website/src/content/developers/self-hosting/setup.mdx @@ -328,7 +328,6 @@ This feature is WIP and is not yet useful for most users. ### Debug / Development diff --git a/yarn.lock b/yarn.lock index 213988038..a3c046820 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7142,9 +7142,9 @@ __metadata: languageName: node linkType: hard -"@lingui/swc-plugin@npm:^5.0.2": - version: 5.0.2 - resolution: "@lingui/swc-plugin@npm:5.0.2" +"@lingui/swc-plugin@npm:^5.1.0": + version: 5.1.0 + resolution: "@lingui/swc-plugin@npm:5.1.0" peerDependencies: "@lingui/core": 5 peerDependenciesMeta: @@ -7152,7 +7152,7 @@ __metadata: optional: true next: optional: true - checksum: 10c0/5f7ca68349b642f7034800f6080c4f28f33d97059a8611144b9d78878cf14727b9293e4f5aec5c82a4930617f4bcacd2c25618e6d39ded7ceac15465f3b5aed2 + checksum: 10c0/ca514c4fcc2d6d1ca62e7063fe4dc8ef2b29d328bbe22184b4773149a86448335c39f72faccfe41f10ca2081df379cfcb7f9e70337a27aec2568571c0118c0d6 languageName: node linkType: hard @@ -46056,7 +46056,7 @@ __metadata: "@lingui/cli": "npm:^5.1.2" "@lingui/core": "npm:^5.1.2" "@lingui/react": "npm:^5.1.2" - "@lingui/swc-plugin": "npm:^5.0.2" + "@lingui/swc-plugin": "npm:^5.1.0" "@lingui/vite-plugin": "npm:^5.1.2" "@mdx-js/react": "npm:^3.0.0" "@microsoft/microsoft-graph-client": "npm:^3.0.7"