|
| 1 | +# AGENTS.md |
| 2 | + |
| 3 | +## 目标与边界 |
| 4 | + |
| 5 | +- 这是一个 `pnpm` monorepo,核心包是 `packages/unplugin-dts`,兼容包是 `packages/vite-plugin-dts`。 |
| 6 | +- `unplugin-dts` 是声明文件生成逻辑的唯一事实来源;`vite-plugin-dts` 只是对 `unplugin-dts/vite` 的兼容导出,不应发展出独立行为。 |
| 7 | +- 仓库的核心目标是:在 `Vite / Rollup / Rolldown / Webpack / Rspack / Esbuild` 下稳定生成 `.d.ts`,并正确处理多入口、别名、`bundleTypes`、Vue/Svelte/JSON、以及跨平台路径。 |
| 8 | + |
| 9 | +## 仓库速览 |
| 10 | + |
| 11 | +- `packages/unplugin-dts/src/index.ts` |
| 12 | + 暴露 `createUnplugin(pluginFactory)` 的主入口。 |
| 13 | +- `packages/unplugin-dts/src/plugin.ts` |
| 14 | + 适配各构建器生命周期,收集 entry / alias / outDir,并驱动 `Runtime`。 |
| 15 | +- `packages/unplugin-dts/src/core/runtime.ts` |
| 16 | + 核心流水线:解析 tsconfig、创建 TS Program、筛选文件、执行 emit、写出声明、处理多 outDir、插入类型入口、可选调用 API Extractor。 |
| 17 | +- `packages/unplugin-dts/src/core/transform.ts` |
| 18 | + 声明文件后处理:alias 改写、动态 `import()` 类型静态化、清理纯导入、清理 `.vue.d.ts` 文件名。 |
| 19 | +- `packages/unplugin-dts/src/core/processor/*` |
| 20 | + Program 创建策略。`vue.ts` 通过 `@vue/language-core` / `@volar/typescript` 处理 Vue SFC。 |
| 21 | +- `packages/unplugin-dts/src/core/resolvers/*` |
| 22 | + 非标准源码入口的 resolver,如 `json`、`vue`、`svelte`。 |
| 23 | +- `packages/unplugin-dts/tests/*.spec.ts` |
| 24 | + 单元测试,重点覆盖路径、alias、transform 和 utils。 |
| 25 | +- `packages/vite-plugin-dts/src/index.ts` |
| 26 | + 兼容层,只做 re-export。 |
| 27 | +- `examples/*` |
| 28 | + 各构建器/框架的集成夹具,不是业务示例应用。它们承担回归验证职责。 |
| 29 | +- `scripts/*` |
| 30 | + 构建、发布、发版脚本。默认不要运行发布流程,除非用户明确要求。 |
| 31 | + |
| 32 | +## 生成物规则 |
| 33 | + |
| 34 | +- 不要手改任何生成物: |
| 35 | + - `packages/*/dist` |
| 36 | + - `examples/*/dist` |
| 37 | + - `examples/*/types` |
| 38 | + - `examples/*/docs/*.api.json` |
| 39 | +- 这些目录只能通过构建命令重建。功能变更应修改 `src/`、测试或示例源码,而不是直接修补产物。 |
| 40 | + |
| 41 | +## 开发原则 |
| 42 | + |
| 43 | +- 一切工作从仓库根目录执行,统一使用 `pnpm`。 |
| 44 | +- 优先用定向命令,避免无差别跑全仓: |
| 45 | + - `pnpm --filter unplugin-dts test` |
| 46 | + - `pnpm -C examples/ts-vite build` |
| 47 | + - `pnpm -C examples/vue-vite build` |
| 48 | +- 涉及共享行为时,把逻辑放进 `packages/unplugin-dts/src/plugin.ts` 或 `packages/unplugin-dts/src/core/*`,不要在每个 bundler 入口里重复实现。 |
| 49 | +- `packages/vite-plugin-dts` 必须保持“薄封装”;任何行为修改都应先落在 `unplugin-dts`。 |
| 50 | +- 仓库使用 ESM。新增 Node 内置模块导入时,优先使用 `node:` 前缀并保持与现有文件风格一致。 |
| 51 | +- 任何新增路径处理逻辑,都必须优先复用现有工具: |
| 52 | + - `normalizePath` |
| 53 | + - `resolve` |
| 54 | + - `ensureAbsolute` |
| 55 | + - `resolveConfigDir` |
| 56 | + 不要引入新的随手拼路径逻辑,否则很容易重新制造 Windows 路径问题。 |
| 57 | +- 修改 `tsconfig` 解析、模块解析或别名处理时,要保持对 bundler 场景和 Node 场景的兼容。`Runtime` 中对 Vue 的 `setModuleResolution` 补丁是有意存在的,没有夹具验证不要删。 |
| 58 | +- 修改公开选项或产物行为时,必须同步: |
| 59 | + - `packages/unplugin-dts/src/types.ts` |
| 60 | + - `README.md` |
| 61 | + - `README.zh-CN.md` |
| 62 | + - 受影响的包内 README(如 `packages/unplugin-dts/README.md`、`packages/vite-plugin-dts/README.md`) |
| 63 | + |
| 64 | +## 代码风格 |
| 65 | + |
| 66 | +- 遵循根目录现有约束: |
| 67 | + - 2 空格缩进 |
| 68 | + - LF |
| 69 | + - UTF-8 |
| 70 | + - `eslint.config.ts` flat config |
| 71 | +- 不要新增遗留式 `.eslintrc*` 配置。 |
| 72 | +- 如果需要调整 Vitest 多项目配置,优先收敛到 `vitest.config.ts` 的 `test.projects`,不要继续扩展 `vitest.workspace.ts`。 |
| 73 | +- 不要为了“简化”而把已有的细粒度类型改成 `any`。 |
| 74 | +- 保持适配层薄、核心逻辑集中、测试可直接指向 bug。 |
| 75 | + |
| 76 | +## 常用命令 |
| 77 | + |
| 78 | +- 安装依赖:`pnpm install` |
| 79 | +- 根目录 lint:`pnpm lint` |
| 80 | +- 根目录测试:`pnpm test` |
| 81 | +- 构建所有包:`pnpm build` |
| 82 | +- 本地 stub 开发:`pnpm dev` |
| 83 | +- 仅测核心包:`pnpm --filter unplugin-dts test` |
| 84 | +- 运行某个示例构建: |
| 85 | + - `pnpm -C examples/ts-vite build` |
| 86 | + - `pnpm -C examples/vue-vite build` |
| 87 | + - `pnpm -C examples/vue-rspack build` |
| 88 | + - `pnpm -C examples/ts-rollup build` |
| 89 | + - `pnpm -C examples/ts-rolldown build` |
| 90 | + - `pnpm -C examples/ts-webpack build` |
| 91 | + - `pnpm -C examples/ts-esbuild build` |
| 92 | + - `pnpm -C examples/svelte-vite build` |
| 93 | + |
| 94 | +## 按改动类型执行 |
| 95 | + |
| 96 | +### 1. 改 `transform.ts`、alias、路径映射、`.vue` 文件名清理 |
| 97 | + |
| 98 | +- 先补或改 `packages/unplugin-dts/tests/transform.spec.ts` |
| 99 | +- 必要时补 `packages/unplugin-dts/tests/utils.spec.ts` |
| 100 | +- 至少跑:`pnpm --filter unplugin-dts test` |
| 101 | +- 如果改动涉及 Vite/Vue 产物路径,再跑一个对应示例构建 |
| 102 | + |
| 103 | +### 2. 改 `runtime.ts`、emit、`bundleTypes`、多 `outDir`、类型入口写入 |
| 104 | + |
| 105 | +- 优先补核心测试 |
| 106 | +- 至少跑: |
| 107 | + - `pnpm --filter unplugin-dts test` |
| 108 | + - 一个 TS 示例构建,如 `pnpm -C examples/ts-vite build` |
| 109 | +- 如果触及 `bundleTypes` 或 API Extractor 集成,再补一个启用了 `bundleTypes` 的示例验证,如 `examples/ts-vite` 或 `examples/vue-vite` |
| 110 | + |
| 111 | +### 3. 改 Vue/Svelte/JSON resolver 或 processor |
| 112 | + |
| 113 | +- 补对应测试或最小夹具 |
| 114 | +- Vue 改动至少验证一个 Vue 示例: |
| 115 | + - `pnpm -C examples/vue-vite build` |
| 116 | + - 或 `pnpm -C examples/vue-rspack build` |
| 117 | + - 或 `pnpm -C examples/vue-rolldown build` |
| 118 | +- Svelte 改动至少验证:`pnpm -C examples/svelte-vite build` |
| 119 | + |
| 120 | +### 4. 改 bundler 适配层 |
| 121 | + |
| 122 | +- Vite / Rollup / Rolldown / Webpack / Rspack / Esbuild 的入口文件应保持很薄。 |
| 123 | +- 若某个适配器必须新增逻辑,先判断是否应沉到共享层。 |
| 124 | +- 至少跑被改 bundler 的示例构建;如果改的是共享生命周期钩子,补跑一个非同 bundler 的示例做交叉验证。 |
| 125 | + |
| 126 | +### 5. 改公开 API、导出、README、包元数据 |
| 127 | + |
| 128 | +- 同步文档与类型定义 |
| 129 | +- 变更 `exports`、入口文件、构建产物布局时,最终至少跑一次:`pnpm build` |
| 130 | + |
| 131 | +### 6. 改发版脚本 |
| 132 | + |
| 133 | +- 默认不要执行 `release` 或 `publish:*` |
| 134 | +- 只有在用户明确要求时才运行,并优先使用 dry-run |
| 135 | + |
| 136 | +## 最小验证矩阵 |
| 137 | + |
| 138 | +- 只改测试或文档: |
| 139 | + - 通常不必全量构建;确认引用路径、命令和文件名准确即可 |
| 140 | +- 改核心 transform / utils: |
| 141 | + - `pnpm --filter unplugin-dts test` |
| 142 | +- 改 emit / 输出布局: |
| 143 | + - `pnpm --filter unplugin-dts test` |
| 144 | + - `pnpm -C examples/ts-vite build` |
| 145 | +- 改 Vue 支持: |
| 146 | + - `pnpm --filter unplugin-dts test` |
| 147 | + - `pnpm -C examples/vue-vite build` |
| 148 | +- 改 bundler 适配: |
| 149 | + - 跑对应 bundler 示例 |
| 150 | +- 改公共包输出或根脚本: |
| 151 | + - `pnpm build` |
| 152 | + |
| 153 | +## 提交前检查 |
| 154 | + |
| 155 | +- 确认没有手改生成物 |
| 156 | +- 确认测试覆盖了新分支或回归点 |
| 157 | +- 确认 README / 类型 / 示例配置已经同步 |
| 158 | +- 确认新增逻辑没有绕开现有路径规范化工具 |
| 159 | +- 确认 `vite-plugin-dts` 没有与 `unplugin-dts` 产生行为漂移 |
0 commit comments