@composy/log-viewer-core 0.0.1 → 0.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 (108) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/README.md +175 -37
  3. package/dist/index.js +614 -299
  4. package/dist/index.js.map +1 -1
  5. package/dist/index.min.js +548 -1
  6. package/dist/index.min.js.map +1 -0
  7. package/es/.dts-output-manifest.json +1 -0
  8. package/es/.dts.tsbuildinfo +1 -0
  9. package/es/core/EventEmitter.d.ts +0 -1
  10. package/es/core/EventEmitter.js +13 -9
  11. package/es/core/EventEmitter.js.map +1 -1
  12. package/es/core/LogViewer.d.ts +14 -11
  13. package/es/core/LogViewer.js +243 -64
  14. package/es/core/LogViewer.js.map +1 -1
  15. package/es/filters/FilterEngine.d.ts +0 -1
  16. package/es/filters/FilterEngine.js +31 -26
  17. package/es/filters/FilterEngine.js.map +1 -1
  18. package/es/index.d.ts +7 -7
  19. package/es/index.js +3 -3
  20. package/es/index.js.map +1 -1
  21. package/es/renderers/DiffRenderer.d.ts +0 -1
  22. package/es/renderers/DiffRenderer.js +13 -3
  23. package/es/renderers/DiffRenderer.js.map +1 -1
  24. package/es/renderers/TimelineRenderer.d.ts +7 -3
  25. package/es/renderers/TimelineRenderer.js +56 -22
  26. package/es/renderers/TimelineRenderer.js.map +1 -1
  27. package/es/styles/index.d.ts +1 -5
  28. package/es/styles/index.js +167 -131
  29. package/es/styles/index.js.map +1 -1
  30. package/es/types/index.d.ts +4 -1
  31. package/es/types/index.js +1 -1
  32. package/es/types/index.js.map +1 -1
  33. package/es/utils/index.d.ts +1 -2
  34. package/es/utils/index.js +54 -6
  35. package/es/utils/index.js.map +1 -1
  36. package/esm/core/EventEmitter.js +13 -9
  37. package/esm/core/EventEmitter.js.map +1 -1
  38. package/esm/core/LogViewer.js +243 -64
  39. package/esm/core/LogViewer.js.map +1 -1
  40. package/esm/filters/FilterEngine.js +31 -26
  41. package/esm/filters/FilterEngine.js.map +1 -1
  42. package/esm/index.js +2 -2
  43. package/esm/index.js.map +1 -1
  44. package/esm/renderers/DiffRenderer.js +13 -3
  45. package/esm/renderers/DiffRenderer.js.map +1 -1
  46. package/esm/renderers/TimelineRenderer.js +56 -22
  47. package/esm/renderers/TimelineRenderer.js.map +1 -1
  48. package/esm/styles/index.js +167 -131
  49. package/esm/styles/index.js.map +1 -1
  50. package/esm/types/index.js +1 -1
  51. package/esm/types/index.js.map +1 -1
  52. package/esm/utils/index.js +54 -6
  53. package/esm/utils/index.js.map +1 -1
  54. package/lib/core/EventEmitter.cjs +13 -9
  55. package/lib/core/EventEmitter.cjs.map +1 -1
  56. package/{esm/core/EventEmitter.d.ts → lib/core/EventEmitter.d.cts} +0 -1
  57. package/lib/core/LogViewer.cjs +247 -68
  58. package/lib/core/LogViewer.cjs.map +1 -1
  59. package/{esm/core/LogViewer.d.ts → lib/core/LogViewer.d.cts} +14 -11
  60. package/lib/filters/FilterEngine.cjs +31 -26
  61. package/lib/filters/FilterEngine.cjs.map +1 -1
  62. package/lib/filters/{FilterEngine.d.ts → FilterEngine.d.cts} +0 -1
  63. package/lib/index.cjs +3 -3
  64. package/lib/index.cjs.map +1 -1
  65. package/{esm/index.d.ts → lib/index.d.cts} +7 -7
  66. package/lib/renderers/DiffRenderer.cjs +13 -3
  67. package/lib/renderers/DiffRenderer.cjs.map +1 -1
  68. package/lib/renderers/{DiffRenderer.d.ts → DiffRenderer.d.cts} +0 -1
  69. package/lib/renderers/TimelineRenderer.cjs +55 -21
  70. package/lib/renderers/TimelineRenderer.cjs.map +1 -1
  71. package/lib/renderers/{TimelineRenderer.d.ts → TimelineRenderer.d.cts} +7 -3
  72. package/lib/styles/index.cjs +167 -131
  73. package/lib/styles/index.cjs.map +1 -1
  74. package/{esm/styles/index.d.ts → lib/styles/index.d.cts} +1 -5
  75. package/lib/types/index.cjs +1 -1
  76. package/lib/types/index.cjs.map +1 -1
  77. package/{esm/types/index.d.ts → lib/types/index.d.cts} +4 -1
  78. package/lib/utils/index.cjs +54 -6
  79. package/lib/utils/index.cjs.map +1 -1
  80. package/{esm/utils/index.d.ts → lib/utils/index.d.cts} +1 -2
  81. package/package.json +15 -9
  82. package/es/core/EventEmitter.d.ts.map +0 -1
  83. package/es/core/LogViewer.d.ts.map +0 -1
  84. package/es/filters/FilterEngine.d.ts.map +0 -1
  85. package/es/index.d.ts.map +0 -1
  86. package/es/renderers/DiffRenderer.d.ts.map +0 -1
  87. package/es/renderers/TimelineRenderer.d.ts.map +0 -1
  88. package/es/styles/index.d.ts.map +0 -1
  89. package/es/types/index.d.ts.map +0 -1
  90. package/es/utils/index.d.ts.map +0 -1
  91. package/esm/core/EventEmitter.d.ts.map +0 -1
  92. package/esm/core/LogViewer.d.ts.map +0 -1
  93. package/esm/filters/FilterEngine.d.ts +0 -26
  94. package/esm/filters/FilterEngine.d.ts.map +0 -1
  95. package/esm/index.d.ts.map +0 -1
  96. package/esm/renderers/DiffRenderer.d.ts +0 -18
  97. package/esm/renderers/DiffRenderer.d.ts.map +0 -1
  98. package/esm/renderers/TimelineRenderer.d.ts +0 -22
  99. package/esm/renderers/TimelineRenderer.d.ts.map +0 -1
  100. package/esm/styles/index.d.ts.map +0 -1
  101. package/esm/types/index.d.ts.map +0 -1
  102. package/esm/utils/index.d.ts.map +0 -1
  103. package/lib/core/EventEmitter.d.ts +0 -11
  104. package/lib/core/LogViewer.d.ts +0 -46
  105. package/lib/index.d.ts +0 -26
  106. package/lib/styles/index.d.ts +0 -9
  107. package/lib/types/index.d.ts +0 -113
  108. package/lib/utils/index.d.ts +0 -18
