@chatbi-v/mocks 2.1.5 → 2.1.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.
@@ -1,25 +1,78 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
1
30
  // src/index.ts
2
- import { dateUtils as dateUtils3 } from "@chatbi-v/core";
31
+ var index_exports = {};
32
+ __export(index_exports, {
33
+ ChatStreamStrategy: () => ChatStreamStrategy,
34
+ HistoryStreamStrategy: () => HistoryStreamStrategy,
35
+ JsonStrategy: () => JsonStrategy,
36
+ MOCK_FAVORITES: () => MOCK_FAVORITES,
37
+ MOCK_SCENES: () => MOCK_SCENES,
38
+ MOCK_SESSIONS: () => MOCK_SESSIONS,
39
+ MOCK_USER: () => MOCK_USER,
40
+ MockAdapter: () => MockAdapter,
41
+ MockResponseGenerator: () => MockResponseGenerator,
42
+ SsePageStrategy: () => SsePageStrategy,
43
+ SseStrategy: () => SseStrategy,
44
+ StrategyFactory: () => StrategyFactory,
45
+ createChatStream: () => createChatStream,
46
+ createHistoryStream: () => createHistoryStream,
47
+ eventsToStream: () => eventsToStream,
48
+ flatEvents: () => flatEvents,
49
+ generateMockMessages: () => generateMockMessages,
50
+ installFetchMock: () => installFetchMock,
51
+ installSSEMock: () => installSSEMock,
52
+ mockData: () => mockData,
53
+ processTemplate: () => processTemplate,
54
+ setupMock: () => setupMock,
55
+ sleep: () => sleep
56
+ });
57
+ module.exports = __toCommonJS(index_exports);
58
+ var import_core3 = require("@chatbi-v/core");
3
59
 
4
60
  // src/adapter.ts
5
- import {
6
- createLogger,
7
- dateUtils as dateUtils2
8
- } from "@chatbi-v/core";
9
- import Mock3 from "mockjs";
61
+ var import_core2 = require("@chatbi-v/core");
62
+ var import_mockjs3 = __toESM(require("mockjs"), 1);
10
63
 
11
64
  // src/strategies.ts
12
- import Mock2 from "mockjs";
65
+ var import_mockjs2 = __toESM(require("mockjs"), 1);
13
66
 
14
67
  // src/generator.ts
