From 2c677e597aafcbb2eccc39411eb3fdda8e2ff2f3 Mon Sep 17 00:00:00 2001 From: Arvin Xu Date: Sat, 13 Sep 2025 17:03:10 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20fix:=20fix=20open=20chat=20page?= =?UTF-8?q?=20with=20float=20link=20modal=20(#9235)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor @lobechat/database * move config/file and llm to envs * move config/auth to envs * refactor * fix tests * fix tests * upgrade --- .cursor/rules/i18n.mdc | 188 +++++++++--------- package.json | 2 +- packages/const/src/auth.ts | 2 +- packages/database/package.json | 6 +- packages/database/src/index.ts | 1 + .../repositories/dataExporter/index.test.ts | 6 +- .../createBizOpenAI/createAzureOpenai.ts | 2 +- .../createBizOpenAI/createOpenai.ts | 2 +- .../(backend)/api/webhooks/casdoor/route.ts | 2 +- .../api/webhooks/casdoor/validateRequest.ts | 2 +- src/app/(backend)/api/webhooks/clerk/route.ts | 2 +- src/app/(backend)/api/webhooks/logto/route.ts | 2 +- .../api/webhooks/logto/validateRequest.ts | 2 +- .../__tests__/analytics.test.ts | 2 +- src/{config => envs}/__tests__/app.test.ts | 2 +- src/{config => envs}/__tests__/auth.test.ts | 0 src/{config => envs}/__tests__/client.test.ts | 2 +- src/{config => envs}/auth.ts | 0 src/{config => envs}/file.ts | 0 src/{config => envs}/llm.ts | 0 src/layout/AuthProvider/index.tsx | 2 +- src/libs/next-auth/auth.config.ts | 2 +- src/libs/next-auth/sso-providers/auth0.ts | 2 +- src/libs/next-auth/sso-providers/authelia.ts | 2 +- src/libs/next-auth/sso-providers/authentik.ts | 2 +- src/libs/next-auth/sso-providers/azure-ad.ts | 2 +- .../sso-providers/cloudflare-zero-trust.ts | 2 +- .../next-auth/sso-providers/generic-oidc.ts | 2 +- src/libs/next-auth/sso-providers/github.ts | 2 +- src/libs/next-auth/sso-providers/logto.ts | 2 +- .../microsoft-entra-id-helper.ts | 2 +- src/libs/next-auth/sso-providers/zitadel.ts | 2 +- src/libs/oidc-provider/adapter.ts | 9 +- src/libs/oidc-provider/provider.ts | 2 +- src/libs/trpc/async/asyncAuth.ts | 2 +- src/libs/trpc/async/context.ts | 2 +- src/middleware.ts | 2 +- src/server/globalConfig/_deprecated.test.ts | 2 +- src/server/globalConfig/_deprecated.ts | 2 +- .../genServerAiProviderConfig.test.ts | 4 +- .../globalConfig/genServerAiProviderConfig.ts | 2 +- src/server/globalConfig/index.ts | 4 +- .../modules/ModelRuntime/apiKeyManager.ts | 2 +- src/server/modules/ModelRuntime/index.test.ts | 2 +- src/server/modules/ModelRuntime/index.ts | 2 +- src/server/modules/S3/index.ts | 2 +- src/server/routers/async/file.ts | 2 +- src/server/services/agent/index.ts | 3 +- src/server/services/aiChat/index.test.ts | 2 +- src/server/services/aiChat/index.ts | 3 +- src/server/services/chunk/index.ts | 2 +- src/server/services/document/index.ts | 2 +- src/server/services/file/impls/s3.test.ts | 26 +-- src/server/services/file/impls/s3.ts | 2 +- src/server/services/file/index.ts | 2 +- src/server/services/generation/index.ts | 2 +- src/server/services/nextAuthUser/index.ts | 2 +- src/server/services/user/index.test.ts | 2 +- src/server/services/user/index.ts | 2 +- src/services/__tests__/upload.test.ts | 2 +- src/services/file/_deprecated.test.ts | 2 +- src/services/upload.ts | 2 +- 62 files changed, 176 insertions(+), 170 deletions(-) create mode 100644 packages/database/src/index.ts rename src/{config => envs}/__tests__/analytics.test.ts (95%) rename src/{config => envs}/__tests__/app.test.ts (97%) rename src/{config => envs}/__tests__/auth.test.ts (100%) rename src/{config => envs}/__tests__/client.test.ts (96%) rename src/{config => envs}/auth.ts (100%) rename src/{config => envs}/file.ts (100%) rename src/{config => envs}/llm.ts (100%) diff --git a/.cursor/rules/i18n.mdc b/.cursor/rules/i18n.mdc index a2b2a5ef9c..84b87fb477 100644 --- a/.cursor/rules/i18n.mdc +++ b/.cursor/rules/i18n.mdc @@ -2,117 +2,115 @@ globs: *.tsx alwaysApply: false --- -# LobeChat 国际化指南 +# LobeChat Internationalization Guide -## 架构概览 +## Key Points -LobeChat 使用 react-i18next 进行国际化,采用良好的命名空间架构: +- Default language: Chinese (zh-CN) as the source language +- Supported languages: 18 languages including English, Japanese, Korean, Arabic, etc. +- Framework: react-i18next with Next.js app router +- Translation automation: @lobehub/i18n-cli for automatic translation, config file: .i18nrc.js +- Never manually modify any json file. You can only modify files in `default` folder -- 默认语言:中文(zh-CN),作为源语言 -- 支持语言:18 种语言,包括英语、日语、韩语、阿拉伯语等 -- 框架:react-i18next 配合 Next.js app router -- 翻译自动化:@lobehub/i18n-cli 用于自动翻译,配置文件:.i18nrc.js - -## 目录结构 +## Directory Structure ``` src/locales/ -├── default/ # 源语言文件(zh-CN) -│ ├── index.ts # 命名空间导出 -│ ├── common.ts # 通用翻译 -│ ├── chat.ts # 聊天相关翻译 -│ ├── setting.ts # 设置翻译 -│ └── ... # 其他命名空间文件 -└── resources.ts # 类型定义和语言配置 +├── default/ # Source language files (zh-CN) +│ ├── index.ts # Namespace exports +│ ├── common.ts # Common translations +│ ├── chat.ts # Chat-related translations +│ ├── setting.ts # Settings translations +│ └── ... # Other namespace files +└── resources.ts # Type definitions and language configuration -locales/ # 翻译文件 -├── en-US/ # 英语翻译 -│ ├── common.json # 通用翻译 -│ ├── chat.json # 聊天翻译 -│ ├── setting.json # 设置翻译 -│ └── ... # 其他命名空间 JSON 文件 -├── ja-JP/ # 日语翻译 +locales/ # Translation files +├── en-US/ # English translations +│ ├── common.json # Common translations +│ ├── chat.json # Chat translations +│ ├── setting.json # Settings translations +│ └── ... # Other namespace JSON files +├── ja-JP/ # Japanese translations │ ├── common.json │ ├── chat.json │ └── ... -└── ... # 其他语言文件夹 +└── ... # Other language folders ``` -## 添加新翻译的工作流程 +## Workflow for Adding New Translations -### 1. 添加新的翻译键 +### 1. Adding New Translation Keys -第一步:在 src/locales/default 目录下的相应命名空间文件中添加翻译键 +Step 1: Add translation keys in the corresponding namespace files under src/locales/default directory ```typescript -// 示例:src/locales/default/common.ts +// Example: src/locales/default/common.ts export default { - // ... 现有键 - newFeature: { - title: "新功能标题", - description: "功能描述文案", - button: "操作按钮", - }, + // ... existing keys + newFeature: { + title: '新功能标题', + description: '功能描述文案', + button: '操作按钮', + }, }; ``` -第二步:如果创建新命名空间,需要在 src/locales/default/index.ts 中导出 +Step 2: If creating a new namespace, export it in src/locales/default/index.ts ```typescript -import newNamespace from "./newNamespace"; +import newNamespace from './newNamespace'; const resources = { - // ... 现有命名空间 - newNamespace, + // ... existing namespaces + newNamespace, } as const; ``` -### 2. 翻译过程 +### 2. Translation Process -开发模式: +Development mode: -一般情况下不需要你帮我跑自动翻译工具,跑一次很久,需要的时候我会自己跑。 -但是为了立马能看到效果,还是需要先翻译 `locales/zh-CN/namespace.json`,不需要翻译其它语言。 +Generally, you don't need to help me run the automatic translation tool as it takes a long time. I'll run it myself when needed. However, to see immediate results, you still need to translate `locales/zh-CN/namespace.json` first, no need to translate other languages. -生产模式: +Production mode: ```bash -# 为所有语言生成翻译 +# Generate translations for all languages npm run i18n ``` -## 在组件中使用 +## Usage in Components -### 基本用法 +### Basic Usage ```tsx -import { useTranslation } from "react-i18next"; +import { useTranslation } from 'react-i18next'; const MyComponent = () => { - const { t } = useTranslation("common"); + const { t } = useTranslation('common'); - return ( -
-

{t("newFeature.title")}

-

{t("newFeature.description")}

- -
- ); + return ( +
+

{t('newFeature.title')}

+

{t('newFeature.description')}

+ +
+ ); }; ``` -### 带参数的用法 +### Usage with Parameters ```tsx -const { t } = useTranslation("common"); +const { t } = useTranslation('common'); -

