# @shwfed/nuxt

阅读下面的资料以确保你理解这个项目

- [Nuxt Directory Structure](https://nuxt.com/docs/4.x/directory-structure)
- [Nuxt Module Author Guide](https://nuxt.com/docs/4.x/guide/modules/getting-started)
- [Google CEL](https://cel.dev)
- [Effect](https://effect.website)
- [Reka UI](https://reka-ui.com)
- [shadcn](https://ui.shadcn.com)
- [VueUse](https://vueuse.org)
- [shadcn-vue](https://www.shadcn-vue.com)
- [Vue](https://vuejs.org)
- [Unovis](https://unovis.dev)

## 目录结构

参考 Nuxt Module 规范，暴露接口查看 `module.ts`。

## Block 模式

- 宿主（如 `table` 列、`actions` 按钮）通过在 `<host>/<kind>/<compatibilityDate>/<type>/` 下放置包含 `schema.ts`、`config.vue`、`runtime.vue` 的文件夹来扩展。
- 区分字段为 **`type`**（列和按钮统一），版本通过 **`compatibilityDate`** 管理。
- 同目录下的 `utils/resolve.ts` 使用 eager `import.meta.glob` 构建注册表；若模块的 `type` 或 `compatibilityDate` 与文件夹名不匹配，模块加载时会抛错。
- 调用处保留领域命名——`Column`、`Button`、`findColumn`、`findButton`、`COLUMNS`、`BUTTONS`。"Block" 仅作为该模式的名称。
- 新增时请严格照搬现有目录结构。

## 双轴测试

- **Per-folder 测试**（`schema.test.ts`、`config.test.ts`、`runtime.test.ts`）与实现代码放在同一目录。
  - 直接 `import ./schema` 和 SFC；通过 `vi.mock` 打桩 `#app`、`injectCELContext`、以及宿主 UI 原子组件。
  - 禁止触达 `utils/resolve.ts`——`import.meta.glob` 和 Nuxt 不在测试范围内。
  - 使用纯 `vitest` + `@vue/test-utils`。
  - 由于 config/runtime SFC 会间接 import `actions/schema.ts`（后者会 import `utils/resolve`），通常也需要 `vi.mock('../../../schema', …)` 切断这条依赖链。
  - `#app` 在 `vitest.config.mjs` 中被 alias 到 `test/stubs/nuxt-app.ts`；需要 `useNuxtApp` 时在单个测试中用 `vi.mock('#app', …)` 覆盖。
- **集成测试**位于 `test/` 目录，使用 `@nuxt/test-utils` 搭配 `test/fixtures/<surface>/` 下的 fixture。每个宿主一个 fixture——不要把多个宿主塞进同一个大 fixture。
- 被要求为列/按钮加测试时，默认选 per-folder。只有测试宿主接线（配置翻译、贡献合并、端到端交互）时才使用 `test/`。