15
- import { dateUtils } from "@chatbi-v/core";
68
+ var import_core = require("@chatbi-v/core");
16
69
  var MockResponseGenerator = class {
17
70
  events = [];
18
71
  sessionId;
19
72
  agentName;
20
73
  currentTodos = [];
21
74
  constructor(agentName = "Assistant", sessionId) {
22
- this.sessionId = sessionId || "conv_" + dateUtils.now();
75
+ this.sessionId = sessionId || "conv_" + import_core.dateUtils.now();
23
76
  this.agentName = agentName;
24
77
  }
25
78
  /**
@@ -159,8 +212,8 @@ data: ${JSON.stringify(data)}
159
212
  };
160
213
 
161
214
  // src/utils.ts
162
- import dayjs from "dayjs";
163
- import Mock from "mockjs";
215
+ var import_dayjs = __toESM(require("dayjs"), 1);
216
+ var import_mockjs = __toESM(require("mockjs"), 1);
164
217
  var sleep = (ms) => new Promise((r) => setTimeout(r, ms));
165
218
  function processTemplate(data, context) {
166
219
  if (typeof data === "string") {
@@ -197,12 +250,12 @@ function flatEvents(eventsSchema, requestData = {}) {
197
250
  $body: requestData,
198
251
  $param: requestData?.param || requestData
199
252
  };
200
- Mock.Random.extend({
253
+ import_mockjs.default.Random.extend({
201
254
  $query: () => context.$query,
202
255
  $body: () => context.$body,
203
256
  $param: () => context.$param
204
257
  });
205
- const compiled = Mock.mock(eventsSchema);
258
+ const compiled = import_mockjs.default.mock(eventsSchema);
206
259
  return Object.values(compiled).flat().map((event) => processTemplate(event, context)).sort((a, b) => {
207
260
  const delayA = typeof a.delay === "number" ? a.delay : parseInt(String(a.delay || 0));
208
261
  const delayB = typeof b.delay === "number" ? b.delay : parseInt(String(b.delay || 0));
@@ -219,10 +272,10 @@ function eventsToStream(events) {
219
272
  }
220
273
  (async () => {
221
274
  try {
222
- const startTime = dayjs().valueOf();
275
+ const startTime = (0, import_dayjs.default)().valueOf();
223
276
  for (const eventItem of events) {
224
277
  const delay = typeof eventItem.delay === "number" ? eventItem.delay : parseInt(String(eventItem.delay || 0));
225
- const elapsed = dayjs().valueOf() - startTime;
278
+ const elapsed = (0, import_dayjs.default)().valueOf() - startTime;
226
279
  const remaining = Math.max(0, delay - elapsed);
227
280
  if (remaining > 0) {
228
281
  await sleep(remaining);
@@ -248,7 +301,7 @@ var ChatStreamStrategy = class {
248
301
  const config = schema;
249
302
  const defaultName = config.agentName || "BI\u52A9\u624B";
250
303
  const generator = new MockResponseGenerator(defaultName);
251
- const mockData2 = config.data ? Mock2.mock(config.data) : {};
304
+ const mockData2 = config.data ? import_mockjs2.default.mock(config.data) : {};
252
305
  if (config.plan) {
253
306
  generator.initPlan(config.plan);
254
307
  }
@@ -285,7 +338,7 @@ var HistoryStreamStrategy = class {
285
338
  generate(schema) {
286
339
  const config = schema;
287
340
  const generator = new MockResponseGenerator("BI\u52A9\u624B");
288
- const historyMock = Mock2.mock(config.template);
341
+ const historyMock = import_mockjs2.default.mock(config.template);
289
342
  const fullHistory = [...config.prepend || [], ...historyMock.list || historyMock];
290
343
  generator.emitHistory(fullHistory);
291
344
  return generator.toString().split("\n\n").map((chunk) => chunk + "\n\n");
@@ -295,7 +348,7 @@ var JsonStrategy = class {
295
348
  process(config, _requestParams) {
296
349
  const jsonConfig = config;
297
350
  if (!jsonConfig.responseSchema) return {};
298
- return Mock2.mock(jsonConfig.responseSchema);
351
+ return import_mockjs2.default.mock(jsonConfig.responseSchema);
299
352
  }
300
353
  };
301
354
  var SseStrategy = class {
@@ -317,12 +370,12 @@ var SsePageStrategy = class {
317
370
  $body: requestParams,
318
371
  $param: requestParams?.param || requestParams
319
372
  };
320
- Mock2.Random.extend({
373
+ import_mockjs2.default.Random.extend({
321
374
  $query: () => context.$query,
322
375
  $body: () => context.$body,
323
376
  $param: () => context.$param
324
377
  });
325
- let pageEvent = Mock2.mock(ssePageConfig.pageEvent);
378
+ let pageEvent = import_mockjs2.default.mock(ssePageConfig.pageEvent);
326
379
  pageEvent = processTemplate(pageEvent, context);
327
380
  let maxDelay = 0;
328
381
  if (events.length > 0) {
@@ -358,7 +411,7 @@ var StrategyFactory = {
358
411
  };
359
412
 
360
413
  // src/adapter.ts
361
- var logger = createLogger("MockAdapter");
414
+ var logger = (0, import_core2.createLogger)("MockAdapter");
362
415
  var MockAdapter = class _MockAdapter {
363
416
  delay;
364
417
  // 遗留策略(为了兼容旧版代码)
@@ -413,7 +466,7 @@ var MockAdapter = class _MockAdapter {
413
466
  const error = new Error(`Request failed with status code ${effectiveConfig.status}`);
414
467
  error.response = {
415
468
  status: effectiveConfig.status,
416
- data: Mock3.mock(schema),
469
+ data: import_mockjs3.default.mock(schema),
417
470
  headers: {}
418
471
  };
419
472
  reject(error);
@@ -472,10 +525,10 @@ var MockAdapter = class _MockAdapter {
472
525
  resolve();
473
526
  return;
474
527
  }
475
- const requestStart = dateUtils2.now();
528
+ const requestStart = import_core2.dateUtils.now();
476
529
  logger.info(`[SSE Start] Request: ${config.method} ${config.url}`, {
477
530
  params: config.data || config.params,
478
- time: dateUtils2.dayjs().toISOString()
531
+ time: import_core2.dateUtils.dayjs().toISOString()
479
532
  });
480
533
  let schema = endpointConfig.responseSchema;
481
534
  if (typeof schema === "function") {
@@ -491,7 +544,7 @@ var MockAdapter = class _MockAdapter {
491
544
  if (effectiveConfig.status !== 200) {
492
545
  const response = {
493
546
  status: effectiveConfig.status,
494
- data: Mock3.mock(schema),
547
+ data: import_mockjs3.default.mock(schema),
495
548
  headers: {}
496
549
  };
497
550
  if (callbacks.onResponse) {
@@ -527,7 +580,7 @@ var MockAdapter = class _MockAdapter {
527
580
  config.params || config.data
528
581
  );
529
582
  if (Array.isArray(events)) {
530
- const startTime = dateUtils2.now();
583
+ const startTime = import_core2.dateUtils.now();
531
584
  let eventCount = 0;
532
585
  logger.info(
533
586
  `[SSE Processing] Generated ${events.length} events for ${type} strategy`
@@ -535,12 +588,12 @@ var MockAdapter = class _MockAdapter {
535
588
  for (const event of events) {
536
589
  if (signal && signal.aborted) {
537
590
  logger.info(
538
- `[SSE Abort] Stream aborted by user after ${dateUtils2.now() - requestStart}ms`
591
+ `[SSE Abort] Stream aborted by user after ${import_core2.dateUtils.now() - requestStart}ms`
539
592
  );
540
593
  break;
541
594
  }
542
595
  const delay2 = typeof event.delay === "number" ? event.delay : parseInt(String(event.delay || 0));
543
- const elapsed = dateUtils2.now() - startTime;
596
+ const elapsed = import_core2.dateUtils.now() - startTime;
544
597
  const remaining = Math.max(0, delay2 - elapsed);
545
598
  if (remaining > 0) {
546
599
  await sleep(remaining);
@@ -569,7 +622,7 @@ data: ${JSON.stringify(event.data)}
569
622
  } else if (this.isLegacySchema(schema)) {
570
623
  chunks = this.generateAdvancedChunks(schema);
571
624
  } else {
572
- const mockData2 = Mock3.mock(schema);
625
+ const mockData2 = import_mockjs3.default.mock(schema);
573
626
  chunks = [`data: ${JSON.stringify(mockData2)}
574
627
 
575
628
  `];
@@ -587,7 +640,7 @@ data: ${JSON.stringify(event.data)}
587
640
  }
588
641
  if (!signal || !signal.aborted) {
589
642
  logger.info(
590
- `[SSE Complete] Stream finished successfully in ${dateUtils2.now() - requestStart}ms`
643
+ `[SSE Complete] Stream finished successfully in ${import_core2.dateUtils.now() - requestStart}ms`
591
644
  );
592
645
  if (onFinish) onFinish();
593
646
  }
@@ -760,7 +813,7 @@ var generateMockMessages = (sessionId) => [
760
813
  key: `msg_${sessionId}_1`,
761
814
  role: "assistant",
762
815
  content: `\u60A8\u597D\uFF01\u6211\u662F\u60A8\u7684\u667A\u80FD\u52A9\u624B\u3002\u5F53\u524D\u4F1A\u8BDD ID: ${sessionId}\u3002\u8BF7\u95EE\u6709\u4EC0\u4E48\u53EF\u4EE5\u5E2E\u60A8\uFF1F`,
763
- time: dateUtils3.dayjs(dateUtils3.now() - 1e4).toISOString()
816
+ time: import_core3.dateUtils.dayjs(import_core3.dateUtils.now() - 1e4).toISOString()
764
817
  }
765
818
  ];
766
819
  var mockData = {
@@ -771,7 +824,8 @@ var mockData = {
771
824
  favoritesList: MOCK_FAVORITES
772
825
  // Alias for compatibility if needed
773
826
  };
774
- export {
827
+ // Annotate the CommonJS export names for ESM import in node:
828
+ 0 && (module.exports = {
775
829
  ChatStreamStrategy,
776
830
  HistoryStreamStrategy,
777
831
  JsonStrategy,
@@ -795,5 +849,5 @@ export {
795
849
  processTemplate,
796
850
  setupMock,
797
851
  sleep
798
- };
799
- //# sourceMappingURL=index.mjs.map
852
+ });
853
+ //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/adapter.ts","../src/strategies.ts","../src/generator.ts","../src/utils.ts","../src/interceptor.ts","../src/types.ts"],"sourcesContent":["/**\n * @file index.ts\n * @description Mock 模块入口,导出模拟数据适配器、生成器及静态测试数据\n * @author ChatBI Team\n */\n\nimport { dateUtils } from '@chatbi-v/core';\n\n/**\n * Mock 数据模块\n * @description 提供前端开发所需的模拟数据适配器和工具\n */\n\nexport * from './adapter';\nexport * from './generator';\nexport * from './interceptor';\nexport * from './strategies';\nexport * from './types';\nexport * from './utils';\n\n/**\n * 模拟用户数据\n */\nexport const MOCK_USER = {\n id: 'u_001',\n name: 'Admin User',\n avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=Admin',\n role: 'admin',\n};\n\n// 保留原有的静态数据导出,以兼容可能直接引用的地方,但建议使用 adapter 自动生成\nexport const MOCK_SESSIONS = [\n { id: 's_001', title: '2024 Q1 销售分析', date: '2024-03-15', lastMessage: '好的,正在为您分析 Q1 销售数据...' },\n { id: 's_002', title: '用户增长趋势', date: '2024-03-10', lastMessage: '用户增长曲线显示...' },\n { id: 's_003', title: '竞品分析报告', date: '2024-03-08', lastMessage: '主要竞品 A 的市场份额...' },\n { id: 's_004', title: '营销活动复盘', date: '2024-03-05', lastMessage: 'ROI 提升了 15%...' },\n { id: 's_005', title: '财务报表审计', date: '2024-03-01', lastMessage: '请确认以下财务指标...' },\n];\n\nexport const MOCK_FAVORITES = [\n { id: 'fav-1', title: '季度销售总结', date: '2025/12/15' },\n { id: 'fav-2', title: '年度预算规划', date: '2025/12/10' },\n { id: 'fav-3', title: '核心指标监控', date: '2025/11/20' },\n];\n\nexport const MOCK_SCENES = [\n {\n id: '1',\n name: '销售数据分析',\n description: '全方位分析销售业绩,包括区域、产品、时间维度',\n code: 'SALES_001',\n creator: '管理员',\n createTime: '2023-01-01',\n tableCount: 5,\n kbCount: 2,\n qaCount: 10,\n cover: 'https://images.unsplash.com/photo-1551288049-bebda4e38f71?w=800&q=80',\n },\n {\n id: '2',\n name: '人力资源概览',\n description: '员工入职、离职、绩效分布与培训情况分析',\n code: 'HR_001',\n creator: 'HR 经理',\n createTime: '2023-02-15',\n tableCount: 3,\n kbCount: 1,\n qaCount: 5,\n cover: 'https://images.unsplash.com/photo-1460925895917-afdab827c52f?w=800&q=80',\n },\n {\n id: '3',\n name: '供应链优化',\n description: '库存周转、物流成本与供应商绩效评估',\n code: 'SCM_001',\n creator: '供应链总监',\n createTime: '2023-03-20',\n tableCount: 8,\n kbCount: 0,\n qaCount: 15,\n cover: 'https://images.unsplash.com/photo-1586528116311-ad8dd3c8310d?w=800&q=80',\n },\n];\n\nexport const generateMockMessages = (sessionId: string) => [\n {\n key: `msg_${sessionId}_1`,\n role: 'assistant',\n content: `您好!我是您的智能助手。当前会话 ID: ${sessionId}。请问有什么可以帮您?`,\n time: dateUtils.dayjs(dateUtils.now() - 10000).toISOString(),\n },\n];\n\nexport const mockData = {\n user: MOCK_USER,\n sessions: MOCK_SESSIONS,\n favorites: MOCK_FAVORITES,\n scenes: MOCK_SCENES,\n favoritesList: MOCK_FAVORITES, // Alias for compatibility if needed\n};\n","import {\n ApiAdapter,\n ApiEndpointConfig,\n ApiRequestConfig,\n createLogger,\n dateUtils,\n StreamCallbacks,\n} from '@chatbi-v/core';\nimport Mock from 'mockjs';\n\nimport { ChatStreamStrategy, HistoryStreamStrategy, StrategyFactory } from './strategies';\nimport { MockConfig, MockGeneratorStrategy } from './types';\nimport { sleep } from './utils';\n\nconst logger = createLogger('MockAdapter');\n\n/**\n * 基于 Mock.js 的请求适配器\n * @description 根据 API 配置中的 responseSchema 自动生成 Mock 数据,支持普通 JSON 和流式 SSE 响应\n */\nexport class MockAdapter implements ApiAdapter {\n private delay: number;\n // 遗留策略(为了兼容旧版代码)\n private static strategies: Record<string, MockGeneratorStrategy> = {\n chat_stream: new ChatStreamStrategy(),\n history_stream: new HistoryStreamStrategy(),\n };\n\n /**\n * 构造函数\n * @param delay 全局模拟延迟时间(毫秒),默认 300ms\n */\n constructor(delay: number = 300) {\n this.delay = delay;\n }\n\n /**\n * 注册自定义 Mock 生成策略\n * @param key 策略唯一标识符 (e.g., 'chat_stream', 'history_stream')\n * @param strategy 实现了 MockGeneratorStrategy 接口的策略实例\n */\n static registerStrategy(key: string, strategy: MockGeneratorStrategy) {\n this.strategies[key] = strategy;\n }\n\n /**\n * 处理普通 HTTP 请求(非流式)\n * @param config 请求配置对象\n * @param endpointConfig API 端点配置,包含 responseSchema\n * @returns Promise 返回模拟的响应数据\n */\n async request<T = any>(config: ApiRequestConfig, endpointConfig?: ApiEndpointConfig): Promise<T> {\n // 优先使用接口定义的 delay,否则使用全局默认 delay\n const delay = (endpointConfig as any)?.delay ?? this.delay;\n\n return new Promise((resolve, reject) => {\n setTimeout(() => {\n try {\n if (!endpointConfig || !endpointConfig.responseSchema) {\n logger.warn(`未找到响应架构配置: ${config.url}`);\n resolve({} as T);\n return;\n }\n\n let schema = endpointConfig.responseSchema;\n let mockData;\n\n // 支持函数式 schema,允许根据请求参数动态生成 schema\n if (typeof schema === 'function') {\n schema = schema(config);\n }\n\n // 构造有效配置对象,合并 endpointConfig 顶层属性\n const effectiveConfig = {\n type: (endpointConfig as any).type,\n status: (endpointConfig as any).status || 200,\n pageEvent: (endpointConfig as any).pageEvent,\n responseSchema: schema,\n ...(typeof schema === 'object' ? schema : {}),\n };\n\n // 0. 处理非 200 状态码\n if (effectiveConfig.status !== 200) {\n const error: any = new Error(`Request failed with status code ${effectiveConfig.status}`);\n error.response = {\n status: effectiveConfig.status,\n data: Mock.mock(schema),\n headers: {},\n };\n reject(error);\n return;\n }\n\n // 1. 字符串 Schema:直接作为结果返回(极少情况)\n if (typeof schema === 'string') {\n mockData = schema;\n }\n // 2. 遗留的高级 Schema (通过 _type 字段识别)\n else if (this.isLegacySchema(schema)) {\n const strategy = MockAdapter.strategies[schema._type];\n if (strategy) {\n const chunks = strategy.generate(schema);\n // 将流式块合并为单个字符串,并清理 SSE 格式标记\n mockData = chunks\n .join('')\n .replace(/event: data\\ndata: /g, '')\n .replace(/\\n\\n/g, '');\n try {\n mockData = JSON.parse(mockData);\n } catch (e) {\n // 忽略解析错误,保持原始数据格式\n }\n } else {\n logger.warn(`未找到对应的策略类型: ${schema._type}`);\n mockData = {};\n }\n }\n // 3. 通用策略模式\n else {\n const type = effectiveConfig.type || 'json';\n const strategy = StrategyFactory.getStrategy(type);\n mockData = strategy.process(effectiveConfig as MockConfig, config.params || config.data);\n }\n\n logger.info(`Request: ${config.method} ${config.url}`, config.data || config.params);\n logger.info(`Response:`, mockData);\n\n resolve(mockData as T);\n } catch (error) {\n reject(error);\n }\n }, delay);\n });\n }\n\n /**\n * 处理流式请求 (SSE)\n * @param config 请求配置对象\n * @param callbacks 流式回调函数集合 (onMessage, onFinish, onError)\n * @param endpointConfig API 端点配置,包含 responseSchema\n */\n async stream(\n config: ApiRequestConfig,\n callbacks: StreamCallbacks,\n endpointConfig?: ApiEndpointConfig,\n ): Promise<void> {\n const { onMessage, onFinish, onError } = callbacks;\n const signal = config.signal;\n\n // 优先使用接口定义的 delay,否则使用全局默认 delay\n const delay = (endpointConfig as any)?.delay ?? this.delay;\n\n return new Promise<void>((resolve, reject) => {\n // 如果请求已被取消,直接结束\n if (signal && signal.aborted) {\n if (onFinish) onFinish();\n resolve();\n return;\n }\n\n setTimeout(async () => {\n try {\n if (!endpointConfig || !endpointConfig.responseSchema) {\n logger.warn(`未找到流式响应架构: ${config.url}`);\n if (onFinish) onFinish();\n resolve();\n return;\n }\n\n const requestStart = dateUtils.now();\n logger.info(`[SSE Start] Request: ${config.method} ${config.url}`, {\n params: config.data || config.params,\n time: dateUtils.dayjs().toISOString(),\n });\n\n let schema = endpointConfig.responseSchema;\n\n // 支持函数式 schema\n if (typeof schema === 'function') {\n schema = schema(config);\n }\n\n // 构造有效配置对象,合并 endpointConfig 顶层属性\n const effectiveConfig = {\n type: (endpointConfig as any).type,\n status: (endpointConfig as any).status || 200,\n pageEvent: (endpointConfig as any).pageEvent,\n responseSchema: schema,\n ...(typeof schema === 'object' ? schema : {}),\n };\n\n // 0. 处理非 200 状态码\n if (effectiveConfig.status !== 200) {\n const response = {\n status: effectiveConfig.status,\n data: Mock.mock(schema),\n headers: {},\n };\n\n // 触发 onResponse 回调\n if (callbacks.onResponse) {\n const hijacked = await callbacks.onResponse(response);\n if (hijacked) {\n resolve();\n return;\n }\n }\n\n const error: any = new Error(`Stream request failed with status code ${effectiveConfig.status}`);\n error.response = response;\n logger.error(`[SSE Error] Request failed with status ${effectiveConfig.status}`, error);\n if (onError) onError(error);\n // 保持与 request 同样的处理逻辑,抛出异常以便顶层拦截\n reject(error);\n return;\n }\n\n // 触发 onResponse 回调 (200 场景)\n if (callbacks.onResponse) {\n const hijacked = await callbacks.onResponse({\n status: 200,\n data: null,\n headers: {},\n });\n if (hijacked) {\n resolve();\n return;\n }\n }\n\n // 1. 新版 Schema 策略 (sse, sse-page)\n if (this.isNewConfig(effectiveConfig)) {\n const type = effectiveConfig.type || 'sse';\n const strategy = StrategyFactory.getStrategy(type);\n\n // 策略处理返回 MockEvent 数组\n const events = strategy.process(\n effectiveConfig as MockConfig,\n config.params || config.data,\n );\n\n if (Array.isArray(events)) {\n const startTime = dateUtils.now();\n let eventCount = 0;\n\n logger.info(\n `[SSE Processing] Generated ${events.length} events for ${type} strategy`,\n );\n\n for (const event of events) {\n if (signal && signal.aborted) {\n logger.info(\n `[SSE Abort] Stream aborted by user after ${dateUtils.now() - requestStart}ms`,\n );\n break;\n }\n\n // 计算延迟\n const delay =\n typeof event.delay === 'number'\n ? event.delay\n : parseInt(String(event.delay || 0));\n const elapsed = dateUtils.now() - startTime;\n const remaining = Math.max(0, delay - elapsed);\n\n if (remaining > 0) {\n await sleep(remaining);\n }\n\n if (signal && signal.aborted) break;\n\n // 构造 SSE 格式数据块\n const chunk = `event: ${event.event}\\ndata: ${JSON.stringify(event.data)}\\n\\n`;\n\n // 记录关键事件日志\n if (['error', 'todos', 'page'].includes(event.event)) {\n logger.info(`[SSE Event] Emitting special event: ${event.event}`, event.data);\n } else if (eventCount === 0 || eventCount === events.length - 1) {\n logger.info(\n `[SSE Event] Emitting ${eventCount === 0 ? 'first' : 'last'} data event`,\n { preview: JSON.stringify(event.data).slice(0, 50) + '...' },\n );\n }\n if (onMessage) onMessage(chunk);\n eventCount++;\n }\n }\n }\n // 2. 遗留策略处理\n else {\n let chunks: string[] = [];\n\n if (typeof schema === 'string') {\n chunks = schema.split('\\n\\n').map((chunk) => chunk + '\\n\\n');\n } else if (this.isLegacySchema(schema)) {\n chunks = this.generateAdvancedChunks(schema);\n } else {\n const mockData = Mock.mock(schema);\n chunks = [`data: ${JSON.stringify(mockData)}\\n\\n`];\n }\n\n for (const chunk of chunks) {\n if (signal && signal.aborted) {\n logger.info('[SSE Abort] Stream aborted by user');\n break;\n }\n\n if (chunk.trim()) {\n if (onMessage) onMessage(chunk);\n await new Promise((r) => setTimeout(r, 200));\n }\n }\n }\n\n if (!signal || !signal.aborted) {\n logger.info(\n `[SSE Complete] Stream finished successfully in ${dateUtils.now() - requestStart}ms`,\n );\n if (onFinish) onFinish();\n }\n resolve();\n } catch (error) {\n logger.error(`[SSE Error] Stream processing failed`, error);\n if (onError) onError(error);\n resolve();\n }\n }, delay);\n });\n }\n\n /**\n * 判断是否为遗留的 schema 格式\n */\n private isLegacySchema(schema: any): boolean {\n return schema && typeof schema === 'object' && '_type' in schema;\n }\n\n /**\n * 判断是否为新版配置格式\n * @description 检查配置对象中是否包含有效的 type 字段\n */\n private isNewConfig(config: any): boolean {\n return (\n config &&\n typeof config === 'object' &&\n (['json', 'sse', 'sse-page'].includes(config.type) || 'responseSchema' in config) // 备用检查,如果 schema 内部定义了结构\n );\n }\n\n /**\n * 生成遗留的高级 schema 数据块\n */\n private generateAdvancedChunks(schema: any): string[] {\n const strategy = MockAdapter.strategies[schema._type];\n if (strategy) {\n return strategy.generate(schema);\n }\n logger.warn(`未找到对应的策略类型: ${schema._type}`);\n return [];\n }\n}\n","import Mock from 'mockjs';\n\nimport { MockResponseGenerator } from './generator';\nimport { \n ChatStreamConfig,\n HistoryStreamConfig,\n JsonMockConfig, \n MockConfig, \n MockEvent,\n MockGeneratorStrategy, // Legacy\n MockStrategy, \n SseMockConfig, \n SsePageMockConfig} from './types';\nimport { flatEvents, processTemplate } from './utils';\n\n// === Legacy Strategies (Preserved) ===\n\nexport class ChatStreamStrategy implements MockGeneratorStrategy {\n generate(schema: any): string[] {\n const config = schema as ChatStreamConfig;\n const defaultName = config.agentName || 'BI助手';\n const generator = new MockResponseGenerator(defaultName);\n \n const mockData = config.data ? Mock.mock(config.data) : {};\n \n // 1. Init Plan\n if (config.plan) {\n generator.initPlan(config.plan);\n }\n\n // 2. Execute Timeline\n if (config.timeline) {\n config.timeline.forEach(step => {\n if (step.planIndex !== undefined) {\n generator.updatePlanStatus(step.planIndex);\n }\n if (step.log) {\n const logContent = typeof step.log === 'string' ? step.log : step.log.content;\n const logLevel = typeof step.log === 'object' ? step.log.level : 'info';\n const logAgent = typeof step.log === 'object' ? step.log.agent : undefined;\n generator.addLog(logContent, logLevel, logAgent);\n }\n });\n }\n\n // 3. Content\n let content;\n if (typeof config.content === 'function') {\n content = config.content(mockData);\n } else {\n content = config.content;\n }\n\n if (typeof content === 'object' && content !== null) {\n generator.emitA2UI(content as Record<string, any>);\n } else {\n generator.streamContent(content as string);\n }\n\n // 4. Complete\n generator.completePlan();\n generator.finish();\n\n return generator.toString().split('\\n\\n').map(chunk => chunk + '\\n\\n');\n }\n}\n\nexport class HistoryStreamStrategy implements MockGeneratorStrategy {\n generate(schema: any): string[] {\n const config = schema as HistoryStreamConfig;\n const generator = new MockResponseGenerator('BI助手');\n \n const historyMock = Mock.mock(config.template);\n const fullHistory = [...(config.prepend || []), ...(historyMock.list || historyMock)];\n generator.emitHistory(fullHistory);\n \n return generator.toString().split('\\n\\n').map(chunk => chunk + '\\n\\n');\n }\n}\n\n// === New Schema Strategies ===\n\nexport class JsonStrategy implements MockStrategy {\n process(config: MockConfig, _requestParams?: any): any {\n const jsonConfig = config as JsonMockConfig;\n if (!jsonConfig.responseSchema) return {};\n return Mock.mock(jsonConfig.responseSchema);\n }\n}\n\nexport class SseStrategy implements MockStrategy {\n process(config: MockConfig, requestParams: any = {}): MockEvent[] {\n const sseConfig = config as SseMockConfig;\n if (!sseConfig.responseSchema) return [];\n \n // Use flatEvents to process the schema with MockJS and sort by delay\n return flatEvents(sseConfig.responseSchema, requestParams);\n }\n}\n\nexport class SsePageStrategy implements MockStrategy {\n process(config: MockConfig, requestParams: any = {}): MockEvent[] {\n const ssePageConfig = config as SsePageMockConfig;\n if (!ssePageConfig.responseSchema) return [];\n\n // 1. Generate base events\n const events = flatEvents(ssePageConfig.responseSchema, requestParams);\n\n // 2. Generate page event if exists\n if (ssePageConfig.pageEvent) {\n const context = {\n $query: requestParams, // Backward compatibility\n $body: requestParams,\n $param: requestParams?.param || requestParams\n };\n\n Mock.Random.extend({ \n $query: () => context.$query,\n $body: () => context.$body,\n $param: () => context.$param\n });\n\n // First let Mock.js process standard templates (like @integer)\n let pageEvent = Mock.mock(ssePageConfig.pageEvent);\n // Then process custom {{}} templates\n pageEvent = processTemplate(pageEvent, context);\n \n // Calculate max delay from existing events to ensure page event is last\n let maxDelay = 0;\n if (events.length > 0) {\n const lastEvent = events[events.length - 1];\n maxDelay = typeof lastEvent.delay === 'number' ? lastEvent.delay : parseInt(String(lastEvent.delay || 0));\n }\n \n // Set page event delay to be slightly after the last event\n const pageDelay = typeof pageEvent.delay === 'number' ? pageEvent.delay : parseInt(String(pageEvent.delay || 0));\n if (pageDelay <= maxDelay) {\n pageEvent.delay = maxDelay + 20; // Add small buffer\n }\n\n events.push(pageEvent);\n }\n \n // Re-sort in case pageEvent has specific delay\n const es = events.sort((a, b) => {\n const delayA = typeof a.delay === 'number' ? a.delay : parseInt(String(a.delay || 0));\n const delayB = typeof b.delay === 'number' ? b.delay : parseInt(String(b.delay || 0));\n return delayA - delayB;\n });\n return es;\n }\n}\n\n// Factory for new strategies\nexport const StrategyFactory = {\n getStrategy(type: string = 'json'): MockStrategy {\n switch (type) {\n case 'sse':\n return new SseStrategy();\n case 'sse-page':\n return new SsePageStrategy();\n case 'json':\n default:\n return new JsonStrategy();\n }\n }\n};\n","import { dateUtils } from '@chatbi-v/core';\n\n/**\n * Mock 响应生成器\n * @description 用于动态生成流式响应数据,支持阶段流转、日志插入和内容分块\n */\nexport class MockResponseGenerator {\n private events: string[] = [];\n private sessionId: string;\n private agentName: string;\n private currentTodos: { content: string; status: 'PENDING' | 'IN_PROGRESS' | 'COMPLETED' }[] = [];\n\n constructor(agentName: string = 'Assistant', sessionId?: string) {\n this.sessionId = sessionId || ('conv_' + dateUtils.now());\n this.agentName = agentName;\n }\n\n /**\n * 生成历史消息流\n */\n emitHistory(history: { role: string; content: string; createTime: string; todos?: any[] }[]) {\n history.forEach(msg => {\n const data = {\n content: msg.content,\n sessionId: this.sessionId,\n role: msg.role,\n completed: true,\n agentName: this.agentName,\n createTime: msg.createTime\n };\n this.pushEvent('data', data);\n\n if (msg.todos) {\n this.pushEvent('todos', { items: msg.todos });\n }\n });\n return this;\n }\n\n /**\n * 初始化执行计划\n * @param steps 计划步骤列表\n */\n initPlan(steps: string[]) {\n this.currentTodos = steps.map(step => ({\n content: step,\n status: 'PENDING'\n }));\n this.pushTodos();\n return this;\n }\n\n /**\n * 更新执行计划状态\n * @param activeIndex 当前正在进行的步骤索引\n */\n updatePlanStatus(activeIndex: number) {\n this.currentTodos = this.currentTodos.map((todo, index) => {\n if (index < activeIndex) {\n return { ...todo, status: 'COMPLETED' };\n } else if (index === activeIndex) {\n return { ...todo, status: 'IN_PROGRESS' };\n } else {\n return { ...todo, status: 'PENDING' };\n }\n });\n this.pushTodos();\n return this;\n }\n\n /**\n * 标记所有计划为完成\n */\n completePlan() {\n this.currentTodos = this.currentTodos.map(todo => ({ ...todo, status: 'COMPLETED' }));\n this.pushTodos();\n return this;\n }\n\n /**\n * 添加日志\n * @param content 日志内容\n * @param type 日志类型\n * @param agentName 可选的 Agent 名称\n */\n addLog(content: string, type: 'info' | 'warning' | 'error' = 'info', agentName?: string) {\n this.pushEvent('log', {\n type,\n content,\n agentName: agentName || this.agentName\n });\n return this;\n }\n\n /**\n * 添加系统错误事件\n * @param errorCode 错误码\n * @param errorMessage 错误信息\n */\n addError(errorCode: string, errorMessage: string) {\n this.pushEvent('error', {\n errorCode,\n errorMessage\n });\n return this;\n }\n\n /**\n * 添加流式内容块\n * @param content 完整内容\n * @param chunkSize 分块大小\n */\n streamContent(content: string, chunkSize: number = 20) {\n for (let i = 0; i < content.length; i += chunkSize) {\n const chunk = content.slice(i, i + chunkSize);\n this.pushEvent('data', {\n content: chunk,\n sessionId: this.sessionId,\n completed: false,\n agentName: this.agentName\n });\n }\n return this;\n }\n\n /**\n * 结束流\n */\n finish() {\n this.pushEvent('data', {\n content: '',\n sessionId: this.sessionId,\n completed: true,\n agentName: this.agentName\n });\n return this;\n }\n\n /**\n * 生成 A2UI 响应\n * @param component A2UI 组件配置对象\n */\n emitA2UI(component: Record<string, any>) {\n const content = JSON.stringify(component, null, 2);\n return this.streamContent(content);\n }\n\n /**\n * 生成最终的响应字符串\n */\n toString() {\n return this.events.join('\\n');\n }\n\n private pushTodos() {\n this.pushEvent('todos', { items: this.currentTodos });\n }\n\n private pushEvent(type: string, data: any) {\n this.events.push(`event: ${type}\\ndata: ${JSON.stringify(data)}\\n`);\n }\n}\n","import dayjs from 'dayjs';\nimport Mock from 'mockjs';\n\nimport { MockEvent } from './types';\n\nexport const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));\n\n/**\n * Process string templates like \"{{$query.pageNo * 10}}\" in object values.\n * Supports $query (for backward compatibility), $body, and $param.\n */\nexport function processTemplate(data: any, context: Record<string, any>): any {\n if (typeof data === 'string') {\n // Check for {{ ... }} pattern\n if (/^\\{\\{.*\\}\\}$/.test(data)) {\n const expression = data.slice(2, -2).trim();\n try {\n // Safe evaluation using Function with context keys\n const keys = Object.keys(context);\n const values = Object.values(context);\n const fn = new Function(...keys, `return ${expression}`);\n return fn(...values);\n } catch (e) {\n console.warn(`[Mock] Failed to evaluate template: ${data}`, e);\n return data;\n }\n }\n return data;\n }\n \n if (Array.isArray(data)) {\n return data.map(item => processTemplate(item, context));\n }\n \n if (typeof data === 'object' && data !== null) {\n const result: Record<string, any> = {};\n for (const key in data) {\n result[key] = processTemplate(data[key], context);\n }\n return result;\n }\n \n return data;\n}\n\n/**\n * Flatten eventsSchema into a sorted array of events.\n * \n * Supports Mock.js array generation rules in keys, e.g.:\n * { 'data|8-12': [{ event: 'data', ... }] } \n * -> generates 8 to 12 data events.\n */\nexport function flatEvents(\n eventsSchema: Record<string, MockEvent[]>, \n requestData: any = {}\n): MockEvent[] {\n // Construct context for template processing\n const context: Record<string, any> = {\n $query: requestData, // Backward compatibility\n $body: requestData,\n $param: requestData?.param || requestData\n };\n\n // Extend Mock.Random to support templates\n Mock.Random.extend({ \n $query: () => context.$query,\n $body: () => context.$body,\n $param: () => context.$param\n });\n \n // Generate data using Mock.mock\n const compiled = Mock.mock(eventsSchema) as Record<string, MockEvent[]>;\n \n // Flatten and sort by delay\n return Object.values(compiled)\n .flat()\n .map(event => processTemplate(event, context))\n .sort((a, b) => {\n const delayA = typeof a.delay === 'number' ? a.delay : parseInt(String(a.delay || 0));\n const delayB = typeof b.delay === 'number' ? b.delay : parseInt(String(b.delay || 0));\n return delayA - delayB;\n });\n}\n\n/**\n * Convert an array of events into a ReadableStream (for SSE).\n */\nexport function eventsToStream(events: MockEvent[]): ReadableStream {\n const encoder = new TextEncoder();\n \n return new ReadableStream({\n start(ctrl) {\n // Check if events is empty\n if (!events || events.length === 0) {\n ctrl.close();\n return;\n }\n\n (async () => {\n try {\n // We assume events are sorted by their `delay` property which represents \n // \"absolute time from start\".\n const startTime = dayjs().valueOf();\n \n for (const eventItem of events) {\n const delay = typeof eventItem.delay === 'number' ? eventItem.delay : parseInt(String(eventItem.delay || 0));\n \n // Calculate how much time passed since start\n const elapsed = dayjs().valueOf() - startTime;\n const remaining = Math.max(0, delay - elapsed);\n \n if (remaining > 0) {\n await sleep(remaining);\n }\n \n const payload = `event: ${eventItem.event}\\ndata: ${JSON.stringify(eventItem.data)}\\n\\n`;\n ctrl.enqueue(encoder.encode(payload));\n }\n ctrl.close();\n } catch (e) {\n ctrl.error(e);\n }\n })();\n },\n });\n}\n","import Mock from 'mockjs';\n\nimport { StrategyFactory } from './strategies';\nimport { JsonMockConfig, MockConfig, MockSchema, SseMockConfig, SsePageMockConfig } from './types';\nimport { eventsToStream, sleep } from './utils';\n\ndeclare global {\n interface Window {\n _originalFetch: typeof fetch;\n _originalEventSource: typeof EventSource;\n }\n}\n\nexport function installFetchMock(schema: MockSchema) {\n if (!window._originalFetch) {\n window._originalFetch = window.fetch;\n }\n\n window.fetch = async (input: RequestInfo | URL, init: RequestInit = {}) => {\n const url = typeof input === 'string' ? input : input instanceof URL ? input.toString() : input.url;\n const method = (init.method || 'GET').toUpperCase();\n \n // Find matching rule\n const rules = Object.values(schema);\n const rule = rules.find((v) => {\n if (!v.url) return false;\n // Convert route params :id to regex \\w+\n // We might want to be more specific, e.g., ([^/]+)\n const pattern = v.url.replace(/:[a-zA-Z0-9_]+/g, '([^/]+)');\n const regex = new RegExp(`^${pattern}$`);\n \n // Check if URL matches (ignoring query params for the match, but we might need them later)\n const [path] = url.split('?');\n // Match method if specified, default to GET match? or just match URL?\n // Usually method matters.\n const ruleMethod = (v.method || 'GET').toUpperCase();\n return regex.test(path) && ruleMethod === method;\n });\n\n if (!rule) {\n return window._originalFetch(input, init);\n }\n\n console.log(`[Mock] Intercepted ${method} ${url}`, rule);\n\n // Handle non-200 status code immediately\n const status = rule.status || 200;\n if (status !== 200) {\n await sleep(rule.delay || 0);\n return new Response(JSON.stringify({ \n message: `Mock error status ${status}`,\n code: status \n }), {\n status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n await sleep(rule.delay || 0);\n\n // Determine type (default 'json' if not present)\n const type = rule.type || 'json';\n const strategy = StrategyFactory.getStrategy(type);\n \n // Parse query params for strategies that need them\n const urlObj = new URL(url, window.location.origin);\n const query = Object.fromEntries(urlObj.searchParams);\n \n const result = strategy.process(rule as MockConfig, query);\n\n /* 1. JSON Response */\n if (type === 'json') {\n return new Response(JSON.stringify(result), {\n status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n /* 2. SSE / SSE-Page Response */\n if (type === 'sse' || type === 'sse-page') {\n const events = result; // Strategy returns MockEvent[]\n const stream = eventsToStream(events);\n return new Response(stream, { \n status, \n headers: { 'Content-Type': 'text/event-stream' } \n });\n }\n\n return window._originalFetch(input, init);\n };\n}\n\nexport function installSSEMock() {\n // Placeholder for EventSource mocking if needed.\n // Currently, we rely on fetch interception.\n // Many modern apps use fetch for SSE (POST requests, headers, etc.)\n}\n\nexport function setupMock(schema: MockSchema) {\n if (typeof window !== 'undefined') {\n installFetchMock(schema);\n installSSEMock();\n }\n}\n","\nimport { ApiRequestConfig } from '@chatbi-v/core';\n\n// === Base Types ===\n\nexport type MockMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\nexport type MockType = 'json' | 'sse' | 'sse-page';\n\nexport interface MockEvent {\n event: string;\n data: any;\n /** Delay in ms, or a mockjs template string like '@increment(100)' */\n delay?: number | string;\n}\n\n// === Unified Strategy Interface ===\n\nexport interface MockStrategy {\n /**\n * Process the schema and return the result.\n * For JSON: returns the mocked object.\n * For SSE: returns an array of formatted event strings (chunks).\n */\n process(config: MockConfig, requestParams?: any): any;\n}\n\n// === Mock Configuration Types (Matching chat.mock.ts) ===\n\nexport interface BaseMockConfig {\n /** Optional: URL pattern if used in global interceptor */\n url?: string;\n /** Optional: Method if used in global interceptor */\n method?: MockMethod;\n /** Global delay for the request */\n delay?: number;\n /** Optional: HTTP status code (default: 200) */\n status?: number;\n /** Mock type (default: 'json') */\n type?: MockType;\n}\n\nexport interface JsonMockConfig extends BaseMockConfig {\n type?: 'json';\n /** The MockJS template for the response body */\n responseSchema: any;\n}\n\nexport interface SseMockConfig extends BaseMockConfig {\n type: 'sse';\n /** \n * Dictionary of event templates. \n * Key can be a mockjs template like 'data|3-5' \n */\n responseSchema: Record<string, MockEvent[]>;\n}\n\nexport interface SsePageMockConfig extends BaseMockConfig {\n type: 'sse-page';\n /** Dictionary of event templates */\n responseSchema: Record<string, MockEvent[]>;\n /** Special event for pagination metadata */\n pageEvent: MockEvent;\n}\n\nexport type MockConfig = JsonMockConfig | SseMockConfig | SsePageMockConfig;\n\nexport type MockSchema = Record<string, MockConfig>;\n\n// === Legacy Support (Keep these for backward compatibility if needed) ===\n\nexport interface ChatStreamConfig {\n _type: 'chat_stream';\n agentName?: string;\n plan?: string[];\n data?: Record<string, any>;\n timeline?: Array<{\n log?: string | { content: string; level?: 'info' | 'warning' | 'error'; agent?: string };\n planIndex?: number;\n delay?: number;\n }>;\n content: string | Record<string, any> | ((data: any) => string | Record<string, any>);\n}\n\nexport interface HistoryStreamConfig {\n _type: 'history_stream';\n template: Record<string, any>;\n prepend?: any[];\n}\n\nexport type AdvancedMockSchema = ChatStreamConfig | HistoryStreamConfig;\n\nexport interface MockGeneratorStrategy {\n generate(schema: any): string[];\n}\n\n// === Helper Functions (Restored) ===\n\nexport function createChatStream(config: Omit<ChatStreamConfig, '_type'>): ChatStreamConfig {\n return { _type: 'chat_stream', ...config };\n}\n\nexport function createHistoryStream(config: Omit<HistoryStreamConfig, '_type'>): HistoryStreamConfig {\n return { _type: 'history_stream', ...config };\n}\n"],"mappings":"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","names":["dateUtils","dateUtils","Mock","Mock","mockData","Mock","mockData","Mock","dateUtils","delay","dateUtils"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/adapter.ts","../src/strategies.ts","../src/generator.ts","../src/utils.ts","../src/interceptor.ts","../src/types.ts"],"sourcesContent":["/**\n * @file index.ts\n * @description Mock 模块入口,导出模拟数据适配器、生成器及静态测试数据\n * @author ChatBI Team\n */\n\nimport { dateUtils } from '@chatbi-v/core';\n\n/**\n * Mock 数据模块\n * @description 提供前端开发所需的模拟数据适配器和工具\n */\n\nexport * from './adapter';\nexport * from './generator';\nexport * from './interceptor';\nexport * from './strategies';\nexport * from './types';\nexport * from './utils';\n\n/**\n * 模拟用户数据\n */\nexport const MOCK_USER = {\n id: 'u_001',\n name: 'Admin User',\n avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=Admin',\n role: 'admin',\n};\n\n// 保留原有的静态数据导出,以兼容可能直接引用的地方,但建议使用 adapter 自动生成\nexport const MOCK_SESSIONS = [\n { id: 's_001', title: '2024 Q1 销售分析', date: '2024-03-15', lastMessage: '好的,正在为您分析 Q1 销售数据...' },\n { id: 's_002', title: '用户增长趋势', date: '2024-03-10', lastMessage: '用户增长曲线显示...' },\n { id: 's_003', title: '竞品分析报告', date: '2024-03-08', lastMessage: '主要竞品 A 的市场份额...' },\n { id: 's_004', title: '营销活动复盘', date: '2024-03-05', lastMessage: 'ROI 提升了 15%...' },\n { id: 's_005', title: '财务报表审计', date: '2024-03-01', lastMessage: '请确认以下财务指标...' },\n];\n\nexport const MOCK_FAVORITES = [\n { id: 'fav-1', title: '季度销售总结', date: '2025/12/15' },\n { id: 'fav-2', title: '年度预算规划', date: '2025/12/10' },\n { id: 'fav-3', title: '核心指标监控', date: '2025/11/20' },\n];\n\nexport const MOCK_SCENES = [\n {\n id: '1',\n name: '销售数据分析',\n description: '全方位分析销售业绩,包括区域、产品、时间维度',\n code: 'SALES_001',\n creator: '管理员',\n createTime: '2023-01-01',\n tableCount: 5,\n kbCount: 2,\n qaCount: 10,\n cover: 'https://images.unsplash.com/photo-1551288049-bebda4e38f71?w=800&q=80',\n },\n {\n id: '2',\n name: '人力资源概览',\n description: '员工入职、离职、绩效分布与培训情况分析',\n code: 'HR_001',\n creator: 'HR 经理',\n createTime: '2023-02-15',\n tableCount: 3,\n kbCount: 1,\n qaCount: 5,\n cover: 'https://images.unsplash.com/photo-1460925895917-afdab827c52f?w=800&q=80',\n },\n {\n id: '3',\n name: '供应链优化',\n description: '库存周转、物流成本与供应商绩效评估',\n code: 'SCM_001',\n creator: '供应链总监',\n createTime: '2023-03-20',\n tableCount: 8,\n kbCount: 0,\n qaCount: 15,\n cover: 'https://images.unsplash.com/photo-1586528116311-ad8dd3c8310d?w=800&q=80',\n },\n];\n\nexport const generateMockMessages = (sessionId: string) => [\n {\n key: `msg_${sessionId}_1`,\n role: 'assistant',\n content: `您好!我是您的智能助手。当前会话 ID: ${sessionId}。请问有什么可以帮您?`,\n time: dateUtils.dayjs(dateUtils.now() - 10000).toISOString(),\n },\n];\n\nexport const mockData = {\n user: MOCK_USER,\n sessions: MOCK_SESSIONS,\n favorites: MOCK_FAVORITES,\n scenes: MOCK_SCENES,\n favoritesList: MOCK_FAVORITES, // Alias for compatibility if needed\n};\n","import {\n ApiAdapter,\n ApiEndpointConfig,\n ApiRequestConfig,\n createLogger,\n dateUtils,\n StreamCallbacks,\n} from '@chatbi-v/core';\nimport Mock from 'mockjs';\n\nimport { ChatStreamStrategy, HistoryStreamStrategy, StrategyFactory } from './strategies';\nimport { MockConfig, MockGeneratorStrategy } from './types';\nimport { sleep } from './utils';\n\nconst logger = createLogger('MockAdapter');\n\n/**\n * 基于 Mock.js 的请求适配器\n * @description 根据 API 配置中的 responseSchema 自动生成 Mock 数据,支持普通 JSON 和流式 SSE 响应\n */\nexport class MockAdapter implements ApiAdapter {\n private delay: number;\n // 遗留策略(为了兼容旧版代码)\n private static strategies: Record<string, MockGeneratorStrategy> = {\n chat_stream: new ChatStreamStrategy(),\n history_stream: new HistoryStreamStrategy(),\n };\n\n /**\n * 构造函数\n * @param delay 全局模拟延迟时间(毫秒),默认 300ms\n */\n constructor(delay: number = 300) {\n this.delay = delay;\n }\n\n /**\n * 注册自定义 Mock 生成策略\n * @param key 策略唯一标识符 (e.g., 'chat_stream', 'history_stream')\n * @param strategy 实现了 MockGeneratorStrategy 接口的策略实例\n */\n static registerStrategy(key: string, strategy: MockGeneratorStrategy) {\n this.strategies[key] = strategy;\n }\n\n /**\n * 处理普通 HTTP 请求(非流式)\n * @param config 请求配置对象\n * @param endpointConfig API 端点配置,包含 responseSchema\n * @returns Promise 返回模拟的响应数据\n */\n async request<T = any>(config: ApiRequestConfig, endpointConfig?: ApiEndpointConfig): Promise<T> {\n // 优先使用接口定义的 delay,否则使用全局默认 delay\n const delay = (endpointConfig as any)?.delay ?? this.delay;\n\n return new Promise((resolve, reject) => {\n setTimeout(() => {\n try {\n if (!endpointConfig || !endpointConfig.responseSchema) {\n logger.warn(`未找到响应架构配置: ${config.url}`);\n resolve({} as T);\n return;\n }\n\n let schema = endpointConfig.responseSchema;\n let mockData;\n\n // 支持函数式 schema,允许根据请求参数动态生成 schema\n if (typeof schema === 'function') {\n schema = schema(config);\n }\n\n // 构造有效配置对象,合并 endpointConfig 顶层属性\n const effectiveConfig = {\n type: (endpointConfig as any).type,\n status: (endpointConfig as any).status || 200,\n pageEvent: (endpointConfig as any).pageEvent,\n responseSchema: schema,\n ...(typeof schema === 'object' ? schema : {}),\n };\n\n // 0. 处理非 200 状态码\n if (effectiveConfig.status !== 200) {\n const error: any = new Error(`Request failed with status code ${effectiveConfig.status}`);\n error.response = {\n status: effectiveConfig.status,\n data: Mock.mock(schema),\n headers: {},\n };\n reject(error);\n return;\n }\n\n // 1. 字符串 Schema:直接作为结果返回(极少情况)\n if (typeof schema === 'string') {\n mockData = schema;\n }\n // 2. 遗留的高级 Schema (通过 _type 字段识别)\n else if (this.isLegacySchema(schema)) {\n const strategy = MockAdapter.strategies[schema._type];\n if (strategy) {\n const chunks = strategy.generate(schema);\n // 将流式块合并为单个字符串,并清理 SSE 格式标记\n mockData = chunks\n .join('')\n .replace(/event: data\\ndata: /g, '')\n .replace(/\\n\\n/g, '');\n try {\n mockData = JSON.parse(mockData);\n } catch (e) {\n // 忽略解析错误,保持原始数据格式\n }\n } else {\n logger.warn(`未找到对应的策略类型: ${schema._type}`);\n mockData = {};\n }\n }\n // 3. 通用策略模式\n else {\n const type = effectiveConfig.type || 'json';\n const strategy = StrategyFactory.getStrategy(type);\n mockData = strategy.process(effectiveConfig as MockConfig, config.params || config.data);\n }\n\n logger.info(`Request: ${config.method} ${config.url}`, config.data || config.params);\n logger.info(`Response:`, mockData);\n\n resolve(mockData as T);\n } catch (error) {\n reject(error);\n }\n }, delay);\n });\n }\n\n /**\n * 处理流式请求 (SSE)\n * @param config 请求配置对象\n * @param callbacks 流式回调函数集合 (onMessage, onFinish, onError)\n * @param endpointConfig API 端点配置,包含 responseSchema\n */\n async stream(\n config: ApiRequestConfig,\n callbacks: StreamCallbacks,\n endpointConfig?: ApiEndpointConfig,\n ): Promise<void> {\n const { onMessage, onFinish, onError } = callbacks;\n const signal = config.signal;\n\n // 优先使用接口定义的 delay,否则使用全局默认 delay\n const delay = (endpointConfig as any)?.delay ?? this.delay;\n\n return new Promise<void>((resolve, reject) => {\n // 如果请求已被取消,直接结束\n if (signal && signal.aborted) {\n if (onFinish) onFinish();\n resolve();\n return;\n }\n\n setTimeout(async () => {\n try {\n if (!endpointConfig || !endpointConfig.responseSchema) {\n logger.warn(`未找到流式响应架构: ${config.url}`);\n if (onFinish) onFinish();\n resolve();\n return;\n }\n\n const requestStart = dateUtils.now();\n logger.info(`[SSE Start] Request: ${config.method} ${config.url}`, {\n params: config.data || config.params,\n time: dateUtils.dayjs().toISOString(),\n });\n\n let schema = endpointConfig.responseSchema;\n\n // 支持函数式 schema\n if (typeof schema === 'function') {\n schema = schema(config);\n }\n\n // 构造有效配置对象,合并 endpointConfig 顶层属性\n const effectiveConfig = {\n type: (endpointConfig as any).type,\n status: (endpointConfig as any).status || 200,\n pageEvent: (endpointConfig as any).pageEvent,\n responseSchema: schema,\n ...(typeof schema === 'object' ? schema : {}),\n };\n\n // 0. 处理非 200 状态码\n if (effectiveConfig.status !== 200) {\n const response = {\n status: effectiveConfig.status,\n data: Mock.mock(schema),\n headers: {},\n };\n\n // 触发 onResponse 回调\n if (callbacks.onResponse) {\n const hijacked = await callbacks.onResponse(response);\n if (hijacked) {\n resolve();\n return;\n }\n }\n\n const error: any = new Error(`Stream request failed with status code ${effectiveConfig.status}`);\n error.response = response;\n logger.error(`[SSE Error] Request failed with status ${effectiveConfig.status}`, error);\n if (onError) onError(error);\n // 保持与 request 同样的处理逻辑,抛出异常以便顶层拦截\n reject(error);\n return;\n }\n\n // 触发 onResponse 回调 (200 场景)\n if (callbacks.onResponse) {\n const hijacked = await callbacks.onResponse({\n status: 200,\n data: null,\n headers: {},\n });\n if (hijacked) {\n resolve();\n return;\n }\n }\n\n // 1. 新版 Schema 策略 (sse, sse-page)\n if (this.isNewConfig(effectiveConfig)) {\n const type = effectiveConfig.type || 'sse';\n const strategy = StrategyFactory.getStrategy(type);\n\n // 策略处理返回 MockEvent 数组\n const events = strategy.process(\n effectiveConfig as MockConfig,\n config.params || config.data,\n );\n\n if (Array.isArray(events)) {\n const startTime = dateUtils.now();\n let eventCount = 0;\n\n logger.info(\n `[SSE Processing] Generated ${events.length} events for ${type} strategy`,\n );\n\n for (const event of events) {\n if (signal && signal.aborted) {\n logger.info(\n `[SSE Abort] Stream aborted by user after ${dateUtils.now() - requestStart}ms`,\n );\n break;\n }\n\n // 计算延迟\n const delay =\n typeof event.delay === 'number'\n ? event.delay\n : parseInt(String(event.delay || 0));\n const elapsed = dateUtils.now() - startTime;\n const remaining = Math.max(0, delay - elapsed);\n\n if (remaining > 0) {\n await sleep(remaining);\n }\n\n if (signal && signal.aborted) break;\n\n // 构造 SSE 格式数据块\n const chunk = `event: ${event.event}\\ndata: ${JSON.stringify(event.data)}\\n\\n`;\n\n // 记录关键事件日志\n if (['error', 'todos', 'page'].includes(event.event)) {\n logger.info(`[SSE Event] Emitting special event: ${event.event}`, event.data);\n } else if (eventCount === 0 || eventCount === events.length - 1) {\n logger.info(\n `[SSE Event] Emitting ${eventCount === 0 ? 'first' : 'last'} data event`,\n { preview: JSON.stringify(event.data).slice(0, 50) + '...' },\n );\n }\n if (onMessage) onMessage(chunk);\n eventCount++;\n }\n }\n }\n // 2. 遗留策略处理\n else {\n let chunks: string[] = [];\n\n if (typeof schema === 'string') {\n chunks = schema.split('\\n\\n').map((chunk) => chunk + '\\n\\n');\n } else if (this.isLegacySchema(schema)) {\n chunks = this.generateAdvancedChunks(schema);\n } else {\n const mockData = Mock.mock(schema);\n chunks = [`data: ${JSON.stringify(mockData)}\\n\\n`];\n }\n\n for (const chunk of chunks) {\n if (signal && signal.aborted) {\n logger.info('[SSE Abort] Stream aborted by user');\n break;\n }\n\n if (chunk.trim()) {\n if (onMessage) onMessage(chunk);\n await new Promise((r) => setTimeout(r, 200));\n }\n }\n }\n\n if (!signal || !signal.aborted) {\n logger.info(\n `[SSE Complete] Stream finished successfully in ${dateUtils.now() - requestStart}ms`,\n );\n if (onFinish) onFinish();\n }\n resolve();\n } catch (error) {\n logger.error(`[SSE Error] Stream processing failed`, error);\n if (onError) onError(error);\n resolve();\n }\n }, delay);\n });\n }\n\n /**\n * 判断是否为遗留的 schema 格式\n */\n private isLegacySchema(schema: any): boolean {\n return schema && typeof schema === 'object' && '_type' in schema;\n }\n\n /**\n * 判断是否为新版配置格式\n * @description 检查配置对象中是否包含有效的 type 字段\n */\n private isNewConfig(config: any): boolean {\n return (\n config &&\n typeof config === 'object' &&\n (['json', 'sse', 'sse-page'].includes(config.type) || 'responseSchema' in config) // 备用检查,如果 schema 内部定义了结构\n );\n }\n\n /**\n * 生成遗留的高级 schema 数据块\n */\n private generateAdvancedChunks(schema: any): string[] {\n const strategy = MockAdapter.strategies[schema._type];\n if (strategy) {\n return strategy.generate(schema);\n }\n logger.warn(`未找到对应的策略类型: ${schema._type}`);\n return [];\n }\n}\n","import Mock from 'mockjs';\n\nimport { MockResponseGenerator } from './generator';\nimport { \n ChatStreamConfig,\n HistoryStreamConfig,\n JsonMockConfig, \n MockConfig, \n MockEvent,\n MockGeneratorStrategy, // Legacy\n MockStrategy, \n SseMockConfig, \n SsePageMockConfig} from './types';\nimport { flatEvents, processTemplate } from './utils';\n\n// === Legacy Strategies (Preserved) ===\n\nexport class ChatStreamStrategy implements MockGeneratorStrategy {\n generate(schema: any): string[] {\n const config = schema as ChatStreamConfig;\n const defaultName = config.agentName || 'BI助手';\n const generator = new MockResponseGenerator(defaultName);\n \n const mockData = config.data ? Mock.mock(config.data) : {};\n \n // 1. Init Plan\n if (config.plan) {\n generator.initPlan(config.plan);\n }\n\n // 2. Execute Timeline\n if (config.timeline) {\n config.timeline.forEach(step => {\n if (step.planIndex !== undefined) {\n generator.updatePlanStatus(step.planIndex);\n }\n if (step.log) {\n const logContent = typeof step.log === 'string' ? step.log : step.log.content;\n const logLevel = typeof step.log === 'object' ? step.log.level : 'info';\n const logAgent = typeof step.log === 'object' ? step.log.agent : undefined;\n generator.addLog(logContent, logLevel, logAgent);\n }\n });\n }\n\n // 3. Content\n let content;\n if (typeof config.content === 'function') {\n content = config.content(mockData);\n } else {\n content = config.content;\n }\n\n if (typeof content === 'object' && content !== null) {\n generator.emitA2UI(content as Record<string, any>);\n } else {\n generator.streamContent(content as string);\n }\n\n // 4. Complete\n generator.completePlan();\n generator.finish();\n\n return generator.toString().split('\\n\\n').map(chunk => chunk + '\\n\\n');\n }\n}\n\nexport class HistoryStreamStrategy implements MockGeneratorStrategy {\n generate(schema: any): string[] {\n const config = schema as HistoryStreamConfig;\n const generator = new MockResponseGenerator('BI助手');\n \n const historyMock = Mock.mock(config.template);\n const fullHistory = [...(config.prepend || []), ...(historyMock.list || historyMock)];\n generator.emitHistory(fullHistory);\n \n return generator.toString().split('\\n\\n').map(chunk => chunk + '\\n\\n');\n }\n}\n\n// === New Schema Strategies ===\n\nexport class JsonStrategy implements MockStrategy {\n process(config: MockConfig, _requestParams?: any): any {\n const jsonConfig = config as JsonMockConfig;\n if (!jsonConfig.responseSchema) return {};\n return Mock.mock(jsonConfig.responseSchema);\n }\n}\n\nexport class SseStrategy implements MockStrategy {\n process(config: MockConfig, requestParams: any = {}): MockEvent[] {\n const sseConfig = config as SseMockConfig;\n if (!sseConfig.responseSchema) return [];\n \n // Use flatEvents to process the schema with MockJS and sort by delay\n return flatEvents(sseConfig.responseSchema, requestParams);\n }\n}\n\nexport class SsePageStrategy implements MockStrategy {\n process(config: MockConfig, requestParams: any = {}): MockEvent[] {\n const ssePageConfig = config as SsePageMockConfig;\n if (!ssePageConfig.responseSchema) return [];\n\n // 1. Generate base events\n const events = flatEvents(ssePageConfig.responseSchema, requestParams);\n\n // 2. Generate page event if exists\n if (ssePageConfig.pageEvent) {\n const context = {\n $query: requestParams, // Backward compatibility\n $body: requestParams,\n $param: requestParams?.param || requestParams\n };\n\n Mock.Random.extend({ \n $query: () => context.$query,\n $body: () => context.$body,\n $param: () => context.$param\n });\n\n // First let Mock.js process standard templates (like @integer)\n let pageEvent = Mock.mock(ssePageConfig.pageEvent);\n // Then process custom {{}} templates\n pageEvent = processTemplate(pageEvent, context);\n \n // Calculate max delay from existing events to ensure page event is last\n let maxDelay = 0;\n if (events.length > 0) {\n const lastEvent = events[events.length - 1];\n maxDelay = typeof lastEvent.delay === 'number' ? lastEvent.delay : parseInt(String(lastEvent.delay || 0));\n }\n \n // Set page event delay to be slightly after the last event\n const pageDelay = typeof pageEvent.delay === 'number' ? pageEvent.delay : parseInt(String(pageEvent.delay || 0));\n if (pageDelay <= maxDelay) {\n pageEvent.delay = maxDelay + 20; // Add small buffer\n }\n\n events.push(pageEvent);\n }\n \n // Re-sort in case pageEvent has specific delay\n const es = events.sort((a, b) => {\n const delayA = typeof a.delay === 'number' ? a.delay : parseInt(String(a.delay || 0));\n const delayB = typeof b.delay === 'number' ? b.delay : parseInt(String(b.delay || 0));\n return delayA - delayB;\n });\n return es;\n }\n}\n\n// Factory for new strategies\nexport const StrategyFactory = {\n getStrategy(type: string = 'json'): MockStrategy {\n switch (type) {\n case 'sse':\n return new SseStrategy();\n case 'sse-page':\n return new SsePageStrategy();\n case 'json':\n default:\n return new JsonStrategy();\n }\n }\n};\n","import { dateUtils } from '@chatbi-v/core';\n\n/**\n * Mock 响应生成器\n * @description 用于动态生成流式响应数据,支持阶段流转、日志插入和内容分块\n */\nexport class MockResponseGenerator {\n private events: string[] = [];\n private sessionId: string;\n private agentName: string;\n private currentTodos: { content: string; status: 'PENDING' | 'IN_PROGRESS' | 'COMPLETED' }[] = [];\n\n constructor(agentName: string = 'Assistant', sessionId?: string) {\n this.sessionId = sessionId || ('conv_' + dateUtils.now());\n this.agentName = agentName;\n }\n\n /**\n * 生成历史消息流\n */\n emitHistory(history: { role: string; content: string; createTime: string; todos?: any[] }[]) {\n history.forEach(msg => {\n const data = {\n content: msg.content,\n sessionId: this.sessionId,\n role: msg.role,\n completed: true,\n agentName: this.agentName,\n createTime: msg.createTime\n };\n this.pushEvent('data', data);\n\n if (msg.todos) {\n this.pushEvent('todos', { items: msg.todos });\n }\n });\n return this;\n }\n\n /**\n * 初始化执行计划\n * @param steps 计划步骤列表\n */\n initPlan(steps: string[]) {\n this.currentTodos = steps.map(step => ({\n content: step,\n status: 'PENDING'\n }));\n this.pushTodos();\n return this;\n }\n\n /**\n * 更新执行计划状态\n * @param activeIndex 当前正在进行的步骤索引\n */\n updatePlanStatus(activeIndex: number) {\n this.currentTodos = this.currentTodos.map((todo, index) => {\n if (index < activeIndex) {\n return { ...todo, status: 'COMPLETED' };\n } else if (index === activeIndex) {\n return { ...todo, status: 'IN_PROGRESS' };\n } else {\n return { ...todo, status: 'PENDING' };\n }\n });\n this.pushTodos();\n return this;\n }\n\n /**\n * 标记所有计划为完成\n */\n completePlan() {\n this.currentTodos = this.currentTodos.map(todo => ({ ...todo, status: 'COMPLETED' }));\n this.pushTodos();\n return this;\n }\n\n /**\n * 添加日志\n * @param content 日志内容\n * @param type 日志类型\n * @param agentName 可选的 Agent 名称\n */\n addLog(content: string, type: 'info' | 'warning' | 'error' = 'info', agentName?: string) {\n this.pushEvent('log', {\n type,\n content,\n agentName: agentName || this.agentName\n });\n return this;\n }\n\n /**\n * 添加系统错误事件\n * @param errorCode 错误码\n * @param errorMessage 错误信息\n */\n addError(errorCode: string, errorMessage: string) {\n this.pushEvent('error', {\n errorCode,\n errorMessage\n });\n return this;\n }\n\n /**\n * 添加流式内容块\n * @param content 完整内容\n * @param chunkSize 分块大小\n */\n streamContent(content: string, chunkSize: number = 20) {\n for (let i = 0; i < content.length; i += chunkSize) {\n const chunk = content.slice(i, i + chunkSize);\n this.pushEvent('data', {\n content: chunk,\n sessionId: this.sessionId,\n completed: false,\n agentName: this.agentName\n });\n }\n return this;\n }\n\n /**\n * 结束流\n */\n finish() {\n this.pushEvent('data', {\n content: '',\n sessionId: this.sessionId,\n completed: true,\n agentName: this.agentName\n });\n return this;\n }\n\n /**\n * 生成 A2UI 响应\n * @param component A2UI 组件配置对象\n */\n emitA2UI(component: Record<string, any>) {\n const content = JSON.stringify(component, null, 2);\n return this.streamContent(content);\n }\n\n /**\n * 生成最终的响应字符串\n */\n toString() {\n return this.events.join('\\n');\n }\n\n private pushTodos() {\n this.pushEvent('todos', { items: this.currentTodos });\n }\n\n private pushEvent(type: string, data: any) {\n this.events.push(`event: ${type}\\ndata: ${JSON.stringify(data)}\\n`);\n }\n}\n","import dayjs from 'dayjs';\nimport Mock from 'mockjs';\n\nimport { MockEvent } from './types';\n\nexport const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));\n\n/**\n * Process string templates like \"{{$query.pageNo * 10}}\" in object values.\n * Supports $query (for backward compatibility), $body, and $param.\n */\nexport function processTemplate(data: any, context: Record<string, any>): any {\n if (typeof data === 'string') {\n // Check for {{ ... }} pattern\n if (/^\\{\\{.*\\}\\}$/.test(data)) {\n const expression = data.slice(2, -2).trim();\n try {\n // Safe evaluation using Function with context keys\n const keys = Object.keys(context);\n const values = Object.values(context);\n const fn = new Function(...keys, `return ${expression}`);\n return fn(...values);\n } catch (e) {\n console.warn(`[Mock] Failed to evaluate template: ${data}`, e);\n return data;\n }\n }\n return data;\n }\n \n if (Array.isArray(data)) {\n return data.map(item => processTemplate(item, context));\n }\n \n if (typeof data === 'object' && data !== null) {\n const result: Record<string, any> = {};\n for (const key in data) {\n result[key] = processTemplate(data[key], context);\n }\n return result;\n }\n \n return data;\n}\n\n/**\n * Flatten eventsSchema into a sorted array of events.\n * \n * Supports Mock.js array generation rules in keys, e.g.:\n * { 'data|8-12': [{ event: 'data', ... }] } \n * -> generates 8 to 12 data events.\n */\nexport function flatEvents(\n eventsSchema: Record<string, MockEvent[]>, \n requestData: any = {}\n): MockEvent[] {\n // Construct context for template processing\n const context: Record<string, any> = {\n $query: requestData, // Backward compatibility\n $body: requestData,\n $param: requestData?.param || requestData\n };\n\n // Extend Mock.Random to support templates\n Mock.Random.extend({ \n $query: () => context.$query,\n $body: () => context.$body,\n $param: () => context.$param\n });\n \n // Generate data using Mock.mock\n const compiled = Mock.mock(eventsSchema) as Record<string, MockEvent[]>;\n \n // Flatten and sort by delay\n return Object.values(compiled)\n .flat()\n .map(event => processTemplate(event, context))\n .sort((a, b) => {\n const delayA = typeof a.delay === 'number' ? a.delay : parseInt(String(a.delay || 0));\n const delayB = typeof b.delay === 'number' ? b.delay : parseInt(String(b.delay || 0));\n return delayA - delayB;\n });\n}\n\n/**\n * Convert an array of events into a ReadableStream (for SSE).\n */\nexport function eventsToStream(events: MockEvent[]): ReadableStream {\n const encoder = new TextEncoder();\n \n return new ReadableStream({\n start(ctrl) {\n // Check if events is empty\n if (!events || events.length === 0) {\n ctrl.close();\n return;\n }\n\n (async () => {\n try {\n // We assume events are sorted by their `delay` property which represents \n // \"absolute time from start\".\n const startTime = dayjs().valueOf();\n \n for (const eventItem of events) {\n const delay = typeof eventItem.delay === 'number' ? eventItem.delay : parseInt(String(eventItem.delay || 0));\n \n // Calculate how much time passed since start\n const elapsed = dayjs().valueOf() - startTime;\n const remaining = Math.max(0, delay - elapsed);\n \n if (remaining > 0) {\n await sleep(remaining);\n }\n \n const payload = `event: ${eventItem.event}\\ndata: ${JSON.stringify(eventItem.data)}\\n\\n`;\n ctrl.enqueue(encoder.encode(payload));\n }\n ctrl.close();\n } catch (e) {\n ctrl.error(e);\n }\n })();\n },\n });\n}\n","import Mock from 'mockjs';\n\nimport { StrategyFactory } from './strategies';\nimport { JsonMockConfig, MockConfig, MockSchema, SseMockConfig, SsePageMockConfig } from './types';\nimport { eventsToStream, sleep } from './utils';\n\ndeclare global {\n interface Window {\n _originalFetch: typeof fetch;\n _originalEventSource: typeof EventSource;\n }\n}\n\nexport function installFetchMock(schema: MockSchema) {\n if (!window._originalFetch) {\n window._originalFetch = window.fetch;\n }\n\n window.fetch = async (input: RequestInfo | URL, init: RequestInit = {}) => {\n const url = typeof input === 'string' ? input : input instanceof URL ? input.toString() : input.url;\n const method = (init.method || 'GET').toUpperCase();\n \n // Find matching rule\n const rules = Object.values(schema);\n const rule = rules.find((v) => {\n if (!v.url) return false;\n // Convert route params :id to regex \\w+\n // We might want to be more specific, e.g., ([^/]+)\n const pattern = v.url.replace(/:[a-zA-Z0-9_]+/g, '([^/]+)');\n const regex = new RegExp(`^${pattern}$`);\n \n // Check if URL matches (ignoring query params for the match, but we might need them later)\n const [path] = url.split('?');\n // Match method if specified, default to GET match? or just match URL?\n // Usually method matters.\n const ruleMethod = (v.method || 'GET').toUpperCase();\n return regex.test(path) && ruleMethod === method;\n });\n\n if (!rule) {\n return window._originalFetch(input, init);\n }\n\n console.log(`[Mock] Intercepted ${method} ${url}`, rule);\n\n // Handle non-200 status code immediately\n const status = rule.status || 200;\n if (status !== 200) {\n await sleep(rule.delay || 0);\n return new Response(JSON.stringify({ \n message: `Mock error status ${status}`,\n code: status \n }), {\n status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n await sleep(rule.delay || 0);\n\n // Determine type (default 'json' if not present)\n const type = rule.type || 'json';\n const strategy = StrategyFactory.getStrategy(type);\n \n // Parse query params for strategies that need them\n const urlObj = new URL(url, window.location.origin);\n const query = Object.fromEntries(urlObj.searchParams);\n \n const result = strategy.process(rule as MockConfig, query);\n\n /* 1. JSON Response */\n if (type === 'json') {\n return new Response(JSON.stringify(result), {\n status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n /* 2. SSE / SSE-Page Response */\n if (type === 'sse' || type === 'sse-page') {\n const events = result; // Strategy returns MockEvent[]\n const stream = eventsToStream(events);\n return new Response(stream, { \n status, \n headers: { 'Content-Type': 'text/event-stream' } \n });\n }\n\n return window._originalFetch(input, init);\n };\n}\n\nexport function installSSEMock() {\n // Placeholder for EventSource mocking if needed.\n // Currently, we rely on fetch interception.\n // Many modern apps use fetch for SSE (POST requests, headers, etc.)\n}\n\nexport function setupMock(schema: MockSchema) {\n if (typeof window !== 'undefined') {\n installFetchMock(schema);\n installSSEMock();\n }\n}\n","\nimport { ApiRequestConfig } from '@chatbi-v/core';\n\n// === Base Types ===\n\nexport type MockMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\nexport type MockType = 'json' | 'sse' | 'sse-page';\n\nexport interface MockEvent {\n event: string;\n data: any;\n /** Delay in ms, or a mockjs template string like '@increment(100)' */\n delay?: number | string;\n}\n\n// === Unified Strategy Interface ===\n\nexport interface MockStrategy {\n /**\n * Process the schema and return the result.\n * For JSON: returns the mocked object.\n * For SSE: returns an array of formatted event strings (chunks).\n */\n process(config: MockConfig, requestParams?: any): any;\n}\n\n// === Mock Configuration Types (Matching chat.mock.ts) ===\n\nexport interface BaseMockConfig {\n /** Optional: URL pattern if used in global interceptor */\n url?: string;\n /** Optional: Method if used in global interceptor */\n method?: MockMethod;\n /** Global delay for the request */\n delay?: number;\n /** Optional: HTTP status code (default: 200) */\n status?: number;\n /** Mock type (default: 'json') */\n type?: MockType;\n}\n\nexport interface JsonMockConfig extends BaseMockConfig {\n type?: 'json';\n /** The MockJS template for the response body */\n responseSchema: any;\n}\n\nexport interface SseMockConfig extends BaseMockConfig {\n type: 'sse';\n /** \n * Dictionary of event templates. \n * Key can be a mockjs template like 'data|3-5' \n */\n responseSchema: Record<string, MockEvent[]>;\n}\n\nexport interface SsePageMockConfig extends BaseMockConfig {\n type: 'sse-page';\n /** Dictionary of event templates */\n responseSchema: Record<string, MockEvent[]>;\n /** Special event for pagination metadata */\n pageEvent: MockEvent;\n}\n\nexport type MockConfig = JsonMockConfig | SseMockConfig | SsePageMockConfig;\n\nexport type MockSchema = Record<string, MockConfig>;\n\n// === Legacy Support (Keep these for backward compatibility if needed) ===\n\nexport interface ChatStreamConfig {\n _type: 'chat_stream';\n agentName?: string;\n plan?: string[];\n data?: Record<string, any>;\n timeline?: Array<{\n log?: string | { content: string; level?: 'info' | 'warning' | 'error'; agent?: string };\n planIndex?: number;\n delay?: number;\n }>;\n content: string | Record<string, any> | ((data: any) => string | Record<string, any>);\n}\n\nexport interface HistoryStreamConfig {\n _type: 'history_stream';\n template: Record<string, any>;\n prepend?: any[];\n}\n\nexport type AdvancedMockSchema = ChatStreamConfig | HistoryStreamConfig;\n\nexport interface MockGeneratorStrategy {\n generate(schema: any): string[];\n}\n\n// === Helper Functions (Restored) ===\n\nexport function createChatStream(config: Omit<ChatStreamConfig, '_type'>): ChatStreamConfig {\n return { _type: 'chat_stream', ...config };\n}\n\nexport function createHistoryStream(config: Omit<HistoryStreamConfig, '_type'>): HistoryStreamConfig {\n return { _type: 'history_stream', ...config };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,IAAAA,eAA0B;;;ACN1B,IAAAC,eAOO;AACP,IAAAC,iBAAiB;;;ACRjB,IAAAC,iBAAiB;;;ACAjB,kBAA0B;AAMnB,IAAM,wBAAN,MAA4B;AAAA,EACzB,SAAmB,CAAC;AAAA,EACpB;AAAA,EACA;AAAA,EACA,eAAuF,CAAC;AAAA,EAEhG,YAAY,YAAoB,aAAa,WAAoB;AAC/D,SAAK,YAAY,aAAc,UAAU,sBAAU,IAAI;AACvD,SAAK,YAAY;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,SAAiF;AAC3F,YAAQ,QAAQ,SAAO;AACrB,YAAM,OAAO;AAAA,QACX,SAAS,IAAI;AAAA,QACb,WAAW,KAAK;AAAA,QAChB,MAAM,IAAI;AAAA,QACV,WAAW;AAAA,QACX,WAAW,KAAK;AAAA,QAChB,YAAY,IAAI;AAAA,MAClB;AACA,WAAK,UAAU,QAAQ,IAAI;AAE3B,UAAI,IAAI,OAAO;AACb,aAAK,UAAU,SAAS,EAAE,OAAO,IAAI,MAAM,CAAC;AAAA,MAC9C;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,OAAiB;AACxB,SAAK,eAAe,MAAM,IAAI,WAAS;AAAA,MACrC,SAAS;AAAA,MACT,QAAQ;AAAA,IACV,EAAE;AACF,SAAK,UAAU;AACf,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAiB,aAAqB;AACpC,SAAK,eAAe,KAAK,aAAa,IAAI,CAAC,MAAM,UAAU;AACzD,UAAI,QAAQ,aAAa;AACvB,eAAO,EAAE,GAAG,MAAM,QAAQ,YAAY;AAAA,MACxC,WAAW,UAAU,aAAa;AAChC,eAAO,EAAE,GAAG,MAAM,QAAQ,cAAc;AAAA,MAC1C,OAAO;AACL,eAAO,EAAE,GAAG,MAAM,QAAQ,UAAU;AAAA,MACtC;AAAA,IACF,CAAC;AACD,SAAK,UAAU;AACf,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe;AACb,SAAK,eAAe,KAAK,aAAa,IAAI,WAAS,EAAE,GAAG,MAAM,QAAQ,YAAY,EAAE;AACpF,SAAK,UAAU;AACf,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,SAAiB,OAAqC,QAAQ,WAAoB;AACvF,SAAK,UAAU,OAAO;AAAA,MACpB;AAAA,MACA;AAAA,MACA,WAAW,aAAa,KAAK;AAAA,IAC/B,CAAC;AACD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,WAAmB,cAAsB;AAChD,SAAK,UAAU,SAAS;AAAA,MACtB;AAAA,MACA;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAc,SAAiB,YAAoB,IAAI;AACrD,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK,WAAW;AAClD,YAAM,QAAQ,QAAQ,MAAM,GAAG,IAAI,SAAS;AAC5C,WAAK,UAAU,QAAQ;AAAA,QACrB,SAAS;AAAA,QACT,WAAW,KAAK;AAAA,QAChB,WAAW;AAAA,QACX,WAAW,KAAK;AAAA,MAClB,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS;AACP,SAAK,UAAU,QAAQ;AAAA,MACrB,SAAS;AAAA,MACT,WAAW,KAAK;AAAA,MAChB,WAAW;AAAA,MACX,WAAW,KAAK;AAAA,IAClB,CAAC;AACD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,WAAgC;AACvC,UAAM,UAAU,KAAK,UAAU,WAAW,MAAM,CAAC;AACjD,WAAO,KAAK,cAAc,OAAO;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW;AACT,WAAO,KAAK,OAAO,KAAK,IAAI;AAAA,EAC9B;AAAA,EAEQ,YAAY;AAClB,SAAK,UAAU,SAAS,EAAE,OAAO,KAAK,aAAa,CAAC;AAAA,EACtD;AAAA,EAEQ,UAAU,MAAc,MAAW;AACzC,SAAK,OAAO,KAAK,UAAU,IAAI;AAAA,QAAW,KAAK,UAAU,IAAI,CAAC;AAAA,CAAI;AAAA,EACpE;AACF;;;ACjKA,mBAAkB;AAClB,oBAAiB;AAIV,IAAM,QAAQ,CAAC,OAAe,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC;AAMlE,SAAS,gBAAgB,MAAW,SAAmC;AAC5E,MAAI,OAAO,SAAS,UAAU;AAE5B,QAAI,eAAe,KAAK,IAAI,GAAG;AAC7B,YAAM,aAAa,KAAK,MAAM,GAAG,EAAE,EAAE,KAAK;AAC1C,UAAI;AAEF,cAAM,OAAO,OAAO,KAAK,OAAO;AAChC,cAAM,SAAS,OAAO,OAAO,OAAO;AACpC,cAAM,KAAK,IAAI,SAAS,GAAG,MAAM,UAAU,UAAU,EAAE;AACvD,eAAO,GAAG,GAAG,MAAM;AAAA,MACrB,SAAS,GAAG;AACV,gBAAQ,KAAK,uCAAuC,IAAI,IAAI,CAAC;AAC7D,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,WAAO,KAAK,IAAI,UAAQ,gBAAgB,MAAM,OAAO,CAAC;AAAA,EACxD;AAEA,MAAI,OAAO,SAAS,YAAY,SAAS,MAAM;AAC7C,UAAM,SAA8B,CAAC;AACrC,eAAW,OAAO,MAAM;AACtB,aAAO,GAAG,IAAI,gBAAgB,KAAK,GAAG,GAAG,OAAO;AAAA,IAClD;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AASO,SAAS,WACd,cACA,cAAmB,CAAC,GACP;AAEb,QAAM,UAA+B;AAAA,IACnC,QAAQ;AAAA;AAAA,IACR,OAAO;AAAA,IACP,QAAQ,aAAa,SAAS;AAAA,EAChC;AAGA,gBAAAC,QAAK,OAAO,OAAO;AAAA,IACjB,QAAQ,MAAM,QAAQ;AAAA,IACtB,OAAO,MAAM,QAAQ;AAAA,IACrB,QAAQ,MAAM,QAAQ;AAAA,EACxB,CAAC;AAGD,QAAM,WAAW,cAAAA,QAAK,KAAK,YAAY;AAGvC,SAAO,OAAO,OAAO,QAAQ,EAC1B,KAAK,EACL,IAAI,WAAS,gBAAgB,OAAO,OAAO,CAAC,EAC5C,KAAK,CAAC,GAAG,MAAM;AACZ,UAAM,SAAS,OAAO,EAAE,UAAU,WAAW,EAAE,QAAQ,SAAS,OAAO,EAAE,SAAS,CAAC,CAAC;AACpF,UAAM,SAAS,OAAO,EAAE,UAAU,WAAW,EAAE,QAAQ,SAAS,OAAO,EAAE,SAAS,CAAC,CAAC;AACpF,WAAO,SAAS;AAAA,EACpB,CAAC;AACL;AAKO,SAAS,eAAe,QAAqC;AAClE,QAAM,UAAU,IAAI,YAAY;AAEhC,SAAO,IAAI,eAAe;AAAA,IACxB,MAAM,MAAM;AAEV,UAAI,CAAC,UAAU,OAAO,WAAW,GAAG;AAClC,aAAK,MAAM;AACX;AAAA,MACF;AAEA,OAAC,YAAY;AACX,YAAI;AAGA,gBAAM,gBAAY,aAAAC,SAAM,EAAE,QAAQ;AAElC,qBAAW,aAAa,QAAQ;AAC5B,kBAAM,QAAQ,OAAO,UAAU,UAAU,WAAW,UAAU,QAAQ,SAAS,OAAO,UAAU,SAAS,CAAC,CAAC;AAG3G,kBAAM,cAAU,aAAAA,SAAM,EAAE,QAAQ,IAAI;AACpC,kBAAM,YAAY,KAAK,IAAI,GAAG,QAAQ,OAAO;AAE7C,gBAAI,YAAY,GAAG;AACf,oBAAM,MAAM,SAAS;AAAA,YACzB;AAEA,kBAAM,UAAU,UAAU,UAAU,KAAK;AAAA,QAAW,KAAK,UAAU,UAAU,IAAI,CAAC;AAAA;AAAA;AAClF,iBAAK,QAAQ,QAAQ,OAAO,OAAO,CAAC;AAAA,UACxC;AACA,eAAK,MAAM;AAAA,QACf,SAAS,GAAG;AACR,eAAK,MAAM,CAAC;AAAA,QAChB;AAAA,MACF,GAAG;AAAA,IACL;AAAA,EACF,CAAC;AACH;;;AF5GO,IAAM,qBAAN,MAA0D;AAAA,EAC/D,SAAS,QAAuB;AAC9B,UAAM,SAAS;AACf,UAAM,cAAc,OAAO,aAAa;AACxC,UAAM,YAAY,IAAI,sBAAsB,WAAW;AAEvD,UAAMC,YAAW,OAAO,OAAO,eAAAC,QAAK,KAAK,OAAO,IAAI,IAAI,CAAC;AAGzD,QAAI,OAAO,MAAM;AACf,gBAAU,SAAS,OAAO,IAAI;AAAA,IAChC;AAGA,QAAI,OAAO,UAAU;AACnB,aAAO,SAAS,QAAQ,UAAQ;AAC9B,YAAI,KAAK,cAAc,QAAW;AAChC,oBAAU,iBAAiB,KAAK,SAAS;AAAA,QAC3C;AACA,YAAI,KAAK,KAAK;AACZ,gBAAM,aAAa,OAAO,KAAK,QAAQ,WAAW,KAAK,MAAM,KAAK,IAAI;AACtE,gBAAM,WAAW,OAAO,KAAK,QAAQ,WAAW,KAAK,IAAI,QAAQ;AACjE,gBAAM,WAAW,OAAO,KAAK,QAAQ,WAAW,KAAK,IAAI,QAAQ;AACjE,oBAAU,OAAO,YAAY,UAAU,QAAQ;AAAA,QACjD;AAAA,MACF,CAAC;AAAA,IACH;AAGA,QAAI;AACJ,QAAI,OAAO,OAAO,YAAY,YAAY;AACxC,gBAAU,OAAO,QAAQD,SAAQ;AAAA,IACnC,OAAO;AACL,gBAAU,OAAO;AAAA,IACnB;AAEA,QAAI,OAAO,YAAY,YAAY,YAAY,MAAM;AAClD,gBAAU,SAAS,OAA8B;AAAA,IACpD,OAAO;AACJ,gBAAU,cAAc,OAAiB;AAAA,IAC5C;AAGA,cAAU,aAAa;AACvB,cAAU,OAAO;AAEjB,WAAO,UAAU,SAAS,EAAE,MAAM,MAAM,EAAE,IAAI,WAAS,QAAQ,MAAM;AAAA,EACvE;AACF;AAEO,IAAM,wBAAN,MAA6D;AAAA,EAClE,SAAS,QAAuB;AAC9B,UAAM,SAAS;AACf,UAAM,YAAY,IAAI,sBAAsB,gBAAM;AAElD,UAAM,cAAc,eAAAC,QAAK,KAAK,OAAO,QAAQ;AAC7C,UAAM,cAAc,CAAC,GAAI,OAAO,WAAW,CAAC,GAAI,GAAI,YAAY,QAAQ,WAAY;AACpF,cAAU,YAAY,WAAW;AAEjC,WAAO,UAAU,SAAS,EAAE,MAAM,MAAM,EAAE,IAAI,WAAS,QAAQ,MAAM;AAAA,EACvE;AACF;AAIO,IAAM,eAAN,MAA2C;AAAA,EAChD,QAAQ,QAAoB,gBAA2B;AACrD,UAAM,aAAa;AACnB,QAAI,CAAC,WAAW,eAAgB,QAAO,CAAC;AACxC,WAAO,eAAAA,QAAK,KAAK,WAAW,cAAc;AAAA,EAC5C;AACF;AAEO,IAAM,cAAN,MAA0C;AAAA,EAC/C,QAAQ,QAAoB,gBAAqB,CAAC,GAAgB;AAChE,UAAM,YAAY;AAClB,QAAI,CAAC,UAAU,eAAgB,QAAO,CAAC;AAGvC,WAAO,WAAW,UAAU,gBAAgB,aAAa;AAAA,EAC3D;AACF;AAEO,IAAM,kBAAN,MAA8C;AAAA,EACnD,QAAQ,QAAoB,gBAAqB,CAAC,GAAgB;AAChE,UAAM,gBAAgB;AACtB,QAAI,CAAC,cAAc,eAAgB,QAAO,CAAC;AAG3C,UAAM,SAAS,WAAW,cAAc,gBAAgB,aAAa;AAGrE,QAAI,cAAc,WAAW;AAC3B,YAAM,UAAU;AAAA,QACd,QAAQ;AAAA;AAAA,QACR,OAAO;AAAA,QACP,QAAQ,eAAe,SAAS;AAAA,MAClC;AAEA,qBAAAA,QAAK,OAAO,OAAO;AAAA,QACjB,QAAQ,MAAM,QAAQ;AAAA,QACtB,OAAO,MAAM,QAAQ;AAAA,QACrB,QAAQ,MAAM,QAAQ;AAAA,MACxB,CAAC;AAGD,UAAI,YAAY,eAAAA,QAAK,KAAK,cAAc,SAAS;AAEjD,kBAAY,gBAAgB,WAAW,OAAO;AAG9C,UAAI,WAAW;AACf,UAAI,OAAO,SAAS,GAAG;AACrB,cAAM,YAAY,OAAO,OAAO,SAAS,CAAC;AAC1C,mBAAW,OAAO,UAAU,UAAU,WAAW,UAAU,QAAQ,SAAS,OAAO,UAAU,SAAS,CAAC,CAAC;AAAA,MAC1G;AAGA,YAAM,YAAY,OAAO,UAAU,UAAU,WAAW,UAAU,QAAQ,SAAS,OAAO,UAAU,SAAS,CAAC,CAAC;AAC/G,UAAI,aAAa,UAAU;AACzB,kBAAU,QAAQ,WAAW;AAAA,MAC/B;AAEA,aAAO,KAAK,SAAS;AAAA,IACvB;AAGA,UAAM,KAAK,OAAO,KAAK,CAAC,GAAG,MAAM;AAC7B,YAAM,SAAS,OAAO,EAAE,UAAU,WAAW,EAAE,QAAQ,SAAS,OAAO,EAAE,SAAS,CAAC,CAAC;AACpF,YAAM,SAAS,OAAO,EAAE,UAAU,WAAW,EAAE,QAAQ,SAAS,OAAO,EAAE,SAAS,CAAC,CAAC;AACpF,aAAO,SAAS;AAAA,IACpB,CAAC;AACD,WAAO;AAAA,EACT;AACF;AAGO,IAAM,kBAAkB;AAAA,EAC7B,YAAY,OAAe,QAAsB;AAC/C,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO,IAAI,YAAY;AAAA,MACzB,KAAK;AACH,eAAO,IAAI,gBAAgB;AAAA,MAC7B,KAAK;AAAA,MACL;AACE,eAAO,IAAI,aAAa;AAAA,IAC5B;AAAA,EACF;AACF;;;ADxJA,IAAM,aAAS,2BAAa,aAAa;AAMlC,IAAM,cAAN,MAAM,aAAkC;AAAA,EACrC;AAAA;AAAA,EAER,OAAe,aAAoD;AAAA,IACjE,aAAa,IAAI,mBAAmB;AAAA,IACpC,gBAAgB,IAAI,sBAAsB;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,QAAgB,KAAK;AAC/B,SAAK,QAAQ;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,iBAAiB,KAAa,UAAiC;AACpE,SAAK,WAAW,GAAG,IAAI;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,QAAiB,QAA0B,gBAAgD;AAE/F,UAAM,QAAS,gBAAwB,SAAS,KAAK;AAErD,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,iBAAW,MAAM;AACf,YAAI;AACF,cAAI,CAAC,kBAAkB,CAAC,eAAe,gBAAgB;AACrD,mBAAO,KAAK,2DAAc,OAAO,GAAG,EAAE;AACtC,oBAAQ,CAAC,CAAM;AACf;AAAA,UACF;AAEA,cAAI,SAAS,eAAe;AAC5B,cAAIC;AAGJ,cAAI,OAAO,WAAW,YAAY;AAChC,qBAAS,OAAO,MAAM;AAAA,UACxB;AAGA,gBAAM,kBAAkB;AAAA,YACtB,MAAO,eAAuB;AAAA,YAC9B,QAAS,eAAuB,UAAU;AAAA,YAC1C,WAAY,eAAuB;AAAA,YACnC,gBAAgB;AAAA,YAChB,GAAI,OAAO,WAAW,WAAW,SAAS,CAAC;AAAA,UAC7C;AAGA,cAAI,gBAAgB,WAAW,KAAK;AAClC,kBAAM,QAAa,IAAI,MAAM,mCAAmC,gBAAgB,MAAM,EAAE;AACxF,kBAAM,WAAW;AAAA,cACf,QAAQ,gBAAgB;AAAA,cACxB,MAAM,eAAAC,QAAK,KAAK,MAAM;AAAA,cACtB,SAAS,CAAC;AAAA,YACZ;AACA,mBAAO,KAAK;AACZ;AAAA,UACF;AAGA,cAAI,OAAO,WAAW,UAAU;AAC9B,YAAAD,YAAW;AAAA,UACb,WAES,KAAK,eAAe,MAAM,GAAG;AACpC,kBAAM,WAAW,aAAY,WAAW,OAAO,KAAK;AACpD,gBAAI,UAAU;AACZ,oBAAM,SAAS,SAAS,SAAS,MAAM;AAEvC,cAAAA,YAAW,OACR,KAAK,EAAE,EACP,QAAQ,wBAAwB,EAAE,EAClC,QAAQ,SAAS,EAAE;AACtB,kBAAI;AACF,gBAAAA,YAAW,KAAK,MAAMA,SAAQ;AAAA,cAChC,SAAS,GAAG;AAAA,cAEZ;AAAA,YACF,OAAO;AACL,qBAAO,KAAK,iEAAe,OAAO,KAAK,EAAE;AACzC,cAAAA,YAAW,CAAC;AAAA,YACd;AAAA,UACF,OAEK;AACH,kBAAM,OAAO,gBAAgB,QAAQ;AACrC,kBAAM,WAAW,gBAAgB,YAAY,IAAI;AACjD,YAAAA,YAAW,SAAS,QAAQ,iBAA+B,OAAO,UAAU,OAAO,IAAI;AAAA,UACzF;AAEA,iBAAO,KAAK,YAAY,OAAO,MAAM,IAAI,OAAO,GAAG,IAAI,OAAO,QAAQ,OAAO,MAAM;AACnF,iBAAO,KAAK,aAAaA,SAAQ;AAEjC,kBAAQA,SAAa;AAAA,QACvB,SAAS,OAAO;AACd,iBAAO,KAAK;AAAA,QACd;AAAA,MACF,GAAG,KAAK;AAAA,IACV,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,OACJ,QACA,WACA,gBACe;AACf,UAAM,EAAE,WAAW,UAAU,QAAQ,IAAI;AACzC,UAAM,SAAS,OAAO;AAGtB,UAAM,QAAS,gBAAwB,SAAS,KAAK;AAErD,WAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAE5C,UAAI,UAAU,OAAO,SAAS;AAC5B,YAAI,SAAU,UAAS;AACvB,gBAAQ;AACR;AAAA,MACF;AAEA,iBAAW,YAAY;AACrB,YAAI;AACF,cAAI,CAAC,kBAAkB,CAAC,eAAe,gBAAgB;AACrD,mBAAO,KAAK,2DAAc,OAAO,GAAG,EAAE;AACtC,gBAAI,SAAU,UAAS;AACvB,oBAAQ;AACR;AAAA,UACF;AAEA,gBAAM,eAAe,uBAAU,IAAI;AACnC,iBAAO,KAAK,wBAAwB,OAAO,MAAM,IAAI,OAAO,GAAG,IAAI;AAAA,YACjE,QAAQ,OAAO,QAAQ,OAAO;AAAA,YAC9B,MAAM,uBAAU,MAAM,EAAE,YAAY;AAAA,UACtC,CAAC;AAED,cAAI,SAAS,eAAe;AAG5B,cAAI,OAAO,WAAW,YAAY;AAChC,qBAAS,OAAO,MAAM;AAAA,UACxB;AAGA,gBAAM,kBAAkB;AAAA,YACtB,MAAO,eAAuB;AAAA,YAC9B,QAAS,eAAuB,UAAU;AAAA,YAC1C,WAAY,eAAuB;AAAA,YACnC,gBAAgB;AAAA,YAChB,GAAI,OAAO,WAAW,WAAW,SAAS,CAAC;AAAA,UAC7C;AAGA,cAAI,gBAAgB,WAAW,KAAK;AAClC,kBAAM,WAAW;AAAA,cACf,QAAQ,gBAAgB;AAAA,cACxB,MAAM,eAAAC,QAAK,KAAK,MAAM;AAAA,cACtB,SAAS,CAAC;AAAA,YACZ;AAGA,gBAAI,UAAU,YAAY;AACxB,oBAAM,WAAW,MAAM,UAAU,WAAW,QAAQ;AACpD,kBAAI,UAAU;AACZ,wBAAQ;AACR;AAAA,cACF;AAAA,YACF;AAEA,kBAAM,QAAa,IAAI,MAAM,0CAA0C,gBAAgB,MAAM,EAAE;AAC/F,kBAAM,WAAW;AACjB,mBAAO,MAAM,0CAA0C,gBAAgB,MAAM,IAAI,KAAK;AACtF,gBAAI,QAAS,SAAQ,KAAK;AAE1B,mBAAO,KAAK;AACZ;AAAA,UACF;AAGA,cAAI,UAAU,YAAY;AACxB,kBAAM,WAAW,MAAM,UAAU,WAAW;AAAA,cAC1C,QAAQ;AAAA,cACR,MAAM;AAAA,cACN,SAAS,CAAC;AAAA,YACZ,CAAC;AACD,gBAAI,UAAU;AACZ,sBAAQ;AACR;AAAA,YACF;AAAA,UACF;AAGA,cAAI,KAAK,YAAY,eAAe,GAAG;AACrC,kBAAM,OAAO,gBAAgB,QAAQ;AACrC,kBAAM,WAAW,gBAAgB,YAAY,IAAI;AAGjD,kBAAM,SAAS,SAAS;AAAA,cACtB;AAAA,cACA,OAAO,UAAU,OAAO;AAAA,YAC1B;AAEA,gBAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,oBAAM,YAAY,uBAAU,IAAI;AAChC,kBAAI,aAAa;AAEjB,qBAAO;AAAA,gBACL,8BAA8B,OAAO,MAAM,eAAe,IAAI;AAAA,cAChE;AAEA,yBAAW,SAAS,QAAQ;AAC1B,oBAAI,UAAU,OAAO,SAAS;AAC5B,yBAAO;AAAA,oBACL,4CAA4C,uBAAU,IAAI,IAAI,YAAY;AAAA,kBAC5E;AACA;AAAA,gBACF;AAGA,sBAAMC,SACJ,OAAO,MAAM,UAAU,WACnB,MAAM,QACN,SAAS,OAAO,MAAM,SAAS,CAAC,CAAC;AACvC,sBAAM,UAAU,uBAAU,IAAI,IAAI;AAClC,sBAAM,YAAY,KAAK,IAAI,GAAGA,SAAQ,OAAO;AAE7C,oBAAI,YAAY,GAAG;AACjB,wBAAM,MAAM,SAAS;AAAA,gBACvB;AAEA,oBAAI,UAAU,OAAO,QAAS;AAG9B,sBAAM,QAAQ,UAAU,MAAM,KAAK;AAAA,QAAW,KAAK,UAAU,MAAM,IAAI,CAAC;AAAA;AAAA;AAGxE,oBAAI,CAAC,SAAS,SAAS,MAAM,EAAE,SAAS,MAAM,KAAK,GAAG;AACpD,yBAAO,KAAK,uCAAuC,MAAM,KAAK,IAAI,MAAM,IAAI;AAAA,gBAC9E,WAAW,eAAe,KAAK,eAAe,OAAO,SAAS,GAAG;AAC/D,yBAAO;AAAA,oBACL,wBAAwB,eAAe,IAAI,UAAU,MAAM;AAAA,oBAC3D,EAAE,SAAS,KAAK,UAAU,MAAM,IAAI,EAAE,MAAM,GAAG,EAAE,IAAI,MAAM;AAAA,kBAC7D;AAAA,gBACF;AACA,oBAAI,UAAW,WAAU,KAAK;AAC9B;AAAA,cACF;AAAA,YACF;AAAA,UACF,OAEK;AACH,gBAAI,SAAmB,CAAC;AAExB,gBAAI,OAAO,WAAW,UAAU;AAC9B,uBAAS,OAAO,MAAM,MAAM,EAAE,IAAI,CAAC,UAAU,QAAQ,MAAM;AAAA,YAC7D,WAAW,KAAK,eAAe,MAAM,GAAG;AACtC,uBAAS,KAAK,uBAAuB,MAAM;AAAA,YAC7C,OAAO;AACL,oBAAMF,YAAW,eAAAC,QAAK,KAAK,MAAM;AACjC,uBAAS,CAAC,SAAS,KAAK,UAAUD,SAAQ,CAAC;AAAA;AAAA,CAAM;AAAA,YACnD;AAEA,uBAAW,SAAS,QAAQ;AAC1B,kBAAI,UAAU,OAAO,SAAS;AAC5B,uBAAO,KAAK,oCAAoC;AAChD;AAAA,cACF;AAEA,kBAAI,MAAM,KAAK,GAAG;AAChB,oBAAI,UAAW,WAAU,KAAK;AAC9B,sBAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC;AAAA,cAC7C;AAAA,YACF;AAAA,UACF;AAEA,cAAI,CAAC,UAAU,CAAC,OAAO,SAAS;AAC9B,mBAAO;AAAA,cACL,kDAAkD,uBAAU,IAAI,IAAI,YAAY;AAAA,YAClF;AACA,gBAAI,SAAU,UAAS;AAAA,UACzB;AACA,kBAAQ;AAAA,QACV,SAAS,OAAO;AACd,iBAAO,MAAM,wCAAwC,KAAK;AAC1D,cAAI,QAAS,SAAQ,KAAK;AAC1B,kBAAQ;AAAA,QACV;AAAA,MACF,GAAG,KAAK;AAAA,IACV,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,QAAsB;AAC3C,WAAO,UAAU,OAAO,WAAW,YAAY,WAAW;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,YAAY,QAAsB;AACxC,WACE,UACA,OAAO,WAAW,aACjB,CAAC,QAAQ,OAAO,UAAU,EAAE,SAAS,OAAO,IAAI,KAAK,oBAAoB;AAAA,EAE9E;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAAuB,QAAuB;AACpD,UAAM,WAAW,aAAY,WAAW,OAAO,KAAK;AACpD,QAAI,UAAU;AACZ,aAAO,SAAS,SAAS,MAAM;AAAA,IACjC;AACA,WAAO,KAAK,iEAAe,OAAO,KAAK,EAAE;AACzC,WAAO,CAAC;AAAA,EACV;AACF;;;AI3VO,SAAS,iBAAiB,QAAoB;AACnD,MAAI,CAAC,OAAO,gBAAgB;AAC1B,WAAO,iBAAiB,OAAO;AAAA,EACjC;AAEA,SAAO,QAAQ,OAAO,OAA0B,OAAoB,CAAC,MAAM;AACzE,UAAM,MAAM,OAAO,UAAU,WAAW,QAAQ,iBAAiB,MAAM,MAAM,SAAS,IAAI,MAAM;AAChG,UAAM,UAAU,KAAK,UAAU,OAAO,YAAY;AAGlD,UAAM,QAAQ,OAAO,OAAO,MAAM;AAClC,UAAM,OAAO,MAAM,KAAK,CAAC,MAAM;AAC3B,UAAI,CAAC,EAAE,IAAK,QAAO;AAGnB,YAAM,UAAU,EAAE,IAAI,QAAQ,mBAAmB,SAAS;AAC1D,YAAM,QAAQ,IAAI,OAAO,IAAI,OAAO,GAAG;AAGvC,YAAM,CAAC,IAAI,IAAI,IAAI,MAAM,GAAG;AAG5B,YAAM,cAAc,EAAE,UAAU,OAAO,YAAY;AACnD,aAAO,MAAM,KAAK,IAAI,KAAK,eAAe;AAAA,IAC9C,CAAC;AAED,QAAI,CAAC,MAAM;AACT,aAAO,OAAO,eAAe,OAAO,IAAI;AAAA,IAC1C;AAEA,YAAQ,IAAI,sBAAsB,MAAM,IAAI,GAAG,IAAI,IAAI;AAGvD,UAAM,SAAS,KAAK,UAAU;AAC9B,QAAI,WAAW,KAAK;AAClB,YAAM,MAAM,KAAK,SAAS,CAAC;AAC3B,aAAO,IAAI,SAAS,KAAK,UAAU;AAAA,QACjC,SAAS,qBAAqB,MAAM;AAAA,QACpC,MAAM;AAAA,MACR,CAAC,GAAG;AAAA,QACF;AAAA,QACA,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAChD,CAAC;AAAA,IACH;AAEA,UAAM,MAAM,KAAK,SAAS,CAAC;AAG3B,UAAM,OAAO,KAAK,QAAQ;AAC1B,UAAM,WAAW,gBAAgB,YAAY,IAAI;AAGjD,UAAM,SAAS,IAAI,IAAI,KAAK,OAAO,SAAS,MAAM;AAClD,UAAM,QAAQ,OAAO,YAAY,OAAO,YAAY;AAEpD,UAAM,SAAS,SAAS,QAAQ,MAAoB,KAAK;AAGzD,QAAI,SAAS,QAAQ;AACnB,aAAO,IAAI,SAAS,KAAK,UAAU,MAAM,GAAG;AAAA,QAC1C;AAAA,QACA,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAChD,CAAC;AAAA,IACH;AAGA,QAAI,SAAS,SAAS,SAAS,YAAY;AACzC,YAAM,SAAS;AACf,YAAM,SAAS,eAAe,MAAM;AACpC,aAAO,IAAI,SAAS,QAAQ;AAAA,QAC1B;AAAA,QACA,SAAS,EAAE,gBAAgB,oBAAoB;AAAA,MACjD,CAAC;AAAA,IACH;AAEA,WAAO,OAAO,eAAe,OAAO,IAAI;AAAA,EAC1C;AACF;AAEO,SAAS,iBAAiB;AAIjC;AAEO,SAAS,UAAU,QAAoB;AAC5C,MAAI,OAAO,WAAW,aAAa;AACjC,qBAAiB,MAAM;AACvB,mBAAe;AAAA,EACjB;AACF;;;ACNO,SAAS,iBAAiB,QAA2D;AAC1F,SAAO,EAAE,OAAO,eAAe,GAAG,OAAO;AAC3C;AAEO,SAAS,oBAAoB,QAAiE;AACnG,SAAO,EAAE,OAAO,kBAAkB,GAAG,OAAO;AAC9C;;;ANhFO,IAAM,YAAY;AAAA,EACvB,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AACR;AAGO,IAAM,gBAAgB;AAAA,EAC3B,EAAE,IAAI,SAAS,OAAO,oCAAgB,MAAM,cAAc,aAAa,wFAAuB;AAAA,EAC9F,EAAE,IAAI,SAAS,OAAO,wCAAU,MAAM,cAAc,aAAa,sDAAc;AAAA,EAC/E,EAAE,IAAI,SAAS,OAAO,wCAAU,MAAM,cAAc,aAAa,+DAAkB;AAAA,EACnF,EAAE,IAAI,SAAS,OAAO,wCAAU,MAAM,cAAc,aAAa,gCAAiB;AAAA,EAClF,EAAE,IAAI,SAAS,OAAO,wCAAU,MAAM,cAAc,aAAa,4DAAe;AAClF;AAEO,IAAM,iBAAiB;AAAA,EAC5B,EAAE,IAAI,SAAS,OAAO,wCAAU,MAAM,aAAa;AAAA,EACnD,EAAE,IAAI,SAAS,OAAO,wCAAU,MAAM,aAAa;AAAA,EACnD,EAAE,IAAI,SAAS,OAAO,wCAAU,MAAM,aAAa;AACrD;AAEO,IAAM,cAAc;AAAA,EACzB;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,MAAM;AAAA,IACN,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,MAAM;AAAA,IACN,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,MAAM;AAAA,IACN,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,EACT;AACF;AAEO,IAAM,uBAAuB,CAAC,cAAsB;AAAA,EACzD;AAAA,IACE,KAAK,OAAO,SAAS;AAAA,IACrB,MAAM;AAAA,IACN,SAAS,wGAAwB,SAAS;AAAA,IAC1C,MAAM,uBAAU,MAAM,uBAAU,IAAI,IAAI,GAAK,EAAE,YAAY;AAAA,EAC7D;AACF;AAEO,IAAM,WAAW;AAAA,EACtB,MAAM;AAAA,EACN,UAAU;AAAA,EACV,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,eAAe;AAAA;AACjB;","names":["import_core","import_core","import_mockjs","import_mockjs","Mock","dayjs","mockData","Mock","mockData","Mock","delay"]}
package/dist/index.js CHANGED
@@ -1,78 +1,25 @@
1
- "use strict";
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
19
- };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
-
30
1
  // src/index.ts
31
- var index_exports = {};
32
- __export(index_exports, {
33
- ChatStreamStrategy: () => ChatStreamStrategy,
34
- HistoryStreamStrategy: () => HistoryStreamStrategy,
35
- JsonStrategy: () => JsonStrategy,
36
- MOCK_FAVORITES: () => MOCK_FAVORITES,
37
- MOCK_SCENES: () => MOCK_SCENES,
38
- MOCK_SESSIONS: () => MOCK_SESSIONS,
39
- MOCK_USER: () => MOCK_USER,
40
- MockAdapter: () => MockAdapter,
41
- MockResponseGenerator: () => MockResponseGenerator,
42
- SsePageStrategy: () => SsePageStrategy,
43
- SseStrategy: () => SseStrategy,
44
- StrategyFactory: () => StrategyFactory,
45
- createChatStream: () => createChatStream,
46
- createHistoryStream: () => createHistoryStream,
47
- eventsToStream: () => eventsToStream,
48
- flatEvents: () => flatEvents,
49
- generateMockMessages: () => generateMockMessages,
50
- installFetchMock: () => installFetchMock,
51
- installSSEMock: () => installSSEMock,
52
- mockData: () => mockData,
53
- processTemplate: () => processTemplate,
54
- setupMock: () => setupMock,
55
- sleep: () => sleep
56
- });
57
- module.exports = __toCommonJS(index_exports);
58
- var import_core3 = require("@chatbi-v/core");
2
+ import { dateUtils as dateUtils3 } from "@chatbi-v/core";
59
3
 
60
4
  // src/adapter.ts
61
- var import_core2 = require("@chatbi-v/core");
62
- var import_mockjs3 = __toESM(require("mockjs"));
5
+ import {
6
+ createLogger,
7
+ dateUtils as dateUtils2
8
+ } from "@chatbi-v/core";
9
+ import Mock3 from "mockjs";
63
10
 
64
11
  // src/strategies.ts
65
- var import_mockjs2 = __toESM(require("mockjs"));
12
+ import Mock2 from "mockjs";
66
13
 
67
14
  // src/generator.ts
68
- var import_core = require("@chatbi-v/core");
15
+ import { dateUtils } from "@chatbi-v/core";
69
16
  var MockResponseGenerator = class {
70
17
  events = [];
71
18
  sessionId;
72
19
  agentName;
73
20
  currentTodos = [];
74
21
  constructor(agentName = "Assistant", sessionId) {
75
- this.sessionId = sessionId || "conv_" + import_core.dateUtils.now();
22
+ this.sessionId = sessionId || "conv_" + dateUtils.now();
76
23
  this.agentName = agentName;
77
24
  }
78
25
  /**
@@ -212,8 +159,8 @@ data: ${JSON.stringify(data)}
212
159
  };
213
160
 
214
161
  // src/utils.ts
215
- var import_dayjs = __toESM(require("dayjs"));
216
- var import_mockjs = __toESM(require("mockjs"));
162
+ import dayjs from "dayjs";
163
+ import Mock from "mockjs";
217
164
  var sleep = (ms) => new Promise((r) => setTimeout(r, ms));
218
165
  function processTemplate(data, context) {
219
166
  if (typeof data === "string") {
@@ -250,12 +197,12 @@ function flatEvents(eventsSchema, requestData = {}) {
250
197
  $body: requestData,
251
198
  $param: requestData?.param || requestData
252
199
  };
253
- import_mockjs.default.Random.extend({
200
+ Mock.Random.extend({
254
201
  $query: () => context.$query,
255
202
  $body: () => context.$body,
256
203
  $param: () => context.$param
257
204
  });
258
- const compiled = import_mockjs.default.mock(eventsSchema);
205
+ const compiled = Mock.mock(eventsSchema);
259
206
  return Object.values(compiled).flat().map((event) => processTemplate(event, context)).sort((a, b) => {
260
207
  const delayA = typeof a.delay === "number" ? a.delay : parseInt(String(a.delay || 0));
261
208
  const delayB = typeof b.delay === "number" ? b.delay : parseInt(String(b.delay || 0));
@@ -272,10 +219,10 @@ function eventsToStream(events) {
272
219
  }
273
220
  (async () => {
274
221
  try {
275
- const startTime = (0, import_dayjs.default)().valueOf();
222
+ const startTime = dayjs().valueOf();
276
223
  for (const eventItem of events) {
277
224
  const delay = typeof eventItem.delay === "number" ? eventItem.delay : parseInt(String(eventItem.delay || 0));
278
- const elapsed = (0, import_dayjs.default)().valueOf() - startTime;
225
+ const elapsed = dayjs().valueOf() - startTime;
279
226
  const remaining = Math.max(0, delay - elapsed);
280
227
  if (remaining > 0) {
281
228
  await sleep(remaining);
@@ -301,7 +248,7 @@ var ChatStreamStrategy = class {
301
248
  const config = schema;
302
249
  const defaultName = config.agentName || "BI\u52A9\u624B";
303
250
  const generator = new MockResponseGenerator(defaultName);
304
- const mockData2 = config.data ? import_mockjs2.default.mock(config.data) : {};
251
+ const mockData2 = config.data ? Mock2.mock(config.data) : {};
305
252
  if (config.plan) {
306
253
  generator.initPlan(config.plan);
307
254
  }
@@ -338,7 +285,7 @@ var HistoryStreamStrategy = class {
338
285
  generate(schema) {
339
286
  const config = schema;
340
287
  const generator = new MockResponseGenerator("BI\u52A9\u624B");
341
- const historyMock = import_mockjs2.default.mock(config.template);
288
+ const historyMock = Mock2.mock(config.template);
342
289
  const fullHistory = [...config.prepend || [], ...historyMock.list || historyMock];
343
290
  generator.emitHistory(fullHistory);
344
291
  return generator.toString().split("\n\n").map((chunk) => chunk + "\n\n");
@@ -348,7 +295,7 @@ var JsonStrategy = class {
348
295
  process(config, _requestParams) {
349
296
  const jsonConfig = config;
350
297
  if (!jsonConfig.responseSchema) return {};
351
- return import_mockjs2.default.mock(jsonConfig.responseSchema);
298
+ return Mock2.mock(jsonConfig.responseSchema);
352
299
  }
353
300
  };
354
301
  var SseStrategy = class {
@@ -370,12 +317,12 @@ var SsePageStrategy = class {
370
317
  $body: requestParams,
371
318
  $param: requestParams?.param || requestParams
372
319
  };
373
- import_mockjs2.default.Random.extend({
320
+ Mock2.Random.extend({
374
321
  $query: () => context.$query,
375
322
  $body: () => context.$body,
376
323
  $param: () => context.$param
377
324
  });
378
- let pageEvent = import_mockjs2.default.mock(ssePageConfig.pageEvent);
325
+ let pageEvent = Mock2.mock(ssePageConfig.pageEvent);
379
326
  pageEvent = processTemplate(pageEvent, context);
380
327
  let maxDelay = 0;
381
328
  if (events.length > 0) {
@@ -411,7 +358,7 @@ var StrategyFactory = {
411
358
  };
412
359
 
413
360
  // src/adapter.ts
414
- var logger = (0, import_core2.createLogger)("MockAdapter");
361
+ var logger = createLogger("MockAdapter");
415
362
  var MockAdapter = class _MockAdapter {
416
363
  delay;
417
364
  // 遗留策略(为了兼容旧版代码)
@@ -466,7 +413,7 @@ var MockAdapter = class _MockAdapter {
466
413
  const error = new Error(`Request failed with status code ${effectiveConfig.status}`);
467
414
  error.response = {
468
415
  status: effectiveConfig.status,
469
- data: import_mockjs3.default.mock(schema),
416
+ data: Mock3.mock(schema),
470
417
  headers: {}
471
418
  };
472
419
  reject(error);
@@ -525,10 +472,10 @@ var MockAdapter = class _MockAdapter {
525
472
  resolve();
526
473
  return;
527
474
  }
528
- const requestStart = import_core2.dateUtils.now();
475
+ const requestStart = dateUtils2.now();
529
476
  logger.info(`[SSE Start] Request: ${config.method} ${config.url}`, {
530
477
  params: config.data || config.params,
531
- time: import_core2.dateUtils.dayjs().toISOString()
478
+ time: dateUtils2.dayjs().toISOString()
532
479
  });
533
480
  let schema = endpointConfig.responseSchema;
534
481
  if (typeof schema === "function") {
@@ -544,7 +491,7 @@ var MockAdapter = class _MockAdapter {
544
491
  if (effectiveConfig.status !== 200) {
545
492
  const response = {
546
493
  status: effectiveConfig.status,
547
- data: import_mockjs3.default.mock(schema),
494
+ data: Mock3.mock(schema),
548
495
  headers: {}
549
496
  };
550
497
  if (callbacks.onResponse) {
@@ -580,7 +527,7 @@ var MockAdapter = class _MockAdapter {
580
527
  config.params || config.data
581
528
  );
582
529
  if (Array.isArray(events)) {
583
- const startTime = import_core2.dateUtils.now();
530
+ const startTime = dateUtils2.now();
584
531
  let eventCount = 0;
585
532
  logger.info(
586
533
  `[SSE Processing] Generated ${events.length} events for ${type} strategy`
@@ -588,12 +535,12 @@ var MockAdapter = class _MockAdapter {
588
535
  for (const event of events) {
589
536
  if (signal && signal.aborted) {
590
537
  logger.info(
591
- `[SSE Abort] Stream aborted by user after ${import_core2.dateUtils.now() - requestStart}ms`
538
+ `[SSE Abort] Stream aborted by user after ${dateUtils2.now() - requestStart}ms`
592
539
  );
593
540
  break;
594
541
  }
595
542
  const delay2 = typeof event.delay === "number" ? event.delay : parseInt(String(event.delay || 0));
596
- const elapsed = import_core2.dateUtils.now() - startTime;
543
+ const elapsed = dateUtils2.now() - startTime;
597
544
  const remaining = Math.max(0, delay2 - elapsed);
598
545
  if (remaining > 0) {
599
546
  await sleep(remaining);
@@ -622,7 +569,7 @@ data: ${JSON.stringify(event.data)}
622
569
  } else if (this.isLegacySchema(schema)) {
623
570
  chunks = this.generateAdvancedChunks(schema);
624
571
  } else {
625
- const mockData2 = import_mockjs3.default.mock(schema);
572
+ const mockData2 = Mock3.mock(schema);
626
573
  chunks = [`data: ${JSON.stringify(mockData2)}
627
574
 
628
575
  `];
@@ -640,7 +587,7 @@ data: ${JSON.stringify(event.data)}
640
587
  }
641
588
  if (!signal || !signal.aborted) {
642
589
  logger.info(
643
- `[SSE Complete] Stream finished successfully in ${import_core2.dateUtils.now() - requestStart}ms`
590
+ `[SSE Complete] Stream finished successfully in ${dateUtils2.now() - requestStart}ms`
644
591
  );
645
592
  if (onFinish) onFinish();
646
593
  }
@@ -813,7 +760,7 @@ var generateMockMessages = (sessionId) => [
813
760
  key: `msg_${sessionId}_1`,
814
761
  role: "assistant",
815
762
  content: `\u60A8\u597D\uFF01\u6211\u662F\u60A8\u7684\u667A\u80FD\u52A9\u624B\u3002\u5F53\u524D\u4F1A\u8BDD ID: ${sessionId}\u3002\u8BF7\u95EE\u6709\u4EC0\u4E48\u53EF\u4EE5\u5E2E\u60A8\uFF1F`,
816
- time: import_core3.dateUtils.dayjs(import_core3.dateUtils.now() - 1e4).toISOString()
763
+ time: dateUtils3.dayjs(dateUtils3.now() - 1e4).toISOString()
817
764
  }
818
765
  ];
819
766
  var mockData = {
@@ -824,8 +771,7 @@ var mockData = {
824
771
  favoritesList: MOCK_FAVORITES
825
772
  // Alias for compatibility if needed
826
773
  };
827
- // Annotate the CommonJS export names for ESM import in node:
828
- 0 && (module.exports = {
774
+ export {
829
775
  ChatStreamStrategy,
830
776
  HistoryStreamStrategy,
831
777
  JsonStrategy,
@@ -849,5 +795,5 @@ var mockData = {
849
795
  processTemplate,
850
796
  setupMock,
851
797
  sleep
852
- });
798
+ };
853
799
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/adapter.ts","../src/strategies.ts","../src/generator.ts","../src/utils.ts","../src/interceptor.ts","../src/types.ts"],"sourcesContent":["/**\n * @file index.ts\n * @description Mock 模块入口,导出模拟数据适配器、生成器及静态测试数据\n * @author ChatBI Team\n */\n\nimport { dateUtils } from '@chatbi-v/core';\n\n/**\n * Mock 数据模块\n * @description 提供前端开发所需的模拟数据适配器和工具\n */\n\nexport * from './adapter';\nexport * from './generator';\nexport * from './interceptor';\nexport * from './strategies';\nexport * from './types';\nexport * from './utils';\n\n/**\n * 模拟用户数据\n */\nexport const MOCK_USER = {\n id: 'u_001',\n name: 'Admin User',\n avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=Admin',\n role: 'admin',\n};\n\n// 保留原有的静态数据导出,以兼容可能直接引用的地方,但建议使用 adapter 自动生成\nexport const MOCK_SESSIONS = [\n { id: 's_001', title: '2024 Q1 销售分析', date: '2024-03-15', lastMessage: '好的,正在为您分析 Q1 销售数据...' },\n { id: 's_002', title: '用户增长趋势', date: '2024-03-10', lastMessage: '用户增长曲线显示...' },\n { id: 's_003', title: '竞品分析报告', date: '2024-03-08', lastMessage: '主要竞品 A 的市场份额...' },\n { id: 's_004', title: '营销活动复盘', date: '2024-03-05', lastMessage: 'ROI 提升了 15%...' },\n { id: 's_005', title: '财务报表审计', date: '2024-03-01', lastMessage: '请确认以下财务指标...' },\n];\n\nexport const MOCK_FAVORITES = [\n { id: 'fav-1', title: '季度销售总结', date: '2025/12/15' },\n { id: 'fav-2', title: '年度预算规划', date: '2025/12/10' },\n { id: 'fav-3', title: '核心指标监控', date: '2025/11/20' },\n];\n\nexport const MOCK_SCENES = [\n {\n id: '1',\n name: '销售数据分析',\n description: '全方位分析销售业绩,包括区域、产品、时间维度',\n code: 'SALES_001',\n creator: '管理员',\n createTime: '2023-01-01',\n tableCount: 5,\n kbCount: 2,\n qaCount: 10,\n cover: 'https://images.unsplash.com/photo-1551288049-bebda4e38f71?w=800&q=80',\n },\n {\n id: '2',\n name: '人力资源概览',\n description: '员工入职、离职、绩效分布与培训情况分析',\n code: 'HR_001',\n creator: 'HR 经理',\n createTime: '2023-02-15',\n tableCount: 3,\n kbCount: 1,\n qaCount: 5,\n cover: 'https://images.unsplash.com/photo-1460925895917-afdab827c52f?w=800&q=80',\n },\n {\n id: '3',\n name: '供应链优化',\n description: '库存周转、物流成本与供应商绩效评估',\n code: 'SCM_001',\n creator: '供应链总监',\n createTime: '2023-03-20',\n tableCount: 8,\n kbCount: 0,\n qaCount: 15,\n cover: 'https://images.unsplash.com/photo-1586528116311-ad8dd3c8310d?w=800&q=80',\n },\n];\n\nexport const generateMockMessages = (sessionId: string) => [\n {\n key: `msg_${sessionId}_1`,\n role: 'assistant',\n content: `您好!我是您的智能助手。当前会话 ID: ${sessionId}。请问有什么可以帮您?`,\n time: dateUtils.dayjs(dateUtils.now() - 10000).toISOString(),\n },\n];\n\nexport const mockData = {\n user: MOCK_USER,\n sessions: MOCK_SESSIONS,\n favorites: MOCK_FAVORITES,\n scenes: MOCK_SCENES,\n favoritesList: MOCK_FAVORITES, // Alias for compatibility if needed\n};\n","import {\n ApiAdapter,\n ApiEndpointConfig,\n ApiRequestConfig,\n createLogger,\n dateUtils,\n StreamCallbacks,\n} from '@chatbi-v/core';\nimport Mock from 'mockjs';\n\nimport { ChatStreamStrategy, HistoryStreamStrategy, StrategyFactory } from './strategies';\nimport { MockConfig, MockGeneratorStrategy } from './types';\nimport { sleep } from './utils';\n\nconst logger = createLogger('MockAdapter');\n\n/**\n * 基于 Mock.js 的请求适配器\n * @description 根据 API 配置中的 responseSchema 自动生成 Mock 数据,支持普通 JSON 和流式 SSE 响应\n */\nexport class MockAdapter implements ApiAdapter {\n private delay: number;\n // 遗留策略(为了兼容旧版代码)\n private static strategies: Record<string, MockGeneratorStrategy> = {\n chat_stream: new ChatStreamStrategy(),\n history_stream: new HistoryStreamStrategy(),\n };\n\n /**\n * 构造函数\n * @param delay 全局模拟延迟时间(毫秒),默认 300ms\n */\n constructor(delay: number = 300) {\n this.delay = delay;\n }\n\n /**\n * 注册自定义 Mock 生成策略\n * @param key 策略唯一标识符 (e.g., 'chat_stream', 'history_stream')\n * @param strategy 实现了 MockGeneratorStrategy 接口的策略实例\n */\n static registerStrategy(key: string, strategy: MockGeneratorStrategy) {\n this.strategies[key] = strategy;\n }\n\n /**\n * 处理普通 HTTP 请求(非流式)\n * @param config 请求配置对象\n * @param endpointConfig API 端点配置,包含 responseSchema\n * @returns Promise 返回模拟的响应数据\n */\n async request<T = any>(config: ApiRequestConfig, endpointConfig?: ApiEndpointConfig): Promise<T> {\n // 优先使用接口定义的 delay,否则使用全局默认 delay\n const delay = (endpointConfig as any)?.delay ?? this.delay;\n\n return new Promise((resolve, reject) => {\n setTimeout(() => {\n try {\n if (!endpointConfig || !endpointConfig.responseSchema) {\n logger.warn(`未找到响应架构配置: ${config.url}`);\n resolve({} as T);\n return;\n }\n\n let schema = endpointConfig.responseSchema;\n let mockData;\n\n // 支持函数式 schema,允许根据请求参数动态生成 schema\n if (typeof schema === 'function') {\n schema = schema(config);\n }\n\n // 构造有效配置对象,合并 endpointConfig 顶层属性\n const effectiveConfig = {\n type: (endpointConfig as any).type,\n status: (endpointConfig as any).status || 200,\n pageEvent: (endpointConfig as any).pageEvent,\n responseSchema: schema,\n ...(typeof schema === 'object' ? schema : {}),\n };\n\n // 0. 处理非 200 状态码\n if (effectiveConfig.status !== 200) {\n const error: any = new Error(`Request failed with status code ${effectiveConfig.status}`);\n error.response = {\n status: effectiveConfig.status,\n data: Mock.mock(schema),\n headers: {},\n };\n reject(error);\n return;\n }\n\n // 1. 字符串 Schema:直接作为结果返回(极少情况)\n if (typeof schema === 'string') {\n mockData = schema;\n }\n // 2. 遗留的高级 Schema (通过 _type 字段识别)\n else if (this.isLegacySchema(schema)) {\n const strategy = MockAdapter.strategies[schema._type];\n if (strategy) {\n const chunks = strategy.generate(schema);\n // 将流式块合并为单个字符串,并清理 SSE 格式标记\n mockData = chunks\n .join('')\n .replace(/event: data\\ndata: /g, '')\n .replace(/\\n\\n/g, '');\n try {\n mockData = JSON.parse(mockData);\n } catch (e) {\n // 忽略解析错误,保持原始数据格式\n }\n } else {\n logger.warn(`未找到对应的策略类型: ${schema._type}`);\n mockData = {};\n }\n }\n // 3. 通用策略模式\n else {\n const type = effectiveConfig.type || 'json';\n const strategy = StrategyFactory.getStrategy(type);\n mockData = strategy.process(effectiveConfig as MockConfig, config.params || config.data);\n }\n\n logger.info(`Request: ${config.method} ${config.url}`, config.data || config.params);\n logger.info(`Response:`, mockData);\n\n resolve(mockData as T);\n } catch (error) {\n reject(error);\n }\n }, delay);\n });\n }\n\n /**\n * 处理流式请求 (SSE)\n * @param config 请求配置对象\n * @param callbacks 流式回调函数集合 (onMessage, onFinish, onError)\n * @param endpointConfig API 端点配置,包含 responseSchema\n */\n async stream(\n config: ApiRequestConfig,\n callbacks: StreamCallbacks,\n endpointConfig?: ApiEndpointConfig,\n ): Promise<void> {\n const { onMessage, onFinish, onError } = callbacks;\n const signal = config.signal;\n\n // 优先使用接口定义的 delay,否则使用全局默认 delay\n const delay = (endpointConfig as any)?.delay ?? this.delay;\n\n return new Promise<void>((resolve, reject) => {\n // 如果请求已被取消,直接结束\n if (signal && signal.aborted) {\n if (onFinish) onFinish();\n resolve();\n return;\n }\n\n setTimeout(async () => {\n try {\n if (!endpointConfig || !endpointConfig.responseSchema) {\n logger.warn(`未找到流式响应架构: ${config.url}`);\n if (onFinish) onFinish();\n resolve();\n return;\n }\n\n const requestStart = dateUtils.now();\n logger.info(`[SSE Start] Request: ${config.method} ${config.url}`, {\n params: config.data || config.params,\n time: dateUtils.dayjs().toISOString(),\n });\n\n let schema = endpointConfig.responseSchema;\n\n // 支持函数式 schema\n if (typeof schema === 'function') {\n schema = schema(config);\n }\n\n // 构造有效配置对象,合并 endpointConfig 顶层属性\n const effectiveConfig = {\n type: (endpointConfig as any).type,\n status: (endpointConfig as any).status || 200,\n pageEvent: (endpointConfig as any).pageEvent,\n responseSchema: schema,\n ...(typeof schema === 'object' ? schema : {}),\n };\n\n // 0. 处理非 200 状态码\n if (effectiveConfig.status !== 200) {\n const response = {\n status: effectiveConfig.status,\n data: Mock.mock(schema),\n headers: {},\n };\n\n // 触发 onResponse 回调\n if (callbacks.onResponse) {\n const hijacked = await callbacks.onResponse(response);\n if (hijacked) {\n resolve();\n return;\n }\n }\n\n const error: any = new Error(`Stream request failed with status code ${effectiveConfig.status}`);\n error.response = response;\n logger.error(`[SSE Error] Request failed with status ${effectiveConfig.status}`, error);\n if (onError) onError(error);\n // 保持与 request 同样的处理逻辑,抛出异常以便顶层拦截\n reject(error);\n return;\n }\n\n // 触发 onResponse 回调 (200 场景)\n if (callbacks.onResponse) {\n const hijacked = await callbacks.onResponse({\n status: 200,\n data: null,\n headers: {},\n });\n if (hijacked) {\n resolve();\n return;\n }\n }\n\n // 1. 新版 Schema 策略 (sse, sse-page)\n if (this.isNewConfig(effectiveConfig)) {\n const type = effectiveConfig.type || 'sse';\n const strategy = StrategyFactory.getStrategy(type);\n\n // 策略处理返回 MockEvent 数组\n const events = strategy.process(\n effectiveConfig as MockConfig,\n config.params || config.data,\n );\n\n if (Array.isArray(events)) {\n const startTime = dateUtils.now();\n let eventCount = 0;\n\n logger.info(\n `[SSE Processing] Generated ${events.length} events for ${type} strategy`,\n );\n\n for (const event of events) {\n if (signal && signal.aborted) {\n logger.info(\n `[SSE Abort] Stream aborted by user after ${dateUtils.now() - requestStart}ms`,\n );\n break;\n }\n\n // 计算延迟\n const delay =\n typeof event.delay === 'number'\n ? event.delay\n : parseInt(String(event.delay || 0));\n const elapsed = dateUtils.now() - startTime;\n const remaining = Math.max(0, delay - elapsed);\n\n if (remaining > 0) {\n await sleep(remaining);\n }\n\n if (signal && signal.aborted) break;\n\n // 构造 SSE 格式数据块\n const chunk = `event: ${event.event}\\ndata: ${JSON.stringify(event.data)}\\n\\n`;\n\n // 记录关键事件日志\n if (['error', 'todos', 'page'].includes(event.event)) {\n logger.info(`[SSE Event] Emitting special event: ${event.event}`, event.data);\n } else if (eventCount === 0 || eventCount === events.length - 1) {\n logger.info(\n `[SSE Event] Emitting ${eventCount === 0 ? 'first' : 'last'} data event`,\n { preview: JSON.stringify(event.data).slice(0, 50) + '...' },\n );\n }\n if (onMessage) onMessage(chunk);\n eventCount++;\n }\n }\n }\n // 2. 遗留策略处理\n else {\n let chunks: string[] = [];\n\n if (typeof schema === 'string') {\n chunks = schema.split('\\n\\n').map((chunk) => chunk + '\\n\\n');\n } else if (this.isLegacySchema(schema)) {\n chunks = this.generateAdvancedChunks(schema);\n } else {\n const mockData = Mock.mock(schema);\n chunks = [`data: ${JSON.stringify(mockData)}\\n\\n`];\n }\n\n for (const chunk of chunks) {\n if (signal && signal.aborted) {\n logger.info('[SSE Abort] Stream aborted by user');\n break;\n }\n\n if (chunk.trim()) {\n if (onMessage) onMessage(chunk);\n await new Promise((r) => setTimeout(r, 200));\n }\n }\n }\n\n if (!signal || !signal.aborted) {\n logger.info(\n `[SSE Complete] Stream finished successfully in ${dateUtils.now() - requestStart}ms`,\n );\n if (onFinish) onFinish();\n }\n resolve();\n } catch (error) {\n logger.error(`[SSE Error] Stream processing failed`, error);\n if (onError) onError(error);\n resolve();\n }\n }, delay);\n });\n }\n\n /**\n * 判断是否为遗留的 schema 格式\n */\n private isLegacySchema(schema: any): boolean {\n return schema && typeof schema === 'object' && '_type' in schema;\n }\n\n /**\n * 判断是否为新版配置格式\n * @description 检查配置对象中是否包含有效的 type 字段\n */\n private isNewConfig(config: any): boolean {\n return (\n config &&\n typeof config === 'object' &&\n (['json', 'sse', 'sse-page'].includes(config.type) || 'responseSchema' in config) // 备用检查,如果 schema 内部定义了结构\n );\n }\n\n /**\n * 生成遗留的高级 schema 数据块\n */\n private generateAdvancedChunks(schema: any): string[] {\n const strategy = MockAdapter.strategies[schema._type];\n if (strategy) {\n return strategy.generate(schema);\n }\n logger.warn(`未找到对应的策略类型: ${schema._type}`);\n return [];\n }\n}\n","import Mock from 'mockjs';\n\nimport { MockResponseGenerator } from './generator';\nimport { \n ChatStreamConfig,\n HistoryStreamConfig,\n JsonMockConfig, \n MockConfig, \n MockEvent,\n MockGeneratorStrategy, // Legacy\n MockStrategy, \n SseMockConfig, \n SsePageMockConfig} from './types';\nimport { flatEvents, processTemplate } from './utils';\n\n// === Legacy Strategies (Preserved) ===\n\nexport class ChatStreamStrategy implements MockGeneratorStrategy {\n generate(schema: any): string[] {\n const config = schema as ChatStreamConfig;\n const defaultName = config.agentName || 'BI助手';\n const generator = new MockResponseGenerator(defaultName);\n \n const mockData = config.data ? Mock.mock(config.data) : {};\n \n // 1. Init Plan\n if (config.plan) {\n generator.initPlan(config.plan);\n }\n\n // 2. Execute Timeline\n if (config.timeline) {\n config.timeline.forEach(step => {\n if (step.planIndex !== undefined) {\n generator.updatePlanStatus(step.planIndex);\n }\n if (step.log) {\n const logContent = typeof step.log === 'string' ? step.log : step.log.content;\n const logLevel = typeof step.log === 'object' ? step.log.level : 'info';\n const logAgent = typeof step.log === 'object' ? step.log.agent : undefined;\n generator.addLog(logContent, logLevel, logAgent);\n }\n });\n }\n\n // 3. Content\n let content;\n if (typeof config.content === 'function') {\n content = config.content(mockData);\n } else {\n content = config.content;\n }\n\n if (typeof content === 'object' && content !== null) {\n generator.emitA2UI(content as Record<string, any>);\n } else {\n generator.streamContent(content as string);\n }\n\n // 4. Complete\n generator.completePlan();\n generator.finish();\n\n return generator.toString().split('\\n\\n').map(chunk => chunk + '\\n\\n');\n }\n}\n\nexport class HistoryStreamStrategy implements MockGeneratorStrategy {\n generate(schema: any): string[] {\n const config = schema as HistoryStreamConfig;\n const generator = new MockResponseGenerator('BI助手');\n \n const historyMock = Mock.mock(config.template);\n const fullHistory = [...(config.prepend || []), ...(historyMock.list || historyMock)];\n generator.emitHistory(fullHistory);\n \n return generator.toString().split('\\n\\n').map(chunk => chunk + '\\n\\n');\n }\n}\n\n// === New Schema Strategies ===\n\nexport class JsonStrategy implements MockStrategy {\n process(config: MockConfig, _requestParams?: any): any {\n const jsonConfig = config as JsonMockConfig;\n if (!jsonConfig.responseSchema) return {};\n return Mock.mock(jsonConfig.responseSchema);\n }\n}\n\nexport class SseStrategy implements MockStrategy {\n process(config: MockConfig, requestParams: any = {}): MockEvent[] {\n const sseConfig = config as SseMockConfig;\n if (!sseConfig.responseSchema) return [];\n \n // Use flatEvents to process the schema with MockJS and sort by delay\n return flatEvents(sseConfig.responseSchema, requestParams);\n }\n}\n\nexport class SsePageStrategy implements MockStrategy {\n process(config: MockConfig, requestParams: any = {}): MockEvent[] {\n const ssePageConfig = config as SsePageMockConfig;\n if (!ssePageConfig.responseSchema) return [];\n\n // 1. Generate base events\n const events = flatEvents(ssePageConfig.responseSchema, requestParams);\n\n // 2. Generate page event if exists\n if (ssePageConfig.pageEvent) {\n const context = {\n $query: requestParams, // Backward compatibility\n $body: requestParams,\n $param: requestParams?.param || requestParams\n };\n\n Mock.Random.extend({ \n $query: () => context.$query,\n $body: () => context.$body,\n $param: () => context.$param\n });\n\n // First let Mock.js process standard templates (like @integer)\n let pageEvent = Mock.mock(ssePageConfig.pageEvent);\n // Then process custom {{}} templates\n pageEvent = processTemplate(pageEvent, context);\n \n // Calculate max delay from existing events to ensure page event is last\n let maxDelay = 0;\n if (events.length > 0) {\n const lastEvent = events[events.length - 1];\n maxDelay = typeof lastEvent.delay === 'number' ? lastEvent.delay : parseInt(String(lastEvent.delay || 0));\n }\n \n // Set page event delay to be slightly after the last event\n const pageDelay = typeof pageEvent.delay === 'number' ? pageEvent.delay : parseInt(String(pageEvent.delay || 0));\n if (pageDelay <= maxDelay) {\n pageEvent.delay = maxDelay + 20; // Add small buffer\n }\n\n events.push(pageEvent);\n }\n \n // Re-sort in case pageEvent has specific delay\n const es = events.sort((a, b) => {\n const delayA = typeof a.delay === 'number' ? a.delay : parseInt(String(a.delay || 0));\n const delayB = typeof b.delay === 'number' ? b.delay : parseInt(String(b.delay || 0));\n return delayA - delayB;\n });\n return es;\n }\n}\n\n// Factory for new strategies\nexport const StrategyFactory = {\n getStrategy(type: string = 'json'): MockStrategy {\n switch (type) {\n case 'sse':\n return new SseStrategy();\n case 'sse-page':\n return new SsePageStrategy();\n case 'json':\n default:\n return new JsonStrategy();\n }\n }\n};\n","import { dateUtils } from '@chatbi-v/core';\n\n/**\n * Mock 响应生成器\n * @description 用于动态生成流式响应数据,支持阶段流转、日志插入和内容分块\n */\nexport class MockResponseGenerator {\n private events: string[] = [];\n private sessionId: string;\n private agentName: string;\n private currentTodos: { content: string; status: 'PENDING' | 'IN_PROGRESS' | 'COMPLETED' }[] = [];\n\n constructor(agentName: string = 'Assistant', sessionId?: string) {\n this.sessionId = sessionId || ('conv_' + dateUtils.now());\n this.agentName = agentName;\n }\n\n /**\n * 生成历史消息流\n */\n emitHistory(history: { role: string; content: string; createTime: string; todos?: any[] }[]) {\n history.forEach(msg => {\n const data = {\n content: msg.content,\n sessionId: this.sessionId,\n role: msg.role,\n completed: true,\n agentName: this.agentName,\n createTime: msg.createTime\n };\n this.pushEvent('data', data);\n\n if (msg.todos) {\n this.pushEvent('todos', { items: msg.todos });\n }\n });\n return this;\n }\n\n /**\n * 初始化执行计划\n * @param steps 计划步骤列表\n */\n initPlan(steps: string[]) {\n this.currentTodos = steps.map(step => ({\n content: step,\n status: 'PENDING'\n }));\n this.pushTodos();\n return this;\n }\n\n /**\n * 更新执行计划状态\n * @param activeIndex 当前正在进行的步骤索引\n */\n updatePlanStatus(activeIndex: number) {\n this.currentTodos = this.currentTodos.map((todo, index) => {\n if (index < activeIndex) {\n return { ...todo, status: 'COMPLETED' };\n } else if (index === activeIndex) {\n return { ...todo, status: 'IN_PROGRESS' };\n } else {\n return { ...todo, status: 'PENDING' };\n }\n });\n this.pushTodos();\n return this;\n }\n\n /**\n * 标记所有计划为完成\n */\n completePlan() {\n this.currentTodos = this.currentTodos.map(todo => ({ ...todo, status: 'COMPLETED' }));\n this.pushTodos();\n return this;\n }\n\n /**\n * 添加日志\n * @param content 日志内容\n * @param type 日志类型\n * @param agentName 可选的 Agent 名称\n */\n addLog(content: string, type: 'info' | 'warning' | 'error' = 'info', agentName?: string) {\n this.pushEvent('log', {\n type,\n content,\n agentName: agentName || this.agentName\n });\n return this;\n }\n\n /**\n * 添加系统错误事件\n * @param errorCode 错误码\n * @param errorMessage 错误信息\n */\n addError(errorCode: string, errorMessage: string) {\n this.pushEvent('error', {\n errorCode,\n errorMessage\n });\n return this;\n }\n\n /**\n * 添加流式内容块\n * @param content 完整内容\n * @param chunkSize 分块大小\n */\n streamContent(content: string, chunkSize: number = 20) {\n for (let i = 0; i < content.length; i += chunkSize) {\n const chunk = content.slice(i, i + chunkSize);\n this.pushEvent('data', {\n content: chunk,\n sessionId: this.sessionId,\n completed: false,\n agentName: this.agentName\n });\n }\n return this;\n }\n\n /**\n * 结束流\n */\n finish() {\n this.pushEvent('data', {\n content: '',\n sessionId: this.sessionId,\n completed: true,\n agentName: this.agentName\n });\n return this;\n }\n\n /**\n * 生成 A2UI 响应\n * @param component A2UI 组件配置对象\n */\n emitA2UI(component: Record<string, any>) {\n const content = JSON.stringify(component, null, 2);\n return this.streamContent(content);\n }\n\n /**\n * 生成最终的响应字符串\n */\n toString() {\n return this.events.join('\\n');\n }\n\n private pushTodos() {\n this.pushEvent('todos', { items: this.currentTodos });\n }\n\n private pushEvent(type: string, data: any) {\n this.events.push(`event: ${type}\\ndata: ${JSON.stringify(data)}\\n`);\n }\n}\n","import dayjs from 'dayjs';\nimport Mock from 'mockjs';\n\nimport { MockEvent } from './types';\n\nexport const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));\n\n/**\n * Process string templates like \"{{$query.pageNo * 10}}\" in object values.\n * Supports $query (for backward compatibility), $body, and $param.\n */\nexport function processTemplate(data: any, context: Record<string, any>): any {\n if (typeof data === 'string') {\n // Check for {{ ... }} pattern\n if (/^\\{\\{.*\\}\\}$/.test(data)) {\n const expression = data.slice(2, -2).trim();\n try {\n // Safe evaluation using Function with context keys\n const keys = Object.keys(context);\n const values = Object.values(context);\n const fn = new Function(...keys, `return ${expression}`);\n return fn(...values);\n } catch (e) {\n console.warn(`[Mock] Failed to evaluate template: ${data}`, e);\n return data;\n }\n }\n return data;\n }\n \n if (Array.isArray(data)) {\n return data.map(item => processTemplate(item, context));\n }\n \n if (typeof data === 'object' && data !== null) {\n const result: Record<string, any> = {};\n for (const key in data) {\n result[key] = processTemplate(data[key], context);\n }\n return result;\n }\n \n return data;\n}\n\n/**\n * Flatten eventsSchema into a sorted array of events.\n * \n * Supports Mock.js array generation rules in keys, e.g.:\n * { 'data|8-12': [{ event: 'data', ... }] } \n * -> generates 8 to 12 data events.\n */\nexport function flatEvents(\n eventsSchema: Record<string, MockEvent[]>, \n requestData: any = {}\n): MockEvent[] {\n // Construct context for template processing\n const context: Record<string, any> = {\n $query: requestData, // Backward compatibility\n $body: requestData,\n $param: requestData?.param || requestData\n };\n\n // Extend Mock.Random to support templates\n Mock.Random.extend({ \n $query: () => context.$query,\n $body: () => context.$body,\n $param: () => context.$param\n });\n \n // Generate data using Mock.mock\n const compiled = Mock.mock(eventsSchema) as Record<string, MockEvent[]>;\n \n // Flatten and sort by delay\n return Object.values(compiled)\n .flat()\n .map(event => processTemplate(event, context))\n .sort((a, b) => {\n const delayA = typeof a.delay === 'number' ? a.delay : parseInt(String(a.delay || 0));\n const delayB = typeof b.delay === 'number' ? b.delay : parseInt(String(b.delay || 0));\n return delayA - delayB;\n });\n}\n\n/**\n * Convert an array of events into a ReadableStream (for SSE).\n */\nexport function eventsToStream(events: MockEvent[]): ReadableStream {\n const encoder = new TextEncoder();\n \n return new ReadableStream({\n start(ctrl) {\n // Check if events is empty\n if (!events || events.length === 0) {\n ctrl.close();\n return;\n }\n\n (async () => {\n try {\n // We assume events are sorted by their `delay` property which represents \n // \"absolute time from start\".\n const startTime = dayjs().valueOf();\n \n for (const eventItem of events) {\n const delay = typeof eventItem.delay === 'number' ? eventItem.delay : parseInt(String(eventItem.delay || 0));\n \n // Calculate how much time passed since start\n const elapsed = dayjs().valueOf() - startTime;\n const remaining = Math.max(0, delay - elapsed);\n \n if (remaining > 0) {\n await sleep(remaining);\n }\n \n const payload = `event: ${eventItem.event}\\ndata: ${JSON.stringify(eventItem.data)}\\n\\n`;\n ctrl.enqueue(encoder.encode(payload));\n }\n ctrl.close();\n } catch (e) {\n ctrl.error(e);\n }\n })();\n },\n });\n}\n","import Mock from 'mockjs';\n\nimport { StrategyFactory } from './strategies';\nimport { JsonMockConfig, MockConfig, MockSchema, SseMockConfig, SsePageMockConfig } from './types';\nimport { eventsToStream, sleep } from './utils';\n\ndeclare global {\n interface Window {\n _originalFetch: typeof fetch;\n _originalEventSource: typeof EventSource;\n }\n}\n\nexport function installFetchMock(schema: MockSchema) {\n if (!window._originalFetch) {\n window._originalFetch = window.fetch;\n }\n\n window.fetch = async (input: RequestInfo | URL, init: RequestInit = {}) => {\n const url = typeof input === 'string' ? input : input instanceof URL ? input.toString() : input.url;\n const method = (init.method || 'GET').toUpperCase();\n \n // Find matching rule\n const rules = Object.values(schema);\n const rule = rules.find((v) => {\n if (!v.url) return false;\n // Convert route params :id to regex \\w+\n // We might want to be more specific, e.g., ([^/]+)\n const pattern = v.url.replace(/:[a-zA-Z0-9_]+/g, '([^/]+)');\n const regex = new RegExp(`^${pattern}$`);\n \n // Check if URL matches (ignoring query params for the match, but we might need them later)\n const [path] = url.split('?');\n // Match method if specified, default to GET match? or just match URL?\n // Usually method matters.\n const ruleMethod = (v.method || 'GET').toUpperCase();\n return regex.test(path) && ruleMethod === method;\n });\n\n if (!rule) {\n return window._originalFetch(input, init);\n }\n\n console.log(`[Mock] Intercepted ${method} ${url}`, rule);\n\n // Handle non-200 status code immediately\n const status = rule.status || 200;\n if (status !== 200) {\n await sleep(rule.delay || 0);\n return new Response(JSON.stringify({ \n message: `Mock error status ${status}`,\n code: status \n }), {\n status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n await sleep(rule.delay || 0);\n\n // Determine type (default 'json' if not present)\n const type = rule.type || 'json';\n const strategy = StrategyFactory.getStrategy(type);\n \n // Parse query params for strategies that need them\n const urlObj = new URL(url, window.location.origin);\n const query = Object.fromEntries(urlObj.searchParams);\n \n const result = strategy.process(rule as MockConfig, query);\n\n /* 1. JSON Response */\n if (type === 'json') {\n return new Response(JSON.stringify(result), {\n status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n /* 2. SSE / SSE-Page Response */\n if (type === 'sse' || type === 'sse-page') {\n const events = result; // Strategy returns MockEvent[]\n const stream = eventsToStream(events);\n return new Response(stream, { \n status, \n headers: { 'Content-Type': 'text/event-stream' } \n });\n }\n\n return window._originalFetch(input, init);\n };\n}\n\nexport function installSSEMock() {\n // Placeholder for EventSource mocking if needed.\n // Currently, we rely on fetch interception.\n // Many modern apps use fetch for SSE (POST requests, headers, etc.)\n}\n\nexport function setupMock(schema: MockSchema) {\n if (typeof window !== 'undefined') {\n installFetchMock(schema);\n installSSEMock();\n }\n}\n","\nimport { ApiRequestConfig } from '@chatbi-v/core';\n\n// === Base Types ===\n\nexport type MockMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\nexport type MockType = 'json' | 'sse' | 'sse-page';\n\nexport interface MockEvent {\n event: string;\n data: any;\n /** Delay in ms, or a mockjs template string like '@increment(100)' */\n delay?: number | string;\n}\n\n// === Unified Strategy Interface ===\n\nexport interface MockStrategy {\n /**\n * Process the schema and return the result.\n * For JSON: returns the mocked object.\n * For SSE: returns an array of formatted event strings (chunks).\n */\n process(config: MockConfig, requestParams?: any): any;\n}\n\n// === Mock Configuration Types (Matching chat.mock.ts) ===\n\nexport interface BaseMockConfig {\n /** Optional: URL pattern if used in global interceptor */\n url?: string;\n /** Optional: Method if used in global interceptor */\n method?: MockMethod;\n /** Global delay for the request */\n delay?: number;\n /** Optional: HTTP status code (default: 200) */\n status?: number;\n /** Mock type (default: 'json') */\n type?: MockType;\n}\n\nexport interface JsonMockConfig extends BaseMockConfig {\n type?: 'json';\n /** The MockJS template for the response body */\n responseSchema: any;\n}\n\nexport interface SseMockConfig extends BaseMockConfig {\n type: 'sse';\n /** \n * Dictionary of event templates. \n * Key can be a mockjs template like 'data|3-5' \n */\n responseSchema: Record<string, MockEvent[]>;\n}\n\nexport interface SsePageMockConfig extends BaseMockConfig {\n type: 'sse-page';\n /** Dictionary of event templates */\n responseSchema: Record<string, MockEvent[]>;\n /** Special event for pagination metadata */\n pageEvent: MockEvent;\n}\n\nexport type MockConfig = JsonMockConfig | SseMockConfig | SsePageMockConfig;\n\nexport type MockSchema = Record<string, MockConfig>;\n\n// === Legacy Support (Keep these for backward compatibility if needed) ===\n\nexport interface ChatStreamConfig {\n _type: 'chat_stream';\n agentName?: string;\n plan?: string[];\n data?: Record<string, any>;\n timeline?: Array<{\n log?: string | { content: string; level?: 'info' | 'warning' | 'error'; agent?: string };\n planIndex?: number;\n delay?: number;\n }>;\n content: string | Record<string, any> | ((data: any) => string | Record<string, any>);\n}\n\nexport interface HistoryStreamConfig {\n _type: 'history_stream';\n template: Record<string, any>;\n prepend?: any[];\n}\n\nexport type AdvancedMockSchema = ChatStreamConfig | HistoryStreamConfig;\n\nexport interface MockGeneratorStrategy {\n generate(schema: any): string[];\n}\n\n// === Helper Functions (Restored) ===\n\nexport function createChatStream(config: Omit<ChatStreamConfig, '_type'>): ChatStreamConfig {\n return { _type: 'chat_stream', ...config };\n}\n\nexport function createHistoryStream(config: Omit<HistoryStreamConfig, '_type'>): HistoryStreamConfig {\n return { _type: 'history_stream', ...config };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,IAAAA,eAA0B;;;ACN1B,IAAAC,eAOO;AACP,IAAAC,iBAAiB;;;ACRjB,IAAAC,iBAAiB;;;ACAjB,kBAA0B;AAMnB,IAAM,wBAAN,MAA4B;AAAA,EACzB,SAAmB,CAAC;AAAA,EACpB;AAAA,EACA;AAAA,EACA,eAAuF,CAAC;AAAA,EAEhG,YAAY,YAAoB,aAAa,WAAoB;AAC/D,SAAK,YAAY,aAAc,UAAU,sBAAU,IAAI;AACvD,SAAK,YAAY;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,SAAiF;AAC3F,YAAQ,QAAQ,SAAO;AACrB,YAAM,OAAO;AAAA,QACX,SAAS,IAAI;AAAA,QACb,WAAW,KAAK;AAAA,QAChB,MAAM,IAAI;AAAA,QACV,WAAW;AAAA,QACX,WAAW,KAAK;AAAA,QAChB,YAAY,IAAI;AAAA,MAClB;AACA,WAAK,UAAU,QAAQ,IAAI;AAE3B,UAAI,IAAI,OAAO;AACb,aAAK,UAAU,SAAS,EAAE,OAAO,IAAI,MAAM,CAAC;AAAA,MAC9C;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,OAAiB;AACxB,SAAK,eAAe,MAAM,IAAI,WAAS;AAAA,MACrC,SAAS;AAAA,MACT,QAAQ;AAAA,IACV,EAAE;AACF,SAAK,UAAU;AACf,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAiB,aAAqB;AACpC,SAAK,eAAe,KAAK,aAAa,IAAI,CAAC,MAAM,UAAU;AACzD,UAAI,QAAQ,aAAa;AACvB,eAAO,EAAE,GAAG,MAAM,QAAQ,YAAY;AAAA,MACxC,WAAW,UAAU,aAAa;AAChC,eAAO,EAAE,GAAG,MAAM,QAAQ,cAAc;AAAA,MAC1C,OAAO;AACL,eAAO,EAAE,GAAG,MAAM,QAAQ,UAAU;AAAA,MACtC;AAAA,IACF,CAAC;AACD,SAAK,UAAU;AACf,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe;AACb,SAAK,eAAe,KAAK,aAAa,IAAI,WAAS,EAAE,GAAG,MAAM,QAAQ,YAAY,EAAE;AACpF,SAAK,UAAU;AACf,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,SAAiB,OAAqC,QAAQ,WAAoB;AACvF,SAAK,UAAU,OAAO;AAAA,MACpB;AAAA,MACA;AAAA,MACA,WAAW,aAAa,KAAK;AAAA,IAC/B,CAAC;AACD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,WAAmB,cAAsB;AAChD,SAAK,UAAU,SAAS;AAAA,MACtB;AAAA,MACA;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAc,SAAiB,YAAoB,IAAI;AACrD,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK,WAAW;AAClD,YAAM,QAAQ,QAAQ,MAAM,GAAG,IAAI,SAAS;AAC5C,WAAK,UAAU,QAAQ;AAAA,QACrB,SAAS;AAAA,QACT,WAAW,KAAK;AAAA,QAChB,WAAW;AAAA,QACX,WAAW,KAAK;AAAA,MAClB,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS;AACP,SAAK,UAAU,QAAQ;AAAA,MACrB,SAAS;AAAA,MACT,WAAW,KAAK;AAAA,MAChB,WAAW;AAAA,MACX,WAAW,KAAK;AAAA,IAClB,CAAC;AACD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,WAAgC;AACvC,UAAM,UAAU,KAAK,UAAU,WAAW,MAAM,CAAC;AACjD,WAAO,KAAK,cAAc,OAAO;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW;AACT,WAAO,KAAK,OAAO,KAAK,IAAI;AAAA,EAC9B;AAAA,EAEQ,YAAY;AAClB,SAAK,UAAU,SAAS,EAAE,OAAO,KAAK,aAAa,CAAC;AAAA,EACtD;AAAA,EAEQ,UAAU,MAAc,MAAW;AACzC,SAAK,OAAO,KAAK,UAAU,IAAI;AAAA,QAAW,KAAK,UAAU,IAAI,CAAC;AAAA,CAAI;AAAA,EACpE;AACF;;;ACjKA,mBAAkB;AAClB,oBAAiB;AAIV,IAAM,QAAQ,CAAC,OAAe,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC;AAMlE,SAAS,gBAAgB,MAAW,SAAmC;AAC5E,MAAI,OAAO,SAAS,UAAU;AAE5B,QAAI,eAAe,KAAK,IAAI,GAAG;AAC7B,YAAM,aAAa,KAAK,MAAM,GAAG,EAAE,EAAE,KAAK;AAC1C,UAAI;AAEF,cAAM,OAAO,OAAO,KAAK,OAAO;AAChC,cAAM,SAAS,OAAO,OAAO,OAAO;AACpC,cAAM,KAAK,IAAI,SAAS,GAAG,MAAM,UAAU,UAAU,EAAE;AACvD,eAAO,GAAG,GAAG,MAAM;AAAA,MACrB,SAAS,GAAG;AACV,gBAAQ,KAAK,uCAAuC,IAAI,IAAI,CAAC;AAC7D,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,WAAO,KAAK,IAAI,UAAQ,gBAAgB,MAAM,OAAO,CAAC;AAAA,EACxD;AAEA,MAAI,OAAO,SAAS,YAAY,SAAS,MAAM;AAC7C,UAAM,SAA8B,CAAC;AACrC,eAAW,OAAO,MAAM;AACtB,aAAO,GAAG,IAAI,gBAAgB,KAAK,GAAG,GAAG,OAAO;AAAA,IAClD;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AASO,SAAS,WACd,cACA,cAAmB,CAAC,GACP;AAEb,QAAM,UAA+B;AAAA,IACnC,QAAQ;AAAA;AAAA,IACR,OAAO;AAAA,IACP,QAAQ,aAAa,SAAS;AAAA,EAChC;AAGA,gBAAAC,QAAK,OAAO,OAAO;AAAA,IACjB,QAAQ,MAAM,QAAQ;AAAA,IACtB,OAAO,MAAM,QAAQ;AAAA,IACrB,QAAQ,MAAM,QAAQ;AAAA,EACxB,CAAC;AAGD,QAAM,WAAW,cAAAA,QAAK,KAAK,YAAY;AAGvC,SAAO,OAAO,OAAO,QAAQ,EAC1B,KAAK,EACL,IAAI,WAAS,gBAAgB,OAAO,OAAO,CAAC,EAC5C,KAAK,CAAC,GAAG,MAAM;AACZ,UAAM,SAAS,OAAO,EAAE,UAAU,WAAW,EAAE,QAAQ,SAAS,OAAO,EAAE,SAAS,CAAC,CAAC;AACpF,UAAM,SAAS,OAAO,EAAE,UAAU,WAAW,EAAE,QAAQ,SAAS,OAAO,EAAE,SAAS,CAAC,CAAC;AACpF,WAAO,SAAS;AAAA,EACpB,CAAC;AACL;AAKO,SAAS,eAAe,QAAqC;AAClE,QAAM,UAAU,IAAI,YAAY;AAEhC,SAAO,IAAI,eAAe;AAAA,IACxB,MAAM,MAAM;AAEV,UAAI,CAAC,UAAU,OAAO,WAAW,GAAG;AAClC,aAAK,MAAM;AACX;AAAA,MACF;AAEA,OAAC,YAAY;AACX,YAAI;AAGA,gBAAM,gBAAY,aAAAC,SAAM,EAAE,QAAQ;AAElC,qBAAW,aAAa,QAAQ;AAC5B,kBAAM,QAAQ,OAAO,UAAU,UAAU,WAAW,UAAU,QAAQ,SAAS,OAAO,UAAU,SAAS,CAAC,CAAC;AAG3G,kBAAM,cAAU,aAAAA,SAAM,EAAE,QAAQ,IAAI;AACpC,kBAAM,YAAY,KAAK,IAAI,GAAG,QAAQ,OAAO;AAE7C,gBAAI,YAAY,GAAG;AACf,oBAAM,MAAM,SAAS;AAAA,YACzB;AAEA,kBAAM,UAAU,UAAU,UAAU,KAAK;AAAA,QAAW,KAAK,UAAU,UAAU,IAAI,CAAC;AAAA;AAAA;AAClF,iBAAK,QAAQ,QAAQ,OAAO,OAAO,CAAC;AAAA,UACxC;AACA,eAAK,MAAM;AAAA,QACf,SAAS,GAAG;AACR,eAAK,MAAM,CAAC;AAAA,QAChB;AAAA,MACF,GAAG;AAAA,IACL;AAAA,EACF,CAAC;AACH;;;AF5GO,IAAM,qBAAN,MAA0D;AAAA,EAC/D,SAAS,QAAuB;AAC9B,UAAM,SAAS;AACf,UAAM,cAAc,OAAO,aAAa;AACxC,UAAM,YAAY,IAAI,sBAAsB,WAAW;AAEvD,UAAMC,YAAW,OAAO,OAAO,eAAAC,QAAK,KAAK,OAAO,IAAI,IAAI,CAAC;AAGzD,QAAI,OAAO,MAAM;AACf,gBAAU,SAAS,OAAO,IAAI;AAAA,IAChC;AAGA,QAAI,OAAO,UAAU;AACnB,aAAO,SAAS,QAAQ,UAAQ;AAC9B,YAAI,KAAK,cAAc,QAAW;AAChC,oBAAU,iBAAiB,KAAK,SAAS;AAAA,QAC3C;AACA,YAAI,KAAK,KAAK;AACZ,gBAAM,aAAa,OAAO,KAAK,QAAQ,WAAW,KAAK,MAAM,KAAK,IAAI;AACtE,gBAAM,WAAW,OAAO,KAAK,QAAQ,WAAW,KAAK,IAAI,QAAQ;AACjE,gBAAM,WAAW,OAAO,KAAK,QAAQ,WAAW,KAAK,IAAI,QAAQ;AACjE,oBAAU,OAAO,YAAY,UAAU,QAAQ;AAAA,QACjD;AAAA,MACF,CAAC;AAAA,IACH;AAGA,QAAI;AACJ,QAAI,OAAO,OAAO,YAAY,YAAY;AACxC,gBAAU,OAAO,QAAQD,SAAQ;AAAA,IACnC,OAAO;AACL,gBAAU,OAAO;AAAA,IACnB;AAEA,QAAI,OAAO,YAAY,YAAY,YAAY,MAAM;AAClD,gBAAU,SAAS,OAA8B;AAAA,IACpD,OAAO;AACJ,gBAAU,cAAc,OAAiB;AAAA,IAC5C;AAGA,cAAU,aAAa;AACvB,cAAU,OAAO;AAEjB,WAAO,UAAU,SAAS,EAAE,MAAM,MAAM,EAAE,IAAI,WAAS,QAAQ,MAAM;AAAA,EACvE;AACF;AAEO,IAAM,wBAAN,MAA6D;AAAA,EAClE,SAAS,QAAuB;AAC9B,UAAM,SAAS;AACf,UAAM,YAAY,IAAI,sBAAsB,gBAAM;AAElD,UAAM,cAAc,eAAAC,QAAK,KAAK,OAAO,QAAQ;AAC7C,UAAM,cAAc,CAAC,GAAI,OAAO,WAAW,CAAC,GAAI,GAAI,YAAY,QAAQ,WAAY;AACpF,cAAU,YAAY,WAAW;AAEjC,WAAO,UAAU,SAAS,EAAE,MAAM,MAAM,EAAE,IAAI,WAAS,QAAQ,MAAM;AAAA,EACvE;AACF;AAIO,IAAM,eAAN,MAA2C;AAAA,EAChD,QAAQ,QAAoB,gBAA2B;AACrD,UAAM,aAAa;AACnB,QAAI,CAAC,WAAW,eAAgB,QAAO,CAAC;AACxC,WAAO,eAAAA,QAAK,KAAK,WAAW,cAAc;AAAA,EAC5C;AACF;AAEO,IAAM,cAAN,MAA0C;AAAA,EAC/C,QAAQ,QAAoB,gBAAqB,CAAC,GAAgB;AAChE,UAAM,YAAY;AAClB,QAAI,CAAC,UAAU,eAAgB,QAAO,CAAC;AAGvC,WAAO,WAAW,UAAU,gBAAgB,aAAa;AAAA,EAC3D;AACF;AAEO,IAAM,kBAAN,MAA8C;AAAA,EACnD,QAAQ,QAAoB,gBAAqB,CAAC,GAAgB;AAChE,UAAM,gBAAgB;AACtB,QAAI,CAAC,cAAc,eAAgB,QAAO,CAAC;AAG3C,UAAM,SAAS,WAAW,cAAc,gBAAgB,aAAa;AAGrE,QAAI,cAAc,WAAW;AAC3B,YAAM,UAAU;AAAA,QACd,QAAQ;AAAA;AAAA,QACR,OAAO;AAAA,QACP,QAAQ,eAAe,SAAS;AAAA,MAClC;AAEA,qBAAAA,QAAK,OAAO,OAAO;AAAA,QACjB,QAAQ,MAAM,QAAQ;AAAA,QACtB,OAAO,MAAM,QAAQ;AAAA,QACrB,QAAQ,MAAM,QAAQ;AAAA,MACxB,CAAC;AAGD,UAAI,YAAY,eAAAA,QAAK,KAAK,cAAc,SAAS;AAEjD,kBAAY,gBAAgB,WAAW,OAAO;AAG9C,UAAI,WAAW;AACf,UAAI,OAAO,SAAS,GAAG;AACrB,cAAM,YAAY,OAAO,OAAO,SAAS,CAAC;AAC1C,mBAAW,OAAO,UAAU,UAAU,WAAW,UAAU,QAAQ,SAAS,OAAO,UAAU,SAAS,CAAC,CAAC;AAAA,MAC1G;AAGA,YAAM,YAAY,OAAO,UAAU,UAAU,WAAW,UAAU,QAAQ,SAAS,OAAO,UAAU,SAAS,CAAC,CAAC;AAC/G,UAAI,aAAa,UAAU;AACzB,kBAAU,QAAQ,WAAW;AAAA,MAC/B;AAEA,aAAO,KAAK,SAAS;AAAA,IACvB;AAGA,UAAM,KAAK,OAAO,KAAK,CAAC,GAAG,MAAM;AAC7B,YAAM,SAAS,OAAO,EAAE,UAAU,WAAW,EAAE,QAAQ,SAAS,OAAO,EAAE,SAAS,CAAC,CAAC;AACpF,YAAM,SAAS,OAAO,EAAE,UAAU,WAAW,EAAE,QAAQ,SAAS,OAAO,EAAE,SAAS,CAAC,CAAC;AACpF,aAAO,SAAS;AAAA,IACpB,CAAC;AACD,WAAO;AAAA,EACT;AACF;AAGO,IAAM,kBAAkB;AAAA,EAC7B,YAAY,OAAe,QAAsB;AAC/C,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO,IAAI,YAAY;AAAA,MACzB,KAAK;AACH,eAAO,IAAI,gBAAgB;AAAA,MAC7B,KAAK;AAAA,MACL;AACE,eAAO,IAAI,aAAa;AAAA,IAC5B;AAAA,EACF;AACF;;;ADxJA,IAAM,aAAS,2BAAa,aAAa;AAMlC,IAAM,cAAN,MAAM,aAAkC;AAAA,EACrC;AAAA;AAAA,EAER,OAAe,aAAoD;AAAA,IACjE,aAAa,IAAI,mBAAmB;AAAA,IACpC,gBAAgB,IAAI,sBAAsB;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,QAAgB,KAAK;AAC/B,SAAK,QAAQ;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,iBAAiB,KAAa,UAAiC;AACpE,SAAK,WAAW,GAAG,IAAI;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,QAAiB,QAA0B,gBAAgD;AAE/F,UAAM,QAAS,gBAAwB,SAAS,KAAK;AAErD,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,iBAAW,MAAM;AACf,YAAI;AACF,cAAI,CAAC,kBAAkB,CAAC,eAAe,gBAAgB;AACrD,mBAAO,KAAK,2DAAc,OAAO,GAAG,EAAE;AACtC,oBAAQ,CAAC,CAAM;AACf;AAAA,UACF;AAEA,cAAI,SAAS,eAAe;AAC5B,cAAIC;AAGJ,cAAI,OAAO,WAAW,YAAY;AAChC,qBAAS,OAAO,MAAM;AAAA,UACxB;AAGA,gBAAM,kBAAkB;AAAA,YACtB,MAAO,eAAuB;AAAA,YAC9B,QAAS,eAAuB,UAAU;AAAA,YAC1C,WAAY,eAAuB;AAAA,YACnC,gBAAgB;AAAA,YAChB,GAAI,OAAO,WAAW,WAAW,SAAS,CAAC;AAAA,UAC7C;AAGA,cAAI,gBAAgB,WAAW,KAAK;AAClC,kBAAM,QAAa,IAAI,MAAM,mCAAmC,gBAAgB,MAAM,EAAE;AACxF,kBAAM,WAAW;AAAA,cACf,QAAQ,gBAAgB;AAAA,cACxB,MAAM,eAAAC,QAAK,KAAK,MAAM;AAAA,cACtB,SAAS,CAAC;AAAA,YACZ;AACA,mBAAO,KAAK;AACZ;AAAA,UACF;AAGA,cAAI,OAAO,WAAW,UAAU;AAC9B,YAAAD,YAAW;AAAA,UACb,WAES,KAAK,eAAe,MAAM,GAAG;AACpC,kBAAM,WAAW,aAAY,WAAW,OAAO,KAAK;AACpD,gBAAI,UAAU;AACZ,oBAAM,SAAS,SAAS,SAAS,MAAM;AAEvC,cAAAA,YAAW,OACR,KAAK,EAAE,EACP,QAAQ,wBAAwB,EAAE,EAClC,QAAQ,SAAS,EAAE;AACtB,kBAAI;AACF,gBAAAA,YAAW,KAAK,MAAMA,SAAQ;AAAA,cAChC,SAAS,GAAG;AAAA,cAEZ;AAAA,YACF,OAAO;AACL,qBAAO,KAAK,iEAAe,OAAO,KAAK,EAAE;AACzC,cAAAA,YAAW,CAAC;AAAA,YACd;AAAA,UACF,OAEK;AACH,kBAAM,OAAO,gBAAgB,QAAQ;AACrC,kBAAM,WAAW,gBAAgB,YAAY,IAAI;AACjD,YAAAA,YAAW,SAAS,QAAQ,iBAA+B,OAAO,UAAU,OAAO,IAAI;AAAA,UACzF;AAEA,iBAAO,KAAK,YAAY,OAAO,MAAM,IAAI,OAAO,GAAG,IAAI,OAAO,QAAQ,OAAO,MAAM;AACnF,iBAAO,KAAK,aAAaA,SAAQ;AAEjC,kBAAQA,SAAa;AAAA,QACvB,SAAS,OAAO;AACd,iBAAO,KAAK;AAAA,QACd;AAAA,MACF,GAAG,KAAK;AAAA,IACV,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,OACJ,QACA,WACA,gBACe;AACf,UAAM,EAAE,WAAW,UAAU,QAAQ,IAAI;AACzC,UAAM,SAAS,OAAO;AAGtB,UAAM,QAAS,gBAAwB,SAAS,KAAK;AAErD,WAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAE5C,UAAI,UAAU,OAAO,SAAS;AAC5B,YAAI,SAAU,UAAS;AACvB,gBAAQ;AACR;AAAA,MACF;AAEA,iBAAW,YAAY;AACrB,YAAI;AACF,cAAI,CAAC,kBAAkB,CAAC,eAAe,gBAAgB;AACrD,mBAAO,KAAK,2DAAc,OAAO,GAAG,EAAE;AACtC,gBAAI,SAAU,UAAS;AACvB,oBAAQ;AACR;AAAA,UACF;AAEA,gBAAM,eAAe,uBAAU,IAAI;AACnC,iBAAO,KAAK,wBAAwB,OAAO,MAAM,IAAI,OAAO,GAAG,IAAI;AAAA,YACjE,QAAQ,OAAO,QAAQ,OAAO;AAAA,YAC9B,MAAM,uBAAU,MAAM,EAAE,YAAY;AAAA,UACtC,CAAC;AAED,cAAI,SAAS,eAAe;AAG5B,cAAI,OAAO,WAAW,YAAY;AAChC,qBAAS,OAAO,MAAM;AAAA,UACxB;AAGA,gBAAM,kBAAkB;AAAA,YACtB,MAAO,eAAuB;AAAA,YAC9B,QAAS,eAAuB,UAAU;AAAA,YAC1C,WAAY,eAAuB;AAAA,YACnC,gBAAgB;AAAA,YAChB,GAAI,OAAO,WAAW,WAAW,SAAS,CAAC;AAAA,UAC7C;AAGA,cAAI,gBAAgB,WAAW,KAAK;AAClC,kBAAM,WAAW;AAAA,cACf,QAAQ,gBAAgB;AAAA,cACxB,MAAM,eAAAC,QAAK,KAAK,MAAM;AAAA,cACtB,SAAS,CAAC;AAAA,YACZ;AAGA,gBAAI,UAAU,YAAY;AACxB,oBAAM,WAAW,MAAM,UAAU,WAAW,QAAQ;AACpD,kBAAI,UAAU;AACZ,wBAAQ;AACR;AAAA,cACF;AAAA,YACF;AAEA,kBAAM,QAAa,IAAI,MAAM,0CAA0C,gBAAgB,MAAM,EAAE;AAC/F,kBAAM,WAAW;AACjB,mBAAO,MAAM,0CAA0C,gBAAgB,MAAM,IAAI,KAAK;AACtF,gBAAI,QAAS,SAAQ,KAAK;AAE1B,mBAAO,KAAK;AACZ;AAAA,UACF;AAGA,cAAI,UAAU,YAAY;AACxB,kBAAM,WAAW,MAAM,UAAU,WAAW;AAAA,cAC1C,QAAQ;AAAA,cACR,MAAM;AAAA,cACN,SAAS,CAAC;AAAA,YACZ,CAAC;AACD,gBAAI,UAAU;AACZ,sBAAQ;AACR;AAAA,YACF;AAAA,UACF;AAGA,cAAI,KAAK,YAAY,eAAe,GAAG;AACrC,kBAAM,OAAO,gBAAgB,QAAQ;AACrC,kBAAM,WAAW,gBAAgB,YAAY,IAAI;AAGjD,kBAAM,SAAS,SAAS;AAAA,cACtB;AAAA,cACA,OAAO,UAAU,OAAO;AAAA,YAC1B;AAEA,gBAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,oBAAM,YAAY,uBAAU,IAAI;AAChC,kBAAI,aAAa;AAEjB,qBAAO;AAAA,gBACL,8BAA8B,OAAO,MAAM,eAAe,IAAI;AAAA,cAChE;AAEA,yBAAW,SAAS,QAAQ;AAC1B,oBAAI,UAAU,OAAO,SAAS;AAC5B,yBAAO;AAAA,oBACL,4CAA4C,uBAAU,IAAI,IAAI,YAAY;AAAA,kBAC5E;AACA;AAAA,gBACF;AAGA,sBAAMC,SACJ,OAAO,MAAM,UAAU,WACnB,MAAM,QACN,SAAS,OAAO,MAAM,SAAS,CAAC,CAAC;AACvC,sBAAM,UAAU,uBAAU,IAAI,IAAI;AAClC,sBAAM,YAAY,KAAK,IAAI,GAAGA,SAAQ,OAAO;AAE7C,oBAAI,YAAY,GAAG;AACjB,wBAAM,MAAM,SAAS;AAAA,gBACvB;AAEA,oBAAI,UAAU,OAAO,QAAS;AAG9B,sBAAM,QAAQ,UAAU,MAAM,KAAK;AAAA,QAAW,KAAK,UAAU,MAAM,IAAI,CAAC;AAAA;AAAA;AAGxE,oBAAI,CAAC,SAAS,SAAS,MAAM,EAAE,SAAS,MAAM,KAAK,GAAG;AACpD,yBAAO,KAAK,uCAAuC,MAAM,KAAK,IAAI,MAAM,IAAI;AAAA,gBAC9E,WAAW,eAAe,KAAK,eAAe,OAAO,SAAS,GAAG;AAC/D,yBAAO;AAAA,oBACL,wBAAwB,eAAe,IAAI,UAAU,MAAM;AAAA,oBAC3D,EAAE,SAAS,KAAK,UAAU,MAAM,IAAI,EAAE,MAAM,GAAG,EAAE,IAAI,MAAM;AAAA,kBAC7D;AAAA,gBACF;AACA,oBAAI,UAAW,WAAU,KAAK;AAC9B;AAAA,cACF;AAAA,YACF;AAAA,UACF,OAEK;AACH,gBAAI,SAAmB,CAAC;AAExB,gBAAI,OAAO,WAAW,UAAU;AAC9B,uBAAS,OAAO,MAAM,MAAM,EAAE,IAAI,CAAC,UAAU,QAAQ,MAAM;AAAA,YAC7D,WAAW,KAAK,eAAe,MAAM,GAAG;AACtC,uBAAS,KAAK,uBAAuB,MAAM;AAAA,YAC7C,OAAO;AACL,oBAAMF,YAAW,eAAAC,QAAK,KAAK,MAAM;AACjC,uBAAS,CAAC,SAAS,KAAK,UAAUD,SAAQ,CAAC;AAAA;AAAA,CAAM;AAAA,YACnD;AAEA,uBAAW,SAAS,QAAQ;AAC1B,kBAAI,UAAU,OAAO,SAAS;AAC5B,uBAAO,KAAK,oCAAoC;AAChD;AAAA,cACF;AAEA,kBAAI,MAAM,KAAK,GAAG;AAChB,oBAAI,UAAW,WAAU,KAAK;AAC9B,sBAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC;AAAA,cAC7C;AAAA,YACF;AAAA,UACF;AAEA,cAAI,CAAC,UAAU,CAAC,OAAO,SAAS;AAC9B,mBAAO;AAAA,cACL,kDAAkD,uBAAU,IAAI,IAAI,YAAY;AAAA,YAClF;AACA,gBAAI,SAAU,UAAS;AAAA,UACzB;AACA,kBAAQ;AAAA,QACV,SAAS,OAAO;AACd,iBAAO,MAAM,wCAAwC,KAAK;AAC1D,cAAI,QAAS,SAAQ,KAAK;AAC1B,kBAAQ;AAAA,QACV;AAAA,MACF,GAAG,KAAK;AAAA,IACV,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,QAAsB;AAC3C,WAAO,UAAU,OAAO,WAAW,YAAY,WAAW;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,YAAY,QAAsB;AACxC,WACE,UACA,OAAO,WAAW,aACjB,CAAC,QAAQ,OAAO,UAAU,EAAE,SAAS,OAAO,IAAI,KAAK,oBAAoB;AAAA,EAE9E;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAAuB,QAAuB;AACpD,UAAM,WAAW,aAAY,WAAW,OAAO,KAAK;AACpD,QAAI,UAAU;AACZ,aAAO,SAAS,SAAS,MAAM;AAAA,IACjC;AACA,WAAO,KAAK,iEAAe,OAAO,KAAK,EAAE;AACzC,WAAO,CAAC;AAAA,EACV;AACF;;;AI3VO,SAAS,iBAAiB,QAAoB;AACnD,MAAI,CAAC,OAAO,gBAAgB;AAC1B,WAAO,iBAAiB,OAAO;AAAA,EACjC;AAEA,SAAO,QAAQ,OAAO,OAA0B,OAAoB,CAAC,MAAM;AACzE,UAAM,MAAM,OAAO,UAAU,WAAW,QAAQ,iBAAiB,MAAM,MAAM,SAAS,IAAI,MAAM;AAChG,UAAM,UAAU,KAAK,UAAU,OAAO,YAAY;AAGlD,UAAM,QAAQ,OAAO,OAAO,MAAM;AAClC,UAAM,OAAO,MAAM,KAAK,CAAC,MAAM;AAC3B,UAAI,CAAC,EAAE,IAAK,QAAO;AAGnB,YAAM,UAAU,EAAE,IAAI,QAAQ,mBAAmB,SAAS;AAC1D,YAAM,QAAQ,IAAI,OAAO,IAAI,OAAO,GAAG;AAGvC,YAAM,CAAC,IAAI,IAAI,IAAI,MAAM,GAAG;AAG5B,YAAM,cAAc,EAAE,UAAU,OAAO,YAAY;AACnD,aAAO,MAAM,KAAK,IAAI,KAAK,eAAe;AAAA,IAC9C,CAAC;AAED,QAAI,CAAC,MAAM;AACT,aAAO,OAAO,eAAe,OAAO,IAAI;AAAA,IAC1C;AAEA,YAAQ,IAAI,sBAAsB,MAAM,IAAI,GAAG,IAAI,IAAI;AAGvD,UAAM,SAAS,KAAK,UAAU;AAC9B,QAAI,WAAW,KAAK;AAClB,YAAM,MAAM,KAAK,SAAS,CAAC;AAC3B,aAAO,IAAI,SAAS,KAAK,UAAU;AAAA,QACjC,SAAS,qBAAqB,MAAM;AAAA,QACpC,MAAM;AAAA,MACR,CAAC,GAAG;AAAA,QACF;AAAA,QACA,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAChD,CAAC;AAAA,IACH;AAEA,UAAM,MAAM,KAAK,SAAS,CAAC;AAG3B,UAAM,OAAO,KAAK,QAAQ;AAC1B,UAAM,WAAW,gBAAgB,YAAY,IAAI;AAGjD,UAAM,SAAS,IAAI,IAAI,KAAK,OAAO,SAAS,MAAM;AAClD,UAAM,QAAQ,OAAO,YAAY,OAAO,YAAY;AAEpD,UAAM,SAAS,SAAS,QAAQ,MAAoB,KAAK;AAGzD,QAAI,SAAS,QAAQ;AACnB,aAAO,IAAI,SAAS,KAAK,UAAU,MAAM,GAAG;AAAA,QAC1C;AAAA,QACA,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAChD,CAAC;AAAA,IACH;AAGA,QAAI,SAAS,SAAS,SAAS,YAAY;AACzC,YAAM,SAAS;AACf,YAAM,SAAS,eAAe,MAAM;AACpC,aAAO,IAAI,SAAS,QAAQ;AAAA,QAC1B;AAAA,QACA,SAAS,EAAE,gBAAgB,oBAAoB;AAAA,MACjD,CAAC;AAAA,IACH;AAEA,WAAO,OAAO,eAAe,OAAO,IAAI;AAAA,EAC1C;AACF;AAEO,SAAS,iBAAiB;AAIjC;AAEO,SAAS,UAAU,QAAoB;AAC5C,MAAI,OAAO,WAAW,aAAa;AACjC,qBAAiB,MAAM;AACvB,mBAAe;AAAA,EACjB;AACF;;;ACNO,SAAS,iBAAiB,QAA2D;AAC1F,SAAO,EAAE,OAAO,eAAe,GAAG,OAAO;AAC3C;AAEO,SAAS,oBAAoB,QAAiE;AACnG,SAAO,EAAE,OAAO,kBAAkB,GAAG,OAAO;AAC9C;;;ANhFO,IAAM,YAAY;AAAA,EACvB,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AACR;AAGO,IAAM,gBAAgB;AAAA,EAC3B,EAAE,IAAI,SAAS,OAAO,oCAAgB,MAAM,cAAc,aAAa,wFAAuB;AAAA,EAC9F,EAAE,IAAI,SAAS,OAAO,wCAAU,MAAM,cAAc,aAAa,sDAAc;AAAA,EAC/E,EAAE,IAAI,SAAS,OAAO,wCAAU,MAAM,cAAc,aAAa,+DAAkB;AAAA,EACnF,EAAE,IAAI,SAAS,OAAO,wCAAU,MAAM,cAAc,aAAa,gCAAiB;AAAA,EAClF,EAAE,IAAI,SAAS,OAAO,wCAAU,MAAM,cAAc,aAAa,4DAAe;AAClF;AAEO,IAAM,iBAAiB;AAAA,EAC5B,EAAE,IAAI,SAAS,OAAO,wCAAU,MAAM,aAAa;AAAA,EACnD,EAAE,IAAI,SAAS,OAAO,wCAAU,MAAM,aAAa;AAAA,EACnD,EAAE,IAAI,SAAS,OAAO,wCAAU,MAAM,aAAa;AACrD;AAEO,IAAM,cAAc;AAAA,EACzB;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,MAAM;AAAA,IACN,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,MAAM;AAAA,IACN,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,MAAM;AAAA,IACN,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,EACT;AACF;AAEO,IAAM,uBAAuB,CAAC,cAAsB;AAAA,EACzD;AAAA,IACE,KAAK,OAAO,SAAS;AAAA,IACrB,MAAM;AAAA,IACN,SAAS,wGAAwB,SAAS;AAAA,IAC1C,MAAM,uBAAU,MAAM,uBAAU,IAAI,IAAI,GAAK,EAAE,YAAY;AAAA,EAC7D;AACF;AAEO,IAAM,WAAW;AAAA,EACtB,MAAM;AAAA,EACN,UAAU;AAAA,EACV,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,eAAe;AAAA;AACjB;","names":["import_core","import_core","import_mockjs","import_mockjs","Mock","dayjs","mockData","Mock","mockData","Mock","delay"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/adapter.ts","../src/strategies.ts","../src/generator.ts","../src/utils.ts","../src/interceptor.ts","../src/types.ts"],"sourcesContent":["/**\n * @file index.ts\n * @description Mock 模块入口,导出模拟数据适配器、生成器及静态测试数据\n * @author ChatBI Team\n */\n\nimport { dateUtils } from '@chatbi-v/core';\n\n/**\n * Mock 数据模块\n * @description 提供前端开发所需的模拟数据适配器和工具\n */\n\nexport * from './adapter';\nexport * from './generator';\nexport * from './interceptor';\nexport * from './strategies';\nexport * from './types';\nexport * from './utils';\n\n/**\n * 模拟用户数据\n */\nexport const MOCK_USER = {\n id: 'u_001',\n name: 'Admin User',\n avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=Admin',\n role: 'admin',\n};\n\n// 保留原有的静态数据导出,以兼容可能直接引用的地方,但建议使用 adapter 自动生成\nexport const MOCK_SESSIONS = [\n { id: 's_001', title: '2024 Q1 销售分析', date: '2024-03-15', lastMessage: '好的,正在为您分析 Q1 销售数据...' },\n { id: 's_002', title: '用户增长趋势', date: '2024-03-10', lastMessage: '用户增长曲线显示...' },\n { id: 's_003', title: '竞品分析报告', date: '2024-03-08', lastMessage: '主要竞品 A 的市场份额...' },\n { id: 's_004', title: '营销活动复盘', date: '2024-03-05', lastMessage: 'ROI 提升了 15%...' },\n { id: 's_005', title: '财务报表审计', date: '2024-03-01', lastMessage: '请确认以下财务指标...' },\n];\n\nexport const MOCK_FAVORITES = [\n { id: 'fav-1', title: '季度销售总结', date: '2025/12/15' },\n { id: 'fav-2', title: '年度预算规划', date: '2025/12/10' },\n { id: 'fav-3', title: '核心指标监控', date: '2025/11/20' },\n];\n\nexport const MOCK_SCENES = [\n {\n id: '1',\n name: '销售数据分析',\n description: '全方位分析销售业绩,包括区域、产品、时间维度',\n code: 'SALES_001',\n creator: '管理员',\n createTime: '2023-01-01',\n tableCount: 5,\n kbCount: 2,\n qaCount: 10,\n cover: 'https://images.unsplash.com/photo-1551288049-bebda4e38f71?w=800&q=80',\n },\n {\n id: '2',\n name: '人力资源概览',\n description: '员工入职、离职、绩效分布与培训情况分析',\n code: 'HR_001',\n creator: 'HR 经理',\n createTime: '2023-02-15',\n tableCount: 3,\n kbCount: 1,\n qaCount: 5,\n cover: 'https://images.unsplash.com/photo-1460925895917-afdab827c52f?w=800&q=80',\n },\n {\n id: '3',\n name: '供应链优化',\n description: '库存周转、物流成本与供应商绩效评估',\n code: 'SCM_001',\n creator: '供应链总监',\n createTime: '2023-03-20',\n tableCount: 8,\n kbCount: 0,\n qaCount: 15,\n cover: 'https://images.unsplash.com/photo-1586528116311-ad8dd3c8310d?w=800&q=80',\n },\n];\n\nexport const generateMockMessages = (sessionId: string) => [\n {\n key: `msg_${sessionId}_1`,\n role: 'assistant',\n content: `您好!我是您的智能助手。当前会话 ID: ${sessionId}。请问有什么可以帮您?`,\n time: dateUtils.dayjs(dateUtils.now() - 10000).toISOString(),\n },\n];\n\nexport const mockData = {\n user: MOCK_USER,\n sessions: MOCK_SESSIONS,\n favorites: MOCK_FAVORITES,\n scenes: MOCK_SCENES,\n favoritesList: MOCK_FAVORITES, // Alias for compatibility if needed\n};\n","import {\n ApiAdapter,\n ApiEndpointConfig,\n ApiRequestConfig,\n createLogger,\n dateUtils,\n StreamCallbacks,\n} from '@chatbi-v/core';\nimport Mock from 'mockjs';\n\nimport { ChatStreamStrategy, HistoryStreamStrategy, StrategyFactory } from './strategies';\nimport { MockConfig, MockGeneratorStrategy } from './types';\nimport { sleep } from './utils';\n\nconst logger = createLogger('MockAdapter');\n\n/**\n * 基于 Mock.js 的请求适配器\n * @description 根据 API 配置中的 responseSchema 自动生成 Mock 数据,支持普通 JSON 和流式 SSE 响应\n */\nexport class MockAdapter implements ApiAdapter {\n private delay: number;\n // 遗留策略(为了兼容旧版代码)\n private static strategies: Record<string, MockGeneratorStrategy> = {\n chat_stream: new ChatStreamStrategy(),\n history_stream: new HistoryStreamStrategy(),\n };\n\n /**\n * 构造函数\n * @param delay 全局模拟延迟时间(毫秒),默认 300ms\n */\n constructor(delay: number = 300) {\n this.delay = delay;\n }\n\n /**\n * 注册自定义 Mock 生成策略\n * @param key 策略唯一标识符 (e.g., 'chat_stream', 'history_stream')\n * @param strategy 实现了 MockGeneratorStrategy 接口的策略实例\n */\n static registerStrategy(key: string, strategy: MockGeneratorStrategy) {\n this.strategies[key] = strategy;\n }\n\n /**\n * 处理普通 HTTP 请求(非流式)\n * @param config 请求配置对象\n * @param endpointConfig API 端点配置,包含 responseSchema\n * @returns Promise 返回模拟的响应数据\n */\n async request<T = any>(config: ApiRequestConfig, endpointConfig?: ApiEndpointConfig): Promise<T> {\n // 优先使用接口定义的 delay,否则使用全局默认 delay\n const delay = (endpointConfig as any)?.delay ?? this.delay;\n\n return new Promise((resolve, reject) => {\n setTimeout(() => {\n try {\n if (!endpointConfig || !endpointConfig.responseSchema) {\n logger.warn(`未找到响应架构配置: ${config.url}`);\n resolve({} as T);\n return;\n }\n\n let schema = endpointConfig.responseSchema;\n let mockData;\n\n // 支持函数式 schema,允许根据请求参数动态生成 schema\n if (typeof schema === 'function') {\n schema = schema(config);\n }\n\n // 构造有效配置对象,合并 endpointConfig 顶层属性\n const effectiveConfig = {\n type: (endpointConfig as any).type,\n status: (endpointConfig as any).status || 200,\n pageEvent: (endpointConfig as any).pageEvent,\n responseSchema: schema,\n ...(typeof schema === 'object' ? schema : {}),\n };\n\n // 0. 处理非 200 状态码\n if (effectiveConfig.status !== 200) {\n const error: any = new Error(`Request failed with status code ${effectiveConfig.status}`);\n error.response = {\n status: effectiveConfig.status,\n data: Mock.mock(schema),\n headers: {},\n };\n reject(error);\n return;\n }\n\n // 1. 字符串 Schema:直接作为结果返回(极少情况)\n if (typeof schema === 'string') {\n mockData = schema;\n }\n // 2. 遗留的高级 Schema (通过 _type 字段识别)\n else if (this.isLegacySchema(schema)) {\n const strategy = MockAdapter.strategies[schema._type];\n if (strategy) {\n const chunks = strategy.generate(schema);\n // 将流式块合并为单个字符串,并清理 SSE 格式标记\n mockData = chunks\n .join('')\n .replace(/event: data\\ndata: /g, '')\n .replace(/\\n\\n/g, '');\n try {\n mockData = JSON.parse(mockData);\n } catch (e) {\n // 忽略解析错误,保持原始数据格式\n }\n } else {\n logger.warn(`未找到对应的策略类型: ${schema._type}`);\n mockData = {};\n }\n }\n // 3. 通用策略模式\n else {\n const type = effectiveConfig.type || 'json';\n const strategy = StrategyFactory.getStrategy(type);\n mockData = strategy.process(effectiveConfig as MockConfig, config.params || config.data);\n }\n\n logger.info(`Request: ${config.method} ${config.url}`, config.data || config.params);\n logger.info(`Response:`, mockData);\n\n resolve(mockData as T);\n } catch (error) {\n reject(error);\n }\n }, delay);\n });\n }\n\n /**\n * 处理流式请求 (SSE)\n * @param config 请求配置对象\n * @param callbacks 流式回调函数集合 (onMessage, onFinish, onError)\n * @param endpointConfig API 端点配置,包含 responseSchema\n */\n async stream(\n config: ApiRequestConfig,\n callbacks: StreamCallbacks,\n endpointConfig?: ApiEndpointConfig,\n ): Promise<void> {\n const { onMessage, onFinish, onError } = callbacks;\n const signal = config.signal;\n\n // 优先使用接口定义的 delay,否则使用全局默认 delay\n const delay = (endpointConfig as any)?.delay ?? this.delay;\n\n return new Promise<void>((resolve, reject) => {\n // 如果请求已被取消,直接结束\n if (signal && signal.aborted) {\n if (onFinish) onFinish();\n resolve();\n return;\n }\n\n setTimeout(async () => {\n try {\n if (!endpointConfig || !endpointConfig.responseSchema) {\n logger.warn(`未找到流式响应架构: ${config.url}`);\n if (onFinish) onFinish();\n resolve();\n return;\n }\n\n const requestStart = dateUtils.now();\n logger.info(`[SSE Start] Request: ${config.method} ${config.url}`, {\n params: config.data || config.params,\n time: dateUtils.dayjs().toISOString(),\n });\n\n let schema = endpointConfig.responseSchema;\n\n // 支持函数式 schema\n if (typeof schema === 'function') {\n schema = schema(config);\n }\n\n // 构造有效配置对象,合并 endpointConfig 顶层属性\n const effectiveConfig = {\n type: (endpointConfig as any).type,\n status: (endpointConfig as any).status || 200,\n pageEvent: (endpointConfig as any).pageEvent,\n responseSchema: schema,\n ...(typeof schema === 'object' ? schema : {}),\n };\n\n // 0. 处理非 200 状态码\n if (effectiveConfig.status !== 200) {\n const response = {\n status: effectiveConfig.status,\n data: Mock.mock(schema),\n headers: {},\n };\n\n // 触发 onResponse 回调\n if (callbacks.onResponse) {\n const hijacked = await callbacks.onResponse(response);\n if (hijacked) {\n resolve();\n return;\n }\n }\n\n const error: any = new Error(`Stream request failed with status code ${effectiveConfig.status}`);\n error.response = response;\n logger.error(`[SSE Error] Request failed with status ${effectiveConfig.status}`, error);\n if (onError) onError(error);\n // 保持与 request 同样的处理逻辑,抛出异常以便顶层拦截\n reject(error);\n return;\n }\n\n // 触发 onResponse 回调 (200 场景)\n if (callbacks.onResponse) {\n const hijacked = await callbacks.onResponse({\n status: 200,\n data: null,\n headers: {},\n });\n if (hijacked) {\n resolve();\n return;\n }\n }\n\n // 1. 新版 Schema 策略 (sse, sse-page)\n if (this.isNewConfig(effectiveConfig)) {\n const type = effectiveConfig.type || 'sse';\n const strategy = StrategyFactory.getStrategy(type);\n\n // 策略处理返回 MockEvent 数组\n const events = strategy.process(\n effectiveConfig as MockConfig,\n config.params || config.data,\n );\n\n if (Array.isArray(events)) {\n const startTime = dateUtils.now();\n let eventCount = 0;\n\n logger.info(\n `[SSE Processing] Generated ${events.length} events for ${type} strategy`,\n );\n\n for (const event of events) {\n if (signal && signal.aborted) {\n logger.info(\n `[SSE Abort] Stream aborted by user after ${dateUtils.now() - requestStart}ms`,\n );\n break;\n }\n\n // 计算延迟\n const delay =\n typeof event.delay === 'number'\n ? event.delay\n : parseInt(String(event.delay || 0));\n const elapsed = dateUtils.now() - startTime;\n const remaining = Math.max(0, delay - elapsed);\n\n if (remaining > 0) {\n await sleep(remaining);\n }\n\n if (signal && signal.aborted) break;\n\n // 构造 SSE 格式数据块\n const chunk = `event: ${event.event}\\ndata: ${JSON.stringify(event.data)}\\n\\n`;\n\n // 记录关键事件日志\n if (['error', 'todos', 'page'].includes(event.event)) {\n logger.info(`[SSE Event] Emitting special event: ${event.event}`, event.data);\n } else if (eventCount === 0 || eventCount === events.length - 1) {\n logger.info(\n `[SSE Event] Emitting ${eventCount === 0 ? 'first' : 'last'} data event`,\n { preview: JSON.stringify(event.data).slice(0, 50) + '...' },\n );\n }\n if (onMessage) onMessage(chunk);\n eventCount++;\n }\n }\n }\n // 2. 遗留策略处理\n else {\n let chunks: string[] = [];\n\n if (typeof schema === 'string') {\n chunks = schema.split('\\n\\n').map((chunk) => chunk + '\\n\\n');\n } else if (this.isLegacySchema(schema)) {\n chunks = this.generateAdvancedChunks(schema);\n } else {\n const mockData = Mock.mock(schema);\n chunks = [`data: ${JSON.stringify(mockData)}\\n\\n`];\n }\n\n for (const chunk of chunks) {\n if (signal && signal.aborted) {\n logger.info('[SSE Abort] Stream aborted by user');\n break;\n }\n\n if (chunk.trim()) {\n if (onMessage) onMessage(chunk);\n await new Promise((r) => setTimeout(r, 200));\n }\n }\n }\n\n if (!signal || !signal.aborted) {\n logger.info(\n `[SSE Complete] Stream finished successfully in ${dateUtils.now() - requestStart}ms`,\n );\n if (onFinish) onFinish();\n }\n resolve();\n } catch (error) {\n logger.error(`[SSE Error] Stream processing failed`, error);\n if (onError) onError(error);\n resolve();\n }\n }, delay);\n });\n }\n\n /**\n * 判断是否为遗留的 schema 格式\n */\n private isLegacySchema(schema: any): boolean {\n return schema && typeof schema === 'object' && '_type' in schema;\n }\n\n /**\n * 判断是否为新版配置格式\n * @description 检查配置对象中是否包含有效的 type 字段\n */\n private isNewConfig(config: any): boolean {\n return (\n config &&\n typeof config === 'object' &&\n (['json', 'sse', 'sse-page'].includes(config.type) || 'responseSchema' in config) // 备用检查,如果 schema 内部定义了结构\n );\n }\n\n /**\n * 生成遗留的高级 schema 数据块\n */\n private generateAdvancedChunks(schema: any): string[] {\n const strategy = MockAdapter.strategies[schema._type];\n if (strategy) {\n return strategy.generate(schema);\n }\n logger.warn(`未找到对应的策略类型: ${schema._type}`);\n return [];\n }\n}\n","import Mock from 'mockjs';\n\nimport { MockResponseGenerator } from './generator';\nimport { \n ChatStreamConfig,\n HistoryStreamConfig,\n JsonMockConfig, \n MockConfig, \n MockEvent,\n MockGeneratorStrategy, // Legacy\n MockStrategy, \n SseMockConfig, \n SsePageMockConfig} from './types';\nimport { flatEvents, processTemplate } from './utils';\n\n// === Legacy Strategies (Preserved) ===\n\nexport class ChatStreamStrategy implements MockGeneratorStrategy {\n generate(schema: any): string[] {\n const config = schema as ChatStreamConfig;\n const defaultName = config.agentName || 'BI助手';\n const generator = new MockResponseGenerator(defaultName);\n \n const mockData = config.data ? Mock.mock(config.data) : {};\n \n // 1. Init Plan\n if (config.plan) {\n generator.initPlan(config.plan);\n }\n\n // 2. Execute Timeline\n if (config.timeline) {\n config.timeline.forEach(step => {\n if (step.planIndex !== undefined) {\n generator.updatePlanStatus(step.planIndex);\n }\n if (step.log) {\n const logContent = typeof step.log === 'string' ? step.log : step.log.content;\n const logLevel = typeof step.log === 'object' ? step.log.level : 'info';\n const logAgent = typeof step.log === 'object' ? step.log.agent : undefined;\n generator.addLog(logContent, logLevel, logAgent);\n }\n });\n }\n\n // 3. Content\n let content;\n if (typeof config.content === 'function') {\n content = config.content(mockData);\n } else {\n content = config.content;\n }\n\n if (typeof content === 'object' && content !== null) {\n generator.emitA2UI(content as Record<string, any>);\n } else {\n generator.streamContent(content as string);\n }\n\n // 4. Complete\n generator.completePlan();\n generator.finish();\n\n return generator.toString().split('\\n\\n').map(chunk => chunk + '\\n\\n');\n }\n}\n\nexport class HistoryStreamStrategy implements MockGeneratorStrategy {\n generate(schema: any): string[] {\n const config = schema as HistoryStreamConfig;\n const generator = new MockResponseGenerator('BI助手');\n \n const historyMock = Mock.mock(config.template);\n const fullHistory = [...(config.prepend || []), ...(historyMock.list || historyMock)];\n generator.emitHistory(fullHistory);\n \n return generator.toString().split('\\n\\n').map(chunk => chunk + '\\n\\n');\n }\n}\n\n// === New Schema Strategies ===\n\nexport class JsonStrategy implements MockStrategy {\n process(config: MockConfig, _requestParams?: any): any {\n const jsonConfig = config as JsonMockConfig;\n if (!jsonConfig.responseSchema) return {};\n return Mock.mock(jsonConfig.responseSchema);\n }\n}\n\nexport class SseStrategy implements MockStrategy {\n process(config: MockConfig, requestParams: any = {}): MockEvent[] {\n const sseConfig = config as SseMockConfig;\n if (!sseConfig.responseSchema) return [];\n \n // Use flatEvents to process the schema with MockJS and sort by delay\n return flatEvents(sseConfig.responseSchema, requestParams);\n }\n}\n\nexport class SsePageStrategy implements MockStrategy {\n process(config: MockConfig, requestParams: any = {}): MockEvent[] {\n const ssePageConfig = config as SsePageMockConfig;\n if (!ssePageConfig.responseSchema) return [];\n\n // 1. Generate base events\n const events = flatEvents(ssePageConfig.responseSchema, requestParams);\n\n // 2. Generate page event if exists\n if (ssePageConfig.pageEvent) {\n const context = {\n $query: requestParams, // Backward compatibility\n $body: requestParams,\n $param: requestParams?.param || requestParams\n };\n\n Mock.Random.extend({ \n $query: () => context.$query,\n $body: () => context.$body,\n $param: () => context.$param\n });\n\n // First let Mock.js process standard templates (like @integer)\n let pageEvent = Mock.mock(ssePageConfig.pageEvent);\n // Then process custom {{}} templates\n pageEvent = processTemplate(pageEvent, context);\n \n // Calculate max delay from existing events to ensure page event is last\n let maxDelay = 0;\n if (events.length > 0) {\n const lastEvent = events[events.length - 1];\n maxDelay = typeof lastEvent.delay === 'number' ? lastEvent.delay : parseInt(String(lastEvent.delay || 0));\n }\n \n // Set page event delay to be slightly after the last event\n const pageDelay = typeof pageEvent.delay === 'number' ? pageEvent.delay : parseInt(String(pageEvent.delay || 0));\n if (pageDelay <= maxDelay) {\n pageEvent.delay = maxDelay + 20; // Add small buffer\n }\n\n events.push(pageEvent);\n }\n \n // Re-sort in case pageEvent has specific delay\n const es = events.sort((a, b) => {\n const delayA = typeof a.delay === 'number' ? a.delay : parseInt(String(a.delay || 0));\n const delayB = typeof b.delay === 'number' ? b.delay : parseInt(String(b.delay || 0));\n return delayA - delayB;\n });\n return es;\n }\n}\n\n// Factory for new strategies\nexport const StrategyFactory = {\n getStrategy(type: string = 'json'): MockStrategy {\n switch (type) {\n case 'sse':\n return new SseStrategy();\n case 'sse-page':\n return new SsePageStrategy();\n case 'json':\n default:\n return new JsonStrategy();\n }\n }\n};\n","import { dateUtils } from '@chatbi-v/core';\n\n/**\n * Mock 响应生成器\n * @description 用于动态生成流式响应数据,支持阶段流转、日志插入和内容分块\n */\nexport class MockResponseGenerator {\n private events: string[] = [];\n private sessionId: string;\n private agentName: string;\n private currentTodos: { content: string; status: 'PENDING' | 'IN_PROGRESS' | 'COMPLETED' }[] = [];\n\n constructor(agentName: string = 'Assistant', sessionId?: string) {\n this.sessionId = sessionId || ('conv_' + dateUtils.now());\n this.agentName = agentName;\n }\n\n /**\n * 生成历史消息流\n */\n emitHistory(history: { role: string; content: string; createTime: string; todos?: any[] }[]) {\n history.forEach(msg => {\n const data = {\n content: msg.content,\n sessionId: this.sessionId,\n role: msg.role,\n completed: true,\n agentName: this.agentName,\n createTime: msg.createTime\n };\n this.pushEvent('data', data);\n\n if (msg.todos) {\n this.pushEvent('todos', { items: msg.todos });\n }\n });\n return this;\n }\n\n /**\n * 初始化执行计划\n * @param steps 计划步骤列表\n */\n initPlan(steps: string[]) {\n this.currentTodos = steps.map(step => ({\n content: step,\n status: 'PENDING'\n }));\n this.pushTodos();\n return this;\n }\n\n /**\n * 更新执行计划状态\n * @param activeIndex 当前正在进行的步骤索引\n */\n updatePlanStatus(activeIndex: number) {\n this.currentTodos = this.currentTodos.map((todo, index) => {\n if (index < activeIndex) {\n return { ...todo, status: 'COMPLETED' };\n } else if (index === activeIndex) {\n return { ...todo, status: 'IN_PROGRESS' };\n } else {\n return { ...todo, status: 'PENDING' };\n }\n });\n this.pushTodos();\n return this;\n }\n\n /**\n * 标记所有计划为完成\n */\n completePlan() {\n this.currentTodos = this.currentTodos.map(todo => ({ ...todo, status: 'COMPLETED' }));\n this.pushTodos();\n return this;\n }\n\n /**\n * 添加日志\n * @param content 日志内容\n * @param type 日志类型\n * @param agentName 可选的 Agent 名称\n */\n addLog(content: string, type: 'info' | 'warning' | 'error' = 'info', agentName?: string) {\n this.pushEvent('log', {\n type,\n content,\n agentName: agentName || this.agentName\n });\n return this;\n }\n\n /**\n * 添加系统错误事件\n * @param errorCode 错误码\n * @param errorMessage 错误信息\n */\n addError(errorCode: string, errorMessage: string) {\n this.pushEvent('error', {\n errorCode,\n errorMessage\n });\n return this;\n }\n\n /**\n * 添加流式内容块\n * @param content 完整内容\n * @param chunkSize 分块大小\n */\n streamContent(content: string, chunkSize: number = 20) {\n for (let i = 0; i < content.length; i += chunkSize) {\n const chunk = content.slice(i, i + chunkSize);\n this.pushEvent('data', {\n content: chunk,\n sessionId: this.sessionId,\n completed: false,\n agentName: this.agentName\n });\n }\n return this;\n }\n\n /**\n * 结束流\n */\n finish() {\n this.pushEvent('data', {\n content: '',\n sessionId: this.sessionId,\n completed: true,\n agentName: this.agentName\n });\n return this;\n }\n\n /**\n * 生成 A2UI 响应\n * @param component A2UI 组件配置对象\n */\n emitA2UI(component: Record<string, any>) {\n const content = JSON.stringify(component, null, 2);\n return this.streamContent(content);\n }\n\n /**\n * 生成最终的响应字符串\n */\n toString() {\n return this.events.join('\\n');\n }\n\n private pushTodos() {\n this.pushEvent('todos', { items: this.currentTodos });\n }\n\n private pushEvent(type: string, data: any) {\n this.events.push(`event: ${type}\\ndata: ${JSON.stringify(data)}\\n`);\n }\n}\n","import dayjs from 'dayjs';\nimport Mock from 'mockjs';\n\nimport { MockEvent } from './types';\n\nexport const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));\n\n/**\n * Process string templates like \"{{$query.pageNo * 10}}\" in object values.\n * Supports $query (for backward compatibility), $body, and $param.\n */\nexport function processTemplate(data: any, context: Record<string, any>): any {\n if (typeof data === 'string') {\n // Check for {{ ... }} pattern\n if (/^\\{\\{.*\\}\\}$/.test(data)) {\n const expression = data.slice(2, -2).trim();\n try {\n // Safe evaluation using Function with context keys\n const keys = Object.keys(context);\n const values = Object.values(context);\n const fn = new Function(...keys, `return ${expression}`);\n return fn(...values);\n } catch (e) {\n console.warn(`[Mock] Failed to evaluate template: ${data}`, e);\n return data;\n }\n }\n return data;\n }\n \n if (Array.isArray(data)) {\n return data.map(item => processTemplate(item, context));\n }\n \n if (typeof data === 'object' && data !== null) {\n const result: Record<string, any> = {};\n for (const key in data) {\n result[key] = processTemplate(data[key], context);\n }\n return result;\n }\n \n return data;\n}\n\n/**\n * Flatten eventsSchema into a sorted array of events.\n * \n * Supports Mock.js array generation rules in keys, e.g.:\n * { 'data|8-12': [{ event: 'data', ... }] } \n * -> generates 8 to 12 data events.\n */\nexport function flatEvents(\n eventsSchema: Record<string, MockEvent[]>, \n requestData: any = {}\n): MockEvent[] {\n // Construct context for template processing\n const context: Record<string, any> = {\n $query: requestData, // Backward compatibility\n $body: requestData,\n $param: requestData?.param || requestData\n };\n\n // Extend Mock.Random to support templates\n Mock.Random.extend({ \n $query: () => context.$query,\n $body: () => context.$body,\n $param: () => context.$param\n });\n \n // Generate data using Mock.mock\n const compiled = Mock.mock(eventsSchema) as Record<string, MockEvent[]>;\n \n // Flatten and sort by delay\n return Object.values(compiled)\n .flat()\n .map(event => processTemplate(event, context))\n .sort((a, b) => {\n const delayA = typeof a.delay === 'number' ? a.delay : parseInt(String(a.delay || 0));\n const delayB = typeof b.delay === 'number' ? b.delay : parseInt(String(b.delay || 0));\n return delayA - delayB;\n });\n}\n\n/**\n * Convert an array of events into a ReadableStream (for SSE).\n */\nexport function eventsToStream(events: MockEvent[]): ReadableStream {\n const encoder = new TextEncoder();\n \n return new ReadableStream({\n start(ctrl) {\n // Check if events is empty\n if (!events || events.length === 0) {\n ctrl.close();\n return;\n }\n\n (async () => {\n try {\n // We assume events are sorted by their `delay` property which represents \n // \"absolute time from start\".\n const startTime = dayjs().valueOf();\n \n for (const eventItem of events) {\n const delay = typeof eventItem.delay === 'number' ? eventItem.delay : parseInt(String(eventItem.delay || 0));\n \n // Calculate how much time passed since start\n const elapsed = dayjs().valueOf() - startTime;\n const remaining = Math.max(0, delay - elapsed);\n \n if (remaining > 0) {\n await sleep(remaining);\n }\n \n const payload = `event: ${eventItem.event}\\ndata: ${JSON.stringify(eventItem.data)}\\n\\n`;\n ctrl.enqueue(encoder.encode(payload));\n }\n ctrl.close();\n } catch (e) {\n ctrl.error(e);\n }\n })();\n },\n });\n}\n","import Mock from 'mockjs';\n\nimport { StrategyFactory } from './strategies';\nimport { JsonMockConfig, MockConfig, MockSchema, SseMockConfig, SsePageMockConfig } from './types';\nimport { eventsToStream, sleep } from './utils';\n\ndeclare global {\n interface Window {\n _originalFetch: typeof fetch;\n _originalEventSource: typeof EventSource;\n }\n}\n\nexport function installFetchMock(schema: MockSchema) {\n if (!window._originalFetch) {\n window._originalFetch = window.fetch;\n }\n\n window.fetch = async (input: RequestInfo | URL, init: RequestInit = {}) => {\n const url = typeof input === 'string' ? input : input instanceof URL ? input.toString() : input.url;\n const method = (init.method || 'GET').toUpperCase();\n \n // Find matching rule\n const rules = Object.values(schema);\n const rule = rules.find((v) => {\n if (!v.url) return false;\n // Convert route params :id to regex \\w+\n // We might want to be more specific, e.g., ([^/]+)\n const pattern = v.url.replace(/:[a-zA-Z0-9_]+/g, '([^/]+)');\n const regex = new RegExp(`^${pattern}$`);\n \n // Check if URL matches (ignoring query params for the match, but we might need them later)\n const [path] = url.split('?');\n // Match method if specified, default to GET match? or just match URL?\n // Usually method matters.\n const ruleMethod = (v.method || 'GET').toUpperCase();\n return regex.test(path) && ruleMethod === method;\n });\n\n if (!rule) {\n return window._originalFetch(input, init);\n }\n\n console.log(`[Mock] Intercepted ${method} ${url}`, rule);\n\n // Handle non-200 status code immediately\n const status = rule.status || 200;\n if (status !== 200) {\n await sleep(rule.delay || 0);\n return new Response(JSON.stringify({ \n message: `Mock error status ${status}`,\n code: status \n }), {\n status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n await sleep(rule.delay || 0);\n\n // Determine type (default 'json' if not present)\n const type = rule.type || 'json';\n const strategy = StrategyFactory.getStrategy(type);\n \n // Parse query params for strategies that need them\n const urlObj = new URL(url, window.location.origin);\n const query = Object.fromEntries(urlObj.searchParams);\n \n const result = strategy.process(rule as MockConfig, query);\n\n /* 1. JSON Response */\n if (type === 'json') {\n return new Response(JSON.stringify(result), {\n status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n /* 2. SSE / SSE-Page Response */\n if (type === 'sse' || type === 'sse-page') {\n const events = result; // Strategy returns MockEvent[]\n const stream = eventsToStream(events);\n return new Response(stream, { \n status, \n headers: { 'Content-Type': 'text/event-stream' } \n });\n }\n\n return window._originalFetch(input, init);\n };\n}\n\nexport function installSSEMock() {\n // Placeholder for EventSource mocking if needed.\n // Currently, we rely on fetch interception.\n // Many modern apps use fetch for SSE (POST requests, headers, etc.)\n}\n\nexport function setupMock(schema: MockSchema) {\n if (typeof window !== 'undefined') {\n installFetchMock(schema);\n installSSEMock();\n }\n}\n","\nimport { ApiRequestConfig } from '@chatbi-v/core';\n\n// === Base Types ===\n\nexport type MockMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\nexport type MockType = 'json' | 'sse' | 'sse-page';\n\nexport interface MockEvent {\n event: string;\n data: any;\n /** Delay in ms, or a mockjs template string like '@increment(100)' */\n delay?: number | string;\n}\n\n// === Unified Strategy Interface ===\n\nexport interface MockStrategy {\n /**\n * Process the schema and return the result.\n * For JSON: returns the mocked object.\n * For SSE: returns an array of formatted event strings (chunks).\n */\n process(config: MockConfig, requestParams?: any): any;\n}\n\n// === Mock Configuration Types (Matching chat.mock.ts) ===\n\nexport interface BaseMockConfig {\n /** Optional: URL pattern if used in global interceptor */\n url?: string;\n /** Optional: Method if used in global interceptor */\n method?: MockMethod;\n /** Global delay for the request */\n delay?: number;\n /** Optional: HTTP status code (default: 200) */\n status?: number;\n /** Mock type (default: 'json') */\n type?: MockType;\n}\n\nexport interface JsonMockConfig extends BaseMockConfig {\n type?: 'json';\n /** The MockJS template for the response body */\n responseSchema: any;\n}\n\nexport interface SseMockConfig extends BaseMockConfig {\n type: 'sse';\n /** \n * Dictionary of event templates. \n * Key can be a mockjs template like 'data|3-5' \n */\n responseSchema: Record<string, MockEvent[]>;\n}\n\nexport interface SsePageMockConfig extends BaseMockConfig {\n type: 'sse-page';\n /** Dictionary of event templates */\n responseSchema: Record<string, MockEvent[]>;\n /** Special event for pagination metadata */\n pageEvent: MockEvent;\n}\n\nexport type MockConfig = JsonMockConfig | SseMockConfig | SsePageMockConfig;\n\nexport type MockSchema = Record<string, MockConfig>;\n\n// === Legacy Support (Keep these for backward compatibility if needed) ===\n\nexport interface ChatStreamConfig {\n _type: 'chat_stream';\n agentName?: string;\n plan?: string[];\n data?: Record<string, any>;\n timeline?: Array<{\n log?: string | { content: string; level?: 'info' | 'warning' | 'error'; agent?: string };\n planIndex?: number;\n delay?: number;\n }>;\n content: string | Record<string, any> | ((data: any) => string | Record<string, any>);\n}\n\nexport interface HistoryStreamConfig {\n _type: 'history_stream';\n template: Record<string, any>;\n prepend?: any[];\n}\n\nexport type AdvancedMockSchema = ChatStreamConfig | HistoryStreamConfig;\n\nexport interface MockGeneratorStrategy {\n generate(schema: any): string[];\n}\n\n// === Helper Functions (Restored) ===\n\nexport function createChatStream(config: Omit<ChatStreamConfig, '_type'>): ChatStreamConfig {\n return { _type: 'chat_stream', ...config };\n}\n\nexport function createHistoryStream(config: Omit<HistoryStreamConfig, '_type'>): HistoryStreamConfig {\n return { _type: 'history_stream', ...config };\n}\n"],"mappings":"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","names":["dateUtils","dateUtils","Mock","Mock","mockData","Mock","mockData","Mock","dateUtils","delay","dateUtils"]}
package/package.json CHANGED
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "name": "@chatbi-v/mocks",
3
- "version": "2.1.5",
4
- "main": "dist/index.cjs",
3
+ "version": "2.1.7",
4
+ "type": "module",
5
+ "main": "dist/index.mjs",
5
6
  "files": [
6
7
  "dist"
7
8
  ],
@@ -17,21 +18,21 @@
17
18
  "require": "./dist/index.cjs"
18
19
  }
19
20
  },
20
- "scripts": {
21
- "build": "chatbi-cli build",
22
- "dev": "chatbi-cli build --watch",
23
- "test": "echo \"Error: no test specified\" && exit 1"
24
- },
25
21
  "dependencies": {
26
- "@chatbi-v/core": "workspace:*",
27
22
  "mockjs": "^1.1.0",
28
23
  "dayjs": "^1.11.10",
29
- "react": ">=18.0.0"
24
+ "react": ">=18.0.0",
25
+ "@chatbi-v/core": "2.1.7"
30
26
  },
31
27
  "devDependencies": {
32
- "@chatbi-v/cli": "workspace:*",
33
28
  "@types/mockjs": "^1.0.10",
34
29
  "tsup": "^8.5.1",
35
- "@chatbi-v/config": "workspace:*"
30
+ "@chatbi-v/cli": "2.1.7",
31
+ "@chatbi-v/config": "2.1.7"
32
+ },
33
+ "scripts": {
34
+ "build": "chatbi-cli build",
35
+ "dev": "chatbi-cli build --watch",
36
+ "test": "echo \"Error: no test specified\" && exit 1"
36
37
  }
37
- }
38
+ }