@aithe/aithe-ui 26.2.3 → 26.3.1
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.
- package/README.md +16 -11
- package/dist/apps/admin/app.js +12 -0
- package/dist/apps/admin/components/admin-app.js +83 -0
- package/dist/apps/admin/components/admin-layout.d.ts +0 -1
- package/dist/apps/admin/components/admin-layout.d.ts.map +1 -1
- package/dist/apps/admin/components/admin-layout.js +250 -0
- package/dist/apps/admin/datahub/auth.js +24 -0
- package/dist/apps/admin/datahub/dashboard.js +16 -0
- package/dist/apps/admin/datahub/index.js +42 -0
- package/dist/apps/admin/datahub/menu.js +16 -0
- package/dist/apps/admin/datahub/mock/auth.js +11 -0
- package/dist/apps/admin/datahub/mock/dashboard.js +10 -0
- package/dist/apps/admin/datahub/mock/menu.js +42 -0
- package/dist/apps/admin/i18n/de-DE.js +37 -0
- package/dist/apps/admin/i18n/en-US.js +37 -0
- package/dist/apps/admin/i18n/es-ES.js +38 -0
- package/dist/apps/admin/i18n/fr-FR.js +37 -0
- package/dist/apps/admin/i18n/index.js +27 -0
- package/dist/apps/admin/i18n/ja-JP.js +38 -0
- package/dist/apps/admin/i18n/ko-KR.js +37 -0
- package/dist/apps/admin/i18n/pt-BR.js +37 -0
- package/dist/apps/admin/i18n/zh-CN.js +37 -0
- package/dist/apps/admin/i18n/zh-HK.js +37 -0
- package/dist/apps/admin/i18n/zh-TW.js +37 -0
- package/dist/apps/admin/pages/dashboard-page.d.ts +1 -0
- package/dist/apps/admin/pages/dashboard-page.d.ts.map +1 -1
- package/dist/apps/admin/pages/dashboard-page.js +199 -0
- package/dist/apps/admin/pages/login-page.js +278 -0
- package/dist/apps/admin/pages/not-found-page.js +57 -0
- package/dist/apps/admin/pages/role-page.js +76 -0
- package/dist/apps/admin/pages/settings-page.js +95 -0
- package/dist/apps/admin/pages/user-page.js +76 -0
- package/dist/apps/admin/router/index.js +43 -0
- package/dist/apps/admin/standalone.js +1 -0
- package/dist/apps/admin/store/auth.js +42 -0
- package/dist/apps/api/app.js +82 -0
- package/dist/apps/api/demo-data.d.ts.map +1 -1
- package/dist/apps/api/demo-data.js +965 -0
- package/dist/apps/api/docs-viewer.js +684 -0
- package/dist/apps/api/i18n/de-DE.d.ts.map +1 -1
- package/dist/apps/api/i18n/de-DE.js +130 -0
- package/dist/apps/api/i18n/en-US.d.ts.map +1 -1
- package/dist/apps/api/i18n/en-US.js +140 -0
- package/dist/apps/api/i18n/es-ES.d.ts.map +1 -1
- package/dist/apps/api/i18n/es-ES.js +130 -0
- package/dist/apps/api/i18n/fr-FR.d.ts.map +1 -1
- package/dist/apps/api/i18n/fr-FR.js +130 -0
- package/dist/apps/api/i18n/index.js +27 -0
- package/dist/apps/api/i18n/ja-JP.d.ts.map +1 -1
- package/dist/apps/api/i18n/ja-JP.js +130 -0
- package/dist/apps/api/i18n/ko-KR.d.ts.map +1 -1
- package/dist/apps/api/i18n/ko-KR.js +130 -0
- package/dist/apps/api/i18n/pt-BR.d.ts.map +1 -1
- package/dist/apps/api/i18n/pt-BR.js +130 -0
- package/dist/apps/api/i18n/zh-CN.d.ts.map +1 -1
- package/dist/apps/api/i18n/zh-CN.js +140 -0
- package/dist/apps/api/i18n/zh-HK.d.ts.map +1 -1
- package/dist/apps/api/i18n/zh-HK.js +130 -0
- package/dist/apps/api/i18n/zh-TW.d.ts.map +1 -1
- package/dist/apps/api/i18n/zh-TW.js +130 -0
- package/dist/apps/api/pages/docs.d.ts.map +1 -1
- package/dist/apps/api/pages/docs.js +367 -0
- package/dist/apps/api/standalone.js +1 -0
- package/dist/apps/demo/app.js +273 -0
- package/dist/apps/demo/editor.d.ts.map +1 -1
- package/dist/apps/demo/editor.js +270 -0
- package/dist/apps/demo/helpers.js +7 -0
- package/dist/apps/demo/i18n/de-DE.d.ts.map +1 -1
- package/dist/apps/demo/i18n/de-DE.js +269 -0
- package/dist/apps/demo/i18n/en-US.d.ts.map +1 -1
- package/dist/apps/demo/i18n/en-US.js +281 -0
- package/dist/apps/demo/i18n/es-ES.d.ts.map +1 -1
- package/dist/apps/demo/i18n/es-ES.js +269 -0
- package/dist/apps/demo/i18n/fr-FR.d.ts.map +1 -1
- package/dist/apps/demo/i18n/fr-FR.js +269 -0
- package/dist/apps/demo/i18n/index.js +27 -0
- package/dist/apps/demo/i18n/ja-JP.d.ts.map +1 -1
- package/dist/apps/demo/i18n/ja-JP.js +269 -0
- package/dist/apps/demo/i18n/ko-KR.d.ts.map +1 -1
- package/dist/apps/demo/i18n/ko-KR.js +269 -0
- package/dist/apps/demo/i18n/pt-BR.d.ts.map +1 -1
- package/dist/apps/demo/i18n/pt-BR.js +269 -0
- package/dist/apps/demo/i18n/zh-CN.d.ts.map +1 -1
- package/dist/apps/demo/i18n/zh-CN.js +281 -0
- package/dist/apps/demo/i18n/zh-HK.d.ts.map +1 -1
- package/dist/apps/demo/i18n/zh-HK.js +269 -0
- package/dist/apps/demo/i18n/zh-TW.d.ts.map +1 -1
- package/dist/apps/demo/i18n/zh-TW.js +269 -0
- package/dist/apps/demo/pages/autoform.js +412 -0
- package/dist/apps/demo/pages/basic.js +157 -0
- package/dist/apps/demo/pages/code.js +1088 -0
- package/dist/apps/demo/pages/container.js +42 -0
- package/dist/apps/demo/pages/dashboard.js +159 -0
- package/dist/apps/demo/pages/data.d.ts.map +1 -1
- package/dist/apps/demo/pages/data.js +327 -0
- package/dist/apps/demo/pages/display.d.ts.map +1 -1
- package/dist/apps/demo/pages/display.js +295 -0
- package/dist/apps/demo/pages/feedback.js +94 -0
- package/dist/apps/demo/pages/form.js +99 -0
- package/dist/apps/demo/pages/layout.js +74 -0
- package/dist/apps/demo/pages/navigation.js +54 -0
- package/dist/apps/demo/pages/progress.js +42 -0
- package/dist/apps/demo/pages/theme.js +126 -0
- package/dist/apps/demo/standalone.js +1 -0
- package/dist/components/basic/AGENTS.md +1 -0
- package/dist/components/basic/avatar.js +168 -0
- package/dist/components/basic/badge.js +157 -0
- package/dist/components/basic/button-group.js +70 -0
- package/dist/components/basic/button.d.ts +2 -4
- package/dist/components/basic/button.d.ts.map +1 -1
- package/dist/components/basic/button.js +315 -0
- package/dist/components/basic/card.js +186 -0
- package/dist/components/basic/chip.js +103 -0
- package/dist/components/basic/divider.js +127 -0
- package/dist/components/basic/empty.js +72 -0
- package/dist/components/basic/icon.js +129 -0
- package/dist/components/basic/input.d.ts.map +1 -1
- package/dist/components/basic/input.js +314 -0
- package/dist/components/basic/tag.d.ts +7 -2
- package/dist/components/basic/tag.d.ts.map +1 -1
- package/dist/components/basic/tag.js +248 -0
- package/dist/components/basic/textarea.d.ts +0 -1
- package/dist/components/basic/textarea.d.ts.map +1 -1
- package/dist/components/basic/textarea.js +130 -0
- package/dist/components/container/callout.js +108 -0
- package/dist/components/container/details.js +117 -0
- package/dist/components/container/scroller.js +144 -0
- package/dist/components/container/split-panel.js +150 -0
- package/dist/components/data/AGENTS.md +1 -1
- package/dist/components/data/box-table.d.ts +53 -0
- package/dist/components/data/box-table.d.ts.map +1 -0
- package/dist/components/data/box-table.js +220 -0
- package/dist/components/data/dropdown.d.ts +8 -5
- package/dist/components/data/dropdown.d.ts.map +1 -1
- package/dist/components/data/dropdown.js +219 -0
- package/dist/components/data/metrics-group.js +180 -0
- package/dist/components/data/metrics.d.ts +11 -0
- package/dist/components/data/metrics.d.ts.map +1 -1
- package/dist/components/data/metrics.js +309 -0
- package/dist/components/data/pagination.js +119 -0
- package/dist/components/data/tab-pane.d.ts +58 -12
- package/dist/components/data/tab-pane.d.ts.map +1 -1
- package/dist/components/data/tab-pane.js +130 -0
- package/dist/components/data/table-column.d.ts +29 -5
- package/dist/components/data/table-column.d.ts.map +1 -1
- package/dist/components/data/table-column.js +123 -0
- package/dist/components/data/table.d.ts +134 -54
- package/dist/components/data/table.d.ts.map +1 -1
- package/dist/components/data/table.js +1210 -0
- package/dist/components/data/tabs.d.ts +60 -3
- package/dist/components/data/tabs.d.ts.map +1 -1
- package/dist/components/data/tabs.js +416 -0
- package/dist/components/data/timeline-item.js +127 -0
- package/dist/components/data/timeline.js +204 -0
- package/dist/components/data/tree-menu.d.ts +12 -2
- package/dist/components/data/tree-menu.d.ts.map +1 -1
- package/dist/components/data/tree-menu.js +482 -0
- package/dist/components/data/tree.js +269 -0
- package/dist/components/display/AGENTS.md +5 -2
- package/dist/components/display/animated-image.js +98 -0
- package/dist/components/display/brief-box.d.ts +42 -0
- package/dist/components/display/brief-box.d.ts.map +1 -0
- package/dist/components/display/brief-box.js +117 -0
- package/dist/components/display/carousel.js +223 -0
- package/dist/components/display/code-editor.d.ts.map +1 -1
- package/dist/components/display/code-editor.js +976 -0
- package/dist/components/display/comparison.js +132 -0
- package/dist/components/display/desc-item.d.ts +48 -0
- package/dist/components/display/desc-item.d.ts.map +1 -0
- package/dist/components/display/desc-item.js +150 -0
- package/dist/components/display/desc.d.ts +64 -0
- package/dist/components/display/desc.d.ts.map +1 -0
- package/dist/components/display/desc.js +363 -0
- package/dist/components/display/detail-box.d.ts +51 -0
- package/dist/components/display/detail-box.d.ts.map +1 -0
- package/dist/components/display/detail-box.js +157 -0
- package/dist/components/display/label.js +166 -0
- package/dist/components/display/markdown-editor.js +319 -0
- package/dist/components/display/markdown.d.ts.map +1 -1
- package/dist/components/display/markdown.js +193 -0
- package/dist/components/display/mini-box.d.ts +31 -0
- package/dist/components/display/mini-box.d.ts.map +1 -0
- package/dist/components/display/mini-box.js +137 -0
- package/dist/components/display/profile.d.ts +18 -0
- package/dist/components/display/profile.d.ts.map +1 -0
- package/dist/components/display/profile.js +164 -0
- package/dist/components/feedback/AGENTS.md +1 -0
- package/dist/components/feedback/alert.js +150 -0
- package/dist/components/feedback/dialog.js +228 -0
- package/dist/components/feedback/drawer.d.ts.map +1 -1
- package/dist/components/feedback/drawer.js +338 -0
- package/dist/components/feedback/loading.js +130 -0
- package/dist/components/feedback/modal.d.ts.map +1 -1
- package/dist/components/feedback/modal.js +303 -0
- package/dist/components/feedback/notification.js +170 -0
- package/dist/components/feedback/popover.d.ts +1 -1
- package/dist/components/feedback/popover.js +124 -0
- package/dist/components/feedback/toast.js +142 -0
- package/dist/components/feedback/tooltip.d.ts +1 -1
- package/dist/components/feedback/tooltip.js +153 -0
- package/dist/components/form/AGENTS.md +4 -0
- package/dist/components/form/autoform-item.js +761 -0
- package/dist/components/form/autoform.d.ts +15 -5
- package/dist/components/form/autoform.d.ts.map +1 -1
- package/dist/components/form/autoform.js +303 -0
- package/dist/components/form/checkbox-group.js +118 -0
- package/dist/components/form/checkbox.js +123 -0
- package/dist/components/form/color-picker.js +148 -0
- package/dist/components/form/combobox.d.ts.map +1 -1
- package/dist/components/form/combobox.js +282 -0
- package/dist/components/form/date-picker.js +123 -0
- package/dist/components/form/form-item.d.ts.map +1 -1
- package/dist/components/form/form-item.js +141 -0
- package/dist/components/form/form.js +94 -0
- package/dist/components/form/radio-group.js +106 -0
- package/dist/components/form/radio.js +110 -0
- package/dist/components/form/rate.js +116 -0
- package/dist/components/form/select.d.ts +1 -1
- package/dist/components/form/select.js +495 -0
- package/dist/components/form/slider.js +134 -0
- package/dist/components/form/switch.js +146 -0
- package/dist/components/form/time-picker.js +92 -0
- package/dist/components/form/transfer.js +273 -0
- package/dist/components/form/upload.js +138 -0
- package/dist/components/framework/body.js +333 -0
- package/dist/components/framework/dashboard-panel.js +519 -0
- package/dist/components/framework/dashboard.d.ts.map +1 -1
- package/dist/components/framework/dashboard.js +1084 -0
- package/dist/components/framework/header.js +237 -0
- package/dist/components/framework/log-panel.js +637 -0
- package/dist/components/framework/page.js +151 -0
- package/dist/components/framework/sidebar.d.ts +4 -10
- package/dist/components/framework/sidebar.d.ts.map +1 -1
- package/dist/components/framework/sidebar.js +477 -0
- package/dist/components/layout/affix.js +137 -0
- package/dist/components/layout/col.js +103 -0
- package/dist/components/layout/collapse-item.js +165 -0
- package/dist/components/layout/collapse.js +108 -0
- package/dist/components/layout/container.js +92 -0
- package/dist/components/layout/flex.js +100 -0
- package/dist/components/layout/row.js +103 -0
- package/dist/components/layout/space.js +85 -0
- package/dist/components/navigation/back-top.js +127 -0
- package/dist/components/navigation/breadcrumb-item.js +108 -0
- package/dist/components/navigation/breadcrumb.js +70 -0
- package/dist/components/navigation/menu-item.js +181 -0
- package/dist/components/navigation/menu.js +126 -0
- package/dist/components/navigation/steps.js +183 -0
- package/dist/components/navigation/sub-menu.js +253 -0
- package/dist/components/progress/progress-bar.js +97 -0
- package/dist/components/progress/progress-ring.js +111 -0
- package/dist/components/progress/skeleton.js +108 -0
- package/dist/components/progress/spinner.js +129 -0
- package/dist/components/theme/locale-switch.js +241 -0
- package/dist/components/theme/shadow-picker.js +233 -0
- package/dist/components/theme/shape-picker.js +232 -0
- package/dist/components/theme/theme-picker.js +236 -0
- package/dist/components/theme/theme-preview.d.ts +1 -2
- package/dist/components/theme/theme-preview.d.ts.map +1 -1
- package/dist/components/theme/theme-preview.js +376 -0
- package/dist/components/theme/theme-switch.d.ts.map +1 -1
- package/dist/components/theme/theme-switch.js +318 -0
- package/dist/components/theme/typo-picker.js +219 -0
- package/dist/core/AGENTS.md +6 -1
- package/dist/core/aithe-element.d.ts +2 -2
- package/dist/core/aithe-element.js +135 -0
- package/dist/core/aithe-widget.js +30 -0
- package/dist/core/anchored-overlay.d.ts +3 -0
- package/dist/core/anchored-overlay.d.ts.map +1 -1
- package/dist/core/anchored-overlay.js +111 -0
- package/dist/core/autoform/autoform.js +79 -0
- package/dist/core/autoform/condition.js +170 -0
- package/dist/core/autoform/index.js +8 -0
- package/dist/core/autoform/types.js +7 -0
- package/dist/core/datahub/config/strategy.d.ts +1 -1
- package/dist/core/datahub/config/strategy.d.ts.map +1 -1
- package/dist/core/datahub/config/strategy.js +50 -0
- package/dist/core/datahub/core/adapter/fetch-adapter.d.ts +1 -1
- package/dist/core/datahub/core/adapter/fetch-adapter.d.ts.map +1 -1
- package/dist/core/datahub/core/adapter/fetch-adapter.js +118 -0
- package/dist/core/datahub/core/adapter/index.js +7 -0
- package/dist/core/datahub/core/adapter/mock-adapter.d.ts +1 -1
- package/dist/core/datahub/core/adapter/mock-adapter.d.ts.map +1 -1
- package/dist/core/datahub/core/adapter/mock-adapter.js +58 -0
- package/dist/core/datahub/core/api-styles.d.ts +1 -1
- package/dist/core/datahub/core/api-styles.d.ts.map +1 -1
- package/dist/core/datahub/core/api-styles.js +131 -0
- package/dist/core/datahub/core/datahub-core.d.ts +3 -3
- package/dist/core/datahub/core/datahub-core.d.ts.map +1 -1
- package/dist/core/datahub/core/datahub-core.js +441 -0
- package/dist/core/datahub/core/index.js +7 -0
- package/dist/core/datahub/index.js +50 -0
- package/dist/core/datahub/types.d.ts +6 -0
- package/dist/core/datahub/types.d.ts.map +1 -1
- package/dist/core/datahub/types.js +31 -0
- package/dist/core/datahub/utils/cache.js +55 -0
- package/dist/core/datahub/utils/common.js +23 -0
- package/dist/core/datahub/utils/dedup.d.ts +1 -1
- package/dist/core/datahub/utils/dedup.d.ts.map +1 -1
- package/dist/core/datahub/utils/dedup.js +52 -0
- package/dist/core/datahub/utils/idempotent.js +61 -0
- package/dist/core/datahub/utils/is-query.js +53 -0
- package/dist/core/datahub/utils/loading.js +78 -0
- package/dist/core/filter/__tests__/index.test.d.ts +2 -0
- package/dist/core/filter/__tests__/index.test.d.ts.map +1 -0
- package/dist/core/filter/__tests__/index.test.js +230 -0
- package/dist/core/filter/builtins.d.ts +60 -0
- package/dist/core/filter/builtins.d.ts.map +1 -0
- package/dist/core/filter/builtins.js +172 -0
- package/dist/core/filter/factory.d.ts +54 -0
- package/dist/core/filter/factory.d.ts.map +1 -0
- package/dist/core/filter/factory.js +96 -0
- package/dist/core/filter/index.d.ts +11 -0
- package/dist/core/filter/index.d.ts.map +1 -0
- package/dist/core/filter/index.js +9 -0
- package/dist/core/filter/types.d.ts +12 -0
- package/dist/core/filter/types.d.ts.map +1 -0
- package/dist/core/filter/types.js +1 -0
- package/dist/core/floating.js +132 -0
- package/dist/core/highlight/index.js +43 -0
- package/dist/core/highlight/lang-bash.js +27 -0
- package/dist/core/highlight/lang-c.js +27 -0
- package/dist/core/highlight/lang-cmake.js +27 -0
- package/dist/core/highlight/lang-cpp.js +27 -0
- package/dist/core/highlight/lang-css.js +24 -0
- package/dist/core/highlight/lang-dart.js +27 -0
- package/dist/core/highlight/lang-dockerfile.js +16 -0
- package/dist/core/highlight/lang-fsharp.js +23 -0
- package/dist/core/highlight/lang-go.js +22 -0
- package/dist/core/highlight/lang-html.js +12 -0
- package/dist/core/highlight/lang-java.js +22 -0
- package/dist/core/highlight/lang-javascript.js +26 -0
- package/dist/core/highlight/lang-json.js +13 -0
- package/dist/core/highlight/lang-jsonline.js +13 -0
- package/dist/core/highlight/lang-jsx.js +30 -0
- package/dist/core/highlight/lang-kotlin.js +27 -0
- package/dist/core/highlight/lang-latex.js +22 -0
- package/dist/core/highlight/lang-lua.js +26 -0
- package/dist/core/highlight/lang-makefile.js +22 -0
- package/dist/core/highlight/lang-markdown.js +18 -0
- package/dist/core/highlight/lang-objectivec.js +24 -0
- package/dist/core/highlight/lang-perl.js +30 -0
- package/dist/core/highlight/lang-powershell.js +23 -0
- package/dist/core/highlight/lang-python.js +27 -0
- package/dist/core/highlight/lang-r.js +21 -0
- package/dist/core/highlight/lang-ruby.js +29 -0
- package/dist/core/highlight/lang-rust.js +24 -0
- package/dist/core/highlight/lang-scala.js +26 -0
- package/dist/core/highlight/lang-sql.js +21 -0
- package/dist/core/highlight/lang-svelte.js +27 -0
- package/dist/core/highlight/lang-swift.js +28 -0
- package/dist/core/highlight/lang-tsx.js +35 -0
- package/dist/core/highlight/lang-typescript.js +31 -0
- package/dist/core/highlight/lang-vue.js +29 -0
- package/dist/core/highlight/lang-wasm.js +22 -0
- package/dist/core/highlight/lang-xml.js +12 -0
- package/dist/core/highlight/lang-yaml.js +14 -0
- package/dist/core/highlight/registry.js +99 -0
- package/dist/core/logger/LoggerCore.js +626 -0
- package/dist/core/logger/index.js +10 -0
- package/dist/core/logger/types.js +29 -0
- package/dist/core/markdown/index.js +20 -0
- package/dist/core/markdown/parser.d.ts +2 -0
- package/dist/core/markdown/parser.d.ts.map +1 -1
- package/dist/core/markdown/parser.js +376 -0
- package/dist/core/markdown/plugins.js +608 -0
- package/dist/core/markdown/types.d.ts +5 -0
- package/dist/core/markdown/types.d.ts.map +1 -1
- package/dist/core/markdown/types.js +7 -0
- package/dist/core/router/index.js +244 -0
- package/dist/core/styles.js +44 -0
- package/dist/core/types.d.ts +50 -3
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2812 -1253
- package/dist/index.js.map +1 -1
- package/dist/index.umd.js +1670 -728
- package/dist/index.umd.js.map +1 -1
- package/dist/styles/aithe-ui.d.ts +23 -0
- package/dist/styles/aithe-ui.d.ts.map +1 -1
- package/dist/styles/aithe-ui.js +185 -0
- package/dist/styles/global.css.d.ts +1 -1
- package/dist/styles/global.css.d.ts.map +1 -1
- package/dist/styles/global.css.js +119 -0
- package/dist/styles/i18n/index.js +206 -0
- package/dist/styles/i18n/locales/de-DE.d.ts.map +1 -1
- package/dist/styles/i18n/locales/de-DE.js +148 -0
- package/dist/styles/i18n/locales/en-US.d.ts.map +1 -1
- package/dist/styles/i18n/locales/en-US.js +157 -0
- package/dist/styles/i18n/locales/es-ES.d.ts.map +1 -1
- package/dist/styles/i18n/locales/es-ES.js +148 -0
- package/dist/styles/i18n/locales/fr-FR.d.ts.map +1 -1
- package/dist/styles/i18n/locales/fr-FR.js +148 -0
- package/dist/styles/i18n/locales/index.js +14 -0
- package/dist/styles/i18n/locales/ja-JP.d.ts.map +1 -1
- package/dist/styles/i18n/locales/ja-JP.js +148 -0
- package/dist/styles/i18n/locales/ko-KR.d.ts.map +1 -1
- package/dist/styles/i18n/locales/ko-KR.js +148 -0
- package/dist/styles/i18n/locales/pt-BR.d.ts.map +1 -1
- package/dist/styles/i18n/locales/pt-BR.js +148 -0
- package/dist/styles/i18n/locales/zh-CN.d.ts.map +1 -1
- package/dist/styles/i18n/locales/zh-CN.js +157 -0
- package/dist/styles/i18n/locales/zh-HK.d.ts.map +1 -1
- package/dist/styles/i18n/locales/zh-HK.js +148 -0
- package/dist/styles/i18n/locales/zh-TW.d.ts.map +1 -1
- package/dist/styles/i18n/locales/zh-TW.js +148 -0
- package/dist/styles/layout/index.js +88 -0
- package/dist/styles/mixins.js +43 -0
- package/dist/styles/shadow/cyber.js +19 -0
- package/dist/styles/shadow/deep.js +19 -0
- package/dist/styles/shadow/diffuse.js +19 -0
- package/dist/styles/shadow/flat.js +19 -0
- package/dist/styles/shadow/glassmorphism.js +19 -0
- package/dist/styles/shadow/index.js +129 -0
- package/dist/styles/shadow/neumorphism.js +21 -0
- package/dist/styles/shadow/retro.js +19 -0
- package/dist/styles/shadow/sharp-business.js +19 -0
- package/dist/styles/shadow/skeuomorphic.js +21 -0
- package/dist/styles/shape/chamfer.js +19 -0
- package/dist/styles/shape/circle.js +19 -0
- package/dist/styles/shape/index.js +174 -0
- package/dist/styles/shape/organic.js +19 -0
- package/dist/styles/shape/pill.js +19 -0
- package/dist/styles/shape/rounded.js +21 -0
- package/dist/styles/shape/rounder.js +19 -0
- package/dist/styles/shape/sharp.js +19 -0
- package/dist/styles/shape/smooth.js +19 -0
- package/dist/styles/theme/aliyun.d.ts +1 -1
- package/dist/styles/theme/aliyun.d.ts.map +1 -1
- package/dist/styles/theme/aliyun.js +102 -0
- package/dist/styles/theme/amber.d.ts +1 -1
- package/dist/styles/theme/amber.d.ts.map +1 -1
- package/dist/styles/theme/amber.js +101 -0
- package/dist/styles/theme/blue.d.ts +1 -1
- package/dist/styles/theme/blue.d.ts.map +1 -1
- package/dist/styles/theme/blue.js +101 -0
- package/dist/styles/theme/charcoal.d.ts +1 -1
- package/dist/styles/theme/charcoal.d.ts.map +1 -1
- package/dist/styles/theme/charcoal.js +106 -0
- package/dist/styles/theme/cyan.d.ts +1 -1
- package/dist/styles/theme/cyan.d.ts.map +1 -1
- package/dist/styles/theme/cyan.js +96 -0
- package/dist/styles/theme/dark.d.ts +1 -1
- package/dist/styles/theme/dark.d.ts.map +1 -1
- package/dist/styles/theme/dark.js +106 -0
- package/dist/styles/theme/ebony.d.ts +1 -1
- package/dist/styles/theme/ebony.d.ts.map +1 -1
- package/dist/styles/theme/ebony.js +106 -0
- package/dist/styles/theme/festive.d.ts +1 -1
- package/dist/styles/theme/festive.d.ts.map +1 -1
- package/dist/styles/theme/festive.js +101 -0
- package/dist/styles/theme/graphite.d.ts +1 -1
- package/dist/styles/theme/graphite.d.ts.map +1 -1
- package/dist/styles/theme/graphite.js +106 -0
- package/dist/styles/theme/gray.d.ts +1 -1
- package/dist/styles/theme/gray.d.ts.map +1 -1
- package/dist/styles/theme/gray.js +101 -0
- package/dist/styles/theme/huawei.d.ts +1 -1
- package/dist/styles/theme/huawei.d.ts.map +1 -1
- package/dist/styles/theme/huawei.js +102 -0
- package/dist/styles/theme/index.d.ts +1 -1
- package/dist/styles/theme/index.d.ts.map +1 -1
- package/dist/styles/theme/index.js +276 -0
- package/dist/styles/theme/indigo.d.ts +1 -1
- package/dist/styles/theme/indigo.d.ts.map +1 -1
- package/dist/styles/theme/indigo.js +101 -0
- package/dist/styles/theme/ink.d.ts +1 -1
- package/dist/styles/theme/ink.d.ts.map +1 -1
- package/dist/styles/theme/ink.js +106 -0
- package/dist/styles/theme/light.d.ts +1 -1
- package/dist/styles/theme/light.d.ts.map +1 -1
- package/dist/styles/theme/light.js +102 -0
- package/dist/styles/theme/midnight.d.ts +1 -1
- package/dist/styles/theme/midnight.d.ts.map +1 -1
- package/dist/styles/theme/midnight.js +106 -0
- package/dist/styles/theme/navy.d.ts +1 -1
- package/dist/styles/theme/navy.d.ts.map +1 -1
- package/dist/styles/theme/navy.js +106 -0
- package/dist/styles/theme/obsidian.d.ts +1 -1
- package/dist/styles/theme/obsidian.d.ts.map +1 -1
- package/dist/styles/theme/obsidian.js +106 -0
- package/dist/styles/theme/onyx.d.ts +1 -1
- package/dist/styles/theme/onyx.d.ts.map +1 -1
- package/dist/styles/theme/onyx.js +106 -0
- package/dist/styles/theme/orange.d.ts +1 -1
- package/dist/styles/theme/orange.d.ts.map +1 -1
- package/dist/styles/theme/orange.js +101 -0
- package/dist/styles/theme/pink.d.ts +1 -1
- package/dist/styles/theme/pink.d.ts.map +1 -1
- package/dist/styles/theme/pink.js +101 -0
- package/dist/styles/theme/purple.d.ts +1 -1
- package/dist/styles/theme/purple.d.ts.map +1 -1
- package/dist/styles/theme/purple.js +101 -0
- package/dist/styles/theme/raisin.d.ts +1 -1
- package/dist/styles/theme/raisin.d.ts.map +1 -1
- package/dist/styles/theme/raisin.js +106 -0
- package/dist/styles/theme/slate.d.ts +1 -1
- package/dist/styles/theme/slate.d.ts.map +1 -1
- package/dist/styles/theme/slate.js +106 -0
- package/dist/styles/theme/teal.d.ts +1 -1
- package/dist/styles/theme/teal.d.ts.map +1 -1
- package/dist/styles/theme/teal.js +101 -0
- package/dist/styles/theme/tianyi.d.ts +1 -1
- package/dist/styles/theme/tianyi.d.ts.map +1 -1
- package/dist/styles/theme/tianyi.js +102 -0
- package/dist/styles/types.js +1 -0
- package/dist/styles/typo/business.js +34 -0
- package/dist/styles/typo/compact.js +34 -0
- package/dist/styles/typo/index.js +99 -0
- package/dist/styles/typo/luxury.js +34 -0
- package/dist/styles/typo/minimal.js +34 -0
- package/dist/types/index.js +2 -0
- package/dist/utils/dom.js +51 -0
- package/dist/utils/events.js +32 -0
- package/dist/utils/icon.js +176 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/utils.d.ts +5 -5
- package/dist/utils/utils.js +89 -0
- package/dist/utils/validation.js +52 -0
- package/docs/api/basic/button.md +9 -6
- package/docs/api/basic/tag.md +24 -17
- package/docs/api/data/box-table.md +73 -0
- package/docs/api/data/dropdown.md +3 -2
- package/docs/api/data/metrics.md +2 -0
- package/docs/api/data/table-column.md +37 -23
- package/docs/api/data/table.md +158 -44
- package/docs/api/data/tabs.md +46 -1
- package/docs/api/data/tree-menu.md +55 -2
- package/docs/api/display/box.md +66 -0
- package/docs/api/display/brief-box.md +73 -0
- package/docs/api/display/desc-item.md +57 -0
- package/docs/api/display/desc.md +204 -0
- package/docs/api/display/detail-box.md +75 -0
- package/docs/api/display/mini-box.md +100 -0
- package/docs/api/display/profile.md +92 -0
- package/docs/api/feedback/popover.md +10 -10
- package/docs/api/feedback/tooltip.md +14 -14
- package/docs/api/form/autoform-item.md +100 -0
- package/docs/api/form/autoform.md +4 -1
- package/docs/api/form/select.md +28 -28
- package/docs/api/framework/log-panel.md +46 -0
- package/docs/api/framework/sidebar.md +3 -2
- package/docs/api/summary.md +45 -35
- package/docs/api/theme/theme-switch.md +1 -1
- package/docs/autoform.md +13 -1
- package/docs/changelog/CHANGELOG.md +80 -0
- package/docs/changelog/VERSION_26.3.1.md +966 -0
- package/docs/datahub.md +1 -1
- package/docs/filter.md +332 -0
- package/docs/framework-integration.md +2 -2
- package/docs/guide.md +66 -1
- package/docs/i18n.md +2 -2
- package/docs/issue/issue_26.3.1.0.md +84 -0
- package/docs/issue/issue_26.3.1.1.md +72 -0
- package/docs/issue/issue_26.3.1.2.md +75 -0
- package/docs/issue/issue_26.3.1.3.md +78 -0
- package/docs/issue/issue_26.3.1.4.md +113 -0
- package/docs/issue/issue_26.3.1.5.md +142 -0
- package/docs/issue/issue_26.3.1.6.md +100 -0
- package/docs/issue/issue_26.3.1.7.md +78 -0
- package/docs/quickstart.md +5 -5
- package/package.json +5 -2
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file DataHubCore - 核心调度器 / Core Dispatcher
|
|
3
|
+
* @description DataHub 的核心引擎,负责请求的完整生命周期管理:
|
|
4
|
+
* 1. 合并配置 → 2. 解析策略 → 3. 生成 traceId → 4. 请求拦截
|
|
5
|
+
* → 5. 缓存检查 → 6. 去重/幂等 → 7. 适配器调用 → 8. 响应拦截
|
|
6
|
+
* → 9. 缓存写入 → 10. 错误处理 → 11. loading 状态管理
|
|
7
|
+
*
|
|
8
|
+
* 设计原则:
|
|
9
|
+
* - DataHub 只处理 HTTP 传输层,不关心业务协议
|
|
10
|
+
* - 业务协议(code/message/data 等)由使用者在外部自行解析
|
|
11
|
+
* - DataHubAdapterResponse.data 为原始 JSON,不做任何业务语义假设
|
|
12
|
+
* - 适配器完全可插拔,核心不依赖任何具体适配器实现
|
|
13
|
+
* - 策略自动识别,业务层无需关心缓存/去重/防重细节
|
|
14
|
+
* - 统一错误处理,仅处理传输层异常
|
|
15
|
+
*
|
|
16
|
+
* The core engine of DataHub, managing the complete request lifecycle.
|
|
17
|
+
*
|
|
18
|
+
* Design principles:
|
|
19
|
+
* - DataHub handles only the HTTP transport layer, not business protocols
|
|
20
|
+
* - Business protocols (code/message/data, etc.) are interpreted by the consumer externally
|
|
21
|
+
* - DataHubAdapterResponse.data is raw JSON with no assumed business semantics
|
|
22
|
+
* - Adapters are fully pluggable; the core depends on no specific adapter implementation
|
|
23
|
+
* - Strategy is auto-detected; the business layer need not worry about cache/dedup/idempotent details
|
|
24
|
+
* - Unified error handling, only for transport-layer exceptions
|
|
25
|
+
*/
|
|
26
|
+
import { DataHubError as DataHubErrorClass } from '../../datahub/types';
|
|
27
|
+
import { getBuiltinStyle, getBuiltinStyleNames } from './api-styles';
|
|
28
|
+
import { FetchAdapter } from './adapter/fetch-adapter';
|
|
29
|
+
import { MockAdapter } from './adapter/mock-adapter';
|
|
30
|
+
import { resolveStrategy } from '../../datahub/config/strategy';
|
|
31
|
+
import { cacheGet, cacheSet, cacheClear } from '../../datahub/utils/cache';
|
|
32
|
+
import { dedupTrack, dedupClear } from '../../datahub/utils/dedup';
|
|
33
|
+
import { loadingStart, loadingEnd, onLoadingChange, isLoading } from '../../datahub/utils/loading';
|
|
34
|
+
import { idempotentGuard, idempotentClear } from '../../datahub/utils/idempotent';
|
|
35
|
+
/** 默认配置项 / Default configuration values */
|
|
36
|
+
const DEFAULT_CONFIG = {
|
|
37
|
+
/** 默认超时 30 秒 / Default timeout 30s */
|
|
38
|
+
defaultTimeout: 30000,
|
|
39
|
+
/** 默认缓存有效期 60 秒 / Default cache TTL 60s */
|
|
40
|
+
defaultCacheTTL: 60_000,
|
|
41
|
+
/** 默认使用 fetch 适配器 / Default to fetch adapter */
|
|
42
|
+
defaultAdapter: 'fetch',
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* DataHubCore - 核心调度器 / Core Dispatcher
|
|
46
|
+
* @description 管理适配器注册、API 注册、请求调度及中间件编排。
|
|
47
|
+
* 返回 DataHubAdapterResponse<T>,其中 data 为原始 JSON 解析结果,
|
|
48
|
+
* 不包含任何业务协议假设。使用者自行解析业务结构。
|
|
49
|
+
* Manages adapter registration, API registration, request dispatch, and middleware orchestration.
|
|
50
|
+
* Returns DataHubAdapterResponse<T>, where data is raw JSON-parsed result
|
|
51
|
+
* without any business protocol assumptions. Consumers parse business structures themselves.
|
|
52
|
+
*/
|
|
53
|
+
export class DataHubCore {
|
|
54
|
+
/**
|
|
55
|
+
* @param config - 全局配置 / Global configuration
|
|
56
|
+
*/
|
|
57
|
+
constructor(config = {}) {
|
|
58
|
+
/** 已注册的适配器映射,键为适配器名称 / Registered adapter map, keyed by adapter name */
|
|
59
|
+
this.adapters = new Map();
|
|
60
|
+
// ─── Loading 状态代理 / Loading State Proxy ───────────────────
|
|
61
|
+
/** 订阅 loading 状态变更 / Subscribe to loading state changes */
|
|
62
|
+
this.onLoadingChange = onLoadingChange;
|
|
63
|
+
/** 查询指定 URL 是否正在加载 / Check if the specified URL is currently loading */
|
|
64
|
+
this.isLoading = isLoading;
|
|
65
|
+
this.config = config;
|
|
66
|
+
// APIStyle 默认为空,不处理业务协议
|
|
67
|
+
// APIStyle defaults to undefined — no business protocol handling
|
|
68
|
+
// 内置注册两个零依赖适配器 / Register two zero-dependency built-in adapters
|
|
69
|
+
this.registerAdapter(new FetchAdapter());
|
|
70
|
+
this.registerAdapter(new MockAdapter());
|
|
71
|
+
}
|
|
72
|
+
// ─── 适配器管理 / Adapter Management ──────────────────────────
|
|
73
|
+
/**
|
|
74
|
+
* 注册适配器 / Register an adapter
|
|
75
|
+
* @param adapter - 适配器实例,需实现 DataHubAdapter 接口 / Adapter instance implementing DataHubAdapter
|
|
76
|
+
* @throws 如果同名适配器已存在,静默覆盖 / Silently overwrites if an adapter with the same name already exists
|
|
77
|
+
*/
|
|
78
|
+
registerAdapter(adapter) {
|
|
79
|
+
this.adapters.set(adapter.name, adapter);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* 获取已注册的适配器 / Get a registered adapter by name
|
|
83
|
+
* @param name - 适配器名称 / Adapter name
|
|
84
|
+
* @returns 适配器实例,未找到返回 undefined / Adapter instance, or undefined if not found
|
|
85
|
+
*/
|
|
86
|
+
getAdapter(name) {
|
|
87
|
+
return this.adapters.get(name);
|
|
88
|
+
}
|
|
89
|
+
// ─── APIStyle 管理 / APIStyle Management ──────────────────────
|
|
90
|
+
/**
|
|
91
|
+
* 设置 APIStyle / Set APIStyle
|
|
92
|
+
* @param style - APIStyle 实例或内置风格名称("default" | "k8s")/ APIStyle instance or built-in style name
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* // 使用内置风格 / Use built-in style
|
|
96
|
+
* dataHub.setAPIStyle('k8s');
|
|
97
|
+
*
|
|
98
|
+
* @example
|
|
99
|
+
* // 使用自定义风格 / Use custom style
|
|
100
|
+
* dataHub.setAPIStyle({
|
|
101
|
+
* name: 'custom',
|
|
102
|
+
* onRequest(req) { ... },
|
|
103
|
+
* onResponse(res) { ... },
|
|
104
|
+
* });
|
|
105
|
+
*/
|
|
106
|
+
setAPIStyle(style) {
|
|
107
|
+
if (typeof style === 'string') {
|
|
108
|
+
const builtin = getBuiltinStyle(style);
|
|
109
|
+
if (!builtin) {
|
|
110
|
+
throw new DataHubErrorClass({
|
|
111
|
+
code: 'APIStyleNotFound',
|
|
112
|
+
message: `Built-in APIStyle "${style}" is not found. Available: ${getBuiltinStyleNames().join(', ')}`,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
this.apiStyle = builtin;
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
this.apiStyle = style;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* 获取当前 APIStyle / Get current APIStyle
|
|
123
|
+
* @returns 当前 APIStyle 实例 / Current APIStyle instance
|
|
124
|
+
*/
|
|
125
|
+
getAPIStyle() {
|
|
126
|
+
return this.apiStyle;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* 解析单次请求使用的 APIStyle:优先使用 options.apiStyle,否则回退到全局 this.apiStyle。
|
|
130
|
+
* 当 options.apiStyleRaw 为 true 时,返回 undefined 跳过 APIStyle 处理。
|
|
131
|
+
* Resolve the APIStyle for a single request: prefers options.apiStyle, falls back to this.apiStyle.
|
|
132
|
+
* Returns undefined when options.apiStyleRaw is true, skipping APIStyle processing.
|
|
133
|
+
*/
|
|
134
|
+
resolveRequestStyle(options) {
|
|
135
|
+
if (options.apiStyle) {
|
|
136
|
+
if (typeof options.apiStyle === 'string') {
|
|
137
|
+
return getBuiltinStyle(options.apiStyle);
|
|
138
|
+
}
|
|
139
|
+
return options.apiStyle;
|
|
140
|
+
}
|
|
141
|
+
return this.apiStyle;
|
|
142
|
+
}
|
|
143
|
+
// ─── 核心请求方法 / Core Request Method ───────────────────────
|
|
144
|
+
/**
|
|
145
|
+
* 统一请求入口 / Unified request entry point
|
|
146
|
+
* @param url - 请求地址(相对路径会自动拼接 baseURL)/ Request URL (relative paths are auto-prepended with baseURL)
|
|
147
|
+
* @param data - 请求体数据 / Request body data
|
|
148
|
+
* @param options - 请求配置项 / Request options
|
|
149
|
+
* @returns DataHubAdapterResponse<T>,包含原始 JSON 响应体,业务协议由使用者自行解析
|
|
150
|
+
* DataHubAdapterResponse<T> with raw JSON body — business protocol is interpreted by the consumer
|
|
151
|
+
*
|
|
152
|
+
* @example
|
|
153
|
+
* // 使用者自行定义业务协议 / Consumer defines their own business protocol
|
|
154
|
+
* interface BizResponse { code: string; message: string; data: unknown }
|
|
155
|
+
*
|
|
156
|
+
* const res = await dataHub.request('/order/query', { id: '1' });
|
|
157
|
+
* // res.ok — HTTP 是否成功 / whether HTTP succeeded
|
|
158
|
+
* // res.status — HTTP 状态码 / HTTP status code
|
|
159
|
+
* // res.data — 原始 JSON,由使用者按 BizResponse 自行解析 / raw JSON, interpreted by consumer as BizResponse
|
|
160
|
+
* const biz = res.data as BizResponse;
|
|
161
|
+
* if (biz.code === 'Ok') { /* handle success *\/ }
|
|
162
|
+
*/
|
|
163
|
+
async request(url, data, options) {
|
|
164
|
+
// 1. 合并默认配置与用户配置 / Merge default config with user config
|
|
165
|
+
const merged = this.mergeOptions(options);
|
|
166
|
+
// 2. 拼接完整 URL / Resolve full URL
|
|
167
|
+
const fullUrl = this.resolveUrl(url);
|
|
168
|
+
// 3. 根据 URL 自动识别策略 / Auto-detect strategy based on URL
|
|
169
|
+
const strategy = resolveStrategy(fullUrl);
|
|
170
|
+
// 4. 生成或使用 traceId / Generate or use existing traceId
|
|
171
|
+
const traceId = merged.traceId ?? this.generateTraceId();
|
|
172
|
+
// 将 traceId 写入配置,供适配器使用 / Write traceId into options for adapter usage
|
|
173
|
+
merged.traceId = traceId;
|
|
174
|
+
// 合并全局 headers 并透传 traceId 和 locale
|
|
175
|
+
// Merge global headers and propagate traceId and locale
|
|
176
|
+
const traceHeaderKey = this.config.traceHeaderKey ?? 'X-B3-TraceId';
|
|
177
|
+
const localeHeaderKey = this.config.localeHeaderKey ?? 'X-Locale';
|
|
178
|
+
merged.headers = {
|
|
179
|
+
...this.config.headers,
|
|
180
|
+
...merged.headers,
|
|
181
|
+
[traceHeaderKey]: traceId,
|
|
182
|
+
};
|
|
183
|
+
if (this.config.getLocale) {
|
|
184
|
+
merged.headers[localeHeaderKey] = this.config.getLocale();
|
|
185
|
+
}
|
|
186
|
+
// 使用 APIStyle 封装请求体数据 / Wrap request data using APIStyle
|
|
187
|
+
const req = { url: fullUrl, data, options: merged };
|
|
188
|
+
const requestStyle = this.resolveRequestStyle(merged);
|
|
189
|
+
requestStyle?.onRequest(req);
|
|
190
|
+
// 5. 请求拦截器 / Request interceptor
|
|
191
|
+
if (this.config.onRequest) {
|
|
192
|
+
const intercepted = this.config.onRequest(req);
|
|
193
|
+
if (intercepted)
|
|
194
|
+
Object.assign(req, intercepted);
|
|
195
|
+
}
|
|
196
|
+
// 6. 缓存检查:查询类请求且未跳过缓存时,尝试命中缓存
|
|
197
|
+
// Cache check: for query requests without skipCache, try to hit cache
|
|
198
|
+
if (strategy.cacheable && !merged.skipCache) {
|
|
199
|
+
const cached = cacheGet(fullUrl, data);
|
|
200
|
+
if (cached)
|
|
201
|
+
return cached;
|
|
202
|
+
}
|
|
203
|
+
// 实际执行请求的内部函数 / Internal function that actually executes the request
|
|
204
|
+
const execute = async () => {
|
|
205
|
+
// 标记 loading 开始 / Mark loading start
|
|
206
|
+
loadingStart(fullUrl);
|
|
207
|
+
try {
|
|
208
|
+
// 7. 解析并调用适配器 / Resolve and call adapter
|
|
209
|
+
const adapter = this.resolveAdapter(merged);
|
|
210
|
+
const res = await adapter.request(req);
|
|
211
|
+
// 8. 响应拦截器 / Response interceptor
|
|
212
|
+
if (this.config.onResponse) {
|
|
213
|
+
const intercepted = this.config.onResponse(res, req);
|
|
214
|
+
if (intercepted)
|
|
215
|
+
Object.assign(res, intercepted);
|
|
216
|
+
}
|
|
217
|
+
// 9. HTTP 传输层错误处理:HTTP 非 2xx 时,优先用 APIStyle 解析响应体
|
|
218
|
+
// HTTP transport error: when !res.ok, try APIStyle first, fall back to transport error
|
|
219
|
+
if (!res.ok) {
|
|
220
|
+
if (requestStyle) {
|
|
221
|
+
const result = requestStyle.onResponse(res);
|
|
222
|
+
throw new DataHubErrorClass({
|
|
223
|
+
code: result.code ?? `HTTP_${res.status}`,
|
|
224
|
+
message: result.message || `HTTP request failed with status ${res.status}`,
|
|
225
|
+
trace: traceId,
|
|
226
|
+
status: res.status,
|
|
227
|
+
url: fullUrl,
|
|
228
|
+
data: res.data,
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
throw this.createTransportError(res, traceId, fullUrl);
|
|
232
|
+
}
|
|
233
|
+
// 10. 使用 APIStyle 解析业务结果(code/message/data)
|
|
234
|
+
// Use APIStyle to parse business result (code/message/data)
|
|
235
|
+
if (requestStyle) {
|
|
236
|
+
const result = requestStyle.onResponse(res);
|
|
237
|
+
// 11. 业务错误处理:根据风格自定义的成功判断
|
|
238
|
+
// Business error handling: success check defined by the style
|
|
239
|
+
if (!requestStyle.isSuccess(result)) {
|
|
240
|
+
throw new DataHubErrorClass({
|
|
241
|
+
code: result.code,
|
|
242
|
+
message: result.message || `error: ${result.code}`,
|
|
243
|
+
trace: traceId,
|
|
244
|
+
status: res.status,
|
|
245
|
+
url: fullUrl,
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
// 缓存写入:查询类请求成功后写入缓存
|
|
249
|
+
// Cache write: write to cache after successful query request
|
|
250
|
+
if (strategy.cacheable && !merged.skipCache) {
|
|
251
|
+
const ttl = merged.cacheTTL ?? DEFAULT_CONFIG.defaultCacheTTL;
|
|
252
|
+
cacheSet(fullUrl, data, res, ttl);
|
|
253
|
+
}
|
|
254
|
+
// 返回时 data 替换为业务数据 / Replace data with business data in response
|
|
255
|
+
return { ...res, data: result.data };
|
|
256
|
+
}
|
|
257
|
+
// 缓存写入:查询类请求成功后写入缓存
|
|
258
|
+
// Cache write: write to cache after successful query request
|
|
259
|
+
if (strategy.cacheable && !merged.skipCache) {
|
|
260
|
+
const ttl = merged.cacheTTL ?? DEFAULT_CONFIG.defaultCacheTTL;
|
|
261
|
+
cacheSet(fullUrl, data, res, ttl);
|
|
262
|
+
}
|
|
263
|
+
// APIStyle 为空,直接返回原始响应 / No APIStyle, return raw response directly
|
|
264
|
+
return res;
|
|
265
|
+
}
|
|
266
|
+
catch (err) {
|
|
267
|
+
// 13. 统一错误处理:将各类异常转换为 DataHubError
|
|
268
|
+
// Unified error handling: convert all exceptions to DataHubError
|
|
269
|
+
const error = this.normalizeError(err, fullUrl, traceId);
|
|
270
|
+
if (this.config.onError) {
|
|
271
|
+
this.config.onError(error, req);
|
|
272
|
+
}
|
|
273
|
+
throw error;
|
|
274
|
+
}
|
|
275
|
+
finally {
|
|
276
|
+
// 无论成功失败,标记 loading 结束 / Mark loading end regardless of success or failure
|
|
277
|
+
loadingEnd(fullUrl);
|
|
278
|
+
}
|
|
279
|
+
};
|
|
280
|
+
// 12. 去重处理:查询类请求自动合并相同并发请求
|
|
281
|
+
// Dedup: automatically merge identical concurrent query requests
|
|
282
|
+
if (strategy.dedupable && !merged.skipDedup) {
|
|
283
|
+
return dedupTrack(fullUrl, data, execute);
|
|
284
|
+
}
|
|
285
|
+
// 13. 幂等防护:提交类请求阻止重复提交
|
|
286
|
+
// Idempotent guard: block duplicate submissions for submit requests
|
|
287
|
+
if (strategy.idempotent && !merged.skipIdempotent) {
|
|
288
|
+
return idempotentGuard(fullUrl, data, execute);
|
|
289
|
+
}
|
|
290
|
+
// 14. 无需中间件,直接执行 / No middleware needed, execute directly
|
|
291
|
+
return execute();
|
|
292
|
+
}
|
|
293
|
+
// ─── 状态清理方法 / State Cleanup Methods ─────────────────────
|
|
294
|
+
/** 清空所有缓存 / Clear all cache */
|
|
295
|
+
clearCache() {
|
|
296
|
+
cacheClear();
|
|
297
|
+
}
|
|
298
|
+
/** 清空所有去重记录 / Clear all dedup records */
|
|
299
|
+
clearDedup() {
|
|
300
|
+
dedupClear();
|
|
301
|
+
}
|
|
302
|
+
/** 清空所有幂等锁 / Clear all idempotent locks */
|
|
303
|
+
clearIdempotent() {
|
|
304
|
+
idempotentClear();
|
|
305
|
+
}
|
|
306
|
+
// ─── 配置修改方法 / Configuration Modification Methods ─────────
|
|
307
|
+
/**
|
|
308
|
+
* 设置请求拦截器 / Set request interceptor
|
|
309
|
+
*/
|
|
310
|
+
setRequestInterceptor(handler) {
|
|
311
|
+
this.config.onRequest = handler;
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* 设置响应拦截器 / Set response interceptor
|
|
315
|
+
*/
|
|
316
|
+
setResponseInterceptor(handler) {
|
|
317
|
+
this.config.onResponse = handler;
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* 设置全局错误回调 / Set global error handler
|
|
321
|
+
*/
|
|
322
|
+
setErrorHandler(handler) {
|
|
323
|
+
this.config.onError = handler;
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* 更新全局配置(合并方式) / Update global config (merge mode)
|
|
327
|
+
*/
|
|
328
|
+
updateConfig(config) {
|
|
329
|
+
this.config = { ...this.config, ...config };
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* 获取当前配置(只读副本) / Get current config (read-only copy)
|
|
333
|
+
*/
|
|
334
|
+
getConfig() {
|
|
335
|
+
return { ...this.config };
|
|
336
|
+
}
|
|
337
|
+
// ─── 私有方法 / Private Methods ───────────────────────────────
|
|
338
|
+
/**
|
|
339
|
+
* 解析适配器 / Resolve adapter
|
|
340
|
+
*/
|
|
341
|
+
resolveAdapter(options) {
|
|
342
|
+
if (this.config.forceMock || options.mock) {
|
|
343
|
+
return this.adapters.get('mock') ?? this.adapters.get(DEFAULT_CONFIG.defaultAdapter);
|
|
344
|
+
}
|
|
345
|
+
const name = options.adapter ?? this.config.defaultAdapter ?? DEFAULT_CONFIG.defaultAdapter;
|
|
346
|
+
const adapter = this.adapters.get(name);
|
|
347
|
+
if (!adapter) {
|
|
348
|
+
throw new DataHubErrorClass({
|
|
349
|
+
code: 'AdapterNotFound',
|
|
350
|
+
message: `Adapter "${name}" is not registered`,
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
return adapter;
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* 拼接完整 URL / Resolve full URL
|
|
357
|
+
*/
|
|
358
|
+
resolveUrl(url) {
|
|
359
|
+
if (this.config.baseURL && !url.startsWith('http')) {
|
|
360
|
+
let base = this.config.baseURL;
|
|
361
|
+
while (base.endsWith('/'))
|
|
362
|
+
base = base.slice(0, -1);
|
|
363
|
+
let path = url;
|
|
364
|
+
while (path.startsWith('/'))
|
|
365
|
+
path = path.slice(1);
|
|
366
|
+
return `${base}/${path}`;
|
|
367
|
+
}
|
|
368
|
+
return url;
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* 合并请求配置 / Merge request options
|
|
372
|
+
*/
|
|
373
|
+
mergeOptions(options) {
|
|
374
|
+
return {
|
|
375
|
+
timeout: DEFAULT_CONFIG.defaultTimeout,
|
|
376
|
+
cacheTTL: DEFAULT_CONFIG.defaultCacheTTL,
|
|
377
|
+
...options,
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* 生成 traceId / Generate traceId
|
|
382
|
+
*/
|
|
383
|
+
generateTraceId() {
|
|
384
|
+
if (this.config.generateTraceId)
|
|
385
|
+
return this.config.generateTraceId();
|
|
386
|
+
if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {
|
|
387
|
+
return crypto.randomUUID();
|
|
388
|
+
}
|
|
389
|
+
const timestamp = (typeof performance === 'undefined' ? Date.now() : performance.now()).toString(36);
|
|
390
|
+
const bytes = new Uint8Array(8);
|
|
391
|
+
if (typeof crypto !== 'undefined' && crypto.getRandomValues) {
|
|
392
|
+
crypto.getRandomValues(bytes);
|
|
393
|
+
}
|
|
394
|
+
const random = Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('');
|
|
395
|
+
return timestamp + random;
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* 根据 HTTP 传输层错误创建 DataHubError / Create DataHubError from HTTP transport error
|
|
399
|
+
*/
|
|
400
|
+
createTransportError(res, traceId, url) {
|
|
401
|
+
return new DataHubErrorClass({
|
|
402
|
+
code: `HTTP_${res.status}`,
|
|
403
|
+
message: `HTTP request failed with status ${res.status}`,
|
|
404
|
+
trace: traceId,
|
|
405
|
+
status: res.status,
|
|
406
|
+
url,
|
|
407
|
+
data: res.data,
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* 标准化错误:将各类异常统一转换为 DataHubError
|
|
412
|
+
* Normalize errors: convert all exception types to DataHubError uniformly
|
|
413
|
+
*/
|
|
414
|
+
normalizeError(err, url, traceId) {
|
|
415
|
+
if (err instanceof DataHubErrorClass)
|
|
416
|
+
return err;
|
|
417
|
+
if (err instanceof DOMException && err.name === 'AbortError') {
|
|
418
|
+
return new DataHubErrorClass({
|
|
419
|
+
code: 'RequestAborted',
|
|
420
|
+
message: 'Request was aborted',
|
|
421
|
+
trace: traceId,
|
|
422
|
+
url,
|
|
423
|
+
});
|
|
424
|
+
}
|
|
425
|
+
if (err instanceof TypeError) {
|
|
426
|
+
return new DataHubErrorClass({
|
|
427
|
+
code: 'NetworkError',
|
|
428
|
+
message: err.message ?? 'Network error',
|
|
429
|
+
trace: traceId,
|
|
430
|
+
url,
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
434
|
+
return new DataHubErrorClass({
|
|
435
|
+
code: 'UnknownError',
|
|
436
|
+
message,
|
|
437
|
+
trace: traceId,
|
|
438
|
+
url,
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file DataHub 数据中间层 — 对外出口 / DataHub Data Middleware — Public Exports
|
|
3
|
+
* @description 提供统一的导入入口,导出所有公开 API:
|
|
4
|
+
* - 核心类:DataHubCore
|
|
5
|
+
* - 内置适配器:FetchAdapter、MockAdapter
|
|
6
|
+
* - 类型定义:所有 interface / type / class
|
|
7
|
+
* - 工具函数:策略解析、缓存、去重、loading、幂等防护
|
|
8
|
+
* - 默认实例:default export(推荐使用默认实例或 new DataHubCore())
|
|
9
|
+
*
|
|
10
|
+
* Note: DataHub handles only the HTTP transport layer, not business protocols.
|
|
11
|
+
* DataHubAdapterResponse.data is raw JSON; business protocol is interpreted by the consumer.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* // 使用默认实例 / Use default instance
|
|
15
|
+
* import {dataHub} from './datahub';
|
|
16
|
+
* const res = await dataHub.request('/order/query', { id: '1' });
|
|
17
|
+
* // res.ok — HTTP 是否成功 / whether HTTP succeeded
|
|
18
|
+
* // res.data — 原始 JSON,由使用者自行解析业务协议 / raw JSON, consumer parses business protocol
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* // 创建独立实例 / Create isolated instance
|
|
22
|
+
* import { DataHubCore } from './datahub';
|
|
23
|
+
* const hub = new DataHubCore({ baseURL: '/api' });
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* // 扩展适配器 / Extend with custom adapter
|
|
27
|
+
* import { DataHubCore } from './datahub';
|
|
28
|
+
* const hub = new DataHubCore();
|
|
29
|
+
* hub.registerAdapter({ name: 'axios', async request(req) { ... } });
|
|
30
|
+
*/
|
|
31
|
+
// ─── 核心类 / Core Class ────────────────────────────────────────
|
|
32
|
+
export { DataHubCore } from './core';
|
|
33
|
+
// ─── 内置适配器 / Built-in Adapters ─────────────────────────────
|
|
34
|
+
export { FetchAdapter, MockAdapter } from './core/adapter';
|
|
35
|
+
export { getBuiltinStyle, getBuiltinStyleNames } from './core/api-styles';
|
|
36
|
+
// ─── 错误类导出 / Error Class Export ────────────────────────────
|
|
37
|
+
export { DataHubError } from './types';
|
|
38
|
+
// ─── 策略解析 / Strategy Resolution ─────────────────────────────
|
|
39
|
+
export { resolveStrategy } from './config/strategy';
|
|
40
|
+
// ─── 工具函数导出 / Utility Function Exports ────────────────────
|
|
41
|
+
export { isQueryAction, setQueryKeywords, getQueryKeywords } from './utils/is-query';
|
|
42
|
+
export { buildKey } from './utils/common';
|
|
43
|
+
export { cacheGet, cacheSet, cacheDelete, cacheClear } from './utils/cache';
|
|
44
|
+
export { dedupTrack, dedupClear } from './utils/dedup';
|
|
45
|
+
export { loadingStart, loadingEnd, isLoading, onLoadingChange } from './utils/loading';
|
|
46
|
+
export { idempotentGuard, idempotentClear } from './utils/idempotent';
|
|
47
|
+
// ─── 默认实例 / Default Instance ────────────────────────────────
|
|
48
|
+
import { DataHubCore } from './core';
|
|
49
|
+
/** 默认 DataHub 实例,开箱即用 / Default DataHub instance, ready to use out of the box */
|
|
50
|
+
export const dataHub = new DataHubCore();
|
|
@@ -78,6 +78,8 @@ export interface DataHubRequestOptions {
|
|
|
78
78
|
mock?: boolean;
|
|
79
79
|
/** Mock 返回的业务数据 / Mock business data to return */
|
|
80
80
|
mockData?: unknown;
|
|
81
|
+
/** Mock JSON 文件路径,用于加载本地 mock 数据文件 / Mock JSON file path for loading local mock data files */
|
|
82
|
+
mockPath?: string;
|
|
81
83
|
/** Mock 延迟时间(毫秒),模拟网络耗时,默认 300 / Mock delay in ms simulating network latency, default 300 */
|
|
82
84
|
mockDelay?: number;
|
|
83
85
|
/** 手动指定 traceId,不传则自动生成 / Manually specified traceId, auto-generated if omitted */
|
|
@@ -166,6 +168,8 @@ export interface DataHubErrorDetail {
|
|
|
166
168
|
status?: number;
|
|
167
169
|
/** 请求 URL / Request URL */
|
|
168
170
|
url?: string;
|
|
171
|
+
/** 原始响应体 / Raw response body */
|
|
172
|
+
data?: unknown;
|
|
169
173
|
}
|
|
170
174
|
/**
|
|
171
175
|
* DataHub 统一错误类 / DataHub Unified Error Class
|
|
@@ -184,6 +188,8 @@ export declare class DataHubError extends Error {
|
|
|
184
188
|
readonly status?: number;
|
|
185
189
|
/** 请求 URL / Request URL */
|
|
186
190
|
readonly url?: string;
|
|
191
|
+
/** 原始响应体 / Raw response body */
|
|
192
|
+
readonly data?: unknown;
|
|
187
193
|
constructor(detail: DataHubErrorDetail);
|
|
188
194
|
}
|
|
189
195
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/datahub/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/datahub/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file DataHub 类型定义 / DataHub Type Definitions
|
|
3
|
+
* @description 定义 DataHub 数据中间层的所有标准类型,包括 APIStyle 业务协议相关类型。
|
|
4
|
+
*
|
|
5
|
+
* 核心设计原则:
|
|
6
|
+
* - DataHub 只负责 HTTP 传输层(请求/响应),不关心业务协议
|
|
7
|
+
* - 业务协议(如 code/message/data 结构)由 APIStyle 封装
|
|
8
|
+
* - 适配器只做 JSON 解析,不做业务语义判断
|
|
9
|
+
*
|
|
10
|
+
* Defines all standard types for the DataHub middleware layer,
|
|
11
|
+
* including APIStyle business protocol types.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* DataHub 统一错误类 / DataHub Unified Error Class
|
|
15
|
+
* @description 封装网络错误、中断错误、HTTP 错误等,提供统一的错误结构。
|
|
16
|
+
* 包含错误码、链路追踪 ID、HTTP 状态码和请求 URL 等信息。
|
|
17
|
+
* Encapsulates network errors, abort errors, HTTP errors, etc.,
|
|
18
|
+
* providing a unified error structure with error code, trace ID,
|
|
19
|
+
* HTTP status code, and request URL.
|
|
20
|
+
*/
|
|
21
|
+
export class DataHubError extends Error {
|
|
22
|
+
constructor(detail) {
|
|
23
|
+
super(detail.message);
|
|
24
|
+
this.name = 'DataHubError';
|
|
25
|
+
this.code = detail.code;
|
|
26
|
+
this.trace = detail.trace;
|
|
27
|
+
this.status = detail.status;
|
|
28
|
+
this.url = detail.url;
|
|
29
|
+
this.data = detail.data;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file 内存缓存工具 / In-Memory Cache Utility
|
|
3
|
+
* @description 为查询类请求提供基于 TTL(Time-To-Live)的内存缓存。
|
|
4
|
+
* 缓存键由 URL + 请求数据序列化生成,确保相同参数命中同一缓存。
|
|
5
|
+
* 过期条目在读取时惰性删除,无需定时清理。
|
|
6
|
+
* Provides TTL (Time-To-Live) based in-memory caching for query requests.
|
|
7
|
+
* Cache keys are generated from URL + serialized request data, ensuring identical
|
|
8
|
+
* parameters hit the same cache entry. Expired entries are lazily evicted on read,
|
|
9
|
+
* requiring no periodic cleanup.
|
|
10
|
+
*/
|
|
11
|
+
import { buildKey } from './common';
|
|
12
|
+
/** 内存缓存存储,键为 "url::data" 序列化字符串 / In-memory store, keyed by "url::data" serialized string */
|
|
13
|
+
const store = new Map();
|
|
14
|
+
/**
|
|
15
|
+
* 读取缓存 / Read from cache
|
|
16
|
+
* @param url - 请求地址 / Request URL
|
|
17
|
+
* @param data - 请求体数据 / Request body data
|
|
18
|
+
* @returns 缓存命中返回数据,未命中或已过期返回 null / Cached data on hit, null on miss or expiration
|
|
19
|
+
*/
|
|
20
|
+
export function cacheGet(url, data) {
|
|
21
|
+
const key = buildKey(url, data);
|
|
22
|
+
const entry = store.get(key);
|
|
23
|
+
if (!entry)
|
|
24
|
+
return null;
|
|
25
|
+
// 惰性删除:已过期的条目在读取时清除 / Lazy eviction: expired entries are removed on read
|
|
26
|
+
if (Date.now() > entry.expireAt) {
|
|
27
|
+
store.delete(key);
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
return entry.data;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* 写入缓存 / Write to cache
|
|
34
|
+
* @param url - 请求地址 / Request URL
|
|
35
|
+
* @param data - 请求体数据 / Request body data
|
|
36
|
+
* @param value - 要缓存的数据 / Data to cache
|
|
37
|
+
* @param ttl - 缓存有效期(毫秒)/ Cache TTL in milliseconds
|
|
38
|
+
*/
|
|
39
|
+
export function cacheSet(url, data, value, ttl) {
|
|
40
|
+
const key = buildKey(url, data);
|
|
41
|
+
store.set(key, { data: value, expireAt: Date.now() + ttl });
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* 删除指定缓存条目 / Delete a specific cache entry
|
|
45
|
+
* @param url - 请求地址 / Request URL
|
|
46
|
+
* @param data - 请求体数据 / Request body data
|
|
47
|
+
* @returns 是否成功删除 / Whether the entry was successfully deleted
|
|
48
|
+
*/
|
|
49
|
+
export function cacheDelete(url, data) {
|
|
50
|
+
return store.delete(buildKey(url, data));
|
|
51
|
+
}
|
|
52
|
+
/** 清空所有缓存 / Clear all cache entries */
|
|
53
|
+
export function cacheClear() {
|
|
54
|
+
store.clear();
|
|
55
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file 公共工具函数 / Common Utility Functions
|
|
3
|
+
* @description 提供 DataHub 内部各模块共享的工具函数,
|
|
4
|
+
* 避免在 cache、dedup、idempotent 等模块中重复实现。
|
|
5
|
+
* 当前提供 buildKey 函数,用于生成标准化的缓存/去重/幂等键。
|
|
6
|
+
* Provides shared utility functions for DataHub internal modules,
|
|
7
|
+
* avoiding duplicate implementations across cache, dedup, idempotent, etc.
|
|
8
|
+
* Currently provides buildKey for generating standardized cache/dedup/idempotent keys.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* 生成标准化的键 / Generate a standardized key
|
|
12
|
+
* @param url - 请求地址 / Request URL
|
|
13
|
+
* @param data - 请求体数据 / Request body data
|
|
14
|
+
* @returns 唯一键,格式为 "url::JSON(data)" / Unique key in format "url::JSON(data)"
|
|
15
|
+
* @description 用于缓存、去重、幂等防护等模块的键生成,
|
|
16
|
+
* 确保相同 URL + 相同数据命中同一键。
|
|
17
|
+
* Used for key generation in cache, dedup, idempotent guard modules,
|
|
18
|
+
* ensuring identical URL + data hit the same key.
|
|
19
|
+
*/
|
|
20
|
+
export function buildKey(url, data) {
|
|
21
|
+
const serialized = data === undefined ? 'null' : JSON.stringify(data);
|
|
22
|
+
return `${url}::${serialized}`;
|
|
23
|
+
}
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
* ]);
|
|
23
23
|
* // r1 === r2,共享同一结果 / r1 === r2, sharing the same result
|
|
24
24
|
*/
|
|
25
|
-
export declare function dedupTrack<T>(url: string, data: unknown
|
|
25
|
+
export declare function dedupTrack<T>(url: string, data: unknown, factory: () => Promise<T>): Promise<T>;
|
|
26
26
|
/** 清空所有去重记录(一般用于测试或重置状态)/ Clear all dedup records (typically for testing or state reset) */
|
|
27
27
|
export declare function dedupClear(): void;
|
|
28
28
|
//# sourceMappingURL=dedup.d.ts.map
|