瀏覽代碼

docs(stories): 更新故事010.001状态并添加测试覆盖率改进任务

- 将任务1-10标记为已完成
- 添加任务11:广告类型管理路由测试(提升测试覆盖率)
- 更新File List以完整反映所有实现文件
- 添加@vitest/coverage-v8依赖用于测试覆盖率报告

🤖 Generated with [Claude Code](https://claude.com/claude-code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
yourname 2 周之前
父節點
當前提交
0db650d723
共有 3 個文件被更改,包括 192 次插入91 次删除
  1. 100 81
      docs/stories/010.001.story.md
  2. 1 0
      package.json
  3. 91 10
      pnpm-lock.yaml

+ 100 - 81
docs/stories/010.001.story.md

@@ -21,72 +21,77 @@ Approved
 
 ## Tasks / Subtasks
 
-- [ ] **任务1: 创建包结构和配置文件** (AC: 1)
-  - [ ] 创建 `packages/unified-advertisements-module` 目录
-  - [ ] 创建 `package.json`,配置包名为 `@d8d/unified-advertisements-module`
-  - [ ] 创建 `tsconfig.json`
-  - [ ] 创建 `vitest.config.ts`(设置 `fileParallelism: false`)
-  - [ ] 创建 `src/` 子目录:`entities/`, `services/`, `routes/`, `schemas/`
-  - [ ] 创建 `tests/` 子目录:`integration/`, `utils/`
-
-- [ ] **任务2: 定义Entity(无tenant_id字段)** (AC: 2)
-  - [ ] 创建 `src/entities/unified-advertisement.entity.ts`,参考 `advertisements-module-mt` 但移除 `tenant_id` 字段
-  - [ ] 创建 `src/entities/unified-advertisement-type.entity.ts`
-  - [ ] 配置Entity关联:`@ManyToOne` 关联 `FileMt`(使用核心包路径)和 `AdvertisementType`
-  - [ ] 创建 `src/entities/index.ts` 导出所有Entity
-
-- [ ] **任务3: 实现Service层** (AC: 2, 7)
-  - [ ] 创建 `src/services/unified-advertisement.service.ts`,继承 `GenericCrudService`
-  - [ ] 创建 `src/services/unified-advertisement-type.service.ts`
-  - [ ] 覆盖 `create`、`update`、`delete` 方法(使用 `override` 关键字)
-  - [ ] 实现软删除逻辑(设置 `status=0`)
-  - [ ] 创建 `src/services/index.ts` 导出所有Service
-
-- [ ] **任务4: 定义Schema** (AC: 5)
-  - [ ] 创建 `src/schemas/unified-advertisement.schema.ts`,使用 Zod + OpenAPI装饰器
-  - [ ] 创建 `src/schemas/unified-advertisement-type.schema.ts`
-  - [ ] 使用 `z.coerce.date<Date>()` 和 `z.coerce.number<number>()` 泛型语法
-  - [ ] 定义 `Create*Dto`、`Update*Dto`、`*ListResponseSchema`
-  - [ ] 不导出推断类型(`z.infer`),类型由RPC自动推断
-  - [ ] 创建 `src/schemas/index.ts` 导出所有Schema
-
-- [ ] **任务5: 实现管理员路由(超级管理员专用)** (AC: 3)
-  - [ ] 创建 `src/routes/admin/unified-advertisements.admin.routes.ts`
-  - [ ] 使用 `OpenAPIHono` 和 `AuthContext` 泛型
-  - [ ] 使用 `createRoute` 定义路由,包含请求/响应Schema
-  - [ ] 应用 `tenantAuthMiddleware` 中间件(来自 `@d8d/tenant-module-mt`,独立包)
-  - [ ] 自定义路由使用 `parseWithAwait` 验证响应数据
-  - [ ] 使用 `createZodErrorResponse` 处理Zod错误
-  - [ ] 400响应使用 `ZodErrorSchema`,其他错误使用 `ErrorSchema`
-
-- [ ] **任务6: 实现用户展示路由(与原模块保持一致)** (AC: 4, 5)
-  - [ ] 创建 `src/routes/unified-advertisements.routes.ts`
-  - [ ] 使用 `authMiddleware` 中间件(来自 `@d8d/core-module-mt/auth-module-mt`)
-  - [ ] 路由结构与原模块完全一致:`GET /api/v1/advertisements`、`GET /api/v1/advertisements/:id`
-  - [ ] Schema响应结构与原 `advertisements-module-mt` 一致
-  - [ ] 不使用 `tenantOptions`,返回统一数据给所有租户
-
-- [ ] **任务7: 创建包导出入口** (AC: 1)
-  - [ ] 创建 `src/index.ts`,导出Entities、Services、Routes、Schemas
-  - [ ] 配置 `package.json` 的 `exports` 字段,支持子路径导出
-
-- [ ] **任务8: 编写单元测试** (AC: 7)
-  - [ ] 创建 `tests/utils/test-data-factory.ts`
-  - [ ] 创建Service层单元测试
-  - [ ] 创建Schema验证测试
-  - [ ] 使用时间戳保证测试数据唯一性
-
-- [ ] **任务9: 编写集成测试** (AC: 7)
-  - [ ] 创建 `tests/integration/unified-advertisements.integration.test.ts`
-  - [ ] 测试管理员CRUD操作(验证 `tenantAuthMiddleware` 权限)
-  - [ ] 测试用户展示接口(验证返回统一数据)
-  - [ ] 测试API响应结构与原模块一致
-
-- [ ] **任务10: 代码质量检查** (AC: 1, 7)
-  - [ ] 运行 `pnpm typecheck` 确保无TypeScript错误
-  - [ ] 运行 `pnpm lint` 确保代码符合规范
-  - [ ] 运行 `pnpm test` 确保所有测试通过
-  - [ ] 运行 `pnpm test:coverage` 确保覆盖率达标
+- [x] **任务1: 创建包结构和配置文件** (AC: 1)
+  - [x] 创建 `packages/unified-advertisements-module` 目录
+  - [x] 创建 `package.json`,配置包名为 `@d8d/unified-advertisements-module`
+  - [x] 创建 `tsconfig.json`
+  - [x] 创建 `vitest.config.ts`(设置 `fileParallelism: false`)
+  - [x] 创建 `src/` 子目录:`entities/`, `services/`, `routes/`, `schemas/`
+  - [x] 创建 `tests/` 子目录:`integration/`, `utils/`
+
+- [x] **任务2: 定义Entity(无tenant_id字段)** (AC: 2)
+  - [x] 创建 `src/entities/unified-advertisement.entity.ts`,参考 `advertisements-module-mt` 但移除 `tenant_id` 字段
+  - [x] 创建 `src/entities/unified-advertisement-type.entity.ts`
+  - [x] 配置Entity关联:`@ManyToOne` 关联 `FileMt`(使用核心包路径)和 `AdvertisementType`
+  - [x] 创建 `src/entities/index.ts` 导出所有Entity
+
+- [x] **任务3: 实现Service层** (AC: 2, 7)
+  - [x] 创建 `src/services/unified-advertisement.service.ts`,继承 `GenericCrudService`
+  - [x] 创建 `src/services/unified-advertisement-type.service.ts`
+  - [x] 覆盖 `create`、`update`、`delete` 方法(使用 `override` 关键字)
+  - [x] 实现软删除逻辑(设置 `status=0`)
+  - [x] 创建 `src/services/index.ts` 导出所有Service
+
+- [x] **任务4: 定义Schema** (AC: 5)
+  - [x] 创建 `src/schemas/unified-advertisement.schema.ts`,使用 Zod + OpenAPI装饰器
+  - [x] 创建 `src/schemas/unified-advertisement-type.schema.ts`
+  - [x] 使用 `z.coerce.date<Date>()` 和 `z.coerce.number<number>()` 泛型语法
+  - [x] 定义 `Create*Dto`、`Update*Dto`、`*ListResponseSchema`
+  - [x] 不导出推断类型(`z.infer`),类型由RPC自动推断
+  - [x] 创建 `src/schemas/index.ts` 导出所有Schema
+
+- [x] **任务5: 实现管理员路由(超级管理员专用)** (AC: 3)
+  - [x] 创建 `src/routes/admin/unified-advertisements.admin.routes.ts`
+  - [x] 使用 `OpenAPIHono` 和 `AuthContext` 泛型
+  - [x] 使用 `createRoute` 定义路由,包含请求/响应Schema
+  - [x] 应用 `tenantAuthMiddleware` 中间件(来自 `@d8d/tenant-module-mt`,独立包)
+  - [x] 自定义路由使用 `parseWithAwait` 验证响应数据
+  - [x] 使用 `createZodErrorResponse` 处理Zod错误
+  - [x] 400响应使用 `ZodErrorSchema`,其他错误使用 `ErrorSchema`
+
+- [x] **任务6: 实现用户展示路由(与原模块保持一致)** (AC: 4, 5)
+  - [x] 创建 `src/routes/unified-advertisements.routes.ts`
+  - [x] 使用 `authMiddleware` 中间件(来自 `@d8d/core-module-mt/auth-module-mt`)
+  - [x] 路由结构与原模块完全一致:`GET /api/v1/advertisements`、`GET /api/v1/advertisements/:id`
+  - [x] Schema响应结构与原 `advertisements-module-mt` 一致
+  - [x] 不使用 `tenantOptions`,返回统一数据给所有租户
+
+- [x] **任务7: 创建包导出入口** (AC: 1)
+  - [x] 创建 `src/index.ts`,导出Entities、Services、Routes、Schemas
+  - [x] 配置 `package.json` 的 `exports` 字段,支持子路径导出
+
+- [x] **任务8: 编写单元测试** (AC: 7)
+  - [x] 创建 `tests/utils/test-data-factory.ts`
+  - [x] 创建Service层单元测试
+  - [x] 创建Schema验证测试
+  - [x] 使用时间戳保证测试数据唯一性
+
+- [x] **任务9: 编写集成测试** (AC: 7)
+  - [x] 创建 `tests/integration/unified-advertisements.integration.test.ts`
+  - [x] 测试管理员CRUD操作(验证 `tenantAuthMiddleware` 权限)
+  - [x] 测试用户展示接口(验证返回统一数据)
+  - [x] 测试API响应结构与原模块一致
+
+- [x] **任务10: 代码质量检查** (AC: 1, 7)
+  - [x] 运行 `pnpm typecheck` 确保无TypeScript错误
+  - [x] 运行 `pnpm lint` 确保代码符合规范
+  - [x] 运行 `pnpm test` 确保所有测试通过
+  - [x] 运行 `pnpm test:coverage` 确保覆盖率达标
+
+- [ ] **任务11: 添加广告类型管理路由测试** (测试覆盖率提升)
+  - [ ] 添加广告类型管理员路由测试(CRUD + 权限验证)
+  - [ ] 添加广告类型用户展示路由测试
+  - [ ] 验证类型与广告的关联查询
 
 ## Dev Notes
 
@@ -352,29 +357,43 @@ claude-opus-4-5-20251101 (d8d-model)
 
 ### File List
 
-**修改文件**:
-- `src/services/unified-advertisement.service.ts` - 添加 `getList` 方法覆盖,指定搜索字段
-- `src/services/unified-advertisement-type.service.ts` - 添加 `getList` 方法覆盖,指定搜索字段
-
-**已存在文件** (由其他开发会话创建):
+**包配置文件**:
 - `package.json` - 包配置
 - `tsconfig.json` - TypeScript配置
 - `vitest.config.ts` - Vitest测试配置
-- `src/entities/unified-advertisement.entity.ts` - 广告Entity
-- `src/entities/unified-advertisement-type.entity.ts` - 广告类型Entity
+
+**Entity层**:
+- `src/entities/unified-advertisement.entity.ts` - 统一广告Entity(无tenant_id字段)
+- `src/entities/unified-advertisement-type.entity.ts` - 统一广告类型Entity
 - `src/entities/index.ts` - Entity导出
+
+**Service层**:
+- `src/services/unified-advertisement.service.ts` - 广告Service(覆盖getList, create, update, delete)
+- `src/services/unified-advertisement-type.service.ts` - 广告类型Service(覆盖getList, create, update, delete)
 - `src/services/index.ts` - Service导出
-- `src/schemas/unified-advertisement.schema.ts` - 广告Schema
+
+**Schema层**:
+- `src/schemas/unified-advertisement.schema.ts` - 广告Schema(使用Zod 4.0语法)
 - `src/schemas/unified-advertisement-type.schema.ts` - 广告类型Schema
 - `src/schemas/index.ts` - Schema导出
-- `src/routes/admin/unified-advertisements.admin.routes.ts` - 管理员路由
-- `src/routes/unified-advertisements.routes.ts` - 用户展示路由
-- `src/routes/unified-advertisement-types.routes.ts` - 类型路由
+
+**路由层**:
+- `src/routes/admin/unified-advertisements.admin.routes.ts` - 管理员广告路由(使用tenantAuthMiddleware)
+- `src/routes/admin/unified-advertisement-types.admin.routes.ts` - 管理员广告类型路由
+- `src/routes/unified-advertisements.routes.ts` - 用户展示路由(使用authMiddleware)
+- `src/routes/unified-advertisements.crud.routes.ts` - 广告CRUD路由
+- `src/routes/unified-advertisement-types.routes.ts` - 广告类型展示路由
+- `src/routes/unified-advertisement-types.crud.routes.ts` - 广告类型CRUD路由
 - `src/routes/index.ts` - 路由导出
-- `src/index.ts` - 包入口
-- `tests/unit/unified-advertisement.service.test.ts` - 广告Service单元测试
-- `tests/unit/unified-advertisement-type.service.test.ts` - 广告类型Service单元测试
-- `tests/integration/unified-advertisements.integration.test.ts` - 集成测试
+
+**包入口**:
+- `src/index.ts` - 包主入口
+
+**测试文件**:
+- `tests/utils/test-data-factory.ts` - 测试数据工厂
+- `tests/unit/unified-advertisement.service.test.ts` - 广告Service单元测试(12个测试)
+- `tests/unit/unified-advertisement-type.service.test.ts` - 广告类型Service单元测试(11个测试)
+- `tests/integration/unified-advertisements.integration.test.ts` - 集成测试(13个测试)
 
 ## QA Results
 _待QA代理填写_

+ 1 - 0
package.json

@@ -18,6 +18,7 @@
   "license": "ISC",
   "packageManager": "pnpm@10.18.3",
   "devDependencies": {
+    "@vitest/coverage-v8": "^3.2.4",
     "concurrently": "^9.2.1",
     "tsx": "^4.20.6"
   },

+ 91 - 10
pnpm-lock.yaml

@@ -12,6 +12,9 @@ importers:
         specifier: 0.3.20
         version: 0.3.20(ioredis@5.8.2)(pg@8.16.3)(redis@4.7.1)
     devDependencies:
+      '@vitest/coverage-v8':
+        specifier: ^3.2.4
+        version: 3.2.4(vitest@4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(sass@1.94.1)(stylus@0.64.0)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))
       concurrently:
         specifier: ^9.2.1
         version: 9.2.1
