aifastdb 2.2.6 → 2.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/aifastdb.win32-x64-msvc.node +0 -0
  2. package/dist/carpool/benchmark.d.ts +9 -0
  3. package/dist/carpool/benchmark.d.ts.map +1 -0
  4. package/dist/carpool/benchmark.js +310 -0
  5. package/dist/carpool/benchmark.js.map +1 -0
  6. package/dist/carpool/carpool-credit.d.ts +124 -0
  7. package/dist/carpool/carpool-credit.d.ts.map +1 -0
  8. package/dist/carpool/carpool-credit.js +202 -0
  9. package/dist/carpool/carpool-credit.js.map +1 -0
  10. package/dist/carpool/carpool-index.d.ts +71 -0
  11. package/dist/carpool/carpool-index.d.ts.map +1 -0
  12. package/dist/carpool/carpool-index.js +203 -0
  13. package/dist/carpool/carpool-index.js.map +1 -0
  14. package/dist/carpool/carpool-matcher.d.ts +48 -0
  15. package/dist/carpool/carpool-matcher.d.ts.map +1 -0
  16. package/dist/carpool/carpool-matcher.js +133 -0
  17. package/dist/carpool/carpool-matcher.js.map +1 -0
  18. package/dist/carpool/carpool-matcher.test.d.ts +9 -0
  19. package/dist/carpool/carpool-matcher.test.d.ts.map +1 -0
  20. package/dist/carpool/carpool-matcher.test.js +403 -0
  21. package/dist/carpool/carpool-matcher.test.js.map +1 -0
  22. package/dist/carpool/carpool-privacy.d.ts +72 -0
  23. package/dist/carpool/carpool-privacy.d.ts.map +1 -0
  24. package/dist/carpool/carpool-privacy.js +171 -0
  25. package/dist/carpool/carpool-privacy.js.map +1 -0
  26. package/dist/carpool/carpool-repo.d.ts +175 -0
  27. package/dist/carpool/carpool-repo.d.ts.map +1 -0
  28. package/dist/carpool/carpool-repo.js +698 -0
  29. package/dist/carpool/carpool-repo.js.map +1 -0
  30. package/dist/carpool/carpool-repo.test.d.ts +9 -0
  31. package/dist/carpool/carpool-repo.test.d.ts.map +1 -0
  32. package/dist/carpool/carpool-repo.test.js +452 -0
  33. package/dist/carpool/carpool-repo.test.js.map +1 -0
  34. package/dist/carpool/carpool-scheduler.d.ts +68 -0
  35. package/dist/carpool/carpool-scheduler.d.ts.map +1 -0
  36. package/dist/carpool/carpool-scheduler.js +114 -0
  37. package/dist/carpool/carpool-scheduler.js.map +1 -0
  38. package/dist/carpool/carpool-service.d.ts +105 -0
  39. package/dist/carpool/carpool-service.d.ts.map +1 -0
  40. package/dist/carpool/carpool-service.js +372 -0
  41. package/dist/carpool/carpool-service.js.map +1 -0
  42. package/dist/carpool/carpool-service.test.d.ts +9 -0
  43. package/dist/carpool/carpool-service.test.d.ts.map +1 -0
  44. package/dist/carpool/carpool-service.test.js +455 -0
  45. package/dist/carpool/carpool-service.test.js.map +1 -0
  46. package/dist/carpool/carpool-test.d.ts +11 -0
  47. package/dist/carpool/carpool-test.d.ts.map +1 -0
  48. package/dist/carpool/carpool-test.js +387 -0
  49. package/dist/carpool/carpool-test.js.map +1 -0
  50. package/dist/carpool/index.d.ts +42 -0
  51. package/dist/carpool/index.d.ts.map +1 -0
  52. package/dist/carpool/index.js +80 -0
  53. package/dist/carpool/index.js.map +1 -0
  54. package/dist/carpool/privacy-guard.d.ts +69 -0
  55. package/dist/carpool/privacy-guard.d.ts.map +1 -0
  56. package/dist/carpool/privacy-guard.js +211 -0
  57. package/dist/carpool/privacy-guard.js.map +1 -0
  58. package/dist/carpool/report-system.d.ts +106 -0
  59. package/dist/carpool/report-system.d.ts.map +1 -0
  60. package/dist/carpool/report-system.js +212 -0
  61. package/dist/carpool/report-system.js.map +1 -0
  62. package/dist/carpool/trip-index.d.ts +73 -0
  63. package/dist/carpool/trip-index.d.ts.map +1 -0
  64. package/dist/carpool/trip-index.js +269 -0
  65. package/dist/carpool/trip-index.js.map +1 -0
  66. package/dist/carpool/trip-scheduler.d.ts +71 -0
  67. package/dist/carpool/trip-scheduler.d.ts.map +1 -0
  68. package/dist/carpool/trip-scheduler.js +126 -0
  69. package/dist/carpool/trip-scheduler.js.map +1 -0
  70. package/dist/carpool/trust-evaluator.d.ts +27 -0
  71. package/dist/carpool/trust-evaluator.d.ts.map +1 -0
  72. package/dist/carpool/trust-evaluator.js +117 -0
  73. package/dist/carpool/trust-evaluator.js.map +1 -0
  74. package/dist/carpool/types.d.ts +353 -0
  75. package/dist/carpool/types.d.ts.map +1 -0
  76. package/dist/carpool/types.js +71 -0
  77. package/dist/carpool/types.js.map +1 -0
  78. package/dist/carpool/validators.d.ts +25 -0
  79. package/dist/carpool/validators.d.ts.map +1 -0
  80. package/dist/carpool/validators.js +192 -0
  81. package/dist/carpool/validators.js.map +1 -0
  82. package/dist/carpool/vehicle.test.d.ts +8 -0
  83. package/dist/carpool/vehicle.test.d.ts.map +1 -0
  84. package/dist/carpool/vehicle.test.js +540 -0
  85. package/dist/carpool/vehicle.test.js.map +1 -0
  86. package/dist/index.d.ts +1 -0
  87. package/dist/index.d.ts.map +1 -1
  88. package/dist/index.js +40 -1
  89. package/dist/index.js.map +1 -1
  90. package/dist/social-graph-v2.d.ts +7 -0
  91. package/dist/social-graph-v2.d.ts.map +1 -1
  92. package/dist/social-graph-v2.js +10 -0
  93. package/dist/social-graph-v2.js.map +1 -1
  94. package/dist/social-graph.d.ts.map +1 -1
  95. package/dist/social-graph.js +2 -0
  96. package/dist/social-graph.js.map +1 -1
  97. package/dist/social-types.d.ts +4 -0
  98. package/dist/social-types.d.ts.map +1 -1
  99. package/package.json +3 -1