{t("welcome.message", { name: "John" })}

; +

{t('welcome.message', { name: 'John' })}

; -// 对应的语言文件: -// welcome: { message: '欢迎 {{name}} 使用!' } +// Corresponding language file: +// welcome: { message: 'Welcome {{name}}!' } ``` -### 多个命名空间 +### Multiple Namespaces ```tsx const { t } = useTranslation(['common', 'chat']); @@ -121,59 +119,63 @@ const { t } = useTranslation(['common', 'chat']); {t('chat:typing')} ``` -## 类型安全 +## Type Safety -项目使用 TypeScript 实现类型安全的翻译,类型从 src/locales/resources.ts 自动生成: +The project uses TypeScript to implement type-safe translations, with types automatically generated from src/locales/resources.ts: ```typescript -import type { DefaultResources, NS, Locales } from "@/locales/resources"; +import type { DefaultResources, Locales, NS } from '@/locales/resources'; -// 可用类型: -// - NS: 可用命名空间键 ('common' | 'chat' | 'setting' | ...) -// - Locales: 支持的语言代码 ('en-US' | 'zh-CN' | 'ja-JP' | ...) +// Available types: +// - NS: Available namespace keys ('common' | 'chat' | 'setting' | ...) +// - Locales: Supported language codes ('en-US' | 'zh-CN' | 'ja-JP' | ...) -const namespace: NS = "common"; -const locale: Locales = "en-US"; +const namespace: NS = 'common'; +const locale: Locales = 'en-US'; ``` -## 最佳实践 +## Best Practices -### 1. 命名空间组织 +### 1. Namespace Organization -- common: 共享 UI 元素(按钮、标签、操作) -- chat: 聊天特定功能 -- setting: 配置和设置 -- error: 错误消息和处理 -- [feature]: 功能特定或页面特定的命名空间 -- components: 可复用组件文案 +- common: Shared UI elements (buttons, labels, actions) +- chat: Chat-specific functionality +- setting: Configuration and settings +- error: Error messages and handling +- [feature]: Feature-specific or page-specific namespaces +- components: Reusable component text -### 2. 键命名约定 +### 2. Key Naming Conventions ```typescript -// ✅ 好:层次结构 +// ✅ Good: Hierarchical structure export default { - modal: { - confirm: { - title: "确认操作", - message: "确定要执行此操作吗?", - actions: { - confirm: "确认", - cancel: "取消", - }, - }, + modal: { + confirm: { + title: '确认操作', + message: '确定要执行此操作吗?', + actions: { + confirm: '确认', + cancel: '取消', + }, }, + }, }; -// ❌ 避免:扁平结构 +// ❌ Avoid: Flat structure export default { - modalConfirmTitle: "确认操作", - modalConfirmMessage: "确定要执行此操作吗?", + modalConfirmTitle: '确认操作', + modalConfirmMessage: '确定要执行此操作吗?', }; ``` -## 故障排除 +## Troubleshooting -### 缺少翻译键 +### Missing Translation Keys + +- Check if the key exists in src/locales/default/namespace.ts +- Ensure the namespace is correctly imported in the component +- Ensure new namespaces are exported in src/locales/default/index.ts - 检查键是否存在于 src/locales/default/namespace.ts 中 - 确保在组件中正确导入命名空间 diff --git a/package.json b/package.json index bbe1fbcc53..edefb5a953 100644 --- a/package.json +++ b/package.json @@ -157,7 +157,7 @@ "@lobehub/charts": "^2.1.2", "@lobehub/chat-plugin-sdk": "^1.32.4", "@lobehub/chat-plugins-gateway": "^1.9.0", - "@lobehub/editor": "^1.8.0", + "@lobehub/editor": "^1.8.5", "@lobehub/icons": "^2.32.2", "@lobehub/market-sdk": "^0.22.7", "@lobehub/tts": "^2.0.1", diff --git a/packages/const/src/auth.ts b/packages/const/src/auth.ts index 74b7880c93..8ad6e83acf 100644 --- a/packages/const/src/auth.ts +++ b/packages/const/src/auth.ts @@ -1,4 +1,4 @@ -import { authEnv } from '@/config/auth'; +import { authEnv } from '@/envs/auth'; export const enableClerk = authEnv.NEXT_PUBLIC_ENABLE_CLERK_AUTH; export const enableNextAuth = authEnv.NEXT_PUBLIC_ENABLE_NEXT_AUTH; diff --git a/packages/database/package.json b/packages/database/package.json index cf62b2b7e6..02fd51dd45 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -2,8 +2,10 @@ "name": "@lobechat/database", "version": "1.0.0", "private": true, - "main": "src/index.ts", - "types": "src/index.ts", + "exports": { + ".": "./src/index.ts", + "./schemas": "./src/schemas/index.ts" + }, "scripts": { "test": "npm run test:client-db && npm run test:server-db", "test:client-db": "vitest run", diff --git a/packages/database/src/index.ts b/packages/database/src/index.ts new file mode 100644 index 0000000000..b38ebc9a19 --- /dev/null +++ b/packages/database/src/index.ts @@ -0,0 +1 @@ +export * from './type'; diff --git a/packages/database/src/repositories/dataExporter/index.test.ts b/packages/database/src/repositories/dataExporter/index.test.ts index 86ddcd68bd..0cc780859e 100644 --- a/packages/database/src/repositories/dataExporter/index.test.ts +++ b/packages/database/src/repositories/dataExporter/index.test.ts @@ -1,6 +1,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { clientDB, initializeDB } from '@/database/client/db'; + import { agents, agentsKnowledgeBases, @@ -16,9 +17,8 @@ import { topics, userSettings, users, -} from '@/database/schemas'; -import { LobeChatDatabase } from '@/database/type'; - +} from '../../schemas'; +import { LobeChatDatabase } from '../../type'; import { DATA_EXPORT_CONFIG, DataExporterRepos } from './index'; let db = clientDB as LobeChatDatabase; diff --git a/src/app/(backend)/_deprecated/createBizOpenAI/createAzureOpenai.ts b/src/app/(backend)/_deprecated/createBizOpenAI/createAzureOpenai.ts index 145f21a8c1..01fc48073a 100644 --- a/src/app/(backend)/_deprecated/createBizOpenAI/createAzureOpenai.ts +++ b/src/app/(backend)/_deprecated/createBizOpenAI/createAzureOpenai.ts @@ -2,7 +2,7 @@ import { ChatErrorType } from '@lobechat/types'; import OpenAI, { ClientOptions } from 'openai'; import urlJoin from 'url-join'; -import { getLLMConfig } from '@/config/llm'; +import { getLLMConfig } from '@/envs/llm'; // create Azure OpenAI Instance export const createAzureOpenai = (params: { diff --git a/src/app/(backend)/_deprecated/createBizOpenAI/createOpenai.ts b/src/app/(backend)/_deprecated/createBizOpenAI/createOpenai.ts index 7966c35d63..2d2e04d815 100644 --- a/src/app/(backend)/_deprecated/createBizOpenAI/createOpenai.ts +++ b/src/app/(backend)/_deprecated/createBizOpenAI/createOpenai.ts @@ -1,7 +1,7 @@ import { ChatErrorType } from '@lobechat/types'; import OpenAI from 'openai'; -import { getLLMConfig } from '@/config/llm'; +import { getLLMConfig } from '@/envs/llm'; // create OpenAI instance export const createOpenai = (userApiKey: string | null, endpoint?: string | null) => { diff --git a/src/app/(backend)/api/webhooks/casdoor/route.ts b/src/app/(backend)/api/webhooks/casdoor/route.ts index eb69226d82..f44e23157b 100644 --- a/src/app/(backend)/api/webhooks/casdoor/route.ts +++ b/src/app/(backend)/api/webhooks/casdoor/route.ts @@ -1,7 +1,7 @@ import { NextResponse } from 'next/server'; -import { authEnv } from '@/config/auth'; import { serverDB } from '@/database/server'; +import { authEnv } from '@/envs/auth'; import { pino } from '@/libs/logger'; import { NextAuthUserService } from '@/server/services/nextAuthUser'; diff --git a/src/app/(backend)/api/webhooks/casdoor/validateRequest.ts b/src/app/(backend)/api/webhooks/casdoor/validateRequest.ts index e78a430998..344047e38d 100644 --- a/src/app/(backend)/api/webhooks/casdoor/validateRequest.ts +++ b/src/app/(backend)/api/webhooks/casdoor/validateRequest.ts @@ -1,6 +1,6 @@ import { headers } from 'next/headers'; -import { authEnv } from '@/config/auth'; +import { authEnv } from '@/envs/auth'; export type CasdoorUserEntity = { avatar?: string; diff --git a/src/app/(backend)/api/webhooks/clerk/route.ts b/src/app/(backend)/api/webhooks/clerk/route.ts index dba40a9810..66ae1845bc 100644 --- a/src/app/(backend)/api/webhooks/clerk/route.ts +++ b/src/app/(backend)/api/webhooks/clerk/route.ts @@ -1,8 +1,8 @@ import { NextResponse } from 'next/server'; -import { authEnv } from '@/config/auth'; import { isServerMode } from '@/const/version'; import { serverDB } from '@/database/server'; +import { authEnv } from '@/envs/auth'; import { pino } from '@/libs/logger'; import { UserService } from '@/server/services/user'; diff --git a/src/app/(backend)/api/webhooks/logto/route.ts b/src/app/(backend)/api/webhooks/logto/route.ts index e5cd6feb23..7a3e6b8b8b 100644 --- a/src/app/(backend)/api/webhooks/logto/route.ts +++ b/src/app/(backend)/api/webhooks/logto/route.ts @@ -1,7 +1,7 @@ import { NextResponse } from 'next/server'; -import { authEnv } from '@/config/auth'; import { serverDB } from '@/database/server'; +import { authEnv } from '@/envs/auth'; import { pino } from '@/libs/logger'; import { NextAuthUserService } from '@/server/services/nextAuthUser'; diff --git a/src/app/(backend)/api/webhooks/logto/validateRequest.ts b/src/app/(backend)/api/webhooks/logto/validateRequest.ts index c7d1e1d500..d5005b513b 100644 --- a/src/app/(backend)/api/webhooks/logto/validateRequest.ts +++ b/src/app/(backend)/api/webhooks/logto/validateRequest.ts @@ -1,7 +1,7 @@ import { headers } from 'next/headers'; import { createHmac } from 'node:crypto'; -import { authEnv } from '@/config/auth'; +import { authEnv } from '@/envs/auth'; export type LogtToUserEntity = { applicationId?: string; diff --git a/src/config/__tests__/analytics.test.ts b/src/envs/__tests__/analytics.test.ts similarity index 95% rename from src/config/__tests__/analytics.test.ts rename to src/envs/__tests__/analytics.test.ts index b6318c1ed1..3ed849f59f 100644 --- a/src/config/__tests__/analytics.test.ts +++ b/src/envs/__tests__/analytics.test.ts @@ -1,7 +1,7 @@ // @vitest-environment node import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; -import { analyticsEnv, getAnalyticsConfig } from '../../envs/analytics'; +import { analyticsEnv, getAnalyticsConfig } from '../analytics'; beforeEach(() => { // 在每个测试用例之前,清除所有的 console.warn mock diff --git a/src/config/__tests__/app.test.ts b/src/envs/__tests__/app.test.ts similarity index 97% rename from src/config/__tests__/app.test.ts rename to src/envs/__tests__/app.test.ts index e8d0f14474..3e64c2d0b1 100644 --- a/src/config/__tests__/app.test.ts +++ b/src/envs/__tests__/app.test.ts @@ -1,7 +1,7 @@ // @vitest-environment node import { beforeEach, describe, expect, it, vi } from 'vitest'; -import { getAppConfig } from '../../envs/app'; +import { getAppConfig } from '../app'; // Stub the global process object to safely mock environment variables vi.stubGlobal('process', { diff --git a/src/config/__tests__/auth.test.ts b/src/envs/__tests__/auth.test.ts similarity index 100% rename from src/config/__tests__/auth.test.ts rename to src/envs/__tests__/auth.test.ts diff --git a/src/config/__tests__/client.test.ts b/src/envs/__tests__/client.test.ts similarity index 96% rename from src/config/__tests__/client.test.ts rename to src/envs/__tests__/client.test.ts index b5e6d7cde3..7e43c6ea97 100644 --- a/src/config/__tests__/client.test.ts +++ b/src/envs/__tests__/client.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it, vi } from 'vitest'; -import { getDebugConfig } from '../../envs/debug'; +import { getDebugConfig } from '../debug'; // 测试前重置 process.env vi.stubGlobal('process', { diff --git a/src/config/auth.ts b/src/envs/auth.ts similarity index 100% rename from src/config/auth.ts rename to src/envs/auth.ts diff --git a/src/config/file.ts b/src/envs/file.ts similarity index 100% rename from src/config/file.ts rename to src/envs/file.ts diff --git a/src/config/llm.ts b/src/envs/llm.ts similarity index 100% rename from src/config/llm.ts rename to src/envs/llm.ts diff --git a/src/layout/AuthProvider/index.tsx b/src/layout/AuthProvider/index.tsx index e27f031c38..313f14180b 100644 --- a/src/layout/AuthProvider/index.tsx +++ b/src/layout/AuthProvider/index.tsx @@ -1,6 +1,6 @@ import { PropsWithChildren } from 'react'; -import { authEnv } from '@/config/auth'; +import { authEnv } from '@/envs/auth'; import Clerk from './Clerk'; import NextAuth from './NextAuth'; diff --git a/src/libs/next-auth/auth.config.ts b/src/libs/next-auth/auth.config.ts index a9401bdfb4..88fae04608 100644 --- a/src/libs/next-auth/auth.config.ts +++ b/src/libs/next-auth/auth.config.ts @@ -1,7 +1,7 @@ import type { NextAuthConfig } from 'next-auth'; -import { getAuthConfig } from '@/config/auth'; import { getServerDBConfig } from '@/config/db'; +import { getAuthConfig } from '@/envs/auth'; import { LobeNextAuthDbAdapter } from './adapter'; import { ssoProviders } from './sso-providers'; diff --git a/src/libs/next-auth/sso-providers/auth0.ts b/src/libs/next-auth/sso-providers/auth0.ts index b784800084..8686b9711e 100644 --- a/src/libs/next-auth/sso-providers/auth0.ts +++ b/src/libs/next-auth/sso-providers/auth0.ts @@ -1,6 +1,6 @@ import Auth0 from 'next-auth/providers/auth0'; -import { authEnv } from '@/config/auth'; +import { authEnv } from '@/envs/auth'; import { CommonProviderConfig } from './sso.config'; diff --git a/src/libs/next-auth/sso-providers/authelia.ts b/src/libs/next-auth/sso-providers/authelia.ts index 3de69d5e75..4cf7f2140d 100644 --- a/src/libs/next-auth/sso-providers/authelia.ts +++ b/src/libs/next-auth/sso-providers/authelia.ts @@ -1,6 +1,6 @@ import type { OIDCConfig } from '@auth/core/providers'; -import { authEnv } from '@/config/auth'; +import { authEnv } from '@/envs/auth'; import { CommonProviderConfig } from './sso.config'; diff --git a/src/libs/next-auth/sso-providers/authentik.ts b/src/libs/next-auth/sso-providers/authentik.ts index 0f2294e0ac..1b7c2d42b1 100644 --- a/src/libs/next-auth/sso-providers/authentik.ts +++ b/src/libs/next-auth/sso-providers/authentik.ts @@ -1,6 +1,6 @@ import Authentik from 'next-auth/providers/authentik'; -import { authEnv } from '@/config/auth'; +import { authEnv } from '@/envs/auth'; import { CommonProviderConfig } from './sso.config'; diff --git a/src/libs/next-auth/sso-providers/azure-ad.ts b/src/libs/next-auth/sso-providers/azure-ad.ts index 43b8d62c0d..370f8b5349 100644 --- a/src/libs/next-auth/sso-providers/azure-ad.ts +++ b/src/libs/next-auth/sso-providers/azure-ad.ts @@ -1,6 +1,6 @@ import AzureAD from 'next-auth/providers/azure-ad'; -import { authEnv } from '@/config/auth'; +import { authEnv } from '@/envs/auth'; import { getMicrosoftEntraIdIssuer } from './microsoft-entra-id-helper'; import { CommonProviderConfig } from './sso.config'; diff --git a/src/libs/next-auth/sso-providers/cloudflare-zero-trust.ts b/src/libs/next-auth/sso-providers/cloudflare-zero-trust.ts index 0c0c2a5580..1cf1f02103 100644 --- a/src/libs/next-auth/sso-providers/cloudflare-zero-trust.ts +++ b/src/libs/next-auth/sso-providers/cloudflare-zero-trust.ts @@ -1,6 +1,6 @@ import type { OIDCConfig } from '@auth/core/providers'; -import { authEnv } from '@/config/auth'; +import { authEnv } from '@/envs/auth'; import { CommonProviderConfig } from './sso.config'; diff --git a/src/libs/next-auth/sso-providers/generic-oidc.ts b/src/libs/next-auth/sso-providers/generic-oidc.ts index 61736a5367..bea74961bb 100644 --- a/src/libs/next-auth/sso-providers/generic-oidc.ts +++ b/src/libs/next-auth/sso-providers/generic-oidc.ts @@ -1,6 +1,6 @@ import type { OIDCConfig } from '@auth/core/providers'; -import { authEnv } from '@/config/auth'; +import { authEnv } from '@/envs/auth'; import { CommonProviderConfig } from './sso.config'; diff --git a/src/libs/next-auth/sso-providers/github.ts b/src/libs/next-auth/sso-providers/github.ts index 8c6c019e42..8209ecadd2 100644 --- a/src/libs/next-auth/sso-providers/github.ts +++ b/src/libs/next-auth/sso-providers/github.ts @@ -1,6 +1,6 @@ import GitHub from 'next-auth/providers/github'; -import { authEnv } from '@/config/auth'; +import { authEnv } from '@/envs/auth'; import { CommonProviderConfig } from './sso.config'; diff --git a/src/libs/next-auth/sso-providers/logto.ts b/src/libs/next-auth/sso-providers/logto.ts index 15f14352b8..6561415bbe 100644 --- a/src/libs/next-auth/sso-providers/logto.ts +++ b/src/libs/next-auth/sso-providers/logto.ts @@ -1,6 +1,6 @@ import { OIDCConfig, OIDCUserConfig } from '@auth/core/providers'; -import { authEnv } from '@/config/auth'; +import { authEnv } from '@/envs/auth'; import { CommonProviderConfig } from './sso.config'; diff --git a/src/libs/next-auth/sso-providers/microsoft-entra-id-helper.ts b/src/libs/next-auth/sso-providers/microsoft-entra-id-helper.ts index f67b1f7e5f..3a3c4c72b3 100644 --- a/src/libs/next-auth/sso-providers/microsoft-entra-id-helper.ts +++ b/src/libs/next-auth/sso-providers/microsoft-entra-id-helper.ts @@ -1,4 +1,4 @@ -import { authEnv } from '@/config/auth'; +import { authEnv } from '@/envs/auth'; function getTenantId() { return ( diff --git a/src/libs/next-auth/sso-providers/zitadel.ts b/src/libs/next-auth/sso-providers/zitadel.ts index 8a2897d6b8..c8f5a79aa2 100644 --- a/src/libs/next-auth/sso-providers/zitadel.ts +++ b/src/libs/next-auth/sso-providers/zitadel.ts @@ -1,6 +1,6 @@ import Zitadel from 'next-auth/providers/zitadel'; -import { authEnv } from '@/config/auth'; +import { authEnv } from '@/envs/auth'; const provider = { id: 'zitadel', diff --git a/src/libs/oidc-provider/adapter.ts b/src/libs/oidc-provider/adapter.ts index 9a52b57b67..5e71546f4a 100644 --- a/src/libs/oidc-provider/adapter.ts +++ b/src/libs/oidc-provider/adapter.ts @@ -1,6 +1,4 @@ -import debug from 'debug'; -import { eq, sql } from 'drizzle-orm'; - +import { LobeChatDatabase } from '@lobechat/database'; import { oidcAccessTokens, oidcAuthorizationCodes, @@ -10,8 +8,9 @@ import { oidcInteractions, oidcRefreshTokens, oidcSessions, -} from '@/database/schemas/oidc'; -import { LobeChatDatabase } from '@/database/type'; +} from '@lobechat/database/schemas'; +import debug from 'debug'; +import { eq, sql } from 'drizzle-orm'; // 创建 adapter 日志命名空间 const log = debug('lobe-oidc:adapter'); diff --git a/src/libs/oidc-provider/provider.ts b/src/libs/oidc-provider/provider.ts index 6192085092..8a3307a9fb 100644 --- a/src/libs/oidc-provider/provider.ts +++ b/src/libs/oidc-provider/provider.ts @@ -1,10 +1,10 @@ +import { LobeChatDatabase } from '@lobechat/database'; import debug from 'debug'; import Provider, { Configuration, KoaContextWithOIDC, errors } from 'oidc-provider'; import urlJoin from 'url-join'; import { serverDBEnv } from '@/config/db'; import { UserModel } from '@/database/models/user'; -import { LobeChatDatabase } from '@/database/type'; import { appEnv } from '@/envs/app'; import { getJWKS } from '@/libs/oidc-provider/jwt'; diff --git a/src/libs/trpc/async/asyncAuth.ts b/src/libs/trpc/async/asyncAuth.ts index 998d4513c4..be2e5ad615 100644 --- a/src/libs/trpc/async/asyncAuth.ts +++ b/src/libs/trpc/async/asyncAuth.ts @@ -1,9 +1,9 @@ +import { LobeChatDatabase } from '@lobechat/database'; import { TRPCError } from '@trpc/server'; import debug from 'debug'; import { serverDBEnv } from '@/config/db'; import { UserModel } from '@/database/models/user'; -import { LobeChatDatabase } from '@/database/type'; import { asyncTrpc } from './init'; diff --git a/src/libs/trpc/async/context.ts b/src/libs/trpc/async/context.ts index b7297423f3..10316fa019 100644 --- a/src/libs/trpc/async/context.ts +++ b/src/libs/trpc/async/context.ts @@ -1,9 +1,9 @@ +import { LobeChatDatabase } from '@lobechat/database'; import { ClientSecretPayload } from '@lobechat/types'; import debug from 'debug'; import { NextRequest } from 'next/server'; import { LOBE_CHAT_AUTH_HEADER } from '@/const/auth'; -import { LobeChatDatabase } from '@/database/type'; import { KeyVaultsGateKeeper } from '@/server/modules/KeyVaultsEncrypt'; const log = debug('lobe-async:context'); diff --git a/src/middleware.ts b/src/middleware.ts index aafd4a5c39..15640dc6f4 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -5,11 +5,11 @@ import { NextRequest, NextResponse } from 'next/server'; import { UAParser } from 'ua-parser-js'; import urlJoin from 'url-join'; -import { authEnv } from '@/config/auth'; import { OAUTH_AUTHORIZED } from '@/const/auth'; import { LOBE_LOCALE_COOKIE } from '@/const/locale'; import { LOBE_THEME_APPEARANCE } from '@/const/theme'; import { appEnv } from '@/envs/app'; +import { authEnv } from '@/envs/auth'; import NextAuth from '@/libs/next-auth'; import { Locales } from '@/locales/resources'; diff --git a/src/server/globalConfig/_deprecated.test.ts b/src/server/globalConfig/_deprecated.test.ts index cff962e6d5..8e9394b9eb 100644 --- a/src/server/globalConfig/_deprecated.test.ts +++ b/src/server/globalConfig/_deprecated.test.ts @@ -25,7 +25,7 @@ vi.mock('@/config/modelProviders', () => ({ })); // Mock LLM config -vi.mock('@/config/llm', () => ({ +vi.mock('@/envs/llm', () => ({ getLLMConfig: () => ({ ENABLED_AZURE_OPENAI: true, ENABLED_AWS_BEDROCK: true, diff --git a/src/server/globalConfig/_deprecated.ts b/src/server/globalConfig/_deprecated.ts index e17636b2d6..7ab082ea79 100644 --- a/src/server/globalConfig/_deprecated.ts +++ b/src/server/globalConfig/_deprecated.ts @@ -1,7 +1,7 @@ import { ModelProvider } from '@lobechat/model-runtime'; -import { getLLMConfig } from '@/config/llm'; import * as ProviderCards from '@/config/modelProviders'; +import { getLLMConfig } from '@/envs/llm'; import { ModelProviderCard } from '@/types/llm'; import { extractEnabledModels, transformToChatModelCards } from '@/utils/_deprecated/parseModels'; diff --git a/src/server/globalConfig/genServerAiProviderConfig.test.ts b/src/server/globalConfig/genServerAiProviderConfig.test.ts index cd055b1f31..3a0ed0040b 100644 --- a/src/server/globalConfig/genServerAiProviderConfig.test.ts +++ b/src/server/globalConfig/genServerAiProviderConfig.test.ts @@ -11,7 +11,7 @@ vi.mock('model-bank', async (importOriginal) => { }; }); -vi.mock('@/config/llm', () => ({ +vi.mock('@/envs/llm', () => ({ getLLMConfig: vi.fn(() => ({ ENABLED_OPENAI: true, ENABLED_ANTHROPIC: false, @@ -83,7 +83,7 @@ describe('genServerAiProvidersConfig', () => { }; // Mock the LLM config to include our custom key - const { getLLMConfig } = vi.mocked(await import('@/config/llm')); + const { getLLMConfig } = vi.mocked(await import('@/envs/llm')); getLLMConfig.mockReturnValue({ ENABLED_OPENAI: true, ENABLED_ANTHROPIC: false, diff --git a/src/server/globalConfig/genServerAiProviderConfig.ts b/src/server/globalConfig/genServerAiProviderConfig.ts index dd59573301..2f5df75d48 100644 --- a/src/server/globalConfig/genServerAiProviderConfig.ts +++ b/src/server/globalConfig/genServerAiProviderConfig.ts @@ -4,7 +4,7 @@ import { extractEnabledModels, transformToAiModelList } from '@lobechat/utils'; import * as AiModels from 'model-bank'; import { AiFullModelCard } from 'model-bank'; -import { getLLMConfig } from '@/config/llm'; +import { getLLMConfig } from '@/envs/llm'; interface ProviderSpecificConfig { enabled?: boolean; diff --git a/src/server/globalConfig/index.ts b/src/server/globalConfig/index.ts index 78aa9d85c3..234f2e83b0 100644 --- a/src/server/globalConfig/index.ts +++ b/src/server/globalConfig/index.ts @@ -1,8 +1,8 @@ -import { authEnv } from '@/config/auth'; -import { fileEnv } from '@/config/file'; import { enableNextAuth } from '@/const/auth'; import { isDesktop } from '@/const/version'; import { appEnv, getAppConfig } from '@/envs/app'; +import { authEnv } from '@/envs/auth'; +import { fileEnv } from '@/envs/file'; import { knowledgeEnv } from '@/envs/knowledge'; import { langfuseEnv } from '@/envs/langfuse'; import { parseSystemAgent } from '@/server/globalConfig/parseSystemAgent'; diff --git a/src/server/modules/ModelRuntime/apiKeyManager.ts b/src/server/modules/ModelRuntime/apiKeyManager.ts index 9606942e61..97ad3cb82a 100644 --- a/src/server/modules/ModelRuntime/apiKeyManager.ts +++ b/src/server/modules/ModelRuntime/apiKeyManager.ts @@ -1,4 +1,4 @@ -import { getLLMConfig } from '@/config/llm'; +import { getLLMConfig } from '@/envs/llm'; interface KeyStore { index: number; diff --git a/src/server/modules/ModelRuntime/index.test.ts b/src/server/modules/ModelRuntime/index.test.ts index c476bf2558..f2a75fbe3b 100644 --- a/src/server/modules/ModelRuntime/index.test.ts +++ b/src/server/modules/ModelRuntime/index.test.ts @@ -27,7 +27,7 @@ import { describe, expect, it, vi } from 'vitest'; import { initModelRuntimeWithUserPayload } from './index'; // 模拟依赖项 -vi.mock('@/config/llm', () => ({ +vi.mock('@/envs/llm', () => ({ getLLMConfig: vi.fn(() => ({ // 确保为每个provider提供必要的配置信息 OPENAI_API_KEY: 'test-openai-key', diff --git a/src/server/modules/ModelRuntime/index.ts b/src/server/modules/ModelRuntime/index.ts index bb55978c53..70509fd594 100644 --- a/src/server/modules/ModelRuntime/index.ts +++ b/src/server/modules/ModelRuntime/index.ts @@ -1,7 +1,7 @@ import { ModelProvider, ModelRuntime } from '@lobechat/model-runtime'; import { ClientSecretPayload } from '@lobechat/types'; -import { getLLMConfig } from '@/config/llm'; +import { getLLMConfig } from '@/envs/llm'; import apiKeyManager from './apiKeyManager'; diff --git a/src/server/modules/S3/index.ts b/src/server/modules/S3/index.ts index be652e0996..730a311820 100644 --- a/src/server/modules/S3/index.ts +++ b/src/server/modules/S3/index.ts @@ -8,7 +8,7 @@ import { import { getSignedUrl } from '@aws-sdk/s3-request-presigner'; import { z } from 'zod'; -import { fileEnv } from '@/config/file'; +import { fileEnv } from '@/envs/file'; import { YEAR } from '@/utils/units'; import { inferContentTypeFromImageUrl } from '@/utils/url'; diff --git a/src/server/routers/async/file.ts b/src/server/routers/async/file.ts index 664938cefb..751be8ef22 100644 --- a/src/server/routers/async/file.ts +++ b/src/server/routers/async/file.ts @@ -4,13 +4,13 @@ import pMap from 'p-map'; import { z } from 'zod'; import { serverDBEnv } from '@/config/db'; -import { fileEnv } from '@/config/file'; import { DEFAULT_FILE_EMBEDDING_MODEL_ITEM } from '@/const/settings/knowledge'; import { ASYNC_TASK_TIMEOUT, AsyncTaskModel } from '@/database/models/asyncTask'; import { ChunkModel } from '@/database/models/chunk'; import { EmbeddingModel } from '@/database/models/embedding'; import { FileModel } from '@/database/models/file'; import { NewChunkItem, NewEmbeddingsItem } from '@/database/schemas'; +import { fileEnv } from '@/envs/file'; import { asyncAuthedProcedure, asyncRouter as router } from '@/libs/trpc/async'; import { getServerDefaultFilesConfig } from '@/server/globalConfig'; import { initModelRuntimeWithUserPayload } from '@/server/modules/ModelRuntime'; diff --git a/src/server/services/agent/index.ts b/src/server/services/agent/index.ts index 64a797c489..e2aa89658f 100644 --- a/src/server/services/agent/index.ts +++ b/src/server/services/agent/index.ts @@ -1,5 +1,6 @@ +import { LobeChatDatabase } from '@lobechat/database'; + import { SessionModel } from '@/database/models/session'; -import { LobeChatDatabase } from '@/database/type'; import { getServerDefaultAgentConfig } from '@/server/globalConfig'; export class AgentService { diff --git a/src/server/services/aiChat/index.test.ts b/src/server/services/aiChat/index.test.ts index b0cc11ea3a..c5a703d7e2 100644 --- a/src/server/services/aiChat/index.test.ts +++ b/src/server/services/aiChat/index.test.ts @@ -1,8 +1,8 @@ +import { LobeChatDatabase } from '@lobechat/database'; import { describe, expect, it, vi } from 'vitest'; import { MessageModel } from '@/database/models/message'; import { TopicModel } from '@/database/models/topic'; -import { LobeChatDatabase } from '@/database/type'; import { FileService } from '@/server/services/file'; import { AiChatService } from '.'; diff --git a/src/server/services/aiChat/index.ts b/src/server/services/aiChat/index.ts index 0c9f0b462d..2ca79411ef 100644 --- a/src/server/services/aiChat/index.ts +++ b/src/server/services/aiChat/index.ts @@ -1,6 +1,7 @@ +import { LobeChatDatabase } from '@lobechat/database'; + import { MessageModel } from '@/database/models/message'; import { TopicModel } from '@/database/models/topic'; -import { LobeChatDatabase } from '@/database/type'; import { FileService } from '@/server/services/file'; export class AiChatService { diff --git a/src/server/services/chunk/index.ts b/src/server/services/chunk/index.ts index 0725780c9c..1e4765fe98 100644 --- a/src/server/services/chunk/index.ts +++ b/src/server/services/chunk/index.ts @@ -1,8 +1,8 @@ +import { LobeChatDatabase } from '@lobechat/database'; import { ClientSecretPayload } from '@lobechat/types'; import { AsyncTaskModel } from '@/database/models/asyncTask'; import { FileModel } from '@/database/models/file'; -import { LobeChatDatabase } from '@/database/type'; import { ChunkContentParams, ContentChunk } from '@/server/modules/ContentChunk'; import { createAsyncCaller } from '@/server/routers/async'; import { diff --git a/src/server/services/document/index.ts b/src/server/services/document/index.ts index 2a5121bfe1..1e000c428f 100644 --- a/src/server/services/document/index.ts +++ b/src/server/services/document/index.ts @@ -1,9 +1,9 @@ +import { LobeChatDatabase } from '@lobechat/database'; import { loadFile } from '@lobechat/file-loaders'; import debug from 'debug'; import { DocumentModel } from '@/database/models/document'; import { FileModel } from '@/database/models/file'; -import { LobeChatDatabase } from '@/database/type'; import { LobeDocument } from '@/types/document'; import { FileService } from '../file'; diff --git a/src/server/services/file/impls/s3.test.ts b/src/server/services/file/impls/s3.test.ts index 46291d4705..32acf0ec02 100644 --- a/src/server/services/file/impls/s3.test.ts +++ b/src/server/services/file/impls/s3.test.ts @@ -10,7 +10,7 @@ const config = { }; // 模拟 fileEnv -vi.mock('@/config/file', () => ({ +vi.mock('@/envs/file', () => ({ get fileEnv() { return config; }, @@ -71,12 +71,12 @@ describe('S3StaticFileImpl', () => { it('should handle full URL input by extracting key (S3_SET_ACL=false)', async () => { config.S3_SET_ACL = false; const fullUrl = 'https://s3.example.com/bucket/path/to/file.jpg?X-Amz-Signature=expired'; - + // Mock getKeyFromFullUrl to return the extracted key vi.spyOn(fileService, 'getKeyFromFullUrl').mockReturnValue('path/to/file.jpg'); - + const result = await fileService.getFullFileUrl(fullUrl); - + expect(fileService.getKeyFromFullUrl).toHaveBeenCalledWith(fullUrl); expect(result).toBe('https://presigned.example.com/test.jpg'); config.S3_SET_ACL = true; @@ -84,33 +84,33 @@ describe('S3StaticFileImpl', () => { it('should handle full URL input by extracting key (S3_SET_ACL=true)', async () => { const fullUrl = 'https://s3.example.com/bucket/path/to/file.jpg'; - + vi.spyOn(fileService, 'getKeyFromFullUrl').mockReturnValue('path/to/file.jpg'); - + const result = await fileService.getFullFileUrl(fullUrl); - + expect(fileService.getKeyFromFullUrl).toHaveBeenCalledWith(fullUrl); expect(result).toBe('https://example.com/path/to/file.jpg'); }); it('should handle normal key input without extraction', async () => { const key = 'path/to/file.jpg'; - + const spy = vi.spyOn(fileService, 'getKeyFromFullUrl'); - + const result = await fileService.getFullFileUrl(key); - + expect(spy).not.toHaveBeenCalled(); expect(result).toBe('https://example.com/path/to/file.jpg'); }); it('should handle http:// URLs for legacy compatibility', async () => { const httpUrl = 'http://s3.example.com/bucket/path/to/file.jpg'; - + vi.spyOn(fileService, 'getKeyFromFullUrl').mockReturnValue('path/to/file.jpg'); - + const result = await fileService.getFullFileUrl(httpUrl); - + expect(fileService.getKeyFromFullUrl).toHaveBeenCalledWith(httpUrl); expect(result).toBe('https://example.com/path/to/file.jpg'); }); diff --git a/src/server/services/file/impls/s3.ts b/src/server/services/file/impls/s3.ts index 2b27eaa8df..de95df2ec5 100644 --- a/src/server/services/file/impls/s3.ts +++ b/src/server/services/file/impls/s3.ts @@ -1,6 +1,6 @@ import urlJoin from 'url-join'; -import { fileEnv } from '@/config/file'; +import { fileEnv } from '@/envs/file'; import { S3 } from '@/server/modules/S3'; import { FileServiceImpl } from './type'; diff --git a/src/server/services/file/index.ts b/src/server/services/file/index.ts index 68631cdbbb..f77d8a56a0 100644 --- a/src/server/services/file/index.ts +++ b/src/server/services/file/index.ts @@ -1,9 +1,9 @@ +import { LobeChatDatabase } from '@lobechat/database'; import { TRPCError } from '@trpc/server'; import { serverDBEnv } from '@/config/db'; import { FileModel } from '@/database/models/file'; import { FileItem } from '@/database/schemas'; -import { LobeChatDatabase } from '@/database/type'; import { TempFileManager } from '@/server/utils/tempFileManager'; import { nanoid } from '@/utils/uuid'; diff --git a/src/server/services/generation/index.ts b/src/server/services/generation/index.ts index 7d58740c03..2f301e4d6b 100644 --- a/src/server/services/generation/index.ts +++ b/src/server/services/generation/index.ts @@ -1,3 +1,4 @@ +import { LobeChatDatabase } from '@lobechat/database'; import { parseDataUri } from '@lobechat/model-runtime'; import debug from 'debug'; import { sha256 } from 'js-sha256'; @@ -6,7 +7,6 @@ import { IMAGE_GENERATION_CONFIG } from 'model-bank'; import { nanoid } from 'nanoid'; import sharp from 'sharp'; -import { LobeChatDatabase } from '@/database/type'; import { FileService } from '@/server/services/file'; import { calculateThumbnailDimensions } from '@/utils/number'; import { getYYYYmmddHHMMss } from '@/utils/time'; diff --git a/src/server/services/nextAuthUser/index.ts b/src/server/services/nextAuthUser/index.ts index bdf45d4f8e..9397e626f4 100644 --- a/src/server/services/nextAuthUser/index.ts +++ b/src/server/services/nextAuthUser/index.ts @@ -1,3 +1,4 @@ +import { LobeChatDatabase } from '@lobechat/database'; import { and, eq } from 'drizzle-orm'; import { Adapter, AdapterAccount } from 'next-auth/adapters'; import { NextResponse } from 'next/server'; @@ -11,7 +12,6 @@ import { nextauthVerificationTokens, users, } from '@/database/schemas'; -import { LobeChatDatabase } from '@/database/type'; import { pino } from '@/libs/logger'; import { merge } from '@/utils/merge'; diff --git a/src/server/services/user/index.test.ts b/src/server/services/user/index.test.ts index 5c1f0fb263..3dafc49a34 100644 --- a/src/server/services/user/index.test.ts +++ b/src/server/services/user/index.test.ts @@ -1,9 +1,9 @@ import { UserJSON } from '@clerk/backend'; +import { LobeChatDatabase } from '@lobechat/database'; import { beforeEach, describe, expect, it, vi } from 'vitest'; import { UserModel } from '@/database/models/user'; import { UserItem } from '@/database/schemas'; -import { LobeChatDatabase } from '@/database/type'; import { pino } from '@/libs/logger'; import { AgentService } from '@/server/services/agent'; diff --git a/src/server/services/user/index.ts b/src/server/services/user/index.ts index e02957adbc..39889d87a8 100644 --- a/src/server/services/user/index.ts +++ b/src/server/services/user/index.ts @@ -1,7 +1,7 @@ import { UserJSON } from '@clerk/backend'; +import { LobeChatDatabase } from '@lobechat/database'; import { UserModel } from '@/database/models/user'; -import { LobeChatDatabase } from '@/database/type'; import { initializeServerAnalytics } from '@/libs/analytics'; import { pino } from '@/libs/logger'; import { KeyVaultsGateKeeper } from '@/server/modules/KeyVaultsEncrypt'; diff --git a/src/services/__tests__/upload.test.ts b/src/services/__tests__/upload.test.ts index 70937d976c..3d0aa8ad88 100644 --- a/src/services/__tests__/upload.test.ts +++ b/src/services/__tests__/upload.test.ts @@ -1,6 +1,6 @@ import { beforeEach, describe, expect, it, vi } from 'vitest'; -import { fileEnv } from '@/config/file'; +import { fileEnv } from '@/envs/file'; import { edgeClient } from '@/libs/trpc/client'; import { API_ENDPOINTS } from '@/services/_url'; import { clientS3Storage } from '@/services/file/ClientS3'; diff --git a/src/services/file/_deprecated.test.ts b/src/services/file/_deprecated.test.ts index f1d66134be..ca0e6ac426 100644 --- a/src/services/file/_deprecated.test.ts +++ b/src/services/file/_deprecated.test.ts @@ -1,8 +1,8 @@ import { Mock, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest'; -import { fileEnv } from '@/config/file'; import { FileModel } from '@/database/_deprecated/models/file'; import { DB_File } from '@/database/_deprecated/schemas/files'; +import { fileEnv } from '@/envs/file'; import { clientS3Storage } from '@/services/file/ClientS3'; import { serverConfigSelectors } from '@/store/serverConfig/selectors'; import { createServerConfigStore } from '@/store/serverConfig/store'; diff --git a/src/services/upload.ts b/src/services/upload.ts index d5903aa725..6bbd61c727 100644 --- a/src/services/upload.ts +++ b/src/services/upload.ts @@ -4,7 +4,7 @@ import { uuid } from '@lobechat/utils'; import dayjs from 'dayjs'; import { sha256 } from 'js-sha256'; -import { fileEnv } from '@/config/file'; +import { fileEnv } from '@/envs/file'; import { edgeClient } from '@/libs/trpc/client'; import { API_ENDPOINTS } from '@/services/_url'; import { clientS3Storage } from '@/services/file/ClientS3';