@will1123/lx-ui-utils 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +747 -120
  2. package/dist/dist/index.esm.js +69039 -469
  3. package/dist/dist/index.esm.min.js +62900 -328
  4. package/dist/dist/index.esm.min.js.map +1 -1
  5. package/dist/dist/index.umd.js +69038 -468
  6. package/dist/dist/index.umd.min.js +346 -13
  7. package/dist/dist/index.umd.min.js.map +1 -1
  8. package/dist/es/helper.js +59 -0
  9. package/dist/es/helper.js.map +1 -0
  10. package/dist/es/index.js +13 -11
  11. package/dist/es/index.js.map +1 -1
  12. package/dist/es/markdown.js +248 -267
  13. package/dist/es/markdown.js.map +1 -1
  14. package/dist/es/node_modules/katex/dist/katex.js +14455 -0
  15. package/dist/es/node_modules/katex/dist/katex.js.map +1 -0
  16. package/dist/es/sse.js +34 -142
  17. package/dist/es/sse.js.map +1 -1
  18. package/dist/es/thinking.js +19 -138
  19. package/dist/es/thinking.js.map +1 -1
  20. package/dist/lib/helper.js +59 -0
  21. package/dist/lib/helper.js.map +1 -0
  22. package/dist/lib/index.js +9 -7
  23. package/dist/lib/index.js.map +1 -1
  24. package/dist/lib/markdown.js +249 -268
  25. package/dist/lib/markdown.js.map +1 -1
  26. package/dist/lib/node_modules/katex/dist/katex.js +14454 -0
  27. package/dist/lib/node_modules/katex/dist/katex.js.map +1 -0
  28. package/dist/lib/sse.js +34 -142
  29. package/dist/lib/sse.js.map +1 -1
  30. package/dist/lib/thinking.js +19 -138
  31. package/dist/lib/thinking.js.map +1 -1
  32. package/dist/types/helper.d.ts +46 -0
  33. package/dist/types/helper.d.ts.map +1 -0
  34. package/dist/types/index.d.ts +1 -0
  35. package/dist/types/index.d.ts.map +1 -1
  36. package/dist/types/markdown.d.ts +69 -100
  37. package/dist/types/markdown.d.ts.map +1 -1
  38. package/dist/types/sse.d.ts +48 -48
  39. package/dist/types/sse.d.ts.map +1 -1
  40. package/dist/types/thinking.d.ts +25 -48
  41. package/dist/types/thinking.d.ts.map +1 -1
  42. package/package.json +20 -3
@@ -1,115 +1,84 @@
1
+ import { Marked } from 'marked';
2
+ import { default as katex } from 'katex';
3
+
1
4
  /**
2
- * Markdown 渲染配置
5
+ * 代码主题类型
3
6
  */
4
- export interface MarkdownRenderConfig {
5
- /** 是否启用代码高亮(默认 false) */
6
- highlight?: boolean;
7
- /** 自定义代码高亮语言映射 */
8
- highlightLanguages?: Record<string, string>;
9
- /** 是否渲染任务列表(默认 true) */
10
- taskList?: boolean;
11
- /** 是否渲染表格(默认 true) */
12
- table?: boolean;
13
- /** 是否渲染链接(默认 true) */
14
- link?: boolean;
15
- /** 是否渲染图片(默认 true) */
16
- image?: boolean;
17
- }
7
+ export type CodeTheme = 'dark' | 'light';
18
8
  /**
19
- * Markdown 流式更新配置
9
+ * createMarkdownRender 函数配置
20
10
  */