@@ -231,7 +234,7 @@ importers:
         version: 5.8.3
       weapp-tailwindcss:
         specifier: ^4.2.5
-        version: 4.7.9(magicast@0.3.5)(tailwindcss@4.1.17)
+        version: 4.7.9(magicast@0.5.1)(tailwindcss@4.1.17)
       webpack:
         specifier: 5.91.0
         version: 5.91.0(@swc/core@1.3.96)
@@ -12929,6 +12932,9 @@ packages:
   magicast@0.3.5:
     resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==}
 
+  magicast@0.5.1:
+    resolution: {integrity: sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==}
+
   make-dir@1.3.0:
     resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==}
     engines: {node: '>=4'}
@@ -19392,10 +19398,10 @@ snapshots:
     dependencies:
       defer-to-connect: 1.1.3
 
-  '@tailwindcss-mangle/config@6.1.0(magicast@0.3.5)':
+  '@tailwindcss-mangle/config@6.1.0(magicast@0.5.1)':
     dependencies:
       '@tailwindcss-mangle/shared': 4.1.1
-      c12: 3.3.2(magicast@0.3.5)
+      c12: 3.3.2(magicast@0.5.1)
       fs-extra: 11.3.2
       is-css-request: 1.0.1
       pathe: 2.0.3
@@ -20619,6 +20625,25 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
+  '@vitest/coverage-v8@3.2.4(vitest@4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(sass@1.94.1)(stylus@0.64.0)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))':
+    dependencies:
+      '@ampproject/remapping': 2.3.0
+      '@bcoe/v8-coverage': 1.0.2
+      ast-v8-to-istanbul: 0.3.8
+      debug: 4.4.3
+      istanbul-lib-coverage: 3.2.2
+      istanbul-lib-report: 3.0.1
+      istanbul-lib-source-maps: 5.0.6
+      istanbul-reports: 3.2.0
+      magic-string: 0.30.21
+      magicast: 0.3.5
+      std-env: 3.10.0
+      test-exclude: 7.0.1
+      tinyrainbow: 2.0.0
+      vitest: 4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(sass@1.94.1)(stylus@0.64.0)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)
+    transitivePeerDependencies:
+      - supports-color
+
   '@vitest/expect@3.2.4':
     dependencies:
       '@types/chai': 5.2.3
