@composy/log-viewer-vue 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 (65) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/README.md +39 -25
  3. package/dist/index.css +379 -2
  4. package/dist/index.js +45 -34
  5. package/dist/index.js.map +1 -1
  6. package/dist/index.min.css +1 -3
  7. package/dist/index.min.js +195 -1
  8. package/dist/index.min.js.map +1 -0
  9. package/es/.dts-output-manifest.json +1 -0
  10. package/es/.dts.tsbuildinfo +1 -0
  11. package/es/components/LogViewer.js +1 -1
  12. package/es/components/LogViewer.js.map +1 -1
  13. package/es/components/LogViewer.vue_vue_type_script_setup_true_lang.js +16 -15
  14. package/es/components/LogViewer.vue_vue_type_script_setup_true_lang.js.map +1 -1
  15. package/es/composables/useLogViewer.d.ts +3 -1
  16. package/es/composables/useLogViewer.d.ts.map +1 -1
  17. package/es/composables/useLogViewer.js +17 -7
  18. package/es/composables/useLogViewer.js.map +1 -1
  19. package/es/index.d.ts +0 -1
  20. package/es/index.js +2 -2
  21. package/es/index.js.map +1 -1
  22. package/es/plugin.d.ts +0 -1
  23. package/es/plugin.js +1 -1
  24. package/es/plugin.js.map +1 -1
  25. package/es/style/css.js +1 -1
  26. package/es/style/index.css +380 -0
  27. package/es/style/index.js +1 -1
  28. package/esm/components/LogViewer.js +17 -0
  29. package/esm/components/LogViewer.js.map +1 -0
  30. package/esm/components/LogViewer.vue_vue_type_script_setup_true_lang.js +110 -0
  31. package/esm/components/LogViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  32. package/esm/composables/useLogViewer.d.ts +119 -0
  33. package/esm/composables/useLogViewer.d.ts.map +1 -0
  34. package/esm/composables/useLogViewer.js +123 -0
  35. package/esm/composables/useLogViewer.js.map +1 -0
  36. package/esm/index.d.ts.map +1 -0
  37. package/esm/index.js +19 -0
  38. package/esm/index.js.map +1 -0
  39. package/esm/plugin.d.ts.map +1 -0
  40. package/esm/plugin.js +18 -0
  41. package/esm/plugin.js.map +1 -0
  42. package/esm/style/css.js +1 -0
  43. package/esm/style/index.js +1 -0
  44. package/esm/style/index.less +434 -0
  45. package/lib/components/LogViewer.cjs +1 -1
  46. package/lib/components/LogViewer.cjs.map +1 -1
  47. package/lib/components/LogViewer.vue_vue_type_script_setup_true_lang.cjs +22 -21
  48. package/lib/components/LogViewer.vue_vue_type_script_setup_true_lang.cjs.map +1 -1
  49. package/lib/composables/useLogViewer.cjs +23 -13
  50. package/lib/composables/useLogViewer.cjs.map +1 -1
  51. package/lib/composables/{useLogViewer.d.ts → useLogViewer.d.cts} +3 -1
  52. package/lib/composables/useLogViewer.d.cts.map +1 -0
  53. package/lib/index.cjs +1 -1
  54. package/lib/index.cjs.map +1 -1
  55. package/lib/index.d.cts +14 -0
  56. package/lib/index.d.cts.map +1 -0
  57. package/lib/plugin.cjs +1 -1
  58. package/lib/plugin.cjs.map +1 -1
  59. package/lib/plugin.d.cts +7 -0
  60. package/lib/plugin.d.cts.map +1 -0
  61. package/lib/style/index.css +380 -2
  62. package/package.json +24 -16
  63. package/es/style/index.less +0 -1
  64. /package/{lib → esm}/index.d.ts +0 -0
  65. /package/{lib → esm}/plugin.d.ts +0 -0
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/components/LogViewer.vue","../src/components/LogViewer.vue","../src/composables/useLogViewer.ts","../src/plugin.ts","../src/index.ts"],"sourcesContent":["<!--\n @file 日志查看器组件\n @description LDesign 日志查看器组件,支持日志过滤、差异对比、异常标记等功能\n-->\n<template>\n <div ref=\"containerRef\" class=\"lv-vue-root\"></div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, onMounted, onUnmounted, watch, toRefs } from 'vue'\nimport {\n createLogViewer,\n type LogViewerConfig,\n type LogEntry,\n type FilterConfig,\n type ThemeMode,\n type LogViewer as LogViewerInstance,\n} from '@composy/log-viewer-core'\n\nconst props = withDefaults(defineProps<{\n data?: LogEntry[]\n filter?: FilterConfig\n theme?: ThemeMode\n pageSize?: number\n showFilter?: boolean\n showDiff?: boolean\n showAnomalyBadge?: boolean\n}>(), {\n data: () => [],\n theme: 'light',\n pageSize: 20,\n showFilter: true,\n showDiff: true,\n showAnomalyBadge: true,\n})\n\nconst emit = defineEmits<{\n 'entry-click': [entry: LogEntry]\n 'entry-expand': [entry: LogEntry]\n 'entry-collapse': [entry: LogEntry]\n 'filter-change': [filter: FilterConfig]\n 'theme-change': [theme: ThemeMode]\n 'page-change': [page: number]\n}>()\n\nconst containerRef = ref<HTMLElement | null>(null)\nlet instance: LogViewerInstance | null = null\n\nonMounted(() => {\n if (!containerRef.value) return\n\n instance = createLogViewer({\n container: containerRef.value,\n data: props.data,\n filter: props.filter,\n theme: props.theme,\n pageSize: props.pageSize,\n showFilter: props.showFilter,\n showDiff: props.showDiff,\n showAnomalyBadge: props.showAnomalyBadge,\n })\n\n instance.on('entry:click', (entry: LogEntry) => emit('entry-click', entry))\n instance.on('entry:expand', (entry: LogEntry) => emit('entry-expand', entry))\n instance.on('entry:collapse', (entry: LogEntry) => emit('entry-collapse', entry))\n instance.on('filter:change', (filter: FilterConfig) => emit('filter-change', filter))\n instance.on('theme:change', (theme: ThemeMode) => emit('theme-change', theme))\n instance.on('page:change', (page: number) => emit('page-change', page))\n})\n\nwatch(() => props.data, (newData) => {\n instance?.setData(newData)\n}, { deep: true })\n\nwatch(() => props.filter, (newFilter) => {\n if (newFilter) instance?.setFilter(newFilter)\n}, { deep: true })\n\nwatch(() => props.theme, (newTheme) => {\n instance?.setTheme(newTheme)\n})\n\nonUnmounted(() => {\n instance?.destroy()\n instance = null\n})\n\ndefineExpose({\n getInstance: () => instance,\n})\n</script>\n","<!--\n @file 日志查看器组件\n @description LDesign 日志查看器组件,支持日志过滤、差异对比、异常标记等功能\n-->\n<template>\n <div ref=\"containerRef\" class=\"lv-vue-root\"></div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, onMounted, onUnmounted, watch, toRefs } from 'vue'\nimport {\n createLogViewer,\n type LogViewerConfig,\n type LogEntry,\n type FilterConfig,\n type ThemeMode,\n type LogViewer as LogViewerInstance,\n} from '@composy/log-viewer-core'\n\nconst props = withDefaults(defineProps<{\n data?: LogEntry[]\n filter?: FilterConfig\n theme?: ThemeMode\n pageSize?: number\n showFilter?: boolean\n showDiff?: boolean\n showAnomalyBadge?: boolean\n}>(), {\n data: () => [],\n theme: 'light',\n pageSize: 20,\n showFilter: true,\n showDiff: true,\n showAnomalyBadge: true,\n})\n\nconst emit = defineEmits<{\n 'entry-click': [entry: LogEntry]\n 'entry-expand': [entry: LogEntry]\n 'entry-collapse': [entry: LogEntry]\n 'filter-change': [filter: FilterConfig]\n 'theme-change': [theme: ThemeMode]\n 'page-change': [page: number]\n}>()\n\nconst containerRef = ref<HTMLElement | null>(null)\nlet instance: LogViewerInstance | null = null\n\nonMounted(() => {\n if (!containerRef.value) return\n\n instance = createLogViewer({\n container: containerRef.value,\n data: props.data,\n filter: props.filter,\n theme: props.theme,\n pageSize: props.pageSize,\n showFilter: props.showFilter,\n showDiff: props.showDiff,\n showAnomalyBadge: props.showAnomalyBadge,\n })\n\n instance.on('entry:click', (entry: LogEntry) => emit('entry-click', entry))\n instance.on('entry:expand', (entry: LogEntry) => emit('entry-expand', entry))\n instance.on('entry:collapse', (entry: LogEntry) => emit('entry-collapse', entry))\n instance.on('filter:change', (filter: FilterConfig) => emit('filter-change', filter))\n instance.on('theme:change', (theme: ThemeMode) => emit('theme-change', theme))\n instance.on('page:change', (page: number) => emit('page-change', page))\n})\n\nwatch(() => props.data, (newData) => {\n instance?.setData(newData)\n}, { deep: true })\n\nwatch(() => props.filter, (newFilter) => {\n if (newFilter) instance?.setFilter(newFilter)\n}, { deep: true })\n\nwatch(() => props.theme, (newTheme) => {\n instance?.setTheme(newTheme)\n})\n\nonUnmounted(() => {\n instance?.destroy()\n instance = null\n})\n\ndefineExpose({\n getInstance: () => instance,\n})\n</script>\n","/**\n * useLogViewer - Vue 3 组合式 API\n */\nimport { ref, onUnmounted } from 'vue'\nimport {\n createLogViewer,\n type LogViewer,\n type LogViewerConfig,\n type LogEntry,\n type FilterConfig,\n type ThemeMode,\n type PaginationConfig,\n} from '@composy/log-viewer-core'\n\n/**\n * useLogViewer - use Log Viewer function\n * @returns 返回值说明\n */\nexport function useLogViewer() {\n const instance = ref<LogViewer | null>(null)\n const data = ref<LogEntry[]>([])\n const filter = ref<FilterConfig>({})\n const theme = ref<ThemeMode>('light')\n const pagination = ref<PaginationConfig>({ page: 1, pageSize: 20 })\n\n function create(container: HTMLElement | string, config?: Partial<LogViewerConfig>) {\n if (instance.value) {\n instance.value.destroy()\n }\n\n instance.value = createLogViewer({\n container,\n ...config,\n })\n\n // Sync refs\n instance.value.on('data:change', (entries: LogEntry[]) => {\n data.value = entries\n })\n instance.value.on('filter:change', (f: FilterConfig) => {\n filter.value = f\n })\n instance.value.on('theme:change', (t: ThemeMode) => {\n theme.value = t\n })\n instance.value.on('page:change', () => {\n if (instance.value) {\n pagination.value = instance.value.getPagination()\n }\n })\n\n if (config?.data) data.value = config.data\n if (config?.theme) theme.value = config.theme\n if (config?.filter) filter.value = config.filter\n }\n\n function setData(entries: LogEntry[]) {\n instance.value?.setData(entries)\n data.value = entries\n }\n\n function appendData(entries: LogEntry[]) {\n instance.value?.appendData(entries)\n data.value = instance.value?.getData() || []\n }\n\n function setFilter(f: FilterConfig) {\n instance.value?.setFilter(f)\n filter.value = f\n }\n\n function resetFilter() {\n instance.value?.resetFilter()\n filter.value = {}\n }\n\n function setTheme(t: ThemeMode) {\n instance.value?.setTheme(t)\n theme.value = t\n }\n\n function expandEntry(id: string) {\n instance.value?.expandEntry(id)\n }\n\n function collapseEntry(id: string) {\n instance.value?.collapseEntry(id)\n }\n\n function collapseAll() {\n instance.value?.collapseAll()\n }\n\n function goToPage(page: number) {\n instance.value?.goToPage(page)\n }\n\n function refresh() {\n instance.value?.refresh()\n }\n\n function destroy() {\n instance.value?.destroy()\n instance.value = null\n }\n\n function on(event: string, callback: (...args: unknown[]) => void): () => void {\n return instance.value?.on(event, callback) || (() => {})\n }\n\n onUnmounted(() => {\n destroy()\n })\n\n return {\n instance,\n data,\n filter,\n theme,\n pagination,\n create,\n setData,\n appendData,\n setFilter,\n resetFilter,\n setTheme,\n expandEntry,\n collapseEntry,\n collapseAll,\n goToPage,\n refresh,\n destroy,\n on,\n }\n}\n","/**\n * Vue 插件 - 全局注册 LogViewer 组件\n */\nimport type { App } from 'vue'\nimport LogViewer from './components/LogViewer.vue'\n\nexport const LogViewerPlugin = {\n install(app: App) {\n app.component('LogViewer', LogViewer)\n },\n}\n","/**\n * @composy/log-viewer-vue\n *\n * 审计日志查看器 — Vue 3 适配层\n * 提供 LogViewer 组件、useLogViewer 组合式函数和 Vue 插件\n *\n * @packageDocumentation\n */\n\nexport const VERSION = '0.1.0'\n\n// 组件\nexport { default as LogViewer } from './components/LogViewer.vue'\n\n// 组合式 API\nexport { useLogViewer } from './composables/useLogViewer'\n\n// 插件\nexport { LogViewerPlugin } from './plugin'\n\n// 重新导出核心类型\nexport type {\n ActionType,\n ThemeMode,\n AnomalyType,\n DiffEntry,\n LogEntry,\n FilterConfig,\n PaginationConfig,\n LogViewerConfig,\n LogViewerInstance,\n LogViewerEvents,\n} from '@composy/log-viewer-core'\n\nexport {\n createLogViewer,\n ACTION_LABELS,\n ACTION_COLORS,\n formatDate,\n formatRelativeTime,\n} from '@composy/log-viewer-core'\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/components/LogViewer.vue","../src/components/LogViewer.vue","../src/components/LogViewer.vue","../src/composables/useLogViewer.ts","../src/plugin.ts","../src/index.ts"],"sourcesContent":["<!--\r\n @file 日志查看器组件\r\n @description LDesign 日志查看器组件,支持日志过滤、差异对比、异常标记等功能\r\n-->\r\n<script setup lang=\"ts\">\r\nimport { onMounted, onUnmounted, ref, watch } from 'vue-demi'\r\nimport {\r\n createLogViewer,\r\n type LogViewerConfig,\r\n type LogEntry,\r\n type FilterConfig,\r\n type ThemeMode,\r\n type LogViewer as LogViewerInstance,\r\n} from '@composy/log-viewer-core'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n data?: LogEntry[]\r\n filter?: FilterConfig\r\n theme?: ThemeMode\r\n pageSize?: number\r\n showFilter?: boolean\r\n showDiff?: boolean\r\n showAnomalyBadge?: boolean\r\n }>(),\r\n {\r\n data: () => [],\r\n theme: 'light',\r\n pageSize: 20,\r\n showFilter: true,\r\n showDiff: true,\r\n showAnomalyBadge: true,\r\n }\r\n)\r\n\r\nconst emit = defineEmits<{\r\n entryClick: [entry: LogEntry]\r\n entryExpand: [entry: LogEntry]\r\n entryCollapse: [entry: LogEntry]\r\n filterChange: [filter: FilterConfig]\r\n themeChange: [theme: ThemeMode]\r\n pageChange: [page: number]\r\n}>()\r\n\r\nconst containerRef = ref<HTMLElement | null>(null)\r\nlet instance: LogViewerInstance | null = null\r\n\r\nonMounted(() => {\r\n if (!containerRef.value) return\r\n\r\n instance = createLogViewer({\r\n container: containerRef.value,\r\n data: props.data,\r\n filter: props.filter,\r\n theme: props.theme,\r\n pageSize: props.pageSize,\r\n showFilter: props.showFilter,\r\n showDiff: props.showDiff,\r\n showAnomalyBadge: props.showAnomalyBadge,\r\n })\r\n\r\n instance.on('entry:click', (entry: LogEntry) => emit('entryClick', entry))\r\n instance.on('entry:expand', (entry: LogEntry) => emit('entryExpand', entry))\r\n instance.on('entry:collapse', (entry: LogEntry) =>\r\n emit('entryCollapse', entry)\r\n )\r\n instance.on('filter:change', (filter: FilterConfig) =>\r\n emit('filterChange', filter)\r\n )\r\n instance.on('theme:change', (theme: ThemeMode) => emit('themeChange', theme))\r\n instance.on('page:change', (page: number) => emit('pageChange', page))\r\n})\r\n\r\nwatch(\r\n () => props.data,\r\n newData => {\r\n instance?.setData(newData)\r\n },\r\n { deep: true }\r\n)\r\n\r\nwatch(\r\n () => props.filter,\r\n newFilter => {\r\n instance?.setFilter(newFilter || {})\r\n },\r\n { deep: true }\r\n)\r\n\r\nwatch(\r\n () => props.theme,\r\n newTheme => {\r\n instance?.setTheme(newTheme)\r\n }\r\n)\r\n\r\nonUnmounted(() => {\r\n instance?.destroy()\r\n instance = null\r\n})\r\n\r\ndefineExpose({\r\n getInstance: () => instance,\r\n})\r\n</script>\r\n\r\n<template>\r\n <div ref=\"containerRef\" class=\"lv-vue-root\"></div>\r\n</template>\r\n","<!--\r\n @file 日志查看器组件\r\n @description LDesign 日志查看器组件,支持日志过滤、差异对比、异常标记等功能\r\n-->\r\n<script setup lang=\"ts\">\r\nimport { onMounted, onUnmounted, ref, watch } from 'vue-demi'\r\nimport {\r\n createLogViewer,\r\n type LogViewerConfig,\r\n type LogEntry,\r\n type FilterConfig,\r\n type ThemeMode,\r\n type LogViewer as LogViewerInstance,\r\n} from '@composy/log-viewer-core'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n data?: LogEntry[]\r\n filter?: FilterConfig\r\n theme?: ThemeMode\r\n pageSize?: number\r\n showFilter?: boolean\r\n showDiff?: boolean\r\n showAnomalyBadge?: boolean\r\n }>(),\r\n {\r\n data: () => [],\r\n theme: 'light',\r\n pageSize: 20,\r\n showFilter: true,\r\n showDiff: true,\r\n showAnomalyBadge: true,\r\n }\r\n)\r\n\r\nconst emit = defineEmits<{\r\n entryClick: [entry: LogEntry]\r\n entryExpand: [entry: LogEntry]\r\n entryCollapse: [entry: LogEntry]\r\n filterChange: [filter: FilterConfig]\r\n themeChange: [theme: ThemeMode]\r\n pageChange: [page: number]\r\n}>()\r\n\r\nconst containerRef = ref<HTMLElement | null>(null)\r\nlet instance: LogViewerInstance | null = null\r\n\r\nonMounted(() => {\r\n if (!containerRef.value) return\r\n\r\n instance = createLogViewer({\r\n container: containerRef.value,\r\n data: props.data,\r\n filter: props.filter,\r\n theme: props.theme,\r\n pageSize: props.pageSize,\r\n showFilter: props.showFilter,\r\n showDiff: props.showDiff,\r\n showAnomalyBadge: props.showAnomalyBadge,\r\n })\r\n\r\n instance.on('entry:click', (entry: LogEntry) => emit('entryClick', entry))\r\n instance.on('entry:expand', (entry: LogEntry) => emit('entryExpand', entry))\r\n instance.on('entry:collapse', (entry: LogEntry) =>\r\n emit('entryCollapse', entry)\r\n )\r\n instance.on('filter:change', (filter: FilterConfig) =>\r\n emit('filterChange', filter)\r\n )\r\n instance.on('theme:change', (theme: ThemeMode) => emit('themeChange', theme))\r\n instance.on('page:change', (page: number) => emit('pageChange', page))\r\n})\r\n\r\nwatch(\r\n () => props.data,\r\n newData => {\r\n instance?.setData(newData)\r\n },\r\n { deep: true }\r\n)\r\n\r\nwatch(\r\n () => props.filter,\r\n newFilter => {\r\n instance?.setFilter(newFilter || {})\r\n },\r\n { deep: true }\r\n)\r\n\r\nwatch(\r\n () => props.theme,\r\n newTheme => {\r\n instance?.setTheme(newTheme)\r\n }\r\n)\r\n\r\nonUnmounted(() => {\r\n instance?.destroy()\r\n instance = null\r\n})\r\n\r\ndefineExpose({\r\n getInstance: () => instance,\r\n})\r\n</script>\r\n\r\n<template>\r\n <div ref=\"containerRef\" class=\"lv-vue-root\"></div>\r\n</template>\r\n","<!--\r\n @file 日志查看器组件\r\n @description LDesign 日志查看器组件,支持日志过滤、差异对比、异常标记等功能\r\n-->\r\n<script setup lang=\"ts\">\r\nimport { onMounted, onUnmounted, ref, watch } from 'vue-demi'\r\nimport {\r\n createLogViewer,\r\n type LogViewerConfig,\r\n type LogEntry,\r\n type FilterConfig,\r\n type ThemeMode,\r\n type LogViewer as LogViewerInstance,\r\n} from '@composy/log-viewer-core'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n data?: LogEntry[]\r\n filter?: FilterConfig\r\n theme?: ThemeMode\r\n pageSize?: number\r\n showFilter?: boolean\r\n showDiff?: boolean\r\n showAnomalyBadge?: boolean\r\n }>(),\r\n {\r\n data: () => [],\r\n theme: 'light',\r\n pageSize: 20,\r\n showFilter: true,\r\n showDiff: true,\r\n showAnomalyBadge: true,\r\n }\r\n)\r\n\r\nconst emit = defineEmits<{\r\n entryClick: [entry: LogEntry]\r\n entryExpand: [entry: LogEntry]\r\n entryCollapse: [entry: LogEntry]\r\n filterChange: [filter: FilterConfig]\r\n themeChange: [theme: ThemeMode]\r\n pageChange: [page: number]\r\n}>()\r\n\r\nconst containerRef = ref<HTMLElement | null>(null)\r\nlet instance: LogViewerInstance | null = null\r\n\r\nonMounted(() => {\r\n if (!containerRef.value) return\r\n\r\n instance = createLogViewer({\r\n container: containerRef.value,\r\n data: props.data,\r\n filter: props.filter,\r\n theme: props.theme,\r\n pageSize: props.pageSize,\r\n showFilter: props.showFilter,\r\n showDiff: props.showDiff,\r\n showAnomalyBadge: props.showAnomalyBadge,\r\n })\r\n\r\n instance.on('entry:click', (entry: LogEntry) => emit('entryClick', entry))\r\n instance.on('entry:expand', (entry: LogEntry) => emit('entryExpand', entry))\r\n instance.on('entry:collapse', (entry: LogEntry) =>\r\n emit('entryCollapse', entry)\r\n )\r\n instance.on('filter:change', (filter: FilterConfig) =>\r\n emit('filterChange', filter)\r\n )\r\n instance.on('theme:change', (theme: ThemeMode) => emit('themeChange', theme))\r\n instance.on('page:change', (page: number) => emit('pageChange', page))\r\n})\r\n\r\nwatch(\r\n () => props.data,\r\n newData => {\r\n instance?.setData(newData)\r\n },\r\n { deep: true }\r\n)\r\n\r\nwatch(\r\n () => props.filter,\r\n newFilter => {\r\n instance?.setFilter(newFilter || {})\r\n },\r\n { deep: true }\r\n)\r\n\r\nwatch(\r\n () => props.theme,\r\n newTheme => {\r\n instance?.setTheme(newTheme)\r\n }\r\n)\r\n\r\nonUnmounted(() => {\r\n instance?.destroy()\r\n instance = null\r\n})\r\n\r\ndefineExpose({\r\n getInstance: () => instance,\r\n})\r\n</script>\r\n\r\n<template>\r\n <div ref=\"containerRef\" class=\"lv-vue-root\"></div>\r\n</template>\r\n","/**\r\n * useLogViewer - Vue 3 组合式 API\r\n */\r\nimport { onUnmounted, ref } from 'vue-demi'\r\nimport {\r\n createLogViewer,\r\n type LogViewer,\r\n type LogViewerConfig,\r\n type LogEntry,\r\n type FilterConfig,\r\n type ThemeMode,\r\n type PaginationConfig,\r\n} from '@composy/log-viewer-core'\r\n\r\n/**\r\n * useLogViewer - use Log Viewer function\r\n * @returns 返回值说明\r\n */\r\nexport function useLogViewer() {\r\n const instance = ref<LogViewer | null>(null)\r\n const data = ref<LogEntry[]>([])\r\n const filter = ref<FilterConfig>({})\r\n const theme = ref<ThemeMode>('light')\r\n const pagination = ref<PaginationConfig>({ page: 1, pageSize: 20 })\r\n\r\n function create(\r\n container: HTMLElement | string,\r\n config?: Partial<LogViewerConfig>\r\n ) {\r\n if (instance.value) {\r\n instance.value.destroy()\r\n }\r\n\r\n instance.value = createLogViewer({\r\n ...config,\r\n container,\r\n })\r\n\r\n // Sync refs\r\n instance.value.on('data:change', (entries: LogEntry[]) => {\r\n data.value = entries\r\n })\r\n instance.value.on('filter:change', (f: FilterConfig) => {\r\n filter.value = f\r\n })\r\n instance.value.on('theme:change', (t: ThemeMode) => {\r\n theme.value = t\r\n })\r\n instance.value.on('page:change', () => {\r\n if (instance.value) {\r\n pagination.value = instance.value.getPagination()\r\n }\r\n })\r\n\r\n data.value = instance.value.getData()\r\n filter.value = instance.value.getFilter()\r\n theme.value = instance.value.getTheme()\r\n pagination.value = instance.value.getPagination()\r\n }\r\n\r\n function setData(entries: LogEntry[]) {\r\n instance.value?.setData(entries)\r\n data.value = entries\r\n }\r\n\r\n function appendData(entries: LogEntry[]) {\r\n instance.value?.appendData(entries)\r\n data.value = instance.value?.getData() || []\r\n }\r\n\r\n function setFilter(f: FilterConfig) {\r\n instance.value?.setFilter(f)\r\n filter.value = f\r\n }\r\n\r\n function resetFilter() {\r\n instance.value?.resetFilter()\r\n filter.value = {}\r\n }\r\n\r\n function setTheme(t: ThemeMode) {\r\n instance.value?.setTheme(t)\r\n theme.value = t\r\n }\r\n\r\n function expandEntry(id: string) {\r\n instance.value?.expandEntry(id)\r\n }\r\n\r\n function collapseEntry(id: string) {\r\n instance.value?.collapseEntry(id)\r\n }\r\n\r\n function collapseAll() {\r\n instance.value?.collapseAll()\r\n }\r\n\r\n function goToPage(page: number) {\r\n instance.value?.goToPage(page)\r\n }\r\n\r\n function refresh() {\r\n instance.value?.refresh()\r\n }\r\n\r\n async function loadData() {\r\n const loader = (\r\n instance.value as unknown as { loadData?: () => Promise<void> }\r\n )?.loadData\r\n if (loader) await loader.call(instance.value)\r\n if (instance.value) {\r\n data.value = instance.value.getData()\r\n pagination.value = instance.value.getPagination()\r\n }\r\n }\r\n\r\n function destroy() {\r\n instance.value?.destroy()\r\n instance.value = null\r\n }\r\n\r\n function on(\r\n event: string,\r\n callback: (...args: unknown[]) => void\r\n ): () => void {\r\n return instance.value?.on(event, callback) || (() => {})\r\n }\r\n\r\n onUnmounted(() => {\r\n destroy()\r\n })\r\n\r\n return {\r\n instance,\r\n data,\r\n filter,\r\n theme,\r\n pagination,\r\n create,\r\n setData,\r\n appendData,\r\n setFilter,\r\n resetFilter,\r\n setTheme,\r\n expandEntry,\r\n collapseEntry,\r\n collapseAll,\r\n goToPage,\r\n refresh,\r\n loadData,\r\n destroy,\r\n on,\r\n }\r\n}\r\n","/**\r\n * Vue 插件 - 全局注册 LogViewer 组件\r\n */\r\nimport type { App } from 'vue'\r\nimport LogViewer from './components/LogViewer.vue'\r\n\r\nexport const LogViewerPlugin = {\r\n install(app: App) {\r\n app.component('LogViewer', LogViewer)\r\n },\r\n}\r\n","/**\r\n * @composy/log-viewer-vue\r\n *\r\n * 审计日志查看器 — Vue 3 适配层\r\n * 提供 LogViewer 组件、useLogViewer 组合式函数和 Vue 插件\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\nexport const VERSION = '0.1.0'\r\n\r\n// 组件\r\nexport { default as LogViewer } from './components/LogViewer.vue'\r\n\r\n// 组合式 API\r\nexport { useLogViewer } from './composables/useLogViewer'\r\n\r\n// 插件\r\nexport { LogViewerPlugin } from './plugin'\r\n\r\n// 重新导出核心类型\r\nexport type {\r\n ActionType,\r\n ThemeMode,\r\n AnomalyType,\r\n DiffEntry,\r\n LogEntry,\r\n FilterConfig,\r\n PaginationConfig,\r\n LogViewerConfig,\r\n LogViewerInstance,\r\n LogViewerEvents,\r\n} from '@composy/log-viewer-core'\r\n\r\nexport {\r\n createLogViewer,\r\n ACTION_LABELS,\r\n ACTION_COLORS,\r\n formatDate,\r\n formatRelativeTime,\r\n} from '@composy/log-viewer-core'\r\n"],"mappings":"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"}
@@ -1,3 +1 @@
1
- /* style/index.less */
2
-
3
- /*# sourceMappingURL=src/style/index.less.map */
1
+ .lv-root{--lv-bg:var(--ld-white);--lv-bg-secondary:var(--ld-bg-surface-soft);--lv-bg-hover:var(--ld-primary-50);--lv-border:var(--ld-border);--lv-text:var(--ld-text-primary);--lv-text-secondary:var(--ld-text-secondary);--lv-text-muted:var(--ld-text-muted);--lv-primary:var(--ld-primary-500);--lv-primary-light:var(--ld-primary-50);--lv-shadow:color-mix(in srgb, var(--ld-text-primary) 4%, transparent);--lv-timeline-line:var(--ld-border);--lv-timeline-dot:var(--ld-primary-500);--lv-diff-add-bg:var(--ld-success-50);--lv-diff-add-text:var(--ld-success-700);--lv-diff-del-bg:var(--ld-danger-50);--lv-diff-del-text:var(--ld-danger-700);--lv-anomaly-bg:var(--ld-warning-50);--lv-anomaly-border:var(--ld-warning-300);--lv-radius:var(--ld-radius-md);--lv-font:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;--lv-font-mono:"Fira Code","SF Mono",Consolas,monospace;font-family:var(--lv-font);font-size:var(--ld-px-14);color:var(--lv-text);background:var(--lv-bg);line-height:1.6}.lv-root[data-theme=dark]{--lv-bg:var(--ld-bg-surface);--lv-bg-secondary:var(--ld-bg-surface-soft);--lv-bg-hover:var(--ld-primary-50);--lv-border:var(--ld-border-strong);--lv-text:var(--ld-text-primary);--lv-text-secondary:var(--ld-text-secondary);--lv-text-muted:var(--ld-text-muted);--lv-primary:var(--ld-primary-400);--lv-primary-light:var(--ld-primary-50);--lv-shadow:color-mix(in srgb, var(--ld-text-primary) 20%, transparent);--lv-timeline-line:var(--ld-border-strong);--lv-timeline-dot:var(--ld-primary-400);--lv-diff-add-bg:var(--ld-success-50);--lv-diff-add-text:var(--ld-success-700);--lv-diff-del-bg:var(--ld-danger-50);--lv-diff-del-text:var(--ld-danger-700);--lv-anomaly-bg:var(--ld-warning-50);--lv-anomaly-border:var(--ld-warning-700)}.lv-filter{display:flex;flex-wrap:wrap;gap:var(--ld-px-10);padding:var(--ld-px-16);background:var(--lv-bg);border:var(--ld-px-1) solid var(--lv-border);border-radius:var(--lv-radius);margin-bottom:var(--ld-px-16);align-items:center}.lv-filter-item{display:flex;align-items:center;gap:var(--ld-px-6);font-size:var(--ld-px-13)}.lv-filter-label{color:var(--lv-text-secondary);font-size:var(--ld-px-12);white-space:nowrap}.lv-filter-input{padding:var(--ld-px-5) var(--ld-px-10);border:var(--ld-px-1) solid var(--lv-border);border-radius:var(--ld-px-6);font-size:var(--ld-px-13);background:var(--lv-bg);color:var(--lv-text);outline:0;transition:border-color .2s;min-width:var(--ld-px-120)}.lv-filter-input:focus{border-color:var(--lv-primary)}.lv-filter-select{padding:var(--ld-px-5) var(--ld-px-10);border:var(--ld-px-1) solid var(--lv-border);border-radius:var(--ld-px-6);font-size:var(--ld-px-13);background:var(--lv-bg);color:var(--lv-text);outline:0;cursor:pointer}.lv-filter-btn{display:inline-flex;align-items:center;gap:var(--ld-px-4);padding:var(--ld-px-5) var(--ld-px-14);font-size:var(--ld-px-13);border:var(--ld-px-1) solid var(--lv-border);border-radius:var(--ld-px-6);background:var(--lv-bg);color:var(--lv-text);cursor:pointer;transition:.15s}.lv-filter-btn:hover{border-color:var(--lv-primary);color:var(--lv-primary)}.lv-filter-btn--primary{background:var(--lv-primary);border-color:var(--lv-primary);color:var(--ld-white)}.lv-filter-btn--primary:hover{opacity:.85}.lv-timeline{position:relative;padding-left:var(--ld-px-28)}.lv-timeline::before{content:"";position:absolute;left:var(--ld-px-9);top:0;bottom:0;width:var(--ld-px-2);background:var(--lv-timeline-line)}.lv-timeline-item{position:relative;padding:0 0 var(--ld-px-20) 0}.lv-timeline-dot{position:absolute;left:calc(-1 * var(--ld-px-25));top:var(--ld-px-6);width:var(--ld-px-12);height:var(--ld-px-12);border-radius:50%;background:var(--lv-bg);border:var(--ld-px-2) solid var(--lv-timeline-dot);z-index:1}.lv-timeline-dot--anomaly{border-color:var(--ld-danger-500);background:var(--ld-danger-50)}.lv-timeline-card{background:var(--lv-bg);border:var(--ld-px-1) solid var(--lv-border);border-radius:var(--lv-radius);padding:var(--ld-px-14) var(--ld-px-18);cursor:pointer;transition:.2s;box-shadow:0 var(--ld-px-1) var(--ld-px-3) var(--lv-shadow)}.lv-timeline-card:hover{border-color:var(--lv-primary);box-shadow:0 var(--ld-px-2) var(--ld-px-8) var(--lv-shadow)}.lv-timeline-card--anomaly{border-left:var(--ld-px-3) solid var(--lv-anomaly-border);background:var(--lv-anomaly-bg)}.lv-timeline-header{display:flex;align-items:center;gap:var(--ld-px-10);flex-wrap:wrap;margin-bottom:var(--ld-px-4)}.lv-timeline-time{font-size:var(--ld-px-12);color:var(--lv-text-muted);font-family:var(--lv-font-mono)}.lv-timeline-user{font-weight:600;font-size:var(--ld-px-14)}.lv-action-tag{display:inline-block;padding:var(--ld-px-1) var(--ld-px-8);font-size:var(--ld-px-12);border-radius:var(--ld-px-4);font-weight:500;color:var(--ld-white)}.lv-action-tag--approve,.lv-action-tag--create{background:var(--ld-success-500)}.lv-action-tag--login,.lv-action-tag--update{background:var(--ld-primary-500)}.lv-action-tag--delete,.lv-action-tag--reject{background:var(--ld-danger-500)}.lv-action-tag--other,.lv-action-tag--query{background:var(--ld-text-secondary)}.lv-action-tag--logout{background:var(--ld-primary-700)}.lv-action-tag--export{background:var(--ld-warning-500)}.lv-action-tag--import{background:var(--ld-success-500)}.lv-timeline-module{font-size:var(--ld-px-12);color:var(--lv-text-secondary);background:var(--lv-bg-secondary);padding:var(--ld-px-1) var(--ld-px-8);border-radius:var(--ld-px-4)}.lv-timeline-ip{font-size:var(--ld-px-12);color:var(--lv-text-muted);font-family:var(--lv-font-mono)}.lv-anomaly-badge{font-size:var(--ld-px-11);padding:var(--ld-px-1) var(--ld-px-6);border-radius:var(--ld-px-3);background:var(--ld-warning-50);color:var(--ld-warning-700);border:var(--ld-px-1) solid var(--ld-warning-300)}.lv-timeline-detail{font-size:var(--ld-px-13);color:var(--lv-text-secondary);margin-top:var(--ld-px-6)}.lv-timeline-expand-hint{border:0;padding:0;background:0 0;font:inherit;font-size:var(--ld-px-12);color:var(--lv-primary);margin-top:var(--ld-px-6);cursor:pointer}.lv-detail{margin-top:var(--ld-px-12);padding-top:var(--ld-px-12);border-top:var(--ld-px-1) dashed var(--lv-border);animation:.2s lv-slide-down}@keyframes lv-slide-down{from{opacity:0;transform:translateY(calc(-1 * var(--ld-px-8)))}to{opacity:1;transform:translateY(0)}}.lv-diff-table{width:100%;border-collapse:collapse;font-size:var(--ld-px-13);border:var(--ld-px-1) solid var(--lv-border);border-radius:var(--ld-px-6);overflow:hidden}.lv-diff-table th{background:var(--lv-bg-secondary);padding:var(--ld-px-8) var(--ld-px-12);text-align:left;font-weight:600;font-size:var(--ld-px-12);color:var(--lv-text-secondary);border-bottom:var(--ld-px-1) solid var(--lv-border)}.lv-diff-table td{padding:var(--ld-px-8) var(--ld-px-12);border-bottom:var(--ld-px-1) solid var(--lv-border);vertical-align:top}.lv-diff-table tr:last-child td{border-bottom:none}.lv-diff-old{background:var(--lv-diff-del-bg);color:var(--lv-diff-del-text);text-decoration:line-through;font-family:var(--lv-font-mono);font-size:var(--ld-px-12)}.lv-diff-new{background:var(--lv-diff-add-bg);color:var(--lv-diff-add-text);font-family:var(--lv-font-mono);font-size:var(--ld-px-12)}.lv-metadata{margin-top:var(--ld-px-10);background:var(--lv-bg-secondary);border-radius:var(--ld-px-6);padding:var(--ld-px-10) var(--ld-px-14);font-size:var(--ld-px-12);font-family:var(--lv-font-mono);white-space:pre-wrap;word-break:break-all;color:var(--lv-text-secondary)}.lv-pagination{display:flex;align-items:center;justify-content:center;gap:var(--ld-px-6);padding:var(--ld-px-16) 0}.lv-pagination-btn{display:inline-flex;align-items:center;justify-content:center;width:var(--ld-px-32);height:var(--ld-px-32);border:var(--ld-px-1) solid var(--lv-border);border-radius:var(--ld-px-6);background:var(--lv-bg);color:var(--lv-text);font-size:var(--ld-px-13);cursor:pointer;transition:.15s}.lv-pagination-btn:hover{border-color:var(--lv-primary);color:var(--lv-primary)}.lv-pagination-btn--active{background:var(--lv-primary);border-color:var(--lv-primary);color:var(--ld-white)}.lv-pagination-btn:disabled{opacity:.4;cursor:not-allowed}.lv-pagination-info{font-size:var(--ld-px-13);color:var(--lv-text-secondary);margin:0 var(--ld-px-8)}.lv-empty{text-align:center;padding:var(--ld-px-48) var(--ld-px-16);color:var(--lv-text-muted);font-size:var(--ld-px-14)}.lv-empty-icon{font-size:var(--ld-px-48);margin-bottom:var(--ld-px-12);opacity:.3}
package/dist/index.min.js CHANGED
@@ -1 +1,195 @@
1
- (function(global,factory){typeof exports==="object"&&typeof module!=="undefined"?factory(exports,require("vue"),require("@composy/log-viewer-core")):typeof define==="function"&&define.amd?define(["exports","vue","@composy/log-viewer-core"],factory):(global=typeof globalThis!=="undefined"?globalThis:global||self,factory(global.LDesignPackagesVue3={},global.Vue,global.ComposyLogViewerCore));})(this,function(exports,vue,_composy_log_viewer_core){Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var LogViewer_vue_vue_type_script_setup_true_lang_default=(0,vue.defineComponent)({__name:"LogViewer",props:{data:{type:Array,required:false,default:()=>[]},filter:{type:Object,required:false},theme:{type:String,required:false,default:"light"},pageSize:{type:Number,required:false,default:20},showFilter:{type:Boolean,required:false,default:true},showDiff:{type:Boolean,required:false,default:true},showAnomalyBadge:{type:Boolean,required:false,default:true}},emits:["entry-click","entry-expand","entry-collapse","filter-change","theme-change","page-change"],setup(__props,{expose:__expose,emit:__emit}){const props=__props;const emit=__emit;const containerRef=(0,vue.ref)(null);let instance=null;(0,vue.onMounted)(()=>{if(!containerRef.value)return;instance=(0,_composy_log_viewer_core.createLogViewer)({container:containerRef.value,data:props.data,filter:props.filter,theme:props.theme,pageSize:props.pageSize,showFilter:props.showFilter,showDiff:props.showDiff,showAnomalyBadge:props.showAnomalyBadge});instance.on("entry:click",(entry)=>emit("entry-click",entry));instance.on("entry:expand",(entry)=>emit("entry-expand",entry));instance.on("entry:collapse",(entry)=>emit("entry-collapse",entry));instance.on("filter:change",(filter)=>emit("filter-change",filter));instance.on("theme:change",(theme)=>emit("theme-change",theme));instance.on("page:change",(page)=>emit("page-change",page));});(0,vue.watch)(()=>props.data,(newData)=>{instance?.setData(newData);},{deep:true});(0,vue.watch)(()=>props.filter,(newFilter)=>{if(newFilter)instance?.setFilter(newFilter);},{deep:true});(0,vue.watch)(()=>props.theme,(newTheme)=>{instance?.setTheme(newTheme);});(0,vue.onUnmounted)(()=>{instance?.destroy();instance=null;});__expose({getInstance:()=>instance});return(_ctx,_cache)=>{return(0,vue.openBlock)(),(0,vue.createElementBlock)("div",{ref_key:"containerRef",ref:containerRef,class:"lv-vue-root"},null,512);};}});LogViewer_vue_vue_type_script_setup_true_lang_default.__file="src/components/LogViewer.vue";var LogViewer_default=LogViewer_vue_vue_type_script_setup_true_lang_default;function useLogViewer(){const instance=(0,vue.ref)(null);const data=(0,vue.ref)([]);const filter=(0,vue.ref)({});const theme=(0,vue.ref)("light");const pagination=(0,vue.ref)({page:1,pageSize:20});function create(container,config){if(instance.value)instance.value.destroy();instance.value=(0,_composy_log_viewer_core.createLogViewer)({container,...config});instance.value.on("data:change",(entries)=>{data.value=entries;});instance.value.on("filter:change",(f)=>{filter.value=f;});instance.value.on("theme:change",(t)=>{theme.value=t;});instance.value.on("page:change",()=>{if(instance.value)pagination.value=instance.value.getPagination();});if(config?.data)data.value=config.data;if(config?.theme)theme.value=config.theme;if(config?.filter)filter.value=config.filter;}function setData(entries){instance.value?.setData(entries);data.value=entries;}function appendData(entries){instance.value?.appendData(entries);data.value=instance.value?.getData()||[];}function setFilter(f){instance.value?.setFilter(f);filter.value=f;}function resetFilter(){instance.value?.resetFilter();filter.value={};}function setTheme(t){instance.value?.setTheme(t);theme.value=t;}function expandEntry(id){instance.value?.expandEntry(id);}function collapseEntry(id){instance.value?.collapseEntry(id);}function collapseAll(){instance.value?.collapseAll();}function goToPage(page){instance.value?.goToPage(page);}function refresh(){instance.value?.refresh();}function destroy(){instance.value?.destroy();instance.value=null;}function on(event,callback){return instance.value?.on(event,callback)||(()=>{});}(0,vue.onUnmounted)(()=>{destroy();});return{instance,data,filter,theme,pagination,create,setData,appendData,setFilter,resetFilter,setTheme,expandEntry,collapseEntry,collapseAll,goToPage,refresh,destroy,on};}const LogViewerPlugin={install(app){app.component("LogViewer",LogViewer_default);}};const VERSION="0.1.0";Object.defineProperty(exports,"ACTION_COLORS",{enumerable:true,get:function(){return _composy_log_viewer_core.ACTION_COLORS;}});Object.defineProperty(exports,"ACTION_LABELS",{enumerable:true,get:function(){return _composy_log_viewer_core.ACTION_LABELS;}});exports.LogViewer=LogViewer_default;exports.LogViewerPlugin=LogViewerPlugin;exports.VERSION=VERSION;Object.defineProperty(exports,"createLogViewer",{enumerable:true,get:function(){return _composy_log_viewer_core.createLogViewer;}});Object.defineProperty(exports,"formatDate",{enumerable:true,get:function(){return _composy_log_viewer_core.formatDate;}});Object.defineProperty(exports,"formatRelativeTime",{enumerable:true,get:function(){return _composy_log_viewer_core.formatRelativeTime;}});exports.useLogViewer=useLogViewer;});
1
+ /*!
2
+ * ***********************************
3
+ * @composy/log-viewer-vue v0.0.1 *
4
+ * Built with rollup *
5
+ * Build time: 2024-10-12 17:44:31 *
6
+ * Build mode: production *
7
+ * Minified: No *
8
+ * ***********************************
9
+ */
10
+ (function(e, t) {
11
+ "object" == typeof exports && "undefined" != typeof module ? t(exports, require("vue"), require("vue-demi"), require("@composy/log-viewer-core")) : "function" == typeof define && define.amd ? define([
12
+ "exports",
13
+ "vue",
14
+ "vue-demi",
15
+ "@composy/log-viewer-core"
16
+ ], t) : t((e = "undefined" != typeof globalThis ? globalThis : e || self).LDesignLogViewerVue = {}, e.Vue, e.VueDemi, e.ComposyLogViewerCore);
17
+ })(this, function(exports, e, t, a) {
18
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
19
+ var n = (0, e.defineComponent)({
20
+ __name: "LogViewer",
21
+ props: {
22
+ data: {
23
+ type: Array,
24
+ required: !1,
25
+ default: () => []
26
+ },
27
+ filter: {
28
+ type: Object,
29
+ required: !1
30
+ },
31
+ theme: {
32
+ type: String,
33
+ required: !1,
34
+ default: "light"
35
+ },
36
+ pageSize: {
37
+ type: Number,
38
+ required: !1,
39
+ default: 20
40
+ },
41
+ showFilter: {
42
+ type: Boolean,
43
+ required: !1,
44
+ default: !0
45
+ },
46
+ showDiff: {
47
+ type: Boolean,
48
+ required: !1,
49
+ default: !0
50
+ },
51
+ showAnomalyBadge: {
52
+ type: Boolean,
53
+ required: !1,
54
+ default: !0
55
+ }
56
+ },
57
+ emits: [
58
+ "entryClick",
59
+ "entryExpand",
60
+ "entryCollapse",
61
+ "filterChange",
62
+ "themeChange",
63
+ "pageChange"
64
+ ],
65
+ setup(n, { expose: o, emit: l }) {
66
+ const r = n, u = l, i = (0, t.ref)(null);
67
+ let c = null;
68
+ return (0, t.onMounted)(() => {
69
+ i.value && (c = (0, a.createLogViewer)({
70
+ container: i.value,
71
+ data: r.data,
72
+ filter: r.filter,
73
+ theme: r.theme,
74
+ pageSize: r.pageSize,
75
+ showFilter: r.showFilter,
76
+ showDiff: r.showDiff,
77
+ showAnomalyBadge: r.showAnomalyBadge
78
+ }), c.on("entry:click", (e) => u("entryClick", e)), c.on("entry:expand", (e) => u("entryExpand", e)), c.on("entry:collapse", (e) => u("entryCollapse", e)), c.on("filter:change", (e) => u("filterChange", e)), c.on("theme:change", (e) => u("themeChange", e)), c.on("page:change", (e) => u("pageChange", e)));
79
+ }), (0, t.watch)(() => r.data, (e) => {
80
+ c?.setData(e);
81
+ }, { deep: !0 }), (0, t.watch)(() => r.filter, (e) => {
82
+ c?.setFilter(e || {});
83
+ }, { deep: !0 }), (0, t.watch)(() => r.theme, (e) => {
84
+ c?.setTheme(e);
85
+ }), (0, t.onUnmounted)(() => {
86
+ c?.destroy(), c = null;
87
+ }), o({ getInstance: () => c }), (t, a) => ((0, e.openBlock)(), (0, e.createElementBlock)("div", {
88
+ ref_key: "containerRef",
89
+ ref: i,
90
+ class: "lv-vue-root"
91
+ }, null, 512));
92
+ }
93
+ });
94
+ n.__file = "src/components/LogViewer.vue";
95
+ var o = n;
96
+ Object.defineProperty(exports, "ACTION_COLORS", {
97
+ enumerable: !0,
98
+ get: function() {
99
+ return a.ACTION_COLORS;
100
+ }
101
+ }), Object.defineProperty(exports, "ACTION_LABELS", {
102
+ enumerable: !0,
103
+ get: function() {
104
+ return a.ACTION_LABELS;
105
+ }
106
+ }), exports.LogViewer = o, exports.LogViewerPlugin = { install(e) {
107
+ e.component("LogViewer", o);
108
+ } }, exports.VERSION = "0.1.0", Object.defineProperty(exports, "createLogViewer", {
109
+ enumerable: !0,
110
+ get: function() {
111
+ return a.createLogViewer;
112
+ }
113
+ }), Object.defineProperty(exports, "formatDate", {
114
+ enumerable: !0,
115
+ get: function() {
116
+ return a.formatDate;
117
+ }
118
+ }), Object.defineProperty(exports, "formatRelativeTime", {
119
+ enumerable: !0,
120
+ get: function() {
121
+ return a.formatRelativeTime;
122
+ }
123
+ }), exports.useLogViewer = function() {
124
+ const e = (0, t.ref)(null), n = (0, t.ref)([]), o = (0, t.ref)({}), l = (0, t.ref)("light"), r = (0, t.ref)({
125
+ page: 1,
126
+ pageSize: 20
127
+ });
128
+ function u() {
129
+ e.value?.destroy(), e.value = null;
130
+ }
131
+ return (0, t.onUnmounted)(() => {
132
+ u();
133
+ }), {
134
+ instance: e,
135
+ data: n,
136
+ filter: o,
137
+ theme: l,
138
+ pagination: r,
139
+ create: function(t, u) {
140
+ e.value && e.value.destroy(), e.value = (0, a.createLogViewer)({
141
+ ...u,
142
+ container: t
143
+ }), e.value.on("data:change", (e) => {
144
+ n.value = e;
145
+ }), e.value.on("filter:change", (e) => {
146
+ o.value = e;
147
+ }), e.value.on("theme:change", (e) => {
148
+ l.value = e;
149
+ }), e.value.on("page:change", () => {
150
+ e.value && (r.value = e.value.getPagination());
151
+ }), n.value = e.value.getData(), o.value = e.value.getFilter(), l.value = e.value.getTheme(), r.value = e.value.getPagination();
152
+ },
153
+ setData: function(t) {
154
+ e.value?.setData(t), n.value = t;
155
+ },
156
+ appendData: function(t) {
157
+ e.value?.appendData(t), n.value = e.value?.getData() || [];
158
+ },
159
+ setFilter: function(t) {
160
+ e.value?.setFilter(t), o.value = t;
161
+ },
162
+ resetFilter: function() {
163
+ e.value?.resetFilter(), o.value = {};
164
+ },
165
+ setTheme: function(t) {
166
+ e.value?.setTheme(t), l.value = t;
167
+ },
168
+ expandEntry: function(t) {
169
+ e.value?.expandEntry(t);
170
+ },
171
+ collapseEntry: function(t) {
172
+ e.value?.collapseEntry(t);
173
+ },
174
+ collapseAll: function() {
175
+ e.value?.collapseAll();
176
+ },
177
+ goToPage: function(t) {
178
+ e.value?.goToPage(t);
179
+ },
180
+ refresh: function() {
181
+ e.value?.refresh();
182
+ },
183
+ loadData: async function() {
184
+ const t = e.value?.loadData;
185
+ t && await t.call(e.value), e.value && (n.value = e.value.getData(), r.value = e.value.getPagination());
186
+ },
187
+ destroy: u,
188
+ on: function(t, a) {
189
+ return e.value?.on(t, a) || (() => {});
190
+ }
191
+ };
192
+ };
193
+ });
194
+ /*! End of @composy/log-viewer-vue | Powered by @composy/builder */
195
+ //# sourceMappingURL=index.min.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.min.js","names":[],"sources":["../src/components/LogViewer.vue","../src/components/LogViewer.vue","../src/components/LogViewer.vue","../src/composables/useLogViewer.ts","../src/plugin.ts","../src/index.ts"],"sourcesContent":["<!--\r\n @file 日志查看器组件\r\n @description LDesign 日志查看器组件,支持日志过滤、差异对比、异常标记等功能\r\n-->\r\n<script setup lang=\"ts\">\r\nimport { onMounted, onUnmounted, ref, watch } from 'vue-demi'\r\nimport {\r\n createLogViewer,\r\n type LogViewerConfig,\r\n type LogEntry,\r\n type FilterConfig,\r\n type ThemeMode,\r\n type LogViewer as LogViewerInstance,\r\n} from '@composy/log-viewer-core'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n data?: LogEntry[]\r\n filter?: FilterConfig\r\n theme?: ThemeMode\r\n pageSize?: number\r\n showFilter?: boolean\r\n showDiff?: boolean\r\n showAnomalyBadge?: boolean\r\n }>(),\r\n {\r\n data: () => [],\r\n theme: 'light',\r\n pageSize: 20,\r\n showFilter: true,\r\n showDiff: true,\r\n showAnomalyBadge: true,\r\n }\r\n)\r\n\r\nconst emit = defineEmits<{\r\n entryClick: [entry: LogEntry]\r\n entryExpand: [entry: LogEntry]\r\n entryCollapse: [entry: LogEntry]\r\n filterChange: [filter: FilterConfig]\r\n themeChange: [theme: ThemeMode]\r\n pageChange: [page: number]\r\n}>()\r\n\r\nconst containerRef = ref<HTMLElement | null>(null)\r\nlet instance: LogViewerInstance | null = null\r\n\r\nonMounted(() => {\r\n if (!containerRef.value) return\r\n\r\n instance = createLogViewer({\r\n container: containerRef.value,\r\n data: props.data,\r\n filter: props.filter,\r\n theme: props.theme,\r\n pageSize: props.pageSize,\r\n showFilter: props.showFilter,\r\n showDiff: props.showDiff,\r\n showAnomalyBadge: props.showAnomalyBadge,\r\n })\r\n\r\n instance.on('entry:click', (entry: LogEntry) => emit('entryClick', entry))\r\n instance.on('entry:expand', (entry: LogEntry) => emit('entryExpand', entry))\r\n instance.on('entry:collapse', (entry: LogEntry) =>\r\n emit('entryCollapse', entry)\r\n )\r\n instance.on('filter:change', (filter: FilterConfig) =>\r\n emit('filterChange', filter)\r\n )\r\n instance.on('theme:change', (theme: ThemeMode) => emit('themeChange', theme))\r\n instance.on('page:change', (page: number) => emit('pageChange', page))\r\n})\r\n\r\nwatch(\r\n () => props.data,\r\n newData => {\r\n instance?.setData(newData)\r\n },\r\n { deep: true }\r\n)\r\n\r\nwatch(\r\n () => props.filter,\r\n newFilter => {\r\n instance?.setFilter(newFilter || {})\r\n },\r\n { deep: true }\r\n)\r\n\r\nwatch(\r\n () => props.theme,\r\n newTheme => {\r\n instance?.setTheme(newTheme)\r\n }\r\n)\r\n\r\nonUnmounted(() => {\r\n instance?.destroy()\r\n instance = null\r\n})\r\n\r\ndefineExpose({\r\n getInstance: () => instance,\r\n})\r\n</script>\r\n\r\n<template>\r\n <div ref=\"containerRef\" class=\"lv-vue-root\"></div>\r\n</template>\r\n","<!--\r\n @file 日志查看器组件\r\n @description LDesign 日志查看器组件,支持日志过滤、差异对比、异常标记等功能\r\n-->\r\n<script setup lang=\"ts\">\r\nimport { onMounted, onUnmounted, ref, watch } from 'vue-demi'\r\nimport {\r\n createLogViewer,\r\n type LogViewerConfig,\r\n type LogEntry,\r\n type FilterConfig,\r\n type ThemeMode,\r\n type LogViewer as LogViewerInstance,\r\n} from '@composy/log-viewer-core'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n data?: LogEntry[]\r\n filter?: FilterConfig\r\n theme?: ThemeMode\r\n pageSize?: number\r\n showFilter?: boolean\r\n showDiff?: boolean\r\n showAnomalyBadge?: boolean\r\n }>(),\r\n {\r\n data: () => [],\r\n theme: 'light',\r\n pageSize: 20,\r\n showFilter: true,\r\n showDiff: true,\r\n showAnomalyBadge: true,\r\n }\r\n)\r\n\r\nconst emit = defineEmits<{\r\n entryClick: [entry: LogEntry]\r\n entryExpand: [entry: LogEntry]\r\n entryCollapse: [entry: LogEntry]\r\n filterChange: [filter: FilterConfig]\r\n themeChange: [theme: ThemeMode]\r\n pageChange: [page: number]\r\n}>()\r\n\r\nconst containerRef = ref<HTMLElement | null>(null)\r\nlet instance: LogViewerInstance | null = null\r\n\r\nonMounted(() => {\r\n if (!containerRef.value) return\r\n\r\n instance = createLogViewer({\r\n container: containerRef.value,\r\n data: props.data,\r\n filter: props.filter,\r\n theme: props.theme,\r\n pageSize: props.pageSize,\r\n showFilter: props.showFilter,\r\n showDiff: props.showDiff,\r\n showAnomalyBadge: props.showAnomalyBadge,\r\n })\r\n\r\n instance.on('entry:click', (entry: LogEntry) => emit('entryClick', entry))\r\n instance.on('entry:expand', (entry: LogEntry) => emit('entryExpand', entry))\r\n instance.on('entry:collapse', (entry: LogEntry) =>\r\n emit('entryCollapse', entry)\r\n )\r\n instance.on('filter:change', (filter: FilterConfig) =>\r\n emit('filterChange', filter)\r\n )\r\n instance.on('theme:change', (theme: ThemeMode) => emit('themeChange', theme))\r\n instance.on('page:change', (page: number) => emit('pageChange', page))\r\n})\r\n\r\nwatch(\r\n () => props.data,\r\n newData => {\r\n instance?.setData(newData)\r\n },\r\n { deep: true }\r\n)\r\n\r\nwatch(\r\n () => props.filter,\r\n newFilter => {\r\n instance?.setFilter(newFilter || {})\r\n },\r\n { deep: true }\r\n)\r\n\r\nwatch(\r\n () => props.theme,\r\n newTheme => {\r\n instance?.setTheme(newTheme)\r\n }\r\n)\r\n\r\nonUnmounted(() => {\r\n instance?.destroy()\r\n instance = null\r\n})\r\n\r\ndefineExpose({\r\n getInstance: () => instance,\r\n})\r\n</script>\r\n\r\n<template>\r\n <div ref=\"containerRef\" class=\"lv-vue-root\"></div>\r\n</template>\r\n","<!--\r\n @file 日志查看器组件\r\n @description LDesign 日志查看器组件,支持日志过滤、差异对比、异常标记等功能\r\n-->\r\n<script setup lang=\"ts\">\r\nimport { onMounted, onUnmounted, ref, watch } from 'vue-demi'\r\nimport {\r\n createLogViewer,\r\n type LogViewerConfig,\r\n type LogEntry,\r\n type FilterConfig,\r\n type ThemeMode,\r\n type LogViewer as LogViewerInstance,\r\n} from '@composy/log-viewer-core'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n data?: LogEntry[]\r\n filter?: FilterConfig\r\n theme?: ThemeMode\r\n pageSize?: number\r\n showFilter?: boolean\r\n showDiff?: boolean\r\n showAnomalyBadge?: boolean\r\n }>(),\r\n {\r\n data: () => [],\r\n theme: 'light',\r\n pageSize: 20,\r\n showFilter: true,\r\n showDiff: true,\r\n showAnomalyBadge: true,\r\n }\r\n)\r\n\r\nconst emit = defineEmits<{\r\n entryClick: [entry: LogEntry]\r\n entryExpand: [entry: LogEntry]\r\n entryCollapse: [entry: LogEntry]\r\n filterChange: [filter: FilterConfig]\r\n themeChange: [theme: ThemeMode]\r\n pageChange: [page: number]\r\n}>()\r\n\r\nconst containerRef = ref<HTMLElement | null>(null)\r\nlet instance: LogViewerInstance | null = null\r\n\r\nonMounted(() => {\r\n if (!containerRef.value) return\r\n\r\n instance = createLogViewer({\r\n container: containerRef.value,\r\n data: props.data,\r\n filter: props.filter,\r\n theme: props.theme,\r\n pageSize: props.pageSize,\r\n showFilter: props.showFilter,\r\n showDiff: props.showDiff,\r\n showAnomalyBadge: props.showAnomalyBadge,\r\n })\r\n\r\n instance.on('entry:click', (entry: LogEntry) => emit('entryClick', entry))\r\n instance.on('entry:expand', (entry: LogEntry) => emit('entryExpand', entry))\r\n instance.on('entry:collapse', (entry: LogEntry) =>\r\n emit('entryCollapse', entry)\r\n )\r\n instance.on('filter:change', (filter: FilterConfig) =>\r\n emit('filterChange', filter)\r\n )\r\n instance.on('theme:change', (theme: ThemeMode) => emit('themeChange', theme))\r\n instance.on('page:change', (page: number) => emit('pageChange', page))\r\n})\r\n\r\nwatch(\r\n () => props.data,\r\n newData => {\r\n instance?.setData(newData)\r\n },\r\n { deep: true }\r\n)\r\n\r\nwatch(\r\n () => props.filter,\r\n newFilter => {\r\n instance?.setFilter(newFilter || {})\r\n },\r\n { deep: true }\r\n)\r\n\r\nwatch(\r\n () => props.theme,\r\n newTheme => {\r\n instance?.setTheme(newTheme)\r\n }\r\n)\r\n\r\nonUnmounted(() => {\r\n instance?.destroy()\r\n instance = null\r\n})\r\n\r\ndefineExpose({\r\n getInstance: () => instance,\r\n})\r\n</script>\r\n\r\n<template>\r\n <div ref=\"containerRef\" class=\"lv-vue-root\"></div>\r\n</template>\r\n","/**\r\n * useLogViewer - Vue 3 组合式 API\r\n */\r\nimport { onUnmounted, ref } from 'vue-demi'\r\nimport {\r\n createLogViewer,\r\n type LogViewer,\r\n type LogViewerConfig,\r\n type LogEntry,\r\n type FilterConfig,\r\n type ThemeMode,\r\n type PaginationConfig,\r\n} from '@composy/log-viewer-core'\r\n\r\n/**\r\n * useLogViewer - use Log Viewer function\r\n * @returns 返回值说明\r\n */\r\nexport function useLogViewer() {\r\n const instance = ref<LogViewer | null>(null)\r\n const data = ref<LogEntry[]>([])\r\n const filter = ref<FilterConfig>({})\r\n const theme = ref<ThemeMode>('light')\r\n const pagination = ref<PaginationConfig>({ page: 1, pageSize: 20 })\r\n\r\n function create(\r\n container: HTMLElement | string,\r\n config?: Partial<LogViewerConfig>\r\n ) {\r\n if (instance.value) {\r\n instance.value.destroy()\r\n }\r\n\r\n instance.value = createLogViewer({\r\n ...config,\r\n container,\r\n })\r\n\r\n // Sync refs\r\n instance.value.on('data:change', (entries: LogEntry[]) => {\r\n data.value = entries\r\n })\r\n instance.value.on('filter:change', (f: FilterConfig) => {\r\n filter.value = f\r\n })\r\n instance.value.on('theme:change', (t: ThemeMode) => {\r\n theme.value = t\r\n })\r\n instance.value.on('page:change', () => {\r\n if (instance.value) {\r\n pagination.value = instance.value.getPagination()\r\n }\r\n })\r\n\r\n data.value = instance.value.getData()\r\n filter.value = instance.value.getFilter()\r\n theme.value = instance.value.getTheme()\r\n pagination.value = instance.value.getPagination()\r\n }\r\n\r\n function setData(entries: LogEntry[]) {\r\n instance.value?.setData(entries)\r\n data.value = entries\r\n }\r\n\r\n function appendData(entries: LogEntry[]) {\r\n instance.value?.appendData(entries)\r\n data.value = instance.value?.getData() || []\r\n }\r\n\r\n function setFilter(f: FilterConfig) {\r\n instance.value?.setFilter(f)\r\n filter.value = f\r\n }\r\n\r\n function resetFilter() {\r\n instance.value?.resetFilter()\r\n filter.value = {}\r\n }\r\n\r\n function setTheme(t: ThemeMode) {\r\n instance.value?.setTheme(t)\r\n theme.value = t\r\n }\r\n\r\n function expandEntry(id: string) {\r\n instance.value?.expandEntry(id)\r\n }\r\n\r\n function collapseEntry(id: string) {\r\n instance.value?.collapseEntry(id)\r\n }\r\n\r\n function collapseAll() {\r\n instance.value?.collapseAll()\r\n }\r\n\r\n function goToPage(page: number) {\r\n instance.value?.goToPage(page)\r\n }\r\n\r\n function refresh() {\r\n instance.value?.refresh()\r\n }\r\n\r\n async function loadData() {\r\n const loader = (\r\n instance.value as unknown as { loadData?: () => Promise<void> }\r\n )?.loadData\r\n if (loader) await loader.call(instance.value)\r\n if (instance.value) {\r\n data.value = instance.value.getData()\r\n pagination.value = instance.value.getPagination()\r\n }\r\n }\r\n\r\n function destroy() {\r\n instance.value?.destroy()\r\n instance.value = null\r\n }\r\n\r\n function on(\r\n event: string,\r\n callback: (...args: unknown[]) => void\r\n ): () => void {\r\n return instance.value?.on(event, callback) || (() => {})\r\n }\r\n\r\n onUnmounted(() => {\r\n destroy()\r\n })\r\n\r\n return {\r\n instance,\r\n data,\r\n filter,\r\n theme,\r\n pagination,\r\n create,\r\n setData,\r\n appendData,\r\n setFilter,\r\n resetFilter,\r\n setTheme,\r\n expandEntry,\r\n collapseEntry,\r\n collapseAll,\r\n goToPage,\r\n refresh,\r\n loadData,\r\n destroy,\r\n on,\r\n }\r\n}\r\n","/**\r\n * Vue 插件 - 全局注册 LogViewer 组件\r\n */\r\nimport type { App } from 'vue'\r\nimport LogViewer from './components/LogViewer.vue'\r\n\r\nexport const LogViewerPlugin = {\r\n install(app: App) {\r\n app.component('LogViewer', LogViewer)\r\n },\r\n}\r\n","/**\r\n * @composy/log-viewer-vue\r\n *\r\n * 审计日志查看器 — Vue 3 适配层\r\n * 提供 LogViewer 组件、useLogViewer 组合式函数和 Vue 插件\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\nexport const VERSION = '0.1.0'\r\n\r\n// 组件\r\nexport { default as LogViewer } from './components/LogViewer.vue'\r\n\r\n// 组合式 API\r\nexport { useLogViewer } from './composables/useLogViewer'\r\n\r\n// 插件\r\nexport { LogViewerPlugin } from './plugin'\r\n\r\n// 重新导出核心类型\r\nexport type {\r\n ActionType,\r\n ThemeMode,\r\n AnomalyType,\r\n DiffEntry,\r\n LogEntry,\r\n FilterConfig,\r\n PaginationConfig,\r\n LogViewerConfig,\r\n LogViewerInstance,\r\n LogViewerEvents,\r\n} from '@composy/log-viewer-core'\r\n\r\nexport {\r\n createLogViewer,\r\n ACTION_LABELS,\r\n ACTION_COLORS,\r\n formatDate,\r\n formatRelativeTime,\r\n} from '@composy/log-viewer-core'\r\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":1,"configuration":"7198c7ab0f4dee041deea27eac30aa65e3eef3246f1b66639224051101bfef64","sources":{"D:\\WorkBench\\ldesign\\libraries\\log-viewer\\packages\\vue\\src\\composables\\useLogViewer.ts":["D:\\WorkBench\\ldesign\\libraries\\log-viewer\\packages\\vue\\es\\composables\\useLogViewer.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\log-viewer\\packages\\vue\\src\\plugin.ts":["D:\\WorkBench\\ldesign\\libraries\\log-viewer\\packages\\vue\\es\\plugin.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\log-viewer\\packages\\vue\\src\\index.ts":["D:\\WorkBench\\ldesign\\libraries\\log-viewer\\packages\\vue\\es\\index.d.ts"]}}
@@ -0,0 +1 @@
1
+ {"fileNames":["../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es5.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.iterable.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.asynciterable.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.scripthost.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.full.d.ts","../../../../../node_modules/.pnpm/@vue+shared@3.5.32/node_modules/@vue/shared/dist/shared.d.ts","../../../../../node_modules/.pnpm/@babel+types@8.0.6/node_modules/@babel/types/lib/index.d.ts","../../../../../node_modules/.pnpm/@babel+types@7.29.7/node_modules/@babel/types/lib/index.d.ts","../../../../../node_modules/.pnpm/@babel+parser@7.29.7/node_modules/@babel/parser/typings/babel-parser.d.ts","../../../../../node_modules/.pnpm/@vue+compiler-core@3.5.32/node_modules/@vue/compiler-core/dist/compiler-core.d.ts","../../../../../node_modules/.pnpm/@vue+compiler-dom@3.5.32/node_modules/@vue/compiler-dom/dist/compiler-dom.d.ts","../../../../../node_modules/.pnpm/@vue+reactivity@3.5.32/node_modules/@vue/reactivity/dist/reactivity.d.ts","../../../../../node_modules/.pnpm/@vue+runtime-core@3.5.32/node_modules/@vue/runtime-core/dist/runtime-core.d.ts","../../../../../node_modules/.pnpm/csstype@3.2.3/node_modules/csstype/index.d.ts","../../../../../node_modules/.pnpm/@vue+runtime-dom@3.5.32/node_modules/@vue/runtime-dom/dist/runtime-dom.d.ts","../../../../../node_modules/.pnpm/vue@3.5.32_typescript@5.9.3/node_modules/vue/dist/vue.d.mts","../../../../../node_modules/.pnpm/vue-demi@0.14.10_vue@3.5.32_typescript@5.9.3_/node_modules/vue-demi/lib/index.d.ts","../../core/es/types/index.d.ts","../../core/es/core/logviewer.d.ts","../../core/es/core/eventemitter.d.ts","../../core/es/filters/filterengine.d.ts","../../core/es/renderers/timelinerenderer.d.ts","../../core/es/renderers/diffrenderer.d.ts","../../core/es/utils/index.d.ts","../../core/es/styles/index.d.ts","../../core/es/index.d.ts","../src/composables/uselogviewer.ts","../src/plugin.ts","../src/index.ts"],"fileIdsList":[[64],[64,65,66,67,68,69,70,71],[63,72],[72,73,74],[62],[54],[52,53,55],[56],[52],[52,58,59,61],[58,59,60,61],[57,61]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7a3c8b952931daebdfc7a2897c53c0a1c73624593fa070e46bd537e64dcd20a","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"1305d1e76ca44e30fb8b2b8075fa522b83f60c0bcf5d4326a9d2cf79b53724f8","impliedFormat":1},{"version":"f468b74459f1ad4473b36a36d49f2b255f3c6b5d536c81239c2b2971df089eaf","impliedFormat":1},{"version":"e66dd20f48d96e48ee9a807ba2697396978cdf09cca2a4cbf08fbc2d843e27e8","impliedFormat":99},{"version":"556ccd493ec36c7d7cb130d51be66e147b91cc1415be383d71da0f1e49f742a9","impliedFormat":1},{"version":"95aba78013d782537cc5e23868e736bec5d377b918990e28ed56110e3ae8b958","impliedFormat":1},{"version":"524a409ad72186b7f6cb16898c349465cfa876f641d6cb6137b3123d5cfca619","impliedFormat":1},{"version":"ebe84ad8344962b7117a3b95065f47383215020eaf1b626463863b45b4d16e62","impliedFormat":1},{"version":"dc0c80f91a4d46c5c4f625a35601ff3c815e2395e6680bacfa12970fc6d49c93","impliedFormat":1},{"version":"3e74c6f34a28b7c948bfdaf19172000d589093660b3605f8c21c1b30173c729b","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"88ad1af02cacc61bf79683b021d326eeafc91231660a06495c5046d4649ec3a2","impliedFormat":1},{"version":"c0191592be8eb7906f99ac4b8798d80a585b94001ea1a5f50d6ce5b0d13a5c62","impliedFormat":99},{"version":"52f5c39e78a90c1d8ed7db18f39d890b2e8464a3f44d4233617893f6648e317d","impliedFormat":1},"465fec685e813623beccaca6559552ad158d8520eb14ed3b41ab6962e6f49269","8245e252f579bb959a411bd99d709dbbcd5bcdff800f24969a8e0410a2d3fa49","20825ce5ce9ce1f472e142dab927ef00534686769cf02ec1cd972073a8c605f7","499f7c2b37df052ed613e236dc19c25859260394c918edcd3233c264eb4e4dcc","c1338c0a1884a2bdf5cf38aee21aee9f6a4463eaf32e1e3d91237158dfd7ecc7","0239dad76d464e94ba94dc6c1fe8d4ce86c6a20a7764fa17dc444bc930fb473a","2420edf558119a55288f150c77340e94dadcbbf3d776f49847b7391a6c732a60","bb88cad0b8300261e75d2c1583b6ba0fbf4cbcc143c9feaa461b685f8817ea7c","432ad2a0e5cdfa8493d261b04ad35b43f8243e72d16c7448b7b2dae624132be2",{"version":"3c76a7ed3f8dceaf9e7fafa17870e55ba37940f40ecb6a686020732089da37c9","signature":"3d892e02015788a9d914e9b4068ee5366e850c20d804feae5d1aad0a07eb16f8"},{"version":"ac7817281410ae9f33fa0d42e41da698146516fa827dbe841187f9aba9a5da04","signature":"5d7b4372512fb36754787ba31e16681a22ae8c7414ce54089d04bee7c4229425"},{"version":"1c0c83371403d3b29a1892bf54acf174aff517d6765c4aeb4fad97e254fc5e89","signature":"ff9bf8280488ed234aad86a53ea686de480c697154ae0cf93a512447428f3bc4"}],"root":[[73,75]],"options":{"allowJs":false,"declaration":true,"declarationDir":"./","declarationMap":false,"emitDeclarationOnly":true,"esModuleInterop":true,"jsx":1,"module":99,"noImplicitAny":false,"outDir":"./","rootDir":"../src","skipLibCheck":true,"strict":false,"target":7,"tsBuildInfoFile":"./.dts.tsbuildinfo"},"referencedMap":[[65,1],[67,1],[72,2],[69,1],[68,1],[73,3],[75,4],[74,5],[55,6],[56,7],[57,8],[58,9],[59,10],[61,11],[63,5],[62,12]],"semanticDiagnosticsPerFile":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75],"version":"5.9.3"}
@@ -2,7 +2,7 @@
2
2
  * ***********************************
3
3
  * @composy/log-viewer-vue v0.0.1 *
4
4
  * Built with rollup *
5
- * Build time: 2024-08-17 11:42:24 *
5
+ * Build time: 2024-10-12 17:44:31 *
6
6
  * Build mode: production *
7
7
  * Minified: No *
8
8
  * ***********************************
@@ -1 +1 @@
1
- {"version":3,"file":"LogViewer.js","names":[],"sources":["../../src/components/LogViewer.vue"],"sourcesContent":["<!--\n @file 日志查看器组件\n @description LDesign 日志查看器组件,支持日志过滤、差异对比、异常标记等功能\n-->\n<template>\n <div ref=\"containerRef\" class=\"lv-vue-root\"></div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, onMounted, onUnmounted, watch, toRefs } from 'vue'\nimport {\n createLogViewer,\n type LogViewerConfig,\n type LogEntry,\n type FilterConfig,\n type ThemeMode,\n type LogViewer as LogViewerInstance,\n} from '@composy/log-viewer-core'\n\nconst props = withDefaults(defineProps<{\n data?: LogEntry[]\n filter?: FilterConfig\n theme?: ThemeMode\n pageSize?: number\n showFilter?: boolean\n showDiff?: boolean\n showAnomalyBadge?: boolean\n}>(), {\n data: () => [],\n theme: 'light',\n pageSize: 20,\n showFilter: true,\n showDiff: true,\n showAnomalyBadge: true,\n})\n\nconst emit = defineEmits<{\n 'entry-click': [entry: LogEntry]\n 'entry-expand': [entry: LogEntry]\n 'entry-collapse': [entry: LogEntry]\n 'filter-change': [filter: FilterConfig]\n 'theme-change': [theme: ThemeMode]\n 'page-change': [page: number]\n}>()\n\nconst containerRef = ref<HTMLElement | null>(null)\nlet instance: LogViewerInstance | null = null\n\nonMounted(() => {\n if (!containerRef.value) return\n\n instance = createLogViewer({\n container: containerRef.value,\n data: props.data,\n filter: props.filter,\n theme: props.theme,\n pageSize: props.pageSize,\n showFilter: props.showFilter,\n showDiff: props.showDiff,\n showAnomalyBadge: props.showAnomalyBadge,\n })\n\n instance.on('entry:click', (entry: LogEntry) => emit('entry-click', entry))\n instance.on('entry:expand', (entry: LogEntry) => emit('entry-expand', entry))\n instance.on('entry:collapse', (entry: LogEntry) => emit('entry-collapse', entry))\n instance.on('filter:change', (filter: FilterConfig) => emit('filter-change', filter))\n instance.on('theme:change', (theme: ThemeMode) => emit('theme-change', theme))\n instance.on('page:change', (page: number) => emit('page-change', page))\n})\n\nwatch(() => props.data, (newData) => {\n instance?.setData(newData)\n}, { deep: true })\n\nwatch(() => props.filter, (newFilter) => {\n if (newFilter) instance?.setFilter(newFilter)\n}, { deep: true })\n\nwatch(() => props.theme, (newTheme) => {\n instance?.setTheme(newTheme)\n})\n\nonUnmounted(() => {\n instance?.destroy()\n instance = null\n})\n\ndefineExpose({\n getInstance: () => instance,\n})\n</script>\n"],"mappings":""}
1
+ {"version":3,"file":"LogViewer.js","names":[],"sources":["../../src/components/LogViewer.vue"],"sourcesContent":["<!--\r\n @file 日志查看器组件\r\n @description LDesign 日志查看器组件,支持日志过滤、差异对比、异常标记等功能\r\n-->\r\n<script setup lang=\"ts\">\r\nimport { onMounted, onUnmounted, ref, watch } from 'vue-demi'\r\nimport {\r\n createLogViewer,\r\n type LogViewerConfig,\r\n type LogEntry,\r\n type FilterConfig,\r\n type ThemeMode,\r\n type LogViewer as LogViewerInstance,\r\n} from '@composy/log-viewer-core'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n data?: LogEntry[]\r\n filter?: FilterConfig\r\n theme?: ThemeMode\r\n pageSize?: number\r\n showFilter?: boolean\r\n showDiff?: boolean\r\n showAnomalyBadge?: boolean\r\n }>(),\r\n {\r\n data: () => [],\r\n theme: 'light',\r\n pageSize: 20,\r\n showFilter: true,\r\n showDiff: true,\r\n showAnomalyBadge: true,\r\n }\r\n)\r\n\r\nconst emit = defineEmits<{\r\n entryClick: [entry: LogEntry]\r\n entryExpand: [entry: LogEntry]\r\n entryCollapse: [entry: LogEntry]\r\n filterChange: [filter: FilterConfig]\r\n themeChange: [theme: ThemeMode]\r\n pageChange: [page: number]\r\n}>()\r\n\r\nconst containerRef = ref<HTMLElement | null>(null)\r\nlet instance: LogViewerInstance | null = null\r\n\r\nonMounted(() => {\r\n if (!containerRef.value) return\r\n\r\n instance = createLogViewer({\r\n container: containerRef.value,\r\n data: props.data,\r\n filter: props.filter,\r\n theme: props.theme,\r\n pageSize: props.pageSize,\r\n showFilter: props.showFilter,\r\n showDiff: props.showDiff,\r\n showAnomalyBadge: props.showAnomalyBadge,\r\n })\r\n\r\n instance.on('entry:click', (entry: LogEntry) => emit('entryClick', entry))\r\n instance.on('entry:expand', (entry: LogEntry) => emit('entryExpand', entry))\r\n instance.on('entry:collapse', (entry: LogEntry) =>\r\n emit('entryCollapse', entry)\r\n )\r\n instance.on('filter:change', (filter: FilterConfig) =>\r\n emit('filterChange', filter)\r\n )\r\n instance.on('theme:change', (theme: ThemeMode) => emit('themeChange', theme))\r\n instance.on('page:change', (page: number) => emit('pageChange', page))\r\n})\r\n\r\nwatch(\r\n () => props.data,\r\n newData => {\r\n instance?.setData(newData)\r\n },\r\n { deep: true }\r\n)\r\n\r\nwatch(\r\n () => props.filter,\r\n newFilter => {\r\n instance?.setFilter(newFilter || {})\r\n },\r\n { deep: true }\r\n)\r\n\r\nwatch(\r\n () => props.theme,\r\n newTheme => {\r\n instance?.setTheme(newTheme)\r\n }\r\n)\r\n\r\nonUnmounted(() => {\r\n instance?.destroy()\r\n instance = null\r\n})\r\n\r\ndefineExpose({\r\n getInstance: () => instance,\r\n})\r\n</script>\r\n\r\n<template>\r\n <div ref=\"containerRef\" class=\"lv-vue-root\"></div>\r\n</template>\r\n"],"mappings":""}
@@ -2,13 +2,14 @@
2
2
  * ***********************************
3
3
  * @composy/log-viewer-vue v0.0.1 *
4
4
  * Built with rollup *
5
- * Build time: 2024-08-17 11:42:24 *
5
+ * Build time: 2024-10-12 17:44:31 *
6
6
  * Build mode: production *
7
7
  * Minified: No *
8
8
  * ***********************************
9
9
  */
10
- import { createElementBlock, defineComponent, onMounted, onUnmounted, openBlock, ref, watch } from "vue";
10
+ import { onMounted, onUnmounted, ref, watch } from "vue-demi";
11
11
  import { createLogViewer } from "@composy/log-viewer-core";
12
+ import { createElementBlock, defineComponent, openBlock } from "vue";
12
13
  //#region src/components/LogViewer.vue?vue&type=script&setup=true&lang.ts
13
14
  var LogViewer_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
14
15
  __name: "LogViewer",
@@ -49,12 +50,12 @@ var LogViewer_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defi
49
50
  }
50
51
  },
