2
0
Эх сурвалжийг харах

fix(order-module): 修复类型检查错误和测试问题

- 修复OrderService中createOrderPersonAsset方法的参数类型为AssetType和AssetFileType枚举
- 修复OrderPersonAsset实体缺少createTime字段的问题
- 修复index.ts重复导出问题,改为显式导出
- 修复Schema导出:添加BatchAddPersonItemSchema用于批量添加人员(不需要orderId)
- 修复测试中的实体创建类型问题:将orderRepository.create()改为new EmploymentOrder()和new OrderPersonAsset()
- 修复测试中的枚举值类型问题,使用正确的枚举值
- 更新故事文档记录类型检查修复进度

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

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
yourname 5 өдөр өмнө
parent
commit
9798c6465b

+ 8 - 0
allin-packages/order-module/src/entities/order-person-asset.entity.ts

@@ -79,6 +79,14 @@ export class OrderPersonAsset {
   })
   relatedTime!: Date;
 
+  @CreateDateColumn({
+    name: 'create_time',
+    type: 'timestamp',
+    nullable: false,
+    comment: '创建时间'
+  })
+  createTime!: Date;
+
   @UpdateDateColumn({
     name: 'update_time',
     type: 'timestamp',

+ 5 - 5
allin-packages/order-module/src/index.ts

@@ -1,7 +1,7 @@
-export * from './entities/employment-order.entity';
-export * from './entities/order-person.entity';
-export * from './entities/order-person-asset.entity';
-export * from './services/order.service';
+// 显式导出以避免重复导出
+export { EmploymentOrder } from './entities/employment-order.entity';
+export { OrderPerson } from './entities/order-person.entity';
+export { OrderPersonAsset, AssetType, AssetFileType } from './entities/order-person-asset.entity';
+export { OrderService } from './services/order.service';
 export * from './schemas/order.schema';
-export * from './routes/order.routes';
 export { orderRoutes } from './routes/order.routes';

+ 95 - 1
allin-packages/order-module/src/schemas/order.schema.ts

@@ -198,6 +198,30 @@ export const CreateOrderPersonSchema = z.object({
   })
 });
 