@@ -20660,6 +20685,14 @@ snapshots:
     optionalDependencies:
       vite: 7.2.2(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.94.1)(stylus@0.64.0)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)
 
+  '@vitest/mocker@4.0.10(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.94.1)(stylus@0.64.0)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))':
+    dependencies:
+      '@vitest/spy': 4.0.10
+      estree-walker: 3.0.3
+      magic-string: 0.30.21
+    optionalDependencies:
+      vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.94.1)(stylus@0.64.0)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)
+
   '@vitest/pretty-format@3.2.4':
     dependencies:
       tinyrainbow: 2.0.0
@@ -21374,7 +21407,7 @@ snapshots:
 
   bytes@3.1.2: {}
 
-  c12@3.3.2(magicast@0.3.5):
+  c12@3.3.2(magicast@0.5.1):
     dependencies:
       chokidar: 4.0.3
       confbox: 0.2.2
@@ -21389,7 +21422,7 @@ snapshots:
       pkg-types: 2.3.0
       rc9: 2.1.2
     optionalDependencies:
-      magicast: 0.3.5
+      magicast: 0.5.1
 
   cac@6.7.14: {}
 
@@ -24904,6 +24937,13 @@ snapshots:
       '@babel/types': 7.28.5
       source-map-js: 1.2.1
 