51
52
  emits: [
52
- "entry-click",
53
- "entry-expand",
54
- "entry-collapse",
55
- "filter-change",
56
- "theme-change",
57
- "page-change"
53
+ "entryClick",
54
+ "entryExpand",
55
+ "entryCollapse",
56
+ "filterChange",
57
+ "themeChange",
58
+ "pageChange"
58
59
  ],
59
60
  setup(__props, { expose: __expose, emit: __emit }) {
60
61
  const props = __props;
@@ -73,18 +74,18 @@ var LogViewer_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defi
73
74
  showDiff: props.showDiff,
74
75
  showAnomalyBadge: props.showAnomalyBadge
75
76
  });
76
- instance.on("entry:click", (entry) => emit("entry-click", entry));
77
- instance.on("entry:expand", (entry) => emit("entry-expand", entry));
78
- instance.on("entry:collapse", (entry) => emit("entry-collapse", entry));
79
- instance.on("filter:change", (filter) => emit("filter-change", filter));
80
- instance.on("theme:change", (theme) => emit("theme-change", theme));
81
- instance.on("page:change", (page) => emit("page-change", page));
77
+ instance.on("entry:click", (entry) => emit("entryClick", entry));
78
+ instance.on("entry:expand", (entry) => emit("entryExpand", entry));
79
+ instance.on("entry:collapse", (entry) => emit("entryCollapse", entry));
80
+ instance.on("filter:change", (filter) => emit("filterChange", filter));
81
+ instance.on("theme:change", (theme) => emit("themeChange", theme));
82
+ instance.on("page:change", (page) => emit("pageChange", page));
82
83
  });
