From 7afba6b8b5e8e8d497d1ea308367791b1fbfb430 Mon Sep 17 00:00:00 2001 From: forehalo Date: Wed, 14 Aug 2024 03:34:32 +0000 Subject: [PATCH] fix(server): prelude should load both local and remote config file (#7852) --- packages/backend/server/src/prelude.ts | 31 +++++++++++++++++++------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/packages/backend/server/src/prelude.ts b/packages/backend/server/src/prelude.ts index 193a946820..49191969e8 100644 --- a/packages/backend/server/src/prelude.ts +++ b/packages/backend/server/src/prelude.ts @@ -1,7 +1,7 @@ import 'reflect-metadata'; import { cpSync } from 'node:fs'; -import { join } from 'node:path'; +import { join, parse } from 'node:path'; import { fileURLToPath, pathToFileURL } from 'node:url'; import { config } from 'dotenv'; @@ -12,20 +12,28 @@ import { } from './fundamentals/config'; import { enablePlugin } from './plugins'; -const configDir = join(fileURLToPath(import.meta.url), '../config'); +const PROJECT_CONFIG_PATH = join(fileURLToPath(import.meta.url), '../config'); async function loadRemote(remoteDir: string, file: string) { - const filePath = join(configDir, file); - if (configDir !== remoteDir) { - cpSync(join(remoteDir, file), filePath, { + let fileToLoad = join(PROJECT_CONFIG_PATH, file); + + if (PROJECT_CONFIG_PATH !== remoteDir) { + const remoteFile = join(remoteDir, file); + const remoteFileAtLocal = join( + PROJECT_CONFIG_PATH, + parse(file).name + '.remote.js' + ); + cpSync(remoteFile, remoteFileAtLocal, { force: true, }); + fileToLoad = remoteFileAtLocal; } - await import(pathToFileURL(filePath).href); + await import(pathToFileURL(fileToLoad).href); } async function load() { - const AFFiNE_CONFIG_PATH = process.env.AFFINE_CONFIG_PATH ?? configDir; + const AFFiNE_CONFIG_PATH = + process.env.AFFINE_CONFIG_PATH ?? PROJECT_CONFIG_PATH; // Initializing AFFiNE config // // 1. load dotenv file to `process.env` @@ -44,15 +52,22 @@ async function load() { // TODO(@forehalo): // Modules may contribute to ENV_MAP, figure out a good way to involve them instead of hardcoding in `./config/affine.env` // 3. load env => config map to `globalThis.AFFiNE.ENV_MAP + // load local env map as well in case there are new env added + await loadRemote(PROJECT_CONFIG_PATH, 'affine.env.js'); + const projectEnvMap = AFFiNE.ENV_MAP; await loadRemote(AFFiNE_CONFIG_PATH, 'affine.env.js'); + const customEnvMap = AFFiNE.ENV_MAP; + AFFiNE.ENV_MAP = { ...projectEnvMap, ...customEnvMap }; // 4. load `config/affine` to patch custom configs + // load local config as well in case there are new default configurations added + await loadRemote(PROJECT_CONFIG_PATH, 'affine.js'); await loadRemote(AFFiNE_CONFIG_PATH, 'affine.js'); // 5. load `config/affine.self` to patch custom configs // This is the file only take effect in [AFFiNE Cloud] if (!AFFiNE.isSelfhosted) { - await loadRemote(AFFiNE_CONFIG_PATH, 'affine.self.js'); + await loadRemote(PROJECT_CONFIG_PATH, 'affine.self.js'); } // 6. apply `process.env` map overriding to `globalThis.AFFiNE`