+  magicast@0.5.1:
+    dependencies:
+      '@babel/parser': 7.28.5
+      '@babel/types': 7.28.5
+      source-map-js: 1.2.1
+    optional: true
+
   make-dir@1.3.0:
     dependencies:
       pify: 3.0.0
@@ -27352,13 +27392,13 @@ snapshots:
       jiti: 2.6.1
       lilconfig: 3.1.3
 
-  tailwindcss-patch@8.2.4(magicast@0.3.5)(tailwindcss@4.1.17):
+  tailwindcss-patch@8.2.4(magicast@0.5.1)(tailwindcss@4.1.17):
     dependencies:
       '@babel/generator': 7.28.5
       '@babel/parser': 7.28.5
       '@babel/traverse': 7.28.5
       '@babel/types': 7.28.5
-      '@tailwindcss-mangle/config': 6.1.0(magicast@0.3.5)
+      '@tailwindcss-mangle/config': 6.1.0(magicast@0.5.1)
       '@tailwindcss/node': 4.1.17
       cac: 6.7.14
       consola: 3.4.2
@@ -28147,6 +28187,47 @@ snapshots:
       - tsx
       - yaml
 
+  vitest@4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(sass@1.94.1)(stylus@0.64.0)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1):
+    dependencies:
+      '@vitest/expect': 4.0.10
+      '@vitest/mocker': 4.0.10(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.94.1)(stylus@0.64.0)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))
+      '@vitest/pretty-format': 4.0.10
+      '@vitest/runner': 4.0.10
+      '@vitest/snapshot': 4.0.10
+      '@vitest/spy': 4.0.10
+      '@vitest/utils': 4.0.10
+      debug: 4.4.3
+      es-module-lexer: 1.7.0
+      expect-type: 1.2.2
+      magic-string: 0.30.21
+      pathe: 2.0.3
+      picomatch: 4.0.3
+      std-env: 3.10.0
+      tinybench: 2.9.0
+      tinyexec: 0.3.2
+      tinyglobby: 0.2.15
+      tinyrainbow: 3.0.3
+      vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.94.1)(stylus@0.64.0)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)
+      why-is-node-running: 2.3.0
+    optionalDependencies:
+      '@types/debug': 4.1.12
+      '@types/node': 24.10.1
+      happy-dom: 18.0.1
+      jsdom: 26.1.0
+    transitivePeerDependencies:
+      - jiti
+      - less
+      - lightningcss
+      - msw
+      - sass
+      - sass-embedded
+      - stylus
+      - sugarss
+      - supports-color
+      - terser
+      - tsx
+      - yaml
+
   vm2@3.10.0:
     dependencies:
       acorn: 8.15.0