83
84
  watch(() => props.data, (newData) => {
84
85
  instance?.setData(newData);
85
86
  }, { deep: true });
86
87
  watch(() => props.filter, (newFilter) => {
87
- if (newFilter) instance?.setFilter(newFilter);
88
+ instance?.setFilter(newFilter || {});
88
89
  }, { deep: true });
89
90
  watch(() => props.theme, (newTheme) => {
90
91
  instance?.setTheme(newTheme);
@@ -1 +1 @@
1
- {"version":3,"file":"LogViewer.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../src/components/LogViewer.vue"],"sourcesContent":["<!--\n @file 日志查看器组件\n @description LDesign 日志查看器组件,支持日志过滤、差异对比、异常标记等功能\n-->\n<template>\n <div ref=\"containerRef\" class=\"lv-vue-root\"></div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, onMounted, onUnmounted, watch, toRefs } from 'vue'\nimport {\n createLogViewer,\n type LogViewerConfig,\n type LogEntry,\n type FilterConfig,\n type ThemeMode,\n type LogViewer as LogViewerInstance,\n} from '@composy/log-viewer-core'\n\nconst props = withDefaults(defineProps<{\n data?: LogEntry[]\n filter?: FilterConfig\n theme?: ThemeMode\n pageSize?: number\n showFilter?: boolean\n showDiff?: boolean\n showAnomalyBadge?: boolean\n}>(), {\n data: () => [],\n theme: 'light',\n pageSize: 20,\n showFilter: true,\n showDiff: true,\n showAnomalyBadge: true,\n})\n\nconst emit = defineEmits<{\n 'entry-click': [entry: LogEntry]\n 'entry-expand': [entry: LogEntry]\n 'entry-collapse': [entry: LogEntry]\n 'filter-change': [filter: FilterConfig]\n 'theme-change': [theme: ThemeMode]\n 'page-change': [page: number]\n}>()\n\nconst containerRef = ref<HTMLElement | null>(null)\nlet instance: LogViewerInstance | null = null\n\nonMounted(() => {\n if (!containerRef.value) return\n\n instance = createLogViewer({\n container: containerRef.value,\n data: props.data,\n filter: props.filter,\n theme: props.theme,\n pageSize: props.pageSize,\n showFilter: props.showFilter,\n showDiff: props.showDiff,\n showAnomalyBadge: props.showAnomalyBadge,\n })\n\n instance.on('entry:click', (entry: LogEntry) => emit('entry-click', entry))\n instance.on('entry:expand', (entry: LogEntry) => emit('entry-expand', entry))\n instance.on('entry:collapse', (entry: LogEntry) => emit('entry-collapse', entry))\n instance.on('filter:change', (filter: FilterConfig) => emit('filter-change', filter))\n instance.on('theme:change', (theme: ThemeMode) => emit('theme-change', theme))\n instance.on('page:change', (page: number) => emit('page-change', page))\n})\n\nwatch(() => props.data, (newData) => {\n instance?.setData(newData)\n}, { deep: true })\n\nwatch(() => props.filter, (newFilter) => {\n if (newFilter) instance?.setFilter(newFilter)\n}, { deep: true })\n\nwatch(() => props.theme, (newTheme) => {\n instance?.setTheme(newTheme)\n})\n\nonUnmounted(() => {\n instance?.destroy()\n instance = null\n})\n\ndefineExpose({\n getInstance: () => instance,\n})\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmBA,MAAM,QAAQ;EAiBd,MAAM,OAAO;EASb,MAAM,eAAe,IAAwB,IAAI;EACjD,IAAI,WAAqC;EAEzC,gBAAgB;GACd,IAAI,CAAC,aAAa,OAAO;GAEzB,WAAW,gBAAgB;IACzB,WAAW,aAAa;IACxB,MAAM,MAAM;IACZ,QAAQ,MAAM;IACd,OAAO,MAAM;IACb,UAAU,MAAM;IAChB,YAAY,MAAM;IAClB,UAAU,MAAM;IAChB,kBAAkB,MAAM;GAC1B,CAAC;GAED,SAAS,GAAG,gBAAgB,UAAoB,KAAK,eAAe,KAAK,CAAC;GAC1E,SAAS,GAAG,iBAAiB,UAAoB,KAAK,gBAAgB,KAAK,CAAC;GAC5E,SAAS,GAAG,mBAAmB,UAAoB,KAAK,kBAAkB,KAAK,CAAC;GAChF,SAAS,GAAG,kBAAkB,WAAyB,KAAK,iBAAiB,MAAM,CAAC;GACpF,SAAS,GAAG,iBAAiB,UAAqB,KAAK,gBAAgB,KAAK,CAAC;GAC7E,SAAS,GAAG,gBAAgB,SAAiB,KAAK,eAAe,IAAI,CAAC;EACxE,CAAC;EAED,YAAY,MAAM,OAAO,YAAY;GACnC,UAAU,QAAQ,OAAO;EAC3B,GAAG,EAAE,MAAM,KAAK,CAAC;EAEjB,YAAY,MAAM,SAAS,cAAc;GACvC,IAAI,WAAW,UAAU,UAAU,SAAS;EAC9C,GAAG,EAAE,MAAM,KAAK,CAAC;EAEjB,YAAY,MAAM,QAAQ,aAAa;GACrC,UAAU,SAAS,QAAQ;EAC7B,CAAC;EAED,kBAAkB;GAChB,UAAU,QAAQ;GAClB,WAAW;EACb,CAAC;EAED,SAAa,EACX,mBAAmB,SACrB,CAAC;;uBApFC,mBAAkD,OAAA;aAAzC;IAAJ,KAAI;IAAe,OAAM"}
1
+ {"version":3,"file":"LogViewer.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../src/components/LogViewer.vue","../../src/components/LogViewer.vue"],"sourcesContent":["<!--\r\n @file 日志查看器组件\r\n @description LDesign 日志查看器组件,支持日志过滤、差异对比、异常标记等功能\r\n-->\r\n<script setup lang=\"ts\">\r\nimport { onMounted, onUnmounted, ref, watch } from 'vue-demi'\r\nimport {\r\n createLogViewer,\r\n type LogViewerConfig,\r\n type LogEntry,\r\n type FilterConfig,\r\n type ThemeMode,\r\n type LogViewer as LogViewerInstance,\r\n} from '@composy/log-viewer-core'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n data?: LogEntry[]\r\n filter?: FilterConfig\r\n theme?: ThemeMode\r\n pageSize?: number\r\n showFilter?: boolean\r\n showDiff?: boolean\r\n showAnomalyBadge?: boolean\r\n }>(),\r\n {\r\n data: () => [],\r\n theme: 'light',\r\n pageSize: 20,\r\n showFilter: true,\r\n showDiff: true,\r\n showAnomalyBadge: true,\r\n }\r\n)\r\n\r\nconst emit = defineEmits<{\r\n entryClick: [entry: LogEntry]\r\n entryExpand: [entry: LogEntry]\r\n entryCollapse: [entry: LogEntry]\r\n filterChange: [filter: FilterConfig]\r\n themeChange: [theme: ThemeMode]\r\n pageChange: [page: number]\r\n}>()\r\n\r\nconst containerRef = ref<HTMLElement | null>(null)\r\nlet instance: LogViewerInstance | null = null\r\n\r\nonMounted(() => {\r\n if (!containerRef.value) return\r\n\r\n instance = createLogViewer({\r\n container: containerRef.value,\r\n data: props.data,\r\n filter: props.filter,\r\n theme: props.theme,\r\n pageSize: props.pageSize,\r\n showFilter: props.showFilter,\r\n showDiff: props.showDiff,\r\n showAnomalyBadge: props.showAnomalyBadge,\r\n })\r\n\r\n instance.on('entry:click', (entry: LogEntry) => emit('entryClick', entry))\r\n instance.on('entry:expand', (entry: LogEntry) => emit('entryExpand', entry))\r\n instance.on('entry:collapse', (entry: LogEntry) =>\r\n emit('entryCollapse', entry)\r\n )\r\n instance.on('filter:change', (filter: FilterConfig) =>\r\n emit('filterChange', filter)\r\n )\r\n instance.on('theme:change', (theme: ThemeMode) => emit('themeChange', theme))\r\n instance.on('page:change', (page: number) => emit('pageChange', page))\r\n})\r\n\r\nwatch(\r\n () => props.data,\r\n newData => {\r\n instance?.setData(newData)\r\n },\r\n { deep: true }\r\n)\r\n\r\nwatch(\r\n () => props.filter,\r\n newFilter => {\r\n instance?.setFilter(newFilter || {})\r\n },\r\n { deep: true }\r\n)\r\n\r\nwatch(\r\n () => props.theme,\r\n newTheme => {\r\n instance?.setTheme(newTheme)\r\n }\r\n)\r\n\r\nonUnmounted(() => {\r\n instance?.destroy()\r\n instance = null\r\n})\r\n\r\ndefineExpose({\r\n getInstance: () => instance,\r\n})\r\n</script>\r\n\r\n<template>\r\n <div ref=\"containerRef\" class=\"lv-vue-root\"></div>\r\n</template>\r\n","<!--\r\n @file 日志查看器组件\r\n @description LDesign 日志查看器组件,支持日志过滤、差异对比、异常标记等功能\r\n-->\r\n<script setup lang=\"ts\">\r\nimport { onMounted, onUnmounted, ref, watch } from 'vue-demi'\r\nimport {\r\n createLogViewer,\r\n type LogViewerConfig,\r\n type LogEntry,\r\n type FilterConfig,\r\n type ThemeMode,\r\n type LogViewer as LogViewerInstance,\r\n} from '@composy/log-viewer-core'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n data?: LogEntry[]\r\n filter?: FilterConfig\r\n theme?: ThemeMode\r\n pageSize?: number\r\n showFilter?: boolean\r\n showDiff?: boolean\r\n showAnomalyBadge?: boolean\r\n }>(),\r\n {\r\n data: () => [],\r\n theme: 'light',\r\n pageSize: 20,\r\n showFilter: true,\r\n showDiff: true,\r\n showAnomalyBadge: true,\r\n }\r\n)\r\n\r\nconst emit = defineEmits<{\r\n entryClick: [entry: LogEntry]\r\n entryExpand: [entry: LogEntry]\r\n entryCollapse: [entry: LogEntry]\r\n filterChange: [filter: FilterConfig]\r\n themeChange: [theme: ThemeMode]\r\n pageChange: [page: number]\r\n}>()\r\n\r\nconst containerRef = ref<HTMLElement | null>(null)\r\nlet instance: LogViewerInstance | null = null\r\n\r\nonMounted(() => {\r\n if (!containerRef.value) return\r\n\r\n instance = createLogViewer({\r\n container: containerRef.value,\r\n data: props.data,\r\n filter: props.filter,\r\n theme: props.theme,\r\n pageSize: props.pageSize,\r\n showFilter: props.showFilter,\r\n showDiff: props.showDiff,\r\n showAnomalyBadge: props.showAnomalyBadge,\r\n })\r\n\r\n instance.on('entry:click', (entry: LogEntry) => emit('entryClick', entry))\r\n instance.on('entry:expand', (entry: LogEntry) => emit('entryExpand', entry))\r\n instance.on('entry:collapse', (entry: LogEntry) =>\r\n emit('entryCollapse', entry)\r\n )\r\n instance.on('filter:change', (filter: FilterConfig) =>\r\n emit('filterChange', filter)\r\n )\r\n instance.on('theme:change', (theme: ThemeMode) => emit('themeChange', theme))\r\n instance.on('page:change', (page: number) => emit('pageChange', page))\r\n})\r\n\r\nwatch(\r\n () => props.data,\r\n newData => {\r\n instance?.setData(newData)\r\n },\r\n { deep: true }\r\n)\r\n\r\nwatch(\r\n () => props.filter,\r\n newFilter => {\r\n instance?.setFilter(newFilter || {})\r\n },\r\n { deep: true }\r\n)\r\n\r\nwatch(\r\n () => props.theme,\r\n newTheme => {\r\n instance?.setTheme(newTheme)\r\n }\r\n)\r\n\r\nonUnmounted(() => {\r\n instance?.destroy()\r\n instance = null\r\n})\r\n\r\ndefineExpose({\r\n getInstance: () => instance,\r\n})\r\n</script>\r\n\r\n<template>\r\n <div ref=\"containerRef\" class=\"lv-vue-root\"></div>\r\n</template>\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAeA,MAAM,QAAQ;EAoBd,MAAM,OAAO;EASb,MAAM,eAAe,IAAwB,IAAI;EACjD,IAAI,WAAqC;EAEzC,gBAAgB;GACd,IAAI,CAAC,aAAa,OAAO;GAEzB,WAAW,gBAAgB;IACzB,WAAW,aAAa;IACxB,MAAM,MAAM;IACZ,QAAQ,MAAM;IACd,OAAO,MAAM;IACb,UAAU,MAAM;IAChB,YAAY,MAAM;IAClB,UAAU,MAAM;IAChB,kBAAkB,MAAM;GAC1B,CAAC;GAED,SAAS,GAAG,gBAAgB,UAAoB,KAAK,cAAc,KAAK,CAAC;GACzE,SAAS,GAAG,iBAAiB,UAAoB,KAAK,eAAe,KAAK,CAAC;GAC3E,SAAS,GAAG,mBAAmB,UAC7B,KAAK,iBAAiB,KAAK,CAC7B;GACA,SAAS,GAAG,kBAAkB,WAC5B,KAAK,gBAAgB,MAAM,CAC7B;GACA,SAAS,GAAG,iBAAiB,UAAqB,KAAK,eAAe,KAAK,CAAC;GAC5E,SAAS,GAAG,gBAAgB,SAAiB,KAAK,cAAc,IAAI,CAAC;EACvE,CAAC;EAED,YACQ,MAAM,OACZ,YAAW;GACT,UAAU,QAAQ,OAAO;EAC3B,GACA,EAAE,MAAM,KAAK,CACf;EAEA,YACQ,MAAM,SACZ,cAAa;GACX,UAAU,UAAU,aAAa,CAAC,CAAC;EACrC,GACA,EAAE,MAAM,KAAK,CACf;EAEA,YACQ,MAAM,QACZ,aAAY;GACV,UAAU,SAAS,QAAQ;EAC7B,CACF;EAEA,kBAAkB;GAChB,UAAU,QAAQ;GAClB,WAAW;EACb,CAAC;EAED,SAAa,EACX,mBAAmB,SACrB,CAAC;;uBCIC,mBAAkD,OAAA;aAAzC;IAAJ,KAAI;IAAe,OAAM"}
@@ -20,6 +20,7 @@ export declare function useLogViewer(): {
20
20
  getPagination: () => PaginationConfig;
21
21
  on: (event: string, callback: (...args: unknown[]) => void) => () => void;
22
22
  refresh: () => void;
23
+ loadData: () => Promise<void>;
23
24
  destroy: () => void;
24
25
  }, LogViewer | {
25
26
  getData: () => LogEntry[];
@@ -37,6 +38,7 @@ export declare function useLogViewer(): {
37
38
  getPagination: () => PaginationConfig;
38
39
  on: (event: string, callback: (...args: unknown[]) => void) => () => void;
39
40
  refresh: () => void;
41
+ loadData: () => Promise<void>;
40
42
  destroy: () => void;
41
43
  }>;
42
44
  data: import("vue").Ref<{
@@ -110,7 +112,7 @@ export declare function useLogViewer(): {
110
112
  collapseAll: () => void;
111
113
  goToPage: (page: number) => void;
112
114
  refresh: () => void;
115
+ loadData: () => Promise<void>;
113
116
  destroy: () => void;
114
117
  on: (event: string, callback: (...args: unknown[]) => void) => () => void;
115
118
  };
116
- //# sourceMappingURL=useLogViewer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useLogViewer.d.ts","sourceRoot":"","sources":["../../src/composables/useLogViewer.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,gBAAgB,EACtB,MAAM,0BAA0B,CAAA;AAEjC;;;GAGG;AACH,wBAAgB,YAAY;;;;;;;;;;;;;;;uCAyBV,GAAG;;;;;;;;;;;;;;;;;uCAAH,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAlBQ,WAAW,GAAG,MAAM,WAAW,OAAO,CAAC,eAAe,CAAC;uBA+BxD,QAAQ,EAAE;0BAKP,QAAQ,EAAE;mBAKjB,YAAY;;kBAUb,SAAS;sBAKL,MAAM;wBAIJ,MAAM;;qBAQT,MAAM;;;gBAaX,MAAM,YAAY,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,KAAG,MAAM,IAAI;EA4B/E"}
1
+ {"version":3,"file":"useLogViewer.d.ts","sourceRoot":"","sources":["../../src/composables/useLogViewer.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,gBAAgB,EACtB,MAAM,0BAA0B,CAAA;AAEjC;;;GAGG;AACH,wBAAgB,YAAY;;;;;;;;;;;;;;;uCA+BP,GAAG;;;;;;;;;;;;;;;;;;uCAAH,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAvBT,WAAW,GAAG,MAAM,WACtB,OAAO,CAAC,eAAe,CAAC;uBAiCT,QAAQ,EAAE;0BAKP,QAAQ,EAAE;mBAKjB,YAAY;;kBAUb,SAAS;sBAKL,MAAM;wBAIJ,MAAM;;qBAQT,MAAM;;;;gBAyBrB,MAAM,YACH,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,KACrC,MAAM,IAAI;EA6Bd"}