@@ -0,0 +1,387 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * Carpool Module - Integration Test
5
+ *
6
+ * 顺风车模块完整集成测试。
7
+ * 使用真实的 SocialGraphV2 实例验证全流程。
8
+ *
9
+ * 运行方式: npx ts-node packages/node/ts/carpool/carpool-test.ts
10
+ */
11
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ var desc = Object.getOwnPropertyDescriptor(m, k);
14
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
15
+ desc = { enumerable: true, get: function() { return m[k]; } };
16
+ }
17
+ Object.defineProperty(o, k2, desc);
18
+ }) : (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ o[k2] = m[k];
21
+ }));
22
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
23
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
24
+ }) : function(o, v) {
25
+ o["default"] = v;
26
+ });
27
+ var __importStar = (this && this.__importStar) || (function () {
28
+ var ownKeys = function(o) {
29
+ ownKeys = Object.getOwnPropertyNames || function (o) {
30
+ var ar = [];
31
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
32
+ return ar;
33
+ };
34
+ return ownKeys(o);
35
+ };
36
+ return function (mod) {
37
+ if (mod && mod.__esModule) return mod;
38
+ var result = {};
39
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
40
+ __setModuleDefault(result, mod);
41
+ return result;
42
+ };
43
+ })();
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ const os = __importStar(require("os"));
46
+ const path = __importStar(require("path"));
47
+ const fs = __importStar(require("fs"));
48
+ const social_graph_v2_1 = require("../social-graph-v2");
49
+ const carpool_service_1 = require("./carpool-service");
50
+ const types_1 = require("./types");
51
+ // ============================================================================
52
+ // Test Utilities
53
+ // ============================================================================
54
+ let passed = 0;
55
+ let failed = 0;
56
+ const failures = [];
57
+ function assert(condition, message) {
58
+ if (condition) {
59
+ passed++;
60
+ console.log(` ✅ ${message}`);
61
+ }
62
+ else {
63
+ failed++;
64
+ failures.push(message);
65
+ console.log(` ❌ ${message}`);
66
+ }
67
+ }
68
+ function assertThrows(fn, expectedCode, message) {
69
+ try {
70
+ fn();
71
+ failed++;
72
+ failures.push(`${message} (未抛出异常)`);
73
+ console.log(` ❌ ${message} (未抛出异常)`);
74
+ }
75
+ catch (e) {
76
+ if (e instanceof types_1.CarpoolError && e.code === expectedCode) {
77
+ passed++;
78
+ console.log(` ✅ ${message}`);
79
+ }
80
+ else {
81
+ failed++;
82
+ failures.push(`${message} (错误码不匹配: ${e instanceof types_1.CarpoolError ? e.code : e})`);
83
+ console.log(` ❌ ${message} (错误码不匹配: ${e instanceof types_1.CarpoolError ? e.code : e})`);
84
+ }
85
+ }
86
+ }
87
+ function section(title) {
88
+ console.log(`\n━━━ ${title} ━━━`);
89
+ }
90
+ // ============================================================================
91
+ // Setup
92
+ // ============================================================================
93
+ const testDir = path.join(os.tmpdir(), 'carpool-test-' + Date.now());
94
+ fs.mkdirSync(testDir, { recursive: true });
95
+ console.log('=== 顺风车模块集成测试 ===');
96
+ console.log(`测试数据目录: ${testDir}\n`);
97
+ const graph = new social_graph_v2_1.SocialGraphV2({
98
+ path: testDir,
99
+ shardCount: 2,
100
+ walEnabled: true,
101
+ });
102
+ const carpool = new carpool_service_1.CarpoolService(graph);
103
+ // ============================================================================
104
+ // Test 1: Person Setup
105
+ // ============================================================================
106
+ section('1. 创建测试人员');
107
+ const zhangsan = graph.addPerson({
108
+ name: '张三',
109
+ properties: { gender: 'female', driver_license: true },
110
+ });
111
+ assert(!!zhangsan.id, '创建司机张三');
112
+ const lisi = graph.addPerson({
113
+ name: '李四',
114
+ properties: { gender: 'male', driver_license: true },
115
+ });
116
+ assert(!!lisi.id, '创建乘客李四');
117
+ const wangwu = graph.addPerson({
118
+ name: '王五',
119
+ properties: { gender: 'male' },
120
+ });
121
+ assert(!!wangwu.id, '创建乘客王五');
122
+ const zhaoliu = graph.addPerson({
123
+ name: '赵六',
124
+ properties: { gender: 'female' },
125
+ });
126
+ assert(!!zhaoliu.id, '创建乘客赵六');
127
+ // 建立社交关系
128
+ graph.addFriend(zhangsan.id, wangwu.id, {});
129
+ graph.addFriend(lisi.id, wangwu.id, {});
130
+ assert(true, '张三 ↔ 王五 好友关系');
131
+ assert(true, '李四 ↔ 王五 好友关系(张三和李四有共同好友王五)');
132
+ // ============================================================================
133
+ // Test 2: Publish Trip (T17.1)
134
+ // ============================================================================
135
+ section('2. 发布行程');
136
+ const tomorrow = new Date();
137
+ tomorrow.setDate(tomorrow.getDate() + 1);
138
+ const tomorrowStr = tomorrow.toISOString().slice(0, 10);
139
+ const tripDetail = carpool.publishTrip(zhangsan.id, {
140
+ trip_type: 'offer',
141
+ departure_date: tomorrowStr,
142
+ departure_time: 'morning',
143
+ origin: { province: '北京', city: '北京', district: '西城区' },
144
+ destination: { province: '河南', city: '漯河' },
145
+ max_passengers: 3,
146
+ gender_requirement: 'any',
147
+ price_type: 'paid',
148
+ price_per_person: 200,
149
+ vehicle_info: { brand: '保时捷', color: '白色', seats: 4 },
150
+ requirements: { no_smoking: true, can_drive: true, clean: true },
151
+ notes: '长期驾照,每年多次往返',
152
+ });
153
+ const tripId = tripDetail.trip.id;
154
+ assert(!!tripId, '发布行程成功');
155
+ assert(tripDetail.trip.properties.status === 'open', '行程状态为 open');
156
+ assert(tripDetail.trip.properties.current_passengers === 0, '当前乘客数为 0');
157
+ assert(tripDetail.trip.properties.max_passengers === 3, '最大乘客数为 3');
158
+ assert(tripDetail.trip.properties.trip_type === 'offer', '行程类型为 offer(车找人)');
159
+ assert(tripDetail.publisher.id === zhangsan.id, '发布者为张三');
160
+ assert(tripDetail.trip.properties.origin.city === '北京', '出发城市为北京');
161
+ assert(tripDetail.trip.properties.destination.city === '漯河', '目的城市为漯河');
162
+ // ============================================================================
163
+ // Test 3: Search Trips (T17.2)
164
+ // ============================================================================
165
+ section('3. 搜索行程');
166
+ const searchResults = carpool.searchTrips({
167
+ departure_date: tomorrowStr,
168
+ origin_city: '北京',
169
+ trip_type: 'offer',
170
+ });
171
+ assert(searchResults.length === 1, '按日期+城市+类型搜索到 1 个行程');
172
+ const emptyResults = carpool.searchTrips({
173
+ departure_date: tomorrowStr,
174
+ origin_city: '上海',
175
+ });
176
+ assert(emptyResults.length === 0, '搜索不存在的城市返回空');
177
+ const provinceResults = carpool.searchTrips({
178
+ destination_province: '河南',
179
+ });
180
+ assert(provinceResults.length === 1, '按目的省份搜索到 1 个行程');
181
+ // ============================================================================
182
+ // Test 4: Smart Matching (T18.5)
183
+ // ============================================================================
184
+ section('4. 智能匹配(社交信任排序)');
185
+ const matchResults = carpool.matchTrips(lisi.id, {
186
+ departure_date: tomorrowStr,
187
+ origin_city: '北京',
188
+ });
189
+ assert(matchResults.length === 1, '匹配到 1 个行程');
190
+ assert(matchResults[0].match_score > 0, `匹配分数 > 0 (实际: ${matchResults[0].match_score})`);
191
+ assert(matchResults[0].trust_score.level === 'semi_trusted', `信任等级为 semi_trusted(共同好友王五)`);
192
+ assert(matchResults[0].trust_score.mutual_friends_count === 1, '共同好友数为 1');
193
+ assert(matchResults[0].available_seats === 3, '可用座位为 3');
194
+ // 陌生人匹配
195
+ const strangerMatch = carpool.matchTrips(zhaoliu.id, {
196
+ departure_date: tomorrowStr,
197
+ origin_city: '北京',
198
+ });
199
+ assert(strangerMatch.length === 1, '陌生人也能搜到行程');
200
+ assert(strangerMatch[0].trust_score.level === 'stranger', '陌生人信任等级为 stranger');
201
+ // ============================================================================
202
+ // Test 5: Apply to Trip (T17.3)
203
+ // ============================================================================
204
+ section('5. 申请加入行程');
205
+ const applyResult = carpool.applyToTrip(lisi.id, tripId, '你好,我也回漯河,可以轮换开车');
206
+ assert(applyResult.success === true, '李四申请成功');
207
+ assert(applyResult.status === 'pending', '申请状态为 pending');
208
+ // 不能重复申请
209
+ const dupApply = carpool.applyToTrip(lisi.id, tripId);
210
+ assert(dupApply.success === false, '重复申请被拒绝');
211
+ assert(dupApply.error === types_1.CarpoolErrorCode.ALREADY_APPLIED, '错误码为 ALREADY_APPLIED');
212
+ // 不能申请自己的行程
213
+ const selfApply = carpool.applyToTrip(zhangsan.id, tripId);
214
+ assert(selfApply.success === false, '不能申请自己的行程');
215
+ assert(selfApply.error === types_1.CarpoolErrorCode.SELF_APPLY, '错误码为 SELF_APPLY');
216
+ // 查看申请列表
217
+ const detail = carpool.getTrip(tripId);
218
+ assert(detail.pending_applications.length === 1, '有 1 个待处理申请');
219
+ assert(detail.pending_applications[0].applicant.id === lisi.id, '申请人为李四');
220
+ // ============================================================================
221
+ // Test 6: Handle Application (T17.3 + T17.5)
222
+ // ============================================================================
223
+ section('6. 处理申请(接受/拒绝)');
224
+ // 张三接受李四的申请
225
+ const accepted = carpool.handleApplication(zhangsan.id, tripId, lisi.id, true);
226
+ assert(accepted === true, '接受李四的申请');
227
+ // 验证座位更新
228
+ const afterAccept = carpool.getTrip(tripId);
229
+ assert(afterAccept.trip.properties.current_passengers === 1, '当前乘客数更新为 1');
230
+ assert(afterAccept.trip.properties.status === 'open', '行程仍为 open(还有 2 个空位)');
231
+ assert(afterAccept.confirmed_passengers.length === 1, '已确认乘客 1 人');
232
+ assert(afterAccept.confirmed_passengers[0].id === lisi.id, '已确认乘客为李四');
233
+ assert(afterAccept.pending_applications.length === 0, '待处理申请清空');
234
+ // 王五申请并被接受
235
+ const wangwuApply = carpool.applyToTrip(wangwu.id, tripId);
236
+ assert(wangwuApply.success === true, '王五申请成功');
237
+ carpool.handleApplication(zhangsan.id, tripId, wangwu.id, true);
238
+ // 赵六申请并被接受 → 行程应变为 full
239
+ const zhaoliuApply = carpool.applyToTrip(zhaoliu.id, tripId);
240
+ assert(zhaoliuApply.success === true, '赵六申请成功');
241
+ carpool.handleApplication(zhangsan.id, tripId, zhaoliu.id, true);
242
+ const fullTrip = carpool.getTrip(tripId);
243
+ assert(fullTrip.trip.properties.current_passengers === 3, '当前乘客数为 3');
244
+ assert(fullTrip.trip.properties.status === 'full', '行程状态自动变为 full');
245
+ // ============================================================================
246
+ // Test 7: Leave Trip (T17.5)
247
+ // ============================================================================
248
+ section('7. 乘客退出');
249
+ const left = carpool.leaveTrip(tripId, zhaoliu.id);
250
+ assert(left === true, '赵六退出行程');
251
+ const afterLeave = carpool.getTrip(tripId);
252
+ assert(afterLeave.trip.properties.current_passengers === 2, '乘客数减为 2');
253
+ assert(afterLeave.trip.properties.status === 'open', '行程状态恢复为 open');
254
+ // ============================================================================
255
+ // Test 8: Complete & Rate Trip (T17.4 + T17.6)
256
+ // ============================================================================
257
+ section('8. 完成行程与评价');
258
+ // 非发布者不能完成
259
+ assertThrows(() => carpool.completeTrip(tripId, lisi.id), types_1.CarpoolErrorCode.NOT_PUBLISHER, '非发布者无法完成行程');
260
+ const completed = carpool.completeTrip(tripId, zhangsan.id);
261
+ assert(completed === true, '张三完成行程');
262
+ const completedTrip = carpool.getTrip(tripId);
263
+ assert(completedTrip.trip.properties.status === 'completed', '行程状态为 completed');
264
+ // 评价
265
+ const rated1 = carpool.rateTrip(lisi.id, tripId, 5.0, '车很干净舒适!');
266
+ assert(rated1 === true, '李四评价 5 分');
267
+ const rated2 = carpool.rateTrip(wangwu.id, tripId, 4.5, '司机人很好');
268
+ assert(rated2 === true, '王五评价 4.5 分');
269
+ // 获取评分
270
+ const avgRating = carpool.getPersonAverageRating(zhangsan.id);
271
+ assert(Math.abs(avgRating - 4.75) < 0.01, `张三平均评分为 4.75 (实际: ${avgRating})`);
272
+ // ============================================================================
273
+ // Test 9: Cancel Trip (T17.4)
274
+ // ============================================================================
275
+ section('9. 取消行程');
276
+ const trip2 = carpool.publishTrip(zhangsan.id, {
277
+ trip_type: 'offer',
278
+ departure_date: tomorrowStr,
279
+ origin: { province: '北京', city: '北京' },
280
+ destination: { province: '河南', city: '郑州' },
281
+ max_passengers: 2,
282
+ });
283
+ const cancelled = carpool.cancelTrip(trip2.trip.id, zhangsan.id);
284
+ assert(cancelled === true, '取消行程成功');
285
+ const cancelledTrip = carpool.getTrip(trip2.trip.id);
286
+ assert(cancelledTrip.trip.properties.status === 'cancelled', '行程状态为 cancelled');
287
+ // 不能申请已取消的行程
288
+ const applyCancel = carpool.applyToTrip(lisi.id, trip2.trip.id);
289
+ assert(applyCancel.success === false, '不能申请已取消的行程');
290
+ assert(applyCancel.error === types_1.CarpoolErrorCode.TRIP_CANCELLED, '错误码为 TRIP_CANCELLED');
291
+ // ============================================================================
292
+ // Test 10: Ride Request Mode (人找车)
293
+ // ============================================================================
294
+ section('10. 人找车模式');
295
+ const request = carpool.publishTrip(lisi.id, {
296
+ trip_type: 'request',
297
+ departure_date: tomorrowStr,
298
+ origin: { province: '北京', city: '北京' },
299
+ destination: { province: '河南', city: '漯河' },
300
+ max_passengers: 1,
301
+ price_type: 'share_cost',
302
+ notes: '一人,有驾照',
303
+ });
304
+ assert(request.trip.properties.trip_type === 'request', '行程类型为 request(人找车)');
305
+ // 司机搜索乘客需求
306
+ const passengerRequests = carpool.searchTrips({
307
+ trip_type: 'request',
308
+ destination_city: '漯河',
309
+ });
310
+ assert(passengerRequests.length === 1, '搜索到 1 个人找车需求');
311
+ // ============================================================================
312
+ // Test 11: Expired Trip Cleanup (T17.4)
313
+ // ============================================================================
314
+ section('11. 过期行程清理');
315
+ // 发布一个"过去"的行程(通过 repo 直接操作绕过日期校验)
316
+ const pastTrip = carpool.repo.createTrip(zhangsan.id, {
317
+ trip_type: 'offer',
318
+ departure_date: '2025-01-01', // 过去的日期
319
+ origin: { province: '北京', city: '北京' },
320
+ destination: { province: '河南', city: '漯河' },
321
+ max_passengers: 2,
322
+ });
323
+ const cleaned = carpool.cleanupExpiredTrips();
324
+ assert(cleaned >= 1, `清理了 ${cleaned} 个过期行程`);
325
+ const expiredTrip = carpool.repo.getTrip(pastTrip.id);
326
+ assert(expiredTrip.properties.status === 'expired', '过期行程状态为 expired');
327
+ // ============================================================================
328
+ // Test 12: Validators
329
+ // ============================================================================
330
+ section('12. 输入校验');
331
+ assertThrows(() => carpool.publishTrip(zhangsan.id, {
332
+ trip_type: 'offer',
333
+ departure_date: '2020-01-01',
334
+ origin: { province: '北京', city: '北京' },
335
+ destination: { province: '河南', city: '漯河' },
336
+ max_passengers: 3,
337
+ }), types_1.CarpoolErrorCode.INVALID_DATE, '过期日期被拒绝');
338
+ assertThrows(() => carpool.publishTrip(zhangsan.id, {
339
+ trip_type: 'offer',
340
+ departure_date: tomorrowStr,
341
+ origin: { province: '', city: '' },
342
+ destination: { province: '河南', city: '漯河' },
343
+ max_passengers: 3,
344
+ }), types_1.CarpoolErrorCode.INVALID_LOCATION, '空出发地被拒绝');
345
+ assertThrows(() => carpool.publishTrip(zhangsan.id, {
346
+ trip_type: 'offer',
347
+ departure_date: tomorrowStr,
348
+ origin: { province: '北京', city: '北京' },
349
+ destination: { province: '河南', city: '漯河' },
350
+ max_passengers: 0,
351
+ }), types_1.CarpoolErrorCode.INVALID_PASSENGERS, '乘客数 0 被拒绝');
352
+ assertThrows(() => carpool.publishTrip(zhangsan.id, {
353
+ trip_type: 'offer',
354
+ departure_date: tomorrowStr,
355
+ origin: { province: '北京', city: '北京' },
356
+ destination: { province: '河南', city: '漯河' },
357
+ max_passengers: 10,
358
+ }), types_1.CarpoolErrorCode.INVALID_PASSENGERS, '乘客数 10 被拒绝(最大 7)');
359
+ // ============================================================================
360
+ // Test 13: Person Trips Query
361
+ // ============================================================================
362
+ section('13. 个人行程查询');
363
+ const zhangsanTrips = carpool.getPersonTrips(zhangsan.id);
364
+ assert(zhangsanTrips.length >= 2, `张三发布了 ${zhangsanTrips.length} 个行程`);
365
+ const lisiJoined = carpool.repo.getPersonJoinedTrips(lisi.id);
366
+ assert(lisiJoined.length === 1, `李四已加入 ${lisiJoined.length} 个行程`);
367
+ // ============================================================================
368
+ // Summary
369
+ // ============================================================================
370
+ console.log('\n' + '═'.repeat(50));
371
+ console.log(`测试完成: ${passed} 通过, ${failed} 失败`);
372
+ if (failures.length > 0) {
373
+ console.log('\n失败项:');
374
+ for (const f of failures) {
375
+ console.log(` ❌ ${f}`);
376
+ }
377
+ }
378
+ // Cleanup
379
+ try {
380
+ fs.rmSync(testDir, { recursive: true, force: true });
381
+ console.log(`\n测试目录已清理: ${testDir}`);
382
+ }
383
+ catch {
384
+ console.log(`\n请手动清理: ${testDir}`);
385
+ }
386
+ process.exit(failed > 0 ? 1 : 0);
387
+ //# sourceMappingURL=carpool-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"carpool-test.js","sourceRoot":"","sources":["../../ts/carpool/carpool-test.ts"],"names":[],"mappings":";;AACA;;;;;;;GAOG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AACzB,wDAAmD;AACnD,uDAAmD;AACnD,mCAAyD;AAEzD,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E,IAAI,MAAM,GAAG,CAAC,CAAC;AACf,IAAI,MAAM,GAAG,CAAC,CAAC;AACf,MAAM,QAAQ,GAAa,EAAE,CAAC;AAE9B,SAAS,MAAM,CAAC,SAAkB,EAAE,OAAe;IACjD,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC;IAChC,CAAC;SAAM,CAAC;QACN,MAAM,EAAE,CAAC;QACT,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC;IAChC,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,EAAc,EAAE,YAA8B,EAAE,OAAe;IACnF,IAAI,CAAC;QACH,EAAE,EAAE,CAAC;QACL,MAAM,EAAE,CAAC;QACT,QAAQ,CAAC,IAAI,CAAC,GAAG,OAAO,UAAU,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,OAAO,OAAO,UAAU,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,YAAY,oBAAY,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACzD,MAAM,EAAE,CAAC;YACT,OAAO,CAAC,GAAG,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,MAAM,EAAE,CAAC;YACT,QAAQ,CAAC,IAAI,CAAC,GAAG,OAAO,aAAa,CAAC,YAAY,oBAAY,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAChF,OAAO,CAAC,GAAG,CAAC,OAAO,OAAO,aAAa,CAAC,YAAY,oBAAY,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACpF,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,KAAa;IAC5B,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC;AACpC,CAAC;AAED,+EAA+E;AAC/E,QAAQ;AACR,+EAA+E;AAE/E,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;AACrE,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAE3C,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;AACjC,OAAO,CAAC,GAAG,CAAC,WAAW,OAAO,IAAI,CAAC,CAAC;AAEpC,MAAM,KAAK,GAAG,IAAI,+BAAa,CAAC;IAC9B,IAAI,EAAE,OAAO;IACb,UAAU,EAAE,CAAC;IACb,UAAU,EAAE,IAAI;CACjB,CAAC,CAAC;AAEH,MAAM,OAAO,GAAG,IAAI,gCAAc,CAAC,KAAK,CAAC,CAAC;AAE1C,+EAA+E;AAC/E,uBAAuB;AACvB,+EAA+E;AAE/E,OAAO,CAAC,WAAW,CAAC,CAAC;AAErB,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC;IAC/B,IAAI,EAAE,IAAI;IACV,UAAU,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE;CACvD,CAAC,CAAC;AACH,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;AAEhC,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC;IAC3B,IAAI,EAAE,IAAI;IACV,UAAU,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE;CACrD,CAAC,CAAC;AACH,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;AAE5B,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC;IAC7B,IAAI,EAAE,IAAI;IACV,UAAU,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;CAC/B,CAAC,CAAC;AACH,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;AAE9B,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC;IAC9B,IAAI,EAAE,IAAI;IACV,UAAU,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;CACjC,CAAC,CAAC;AACH,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;AAE/B,SAAS;AACT,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AAC5C,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AACxC,MAAM,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;AAC7B,MAAM,CAAC,IAAI,EAAE,4BAA4B,CAAC,CAAC;AAE3C,+EAA+E;AAC/E,+BAA+B;AAC/B,+EAA+E;AAE/E,OAAO,CAAC,SAAS,CAAC,CAAC;AAEnB,MAAM,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;AAC5B,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;AACzC,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAExD,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,EAAE;IAClD,SAAS,EAAE,OAAO;IAClB,cAAc,EAAE,WAAW;IAC3B,cAAc,EAAE,SAAS;IACzB,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE;IACvD,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;IAC3C,cAAc,EAAE,CAAC;IACjB,kBAAkB,EAAE,KAAK;IACzB,UAAU,EAAE,MAAM;IAClB,gBAAgB,EAAE,GAAG;IACrB,YAAY,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE;IACrD,YAAY,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;IAChE,KAAK,EAAE,aAAa;CACrB,CAAC,CAAC;AAEH,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;AAClC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC3B,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,MAAM,EAAE,YAAY,CAAC,CAAC;AACnE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,kBAAkB,KAAK,CAAC,EAAE,UAAU,CAAC,CAAC;AACxE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,KAAK,CAAC,EAAE,UAAU,CAAC,CAAC;AACpE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,KAAK,OAAO,EAAE,kBAAkB,CAAC,CAAC;AAC7E,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC1D,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE,SAAS,CAAC,CAAC;AACnE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,KAAK,IAAI,EAAE,SAAS,CAAC,CAAC;AAExE,+EAA+E;AAC/E,+BAA+B;AAC/B,+EAA+E;AAE/E,OAAO,CAAC,SAAS,CAAC,CAAC;AAEnB,MAAM,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC;IACxC,cAAc,EAAE,WAAW;IAC3B,WAAW,EAAE,IAAI;IACjB,SAAS,EAAE,OAAO;CACnB,CAAC,CAAC;AACH,MAAM,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,oBAAoB,CAAC,CAAC;AAEzD,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;IACvC,cAAc,EAAE,WAAW;IAC3B,WAAW,EAAE,IAAI;CAClB,CAAC,CAAC;AACH,MAAM,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,aAAa,CAAC,CAAC;AAEjD,MAAM,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC;IAC1C,oBAAoB,EAAE,IAAI;CAC3B,CAAC,CAAC;AACH,MAAM,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,gBAAgB,CAAC,CAAC;AAEvD,+EAA+E;AAC/E,iCAAiC;AACjC,+EAA+E;AAE/E,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAE3B,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE;IAC/C,cAAc,EAAE,WAAW;IAC3B,WAAW,EAAE,IAAI;CAClB,CAAC,CAAC;AACH,MAAM,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC;AAC/C,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,EAAE,iBAAiB,YAAY,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC;AACzF,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,KAAK,cAAc,EAAE,4BAA4B,CAAC,CAAC;AAC3F,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,oBAAoB,KAAK,CAAC,EAAE,UAAU,CAAC,CAAC;AAC3E,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,eAAe,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC;AAEzD,QAAQ;AACR,MAAM,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE;IACnD,cAAc,EAAE,WAAW;IAC3B,WAAW,EAAE,IAAI;CAClB,CAAC,CAAC;AACH,MAAM,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC;AAChD,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,KAAK,UAAU,EAAE,mBAAmB,CAAC,CAAC;AAE/E,+EAA+E;AAC/E,gCAAgC;AAChC,+EAA+E;AAE/E,OAAO,CAAC,WAAW,CAAC,CAAC;AAErB,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC;AAC5E,MAAM,CAAC,WAAW,CAAC,OAAO,KAAK,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC/C,MAAM,CAAC,WAAW,CAAC,MAAM,KAAK,SAAS,EAAE,eAAe,CAAC,CAAC;AAE1D,SAAS;AACT,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;AACtD,MAAM,CAAC,QAAQ,CAAC,OAAO,KAAK,KAAK,EAAE,SAAS,CAAC,CAAC;AAC9C,MAAM,CAAC,QAAQ,CAAC,KAAK,KAAK,wBAAgB,CAAC,eAAe,EAAE,sBAAsB,CAAC,CAAC;AAEpF,YAAY;AACZ,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;AAC3D,MAAM,CAAC,SAAS,CAAC,OAAO,KAAK,KAAK,EAAE,WAAW,CAAC,CAAC;AACjD,MAAM,CAAC,SAAS,CAAC,KAAK,KAAK,wBAAgB,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;AAE3E,SAAS;AACT,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AACvC,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,MAAM,KAAK,CAAC,EAAE,YAAY,CAAC,CAAC;AAC/D,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;AAE1E,+EAA+E;AAC/E,6CAA6C;AAC7C,+EAA+E;AAE/E,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAE1B,YAAY;AACZ,MAAM,QAAQ,GAAG,OAAO,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;AAC/E,MAAM,CAAC,QAAQ,KAAK,IAAI,EAAE,SAAS,CAAC,CAAC;AAErC,SAAS;AACT,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AAC5C,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,kBAAkB,KAAK,CAAC,EAAE,YAAY,CAAC,CAAC;AAC3E,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,MAAM,EAAE,qBAAqB,CAAC,CAAC;AAC7E,MAAM,CAAC,WAAW,CAAC,oBAAoB,CAAC,MAAM,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC;AACnE,MAAM,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;AACvE,MAAM,CAAC,WAAW,CAAC,oBAAoB,CAAC,MAAM,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC;AAEjE,WAAW;AACX,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;AAC3D,MAAM,CAAC,WAAW,CAAC,OAAO,KAAK,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC/C,OAAO,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;AAEhE,wBAAwB;AACxB,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;AAC7D,MAAM,CAAC,YAAY,CAAC,OAAO,KAAK,IAAI,EAAE,QAAQ,CAAC,CAAC;AAChD,OAAO,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;AAEjE,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AACzC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,kBAAkB,KAAK,CAAC,EAAE,UAAU,CAAC,CAAC;AACtE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,MAAM,EAAE,eAAe,CAAC,CAAC;AAEpE,+EAA+E;AAC/E,6BAA6B;AAC7B,+EAA+E;AAE/E,OAAO,CAAC,SAAS,CAAC,CAAC;AAEnB,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;AACnD,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE,QAAQ,CAAC,CAAC;AAEhC,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AAC3C,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,kBAAkB,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC;AACvE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,MAAM,EAAE,cAAc,CAAC,CAAC;AAErE,+EAA+E;AAC/E,+CAA+C;AAC/C,+EAA+E;AAE/E,OAAO,CAAC,YAAY,CAAC,CAAC;AAEtB,WAAW;AACX,YAAY,CACV,GAAG,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,EAC3C,wBAAgB,CAAC,aAAa,EAC9B,YAAY,CACb,CAAC;AAEF,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC5D,MAAM,CAAC,SAAS,KAAK,IAAI,EAAE,QAAQ,CAAC,CAAC;AAErC,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AAC9C,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,WAAW,EAAE,iBAAiB,CAAC,CAAC;AAEhF,KAAK;AACL,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;AACjE,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,UAAU,CAAC,CAAC;AAEpC,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;AACjE,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,YAAY,CAAC,CAAC;AAEtC,OAAO;AACP,MAAM,SAAS,GAAG,OAAO,CAAC,sBAAsB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC9D,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE,qBAAqB,SAAS,GAAG,CAAC,CAAC;AAE7E,+EAA+E;AAC/E,8BAA8B;AAC9B,+EAA+E;AAE/E,OAAO,CAAC,SAAS,CAAC,CAAC;AAEnB,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,EAAE;IAC7C,SAAS,EAAE,OAAO;IAClB,cAAc,EAAE,WAAW;IAC3B,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;IACtC,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;IAC3C,cAAc,EAAE,CAAC;CAClB,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;AACjE,MAAM,CAAC,SAAS,KAAK,IAAI,EAAE,QAAQ,CAAC,CAAC;AAErC,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACrD,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,WAAW,EAAE,iBAAiB,CAAC,CAAC;AAEhF,aAAa;AACb,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAChE,MAAM,CAAC,WAAW,CAAC,OAAO,KAAK,KAAK,EAAE,YAAY,CAAC,CAAC;AACpD,MAAM,CAAC,WAAW,CAAC,KAAK,KAAK,wBAAgB,CAAC,cAAc,EAAE,qBAAqB,CAAC,CAAC;AAErF,+EAA+E;AAC/E,mCAAmC;AACnC,+EAA+E;AAE/E,OAAO,CAAC,WAAW,CAAC,CAAC;AAErB,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE;IAC3C,SAAS,EAAE,SAAS;IACpB,cAAc,EAAE,WAAW;IAC3B,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;IACtC,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;IAC3C,cAAc,EAAE,CAAC;IACjB,UAAU,EAAE,YAAY;IACxB,KAAK,EAAE,QAAQ;CAChB,CAAC,CAAC;AACH,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,KAAK,SAAS,EAAE,oBAAoB,CAAC,CAAC;AAE9E,WAAW;AACX,MAAM,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC;IAC5C,SAAS,EAAE,SAAS;IACpB,gBAAgB,EAAE,IAAI;CACvB,CAAC,CAAC;AACH,MAAM,CAAC,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,cAAc,CAAC,CAAC;AAEvD,+EAA+E;AAC/E,wCAAwC;AACxC,+EAA+E;AAE/E,OAAO,CAAC,YAAY,CAAC,CAAC;AAEtB,kCAAkC;AAClC,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,EAAE;IACpD,SAAS,EAAE,OAAO;IAClB,cAAc,EAAE,YAAY,EAAE,QAAQ;IACtC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;IACtC,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;IAC3C,cAAc,EAAE,CAAC;CAClB,CAAC,CAAC;AAEH,MAAM,OAAO,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;AAC9C,MAAM,CAAC,OAAO,IAAI,CAAC,EAAE,OAAO,OAAO,QAAQ,CAAC,CAAC;AAE7C,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AACtD,MAAM,CAAC,WAAY,CAAC,UAAU,CAAC,MAAM,KAAK,SAAS,EAAE,iBAAiB,CAAC,CAAC;AAExE,+EAA+E;AAC/E,sBAAsB;AACtB,+EAA+E;AAE/E,OAAO,CAAC,UAAU,CAAC,CAAC;AAEpB,YAAY,CACV,GAAG,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,EAAE;IACrC,SAAS,EAAE,OAAO;IAClB,cAAc,EAAE,YAAY;IAC5B,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;IACtC,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;IAC3C,cAAc,EAAE,CAAC;CAClB,CAAC,EACF,wBAAgB,CAAC,YAAY,EAC7B,SAAS,CACV,CAAC;AAEF,YAAY,CACV,GAAG,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,EAAE;IACrC,SAAS,EAAE,OAAO;IAClB,cAAc,EAAE,WAAW;IAC3B,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;IAClC,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;IAC3C,cAAc,EAAE,CAAC;CAClB,CAAC,EACF,wBAAgB,CAAC,gBAAgB,EACjC,SAAS,CACV,CAAC;AAEF,YAAY,CACV,GAAG,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,EAAE;IACrC,SAAS,EAAE,OAAO;IAClB,cAAc,EAAE,WAAW;IAC3B,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;IACtC,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;IAC3C,cAAc,EAAE,CAAC;CAClB,CAAC,EACF,wBAAgB,CAAC,kBAAkB,EACnC,WAAW,CACZ,CAAC;AAEF,YAAY,CACV,GAAG,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,EAAE;IACrC,SAAS,EAAE,OAAO;IAClB,cAAc,EAAE,WAAW;IAC3B,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;IACtC,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;IAC3C,cAAc,EAAE,EAAE;CACnB,CAAC,EACF,wBAAgB,CAAC,kBAAkB,EACnC,kBAAkB,CACnB,CAAC;AAEF,+EAA+E;AAC/E,8BAA8B;AAC9B,+EAA+E;AAE/E,OAAO,CAAC,YAAY,CAAC,CAAC;AAEtB,MAAM,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC1D,MAAM,CAAC,aAAa,CAAC,MAAM,IAAI,CAAC,EAAE,SAAS,aAAa,CAAC,MAAM,MAAM,CAAC,CAAC;AAEvE,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC9D,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,SAAS,UAAU,CAAC,MAAM,MAAM,CAAC,CAAC;AAElE,+EAA+E;AAC/E,UAAU;AACV,+EAA+E;AAE/E,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AACnC,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,QAAQ,MAAM,KAAK,CAAC,CAAC;AAEhD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;IACxB,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtB,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,UAAU;AACV,IAAI,CAAC;IACH,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,cAAc,OAAO,EAAE,CAAC,CAAC;AACvC,CAAC;AAAC,MAAM,CAAC;IACP,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC;AACrC,CAAC;AAED,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Carpool Module - 顺风车/拼车功能
3
+ *
4
+ * 基于 SocialGraphV2 构建的拼车功能模块。
5
+ * 支持车找人和人找车两种模式,利用社交图谱提供信任增强的拼车匹配。
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { SocialGraphV2 } from '../social-graph-v2';
10
+ * import { CarpoolService } from './carpool';
11
+ *
12
+ * const graph = new SocialGraphV2({ path: './data/social' });
13
+ * const carpool = new CarpoolService(graph);
14
+ *
15
+ * // 发布行程
16
+ * const trip = carpool.publishTrip(driverId, {
17
+ * trip_type: 'offer',
18
+ * departure_date: '2026-02-12',
19
+ * origin: { province: '北京', city: '北京', district: '西城区' },
20
+ * destination: { province: '河南', city: '漯河' },
21
+ * max_passengers: 3,
22
+ * });
23
+ *
24
+ * // 智能匹配(含社交信任排序)
25
+ * const results = carpool.matchTrips(passengerId, {
26
+ * departure_date: '2026-02-12',
27
+ * origin_city: '北京',
28
+ * destination_province: '河南',
29
+ * });
30
+ * ```
31
+ */
32
+ export { CarpoolService } from './carpool-service';
33
+ export { CarpoolRepository } from './carpool-repo';
34
+ export { CarpoolMatcher, type MatchWeights } from './carpool-matcher';
35
+ export { TrustEvaluator } from './trust-evaluator';
36
+ export { TripIndex } from './trip-index';
37
+ export { TripScheduler, type SchedulerConfig, type CleanupResult } from './trip-scheduler';
38
+ export { PrivacyGuard, type PrivacyConfig, type VisibilityLevel } from './privacy-guard';
39
+ export { ReportSystem, type Report, type ReportReason, type CreditScore, } from './report-system';
40
+ export { validateCreateTripInput, validateApplyTripInput, validateRating, validateDate, validateDateNotExpired, validateLocation, validateLicensePlate, validateRegisterVehicleInput, validateUpdateVehicleInput, } from './validators';
41
+ export { type TripType, type TripStatus, type GenderRequirement, type PriceType, type ApplicationStatus, type ContactType, type TrustLevel, type DepartureTimePeriod, type Location, type VehicleInfo, type TripRequirements, type TripProperties, type CarpoolTrip, type VehicleStatus, type FuelType, type VehicleProperties, type CarpoolVehicle, type RegisterVehicleInput, type UpdateVehicleInput, type VehicleDetail, type CreateTripInput, type UpdateTripInput, type ApplyTripInput, type SearchTripsFilter, type TrustScore, type MatchResult, type TripDetail, type TripApplication, type ApplicationResult, CarpoolErrorCode, CarpoolError, ENTITY_TYPE_CARPOOL_TRIP, ENTITY_TYPE_VEHICLE, RELATION_TYPES, } from './types';
42
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../ts/carpool/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGnD,OAAO,EAAE,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGtE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC,OAAO,EAAE,aAAa,EAAE,KAAK,eAAe,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAG3F,OAAO,EAAE,YAAY,EAAE,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGzF,OAAO,EACL,YAAY,EACZ,KAAK,MAAM,EACX,KAAK,YAAY,EACjB,KAAK,WAAW,GACjB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,cAAc,EACd,YAAY,EACZ,sBAAsB,EACtB,gBAAgB,EAEhB,oBAAoB,EACpB,4BAA4B,EAC5B,0BAA0B,GAC3B,MAAM,cAAc,CAAC;AAGtB,OAAO,EAEL,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,SAAS,EACd,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,mBAAmB,EAGxB,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,WAAW,EAGhB,KAAK,aAAa,EAClB,KAAK,QAAQ,EACb,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAGlB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,cAAc,EAGnB,KAAK,iBAAiB,EAGtB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,iBAAiB,EAGtB,gBAAgB,EAChB,YAAY,EAGZ,wBAAwB,EACxB,mBAAmB,EACnB,cAAc,GACf,MAAM,SAAS,CAAC"}
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ /**
3
+ * Carpool Module - 顺风车/拼车功能
4
+ *
5
+ * 基于 SocialGraphV2 构建的拼车功能模块。
6
+ * 支持车找人和人找车两种模式,利用社交图谱提供信任增强的拼车匹配。
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * import { SocialGraphV2 } from '../social-graph-v2';
11
+ * import { CarpoolService } from './carpool';
12
+ *
13
+ * const graph = new SocialGraphV2({ path: './data/social' });
14
+ * const carpool = new CarpoolService(graph);
15
+ *
16
+ * // 发布行程
17
+ * const trip = carpool.publishTrip(driverId, {
18
+ * trip_type: 'offer',
19
+ * departure_date: '2026-02-12',
20
+ * origin: { province: '北京', city: '北京', district: '西城区' },
21
+ * destination: { province: '河南', city: '漯河' },
22
+ * max_passengers: 3,
23
+ * });
24
+ *
25
+ * // 智能匹配(含社交信任排序)
26
+ * const results = carpool.matchTrips(passengerId, {
27
+ * departure_date: '2026-02-12',
28
+ * origin_city: '北京',
29
+ * destination_province: '河南',
30
+ * });
31
+ * ```
32
+ */
33
+ Object.defineProperty(exports, "__esModule", { value: true });
34
+ exports.RELATION_TYPES = exports.ENTITY_TYPE_VEHICLE = exports.ENTITY_TYPE_CARPOOL_TRIP = exports.CarpoolError = exports.CarpoolErrorCode = exports.validateUpdateVehicleInput = exports.validateRegisterVehicleInput = exports.validateLicensePlate = exports.validateLocation = exports.validateDateNotExpired = exports.validateDate = exports.validateRating = exports.validateApplyTripInput = exports.validateCreateTripInput = exports.ReportSystem = exports.PrivacyGuard = exports.TripScheduler = exports.TripIndex = exports.TrustEvaluator = exports.CarpoolMatcher = exports.CarpoolRepository = exports.CarpoolService = void 0;
35
+ // Core Service
36
+ var carpool_service_1 = require("./carpool-service");
37
+ Object.defineProperty(exports, "CarpoolService", { enumerable: true, get: function () { return carpool_service_1.CarpoolService; } });
38
+ // Repository (for advanced use)
39
+ var carpool_repo_1 = require("./carpool-repo");
40
+ Object.defineProperty(exports, "CarpoolRepository", { enumerable: true, get: function () { return carpool_repo_1.CarpoolRepository; } });
41
+ // Matching Engine
42
+ var carpool_matcher_1 = require("./carpool-matcher");
43
+ Object.defineProperty(exports, "CarpoolMatcher", { enumerable: true, get: function () { return carpool_matcher_1.CarpoolMatcher; } });
44
+ // Trust Evaluator
45
+ var trust_evaluator_1 = require("./trust-evaluator");
46
+ Object.defineProperty(exports, "TrustEvaluator", { enumerable: true, get: function () { return trust_evaluator_1.TrustEvaluator; } });
47
+ // Index (T20.1)
48
+ var trip_index_1 = require("./trip-index");
49
+ Object.defineProperty(exports, "TripIndex", { enumerable: true, get: function () { return trip_index_1.TripIndex; } });
50
+ // Scheduler (T20.2)
51
+ var trip_scheduler_1 = require("./trip-scheduler");
52
+ Object.defineProperty(exports, "TripScheduler", { enumerable: true, get: function () { return trip_scheduler_1.TripScheduler; } });
53
+ // Privacy Guard (T20.3)
54
+ var privacy_guard_1 = require("./privacy-guard");
55
+ Object.defineProperty(exports, "PrivacyGuard", { enumerable: true, get: function () { return privacy_guard_1.PrivacyGuard; } });
56
+ // Report System (T20.4)
57
+ var report_system_1 = require("./report-system");
58
+ Object.defineProperty(exports, "ReportSystem", { enumerable: true, get: function () { return report_system_1.ReportSystem; } });
59
+ // Validators
60
+ var validators_1 = require("./validators");
61
+ Object.defineProperty(exports, "validateCreateTripInput", { enumerable: true, get: function () { return validators_1.validateCreateTripInput; } });
62
+ Object.defineProperty(exports, "validateApplyTripInput", { enumerable: true, get: function () { return validators_1.validateApplyTripInput; } });
63
+ Object.defineProperty(exports, "validateRating", { enumerable: true, get: function () { return validators_1.validateRating; } });
64
+ Object.defineProperty(exports, "validateDate", { enumerable: true, get: function () { return validators_1.validateDate; } });
65
+ Object.defineProperty(exports, "validateDateNotExpired", { enumerable: true, get: function () { return validators_1.validateDateNotExpired; } });
66
+ Object.defineProperty(exports, "validateLocation", { enumerable: true, get: function () { return validators_1.validateLocation; } });
67
+ // Vehicle validators (V2 - T21.7)
68
+ Object.defineProperty(exports, "validateLicensePlate", { enumerable: true, get: function () { return validators_1.validateLicensePlate; } });
69
+ Object.defineProperty(exports, "validateRegisterVehicleInput", { enumerable: true, get: function () { return validators_1.validateRegisterVehicleInput; } });
70
+ Object.defineProperty(exports, "validateUpdateVehicleInput", { enumerable: true, get: function () { return validators_1.validateUpdateVehicleInput; } });
71
+ // Types
72
+ var types_1 = require("./types");
73
+ // Error Types
74
+ Object.defineProperty(exports, "CarpoolErrorCode", { enumerable: true, get: function () { return types_1.CarpoolErrorCode; } });
75
+ Object.defineProperty(exports, "CarpoolError", { enumerable: true, get: function () { return types_1.CarpoolError; } });
76
+ // Constants
77
+ Object.defineProperty(exports, "ENTITY_TYPE_CARPOOL_TRIP", { enumerable: true, get: function () { return types_1.ENTITY_TYPE_CARPOOL_TRIP; } });
78
+ Object.defineProperty(exports, "ENTITY_TYPE_VEHICLE", { enumerable: true, get: function () { return types_1.ENTITY_TYPE_VEHICLE; } });
79
+ Object.defineProperty(exports, "RELATION_TYPES", { enumerable: true, get: function () { return types_1.RELATION_TYPES; } });
80
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../ts/carpool/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;;;AAEH,eAAe;AACf,qDAAmD;AAA1C,iHAAA,cAAc,OAAA;AAEvB,gCAAgC;AAChC,+CAAmD;AAA1C,iHAAA,iBAAiB,OAAA;AAE1B,kBAAkB;AAClB,qDAAsE;AAA7D,iHAAA,cAAc,OAAA;AAEvB,kBAAkB;AAClB,qDAAmD;AAA1C,iHAAA,cAAc,OAAA;AAEvB,gBAAgB;AAChB,2CAAyC;AAAhC,uGAAA,SAAS,OAAA;AAElB,oBAAoB;AACpB,mDAA2F;AAAlF,+GAAA,aAAa,OAAA;AAEtB,wBAAwB;AACxB,iDAAyF;AAAhF,6GAAA,YAAY,OAAA;AAErB,wBAAwB;AACxB,iDAKyB;AAJvB,6GAAA,YAAY,OAAA;AAMd,aAAa;AACb,2CAWsB;AAVpB,qHAAA,uBAAuB,OAAA;AACvB,oHAAA,sBAAsB,OAAA;AACtB,4GAAA,cAAc,OAAA;AACd,0GAAA,YAAY,OAAA;AACZ,oHAAA,sBAAsB,OAAA;AACtB,8GAAA,gBAAgB,OAAA;AAChB,kCAAkC;AAClC,kHAAA,oBAAoB,OAAA;AACpB,0HAAA,4BAA4B,OAAA;AAC5B,wHAAA,0BAA0B,OAAA;AAG5B,QAAQ;AACR,iCAkDiB;AARf,cAAc;AACd,yGAAA,gBAAgB,OAAA;AAChB,qGAAA,YAAY,OAAA;AAEZ,YAAY;AACZ,iHAAA,wBAAwB,OAAA;AACxB,4GAAA,mBAAmB,OAAA;AACnB,uGAAA,cAAc,OAAA"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Privacy Guard - Contact Encryption & Trip Visibility Control (T20.3)
3
+ *
4
+ * 隐私安全加固:
5
+ * - 联系方式脱敏/加密
6
+ * - 行程可见性控制(仅好友可见、仅认证用户可见等)
7
+ * - 个人信息保护
8
+ */
9
+ import type { SocialGraphV2 } from '../social-graph-v2';
10
+ import type { CarpoolTrip, TripDetail } from './types';
11
+ /** 可见性级别 */
12
+ export type VisibilityLevel = 'public' | 'friends_only' | 'verified_only' | 'private';
13
+ /** 隐私配置 */
14
+ export interface PrivacyConfig {
15
+ /** 默认行程可见性 */
16
+ defaultVisibility: VisibilityLevel;
17
+ /** 联系方式仅对已确认乘客/发布者可见 */
18
+ contactOnlyForConfirmed: boolean;
19
+ /** 是否对非关联方脱敏联系方式 */
20
+ maskContactForStrangers: boolean;
21
+ /** 对搜索结果隐藏的字段列表 */
22
+ hiddenFieldsInSearch: string[];
23
+ }
24
+ export declare class PrivacyGuard {
25
+ private graph;
26
+ private config;
27
+ constructor(graph: SocialGraphV2, config?: Partial<PrivacyConfig>);
28
+ /**
29
+ * 对手机号脱敏:保留前3位和后4位
30
+ * 例如: 13812345678 → 138****5678
31
+ */
32
+ maskPhone(phone: string): string;
33
+ /**
34
+ * 对微信号脱敏:保留前2位和后2位
35
+ * 例如: wxid_abc123xyz → wx*********yz
36
+ */
37
+ maskWechat(wechat: string): string;
38
+ /**
39
+ * 通用联系方式脱敏
40
+ */
41
+ maskContact(contactType: string | undefined, contactValue: string | undefined): string | undefined;
42
+ /**
43
+ * 简单加密联系方式(XOR + Base64)
44
+ * 注意:这只是演示级别加密,生产环境应使用 AES-256-GCM
45
+ */
46
+ encrypt(plaintext: string, key: string): string;
47
+ /**
48
+ * 解密联系方式
49
+ */
50
+ decrypt(ciphertext: string, key: string): string;
51
+ /**
52
+ * 检查用户是否有权查看行程
53
+ */
54
+ canViewTrip(trip: CarpoolTrip, viewerId: string | undefined, publisherId: string, visibility?: VisibilityLevel): boolean;
55
+ /**
56
+ * 对行程详情应用隐私保护(脱敏/隐藏联系方式)
57
+ */
58
+ applyPrivacy(detail: TripDetail, viewerId: string | undefined): TripDetail;
59
+ /**
60
+ * 对搜索结果列表批量脱敏
61
+ */
62
+ sanitizeSearchResults(trips: CarpoolTrip[]): CarpoolTrip[];
63
+ private areFriendsOrConnected;
64
+ private stringToBytes;
65
+ private bytesToString;
66
+ private bytesToBase64;
67
+ private base64ToBytes;
68
+ }
69
+ //# sourceMappingURL=privacy-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"privacy-guard.d.ts","sourceRoot":"","sources":["../../ts/carpool/privacy-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAMvD,YAAY;AACZ,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,cAAc,GAAG,eAAe,GAAG,SAAS,CAAC;AAEtF,WAAW;AACX,MAAM,WAAW,aAAa;IAC5B,cAAc;IACd,iBAAiB,EAAE,eAAe,CAAC;IACnC,wBAAwB;IACxB,uBAAuB,EAAE,OAAO,CAAC;IACjC,oBAAoB;IACpB,uBAAuB,EAAE,OAAO,CAAC;IACjC,mBAAmB;IACnB,oBAAoB,EAAE,MAAM,EAAE,CAAC;CAChC;AAaD,qBAAa,YAAY;IAIrB,OAAO,CAAC,KAAK;IAHf,OAAO,CAAC,MAAM,CAAgB;gBAGpB,KAAK,EAAE,aAAa,EAC5B,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC;IASjC;;;OAGG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAOhC;;;OAGG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAQlC;;OAEG;IACH,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,YAAY,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS;IAYlG;;;OAGG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM;IAY/C;;OAEG;IACH,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM;IAgBhD;;OAEG;IACH,WAAW,CACT,IAAI,EAAE,WAAW,EACjB,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,WAAW,EAAE,MAAM,EACnB,UAAU,GAAE,eAA+C,GAC1D,OAAO;IAyBV;;OAEG;IACH,YAAY,CACV,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,UAAU;IAgCb;;OAEG;IACH,qBAAqB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE;IAqB1D,OAAO,CAAC,qBAAqB;IAQ7B,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,aAAa;CAQtB"}