+// 批量添加人员DTO(不需要orderId,从URL参数获取)
+export const BatchAddPersonItemSchema = z.object({
+  personId: z.coerce.number().int().positive().openapi({
+    description: '残疾人ID',
+    example: 1
+  }),
+  joinDate: z.coerce.date().openapi({
+    description: '入职日期',
+    example: '2024-01-01T00:00:00Z'
+  }),
+  leaveDate: z.coerce.date().optional().openapi({
+    description: '离职日期',
+    example: '2024-12-31T00:00:00Z'
+  }),
+  workStatus: z.nativeEnum(WorkStatus).default(WorkStatus.NOT_WORKING).optional().openapi({
+    description: '工作状态:not_working-未就业, pre_working-待就业, working-已就业, resigned-已离职',
+    example: WorkStatus.NOT_WORKING
+  }),
+  salaryDetail: z.coerce.number().positive().openapi({
+    description: '个人薪资',
+    example: 5000.00
+  })
+});
+
 // 订单人员资产实体Schema
 export const OrderPersonAssetSchema = z.object({
   id: z.number().int().positive().openapi({
@@ -309,4 +333,74 @@ export type CreateOrderPersonAssetDto = z.infer<typeof CreateOrderPersonAssetSch
 export type PaginationQuery = z.infer<typeof PaginationQuerySchema>;
 export type DeleteOrderDto = z.infer<typeof DeleteOrderSchema>;
 export type DeleteOrderPersonDto = z.infer<typeof DeleteOrderPersonSchema>;
-export type DeleteOrderPersonAssetDto = z.infer<typeof DeleteOrderPersonAssetSchema>;
+export type DeleteOrderPersonAssetDto = z.infer<typeof DeleteOrderPersonAssetSchema>;
+
+// 查询订单参数Schema
+export const QueryOrderSchema = z.object({
+  orderName: z.string().optional().openapi({
+    description: '订单名称',
+    example: '2024年Q1用工订单'
+  }),
+  platformId: z.coerce.number().int().positive().optional().openapi({
+    description: '用人平台ID',
+    example: 1
+  }),
+  companyId: z.coerce.number().int().positive().optional().openapi({
+    description: '用人单位ID',
+    example: 1
+  }),
+  channelId: z.coerce.number().int().positive().optional().openapi({
+    description: '渠道ID',
+    example: 1
+  }),
+  orderStatus: z.nativeEnum(OrderStatus).optional().openapi({
+    description: '订单状态',
+    example: OrderStatus.DRAFT
+  }),
+  page: z.coerce.number().int().min(1).default(1).optional().openapi({
+    description: '页码',
+    example: 1
+  }),
+  limit: z.coerce.number().int().min(1).max(100).default(10).optional().openapi({
+    description: '每页数量',
+    example: 10
+  })
+});
+
+// 查询订单人员资产参数Schema
+export const QueryOrderPersonAssetSchema = z.object({
+  orderId: z.coerce.number().int().positive().optional().openapi({
+    description: '订单ID',
+    example: 1
+  }),
+  personId: z.coerce.number().int().positive().optional().openapi({
+    description: '人员ID',
+    example: 1
+  }),
+  assetType: z.nativeEnum(AssetType).optional().openapi({
+    description: '资产类型',
+    example: AssetType.SALARY
+  }),
+  assetFileType: z.nativeEnum(AssetFileType).optional().openapi({
+    description: '资产文件类型',
+    example: AssetFileType.IMAGE
+  }),
+  page: z.coerce.number().int().min(1).default(1).optional().openapi({
+    description: '页码',
+    example: 1
+  }),
+  limit: z.coerce.number().int().min(1).max(100).default(10).optional().openapi({
+    description: '每页数量',
+    example: 10
+  })
+});
+
+// 为兼容性添加别名导出
+export const CreateOrderSchema = CreateEmploymentOrderSchema;
+export const UpdateOrderSchema = UpdateEmploymentOrderSchema;
+export const BatchAddPersonsSchema = z.object({
+  persons: z.array(BatchAddPersonItemSchema).openapi({
+    description: '人员列表',
+    example: [{ personId: 1, joinDate: '2024-01-01T00:00:00Z', salaryDetail: 5000 }]
+  })
+});

+ 4 - 4
allin-packages/order-module/src/services/order.service.ts

@@ -2,7 +2,7 @@ import { GenericCrudService } from '@d8d/shared-crud';
 import { DataSource, Repository, DataSourceOptions, In, Not } from 'typeorm';
 import { EmploymentOrder } from '../entities/employment-order.entity';
 import { OrderPerson } from '../entities/order-person.entity';
-import { OrderPersonAsset } from '../entities/order-person-asset.entity';
+import { OrderPersonAsset, AssetType, AssetFileType } from '../entities/order-person-asset.entity';
 import { FileService, File } from '@d8d/file-module';
 import { OrderStatus, WorkStatus } from '@d8d/allin-enums';
 
@@ -368,8 +368,8 @@ export class OrderService extends GenericCrudService<EmploymentOrder> {
   async createOrderPersonAsset(data: {
     orderId: number;
     personId: number;
-    assetType: string;
-    assetFileType: string;
+    assetType: AssetType;
+    assetFileType: AssetFileType;
     fileId: number;
     relatedTime?: Date;
   }): Promise<OrderPersonAsset> {
@@ -389,7 +389,7 @@ export class OrderService extends GenericCrudService<EmploymentOrder> {
     }
 
     // 创建资产记录
-    const asset = this.orderPersonAssetRepository.create({
+    const asset = new OrderPersonAsset({
       orderId: data.orderId,
       personId: data.personId,
       assetType: data.assetType,

+ 40 - 44
allin-packages/order-module/tests/integration/order.integration.test.ts

@@ -7,7 +7,7 @@ import { File } from '@d8d/file-module';
 import orderRoutes from '../../src/routes/order.routes';
 import { EmploymentOrder } from '../../src/entities/employment-order.entity';
 import { OrderPerson } from '../../src/entities/order-person.entity';
-import { OrderPersonAsset } from '../../src/entities/order-person-asset.entity';
+import { OrderPersonAsset, AssetType, AssetFileType } from '../../src/entities/order-person-asset.entity';
 import { OrderStatus, WorkStatus } from '@d8d/allin-enums';
 
 // 设置集成测试钩子
@@ -100,12 +100,12 @@ describe('订单管理API集成测试', () => {
         companyId: 1,
         channelId: 1,
         expectedStartDate: new Date().toISOString(),
-        orderStatus: 'INVALID_STATUS', // 无效的状态
+        orderStatus: 'invalid_status', // 无效的状态
         workStatus: WorkStatus.NOT_WORKING
       };
 
       const response = await client.create.$post({
-        json: createData
+        json: createData as any // 使用any绕过类型检查,因为这里故意测试无效的枚举值
       }, {
         headers: {
           'Authorization': `Bearer ${testToken}`
@@ -123,11 +123,11 @@ describe('订单管理API集成测试', () => {
         channelId: 1,
         expectedStartDate: new Date().toISOString(),
         orderStatus: OrderStatus.DRAFT,
-        workStatus: 'INVALID_STATUS' // 无效的状态
+        workStatus: 'invalid_status' // 无效的状态
       };
 
       const response = await client.create.$post({
-        json: createData
+        json: createData as any // 使用any绕过类型检查,因为这里故意测试无效的枚举值
       }, {
         headers: {
           'Authorization': `Bearer ${testToken}`
@@ -146,27 +146,25 @@ describe('订单管理API集成测试', () => {
       const dataSource = await IntegrationTestDatabase.getDataSource();
       const orderRepository = dataSource.getRepository(EmploymentOrder);
 
-      testOrder = orderRepository.create({
+      testOrder = new EmploymentOrder({
         orderName: '测试订单1',
         platformId: 1,
         companyId: 1,
         channelId: 1,
         expectedStartDate: new Date(),
         orderStatus: OrderStatus.DRAFT,
-        workStatus: WorkStatus.NOT_WORKING,
-        createdBy: testUser.id
+        workStatus: WorkStatus.NOT_WORKING
       });
       await orderRepository.save(testOrder);
 
-      const testOrder2 = orderRepository.create({
+      const testOrder2 = new EmploymentOrder({
         orderName: '测试订单2',
         platformId: 2,
         companyId: 2,
         channelId: 2,
         expectedStartDate: new Date(),
         orderStatus: OrderStatus.CONFIRMED,
-        workStatus: WorkStatus.PRE_WORKING,
-        createdBy: testUser.id
+        workStatus: WorkStatus.PRE_WORKING
       });
       await orderRepository.save(testOrder2);
     });
@@ -261,15 +259,14 @@ describe('订单管理API集成测试', () => {
       const dataSource = await IntegrationTestDatabase.getDataSource();
       const orderRepository = dataSource.getRepository(EmploymentOrder);
 
-      testOrder = orderRepository.create({
+      testOrder = new EmploymentOrder({
         orderName: '测试订单详情',
         platformId: 1,
         companyId: 1,
         channelId: 1,
         expectedStartDate: new Date(),
         orderStatus: OrderStatus.DRAFT,
-        workStatus: WorkStatus.NOT_WORKING,
-        createdBy: testUser.id
+        workStatus: WorkStatus.NOT_WORKING
       });
       await orderRepository.save(testOrder);
     });
@@ -314,15 +311,14 @@ describe('订单管理API集成测试', () => {
       const dataSource = await IntegrationTestDatabase.getDataSource();
       const orderRepository = dataSource.getRepository(EmploymentOrder);
 
-      testOrder = orderRepository.create({
+      testOrder = new EmploymentOrder({
         orderName: '待激活订单',
         platformId: 1,
         companyId: 1,
         channelId: 1,
         expectedStartDate: new Date(),
         orderStatus: OrderStatus.DRAFT,
-        workStatus: WorkStatus.NOT_WORKING,
-        createdBy: testUser.id
+        workStatus: WorkStatus.NOT_WORKING
       });
       await orderRepository.save(testOrder);
     });
@@ -391,7 +387,7 @@ describe('订单管理API集成测试', () => {
       const dataSource = await IntegrationTestDatabase.getDataSource();
       const orderRepository = dataSource.getRepository(EmploymentOrder);
 
-      testOrder = orderRepository.create({
+      testOrder = new EmploymentOrder({
         orderName: '待关闭订单',
         platformId: 1,
         companyId: 1,
@@ -400,7 +396,6 @@ describe('订单管理API集成测试', () => {
         actualStartDate: new Date(),
         orderStatus: OrderStatus.CONFIRMED,
         workStatus: WorkStatus.PRE_WORKING,
-        createdBy: testUser.id
       });
       await orderRepository.save(testOrder);
     });
@@ -469,7 +464,7 @@ describe('订单管理API集成测试', () => {
       const dataSource = await IntegrationTestDatabase.getDataSource();
       const orderRepository = dataSource.getRepository(EmploymentOrder);
 
-      testOrder = orderRepository.create({
+      testOrder = new EmploymentOrder({
         orderName: '批量添加人员测试订单',
         platformId: 1,
         companyId: 1,
@@ -477,7 +472,6 @@ describe('订单管理API集成测试', () => {
         expectedStartDate: new Date(),
         orderStatus: OrderStatus.DRAFT,
         workStatus: WorkStatus.NOT_WORKING,
-        createdBy: testUser.id
       });
       await orderRepository.save(testOrder);
     });
@@ -632,7 +626,7 @@ describe('订单管理API集成测试', () => {
       const orderRepository = dataSource.getRepository(EmploymentOrder);
       const orderPersonRepository = dataSource.getRepository(OrderPerson);
 
-      testOrder = orderRepository.create({
+      testOrder = new EmploymentOrder({
         orderName: '资产测试订单',
         platformId: 1,
         companyId: 1,
@@ -640,7 +634,6 @@ describe('订单管理API集成测试', () => {
         expectedStartDate: new Date(),
         orderStatus: OrderStatus.DRAFT,
         workStatus: WorkStatus.NOT_WORKING,
-        createdBy: testUser.id
       });
       await orderRepository.save(testOrder);
 
@@ -658,8 +651,8 @@ describe('订单管理API集成测试', () => {
       const assetData = {
         orderId: testOrder.id,
         personId: testOrderPerson.personId,
-        assetType: '身份证',
-        assetFileType: 'image',
+        assetType: AssetType.DISABILITY_CERT,
+        assetFileType: AssetFileType.IMAGE,
         fileId: testFile.id,
         relatedTime: new Date().toISOString()
       };
@@ -672,6 +665,11 @@ describe('订单管理API集成测试', () => {
         }
       });
 
+      if (response.status !== 200) {
+        const error = await response.json();
+        console.debug('创建订单人员资产失败:', JSON.stringify(error, null, 2));
+      }
+
       expect(response.status).toBe(200);
 
       if (response.status === 200) {
@@ -679,7 +677,7 @@ describe('订单管理API集成测试', () => {
         expect(data.id).toBeDefined();
         expect(data.orderId).toBe(testOrder.id);
         expect(data.personId).toBe(testOrderPerson.personId);
-        expect(data.assetType).toBe('身份证');
+        expect(data.assetType).toBe(AssetType.DISABILITY_CERT);
         expect(data.fileId).toBe(testFile.id);
       }
     });
@@ -688,8 +686,8 @@ describe('订单管理API集成测试', () => {
       const assetData = {
         orderId: testOrder.id,
         personId: testOrderPerson.personId,
-        assetType: '身份证',
-        assetFileType: 'image',
+        assetType: AssetType.DISABILITY_CERT,
+        assetFileType: AssetFileType.IMAGE,
         fileId: 999999, // 不存在的文件ID
         relatedTime: new Date().toISOString()
       };
@@ -709,8 +707,8 @@ describe('订单管理API集成测试', () => {
       const assetData = {
         orderId: testOrder.id,
         personId: 999999, // 不在订单中的人员
-        assetType: '身份证',
-        assetFileType: 'image',
+        assetType: AssetType.DISABILITY_CERT,
+        assetFileType: AssetFileType.IMAGE,
         fileId: testFile.id,
         relatedTime: new Date().toISOString()
       };
@@ -739,7 +737,7 @@ describe('订单管理API集成测试', () => {
       const orderPersonRepository = dataSource.getRepository(OrderPerson);
       const assetRepository = dataSource.getRepository(OrderPersonAsset);
 
-      testOrder = orderRepository.create({
+      testOrder = new EmploymentOrder({
         orderName: '资产查询测试订单',
         platformId: 1,
         companyId: 1,
@@ -747,7 +745,6 @@ describe('订单管理API集成测试', () => {
         expectedStartDate: new Date(),
         orderStatus: OrderStatus.DRAFT,
         workStatus: WorkStatus.NOT_WORKING,
-        createdBy: testUser.id
       });
       await orderRepository.save(testOrder);
 
@@ -760,22 +757,22 @@ describe('订单管理API集成测试', () => {
       });
       await orderPersonRepository.save(testOrderPerson);
 
-      testAsset = assetRepository.create({
+      testAsset = new OrderPersonAsset({
         orderId: testOrder.id,
         personId: testOrderPerson.personId,
-        assetType: '身份证',
-        assetFileType: 'image',
+        assetType: AssetType.DISABILITY_CERT,
+        assetFileType: AssetFileType.IMAGE,
         fileId: testFile.id,
         relatedTime: new Date()
       });
       await assetRepository.save(testAsset);
 
       // 创建第二个资产
-      const testAsset2 = assetRepository.create({
+      const testAsset2 = new OrderPersonAsset({
         orderId: testOrder.id,
         personId: testOrderPerson.personId,
-        assetType: '学历证书',
-        assetFileType: 'pdf',
+        assetType: AssetType.OTHER,
+        assetFileType: AssetFileType.IMAGE,
         fileId: testFile.id,
         relatedTime: new Date()
       });
@@ -845,7 +842,7 @@ describe('订单管理API集成测试', () => {
     it('应该支持按资产类型查询', async () => {
       const response = await client.assets.query.$get({
         query: {
-          assetType: '身份证'
+          assetType: AssetType.DISABILITY_CERT
         }
       }, {
         headers: {
@@ -894,7 +891,7 @@ describe('订单管理API集成测试', () => {
       const orderPersonRepository = dataSource.getRepository(OrderPerson);
       const assetRepository = dataSource.getRepository(OrderPersonAsset);
 
-      const testOrder = orderRepository.create({
+      const testOrder = new EmploymentOrder({
         orderName: '资产删除测试订单',
         platformId: 1,
         companyId: 1,
@@ -902,7 +899,6 @@ describe('订单管理API集成测试', () => {
         expectedStartDate: new Date(),
         orderStatus: OrderStatus.DRAFT,
         workStatus: WorkStatus.NOT_WORKING,
-        createdBy: testUser.id
       });
       await orderRepository.save(testOrder);
 
@@ -915,11 +911,11 @@ describe('订单管理API集成测试', () => {
       });
       await orderPersonRepository.save(testOrderPerson);
 
-      testAsset = assetRepository.create({
+      testAsset = new OrderPersonAsset({
         orderId: testOrder.id,
         personId: testOrderPerson.personId,
-        assetType: '身份证',
-        assetFileType: 'image',
+        assetType: AssetType.DISABILITY_CERT,
+        assetFileType: AssetFileType.IMAGE,
         fileId: testFile.id,
         relatedTime: new Date()
       });

+ 30 - 11
docs/stories/007.005.transplant-order-management-module.story.md

@@ -593,7 +593,7 @@ export default orderRoutes;
 ## Dev Agent Record
 **开发时间**: 2025-12-03
 **开发者**: James (全栈开发工程师)
-**开发状态**: 基本完成,集成测试调试中
+**开发状态**: 类型检查已通过,准备运行完整测试
 
 ### 已完成的工作:
 1. **✅ 创建包结构和配置文件** (AC: 1)
@@ -627,13 +627,32 @@ export default orderRoutes;
    - 在OrderPerson和OrderPersonAsset实体中使用`personId: number`代替DisabledPerson的直接引用
    - 避免与disability-module的循环依赖
 
-### 当前问题:
-1. **集成测试失败**:创建订单API返回500错误,错误信息:`"Cannot read properties of undefined (reading 'orderStatus')"`
+### 当前问题(已解决)
+1. **集成测试失败**:创建订单API返回500错误,错误信息:`"Cannot read properties of undefined (reading 'orderStatus')"`
    - 问题定位:Schema导出不一致,路由中导入`CreateOrderSchema`但Schema文件中导出的是`CreateEmploymentOrderSchema`
-   - 需要修复Schema导出或路由导入
-
-2. **订单人员资产创建测试失败**:返回400错误
-   - 可能原因:文件ID验证失败或测试数据问题
+   - 解决方案:在order.schema.ts中添加兼容性别名导出:`export const CreateOrderSchema = CreateEmploymentOrderSchema;`
+
+2. **✅ 订单人员资产创建测试失败**:返回400错误
+   - 问题定位:测试中使用字符串'身份证',但Schema期望AssetType枚举值
+   - 解决方案:更新测试代码使用`AssetType.DISABILITY_CERT`枚举值
+
+3. **✅ 类型检查失败**:运行pnpm typecheck发现大量类型错误
+   - 主要问题:
+     - index.ts重复导出
+     - QueryOrderSchema不匹配
+     - OrderPersonAsset实体缺少createTime字段
+     - OrderService中createOrderPersonAsset方法参数类型不匹配
+     - 测试中的assetType和assetFileType类型不匹配
+     - 测试中实体创建使用orderRepository.create()但TypeORM期望DeepPartial类型
+     - BatchAddPersonsSchema期望orderId但实际API从URL参数获取
+   - 解决方案:
+     - 修复index.ts的重复导出问题,改为显式导出
+     - 创建正确的QueryOrderSchema和QueryOrderPersonAssetSchema
+     - 在OrderPersonAsset实体中添加createTime字段
+     - 修复OrderService中createOrderPersonAsset方法的参数类型为AssetType和AssetFileType枚举
+     - 更新测试代码,使用正确的枚举值
+     - 将测试中的orderRepository.create()改为new EmploymentOrder()和new OrderPersonAsset()
+     - 创建BatchAddPersonItemSchema(不需要orderId),更新BatchAddPersonsSchema使用新Schema
 
 ### 技术实现细节:
 1. **枚举集成**:正确使用`@d8d/allin-enums`包中的OrderStatus和WorkStatus枚举
@@ -643,10 +662,10 @@ export default orderRoutes;
 5. **路由聚合**:使用Hono的路由聚合模式,聚合自定义路由和CRUD路由
 
 ### 下一步:
-1. 修复Schema导出问题
-2. 调试集成测试
-3. 运行完整测试套件验证
-4. 提交代码
+1. 运行完整测试套件验证修复
+2. 创建测试数据工厂(可选,根据其他模块模式)
+3. 提交当前版本的模块代码
+4. 继续完成剩余任务(如有)
 
 ---
 

+ 58 - 0
pnpm-lock.yaml

@@ -195,6 +195,64 @@ importers:
         specifier: ^3.2.4
         version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.1)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(sass@1.93.2)(stylus@0.64.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
 
+  allin-packages/order-module:
+    dependencies:
+      '@d8d/allin-enums':
+        specifier: workspace:*
+        version: link:../enums
+      '@d8d/auth-module':
+        specifier: workspace:*
+        version: link:../../packages/auth-module
+      '@d8d/file-module':
+        specifier: workspace:*
+        version: link:../../packages/file-module
+      '@d8d/shared-crud':
+        specifier: workspace:*
+        version: link:../../packages/shared-crud
+      '@d8d/shared-types':
+        specifier: workspace:*
+        version: link:../../packages/shared-types
+      '@d8d/shared-utils':
+        specifier: workspace:*
+        version: link:../../packages/shared-utils
+      '@d8d/user-module':
+        specifier: workspace:*
+        version: link:../../packages/user-module
+      '@hono/zod-openapi':
+        specifier: ^1.0.2
+        version: 1.0.2(hono@4.8.5)(zod@4.1.12)
+      hono:
+        specifier: ^4.8.5
+        version: 4.8.5
+      typeorm:
+        specifier: ^0.3.20
+        version: 0.3.27(ioredis@5.8.2)(pg@8.16.3)(redis@4.7.1)(reflect-metadata@0.2.2)
+      zod:
+        specifier: ^4.1.12
+        version: 4.1.12
+    devDependencies:
+      '@d8d/shared-test-util':
+        specifier: workspace:*
+        version: link:../../packages/shared-test-util
+      '@types/node':
+        specifier: ^22.10.2
+        version: 22.19.1
+      '@typescript-eslint/eslint-plugin':
+        specifier: ^8.18.1
+        version: 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.38.0(jiti@2.6.1))(typescript@5.8.3)
+      '@typescript-eslint/parser':
+        specifier: ^8.18.1
+        version: 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.8.3)
+      eslint:
+        specifier: ^9.17.0
+        version: 9.38.0(jiti@2.6.1)
+      typescript:
+        specifier: ^5.8.3
+        version: 5.8.3
+      vitest:
+        specifier: ^3.2.4
+        version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.1)(happy-dom@18.0.1)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(sass@1.93.2)(stylus@0.64.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
+
   allin-packages/platform-module:
     dependencies:
       '@d8d/auth-module':