diff --git a/apps/portal-shell/ARCHITECTURE.md b/apps/portal-shell/ARCHITECTURE.md index a164758..cec4e4c 100644 --- a/apps/portal-shell/ARCHITECTURE.md +++ b/apps/portal-shell/ARCHITECTURE.md @@ -2,7 +2,7 @@ > 版本:3.0 > 日期:2026-07-20 -> 状态:**P0 已完成 + P1-1/P1-2/P1-3 已完成(2026-07-22 验收)+ P1 进行中;架构审计完成 + 重设计方案定稿** +> 状态:**P0 已完成 + P1-1/P1-2/P1-3/P1-4 已完成(2026-07-22 验收)+ P1 进行中;架构审计完成 + 重设计方案定稿** > 本文档地位:**portal-shell 前端工作的唯一权威指导文档**。所有后续 AI/人工在此模块的工作必须先读本文件,以其为准。 > > 关联文档(按效力排序): @@ -757,7 +757,7 @@ export default async function ExamsPage(): Promise { - **P0-7**:`eslint .` → 0 errors, 2 warnings(均在 `__generated__/types.ts` 生成文件);[eslint.config.js](file:///e:/Desktop/Edu/apps/portal-shell/eslint.config.js) 含 `no-restricted-imports` - **P0-8**:`git status` 干净(commit `cfb7b00`);`.env.local` 与 `tsconfig.tsbuildinfo` 已在 [.gitignore](file:///e:/Desktop/Edu/apps/portal-shell/.gitignore) -### P1 · 框架与数据源接通(1–2 周)— 进行中(P1-1/P1-2 ✅ 2026-07-22 验收) +### P1 · 框架与数据源接通(1–2 周)— 进行中(P1-1/P1-2/P1-3/P1-4 ✅ 2026-07-22 验收) **目标**:AppFrame + 导航 + 真实数据仪表盘 + 页面模板 + MSW + i18n,页面迁移的"流水线"建成。 @@ -766,7 +766,7 @@ export default async function ExamsPage(): Promise { | P1-1 | `src/app/shell/layout.tsx` AppFrame(TopBar 静态挂载 + Sidebar 导航菜单 `navigation.ts` + 权限过滤) | 4 角色各见各菜单;导航项与 route-permissions 表一致(单测) | ✅ | | P1-2 | 仪表盘改接真实查询:`teacherDashboard`/`studentDashboard`/`parentDashboard`/`adminDashboard` + `warnings`/`errorBookStats` | 起全栈,4 角色仪表盘显示真实聚合数据(截图);widget 假契约查询(grades/homeworks/schedule/attendance/exams/announcements)全部下线或改造 | ✅ | | P1-3 | 页面模板四件套(list/detail/form/workbench)+ 三态规范 | Storybook 或示例页 4 张(/shell/dev/templates/*,仅 dev 可见;注:Next.js 私有文件夹 `_xxx` 不参与路由,故使用 `dev` 而非 `_dev`) | ✅ | -| P1-4 | next-intl 接入 + messages 合并迁移 | 切换 locale 页面文案切换(截图);`useT` 自造函数删除 | ⏳ | +| P1-4 | next-intl 接入 + messages 合并迁移 | 切换 locale 页面文案切换(截图);`useT` 自造函数删除 | ✅ | | P1-5 | MSW 兜底层(迁移旧 handlers,覆盖 dashboard/users/exams/grades 四域起步) | `NEXT_PUBLIC_MSW=1` 无后端启动,仪表盘 + users 页有数据(截图);生产构建 bundle 无 mocks | ⏳ | | P1-6 | 31 widget 令牌清债(271 处机械替换)+ `border border` 去重 + 未知类检测进 arch:scan | `grep -c "text-heading-\|mt-sm\|py-xs\|p-md" src/widgets` = 0;`pnpm lint:tokens` 通过 | ⏳ | | P1-7 | codegen 恢复 typescript-operations(config + data-ana 两域先行关闭 skipDocumentsValidation) | 生成操作级类型;lib/api 对应域删除手写 interface;typecheck 通过 | ⏳ | @@ -823,6 +823,27 @@ export default async function ExamsPage(): Promise { - **单测**:`vitest run --reporter=verbose page-templates` → 19/19 passed(覆盖 4 个模板的三态、字段渲染、提交按钮禁用、errorSummary alert 等) - **质量校验**:`tsc --noEmit` 通过;`eslint src/shared/components/page-templates src/app/shell/dev src/shared/lib/route-permissions.ts` 通过;`vitest run` 全量 21 test files / 231 tests 全部通过(212 原有 + 19 新增) +**P1-4 验收证据(2026-07-22)**: + +- **next-intl v4.13.2 接入(无 i18n 路由模式)**: + - [next.config.js](file:///e:/Desktop/Edu/apps/portal-shell/next.config.js):`createNextIntlPlugin("./src/i18n/request.ts")` 包装 `nextConfig`,Turbopack resolveAlias 注入 `next-intl/config` + - [src/i18n/request.ts](file:///e:/Desktop/Edu/apps/portal-shell/src/i18n/request.ts):`getRequestConfig` 从 `NEXT_LOCALE` cookie 读取 locale(缺省 `zh-CN`),动态 import 对应 messages JSON + - [src/app/layout.tsx](file:///e:/Desktop/Edu/apps/portal-shell/src/app/layout.tsx):`async RootLayout` + `getLocale()` / `getMessages()` + `` 注入全局 messages;`` 随 cookie 切换 +- **messages 合并迁移**: + - [src/messages/zh-CN.json](file:///e:/Desktop/Edu/apps/portal-shell/src/messages/zh-CN.json):从 teacher-portal 合并 + 新增 `shell.dev.templates` 命名空间(title/description/list/detail/form/workbench 及其 listExample 等子键) + - [src/messages/en.json](file:///e:/Desktop/Edu/apps/portal-shell/src/messages/en.json):与 zh-CN.json 结构完全对称 +- **自造 i18n 删除**: + - [src/providers/ThemeI18nProvider.tsx](file:///e:/Desktop/Edu/apps/portal-shell/src/providers/ThemeI18nProvider.tsx) 已删除(含 `useT()` 函数 + `DEFAULT_MESSAGES` 常量) + - [src/providers/ThemeProvider.tsx](file:///e:/Desktop/Edu/apps/portal-shell/src/providers/ThemeProvider.tsx):新建,仅保留主题切换(`usePluginStore(s => s.theme)` + `document.documentElement.classList` 切换 `.dark`) + - [src/shell/PluginStore.ts](file:///e:/Desktop/Edu/apps/portal-shell/src/shell/PluginStore.ts):移除 `locale` / `setLocale` 字段 + - `grep -rn "useT(\|ThemeI18nProvider\|DEFAULT_MESSAGES" src` → 无匹配(自造函数全删除) +- **locale-switcher 改造**:[src/widgets/topbar/locale-switcher/index.tsx](file:///e:/Desktop/Edu/apps/portal-shell/src/widgets/topbar/locale-switcher/index.tsx) 使用 `useLocale()` + `useTranslations()` + cookie 写入 + `router.refresh()` 触发 RSC 重新渲染 +- **dev/templates 页面演示**:[src/app/shell/dev/templates/page.tsx](file:///e:/Desktop/Edu/apps/portal-shell/src/app/shell/dev/templates/page.tsx) 使用 `getTranslations("shell.dev.templates")`(Server Component) +- **locale 切换 HTTP 验证**(dev server `next dev --turbopack -p 4010`): + - `GET /login`(无 cookie)→ `` + `NextIntlClientProvider locale="zh-CN"` + 中文文案("保存"/"取消"/"切换侧栏") + - `GET /login`(`Cookie: NEXT_LOCALE=en`)→ `` + `NextIntlClientProvider locale="en"` + 英文文案("Save"/"Cancel"/"Toggle sidebar") +- **质量校验**:`tsc --noEmit` 通过;`eslint src` → 0 errors, 2 warnings(`__generated__/types.ts` 生成文件);`vitest run` 全量 21 test files / 231 tests 全部通过 + ### P2 · 教师域页面(2–3 周,可与 P3 部分并行) - 范围:§9.1 全表(~50 页)。顺序建议:exams → homework → grades → lesson-plans → questions/textbooks → attendance/classes/students → diagnostic/error-book/analytics → elective/course-plans → ai-* → practice/schedule-changes/leave。 diff --git a/apps/portal-shell/next.config.js b/apps/portal-shell/next.config.js index 5e04cc3..1f63cd9 100644 --- a/apps/portal-shell/next.config.js +++ b/apps/portal-shell/next.config.js @@ -1,18 +1,22 @@ /** - * Next.js 配置(v2.1 M8 + v0.2 Tailwind v4 + Next 16 Turbopack) + * Next.js 配置(v2.1 M8 + v0.2 Tailwind v4 + Next 16 Turbopack + P1-4 next-intl) * * 角色:插件化仪表盘宿主(单 Next.js App Router · 单 Docker) - * - output: standalone(单容器部署) + * - output:standalone(单容器部署) * - transpilePackages: @edu/* workspace 包 * - 反向代理:/api/v1/* → api-gateway :8080(JWT 校验 + 注入 x-user-id/x-user-role) * - GraphQL 查询走 apollo-router :3000(M8 验收点,由 Apollo Client 直连) + * - next-intl:无 i18n 路由模式(locale 由 cookie 决定,ARCHITECTURE.md §3.4 V3-A6) * * Next 16 默认 Turbopack: * - turbopack.resolveExtensions 处理 ESM 包 .js 后缀导入源码 TS 文件的映射 * - webpack 配置保留作为 fallback(--webpack flag 时生效) * - * 关联:portal-shell spec §2、project_rules §3.2 + * 关联:portal-shell ARCHITECTURE.md §3.4 V3-A6、spec §2、project_rules §3.2 */ +import createNextIntlPlugin from "next-intl/plugin"; + +const withNextIntl = createNextIntlPlugin("./src/i18n/request.ts"); /** @type {import('next').NextConfig} */ const nextConfig = { @@ -65,4 +69,4 @@ const nextConfig = { }, }; -export default nextConfig; +export default withNextIntl(nextConfig); diff --git a/apps/portal-shell/package.json b/apps/portal-shell/package.json index b09d128..7968a04 100644 --- a/apps/portal-shell/package.json +++ b/apps/portal-shell/package.json @@ -39,6 +39,7 @@ "jose": "^5.9.6", "lucide-react": "^0.562.0", "next": "^16.0.10", + "next-intl": "^4.13.2", "next-themes": "^0.4.6", "react": "^19.2.1", "react-dom": "^19.2.1", diff --git a/apps/portal-shell/src/app/layout.tsx b/apps/portal-shell/src/app/layout.tsx index da8bf05..77a4cd4 100644 --- a/apps/portal-shell/src/app/layout.tsx +++ b/apps/portal-shell/src/app/layout.tsx @@ -2,6 +2,8 @@ import "./globals.css"; import type { Metadata, Viewport } from "next"; import { Inter } from "next/font/google"; import type { ReactNode } from "react"; +import { NextIntlClientProvider } from "next-intl"; +import { getLocale, getMessages } from "next-intl/server"; import { Toaster } from "@/shared/components/ui/sonner"; @@ -31,24 +33,35 @@ export const viewport: Viewport = { }; /** - * RootLayout + * RootLayout(P1-4:next-intl 接入) * - * 仅负责 / 与字体变量 + 全局 Toaster。 - * 业务 Providers(Apollo/Auth/ThemeI18n)在 ClientShell 中挂载(spec §5.5)。 + * 职责: + * - :从 next-intl getLocale() 获取(cookie 驱动) + * - NextIntlClientProvider:将 messages 注入客户端,useTranslations 全局可用 + * - 字体变量 + 全局 Toaster * - * suppressHydrationWarning:ThemeI18nProvider 在客户端切换 .dark class, + * 业务 Providers(Apollo/Auth/Theme)在 ClientShell 中挂载(spec §5.5)。 + * + * suppressHydrationWarning:ThemeProvider 在客户端切换 .dark class, * 与 SSR 输出的 不一致,需抑制 hydration 警告。 + * + * 关联:portal-shell ARCHITECTURE.md §3.4 V3-A6、§8.7 */ -export default function RootLayout({ +export default async function RootLayout({ children, }: { children: ReactNode; -}): ReactNode { +}): Promise { + const locale = await getLocale(); + const messages = await getMessages(); + return ( - + - {children} - + + {children} + + ); diff --git a/apps/portal-shell/src/app/shell/dev/templates/page.tsx b/apps/portal-shell/src/app/shell/dev/templates/page.tsx index 8a903ff..c215065 100644 --- a/apps/portal-shell/src/app/shell/dev/templates/page.tsx +++ b/apps/portal-shell/src/app/shell/dev/templates/page.tsx @@ -1,65 +1,68 @@ import { notFound } from "next/navigation"; import Link from "next/link"; +import { getTranslations } from "next-intl/server"; import { PageHeader } from "@/shared/components/ui/page-header"; /** - * 模板预览首页(ARCHITECTURE.md §10 P1-3) + * 模板预览首页(ARCHITECTURE.md §10 P1-3 + P1-4 next-intl) * * /shell/dev/templates — 仅 dev 可见 * * 生产环境调用 notFound() 渲染 404,避免模板示例暴露到线上。 * middleware 已放行 /shell/dev/**(仅校验登录),此文件做二次守卫。 * + * P1-4:文案走 next-intl getTranslations(Server Component), + * 切换 NEXT_LOCALE cookie 后页面文案即时切换。 + * * 注:原 ARCHITECTURE.md 使用 `_dev` 命名,但 Next.js 将下划线开头的文件夹 * 视为私有文件夹(不参与路由),故改用 `dev` 命名。 */ -export default function TemplatesIndexPage(): React.ReactElement { +export default async function TemplatesIndexPage(): Promise { if (process.env.NODE_ENV === "production") { notFound(); } + const t = await getTranslations("shell.dev.templates"); + const templates = [ { href: "/shell/dev/templates/list", - title: "列表页模板", - description: "PageHeader + FilterBar + DataTable + Pagination + 三态", + title: t("list"), + description: t("listDescription"), }, { href: "/shell/dev/templates/detail", - title: "详情页模板", - description: "PageHeader + 信息区 + Tabs/分区 + 关联列表", + title: t("detail"), + description: t("detailDescription"), }, { href: "/shell/dev/templates/form", - title: "表单页模板", - description: "PageHeader + 表单 + 提交/取消 + 错误摘要", + title: t("form"), + description: t("formDescription"), }, { href: "/shell/dev/templates/workbench", - title: "工作台页模板", - description: "三栏(树/画布/属性)复合组件", + title: t("workbench"), + description: t("workbenchDescription"), }, ]; return (
- +
- {templates.map((t) => ( + {templates.map((tpl) => ( -

{t.title}

+

{tpl.title}

- {t.description} + {tpl.description}

-

{t.href}

+

{tpl.href}

))}
diff --git a/apps/portal-shell/src/i18n/request.ts b/apps/portal-shell/src/i18n/request.ts new file mode 100644 index 0000000..eeaae89 --- /dev/null +++ b/apps/portal-shell/src/i18n/request.ts @@ -0,0 +1,32 @@ +/** + * next-intl 请求配置(App Router 无 i18n 路由模式) + * + * ARCHITECTURE.md §3.4 V3-A6:next-intl 正式接入 + * + * 采用"无 i18n 路由"策略(locale 不出现在 URL 中): + * - locale 由 NEXT_LOCALE cookie 决定(locale-switcher 写入) + * - 缺省 locale = zh-CN + * - 切换 locale 时设置 cookie + router.refresh() 触发 RSC 重新渲染 + * + * 关联:portal-shell ARCHITECTURE.md §3.4 V3-A6、§8.7、§11.2 + */ +import { getRequestConfig } from "next-intl/server"; +import { cookies } from "next/headers"; + +export const locales = ["zh-CN", "en"] as const; +export type Locale = (typeof locales)[number]; +export const defaultLocale: Locale = "zh-CN"; + +export default getRequestConfig(async () => { + const cookieStore = await cookies(); + const cookieLocale = cookieStore.get("NEXT_LOCALE")?.value; + const locale: Locale = + cookieLocale && locales.includes(cookieLocale as Locale) + ? (cookieLocale as Locale) + : defaultLocale; + + return { + locale, + messages: (await import(`../messages/${locale}.json`)).default, + }; +}); diff --git a/apps/portal-shell/src/messages/en.json b/apps/portal-shell/src/messages/en.json new file mode 100644 index 0000000..b1472a9 --- /dev/null +++ b/apps/portal-shell/src/messages/en.json @@ -0,0 +1,214 @@ +{ + "common": { + "brand": "Edu", + "button": { + "save": "Save", + "cancel": "Cancel", + "edit": "Edit", + "export": "Export", + "search": "Search", + "delete": "Delete", + "retry": "Retry", + "back": "Back" + }, + "label": { + "search": "Search", + "loading": "Loading...", + "student": "Student", + "studentNo": "Student No.", + "score": "Score", + "feedback": "Feedback", + "class": "Class", + "subject": "Subject", + "name": "Name", + "email": "Email", + "roles": "Roles" + }, + "status": { + "loading": "Loading...", + "saved": "Saved" + }, + "error": { + "loadFailed": "Failed to load: {message}", + "pageError": "Something went wrong" + }, + "nav": { + "empty": "No viewports available", + "loadError": "Navigation failed to load: {message}", + "logout": "Log out", + "noRoles": "No roles" + }, + "locale": { + "label": "Language", + "zhCN": "简体中文", + "en": "English" + }, + "empty": { + "title": "No data", + "description": "Adjust filters and retry, or create your first record" + }, + "navLabel": { + "dashboard": "Dashboard", + "classes": "Classes", + "exams": "Exams", + "homework": "Homework", + "grades": "Grades", + "analytics": "Analytics", + "knowledgeGraph": "Knowledge Graph", + "notifications": "Notifications", + "aiAssist": "AI Assist", + "aiLessonPlan": "AI Lesson Plan", + "aiReport": "AI Report", + "attendance": "Attendance", + "questions": "Questions", + "textbooks": "Textbooks", + "lessonPlans": "Lesson Plans", + "coursePlans": "Course Plans", + "diagnostic": "Diagnostic", + "errorBook": "Error Book", + "practice": "Practice", + "elective": "Elective", + "leave": "Leave Requests", + "scheduleChanges": "Schedule Changes", + "settings": "Settings", + "students": "Students" + } + }, + "shell": { + "toggleSidebar": "Toggle sidebar", + "layout": "Layout", + "empty": "No visible plugins", + "dev": { + "templates": { + "title": "Page Templates Quartet", + "description": "P1-3 preview pages (dev only, 404 in production)", + "list": "List Page Template", + "listDescription": "PageHeader + FilterBar + DataTable + Pagination + 3 states", + "detail": "Detail Page Template", + "detailDescription": "PageHeader + info area + Tabs/sections + related list", + "form": "Form Page Template", + "formDescription": "PageHeader + form + submit/cancel + error summary", + "workbench": "Workbench Page Template", + "workbenchDescription": "Three-column (tree/canvas/properties) composite", + "listExample": { + "title": "Exam Management", + "subtitle": "List page template example", + "searchPlaceholder": "Search exam name...", + "newExam": "New Exam" + }, + "detailExample": { + "title": "2026 Spring Final Exam", + "subtitle": "Detail page template example" + }, + "formExample": { + "title": "New Exam", + "subtitle": "Form page template example" + }, + "workbenchExample": { + "title": "Lesson Plan Editor", + "subtitle": "Workbench page template example" + } + } + } + }, + "auth": { + "title": "Login" + }, + "dashboard": { + "title": "Welcome", + "greeting": "Welcome, {name}", + "subtitle": "{email} · Roles: {roles} · Data scope: {dataScope}", + "subtitleNoRoles": "None", + "error": { + "loadFailed": "Dashboard failed to load: {message}" + }, + "empty": { + "title": "No data", + "description": "Dashboard data is not ready yet" + }, + "stats": { + "classes": "Total Classes", + "exams": "Total Exams", + "pendingGrading": "Pending Grading" + }, + "classes": { + "title": "My Classes", + "count": "{count} total", + "viewAll": "View all", + "emptyTitle": "No classes", + "emptyDescription": "Please contact the administrator to assign classes", + "grade": "Grade: {gradeId}", + "studentCount": "{count} students", + "viewStudents": "View students" + } + }, + "classes": { + "title": "Classes" + }, + "exams": { + "title": "Exams" + }, + "homework": { + "title": "Homework" + }, + "grades": { + "title": "Grades" + }, + "analytics": { + "title": "Analytics" + }, + "knowledgeGraph": { + "title": "Knowledge Graph" + }, + "notifications": { + "title": "Notifications" + }, + "aiAssist": { + "title": "AI Assist" + }, + "aiLessonPlan": { + "title": "AI Lesson Plan" + }, + "aiReport": { + "title": "AI Report" + }, + "attendance": { + "title": "Attendance" + }, + "questions": { + "title": "Questions" + }, + "textbooks": { + "title": "Textbooks" + }, + "lessonPlans": { + "title": "Lesson Plans" + }, + "coursePlans": { + "title": "Course Plans" + }, + "diagnostic": { + "title": "Diagnostic" + }, + "errorBook": { + "title": "Error Book" + }, + "practice": { + "title": "Practice" + }, + "elective": { + "title": "Elective" + }, + "leave": { + "title": "Leave Requests" + }, + "scheduleChanges": { + "title": "Schedule Changes" + }, + "settings": { + "title": "Settings" + }, + "students": { + "title": "Students" + } +} diff --git a/apps/portal-shell/src/messages/zh-CN.json b/apps/portal-shell/src/messages/zh-CN.json new file mode 100644 index 0000000..650bb06 --- /dev/null +++ b/apps/portal-shell/src/messages/zh-CN.json @@ -0,0 +1,214 @@ +{ + "common": { + "brand": "Edu", + "button": { + "save": "保存", + "cancel": "取消", + "edit": "编辑", + "export": "导出", + "search": "搜索", + "delete": "删除", + "retry": "重试", + "back": "返回" + }, + "label": { + "search": "搜索", + "loading": "加载中...", + "student": "学生", + "studentNo": "学号", + "score": "分数", + "feedback": "反馈", + "class": "班级", + "subject": "学科", + "name": "姓名", + "email": "邮箱", + "roles": "角色" + }, + "status": { + "loading": "加载中...", + "saved": "已保存" + }, + "error": { + "loadFailed": "加载失败:{message}", + "pageError": "页面出错了" + }, + "nav": { + "empty": "暂无可用视口", + "loadError": "导航加载失败:{message}", + "logout": "退出登录", + "noRoles": "无角色" + }, + "locale": { + "label": "语言", + "zhCN": "简体中文", + "en": "English" + }, + "empty": { + "title": "暂无数据", + "description": "调整筛选条件后重试,或新建第一条记录" + }, + "navLabel": { + "dashboard": "仪表盘", + "classes": "班级管理", + "exams": "考试管理", + "homework": "作业管理", + "grades": "成绩查询", + "analytics": "学情分析", + "knowledgeGraph": "知识图谱", + "notifications": "通知中心", + "aiAssist": "AI 辅助", + "aiLessonPlan": "AI 教案", + "aiReport": "AI 学情报告", + "attendance": "考勤管理", + "questions": "题库", + "textbooks": "教材", + "lessonPlans": "备课", + "coursePlans": "课程计划", + "diagnostic": "诊断报告", + "errorBook": "错题本", + "practice": "练习分析", + "elective": "选修课", + "leave": "请假审批", + "scheduleChanges": "调课申请", + "settings": "个人设置", + "students": "学生" + } + }, + "shell": { + "toggleSidebar": "切换侧栏", + "layout": "布局", + "empty": "暂无可见插件", + "dev": { + "templates": { + "title": "页面模板四件套", + "description": "P1-3 验收用示例页(仅 dev 可见,生产环境 404)", + "list": "列表页模板", + "listDescription": "PageHeader + FilterBar + DataTable + Pagination + 三态", + "detail": "详情页模板", + "detailDescription": "PageHeader + 信息区 + Tabs/分区 + 关联列表", + "form": "表单页模板", + "formDescription": "PageHeader + 表单 + 提交/取消 + 错误摘要", + "workbench": "工作台页模板", + "workbenchDescription": "三栏(树/画布/属性)复合组件", + "listExample": { + "title": "考试管理", + "subtitle": "列表页模板示例", + "searchPlaceholder": "搜索考试名称...", + "newExam": "新建考试" + }, + "detailExample": { + "title": "2026 春季期末考试", + "subtitle": "详情页模板示例" + }, + "formExample": { + "title": "新建考试", + "subtitle": "表单页模板示例" + }, + "workbenchExample": { + "title": "教案编辑器", + "subtitle": "工作台页模板示例" + } + } + } + }, + "auth": { + "title": "登录" + }, + "dashboard": { + "title": "欢迎", + "greeting": "欢迎,{name}", + "subtitle": "{email} · 角色:{roles} · 数据范围:{dataScope}", + "subtitleNoRoles": "无", + "error": { + "loadFailed": "仪表盘加载失败:{message}" + }, + "empty": { + "title": "暂无数据", + "description": "仪表盘数据尚未就绪" + }, + "stats": { + "classes": "班级总数", + "exams": "考试总数", + "pendingGrading": "待批改" + }, + "classes": { + "title": "我的班级", + "count": "{count} 个", + "viewAll": "查看全部", + "emptyTitle": "暂无班级", + "emptyDescription": "请联系管理员分配班级", + "grade": "年级:{gradeId}", + "studentCount": "{count} 名学生", + "viewStudents": "查看学生" + } + }, + "classes": { + "title": "班级管理" + }, + "exams": { + "title": "考试管理" + }, + "homework": { + "title": "作业管理" + }, + "grades": { + "title": "成绩查询" + }, + "analytics": { + "title": "学情分析" + }, + "knowledgeGraph": { + "title": "知识图谱" + }, + "notifications": { + "title": "通知中心" + }, + "aiAssist": { + "title": "AI 辅助" + }, + "aiLessonPlan": { + "title": "AI 教案" + }, + "aiReport": { + "title": "AI 学情报告" + }, + "attendance": { + "title": "考勤管理" + }, + "questions": { + "title": "题库" + }, + "textbooks": { + "title": "教材" + }, + "lessonPlans": { + "title": "备课" + }, + "coursePlans": { + "title": "课程计划" + }, + "diagnostic": { + "title": "诊断报告" + }, + "errorBook": { + "title": "错题本" + }, + "practice": { + "title": "练习分析" + }, + "elective": { + "title": "选修课" + }, + "leave": { + "title": "请假审批" + }, + "scheduleChanges": { + "title": "调课申请" + }, + "settings": { + "title": "个人设置" + }, + "students": { + "title": "学生" + } +} diff --git a/apps/portal-shell/src/providers/ThemeI18nProvider.tsx b/apps/portal-shell/src/providers/ThemeI18nProvider.tsx deleted file mode 100644 index f6c2f98..0000000 --- a/apps/portal-shell/src/providers/ThemeI18nProvider.tsx +++ /dev/null @@ -1,55 +0,0 @@ -"use client"; - -/** - * 主题 + i18n Provider(v2.1 M8) - * - * 通过 PluginStore(Zustand)管理 theme(light/dark)与 locale(zh-CN/en), - * 将主题类名同步到 ,locale 用于基础文案切换。 - * - * 关联:portal-shell spec §5.2.2 Zustand Store、§9.1 providers - */ -import { useEffect, type ReactNode } from "react"; -import { usePluginStore } from "@/shell/PluginStore"; - -const DEFAULT_MESSAGES = { - "zh-CN": { - "shell.toggleSidebar": "切换侧栏", - "shell.layout": "布局", - "shell.empty": "暂无可见插件", - }, - en: { - "shell.toggleSidebar": "Toggle sidebar", - "shell.layout": "Layout", - "shell.empty": "No visible plugins", - }, -} as const; - -type MessageKey = keyof (typeof DEFAULT_MESSAGES)["zh-CN"]; - -export function ThemeI18nProvider({ - children, -}: { - children: ReactNode; -}): ReactNode { - const theme = usePluginStore((s) => s.theme); - const locale = usePluginStore((s) => s.locale); - - useEffect(() => { - if (typeof document === "undefined") return; - const root = document.documentElement; - if (theme === "dark") { - root.classList.add("dark"); - } else { - root.classList.remove("dark"); - } - root.lang = locale; - }, [theme, locale]); - - return <>{children}; -} - -/** 简易 i18n 翻译函数(MVP,复用 PluginStore 的 locale) */ -export function useT(): (key: MessageKey) => string { - const locale = usePluginStore((s) => s.locale); - return (key: MessageKey) => DEFAULT_MESSAGES[locale][key]; -} diff --git a/apps/portal-shell/src/providers/ThemeProvider.tsx b/apps/portal-shell/src/providers/ThemeProvider.tsx new file mode 100644 index 0000000..0767d07 --- /dev/null +++ b/apps/portal-shell/src/providers/ThemeProvider.tsx @@ -0,0 +1,32 @@ +"use client"; + +/** + * ThemeProvider(v3.0 P1-4:i18n 已迁移至 next-intl) + * + * 仅管理主题(light/dark),将主题类名同步到 。 + * locale 现由 next-intl 管理(cookie 驱动), 在 root layout 设置。 + * + * 关联:portal-shell ARCHITECTURE.md §3.4 V3-A6、spec §5.2.2 Zustand Store + */ +import { useEffect, type ReactNode } from "react"; +import { usePluginStore } from "@/shell/PluginStore"; + +export function ThemeProvider({ + children, +}: { + children: ReactNode; +}): ReactNode { + const theme = usePluginStore((s) => s.theme); + + useEffect(() => { + if (typeof document === "undefined") return; + const root = document.documentElement; + if (theme === "dark") { + root.classList.add("dark"); + } else { + root.classList.remove("dark"); + } + }, [theme]); + + return <>{children}; +} diff --git a/apps/portal-shell/src/shared/components/__tests__/page-templates.test.tsx b/apps/portal-shell/src/shared/components/__tests__/page-templates.test.tsx index c8658ee..5b2c959 100644 --- a/apps/portal-shell/src/shared/components/__tests__/page-templates.test.tsx +++ b/apps/portal-shell/src/shared/components/__tests__/page-templates.test.tsx @@ -253,9 +253,5 @@ function WorkPageShellLoading({ }: { children: React.ReactNode; }): React.ReactElement { - return ( - - {children} - - ); + return ; } diff --git a/apps/portal-shell/src/shell/ClientShell.tsx b/apps/portal-shell/src/shell/ClientShell.tsx index 2f82852..3a0a73c 100644 --- a/apps/portal-shell/src/shell/ClientShell.tsx +++ b/apps/portal-shell/src/shell/ClientShell.tsx @@ -17,7 +17,7 @@ import { use, useState, type ReactNode } from "react"; import { ApolloProvider } from "@/providers/ApolloProvider"; import { AuthProvider, type AuthUser } from "@/providers/AuthProvider"; -import { ThemeI18nProvider } from "@/providers/ThemeI18nProvider"; +import { ThemeProvider } from "@/providers/ThemeProvider"; import { Shell } from "./Shell"; import { usePluginConfig } from "@/lib/usePluginConfig"; import type { PluginConfigResponse, Role } from "@/lib/types"; @@ -105,7 +105,7 @@ export function ClientShell({ return ( - + {useStreaming && configPromise ? ( setConfigChanged(false)} /> )} - + ); diff --git a/apps/portal-shell/src/shell/PluginStore.ts b/apps/portal-shell/src/shell/PluginStore.ts index b25c77e..abfb290 100644 --- a/apps/portal-shell/src/shell/PluginStore.ts +++ b/apps/portal-shell/src/shell/PluginStore.ts @@ -1,31 +1,28 @@ /** - * PluginStore - Zustand 全局状态(v2.1 M8) + * PluginStore - Zustand 全局状态(v2.1 M8 + v3.0 P1-4) * * 管理纯 UI、不可分享的全局状态(portal-shell spec §5.2.2): * - theme(light/dark) - * - locale(zh-CN/en) * - sidebarCollapsed * + * locale 已迁移至 next-intl(cookie 驱动,ARCHITECTURE.md §3.4 V3-A6)。 + * * 跨插件可分享状态走 URL Search Params,不进此 Store。 * - * 关联:portal-shell spec §5.2.2、§9.1 + * 关联:portal-shell spec §5.2.2、§9.1、ARCHITECTURE.md §3.4 V3-A6 */ import { create } from "zustand"; export interface PluginStore { theme: "light" | "dark"; - locale: "zh-CN" | "en"; sidebarCollapsed: boolean; setTheme: (theme: "light" | "dark") => void; - setLocale: (locale: "zh-CN" | "en") => void; toggleSidebar: () => void; } export const usePluginStore = create((set) => ({ theme: "light", setTheme: (theme) => set({ theme }), - locale: "zh-CN", - setLocale: (locale) => set({ locale }), sidebarCollapsed: false, toggleSidebar: () => set((s) => ({ sidebarCollapsed: !s.sidebarCollapsed })), })); diff --git a/apps/portal-shell/src/widgets/topbar/locale-switcher/index.tsx b/apps/portal-shell/src/widgets/topbar/locale-switcher/index.tsx index 661d0b9..29bf82b 100644 --- a/apps/portal-shell/src/widgets/topbar/locale-switcher/index.tsx +++ b/apps/portal-shell/src/widgets/topbar/locale-switcher/index.tsx @@ -1,20 +1,21 @@ -"use client"; +"use client"; /** - * locale-switcher(topbar / top) + * locale-switcher(topbar / top)— P1-4 next-intl 接入 * - * 语言切换器,通过 usePluginStore 读写 locale(zh-CN / en)。 - * 无 GraphQL 查询,纯 UI 状态。 + * 语言切换器,通过 next-intl useLocale() 读取当前 locale, + * 切换时写入 NEXT_LOCALE cookie + router.refresh() 触发 RSC 重新渲染。 * - * 关联:portal-shell spec §5.2.2、M8 验收 + * 关联:portal-shell ARCHITECTURE.md §3.4 V3-A6、§8.7 */ import { useState } from "react"; -import { usePluginStore } from "@/shell/PluginStore"; +import { useRouter } from "next/navigation"; +import { useLocale, useTranslations } from "next-intl"; import type { PluginProps } from "@/lib/types"; const LOCALES = [ - { value: "zh-CN", label: "简体中文" }, - { value: "en", label: "English" }, + { value: "zh-CN", labelKey: "common.locale.zhCN" }, + { value: "en", labelKey: "common.locale.en" }, ] as const; type LocaleValue = (typeof LOCALES)[number]["value"]; @@ -22,12 +23,17 @@ type LocaleValue = (typeof LOCALES)[number]["value"]; export default function LocaleSwitcher( _props: PluginProps, ): React.ReactElement { - const locale = usePluginStore((s) => s.locale); - const setLocale = usePluginStore((s) => s.setLocale); + const locale = useLocale(); + const t = useTranslations(); + const router = useRouter(); const [open, setOpen] = useState(false); const handleSelect = (value: LocaleValue): void => { - setLocale(value); + if (value !== locale) { + // 写入 NEXT_LOCALE cookie,next-intl request.ts 读取此 cookie 决定 locale + document.cookie = `NEXT_LOCALE=${value};path=/;max-age=31536000;samesite=strict`; + router.refresh(); + } setOpen(false); }; @@ -35,7 +41,7 @@ export default function LocaleSwitcher(
))} diff --git a/apps/portal-shell/src/widgets/topbar/locale-switcher/plugin.manifest.ts b/apps/portal-shell/src/widgets/topbar/locale-switcher/plugin.manifest.ts index 26fd4ae..17ab03a 100644 --- a/apps/portal-shell/src/widgets/topbar/locale-switcher/plugin.manifest.ts +++ b/apps/portal-shell/src/widgets/topbar/locale-switcher/plugin.manifest.ts @@ -1,7 +1,7 @@ /** * locale-switcher 插件清单(topbar) * - * 语言切换器,插入 top slot。通过 usePluginStore 读写 locale。 + * 语言切换器,插入 top slot。通过 next-intl useLocale() 读写 locale。 */ import type { PluginManifest } from "@/lib/types"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e89ae29..10d664a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -372,6 +372,9 @@ importers: next: specifier: ^16.0.10 version: 16.2.10(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + next-intl: + specifier: ^4.13.2 + version: 4.13.2(@swc/helpers@0.5.23)(next@16.2.10(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react@19.2.7)(typescript@5.6.2) next-themes: specifier: ^0.4.6 version: 0.4.6(react-dom@19.2.7(react@19.2.7))(react@19.2.7) @@ -402,7 +405,7 @@ importers: devDependencies: '@graphql-codegen/cli': specifier: ^5.0.0 - version: 5.0.0(@types/node@22.20.1)(encoding@0.1.13)(graphql@16.14.2) + version: 5.0.0(@parcel/watcher@2.6.0)(@types/node@22.20.1)(encoding@0.1.13)(graphql@16.14.2) '@graphql-codegen/typescript': specifier: ^4.0.0 version: 4.1.1(graphql@16.14.2) @@ -526,7 +529,7 @@ importers: version: 9.39.5 '@graphql-codegen/cli': specifier: ^5.0.0 - version: 5.0.0(@types/node@22.20.1)(encoding@0.1.13)(graphql@16.14.2) + version: 5.0.0(@parcel/watcher@2.6.0)(@types/node@22.20.1)(encoding@0.1.13)(graphql@16.14.2) '@graphql-codegen/client-preset': specifier: ^4.5.0 version: 4.5.0(graphql@16.14.2) @@ -902,7 +905,7 @@ importers: devDependencies: '@nestjs/cli': specifier: ^10.4.0 - version: 10.4.0(esbuild@0.19.7)(lightningcss@1.32.0) + version: 10.4.0(@swc/core@1.15.46(@swc/helpers@0.5.23))(esbuild@0.19.7)(lightningcss@1.32.0) '@nestjs/schematics': specifier: ^10.2.0 version: 10.2.0(chokidar@3.6.0)(typescript@5.6.2) @@ -1020,7 +1023,7 @@ importers: devDependencies: '@nestjs/cli': specifier: ^10.4.0 - version: 10.4.0(lightningcss@1.32.0) + version: 10.4.0(@swc/core@1.15.46(@swc/helpers@0.5.23))(lightningcss@1.32.0) '@types/express': specifier: ^4.17.0 version: 4.17.25 @@ -1129,7 +1132,7 @@ importers: devDependencies: '@nestjs/cli': specifier: ^10.4.0 - version: 10.4.0(lightningcss@1.32.0) + version: 10.4.0(@swc/core@1.15.46(@swc/helpers@0.5.23))(lightningcss@1.32.0) '@types/express': specifier: ^4.17.0 version: 4.17.25 @@ -1226,7 +1229,7 @@ importers: devDependencies: '@nestjs/cli': specifier: ^10.4.0 - version: 10.4.0(lightningcss@1.32.0) + version: 10.4.0(@swc/core@1.15.46(@swc/helpers@0.5.23))(lightningcss@1.32.0) '@nestjs/schematics': specifier: ^10.2.0 version: 10.2.0(chokidar@3.6.0)(typescript@5.6.2) @@ -1341,7 +1344,7 @@ importers: devDependencies: '@nestjs/cli': specifier: ^10.4.0 - version: 10.4.0(lightningcss@1.32.0) + version: 10.4.0(@swc/core@1.15.46(@swc/helpers@0.5.23))(lightningcss@1.32.0) '@types/bcrypt': specifier: ^5.0.0 version: 5.0.2 @@ -1456,7 +1459,7 @@ importers: devDependencies: '@nestjs/cli': specifier: ^10.4.0 - version: 10.4.0(lightningcss@1.32.0) + version: 10.4.0(@swc/core@1.15.46(@swc/helpers@0.5.23))(lightningcss@1.32.0) '@types/express': specifier: ^4.17.0 version: 4.17.25 @@ -1550,7 +1553,7 @@ importers: devDependencies: '@nestjs/cli': specifier: ^10.4.0 - version: 10.4.0(lightningcss@1.32.0) + version: 10.4.0(@swc/core@1.15.46(@swc/helpers@0.5.23))(lightningcss@1.32.0) '@types/express': specifier: ^4.17.0 version: 4.17.25 @@ -1650,7 +1653,7 @@ importers: devDependencies: '@nestjs/cli': specifier: ^10.4.0 - version: 10.4.0(lightningcss@1.32.0) + version: 10.4.0(@swc/core@1.15.46(@swc/helpers@0.5.23))(lightningcss@1.32.0) '@types/express': specifier: ^4.17.0 version: 4.17.25 @@ -1735,7 +1738,7 @@ importers: devDependencies: '@nestjs/cli': specifier: ^10.4.0 - version: 10.4.0(lightningcss@1.32.0) + version: 10.4.0(@swc/core@1.15.46(@swc/helpers@0.5.23))(lightningcss@1.32.0) '@types/express': specifier: ^4.17.0 version: 4.17.25 @@ -2680,15 +2683,27 @@ packages: '@formatjs/fast-memoize@2.2.0': resolution: {integrity: sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==} + '@formatjs/fast-memoize@3.1.7': + resolution: {integrity: sha512-zXfhLpvA6T7+efdt9JLbBwZ00tT7NsBMDVnDu8rpHeNNv8KfRZAMo2gkG0k9lK/Nzc//3kJ9pImsfuJxk3KhUA==} + '@formatjs/icu-messageformat-parser@2.7.8': resolution: {integrity: sha512-nBZJYmhpcSX0WeJ5SDYUkZ42AgR3xiyhNCsQweFx3cz/ULJjym8bHAzWKvG5e2+1XO98dBYC0fWeeAECAVSwLA==} + '@formatjs/icu-messageformat-parser@3.5.15': + resolution: {integrity: sha512-5o4grXKotAB3JqQuisLApHG43g17N+paoRTa92Jiz35Zvfemq0cVf4EDvuxyHAzmsJji7igaEowicLO/VmfJ8Q==} + '@formatjs/icu-skeleton-parser@1.8.2': resolution: {integrity: sha512-k4ERKgw7aKGWJZgTarIcNEmvyTVD9FYh0mTrrBMHZ1b8hUu6iOJ4SzsZlo3UNAvHYa+PnvntIwRPt1/vy4nA9Q==} + '@formatjs/icu-skeleton-parser@2.1.11': + resolution: {integrity: sha512-j8cUmOJzVgkHuS0QiQ6ga76UIoLOFSAMWhs7aZJztH3aAdCOAE6vpC8KVvFB4cU10ON0y2/5oOVmPJ43s2lTwA==} + '@formatjs/intl-localematcher@0.5.4': resolution: {integrity: sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g==} + '@formatjs/intl-localematcher@0.8.13': + resolution: {integrity: sha512-kHEAFOkeJSPNi7c5PaKaRjxcBrJwzzt81ifUu+8uve1EDW/VJl83KsxmqgqNZLzcFEhSliZGvx3+pk/RH0IOmg==} + '@graphql-codegen/add@5.0.3': resolution: {integrity: sha512-SxXPmramkth8XtBlAHu4H4jYcYXM/o3p01+psU+0NADQowA8jtYkK6MW5rV6T+CxkEaNZItfSmZRPgIuypcqnA==} peerDependencies: @@ -5158,6 +5173,88 @@ packages: '@paralleldrive/cuid2@2.2.2': resolution: {integrity: sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==} + '@parcel/watcher-android-arm64@2.6.0': + resolution: {integrity: sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.6.0': + resolution: {integrity: sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.6.0': + resolution: {integrity: sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.6.0': + resolution: {integrity: sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.6.0': + resolution: {integrity: sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm-musl@2.6.0': + resolution: {integrity: sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-arm64-glibc@2.6.0': + resolution: {integrity: sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm64-musl@2.6.0': + resolution: {integrity: sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-x64-glibc@2.6.0': + resolution: {integrity: sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-x64-musl@2.6.0': + resolution: {integrity: sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@parcel/watcher-win32-arm64@2.6.0': + resolution: {integrity: sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-x64@2.6.0': + resolution: {integrity: sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.6.0': + resolution: {integrity: sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==} + engines: {node: '>= 10.0.0'} + '@peculiar/asn1-schema@2.8.0': resolution: {integrity: sha512-7YT0U/ze0tF2QOBbE15gKZwy5tvgGyLRiRHLzhlbOpf7BT032oBSd0haZqXn5W6l26WLlu3dyxzjM+2638/z2Q==} @@ -5861,6 +5958,9 @@ packages: '@swc/helpers': optional: true + '@schummar/icu-type-parser@1.21.5': + resolution: {integrity: sha512-bXHSaW5jRTmke9Vd0h5P7BtWZG9Znqb8gSDxZnxaGSJnGwPLDPfS+3g0BKzeWqzgZPsIVZkM7m2tbo18cm5HBw==} + '@sentry-internal/browser-utils@8.55.2': resolution: {integrity: sha512-GnKod+gL/Y+1FUM/RGV8q6le1CoyiGbT40MitEK7eVwWe+bfTRq1gN7ioupyHFMUg1RlQkDQ4/sENmio/uow5A==} engines: {node: '>=14.18'} @@ -5983,6 +6083,93 @@ packages: '@sqltools/formatter@1.2.5': resolution: {integrity: sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==} + '@swc/core-darwin-arm64@1.15.46': + resolution: {integrity: sha512-IsISIT22EfktVJrlvIpnAxG2u/A9aob9l99HMlx80x72WlFmFPk1V3UhkEzx86eJP8hw049KTFv/RISho2cq2Q==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + + '@swc/core-darwin-x64@1.15.46': + resolution: {integrity: sha512-4Tj4ppVIPCmUMpmGFiGtyEriwLyJ+yi/US4WfBrP/ok8COGddDZXLEzQETnKyK46mjvr1v0jevrS23zjoff7vA==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + + '@swc/core-linux-arm-gnueabihf@1.15.46': + resolution: {integrity: sha512-i8tUGnNjyOgMmfmgFSg4aeJLQoFyfpIHK5FjpQAwpRyQIqEUB2w1e8zIDQzY1WhOxx8NoS1S5iUL813Un4Sf5A==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + + '@swc/core-linux-arm64-gnu@1.15.46': + resolution: {integrity: sha512-c0OnhqzdhfOvv6qhNCcByepB+sNYOGZyhtr2Qa6ZCHvAWTYhSRw4j/u92Stue9PbZ/6q74b9nHzi76+kVzqQHQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@swc/core-linux-arm64-musl@1.15.46': + resolution: {integrity: sha512-imyRpNEcUzFQFV2LE4jL68ErvmKEuZCbvZru77iQREunJ+bR4i658cupTgtG1mLYM3F1Tzy3Sb9xYb02KghWTg==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@swc/core-linux-ppc64-gnu@1.15.46': + resolution: {integrity: sha512-ctEfcl/HcUeomK33cbySiHZm98GEDIxTm1EkpBsYCiHxElYBzvTXVeuQT2YwbUXn9XCrjiw4ipyUNk33k26qRg==} + engines: {node: '>=10'} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@swc/core-linux-s390x-gnu@1.15.46': + resolution: {integrity: sha512-DxlMdnt84TtRVTv7WL/thWyz9+QU8QZNNoAP9rrk0P68LziuhfePp8MjQ44zIprpTHTsEwyziIuGUUN5iSC1bQ==} + engines: {node: '>=10'} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@swc/core-linux-x64-gnu@1.15.46': + resolution: {integrity: sha512-SKxI7J6t90XPl8hRUqtJi9NfGdunN/E/vZMc7Bc0figeRdOPDBT+Tm8g7cx9xM0T0mewh2l+8dewa3Am27/P+A==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@swc/core-linux-x64-musl@1.15.46': + resolution: {integrity: sha512-qj9T6B7bosI0VEsrWOVXZN1OXxS8Tp63ywyrLxNdOycnUtLdkgYcoBsN5y8ImnDDsnwrEWZOy1e+J4xSe7mA3Q==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@swc/core-win32-arm64-msvc@1.15.46': + resolution: {integrity: sha512-8p7l4c3LU+eA5g9Et1JPhNeMC1oQwXTGU+uah8DPIBX7YXzqswvaBtyKVmXefVGi/DJU1x3YJsc3mbAp9aWzSQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@swc/core-win32-ia32-msvc@1.15.46': + resolution: {integrity: sha512-tUEnfr3Bn9u6FOjUb3PN9p+09qZC2j+wNDLKHzXXZn22rqGcUqR/ohCRSS+nG9B9+X+U+3FewNEHJkTmdIvMjQ==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + + '@swc/core-win32-x64-msvc@1.15.46': + resolution: {integrity: sha512-Vux7UDzBJYQggSuPfcl2w9iu+IJpgpRCxHzgCaVkELnAXAE4XZMOTX9HNcaNiwfeIDqdu2rkr69RuDm6wY8neA==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@swc/core@1.15.46': + resolution: {integrity: sha512-Ri3em2mBpq3h2zSPliCYl63otDGqek8PPEfv2nWgRQEbZ/VBCNyypVTVQ6cEbTCXBhy+WE2T3fQb08moIyuYaw==} + engines: {node: '>=10'} + peerDependencies: + '@swc/helpers': '>=0.5.17' + peerDependenciesMeta: + '@swc/helpers': + optional: true + '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} @@ -5995,6 +6182,9 @@ packages: '@swc/helpers@0.5.5': resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} + '@swc/types@0.1.27': + resolution: {integrity: sha512-K6h3iUlqeM946U4sXFYeahefR1YBbXJvko+hv8WS8/0BNJ4OHiHRywMnQUJCqkR7Y9+hqQ1TvEpiKqUhz7NEFg==} + '@tailwindcss/node@4.3.2': resolution: {integrity: sha512-yWP/sqEcBLaD8JuA6zNwxoYKr75qxTioYwlRwekj5Jr/I5GXnoJfjetH/psLUIv74cYTH2lBUEzBkinthoYcBg==} @@ -8547,6 +8737,9 @@ packages: resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==} engines: {node: '>=0.10.0'} + icu-minify@4.13.2: + resolution: {integrity: sha512-XhYQTEnBXBCyF6ERiwItFweoOXDUciujaGjIWCA7RhOCEPDfhVSTtuwfRq6HdVk7tKnYJh+yaurP96zGnaKsPg==} + idb-keyval@6.3.0: resolution: {integrity: sha512-um+2dgAWmYsu615EXpWVwSmapJhON0G43t3Ka/EVaohzPQXSMqKEqeDK/oIW3Ow+BXaF2PvSc+oBTFp793A5Ow==} @@ -8653,6 +8846,9 @@ packages: intl-messageformat@10.5.14: resolution: {integrity: sha512-IjC6sI0X7YRjjyVH9aUgdftcmZK7WXdHeil4KwbjDnRWjnVitKpAx3rr6t6di1joFp5188VqKcobOPA6mCLG/w==} + intl-messageformat@11.2.12: + resolution: {integrity: sha512-KW70Xxfcvy7vV3qODfvShWkFDPMqKDAa4N+hSyVBWGNtVhTUFYaqlD/l88DaYPKiVcPP4rPQ3qnH7i5K82Mg7g==} + invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} @@ -9552,6 +9748,10 @@ packages: resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} engines: {node: '>= 0.6'} + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} @@ -9564,12 +9764,25 @@ packages: neo4j-driver@5.28.3: resolution: {integrity: sha512-k7c0wEh3HoONv1v5AyLp9/BDAbYHJhz2TZvzWstSEU3g3suQcXmKEaYBfrK2UMzxcy3bCT0DrnfRbzsOW5G/Ag==} + next-intl-swc-plugin-extractor@4.13.2: + resolution: {integrity: sha512-O30N/Y4ifzRe5Sz80jD1Qkg4VY6Zfef4SbHNNE166QkHswBf3/Kygpdd1X52sUUwTCk6uvdisO8ybfAN/VYJHQ==} + next-intl@3.20.0: resolution: {integrity: sha512-0bCZcc38HfAZk/T+PNNcnJZknC+caS5rBK+WYRd1HsOL5O6puEu2H3kya8oT9s8piHjrTf7P0UHeahOFleOnrw==} peerDependencies: next: ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 + next-intl@4.13.2: + resolution: {integrity: sha512-iCYycEP7/PE+1ue4MWBuz1qns6ESA+SGzuXxNMNN1qiYUh2fLhJPiZvHW1zZC7zMTn44aJUglOVZxUb1+hUz6g==} + peerDependencies: + next: ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + next-themes@0.4.6: resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==} peerDependencies: @@ -9628,6 +9841,9 @@ packages: node-addon-api@5.0.0: resolution: {integrity: sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA==} + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} @@ -9969,6 +10185,9 @@ packages: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} + po-parser@2.1.1: + resolution: {integrity: sha512-ECF4zHLbUItpUgE3OTtLKlPjeBN+fKEczj2zYjDfCGOzicNs0GK3Vg2IoAYwx7LH/XYw43fZQP6xnZ4TkNxSLQ==} + possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} @@ -11463,6 +11682,11 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 + use-intl@4.13.2: + resolution: {integrity: sha512-p6/gCromeBoec+wEuOIkPaytH77RBjW94KWv8MRsNrbI4UOx8QgwNhgl9lbPOKM/b0dpanLhCYztLEH5yQUjtg==} + peerDependencies: + react: ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0 + use-sidecar@1.1.3: resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} engines: {node: '>=10'} @@ -12775,28 +12999,40 @@ snapshots: dependencies: tslib: 2.8.1 + '@formatjs/fast-memoize@3.1.7': {} + '@formatjs/icu-messageformat-parser@2.7.8': dependencies: '@formatjs/ecma402-abstract': 2.0.0 '@formatjs/icu-skeleton-parser': 1.8.2 tslib: 2.8.1 + '@formatjs/icu-messageformat-parser@3.5.15': + dependencies: + '@formatjs/icu-skeleton-parser': 2.1.11 + '@formatjs/icu-skeleton-parser@1.8.2': dependencies: '@formatjs/ecma402-abstract': 2.0.0 tslib: 2.8.1 + '@formatjs/icu-skeleton-parser@2.1.11': {} + '@formatjs/intl-localematcher@0.5.4': dependencies: tslib: 2.8.1 + '@formatjs/intl-localematcher@0.8.13': + dependencies: + '@formatjs/fast-memoize': 3.1.7 + '@graphql-codegen/add@5.0.3(graphql@16.14.2)': dependencies: '@graphql-codegen/plugin-helpers': 5.1.0(graphql@16.14.2) graphql: 16.14.2 tslib: 2.6.3 - '@graphql-codegen/cli@5.0.0(@types/node@22.20.1)(encoding@0.1.13)(graphql@16.14.2)': + '@graphql-codegen/cli@5.0.0(@parcel/watcher@2.6.0)(@types/node@22.20.1)(encoding@0.1.13)(graphql@16.14.2)': dependencies: '@babel/generator': 7.29.7 '@babel/template': 7.29.7 @@ -12833,6 +13069,8 @@ snapshots: tslib: 2.8.1 yaml: 2.9.0 yargs: 17.7.3 + optionalDependencies: + '@parcel/watcher': 2.6.0 transitivePeerDependencies: - '@fastify/websocket' - '@types/node' @@ -13924,7 +14162,7 @@ snapshots: optionalDependencies: '@apollo/subgraph': 2.14.2(graphql@16.14.2) - '@nestjs/cli@10.4.0(esbuild@0.19.7)(lightningcss@1.32.0)': + '@nestjs/cli@10.4.0(@swc/core@1.15.46(@swc/helpers@0.5.23))(esbuild@0.19.7)(lightningcss@1.32.0)': dependencies: '@angular-devkit/core': 17.3.8(chokidar@3.6.0) '@angular-devkit/schematics': 17.3.8(chokidar@3.6.0) @@ -13934,7 +14172,7 @@ snapshots: chokidar: 3.6.0 cli-table3: 0.6.5 commander: 4.1.1 - fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.3.3)(webpack@5.92.1(esbuild@0.19.7)(lightningcss@1.32.0)) + fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.3.3)(webpack@5.92.1(@swc/core@1.15.46(@swc/helpers@0.5.23))(esbuild@0.19.7)(lightningcss@1.32.0)) glob: 10.4.2 inquirer: 8.2.6 node-emoji: 1.11.0 @@ -13944,8 +14182,10 @@ snapshots: tsconfig-paths: 4.2.0 tsconfig-paths-webpack-plugin: 4.1.0 typescript: 5.3.3 - webpack: 5.92.1(esbuild@0.19.7)(lightningcss@1.32.0) + webpack: 5.92.1(@swc/core@1.15.46(@swc/helpers@0.5.23))(esbuild@0.19.7)(lightningcss@1.32.0) webpack-node-externals: 3.0.0 + optionalDependencies: + '@swc/core': 1.15.46(@swc/helpers@0.5.23) transitivePeerDependencies: - '@minify-html/node' - '@swc/css' @@ -13960,7 +14200,7 @@ snapshots: - uglify-js - webpack-cli - '@nestjs/cli@10.4.0(lightningcss@1.32.0)': + '@nestjs/cli@10.4.0(@swc/core@1.15.46(@swc/helpers@0.5.23))(lightningcss@1.32.0)': dependencies: '@angular-devkit/core': 17.3.8(chokidar@3.6.0) '@angular-devkit/schematics': 17.3.8(chokidar@3.6.0) @@ -13970,7 +14210,7 @@ snapshots: chokidar: 3.6.0 cli-table3: 0.6.5 commander: 4.1.1 - fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.3.3)(webpack@5.92.1(lightningcss@1.32.0)) + fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.3.3)(webpack@5.92.1(@swc/core@1.15.46(@swc/helpers@0.5.23))(lightningcss@1.32.0)) glob: 10.4.2 inquirer: 8.2.6 node-emoji: 1.11.0 @@ -13980,8 +14220,10 @@ snapshots: tsconfig-paths: 4.2.0 tsconfig-paths-webpack-plugin: 4.1.0 typescript: 5.3.3 - webpack: 5.92.1(lightningcss@1.32.0) + webpack: 5.92.1(@swc/core@1.15.46(@swc/helpers@0.5.23))(lightningcss@1.32.0) webpack-node-externals: 3.0.0 + optionalDependencies: + '@swc/core': 1.15.46(@swc/helpers@0.5.23) transitivePeerDependencies: - '@minify-html/node' - '@swc/css' @@ -16130,6 +16372,62 @@ snapshots: dependencies: '@noble/hashes': 1.1.5 + '@parcel/watcher-android-arm64@2.6.0': + optional: true + + '@parcel/watcher-darwin-arm64@2.6.0': + optional: true + + '@parcel/watcher-darwin-x64@2.6.0': + optional: true + + '@parcel/watcher-freebsd-x64@2.6.0': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.6.0': + optional: true + + '@parcel/watcher-linux-arm-musl@2.6.0': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.6.0': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.6.0': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.6.0': + optional: true + + '@parcel/watcher-linux-x64-musl@2.6.0': + optional: true + + '@parcel/watcher-win32-arm64@2.6.0': + optional: true + + '@parcel/watcher-win32-x64@2.6.0': + optional: true + + '@parcel/watcher@2.6.0': + dependencies: + detect-libc: 2.1.2 + is-glob: 4.0.3 + node-addon-api: 7.1.1 + picomatch: 4.0.5 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.6.0 + '@parcel/watcher-darwin-arm64': 2.6.0 + '@parcel/watcher-darwin-x64': 2.6.0 + '@parcel/watcher-freebsd-x64': 2.6.0 + '@parcel/watcher-linux-arm-glibc': 2.6.0 + '@parcel/watcher-linux-arm-musl': 2.6.0 + '@parcel/watcher-linux-arm64-glibc': 2.6.0 + '@parcel/watcher-linux-arm64-musl': 2.6.0 + '@parcel/watcher-linux-x64-glibc': 2.6.0 + '@parcel/watcher-linux-x64-musl': 2.6.0 + '@parcel/watcher-win32-arm64': 2.6.0 + '@parcel/watcher-win32-x64': 2.6.0 + '@peculiar/asn1-schema@2.8.0': dependencies: '@peculiar/utils': 2.0.3 @@ -16743,6 +17041,8 @@ snapshots: '@module-federation/runtime-tools': 2.7.0 '@swc/helpers': 0.5.23 + '@schummar/icu-type-parser@1.21.5': {} + '@sentry-internal/browser-utils@8.55.2': dependencies: '@sentry/core': 8.55.2 @@ -16970,6 +17270,61 @@ snapshots: '@sqltools/formatter@1.2.5': {} + '@swc/core-darwin-arm64@1.15.46': + optional: true + + '@swc/core-darwin-x64@1.15.46': + optional: true + + '@swc/core-linux-arm-gnueabihf@1.15.46': + optional: true + + '@swc/core-linux-arm64-gnu@1.15.46': + optional: true + + '@swc/core-linux-arm64-musl@1.15.46': + optional: true + + '@swc/core-linux-ppc64-gnu@1.15.46': + optional: true + + '@swc/core-linux-s390x-gnu@1.15.46': + optional: true + + '@swc/core-linux-x64-gnu@1.15.46': + optional: true + + '@swc/core-linux-x64-musl@1.15.46': + optional: true + + '@swc/core-win32-arm64-msvc@1.15.46': + optional: true + + '@swc/core-win32-ia32-msvc@1.15.46': + optional: true + + '@swc/core-win32-x64-msvc@1.15.46': + optional: true + + '@swc/core@1.15.46(@swc/helpers@0.5.23)': + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.27 + optionalDependencies: + '@swc/core-darwin-arm64': 1.15.46 + '@swc/core-darwin-x64': 1.15.46 + '@swc/core-linux-arm-gnueabihf': 1.15.46 + '@swc/core-linux-arm64-gnu': 1.15.46 + '@swc/core-linux-arm64-musl': 1.15.46 + '@swc/core-linux-ppc64-gnu': 1.15.46 + '@swc/core-linux-s390x-gnu': 1.15.46 + '@swc/core-linux-x64-gnu': 1.15.46 + '@swc/core-linux-x64-musl': 1.15.46 + '@swc/core-win32-arm64-msvc': 1.15.46 + '@swc/core-win32-ia32-msvc': 1.15.46 + '@swc/core-win32-x64-msvc': 1.15.46 + '@swc/helpers': 0.5.23 + '@swc/counter@0.1.3': {} '@swc/helpers@0.5.15': @@ -16985,6 +17340,10 @@ snapshots: '@swc/counter': 0.1.3 tslib: 2.8.1 + '@swc/types@0.1.27': + dependencies: + '@swc/counter': 0.1.3 + '@tailwindcss/node@4.3.2': dependencies: '@jridgewell/remapping': 2.3.5 @@ -19452,7 +19811,7 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - fork-ts-checker-webpack-plugin@9.0.2(typescript@5.3.3)(webpack@5.92.1(esbuild@0.19.7)(lightningcss@1.32.0)): + fork-ts-checker-webpack-plugin@9.0.2(typescript@5.3.3)(webpack@5.92.1(@swc/core@1.15.46(@swc/helpers@0.5.23))(esbuild@0.19.7)(lightningcss@1.32.0)): dependencies: '@babel/code-frame': 7.29.7 chalk: 4.1.2 @@ -19467,9 +19826,9 @@ snapshots: semver: 7.8.5 tapable: 2.3.3 typescript: 5.3.3 - webpack: 5.92.1(esbuild@0.19.7)(lightningcss@1.32.0) + webpack: 5.92.1(@swc/core@1.15.46(@swc/helpers@0.5.23))(esbuild@0.19.7)(lightningcss@1.32.0) - fork-ts-checker-webpack-plugin@9.0.2(typescript@5.3.3)(webpack@5.92.1(lightningcss@1.32.0)): + fork-ts-checker-webpack-plugin@9.0.2(typescript@5.3.3)(webpack@5.92.1(@swc/core@1.15.46(@swc/helpers@0.5.23))(lightningcss@1.32.0)): dependencies: '@babel/code-frame': 7.29.7 chalk: 4.1.2 @@ -19484,7 +19843,7 @@ snapshots: semver: 7.8.5 tapable: 2.3.3 typescript: 5.3.3 - webpack: 5.92.1(lightningcss@1.32.0) + webpack: 5.92.1(@swc/core@1.15.46(@swc/helpers@0.5.23))(lightningcss@1.32.0) form-data@4.0.6: dependencies: @@ -19926,6 +20285,10 @@ snapshots: dependencies: safer-buffer: 2.1.2 + icu-minify@4.13.2: + dependencies: + '@formatjs/icu-messageformat-parser': 3.5.15 + idb-keyval@6.3.0: {} ieee754@1.2.1: {} @@ -20071,6 +20434,11 @@ snapshots: '@formatjs/icu-messageformat-parser': 2.7.8 tslib: 2.8.1 + intl-messageformat@11.2.12: + dependencies: + '@formatjs/fast-memoize': 3.1.7 + '@formatjs/icu-messageformat-parser': 3.5.15 + invariant@2.2.4: dependencies: loose-envify: 1.4.0 @@ -20908,6 +21276,8 @@ snapshots: negotiator@0.6.4: {} + negotiator@1.0.0: {} + neo-async@2.6.2: {} neo4j-driver-bolt-connection@5.28.3: @@ -20924,6 +21294,8 @@ snapshots: neo4j-driver-core: 5.28.3 rxjs: 7.8.2 + next-intl-swc-plugin-extractor@4.13.2: {} + next-intl@3.20.0(next@14.2.35(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(react-dom@18.3.0(react@18.3.0))(react@18.3.0))(react@18.3.0): dependencies: '@formatjs/intl-localematcher': 0.5.4 @@ -20932,6 +21304,23 @@ snapshots: react: 18.3.0 use-intl: 3.20.0(react@18.3.0) + next-intl@4.13.2(@swc/helpers@0.5.23)(next@16.2.10(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react@19.2.7)(typescript@5.6.2): + dependencies: + '@formatjs/intl-localematcher': 0.8.13 + '@parcel/watcher': 2.6.0 + '@swc/core': 1.15.46(@swc/helpers@0.5.23) + icu-minify: 4.13.2 + negotiator: 1.0.0 + next: 16.2.10(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.61.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + next-intl-swc-plugin-extractor: 4.13.2 + po-parser: 2.1.1 + react: 19.2.7 + use-intl: 4.13.2(react@19.2.7) + optionalDependencies: + typescript: 5.6.2 + transitivePeerDependencies: + - '@swc/helpers' + next-themes@0.4.6(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: react: 19.2.7 @@ -21003,6 +21392,8 @@ snapshots: node-addon-api@5.0.0: {} + node-addon-api@7.1.1: {} + node-domexception@1.0.0: {} node-emoji@1.11.0: @@ -21357,6 +21748,8 @@ snapshots: pluralize@8.0.0: {} + po-parser@2.1.1: {} + possible-typed-array-names@1.1.0: {} postcss-import@15.1.0(postcss@8.5.18): @@ -22568,17 +22961,29 @@ snapshots: - bare-abort-controller - react-native-b4a - terser-webpack-plugin@5.6.1(esbuild@0.19.7)(lightningcss@1.32.0)(webpack@5.92.1(esbuild@0.19.7)(lightningcss@1.32.0)): + terser-webpack-plugin@5.6.1(@swc/core@1.15.46(@swc/helpers@0.5.23))(esbuild@0.19.7)(lightningcss@1.32.0)(webpack@5.92.1(@swc/core@1.15.46(@swc/helpers@0.5.23))(esbuild@0.19.7)(lightningcss@1.32.0)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.4.5 schema-utils: 4.3.3 terser: 5.49.0 - webpack: 5.92.1(esbuild@0.19.7)(lightningcss@1.32.0) + webpack: 5.92.1(@swc/core@1.15.46(@swc/helpers@0.5.23))(esbuild@0.19.7)(lightningcss@1.32.0) optionalDependencies: + '@swc/core': 1.15.46(@swc/helpers@0.5.23) esbuild: 0.19.7 lightningcss: 1.32.0 + terser-webpack-plugin@5.6.1(@swc/core@1.15.46(@swc/helpers@0.5.23))(lightningcss@1.32.0)(webpack@5.92.1(@swc/core@1.15.46(@swc/helpers@0.5.23))(lightningcss@1.32.0)): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + jest-worker: 27.4.5 + schema-utils: 4.3.3 + terser: 5.49.0 + webpack: 5.92.1(@swc/core@1.15.46(@swc/helpers@0.5.23))(lightningcss@1.32.0) + optionalDependencies: + '@swc/core': 1.15.46(@swc/helpers@0.5.23) + lightningcss: 1.32.0 + terser-webpack-plugin@5.6.1(lightningcss@1.32.0)(postcss@8.5.18)(webpack@5.92.1(lightningcss@1.32.0)(postcss@8.5.18)): dependencies: '@jridgewell/trace-mapping': 0.3.31 @@ -22590,16 +22995,6 @@ snapshots: lightningcss: 1.32.0 postcss: 8.5.18 - terser-webpack-plugin@5.6.1(lightningcss@1.32.0)(webpack@5.92.1(lightningcss@1.32.0)): - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - jest-worker: 27.4.5 - schema-utils: 4.3.3 - terser: 5.49.0 - webpack: 5.92.1(lightningcss@1.32.0) - optionalDependencies: - lightningcss: 1.32.0 - terser@5.49.0: dependencies: '@jridgewell/source-map': 0.3.11 @@ -22993,6 +23388,14 @@ snapshots: intl-messageformat: 10.5.14 react: 18.3.0 + use-intl@4.13.2(react@19.2.7): + dependencies: + '@formatjs/fast-memoize': 3.1.7 + '@schummar/icu-type-parser': 1.21.5 + icu-minify: 4.13.2 + intl-messageformat: 11.2.12 + react: 19.2.7 + use-sidecar@1.1.3(@types/react@19.2.17)(react@19.2.7): dependencies: detect-node-es: 1.1.0 @@ -23166,7 +23569,7 @@ snapshots: webpack-virtual-modules@0.5.0: {} - webpack@5.92.1(esbuild@0.19.7)(lightningcss@1.32.0): + webpack@5.92.1(@swc/core@1.15.46(@swc/helpers@0.5.23))(esbuild@0.19.7)(lightningcss@1.32.0): dependencies: '@types/eslint-scope': 3.7.3 '@types/estree': 1.0.9 @@ -23189,7 +23592,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.3.3 - terser-webpack-plugin: 5.6.1(esbuild@0.19.7)(lightningcss@1.32.0)(webpack@5.92.1(esbuild@0.19.7)(lightningcss@1.32.0)) + terser-webpack-plugin: 5.6.1(@swc/core@1.15.46(@swc/helpers@0.5.23))(esbuild@0.19.7)(lightningcss@1.32.0)(webpack@5.92.1(@swc/core@1.15.46(@swc/helpers@0.5.23))(esbuild@0.19.7)(lightningcss@1.32.0)) watchpack: 2.5.2 webpack-sources: 3.5.1 transitivePeerDependencies: @@ -23206,7 +23609,7 @@ snapshots: - postcss - uglify-js - webpack@5.92.1(lightningcss@1.32.0): + webpack@5.92.1(@swc/core@1.15.46(@swc/helpers@0.5.23))(lightningcss@1.32.0): dependencies: '@types/eslint-scope': 3.7.3 '@types/estree': 1.0.9 @@ -23229,7 +23632,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.3.3 - terser-webpack-plugin: 5.6.1(lightningcss@1.32.0)(webpack@5.92.1(lightningcss@1.32.0)) + terser-webpack-plugin: 5.6.1(@swc/core@1.15.46(@swc/helpers@0.5.23))(lightningcss@1.32.0)(webpack@5.92.1(@swc/core@1.15.46(@swc/helpers@0.5.23))(lightningcss@1.32.0)) watchpack: 2.5.2 webpack-sources: 3.5.1 transitivePeerDependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index a5821f8..e40f40c 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -9,6 +9,7 @@ allowBuilds: '@apollo/protobufjs': false '@module-federation/nextjs-mf': true '@nestjs/core': true + '@parcel/watcher': set this to true or false '@sentry/cli': true '@swc/core': true bcrypt: true