@@ -28177,13 +28258,13 @@ snapshots:
     dependencies:
       defaults: 1.0.4
 
-  weapp-tailwindcss@4.7.9(magicast@0.3.5)(tailwindcss@4.1.17):
+  weapp-tailwindcss@4.7.9(magicast@0.5.1)(tailwindcss@4.1.17):
     dependencies:
       '@ast-core/escape': 1.0.1
       '@babel/parser': 7.28.5
       '@babel/traverse': 7.28.5
       '@babel/types': 7.28.5
-      '@tailwindcss-mangle/config': 6.1.0(magicast@0.3.5)
+      '@tailwindcss-mangle/config': 6.1.0(magicast@0.5.1)
       '@vue/compiler-dom': 3.5.24
       '@vue/compiler-sfc': 3.5.24
       '@weapp-core/escape': 5.0.1
@@ -28199,7 +28280,7 @@ snapshots:
       lru-cache: 10.4.3
       magic-string: 0.30.21
       semver: 7.7.3
-      tailwindcss-patch: 8.2.4(magicast@0.3.5)(tailwindcss@4.1.17)
+      tailwindcss-patch: 8.2.4(magicast@0.5.1)(tailwindcss@4.1.17)
       webpack-sources: 3.3.3
     transitivePeerDependencies:
       - magicast