21
- export interface MarkdownStreamConfig extends MarkdownRenderConfig {
22
- /** 更新回调函数 */
23
- onUpdate?: (html: string) => void;
24
- /** 完成回调函数 */
25
- onComplete?: (html: string) => void;
11
+ export interface CreateMarkdownRenderConfig {
12
+ /** 代码块工具栏是否启用(默认 true) */
13
+ codeBoxToolEnable?: boolean;
14
+ /** 是否启用 KaTeX 公式支持(默认 true) */
15
+ katexEnable?: boolean;
16
+ /** KaTeX 配置选项 */
17
+ katexOptions?: katex.KatexOptions;
26
18
  }
27
19
  /**
28
- * 简单的 Markdown 渲染器
20
+ * 代码块工具栏事件配置
29
21
  */
30
- export declare class MarkdownRenderer {
31
- private config;
32
- constructor(config?: MarkdownRenderConfig);
33
- /**
34
- * 渲染 Markdown HTML
35
- */
36
- render(markdown: string): string;
37
- /**
38
- * 转义 HTML 特殊字符
39
- */
40
- private escapeHtml;
41
- /**
42
- * 渲染代码块
43
- */
44
- private renderCodeBlocks;
45
- /**
46
- * 渲染标题
47
- */
48
- private renderHeadings;
49
- /**
50
- * 渲染粗体和斜体
51
- */
52
- private renderEmphasis;
53
- /**
54
- * 渲染任务列表
55
- */
56
- private renderTaskLists;
57
- /**
58
- * 渲染无序列表
59
- */
60
- private renderUnorderedLists;
61
- /**
62
- * 渲染有序列表
63
- */
64
- private renderOrderedLists;
65
- /**
66
- * 渲染表格
67
- */
68
- private renderTables;
69
- /**
70
- * 渲染链接
71
- */
72
- private renderLinks;
73
- /**
74
- * 渲染图片
75
- */
76
- private renderImages;
77
- /**
78
- * 渲染段落
79
- */
80
- private renderParagraphs;
81
- /**
82
- * 渲染换行
83
- */
84
- private renderLineBreaks;
22
+ export interface CodeBoxEventsConfig {
23
+ /** 复制成功回调 */
24
+ onCopySuccess?: (text: string) => void;
25
+ /** 复制失败回调 */
26
+ onCopyError?: (error: Error) => void;
27
+ /** 主题切换回调 */
28
+ onThemeChange?: (theme: CodeTheme) => void;
85
29
  }
86
30
  /**
87
- * 渲染 Markdown 为 HTML(便捷方法)
31
+ * localStorage 获取代码主题
88
32
  */
89
- export declare function renderMarkdown(markdown: string, config?: MarkdownRenderConfig): string;
33
+ export declare function getMarkdownCodeTheme(): CodeTheme;
90
34
  /**
91
- * 流式渲染 Markdown(用于 SSE 流式响应)
35
+ * 设置代码主题到 localStorage
92
36
  */
93
- export declare class MarkdownStreamRenderer {
94
- private renderer;
95
- private buffer;
96
- private config;
97
- constructor(config?: MarkdownStreamConfig);
98
- /**
99
- * 追加文本并渲染
100
- */
101
- append(text: string): string;
102
- /**
103
- * 完成渲染
104
- */
105
- complete(): string;
106
- /**
107
- * 重置渲染器
108
- */
109
- reset(): void;
110
- }
37
+ export declare function setMarkdownCodeTheme(theme: CodeTheme): void;
38
+ /**
39
+ * 切换代码主题
40
+ *
41
+ * @returns 新主题
42
+ *
43
+ * @example
44
+ * ```typescript
45
+ * import { toggleMarkdownCodeTheme } from '@will1123/lx-ui-utils'
46
+ *
47
+ * // 切换主题
48
+ * const newTheme = toggleMarkdownCodeTheme()
49
+ * // 注意:此函数只切换 localStorage 中的主题,不会更新 DOM
50
+ * // 如需更新 DOM,请配合 updateMarkdownCodeBlocksTheme
51
+ * ```
52
+ */
53
+ export declare function toggleMarkdownCodeTheme(): CodeTheme;
54
+ /**
55
+ * 更新 DOM 中所有代码块的主题
56
+ *
57
+ * @param themeOrContainer - 主题或容器元素(字符串表示主题,DOM 元素表示容器)
58
+ * @param theme - 主题(当第一个参数是容器时使用)
59
+ *
60
+ * @example
61
+ * ```typescript
62
+ * import { updateMarkdownCodeBlocksTheme } from '@will1123/lx-ui-utils'
63
+ *
64
+ * // 方式 1:只传主题(更新 document.body 中的所有代码块)
65
+ * updateMarkdownCodeBlocksTheme('dark')
66
+ *
67
+ * // 方式 2:传容器和主题
68
+ * const container = document.querySelector('#markdown-container')
69
+ * updateMarkdownCodeBlocksTheme(container, 'light')
70
+ * ```
71
+ */
72
+ export declare function updateMarkdownCodeBlocksTheme(themeOrContainer: CodeTheme | HTMLElement | Document, theme?: CodeTheme): void;
73
+ /**
74
+ * 创建配置好的 Marked 实例
75
+ */
76
+ export declare function createMarkdownRender(createConfig?: CreateMarkdownRenderConfig): Marked;
111
77
  /**
112
- * 创建流式渲染器实例
78
+ * 绑定代码块工具栏事件(函数重载)
113
79
  */
114
- export declare function createMarkdownRenderer(config?: MarkdownStreamConfig): MarkdownStreamRenderer;
80
+ export declare function bindMarkdownCodeBoxEvents(): () => void;
81
+ export declare function bindMarkdownCodeBoxEvents(config: CodeBoxEventsConfig): () => void;
82
+ export declare function bindMarkdownCodeBoxEvents(container: HTMLElement | Document): () => void;
83
+ export declare function bindMarkdownCodeBoxEvents(container: HTMLElement | Document, config: CodeBoxEventsConfig): () => void;
115
84
  //# sourceMappingURL=markdown.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/markdown.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,yBAAyB;IACzB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,kBAAkB;IAClB,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC3C,wBAAwB;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,sBAAsB;IACtB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,sBAAsB;IACtB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,sBAAsB;IACtB,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,oBAAoB;IAChE,aAAa;IACb,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,aAAa;IACb,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACpC;AAED;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAsB;gBAExB,MAAM,GAAE,oBAAyB;IAW7C;;OAEG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAkDhC;;OAEG;IACH,OAAO,CAAC,UAAU;IAIlB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAWxB;;OAEG;IACH,OAAO,CAAC,cAAc;IAUtB;;OAEG;IACH,OAAO,CAAC,cAAc;IActB;;OAEG;IACH,OAAO,CAAC,eAAe;IAKvB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA2C5B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA+B1B;;OAEG;IACH,OAAO,CAAC,YAAY;IAwDpB;;OAEG;IACH,OAAO,CAAC,WAAW;IAInB;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA8BxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;CAMzB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,oBAAoB,GAC5B,MAAM,CAGR;AAED;;GAEG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,MAAM,CAAsB;gBAExB,MAAM,GAAE,oBAAyB;IAK7C;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAW5B;;OAEG;IACH,QAAQ,IAAI,MAAM;IAUlB;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,CAAC,EAAE,oBAAoB,GAC5B,sBAAsB,CAExB"}
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGxC,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;AAEzC;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,0BAA0B;IAC1B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,+BAA+B;IAC/B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,iBAAiB;IACjB,YAAY,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,aAAa;IACb,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,aAAa;IACb,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACrC,aAAa;IACb,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;CAC5C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,SAAS,CAGhD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAG3D;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,uBAAuB,IAAI,SAAS,CAKnD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,6BAA6B,CAC3C,gBAAgB,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,EACpD,KAAK,CAAC,EAAE,SAAS,GAChB,IAAI,CAoBN;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,YAAY,GAAE,0BAA+B,UAiF9C;AAqFD;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,IAAI,CAAC;AACxD,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,mBAAmB,GAC1B,MAAM,IAAI,CAAC;AACd,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,WAAW,GAAG,QAAQ,GAChC,MAAM,IAAI,CAAC;AACd,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,WAAW,GAAG,QAAQ,EACjC,MAAM,EAAE,mBAAmB,GAC1B,MAAM,IAAI,CAAC"}
@@ -1,70 +1,70 @@
1
+ import { EventSourceMessage } from '@microsoft/fetch-event-source';
2
+
3
+ export type { EventSourceMessage };
1
4
  /**
2
- * SSE (Server-Sent Events) 请求配置
5
+ * SSE 请求配置
3
6
  */
4
7
  export interface SSEConfig {
5
8
  /** 请求 URL */
6
9
  url: string;
7
- /** 请求方法 */
10
+ /** 请求方法(默认 'POST') */
8
11
  method?: 'GET' | 'POST';
9
12
  /** 请求头 */
10
13
  headers?: Record<string, string>;
11
- /** 请求体(POST 请求时使用) */
12
- body?: any;
13
- /** 请求超时时间(毫秒) */
14
- timeout?: number;
15
- }
16
- /**
17
- * SSE 消息
18
- */
19
- export interface SSEMessage {
20
- /** 数据内容 */
21
- data: string;
22
- /** 事件类型 */
23
- event?: string;
24
- /** ID */
25
- id?: string;
26
- /** 重连时间(毫秒) */
27
- retry?: number;
14
+ /** 请求体(对象类型) */
15
+ body?: object;
16
+ /** AbortController 的 signal(用于取消请求) */
17
+ signal?: AbortSignal;
18
+ /** 认证 Token */
19
+ token?: string;
20
+ /** 页面隐藏时是否保持连接(默认 true) */
21
+ openWhenHidden?: boolean;
28
22
  }
29
23
  /**
30
24
  * SSE 事件处理器
31
25
  */
32
26
  export interface SSEHandlers {
27
+ /** 连接打开时触发(可验证响应) */
28
+ onOpen?: (response: Response) => void | Promise<void>;
33
29
  /** 接收到消息时触发 */
34
- onMessage?: (message: SSEMessage) => void;
35
- /** 连接打开时触发 */
36
- onOpen?: () => void;
30
+ onMessage?: (message: EventSourceMessage) => void;
37
31
  /** 连接关闭时触发 */
38
32
  onClose?: () => void;
39
33
  /** 发生错误时触发 */
40
34
  onError?: (error: Error) => void;
41
35
  }
42
36
  /**
43
- * SSE 连接类
44
- */
45
- export declare class SSEConnection {
46
- private controller;
47
- private eventSource;
48
- private timeoutTimer;
49
- /**
50
- * 发起 SSE 请求
51
- */
52
- request(config: SSEConfig, handlers: SSEHandlers): Promise<void>;
53
- /**
54
- * 使用 EventSource 连接(仅支持 GET 请求)
55
- */
56
- connect(url: string, handlers: SSEHandlers): void;
57
- /**
58
- * 解析 SSE 消息
59
- */
60
- private parseMessage;
61
- /**
62
- * 关闭连接
63
- */
64
- close(): void;
65
- }
66
- /**
67
- * 发起 SSE 请求(便捷方法)
37
+ * 发起 SSE 请求
38
+ *
39
+ * @example
40
+ * ```ts
41
+ * // 基础用法
42
+ * await sse({
43
+ * url: '/api/stream',
44
+ * body: { prompt: 'hello' }
45
+ * }, {
46
+ * onMessage(msg) {
47
+ * console.log(msg.data)
48
+ * }
49
+ * })
50
+ *
51
+ * // 使用 Token 认证
52
+ * await sse({
53
+ * url: '/api/stream',
54
+ * token: 'Bearer your-token',
55
+ * body: { prompt: 'hello' }
56
+ * }, {
57
+ * onOpen(response) {
58
+ * console.log('连接已打开')
59
+ * },
60
+ * onMessage(msg) {
61
+ * console.log(msg.data)
62
+ * },
63
+ * onError(err) {
64
+ * console.error(err)
65
+ * }
66
+ * })
67
+ * ```
68
68
  */
69
- export declare function sse(config: SSEConfig, handlers: SSEHandlers): SSEConnection;
69
+ export declare function sse(config: SSEConfig, handlers: SSEHandlers): Promise<void>;
70
70
  //# sourceMappingURL=sse.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../src/sse.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,aAAa;IACb,GAAG,EAAE,MAAM,CAAA;IACX,WAAW;IACX,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;IACvB,UAAU;IACV,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,sBAAsB;IACtB,IAAI,CAAC,EAAE,GAAG,CAAA;IACV,iBAAiB;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,WAAW;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW;IACX,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS;IACT,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,eAAe;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,eAAe;IACf,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,CAAA;IACzC,cAAc;IACd,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;IACnB,cAAc;IACd,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,cAAc;IACd,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;CACjC;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,WAAW,CAA2B;IAC9C,OAAO,CAAC,YAAY,CAA8B;IAElD;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IA0FtE;;OAEG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,IAAI;IAoBjD;;OAEG;IACH,OAAO,CAAC,YAAY;IAqBpB;;OAEG;IACH,KAAK,IAAI,IAAI;CAmBd;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,GAAG,aAAa,CAY3E"}
1
+ {"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../src/sse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAGzF,YAAY,EAAE,kBAAkB,EAAE,CAAA;AAElC;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,aAAa;IACb,GAAG,EAAE,MAAM,CAAA;IACX,sBAAsB;IACtB,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;IACvB,UAAU;IACV,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,gBAAgB;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,uCAAuC;IACvC,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,eAAe;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,2BAA2B;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,qBAAqB;IACrB,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,eAAe;IACf,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAClD,cAAc;IACd,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,cAAc;IACd,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAsB,GAAG,CACvB,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,WAAW,GACpB,OAAO,CAAC,IAAI,CAAC,CAqCf"}
@@ -1,64 +1,41 @@
1
1
  /**
2
- * 思考过程提取配置
2
+ * 深度思考提取配置
3
3
  */
4
4
  export interface ThinkingExtractConfig {
5
5
  /** 思考标签名称(默认为 'think') */
6
6
  tagName?: string;
7
- /** 是否提取完整标签内容(包含标签本身) */
8
- includeTags?: boolean;
9
- /** 是否移除思考内容后的其余文本 */
10
- removeRest?: boolean;
7
+ /** 解析模式:'full'(完整标签,默认)| 'end-tag-only'(仅结束标签) */
8
+ mode?: 'full' | 'end-tag-only';
11
9
  }
12
10
  /**
13
- * 思考过程结果
11
+ * 深度思考提取结果
14
12
  */
15
13
  export interface ThinkingResult {
16
14
  /** 提取的思考内容 */
17
15
  thinking: string;
18
- /** 移除思考后的剩余内容 */
19
- rest: string;
20
- /** 是否找到思考内容 */
21
- hasThinking: boolean;
16
+ /** 实际回答内容 */
17
+ content: string;
22
18
  }
23
19
  /**
24
- * 从 AI 响应中提取思考过程(完整模式)
20
+ * 从大模型响应中提取深度思考
21
+ *
22
+ * @example
23
+ * ```ts
24
+ * // 默认模式:完整标签
25
+ * const text1 = '这是回答内容'
26
+ * const result1 = extractThinking(text1)
27
+ * // { thinking: '这是思考内容', content: '这是回答内容' }
28
+ *
29
+ * // end-tag-only 模式:只有结束标签
30
+ * const text2 = '这是前面的思考这是后面的正文'
31
+ * const result2 = extractThinking(text2, { mode: 'end-tag-only' })
32
+ * // { thinking: '这是前面的思考', content: '这是后面的正文' }
33
+ *
34
+ * // 没有标签时
35
+ * const text3 = '全部是正文内容'
36
+ * const result3 = extractThinking(text3)
37
+ * // { thinking: '', content: '全部是正文内容' }
38
+ * ```
25
39
  */
26
40
  export declare function extractThinking(text: string, config?: ThinkingExtractConfig): ThinkingResult;
27
- /**
28
- * 流式提取思考过程(用于 SSE 流式响应)
29
- */
30
- export declare class ThinkingStreamExtractor {
31
- private config;
32
- private state;
33
- private isComplete;
34
- constructor(config?: ThinkingExtractConfig);
35
- /**
36
- * 追加文本并提取思考内容
37
- */
38
- append(text: string): {
39
- thinking: string;
40
- rest: string;
41
- isComplete: boolean;
42
- };
43
- /**
44
- * 获取当前提取的思考内容
45
- */
46
- getThinking(): string;
47
- /**
48
- * 获取剩余内容
49
- */
50
- getRest(): string;
51
- /**
52
- * 是否已完成提取
53
- */
54
- complete(): boolean;
55
- /**
56
- * 重置提取器
57
- */
58
- reset(): void;
59
- }
60
- /**
61
- * 创建流式提取器实例
62
- */
63
- export declare function createThinkingExtractor(config?: ThinkingExtractConfig): ThinkingStreamExtractor;
64
41
  //# sourceMappingURL=thinking.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"thinking.d.ts","sourceRoot":"","sources":["../../src/thinking.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,0BAA0B;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,yBAAyB;IACzB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,qBAAqB;IACrB,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,cAAc;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,eAAe;IACf,WAAW,EAAE,OAAO,CAAA;CACrB;AAkBD;;GAEG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,qBAA0B,GACjC,cAAc,CAoChB;AAED;;GAEG;AACH,qBAAa,uBAAuB;IAClC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,UAAU,CAAiB;gBAEvB,MAAM,GAAE,qBAA0B;IAe9C;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,OAAO,CAAA;KAAE;IA6E7E;;OAEG;IACH,WAAW,IAAI,MAAM;IAiBrB;;OAEG;IACH,OAAO,IAAI,MAAM;IAQjB;;OAEG;IACH,QAAQ,IAAI,OAAO;IAInB;;OAEG;IACH,KAAK,IAAI,IAAI;CAUd;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,CAAC,EAAE,qBAAqB,GAC7B,uBAAuB,CAEzB"}
1
+ {"version":3,"file":"thinking.d.ts","sourceRoot":"","sources":["../../src/thinking.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,0BAA0B;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,kDAAkD;IAClD,IAAI,CAAC,EAAE,MAAM,GAAG,cAAc,CAAA;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,cAAc;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa;IACb,OAAO,EAAE,MAAM,CAAA;CAChB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,qBAA0B,GACjC,cAAc,CAwChB"}
package/package.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "@will1123/lx-ui-utils",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
+ "type": "module",
4
5
  "description": "LX UI - 灵曦平台 AI 组件库通用工具函数库",
5
6
  "main": "dist/lib/index.js",
6
7
  "module": "dist/es/index.js",
@@ -16,7 +17,11 @@
16
17
  "dist"
17
18
  ],
18
19
  "scripts": {
19
- "build": "node scripts/build.js"
20
+ "build": "node scripts/build.cjs",
21
+ "test": "vitest",
22
+ "test:run": "vitest run",
23
+ "test:ui": "vitest --ui",
24
+ "test:coverage": "vitest run --coverage"
20
25
  },
21
26
  "keywords": [
22
27
  "lx-ui",
@@ -36,10 +41,22 @@
36
41
  "publishConfig": {
37
42
  "access": "public"
38
43
  },
44
+ "dependencies": {
45
+ "@microsoft/fetch-event-source": "^2.0.1",
46
+ "highlight.js": "^11.11.1",
47
+ "katex": "0.16.12",
48
+ "marked": "^15.0.7",
49
+ "marked-highlight": "^2.2.1"
50
+ },
39
51
  "devDependencies": {
52
+ "@types/katex": "^0.16.7",
53
+ "@vitest/coverage-v8": "^4.0.16",
54
+ "@vitest/ui": "^4.0.16",
55
+ "fs-extra": "^11.3.2",
56
+ "happy-dom": "^20.0.11",
40
57
  "typescript": "^5.3.3",
41
58
  "vite": "^5.0.8",
42
59
  "vite-plugin-dts": "^3.7.0",
43
- "fs-extra": "^11.3.2"
60
+ "vitest": "^4.0.16"
44
61
  }
45
62
  }