package/CHANGELOG.md ADDED
@@ -0,0 +1,52 @@
1
+ # Changelog
2
+
3
+ ## [0.0.2] - 2026-10-12
4
+
5
+ ### ✨ 新功能
6
+
7
+ - **log-viewer**: 重构项目结构并完善文档与示例 ([7844674](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/78446741f92a4e0fa35e358481246c597c5d3691)) - @swimly
8
+ - **log-viewer**: 添加项目配置文件 ([a952739](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/a9527395a4999212ec4f0444c7f1a54a021da0ca)) - @swimly
9
+ - auto-generated playground + README for log-viewer sub-packages ([a2250ec](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/a2250ecd98551c15e822dde8a61389b02f161725)) - @swimly
10
+ - **log-viewer**: 实现核心库、Vue组件和playground演示 ([ec9764a](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/ec9764a7bc8964b95486f1035ece6783801380a3)) - @swimly
11
+ - init log-viewer project structure ([304c73f](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/304c73f7c9dbd6886abf059806bf619cb724cc84)) - @swimly
12
+
13
+ ### 🐛 Bug 修复
14
+
15
+ - **log-viewer**: 规范 EventEmitter 类型 ([58545d3](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/58545d346c1031471c84cc972b91614cee4c3858)) - @swimly
16
+
17
+ ### 📝 文档更新
18
+
19
+ - **core**: 更新 README 文档,补充使用说明与示例 ([8e1330e](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/8e1330e5c293e76554444351ed1be15d5559b634)) - @swimly
20
+
21
+ ### 📦 构建系统
22
+
23
+ - **packages**: 更新各包依赖与配置项 ([939d05c](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/939d05c5a3a94e576023c360224cdd0600f73d8f)) - @swimly
24
+ - 调整本地ldesign依赖为本地链接,更新核心包构建配置 ([1a9d4a1](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/1a9d4a1d8e05ee6773e6e7876eec50663baeaf45)) - @swimly
25
+ - **tsconfig**: 完善 tsconfig 配置,添加声明文件输出与映射配置 ([d5f862a](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/d5f862a0149af874e78e26116ce0d276c3479a6c)) - @swimly
26
+ - 为 core 和 vue 包添加 ldesign-builder 配置 ([0ded57e](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/0ded57e7bde3fcfe8fa1a2af05beb9a6c1beb7e1)) - @swimly
27
+
28
+ ### 🔧 其他
29
+
30
+ - **log-viewer**: 更新项目配置与依赖管理 ([986acd2](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/986acd26bdecd9096450049f32d067bf4ae8b292)) - @swimly
31
+ - 更新 core 和 vue 包的依赖版本 ([a50b9d7](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/a50b9d79ed2dfb4296ab960bc605394ad233eb2e)) - @swimly
32
+ - update log-viewer (15 files) ([c45bb7d](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/c45bb7d3705ff21255c7900f1547d3e23ff6abd0)) - @swimly
33
+ - normalize versions, clean artifacts, update gitignore ([1fa0666](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/1fa0666c7516c24c943c3bd5e0edd2ce5c664203)) - @swimly
34
+ - update - chore(code-quality): 完成首轮代码优化与æ  ([ac14af0](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/ac14af054dd10254ed40c7cb2efa4bf9c9b23735)) - @swimly
35
+ - **code-quality**: 完成首轮代码优化与标准化工作 ([82f7750](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/82f77508bedc8f99c2c0db16098c3bc81f05f185)) - @swimly
36
+ - 批量更新 - 规范 .gitignore 清理源码 ([cf22736](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/cf22736fbb924cc0a40506e2b06b304d7aa4356d)) - @swimly
37
+ - unified build config and structure ([b193057](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/b1930571dadec0dbe8240dfc0fcd7fbef046b28e)) - @swimly
38
+ - 添加 ESLint 配置和测试脚本到 core 和 vue 包 ([6742aec](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/6742aec2dc2d11b66d9a8ecbd7db4f5ab0616cf4)) - @swimly
39
+ - add build config, tsconfig, README ([1c1c88f](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/1c1c88fc9c35a9f82161b98e6800a8ac98b811e8)) - @swimly
40
+ - clean up project structure - keep only packages/core/src and packages/vue/src ([fed9abd](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/fed9abd6ac1a5b65123f79d9f60cc394beda1822)) - @swimly
41
+ - 标准化构建配置并更新外部依赖声明 ([645e72d](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/645e72dfa27e428da23270dc6dbbcbaaee88e384)) - @swimly
42
+ - batch commit submodule changes ([dae1c30](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/dae1c30d34b23869b357ee1ef6f954d08b7d5781)) - @swimly
43
+ - set versions to 0.0.1 and pin @ldesign deps ([0b6b3a9](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/0b6b3a98fb6096a0ac735216166ea9e63ed081b3)) - @swimly
44
+
45
+ ### 👥 Contributors
46
+
47
+ swimly
48
+
49
+ ### 📊 Statistics
50
+
51
+ - Total Commits: **25**
52
+ - Contributors: **1**
package/README.md CHANGED
@@ -1,37 +1,175 @@
1
- # @composy/log-viewer-core
2
-
3
- 审计日志查看器 - 操作日志可视化与追溯
4
-
5
- ## 功能特性
6
-
7
- - 🚀 高性能核心引擎
8
- - 🎨 TypeScript 类型完整
9
- - 📦 支持 ESM / CJS 双格式输出
10
-
11
- ## 安装
12
-
13
- ```bash
14
- npm install @composy/log-viewer-core
15
- ```
16
-
17
- ## 快速开始
18
-
19
- ```typescript
20
- import { /* 需要的导出 */ } from '@composy/log-viewer-core'
21
-
22
- // 根据实际 API 使用
23
- ```
24
-
25
- ## 目录结构
26
-
27
- ```
28
- packages/core/
29
- ├── src/ # 源码
30
- ├── package.json
31
- ├── tsconfig.json # ESM 构建配置
32
- └── tsconfig.cjs.json # CJS 构建配置
33
- ```
34
-
35
- ## License
36
-
37
- MIT
1
+ # @composy/log-viewer-core
2
+
3
+ 审计日志查看器核心库 — 操作日志的计时线可视化与追溯(渲染库,类实例模式,非 Web Component)。
4
+
5
+ `log-viewer-core` 通过 `LogViewer` 类实例 + `TimelineRenderer` + `DiffRenderer`
6
+ 直接操作宿主 DOM,将审计日志渲染为时间线:支持按操作类型/模块/用户/IP/关键字/时间范围的多条件筛选,时间戳倒序排列与服务端式分页,条目点击展开详情并通过
7
+ `DiffRenderer`
8
+ 呈现字段级变更对比(DiffEntry),内置异常标记(非工作时间/敏感操作/高频操作)与明暗主题切换。它不依赖任何 UI 框架,`packages/vue`
9
+ 另行提供 Vue 3 适配器;样式通过 `injectStyles()` 注入 `<head>`。
10
+
11
+ ## 安装
12
+
13
+ ```bash
14
+ # pnpm
15
+ pnpm add @composy/log-viewer-core
16
+ # npm
17
+ npm install @composy/log-viewer-core
18
+ ```
19
+
20
+ ## 目录结构
21
+
22
+ ```
23
+ packages/core/
24
+ ├── src/
25
+ │ ├── index.ts # 统一导出入口 + createLogViewer 工厂
26
+ │ ├── types/index.ts # 全部类型与常量(ACTION_LABELS/ACTION_COLORS)
27
+ │ ├── core/ # LogViewer.ts / EventEmitter.ts
28
+ │ ├── filters/ # FilterEngine.ts 多条件筛选引擎
29
+ │ ├── renderers/ # TimelineRenderer.ts / DiffRenderer.ts
30
+ │ ├── styles/index.ts # 样式定义 + injectStyles 注入
31
+ │ └── utils/index.ts # formatDate/formatRelativeTime/escapeHtml/debounce/uid/formatValue/deepClone
32
+ ├── .ldesign/
33
+ │ ├── builder.config.ts # @composy/builder(rolldown)构建配置
34
+ │ ├── tsconfig.esm.json # ESM 类型检查配置
35
+ │ └── tsconfig.cjs.json # CJS 类型检查配置
36
+ └── package.json
37
+ ```
38
+
39
+ ## 核心 API 详表
40
+
41
+ 以下导出均严格来自 `src/index.ts`,按分组列出。
42
+
43
+ ### 常量与核心(core/)
44
+
45
+ | 名称 | 类型 | 签名 | 用途 |
46
+ | ----------------- | -------- | ---------------------------------------- | -------------------------------------- |
47
+ | `VERSION` | const | `'0.1.0'` | 包版本常量 |
48
+ | `LogViewer` | class | `implements LogViewerInstance` | 主引擎:数据管理、筛选、分页、渲染编排 |
49
+ | `createLogViewer` | function | `(config: LogViewerConfig) => LogViewer` | 创建查看器实例的工厂函数 |
50
+ | `EventEmitter` | class | `on/emit/removeAllListeners` | 轻量事件总线 |
51
+
52
+ ### 筛选与渲染器
53
+
54
+ | 名称 | 类型 | 签名 | 用途 |
55
+ | ------------------ | ----- | -------------------------------------------------------------------- | --------------------------------------- |
56
+ | `FilterEngine` | class | `filter(data, filter) => LogEntry[]` | 按用户/动作/模块/IP/时间范围/关键字过滤 |
57
+ | `TimelineRenderer` | class | `render(pageData, expanded) => HTMLElement`、`renderPagination(...)` | 渲染时间线条目与分页 |
58
+ | `DiffRenderer` | class | `renderDetail(entry) => HTMLElement` | 渲染条目字段级变更详情 |
59
+
60
+ ### 工具与样式
61
+
62
+ | 名称 | 类型 | 签名 | 用途 |
63
+ | ----------------------------------- | -------- | --------------------------------------- | ----------------------- |
64
+ | `formatDate` / `formatRelativeTime` | function | `(value) => string` | 日期 / 相对时间格式化 |
65
+ | `escapeHtml` | function | `(str) => string` | HTML 转义(防 XSS) |
66
+ | `debounce` | function | `(fn, wait?) => 包装函数` | 防抖 |
67
+ | `uid` | function | `() => string` | 生成唯一 ID |
68
+ | `formatValue` / `deepClone` | function | `(value) => string` / `(obj) => 深拷贝` | 值格式化显示 / 深拷贝 |
69
+ | `injectStyles` | function | `() => void` | 注入全局样式到 `<head>` |
70
+
71
+ ### 类型与常量(types/)
72
+
73
+ | 名称 | 类型 | 说明 |
74
+ | ----------------------------------- | --------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
75
+ | `ActionType` | type | `'create' \| 'update' \| 'delete' \| 'query' \| 'login' \| 'logout' \| 'export' \| 'import' \| 'approve' \| 'reject' \| 'other'` 操作类型 |
76
+ | `ThemeMode` / `AnomalyType` | type | 主题 `'light' \| 'dark'`;异常标记 `'off-hours' \| 'sensitive' \| 'high-frequency' \| 'none'` |
77
+ | `DiffEntry` | interface | 字段变更条目 `{ field; label?; oldValue; newValue }` |
78
+ | `LogEntry` | interface | 日志条目(id、timestamp、user、action、module、detail、changes、anomaly 等) |
79
+ | `FilterConfig` / `PaginationConfig` | interface | 筛选配置、分页配置 |
80
+ | `LogViewerConfig` | interface | 查看器配置(container、data/dataSource、filter、pagination、theme、locale、showFilter/showDiff/showAnomalyBadge 及回调) |
81
+ | `LogViewerInstance` | interface | 实例 API(getData/setData/appendData/setFilter/resetFilter/setTheme/expandEntry/goToPage/on/refresh/destroy) |
82
+ | `LogViewerEvents` | interface | 事件映射(`filter:change`、`entry:click`、`entry:expand` 等) |
83
+ | `ACTION_LABELS` / `ACTION_COLORS` | const | 操作类型中文标签 / 颜色映射 |
84
+
85
+ ## 使用示例
86
+
87
+ ```ts
88
+ import { createLogViewer, type LogEntry } from '@composy/log-viewer-core'
89
+
90
+ const entries: LogEntry[] = [
91
+ {
92
+ id: 'e1',
93
+ timestamp: new Date().toISOString(),
94
+ user: 'admin',
95
+ action: 'update',
96
+ module: '订单',
97
+ ip: '10.0.0.1',
98
+ detail: '修改了订单状态',
99
+ changes: [{ field: 'status', oldValue: '待发货', newValue: '已发货' }],
100
+ },
101
+ ]
102
+
103
+ const viewer = createLogViewer({
104
+ container: '#log-viewer',
105
+ data: entries,
106
+ theme: 'dark',
107
+ pageSize: 10,
108
+ showFilter: true,
109
+ showDiff: true,
110
+ showAnomalyBadge: true,
111
+ onEntryClick: entry => console.log('点击日志', entry.id),
112
+ onFilterChange: filter => console.log('筛选变更', filter),
113
+ })
114
+ viewer.appendData([
115
+ { id: 'e2', timestamp: Date.now(), user: 'alice', action: 'login', module: '认证' },
116
+ ])
117
+ viewer.setFilter({ action: 'login' })
118
+ viewer.expandEntry('e1')
119
+ console.log('当前分页:', viewer.getPagination())
120
+ viewer.on('theme:change', theme => console.log('主题', theme))
121
+ viewer.destroy() // 卸载时销毁
122
+ ```
123
+
124
+ ## 构建脚本 & 验证命令
125
+
126
+ | 命令 | 说明 |
127
+ | ----------------------------------------------------------------- | ---------------------------------------------- |
128
+ | `pnpm --dir packages/core run build` | `@composy/builder`(rolldown)产出多格式产物 |
129
+ | `pnpm --dir packages/core run type-check` / `type-check:cjs` | 分别检查 ESM 与 CJS 配置 |
130
+ | `pnpm --dir packages/core run lint` / `lint:check` / `lint:fix` | ESLint 检查 / 零告警严格 / 自动修复 |
131
+ | `pnpm --dir packages/core run test` / `test:coverage` / `test:ui` | `ltesting` 单测 / 覆盖率 / 仪表盘 |
132
+ | `pnpm --dir packages/core run release` | `ldesign-release publish --package-dir .` 发布 |
133
+
134
+ ## 产物说明
135
+
136
+ `exports` 暴露多入口;根入口按 `types/import/require/default` 映射到 `es`、`lib`:
137
+
138
+ - `es/` — ESM 产物(`index.js` + `index.d.ts`),`import` 与类型入口(`module`/`types` 指向)。
139
+ - `lib/` — CJS 产物(`index.cjs`),`require` 入口(`main` 指向 `lib/index.cjs`)。
140
+ - `esm/` — ESM 与样式源的保留模块目录。
141
+ - `dist/` — UMD 浏览器产物(`index.js`/`index.min.js`),`unpkg`/`jsdelivr`/`browser` 指向。
142
+
143
+ 子路径别名(`./core/*`、`./filters/*`、`./renderers/*`、`./styles`、`./types`、`./utils`)均同时解析到
144
+ `es` 与 `lib`。`sideEffects: false`,可安全 tree-shaking。
145
+
146
+ ## 备注
147
+
148
+ - **依赖**:`dependencies` 为空,无运行时三方依赖;`devDependencies` 含
149
+ `@composy/builder`、`@composy/testing`、`@composy/release`、`@antfu/eslint-config`、`typescript`。发布注册中心
150
+ `http://npm.longrise.cn:6286/`。
151
+ - **渲染库架构**:非 Web Component、无 Shadow DOM;直接操作宿主 DOM,根节点 class 为
152
+ `lv-root`(内部采用 `lv-*` 前缀),样式由 `injectStyles()` 注入 `<head>`。
153
+ - **浏览器依赖**:使用 `document`/`window`,仅限浏览器环境,SSR 需环境判断。
154
+ - **容器解析**:`container` 传字符串选择器找不到元素时抛出 `[LogViewer] Container not found`。
155
+ - **数据来源**:`LogViewerConfig.dataSource` 支持字符串 URL 或
156
+ `() => Promise<LogEntry[]>`,异步拉取需自行在回调中 `setData`。
157
+ - **代码任务边界**:CSS 变量/class 前缀、样式 token 和测试覆盖属于源码任务;本工作区结构任务只维护配置、产物契约和文档。
158
+
159
+ ## License
160
+
161
+ MIT
162
+
163
+ ## Runtime guarantees
164
+
165
+ - `dataSource` accepts a URL or an async loader. Call `loadData()` to load it explicitly; the
166
+ constructor also starts the initial load when a source is configured. URL responses may be an
167
+ array or an object containing `data`, `logs`, `items`, or `entries`.
168
+ - `showFilter`, `showDiff`, and `showAnomalyBadge` control the matching runtime surfaces. Invalid
169
+ page sizes are normalized and page changes are clamped to the available range.
170
+ - `getData()` and `getFilter()` return deep snapshots. Filtering and timestamp sorting operate on
171
+ derived arrays, so caller-owned data is not reordered or mutated.
172
+ - Timeline actions and diff metadata are rendered with DOM text nodes. User-provided values do not
173
+ become HTML or CSS declarations.
174
+ - Injected styles consume `@composy/color` and `@composy/size` CSS variables. The package remains
175
+ framework-neutral and requires a browser `document` at runtime.