@e-xi/xion 0.0.6
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 +1 -0
- package/dist/bin/icon-generator.d.ts +22 -0
- package/dist/bin/index.d.ts +5 -0
- package/dist/bin/index.js +92 -0
- package/dist/bin/logo-generator.d.ts +22 -0
- package/dist/chunk-files/chunk-34OODP7M.js +147 -0
- package/dist/chunk-files/chunk-3KBZWBNP.js +51 -0
- package/dist/chunk-files/chunk-3R6EJDYR.js +10 -0
- package/dist/chunk-files/chunk-3RVKOFMP.js +68 -0
- package/dist/chunk-files/chunk-3S5OTD47.js +35 -0
- package/dist/chunk-files/chunk-3XB4IEWO.js +195 -0
- package/dist/chunk-files/chunk-3XOVD6UX.js +8 -0
- package/dist/chunk-files/chunk-4HEDNQUP.js +426 -0
- package/dist/chunk-files/chunk-4SSGMLEE.js +934 -0
- package/dist/chunk-files/chunk-5PKWVAQP.js +92 -0
- package/dist/chunk-files/chunk-6BOPFOZD.js +19 -0
- package/dist/chunk-files/chunk-6FDO72PN.js +25 -0
- package/dist/chunk-files/chunk-6X74EPRM.js +0 -0
- package/dist/chunk-files/chunk-B2FI5WI5.js +67 -0
- package/dist/chunk-files/chunk-B7DTBTWQ.js +74 -0
- package/dist/chunk-files/chunk-BFD2LHLK.js +60 -0
- package/dist/chunk-files/chunk-BJOPQNB2.js +319 -0
- package/dist/chunk-files/chunk-BMOLIJ3W.js +89 -0
- package/dist/chunk-files/chunk-BPTFUGTP.js +97 -0
- package/dist/chunk-files/chunk-CSUNGWAE.js +405 -0
- package/dist/chunk-files/chunk-D5ZV4VMI.js +627 -0
- package/dist/chunk-files/chunk-DD6WZ4NY.js +841 -0
- package/dist/chunk-files/chunk-DEODEAKM.js +19 -0
- package/dist/chunk-files/chunk-DRMV3M5V.js +1970 -0
- package/dist/chunk-files/chunk-EQTU45UO.js +21 -0
- package/dist/chunk-files/chunk-F7YTK2MY.js +154 -0
- package/dist/chunk-files/chunk-FMQTZ3QV.js +17 -0
- package/dist/chunk-files/chunk-FPN7JYR4.js +67 -0
- package/dist/chunk-files/chunk-FULHNQ4O.js +1243 -0
- package/dist/chunk-files/chunk-GN2FNR3Z.js +259 -0
- package/dist/chunk-files/chunk-GROGDGEL.js +177 -0
- package/dist/chunk-files/chunk-GUOSVDXA.js +34 -0
- package/dist/chunk-files/chunk-HT5V5A7S.js +6 -0
- package/dist/chunk-files/chunk-ID3YDA2K.js +19 -0
- package/dist/chunk-files/chunk-IH3R2NDR.js +230 -0
- package/dist/chunk-files/chunk-IMGYTSWY.js +261 -0
- package/dist/chunk-files/chunk-J34MOWJP.js +26 -0
- package/dist/chunk-files/chunk-KFK47PDH.js +77 -0
- package/dist/chunk-files/chunk-KFV4GXVE.js +11 -0
- package/dist/chunk-files/chunk-LFHJJQW3.js +723 -0
- package/dist/chunk-files/chunk-LQ67F6EY.js +32 -0
- package/dist/chunk-files/chunk-MJ6Q3TIX.js +703 -0
- package/dist/chunk-files/chunk-OUFO3LM4.js +135 -0
- package/dist/chunk-files/chunk-P4CX6I4J.js +14 -0
- package/dist/chunk-files/chunk-PL5KNBCY.js +78 -0
- package/dist/chunk-files/chunk-PVWRRUOK.js +11 -0
- package/dist/chunk-files/chunk-Q7LCZIQP.js +15 -0
- package/dist/chunk-files/chunk-Q7YMMN7J.js +220 -0
- package/dist/chunk-files/chunk-RAVPJRBA.js +118 -0
- package/dist/chunk-files/chunk-RN7AI33H.js +26 -0
- package/dist/chunk-files/chunk-RODB64YF.js +148 -0
- package/dist/chunk-files/chunk-SVTZ4T6S.js +10 -0
- package/dist/chunk-files/chunk-T3QCAOCO.js +20 -0
- package/dist/chunk-files/chunk-U4XEWVBH.js +19 -0
- package/dist/chunk-files/chunk-UCMR6V67.js +746 -0
- package/dist/chunk-files/chunk-UFYEZIUE.js +1269 -0
- package/dist/chunk-files/chunk-UIJUY7QZ.js +18 -0
- package/dist/chunk-files/chunk-VGDNICVG.js +67 -0
- package/dist/chunk-files/chunk-W2I3I7U7.js +35 -0
- package/dist/chunk-files/chunk-WGYOMA43.js +33 -0
- package/dist/chunk-files/chunk-WKVLVI6N.js +44 -0
- package/dist/chunk-files/chunk-WOJ2UKI7.js +11 -0
- package/dist/chunk-files/chunk-Y3OEXVQ2.js +59 -0
- package/dist/chunk-files/chunk-YLZRRUY7.js +6 -0
- package/dist/chunk-files/chunk-YTHS2ZV7.js +51 -0
- package/dist/chunk-files/chunk-YXAEUJKJ.js +331 -0
- package/dist/chunk-files/chunk-YZOJOLFL.js +121 -0
- package/dist/main/app/app-lifecycle-abstract.d.ts +190 -0
- package/dist/main/app/app-lifecycle.d.ts +7 -0
- package/dist/main/app/icons/icon.ico +0 -0
- package/dist/main/app/index.d.ts +8 -0
- package/dist/main/app/index.js +1226 -0
- package/dist/main/app/types/app.d.ts +74 -0
- package/dist/main/app/xo-app-abstract.d.ts +464 -0
- package/dist/main/app/xo-app.d.ts +23 -0
- package/dist/main/auth/index.d.ts +8 -0
- package/dist/main/auth/index.js +109 -0
- package/dist/main/auth/jwt-auth-manager.d.ts +302 -0
- package/dist/main/auth/jwt-auth-provider-abstract.d.ts +100 -0
- package/dist/main/auth/jwt-auth-refresh-rejected-error.d.ts +12 -0
- package/dist/main/auth/jwt-auth-session-changed-error.d.ts +12 -0
- package/dist/main/auth/types/jwt-auth-manager.d.ts +13 -0
- package/dist/main/banner/banner-abstract.d.ts +38 -0
- package/dist/main/banner/banner-manager.d.ts +20 -0
- package/dist/main/banner/index.d.ts +6 -0
- package/dist/main/banner/index.js +10 -0
- package/dist/main/banner/types/banner.d.ts +17 -0
- package/dist/main/config/app-config.d.ts +6 -0
- package/dist/main/config/index.d.ts +13 -0
- package/dist/main/config/index.js +33 -0
- package/dist/main/config/logger-config.d.ts +6 -0
- package/dist/main/config/remote-service-config.d.ts +6 -0
- package/dist/main/config/tray-config.d.ts +6 -0
- package/dist/main/config/types/app.d.ts +38 -0
- package/dist/main/config/types/logger.d.ts +82 -0
- package/dist/main/config/types/window.d.ts +35 -0
- package/dist/main/config/updater-config.d.ts +6 -0
- package/dist/main/config/window/main-window-config.d.ts +6 -0
- package/dist/main/config/window/setting-window-config.d.ts +6 -0
- package/dist/main/file-association/file-association-handlers-abstract.d.ts +23 -0
- package/dist/main/file-association/file-association-manager-abstract.d.ts +87 -0
- package/dist/main/file-association/file-association-manager.d.ts +13 -0
- package/dist/main/file-association/handlers/app-file-association-handlers.d.ts +12 -0
- package/dist/main/file-association/index.d.ts +8 -0
- package/dist/main/file-association/index.js +13 -0
- package/dist/main/file-association/types/file-association.d.ts +31 -0
- package/dist/main/ipc/handlers/app-handlers.d.ts +13 -0
- package/dist/main/ipc/handlers/auth-handlers.d.ts +12 -0
- package/dist/main/ipc/handlers/clipboard-handlers.d.ts +13 -0
- package/dist/main/ipc/handlers/contex-menu-handlers.d.ts +13 -0
- package/dist/main/ipc/handlers/dialog-handlers.d.ts +13 -0
- package/dist/main/ipc/handlers/file-handlers.d.ts +13 -0
- package/dist/main/ipc/handlers/log-handlers.d.ts +45 -0
- package/dist/main/ipc/handlers/remote-service-handlers.d.ts +13 -0
- package/dist/main/ipc/handlers/shell-handlers.d.ts +13 -0
- package/dist/main/ipc/handlers/theme-handlers.d.ts +13 -0
- package/dist/main/ipc/handlers/updater-handlers.d.ts +13 -0
- package/dist/main/ipc/handlers/window-handlers.d.ts +13 -0
- package/dist/main/ipc/index.d.ts +20 -0
- package/dist/main/ipc/index.js +60 -0
- package/dist/main/ipc/ipc-handlers-abstract.d.ts +23 -0
- package/dist/main/ipc/ipc-manager-abstract.d.ts +46 -0
- package/dist/main/ipc/ipc-manager.d.ts +13 -0
- package/dist/main/ipc/types/ipc-handler.d.ts +22 -0
- package/dist/main/ipc/utils/ipc-handler-util.d.ts +24 -0
- package/dist/main/logger/index.d.ts +4 -0
- package/dist/main/logger/index.js +13 -0
- package/dist/main/logger/xo-logger.d.ts +113 -0
- package/dist/main/menu/consts/menu-type.d.ts +1 -0
- package/dist/main/menu/index.d.ts +8 -0
- package/dist/main/menu/index.js +28 -0
- package/dist/main/menu/menu-items.d.ts +192 -0
- package/dist/main/menu/menu-manager-abstract.d.ts +273 -0
- package/dist/main/menu/menu-manager.d.ts +12 -0
- package/dist/main/menu/types/menu.d.ts +101 -0
- package/dist/main/mode/app-mode.d.ts +32 -0
- package/dist/main/mode/index.d.ts +5 -0
- package/dist/main/mode/index.js +9 -0
- package/dist/main/mode/types/mode.d.ts +25 -0
- package/dist/main/protocol/consts/protocol-keys.d.ts +10 -0
- package/dist/main/protocol/handlers/app-protocol-handlers.d.ts +12 -0
- package/dist/main/protocol/index.d.ts +9 -0
- package/dist/main/protocol/index.js +15 -0
- package/dist/main/protocol/protocol-handlers-abstract.d.ts +23 -0
- package/dist/main/protocol/protocol-manager-abstract.d.ts +85 -0
- package/dist/main/protocol/protocol-manager.d.ts +13 -0
- package/dist/main/protocol/types/protocol.d.ts +33 -0
- package/dist/main/remote-service/consts/remote-service-methods.d.ts +5 -0
- package/dist/main/remote-service/index.d.ts +7 -0
- package/dist/main/remote-service/index.js +17 -0
- package/dist/main/remote-service/remote-service-manager-abstract.d.ts +303 -0
- package/dist/main/remote-service/remote-service-manager.d.ts +7 -0
- package/dist/main/remote-service/types/remote-service.d.ts +9 -0
- package/dist/main/renderer-protocol/handlers/renderer-remote-service-protocol-handlers.d.ts +130 -0
- package/dist/main/renderer-protocol/handlers/renderer-root-protocol-handlers.d.ts +65 -0
- package/dist/main/renderer-protocol/index.d.ts +9 -0
- package/dist/main/renderer-protocol/index.js +18 -0
- package/dist/main/renderer-protocol/renderer-protocol-handlers-abstract.d.ts +23 -0
- package/dist/main/renderer-protocol/renderer-protocol-manager-abstract.d.ts +78 -0
- package/dist/main/renderer-protocol/renderer-protocol-manager.d.ts +13 -0
- package/dist/main/renderer-protocol/types/renderer-protocol.d.ts +34 -0
- package/dist/main/shortcut/handlers/app-shortcut-handlers.d.ts +11 -0
- package/dist/main/shortcut/handlers/window-shortcut-handlers.d.ts +11 -0
- package/dist/main/shortcut/index.d.ts +9 -0
- package/dist/main/shortcut/index.js +17 -0
- package/dist/main/shortcut/shortcut-handlers-abstract.d.ts +18 -0
- package/dist/main/shortcut/shortcut-manager-abstract.d.ts +121 -0
- package/dist/main/shortcut/shortcut-manager.d.ts +12 -0
- package/dist/main/shortcut/types/shortcut.d.ts +50 -0
- package/dist/main/store/app-store.d.ts +179 -0
- package/dist/main/store/index.d.ts +7 -0
- package/dist/main/store/index.js +13 -0
- package/dist/main/store/jwt-auth-store.d.ts +36 -0
- package/dist/main/store/types/app-store.d.ts +46 -0
- package/dist/main/store/types/jwt-auth-store.d.ts +14 -0
- package/dist/main/theme/consts/theme-sources.d.ts +10 -0
- package/dist/main/theme/index.d.ts +7 -0
- package/dist/main/theme/index.js +16 -0
- package/dist/main/theme/theme-manager-abstract.d.ts +93 -0
- package/dist/main/theme/theme-manager.d.ts +7 -0
- package/dist/main/theme/types/theme.d.ts +38 -0
- package/dist/main/tray/consts/tray-animation-name.d.ts +1 -0
- package/dist/main/tray/consts/tray-icon-name.d.ts +1 -0
- package/dist/main/tray/icons/blur.ico +0 -0
- package/dist/main/tray/icons/error.ico +0 -0
- package/dist/main/tray/icons/focus.ico +0 -0
- package/dist/main/tray/icons/none.ico +0 -0
- package/dist/main/tray/icons/offline.ico +0 -0
- package/dist/main/tray/icons/online.ico +0 -0
- package/dist/main/tray/icons/success.ico +0 -0
- package/dist/main/tray/index.d.ts +11 -0
- package/dist/main/tray/index.js +27 -0
- package/dist/main/tray/tray-animation.d.ts +48 -0
- package/dist/main/tray/tray-icon.d.ts +51 -0
- package/dist/main/tray/tray-lifecycle-abstract.d.ts +154 -0
- package/dist/main/tray/tray-lifecycle.d.ts +7 -0
- package/dist/main/tray/tray-manager.d.ts +173 -0
- package/dist/main/tray/types/tray.d.ts +81 -0
- package/dist/main/updater/dev-app-update.yml +5 -0
- package/dist/main/updater/index.d.ts +6 -0
- package/dist/main/updater/index.js +20 -0
- package/dist/main/updater/types/updater.d.ts +167 -0
- package/dist/main/updater/updater-manager-abstract.d.ts +237 -0
- package/dist/main/updater/updater-manager.d.ts +7 -0
- package/dist/main/utils/file-association-util.d.ts +43 -0
- package/dist/main/utils/index.d.ts +14 -0
- package/dist/main/utils/index.js +105 -0
- package/dist/main/utils/menu-util.d.ts +12 -0
- package/dist/main/utils/protocol-util.d.ts +49 -0
- package/dist/main/utils/runtime-config-util.d.ts +75 -0
- package/dist/main/utils/shortcut-util.d.ts +38 -0
- package/dist/main/utils/tray-util.d.ts +18 -0
- package/dist/main/utils/window-util.d.ts +55 -0
- package/dist/main/utils/xo-app-root-util.d.ts +30 -0
- package/dist/main/utils/xo-app-util.d.ts +24 -0
- package/dist/main/utils/xo-path-util.d.ts +59 -0
- package/dist/main/utils/xo-util.d.ts +17 -0
- package/dist/main/window/index.d.ts +10 -0
- package/dist/main/window/index.js +36 -0
- package/dist/main/window/main/main-window-lifecycle.d.ts +7 -0
- package/dist/main/window/main/main-window-type.d.ts +5 -0
- package/dist/main/window/setting/setting-window-lifecycle.d.ts +7 -0
- package/dist/main/window/setting/setting-window-type.d.ts +5 -0
- package/dist/main/window/types/window.d.ts +86 -0
- package/dist/main/window/window-lifecycle-abstract.d.ts +514 -0
- package/dist/main/window/window-manager.d.ts +422 -0
- package/dist/preload/bridge/bridge-abstract.d.ts +11 -0
- package/dist/preload/bridge/bridge.d.ts +35 -0
- package/dist/preload/bridge/index.d.ts +6 -0
- package/dist/preload/bridge/index.js +117 -0
- package/dist/preload/bridge/preload.cjs +1706 -0
- package/dist/preload/bridge/preload.internal.d.ts +1 -0
- package/dist/preload/bridge/types/bridge.d.ts +19 -0
- package/dist/preload/bridges/app/app-bridge.d.ts +142 -0
- package/dist/preload/bridges/app/types/app.d.ts +65 -0
- package/dist/preload/bridges/auth/auth-bridge.d.ts +36 -0
- package/dist/preload/bridges/auth/types/auth.d.ts +23 -0
- package/dist/preload/bridges/clipboard/clipboard-bridge.d.ts +37 -0
- package/dist/preload/bridges/clipboard/types/clipboard.d.ts +23 -0
- package/dist/preload/bridges/context-menu/context-menu-bridge.d.ts +27 -0
- package/dist/preload/bridges/context-menu/types/context-menu.d.ts +19 -0
- package/dist/preload/bridges/dialog/dialog-bridge.d.ts +30 -0
- package/dist/preload/bridges/dialog/types/dialog.d.ts +41 -0
- package/dist/preload/bridges/file/file-bridge.d.ts +34 -0
- package/dist/preload/bridges/file/types/file.d.ts +21 -0
- package/dist/preload/bridges/index.d.ts +29 -0
- package/dist/preload/bridges/index.js +40 -0
- package/dist/preload/bridges/ipc/ipc-bridge.d.ts +43 -0
- package/dist/preload/bridges/ipc/types/ipc.d.ts +23 -0
- package/dist/preload/bridges/log/log-bridge.d.ts +52 -0
- package/dist/preload/bridges/log/types/log.d.ts +20 -0
- package/dist/preload/bridges/remote-service/remote-service-bridge.d.ts +55 -0
- package/dist/preload/bridges/remote-service/types/remote-service.d.ts +29 -0
- package/dist/preload/bridges/shell/shell-bridge.d.ts +27 -0
- package/dist/preload/bridges/shell/types/shell.d.ts +19 -0
- package/dist/preload/bridges/theme/theme-bridge.d.ts +32 -0
- package/dist/preload/bridges/theme/types/theme.d.ts +21 -0
- package/dist/preload/bridges/updater/types/updater.d.ts +35 -0
- package/dist/preload/bridges/updater/updater-bridge.d.ts +66 -0
- package/dist/preload/bridges/window/internal/route-redirect-buffer.d.ts +36 -0
- package/dist/preload/bridges/window/types/window.d.ts +53 -0
- package/dist/preload/bridges/window/window-bridge.d.ts +118 -0
- package/dist/preload/utils/bridge-util.d.ts +43 -0
- package/dist/preload/utils/index.d.ts +4 -0
- package/dist/preload/utils/index.js +7 -0
- package/dist/renderer/app/bootstrap-renderer.d.ts +6 -0
- package/dist/renderer/app/index.d.ts +5 -0
- package/dist/renderer/app/index.js +164 -0
- package/dist/renderer/app/styles-element-plus.internal.d.ts +2 -0
- package/dist/renderer/app/styles-xion.internal.d.ts +2 -0
- package/dist/renderer/app/types/app.d.ts +51 -0
- package/dist/renderer/components/captcha/internal/captcha-controller.d.ts +280 -0
- package/dist/renderer/components/captcha/internal/captcha-css-property.d.ts +25 -0
- package/dist/renderer/components/captcha/internal/captcha-defaults.d.ts +33 -0
- package/dist/renderer/components/captcha/internal/captcha-errors.d.ts +21 -0
- package/dist/renderer/components/captcha/internal/captcha-helper.d.ts +72 -0
- package/dist/renderer/components/captcha/internal/captcha-injector.d.ts +16 -0
- package/dist/renderer/components/captcha/internal/captcha-runtime-types.d.ts +153 -0
- package/dist/renderer/components/captcha/internal/captcha-service.d.ts +22 -0
- package/dist/renderer/components/captcha/internal/captcha-slide-types.d.ts +62 -0
- package/dist/renderer/components/captcha/internal/captcha-ui-patch.d.ts +43 -0
- package/dist/renderer/components/captcha/internal/captcha-wasm-loader.d.ts +36 -0
- package/dist/renderer/components/captcha/style/index.less +132 -0
- package/dist/renderer/components/captcha/types/captcha.d.ts +132 -0
- package/dist/renderer/components/captcha/xo-captcha-host.vue +151 -0
- package/dist/renderer/components/captcha/xo-captcha.vue +83 -0
- package/dist/renderer/components/captcha.d.ts +40 -0
- package/dist/renderer/components/context-menu/types/context-menu.d.ts +55 -0
- package/dist/renderer/components/context-menu/xo-context-menu-items.vue +112 -0
- package/dist/renderer/components/context-menu/xo-context-menu.vue +356 -0
- package/dist/renderer/components/context-menu.d.ts +32 -0
- package/dist/renderer/components/divider/types/divider.d.ts +31 -0
- package/dist/renderer/components/divider/xo-divider.vue +176 -0
- package/dist/renderer/components/form/types/form-flex-row.d.ts +21 -0
- package/dist/renderer/components/form/types/form-flex.d.ts +49 -0
- package/dist/renderer/components/form/xo-form-flex-row.vue +122 -0
- package/dist/renderer/components/form/xo-form-flex.vue +115 -0
- package/dist/renderer/components/index.d.ts +70 -0
- package/dist/renderer/components/index.js +1282 -0
- package/dist/renderer/components/layouts/types/app-layout.d.ts +29 -0
- package/dist/renderer/components/layouts/types/mini-layout.d.ts +23 -0
- package/dist/renderer/components/layouts/types/simple-layout.d.ts +17 -0
- package/dist/renderer/components/layouts/xo-app-layout.vue +350 -0
- package/dist/renderer/components/layouts/xo-mini-layout.vue +207 -0
- package/dist/renderer/components/layouts/xo-simple-layout.vue +43 -0
- package/dist/renderer/components/pages/types/app-page.d.ts +25 -0
- package/dist/renderer/components/pages/types/bootstrap-page.d.ts +35 -0
- package/dist/renderer/components/pages/types/dynamic-page.d.ts +20 -0
- package/dist/renderer/components/pages/types/settings-page.d.ts +23 -0
- package/dist/renderer/components/pages/xo-app-page.vue +230 -0
- package/dist/renderer/components/pages/xo-bootstrap-page.vue +93 -0
- package/dist/renderer/components/pages/xo-dynamic-page.vue +28 -0
- package/dist/renderer/components/pages/xo-settings-page.vue +143 -0
- package/dist/renderer/components/radio-group/types/radio-group.d.ts +30 -0
- package/dist/renderer/components/radio-group/xo-radio-group.vue +38 -0
- package/dist/renderer/components/service-status-bar/types/service-status-bar.d.ts +65 -0
- package/dist/renderer/components/service-status-bar/xo-service-status-bar.vue +193 -0
- package/dist/renderer/components/settings-components/types/setting-app-opacity.d.ts +19 -0
- package/dist/renderer/components/settings-components/types/setting-log-level.d.ts +23 -0
- package/dist/renderer/components/settings-components/types/setting-shortcut-keys-record-for-form-flex-rows.d.ts +47 -0
- package/dist/renderer/components/settings-components/types/setting-shortcut-keys-record.d.ts +23 -0
- package/dist/renderer/components/settings-components/types/setting-window-material.d.ts +23 -0
- package/dist/renderer/components/settings-components/xo-setting-app-opacity.vue +105 -0
- package/dist/renderer/components/settings-components/xo-setting-log-level.vue +84 -0
- package/dist/renderer/components/settings-components/xo-setting-shortcut-keys-record-for-form-flex-rows.vue +37 -0
- package/dist/renderer/components/settings-components/xo-setting-shortcut-keys-record.vue +74 -0
- package/dist/renderer/components/settings-components/xo-setting-window-material.vue +83 -0
- package/dist/renderer/components/settings-pages/types/setting-page-folder.d.ts +41 -0
- package/dist/renderer/components/settings-pages/types/setting-page-general.d.ts +23 -0
- package/dist/renderer/components/settings-pages/types/setting-page-remote-service.d.ts +19 -0
- package/dist/renderer/components/settings-pages/types/setting-page-updater.d.ts +27 -0
- package/dist/renderer/components/settings-pages/xo-setting-page-folder.vue +137 -0
- package/dist/renderer/components/settings-pages/xo-setting-page-general.vue +255 -0
- package/dist/renderer/components/settings-pages/xo-setting-page-remote-service.vue +183 -0
- package/dist/renderer/components/settings-pages/xo-setting-page-updater.vue +350 -0
- package/dist/renderer/components/shortcut-keys-record/types/shortcut-keys-record.d.ts +25 -0
- package/dist/renderer/components/shortcut-keys-record/xo-shortcut-keys-record.vue +161 -0
- package/dist/renderer/components/side-bar/types/sidebar-logo.d.ts +39 -0
- package/dist/renderer/components/side-bar/xo-sidebar-logo.vue +133 -0
- package/dist/renderer/components/spacing-line/types/spacing-line.d.ts +17 -0
- package/dist/renderer/components/spacing-line/xo-spacing-line.vue +53 -0
- package/dist/renderer/components/theme-switch/types/theme-switch-mini.d.ts +21 -0
- package/dist/renderer/components/theme-switch/types/theme-switch.d.ts +45 -0
- package/dist/renderer/components/theme-switch/xo-theme-switch-mini.vue +93 -0
- package/dist/renderer/components/theme-switch/xo-theme-switch.vue +200 -0
- package/dist/renderer/components/title-bar/types/title-bar.d.ts +58 -0
- package/dist/renderer/components/title-bar/xo-title-bar.vue +364 -0
- package/dist/renderer/components/types/sidebar-menu.d.ts +37 -0
- package/dist/renderer/components/types/vue.d.ts +9 -0
- package/dist/renderer/components/updater/types/updater.d.ts +97 -0
- package/dist/renderer/components/updater/xo-updater.vue +1190 -0
- package/dist/renderer/components/window-control/types/window-control.d.ts +17 -0
- package/dist/renderer/components/window-control/xo-window-control.vue +193 -0
- package/dist/renderer/composables/index.d.ts +7 -0
- package/dist/renderer/composables/index.js +570 -0
- package/dist/renderer/composables/use-xo-boolean.d.ts +14 -0
- package/dist/renderer/composables/use-xo-data-loader.d.ts +73 -0
- package/dist/renderer/composables/use-xo-form-control.d.ts +84 -0
- package/dist/renderer/composables/use-xo-updater-action.d.ts +25 -0
- package/dist/renderer/global/index.d.ts +4 -0
- package/dist/renderer/global/index.js +0 -0
- package/dist/renderer/global/types/window.d.ts +21 -0
- package/dist/renderer/icons/demo.css +539 -0
- package/dist/renderer/icons/iconfont.css +490 -0
- package/dist/renderer/services/index.d.ts +6 -0
- package/dist/renderer/services/index.js +444 -0
- package/dist/renderer/services/orval-axios-mutator.d.ts +9 -0
- package/dist/renderer/services/types/xo-api.d.ts +92 -0
- package/dist/renderer/services/xo-api-requester.d.ts +129 -0
- package/dist/renderer/store/app/app-store.d.ts +68 -0
- package/dist/renderer/store/auth/auth-store.d.ts +43 -0
- package/dist/renderer/store/index.d.ts +9 -0
- package/dist/renderer/store/index.js +595 -0
- package/dist/renderer/store/remote-service/remote-service-store.d.ts +52 -0
- package/dist/renderer/store/theme/theme-store.d.ts +52 -0
- package/dist/renderer/store/updater/updater-store.d.ts +88 -0
- package/dist/renderer/store/window/window-store.d.ts +58 -0
- package/dist/renderer/styles/css/element-plus.less +280 -0
- package/dist/renderer/styles/css/iconfont-patch.less +6 -0
- package/dist/renderer/styles/css/reset.less +83 -0
- package/dist/renderer/styles/css/scrollbar.less +56 -0
- package/dist/renderer/styles/index.less +35 -0
- package/dist/renderer/styles/mixin.less +144 -0
- package/dist/renderer/styles/var/element-plus/dark.less +32 -0
- package/dist/renderer/styles/var/element-plus/root.less +88 -0
- package/dist/renderer/styles/var/global/dark.less +10 -0
- package/dist/renderer/styles/var/global/root.less +46 -0
- package/dist/renderer/styles/var/layout/dark.less +7 -0
- package/dist/renderer/styles/var/layout/root.less +9 -0
- package/dist/renderer/styles/var/scrollbar/dark.less +13 -0
- package/dist/renderer/styles/var/scrollbar/root.less +35 -0
- package/dist/renderer/utils/auth-route-util.d.ts +117 -0
- package/dist/renderer/utils/context-util.d.ts +13 -0
- package/dist/renderer/utils/error-util.d.ts +12 -0
- package/dist/renderer/utils/index.d.ts +14 -0
- package/dist/renderer/utils/index.js +1522 -0
- package/dist/renderer/utils/keyboard-util.d.ts +86 -0
- package/dist/renderer/utils/message-util.d.ts +161 -0
- package/dist/renderer/utils/renderer-log-util.d.ts +44 -0
- package/dist/renderer/utils/renderer-util.d.ts +37 -0
- package/dist/renderer/utils/router-util.d.ts +186 -0
- package/dist/renderer/utils/shortcut-util.d.ts +20 -0
- package/dist/renderer/utils/storage-util.d.ts +85 -0
- package/dist/renderer/utils/types/vue-router.d.ts +17 -0
- package/dist/shared/app/consts/app-launch-mode.d.ts +9 -0
- package/dist/shared/app/consts/update-mode.d.ts +8 -0
- package/dist/shared/app/consts/window-close-behavior.d.ts +8 -0
- package/dist/shared/app/consts/window-material.d.ts +8 -0
- package/dist/shared/app/consts/xion-name.d.ts +5 -0
- package/dist/shared/app/electron-app-config.d.ts +5 -0
- package/dist/shared/app/index.d.ts +16 -0
- package/dist/shared/app/index.js +30 -0
- package/dist/shared/app/types/app-info.d.ts +32 -0
- package/dist/shared/app/types/app-launch-mode.d.ts +13 -0
- package/dist/shared/app/types/app-paths.d.ts +27 -0
- package/dist/shared/app/types/general-settings.d.ts +27 -0
- package/dist/shared/app/types/on-window-close.d.ts +13 -0
- package/dist/shared/app/types/update-mode.d.ts +13 -0
- package/dist/shared/app/types/window-material.d.ts +2 -0
- package/dist/shared/auth/const/auth-status.d.ts +2 -0
- package/dist/shared/auth/index.d.ts +5 -0
- package/dist/shared/auth/index.js +5 -0
- package/dist/shared/auth/types/auth.d.ts +78 -0
- package/dist/shared/color/consts/color.d.ts +5 -0
- package/dist/shared/color/index.d.ts +5 -0
- package/dist/shared/color/index.js +6 -0
- package/dist/shared/color/types/color.d.ts +26 -0
- package/dist/shared/electron-builder/index.d.ts +4 -0
- package/dist/shared/electron-builder/index.js +0 -0
- package/dist/shared/electron-builder/types/electron-builder-options.d.ts +34 -0
- package/dist/shared/errors/index.d.ts +4 -0
- package/dist/shared/errors/index.js +10 -0
- package/dist/shared/errors/ipc-invoke-error.d.ts +32 -0
- package/dist/shared/ipc/channels/app-channels.d.ts +56 -0
- package/dist/shared/ipc/channels/auth-channels.d.ts +14 -0
- package/dist/shared/ipc/channels/clipboard-channels.d.ts +14 -0
- package/dist/shared/ipc/channels/context-menu-channels.d.ts +10 -0
- package/dist/shared/ipc/channels/dialog-channels.d.ts +12 -0
- package/dist/shared/ipc/channels/file-channels.d.ts +12 -0
- package/dist/shared/ipc/channels/log-channels.d.ts +14 -0
- package/dist/shared/ipc/channels/remote-service-channels.d.ts +20 -0
- package/dist/shared/ipc/channels/shell-channels.d.ts +10 -0
- package/dist/shared/ipc/channels/theme-channels.d.ts +12 -0
- package/dist/shared/ipc/channels/updater-channels.d.ts +26 -0
- package/dist/shared/ipc/channels/window-channels.d.ts +44 -0
- package/dist/shared/ipc/consts/ipc-channel.d.ts +1 -0
- package/dist/shared/ipc/index.d.ts +19 -0
- package/dist/shared/ipc/index.js +46 -0
- package/dist/shared/ipc/ipc-result.d.ts +20 -0
- package/dist/shared/ipc/types/ipc-logger.d.ts +27 -0
- package/dist/shared/ipc/types/ipc.d.ts +61 -0
- package/dist/shared/logger/consts/log-levels.d.ts +14 -0
- package/dist/shared/logger/index.d.ts +4 -0
- package/dist/shared/logger/index.js +10 -0
- package/dist/shared/menu/consts/menu-command.d.ts +1 -0
- package/dist/shared/menu/index.d.ts +6 -0
- package/dist/shared/menu/index.js +10 -0
- package/dist/shared/menu/menu-command.d.ts +24 -0
- package/dist/shared/menu/types/menu.d.ts +72 -0
- package/dist/shared/mode/consts/command.d.ts +10 -0
- package/dist/shared/mode/consts/mode.d.ts +22 -0
- package/dist/shared/mode/index.d.ts +5 -0
- package/dist/shared/mode/index.js +18 -0
- package/dist/shared/remote-service/const/remote-service.d.ts +8 -0
- package/dist/shared/remote-service/index.d.ts +5 -0
- package/dist/shared/remote-service/index.js +38 -0
- package/dist/shared/remote-service/types/remote-service.d.ts +146 -0
- package/dist/shared/renderer/index.d.ts +7 -0
- package/dist/shared/renderer/index.js +0 -0
- package/dist/shared/renderer/types/element-plus.d.ts +20 -0
- package/dist/shared/renderer/types/input.d.ts +11 -0
- package/dist/shared/renderer/types/options.d.ts +22 -0
- package/dist/shared/renderer/types/switch.d.ts +11 -0
- package/dist/shared/renderer-protocol/consts/renderer-protocol-keys.d.ts +10 -0
- package/dist/shared/renderer-protocol/index.d.ts +5 -0
- package/dist/shared/renderer-protocol/index.js +6 -0
- package/dist/shared/renderer-protocol/types/renderer-protocol.d.ts +7 -0
- package/dist/shared/runtime/index.d.ts +4 -0
- package/dist/shared/runtime/index.js +0 -0
- package/dist/shared/runtime/types/runtime.d.ts +20 -0
- package/dist/shared/shortcut/consts/shortcut-handler-ids.d.ts +9 -0
- package/dist/shared/shortcut/consts/shortcut-id.d.ts +1 -0
- package/dist/shared/shortcut/index.d.ts +6 -0
- package/dist/shared/shortcut/index.js +10 -0
- package/dist/shared/shortcut/types/shortcut.d.ts +13 -0
- package/dist/shared/utils/bytes-util.d.ts +16 -0
- package/dist/shared/utils/index.d.ts +15 -0
- package/dist/shared/utils/index.js +42 -0
- package/dist/shared/utils/ipc-util.d.ts +12 -0
- package/dist/shared/utils/log-util.d.ts +33 -0
- package/dist/shared/utils/menu-util.d.ts +12 -0
- package/dist/shared/utils/number-util.d.ts +12 -0
- package/dist/shared/utils/object-util.d.ts +88 -0
- package/dist/shared/utils/regexp-util.d.ts +22 -0
- package/dist/shared/utils/shortcut-util.d.ts +12 -0
- package/dist/shared/utils/string-util.d.ts +14 -0
- package/dist/shared/utils/time-util.d.ts +32 -0
- package/dist/shared/utils/validator-util.d.ts +12 -0
- package/dist/shared/utils/window-shared-util.d.ts +26 -0
- package/dist/shared/window/consts/window-record-id.d.ts +2 -0
- package/dist/shared/window/consts/window-type-name.d.ts +1 -0
- package/dist/shared/window/identity/main-window-identity.d.ts +5 -0
- package/dist/shared/window/identity/setting-window-identity.d.ts +5 -0
- package/dist/shared/window/index.d.ts +8 -0
- package/dist/shared/window/index.js +23 -0
- package/dist/shared/window/types/window.d.ts +84 -0
- package/dist/types/index.d.ts +102 -0
- package/dist/types/index.js +0 -0
- package/dist/vite/build/build-chunk.d.ts +53 -0
- package/dist/vite/build/build-csp-update.d.ts +80 -0
- package/dist/vite/build/build-obfuscation.d.ts +33 -0
- package/dist/vite/build/component-map.d.ts +38 -0
- package/dist/vite/build/component-resolver.d.ts +6 -0
- package/dist/vite/build/index.d.ts +9 -0
- package/dist/vite/build/index.js +18 -0
- package/dist/vite/build/types/build.d.ts +13 -0
- package/dist/vite/config/electron-app-config.d.ts +6 -0
- package/dist/vite/config/electron-builder-config.d.ts +8 -0
- package/dist/vite/config/electron-vite-config.d.ts +9 -0
- package/dist/vite/config/index.d.ts +11 -0
- package/dist/vite/config/index.js +2259 -0
- package/dist/vite/config/types/electron-app-options.d.ts +22 -0
- package/dist/vite/config/types/electron-builder-options.d.ts +16 -0
- package/dist/vite/config/types/electron-vite-options.d.ts +43 -0
- package/dist/vite/config/types/vite-obfuscation.d.ts +36 -0
- package/dist/vite/config/vite-obfuscation-config.d.ts +6 -0
- package/dist/vite/mode/index.d.ts +4 -0
- package/dist/vite/mode/index.js +8 -0
- package/dist/vite/mode/vite-mode.d.ts +37 -0
- package/dist/vite/orval/index.d.ts +4 -0
- package/dist/vite/orval/index.js +75 -0
- package/dist/vite/orval/orval-global-types.d.ts +23 -0
- package/dist/vite/utils/file-write-vite-util.d.ts +30 -0
- package/dist/vite/utils/index.d.ts +5 -0
- package/dist/vite/utils/index.js +10 -0
- package/dist/vite/utils/runtime-config-vite-util.d.ts +39 -0
- package/package.json +287 -0
|
@@ -0,0 +1,1522 @@
|
|
|
1
|
+
// src/renderer/utils/auth-route-util.ts
|
|
2
|
+
import { useXoAuthStore } from "../store/index";
|
|
3
|
+
import { computed, ref, watch } from "vue";
|
|
4
|
+
var AuthRouteUtil = class {
|
|
5
|
+
/** 启动判定页是否自动跳转 */
|
|
6
|
+
bootstrapAutoRedirect;
|
|
7
|
+
// 强制错误信息(用于调试页面)
|
|
8
|
+
forceErrorMessage;
|
|
9
|
+
/** 启动判定路由名称 */
|
|
10
|
+
bootstrapRouteName;
|
|
11
|
+
/** 认证成功后的默认业务路由名称 */
|
|
12
|
+
defaultRouteName;
|
|
13
|
+
/** 登录路由名称 */
|
|
14
|
+
loginRouteName;
|
|
15
|
+
/** 注销路由名称 */
|
|
16
|
+
logoutRouteName;
|
|
17
|
+
/** 找回密码路由名称 */
|
|
18
|
+
findPasswordRouteName;
|
|
19
|
+
/** 认证流程路由名称集合 */
|
|
20
|
+
authenticationRouteNames;
|
|
21
|
+
/**
|
|
22
|
+
* 构造认证路由工具
|
|
23
|
+
* @param {AuthRouteUtilOptions} options 认证路由选项
|
|
24
|
+
*/
|
|
25
|
+
constructor(options) {
|
|
26
|
+
this.bootstrapAutoRedirect = options.bootstrapAutoRedirect;
|
|
27
|
+
this.forceErrorMessage = options.forceErrorMessage;
|
|
28
|
+
this.bootstrapRouteName = options.bootstrapRouteName;
|
|
29
|
+
this.defaultRouteName = options.defaultRouteName;
|
|
30
|
+
this.loginRouteName = options.loginRouteName;
|
|
31
|
+
this.logoutRouteName = options.logoutRouteName;
|
|
32
|
+
this.findPasswordRouteName = options.findPasswordRouteName;
|
|
33
|
+
this.authenticationRouteNames = this.createAuthenticationRouteNames([
|
|
34
|
+
this.bootstrapRouteName,
|
|
35
|
+
this.loginRouteName,
|
|
36
|
+
this.logoutRouteName,
|
|
37
|
+
this.findPasswordRouteName
|
|
38
|
+
]);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* 安装认证路由守卫(在路由包中使用)
|
|
42
|
+
* <p>需要在路由实例创建后调用</p>
|
|
43
|
+
* @param {Router} router 路由实例
|
|
44
|
+
* @returns {() => void} 移除路由守卫的方法
|
|
45
|
+
*/
|
|
46
|
+
installGuard(router) {
|
|
47
|
+
let startupChecked = false;
|
|
48
|
+
let authStore;
|
|
49
|
+
const getAuthStore = () => authStore ??= useXoAuthStore();
|
|
50
|
+
const bootstrapPath = router.resolve({ name: this.bootstrapRouteName }).path;
|
|
51
|
+
const loginPath = router.resolve({ name: this.loginRouteName }).path;
|
|
52
|
+
return router.beforeEach((to) => {
|
|
53
|
+
const ignoreAuthRoute = this.isIgnoreAuthRoute(to);
|
|
54
|
+
if (to.name === this.bootstrapRouteName) {
|
|
55
|
+
startupChecked = true;
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
if (to.name === this.loginRouteName) {
|
|
59
|
+
const store2 = getAuthStore();
|
|
60
|
+
if (store2.isInitializing) {
|
|
61
|
+
return this.replaceRoute(this.bootstrapRouteName, to);
|
|
62
|
+
}
|
|
63
|
+
if (store2.isAuthenticated) {
|
|
64
|
+
return {
|
|
65
|
+
path: this.resolveRedirect(
|
|
66
|
+
router,
|
|
67
|
+
to.query.redirect,
|
|
68
|
+
[
|
|
69
|
+
bootstrapPath,
|
|
70
|
+
loginPath
|
|
71
|
+
]
|
|
72
|
+
),
|
|
73
|
+
// 必须使用 replace,避免返回登录页
|
|
74
|
+
replace: true
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
if (ignoreAuthRoute) {
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
if (!startupChecked) {
|
|
83
|
+
startupChecked = true;
|
|
84
|
+
return this.replaceRoute(this.bootstrapRouteName, to);
|
|
85
|
+
}
|
|
86
|
+
startupChecked = true;
|
|
87
|
+
const store = getAuthStore();
|
|
88
|
+
if (store.isInitializing) {
|
|
89
|
+
return this.replaceRoute(this.bootstrapRouteName, to);
|
|
90
|
+
}
|
|
91
|
+
if (store.isError) {
|
|
92
|
+
return this.replaceRoute(this.bootstrapRouteName, to);
|
|
93
|
+
}
|
|
94
|
+
if (!store.isAuthenticated) {
|
|
95
|
+
return this.replaceRoute(this.loginRouteName, to);
|
|
96
|
+
}
|
|
97
|
+
return true;
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* 监听认证状态并跳转到登录页或业务页(用于在 App.vue 中使用)
|
|
102
|
+
* <p>在登录页面,监听到认证状态成功后跳转业务页</p>
|
|
103
|
+
* <p>在业务页面,监听到认证状态失效后跳转登录页</p>
|
|
104
|
+
*
|
|
105
|
+
* @returns {WatchHandle}
|
|
106
|
+
*/
|
|
107
|
+
appAuthStateRedirect() {
|
|
108
|
+
const authStore = useXoAuthStore();
|
|
109
|
+
return watch(
|
|
110
|
+
() => authStore.status,
|
|
111
|
+
() => {
|
|
112
|
+
const router = RouterUtil.getRouter();
|
|
113
|
+
const route = router.currentRoute.value;
|
|
114
|
+
if (authStore.isAuthenticated) {
|
|
115
|
+
if (route.name !== this.loginRouteName) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const loginPath = router.resolve({ name: this.loginRouteName }).path;
|
|
119
|
+
const bootstrapPath = router.resolve({ name: this.bootstrapRouteName }).path;
|
|
120
|
+
void router.replace({
|
|
121
|
+
path: this.resolveRedirect(
|
|
122
|
+
router,
|
|
123
|
+
route.query.redirect,
|
|
124
|
+
[
|
|
125
|
+
loginPath,
|
|
126
|
+
bootstrapPath
|
|
127
|
+
]
|
|
128
|
+
)
|
|
129
|
+
});
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
if (!authStore.isUnauthenticated) {
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
if (this.isIgnoreAuthRoute(route)) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
void router.replace(this.replaceRoute(this.loginRouteName, route));
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
immediate: true
|
|
142
|
+
}
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* 监听认证状态并跳转到登录页或业务页(在启动判定页中使用)
|
|
147
|
+
* <p>用于启动判定页面,根据认证状态完成首次路由跳转</p>
|
|
148
|
+
* @returns {BootstrapAuthStateRedirectResult}
|
|
149
|
+
*/
|
|
150
|
+
bootstrapAuthStateRedirect() {
|
|
151
|
+
const authStore = useXoAuthStore();
|
|
152
|
+
const isError = computed(() => this.forceErrorMessage ? true : authStore.isError);
|
|
153
|
+
const error = computed(() => this.forceErrorMessage || authStore.error);
|
|
154
|
+
const router = RouterUtil.getRouter();
|
|
155
|
+
const retrying = ref(false);
|
|
156
|
+
let redirecting = false;
|
|
157
|
+
const resolveStartupRedirect = () => {
|
|
158
|
+
const route = router.currentRoute.value;
|
|
159
|
+
const loginPath = router.resolve({ name: this.loginRouteName }).path;
|
|
160
|
+
return this.resolveRedirect(
|
|
161
|
+
router,
|
|
162
|
+
route.query.redirect,
|
|
163
|
+
// 排除的路径不作为重定向目标
|
|
164
|
+
[
|
|
165
|
+
route.path,
|
|
166
|
+
loginPath
|
|
167
|
+
]
|
|
168
|
+
);
|
|
169
|
+
};
|
|
170
|
+
const redirectByAuthState = async () => {
|
|
171
|
+
if (this.bootstrapAutoRedirect === false) {
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
if (redirecting || authStore.isInitializing) {
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
if (authStore.isAuthenticated) {
|
|
178
|
+
redirecting = true;
|
|
179
|
+
try {
|
|
180
|
+
await router.replace(resolveStartupRedirect());
|
|
181
|
+
} finally {
|
|
182
|
+
redirecting = false;
|
|
183
|
+
}
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
if (authStore.isUnauthenticated) {
|
|
187
|
+
redirecting = true;
|
|
188
|
+
try {
|
|
189
|
+
await router.replace({
|
|
190
|
+
name: this.loginRouteName,
|
|
191
|
+
query: {
|
|
192
|
+
redirect: resolveStartupRedirect()
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
} finally {
|
|
196
|
+
redirecting = false;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
const retryInitialize = async () => {
|
|
201
|
+
if (retrying.value) {
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
retrying.value = true;
|
|
205
|
+
try {
|
|
206
|
+
await authStore.initialize();
|
|
207
|
+
} finally {
|
|
208
|
+
retrying.value = false;
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
const stop = watch(
|
|
212
|
+
() => authStore.status,
|
|
213
|
+
() => void redirectByAuthState(),
|
|
214
|
+
{
|
|
215
|
+
immediate: true
|
|
216
|
+
}
|
|
217
|
+
);
|
|
218
|
+
return {
|
|
219
|
+
isError,
|
|
220
|
+
error,
|
|
221
|
+
retrying,
|
|
222
|
+
stop,
|
|
223
|
+
retryInitialize
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* 判断重定向路径是否为安全的应用内部路径
|
|
228
|
+
*
|
|
229
|
+
* @param {Router} router 路由实例
|
|
230
|
+
* @param {unknown} value 待判断的路径
|
|
231
|
+
* @param {readonly string[]} excludedPaths 不允许跳转的路径
|
|
232
|
+
* @returns {value is string}
|
|
233
|
+
*/
|
|
234
|
+
isSafeRedirect(router, value, excludedPaths) {
|
|
235
|
+
if (typeof value !== "string") {
|
|
236
|
+
return false;
|
|
237
|
+
}
|
|
238
|
+
if (!value.startsWith("/") || value.startsWith("//")) {
|
|
239
|
+
return false;
|
|
240
|
+
}
|
|
241
|
+
if (excludedPaths.includes(value)) {
|
|
242
|
+
return false;
|
|
243
|
+
}
|
|
244
|
+
try {
|
|
245
|
+
const resolvedRoute = router.resolve(value);
|
|
246
|
+
return resolvedRoute.name !== null && !this.isAuthenticationRouteName(resolvedRoute.name);
|
|
247
|
+
} catch {
|
|
248
|
+
return false;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* 解析认证完成后的重定向路径
|
|
253
|
+
*
|
|
254
|
+
* @param {Router} router 路由实例
|
|
255
|
+
* @param {unknown} redirect 路由查询参数中的目标路径
|
|
256
|
+
* @param {readonly string[]} excludedPaths 不允许跳转的路径
|
|
257
|
+
* @returns {string}
|
|
258
|
+
*/
|
|
259
|
+
resolveRedirect(router, redirect, excludedPaths = []) {
|
|
260
|
+
if (this.isSafeRedirect(router, redirect, excludedPaths)) {
|
|
261
|
+
return redirect;
|
|
262
|
+
}
|
|
263
|
+
return router.resolve({ name: this.defaultRouteName }).fullPath;
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* 判断路由是否免认证
|
|
267
|
+
* @param {RouteLocationNormalized} route 当前路由
|
|
268
|
+
* @returns {boolean}
|
|
269
|
+
*/
|
|
270
|
+
isIgnoreAuthRoute(route) {
|
|
271
|
+
return route.meta.ignoreAuth === true;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* 判断路由名称是否属于认证流程路由
|
|
275
|
+
* @param {RouteRecordName | null | undefined} routeName 路由名称
|
|
276
|
+
* @returns {boolean}
|
|
277
|
+
*/
|
|
278
|
+
isAuthenticationRouteName(routeName) {
|
|
279
|
+
if (routeName === null || routeName === void 0) {
|
|
280
|
+
return false;
|
|
281
|
+
}
|
|
282
|
+
return this.authenticationRouteNames.has(routeName);
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* 路由替换为指定路由名称的路由
|
|
286
|
+
* @param {RouteRecordName} routeName 路由名称
|
|
287
|
+
* @param {RouteLocationNormalizedGeneric} to 目标路由
|
|
288
|
+
* @return {RouteLocationRaw}
|
|
289
|
+
* @private
|
|
290
|
+
*/
|
|
291
|
+
replaceRoute(routeName, to) {
|
|
292
|
+
return {
|
|
293
|
+
name: routeName,
|
|
294
|
+
query: {
|
|
295
|
+
redirect: to.fullPath
|
|
296
|
+
},
|
|
297
|
+
// 必须使用 replace,避免返回 from 路由
|
|
298
|
+
replace: true
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* 创建新的认证路由名称集合
|
|
303
|
+
* @param {readonly (RouteRecordName | undefined)[]} names 路由名称数组
|
|
304
|
+
* @returns {ReadonlySet<RouteRecordName>}
|
|
305
|
+
* @private
|
|
306
|
+
*/
|
|
307
|
+
createAuthenticationRouteNames(names) {
|
|
308
|
+
return new Set(names.filter((name) => name !== void 0));
|
|
309
|
+
}
|
|
310
|
+
};
|
|
311
|
+
|
|
312
|
+
// src/renderer/utils/context-util.ts
|
|
313
|
+
var ContextUtil = class {
|
|
314
|
+
/**
|
|
315
|
+
* flex 布局表单上下文 Key
|
|
316
|
+
* @type {InjectionKey<XoComponent.FormFlexContext>}
|
|
317
|
+
*/
|
|
318
|
+
static FormFlexKey = Symbol("XoFormFlexContext");
|
|
319
|
+
};
|
|
320
|
+
|
|
321
|
+
// src/renderer/utils/error-util.ts
|
|
322
|
+
var ErrorUtil = class {
|
|
323
|
+
/**
|
|
324
|
+
* 抛出错误
|
|
325
|
+
* @param {string} message 错误消息
|
|
326
|
+
*/
|
|
327
|
+
static throw(message) {
|
|
328
|
+
throw new Error(message);
|
|
329
|
+
}
|
|
330
|
+
};
|
|
331
|
+
|
|
332
|
+
// src/renderer/utils/keyboard-util.ts
|
|
333
|
+
var ModifierKeys = ["control", "shift", "alt"];
|
|
334
|
+
var NormalFriendlyMap = {
|
|
335
|
+
// 控制键
|
|
336
|
+
escape: "Esc",
|
|
337
|
+
esc: "Esc",
|
|
338
|
+
pageup: "PageUp",
|
|
339
|
+
pagedown: "PageDown",
|
|
340
|
+
home: "Home",
|
|
341
|
+
end: "End",
|
|
342
|
+
arrowup: "\u2191",
|
|
343
|
+
arrowdown: "\u2193",
|
|
344
|
+
arrowleft: "\u2190",
|
|
345
|
+
arrowright: "\u2192",
|
|
346
|
+
up: "\u2191",
|
|
347
|
+
down: "\u2193",
|
|
348
|
+
left: "\u2190",
|
|
349
|
+
right: "\u2192",
|
|
350
|
+
enter: "Enter",
|
|
351
|
+
return: "Enter",
|
|
352
|
+
tab: "Tab",
|
|
353
|
+
space: "Space",
|
|
354
|
+
backspace: "Backspace",
|
|
355
|
+
insert: "Insert",
|
|
356
|
+
delete: "Del",
|
|
357
|
+
printscreen: "PrintScreen",
|
|
358
|
+
capslock: "CapsLock",
|
|
359
|
+
numlock: "NumLock",
|
|
360
|
+
scrolllock: "ScrollLock",
|
|
361
|
+
// 符号
|
|
362
|
+
minus: "-",
|
|
363
|
+
equal: "=",
|
|
364
|
+
bracketleft: "[",
|
|
365
|
+
bracketright: "]",
|
|
366
|
+
backquote: "`",
|
|
367
|
+
backslash: "\\",
|
|
368
|
+
semicolon: ";",
|
|
369
|
+
quote: "'",
|
|
370
|
+
comma: ",",
|
|
371
|
+
period: ".",
|
|
372
|
+
slash: "/",
|
|
373
|
+
// 小键盘
|
|
374
|
+
numpaddivide: "Numpad /",
|
|
375
|
+
numpadmultiply: "Numpad *",
|
|
376
|
+
numpadsubtract: "Numpad -",
|
|
377
|
+
numpadadd: "Numpad +",
|
|
378
|
+
numpaddecimal: "Numpad .",
|
|
379
|
+
numpadenter: "Enter"
|
|
380
|
+
};
|
|
381
|
+
var MediaFriendlyMap = {
|
|
382
|
+
// 音量键
|
|
383
|
+
audiovolumemute: "Volume Mute",
|
|
384
|
+
audiovolumedown: "Volume Down",
|
|
385
|
+
audiovolumeup: "Volume Up",
|
|
386
|
+
// 媒体键
|
|
387
|
+
mediatracknext: "Media Next",
|
|
388
|
+
mediatrackprevious: "Media Previous",
|
|
389
|
+
mediaplaypause: "Media Play/Pause",
|
|
390
|
+
mediastop: "Media Stop"
|
|
391
|
+
};
|
|
392
|
+
var ModifierFriendlyMap = {
|
|
393
|
+
control: "Ctrl",
|
|
394
|
+
shift: "Shift",
|
|
395
|
+
alt: "Alt"
|
|
396
|
+
};
|
|
397
|
+
var ModifierKeyOrder = {
|
|
398
|
+
control: 0,
|
|
399
|
+
shift: 1,
|
|
400
|
+
alt: 2
|
|
401
|
+
};
|
|
402
|
+
var ModifierKeyMap = {
|
|
403
|
+
ctrl: "control",
|
|
404
|
+
control: "control",
|
|
405
|
+
controlleft: "control",
|
|
406
|
+
controlright: "control",
|
|
407
|
+
shift: "shift",
|
|
408
|
+
shiftleft: "shift",
|
|
409
|
+
shiftright: "shift",
|
|
410
|
+
alt: "alt",
|
|
411
|
+
altleft: "alt",
|
|
412
|
+
altright: "alt"
|
|
413
|
+
};
|
|
414
|
+
var KeyboardUtil = class _KeyboardUtil {
|
|
415
|
+
/**
|
|
416
|
+
* 按键按下处理器
|
|
417
|
+
* @param {KeyboardEvent} event 按键事件
|
|
418
|
+
* @param {string[]} keys 当前按键
|
|
419
|
+
* @returns {string[]}
|
|
420
|
+
*/
|
|
421
|
+
static keydown(event, keys) {
|
|
422
|
+
if (event.repeat) {
|
|
423
|
+
return keys;
|
|
424
|
+
}
|
|
425
|
+
const code = event.code.toLowerCase();
|
|
426
|
+
if (!_KeyboardUtil.isSupportedKey(code)) {
|
|
427
|
+
return keys;
|
|
428
|
+
}
|
|
429
|
+
return [.../* @__PURE__ */ new Set([...keys, code])];
|
|
430
|
+
}
|
|
431
|
+
/**
|
|
432
|
+
* 按键弹起处理器
|
|
433
|
+
* @param {KeyboardEvent} event 按键事件
|
|
434
|
+
* @param {string[]} keys 当前按键
|
|
435
|
+
* @returns {string[]}
|
|
436
|
+
*/
|
|
437
|
+
static keyup(event, keys) {
|
|
438
|
+
const code = event.code.toLowerCase();
|
|
439
|
+
return keys.filter((item) => item !== code);
|
|
440
|
+
}
|
|
441
|
+
/**
|
|
442
|
+
* 获取有效组合键
|
|
443
|
+
* @param {string[]} keys 按键组合
|
|
444
|
+
* @returns {string[]}
|
|
445
|
+
*/
|
|
446
|
+
static getCombinationKeys(keys) {
|
|
447
|
+
const modifierKeys = /* @__PURE__ */ new Set();
|
|
448
|
+
const currentKeys = _KeyboardUtil.sortKeys([...new Set(keys.map((key) => key.toLowerCase()))]).filter((key) => _KeyboardUtil.isSupportedKey(key)).filter((key) => {
|
|
449
|
+
const modifierKey = _KeyboardUtil.getModifierKey(key);
|
|
450
|
+
if (!modifierKey) {
|
|
451
|
+
return true;
|
|
452
|
+
}
|
|
453
|
+
if (modifierKeys.has(modifierKey)) {
|
|
454
|
+
return false;
|
|
455
|
+
}
|
|
456
|
+
modifierKeys.add(modifierKey);
|
|
457
|
+
return true;
|
|
458
|
+
});
|
|
459
|
+
const hasValidModifier = [...modifierKeys].some((key) => key !== "shift");
|
|
460
|
+
const normalKeys = currentKeys.filter((key) => !_KeyboardUtil.isModifierKey(key) && !_KeyboardUtil.isMediaKey(key));
|
|
461
|
+
const hasFunctionKey = normalKeys.some((key) => _KeyboardUtil.isFunctionKey(key));
|
|
462
|
+
const mediaKeys = currentKeys.filter((key) => _KeyboardUtil.isMediaKey(key));
|
|
463
|
+
if (mediaKeys.length === 1 && normalKeys.length === 0) {
|
|
464
|
+
return currentKeys;
|
|
465
|
+
}
|
|
466
|
+
if ((hasValidModifier || hasFunctionKey) && normalKeys.length === 1) {
|
|
467
|
+
return currentKeys;
|
|
468
|
+
}
|
|
469
|
+
return [];
|
|
470
|
+
}
|
|
471
|
+
/**
|
|
472
|
+
* 将按键解析为友好展示
|
|
473
|
+
* @param {string[]} keys 按键组合
|
|
474
|
+
* @param {string} delimiter 分隔符
|
|
475
|
+
* @returns {string}
|
|
476
|
+
*/
|
|
477
|
+
static parseFriendly(keys, delimiter = " + ") {
|
|
478
|
+
return keys.map((key) => _KeyboardUtil.parseFriendlyKey(key)).join(delimiter);
|
|
479
|
+
}
|
|
480
|
+
/**
|
|
481
|
+
* 将单个按键解析为友好展示
|
|
482
|
+
* @param {string} key 按键
|
|
483
|
+
* @returns {string}
|
|
484
|
+
*/
|
|
485
|
+
static parseFriendlyKey(key) {
|
|
486
|
+
const value = key.toLowerCase();
|
|
487
|
+
const modifierKey = _KeyboardUtil.getModifierKey(value);
|
|
488
|
+
if (modifierKey) {
|
|
489
|
+
return ModifierFriendlyMap[modifierKey];
|
|
490
|
+
}
|
|
491
|
+
if (MediaFriendlyMap[value]) {
|
|
492
|
+
return MediaFriendlyMap[value];
|
|
493
|
+
}
|
|
494
|
+
if (NormalFriendlyMap[value]) {
|
|
495
|
+
return NormalFriendlyMap[value];
|
|
496
|
+
}
|
|
497
|
+
if (/^key[a-z]$/.test(value)) {
|
|
498
|
+
return value.slice(3).toUpperCase();
|
|
499
|
+
}
|
|
500
|
+
if (/^digit\d$/.test(value)) {
|
|
501
|
+
return value.slice(5);
|
|
502
|
+
}
|
|
503
|
+
if (/^numpad[1-9]$/.test(value)) {
|
|
504
|
+
return `Numpad ${value.slice(6)}`;
|
|
505
|
+
}
|
|
506
|
+
if (_KeyboardUtil.isFunctionKey(value)) {
|
|
507
|
+
return value.toUpperCase();
|
|
508
|
+
}
|
|
509
|
+
if (/^[a-z]$/.test(value)) {
|
|
510
|
+
return value.toUpperCase();
|
|
511
|
+
}
|
|
512
|
+
if (/^\d$/.test(value)) {
|
|
513
|
+
return value;
|
|
514
|
+
}
|
|
515
|
+
return _KeyboardUtil.upperFirst(key);
|
|
516
|
+
}
|
|
517
|
+
/**
|
|
518
|
+
* 获取修饰键
|
|
519
|
+
* @param {string} key 按键
|
|
520
|
+
* @returns {ModifierKey | undefined}
|
|
521
|
+
*/
|
|
522
|
+
static getModifierKey(key) {
|
|
523
|
+
return ModifierKeyMap[key.toLowerCase()];
|
|
524
|
+
}
|
|
525
|
+
/**
|
|
526
|
+
* 是否为 Electron 支持的按键
|
|
527
|
+
* @param {string} key 按键
|
|
528
|
+
* @returns {boolean}
|
|
529
|
+
*/
|
|
530
|
+
static isSupportedKey(key) {
|
|
531
|
+
return _KeyboardUtil.isModifierKey(key) || _KeyboardUtil.isMediaKey(key) || _KeyboardUtil.isSupportedNormalKey(key);
|
|
532
|
+
}
|
|
533
|
+
/**
|
|
534
|
+
* 是否为 Electron 支持的普通按键
|
|
535
|
+
* @param {string} key 按键
|
|
536
|
+
* @returns {boolean}
|
|
537
|
+
*/
|
|
538
|
+
static isSupportedNormalKey(key) {
|
|
539
|
+
const value = key.toLowerCase();
|
|
540
|
+
return Object.hasOwn(NormalFriendlyMap, value) || /^key[a-z]$/.test(value) || /^digit\d$/.test(value) || /^numpad[1-9]$/.test(value) || _KeyboardUtil.isFunctionKey(value) || /^[a-z0-9]$/.test(value);
|
|
541
|
+
}
|
|
542
|
+
/**
|
|
543
|
+
* 是否为修饰键
|
|
544
|
+
* @param {string} key 按键
|
|
545
|
+
* @returns {boolean}
|
|
546
|
+
*/
|
|
547
|
+
static isModifierKey(key) {
|
|
548
|
+
return _KeyboardUtil.getModifierKey(key) !== void 0;
|
|
549
|
+
}
|
|
550
|
+
/**
|
|
551
|
+
* 是否为媒体键
|
|
552
|
+
* @param {string} key 按键
|
|
553
|
+
* @returns {boolean}
|
|
554
|
+
*/
|
|
555
|
+
static isMediaKey(key) {
|
|
556
|
+
return Object.hasOwn(MediaFriendlyMap, key.toLowerCase());
|
|
557
|
+
}
|
|
558
|
+
/**
|
|
559
|
+
* 是否为 Electron 支持的功能键
|
|
560
|
+
* @param {string} key 按键
|
|
561
|
+
* @returns {boolean}
|
|
562
|
+
*/
|
|
563
|
+
static isFunctionKey(key) {
|
|
564
|
+
return /^f(?:[1-9]|1\d|2[0-4])$/i.test(key);
|
|
565
|
+
}
|
|
566
|
+
/**
|
|
567
|
+
* 组合键排序
|
|
568
|
+
* @param {string[]} keys 按键组合
|
|
569
|
+
* @returns {string[]}
|
|
570
|
+
*/
|
|
571
|
+
static sortKeys(keys) {
|
|
572
|
+
return [...keys].sort((l, r) => {
|
|
573
|
+
const lModifier = _KeyboardUtil.getModifierKey(l);
|
|
574
|
+
const rModifier = _KeyboardUtil.getModifierKey(r);
|
|
575
|
+
const nOrder = ModifierKeys.length;
|
|
576
|
+
const lOrder = lModifier ? ModifierKeyOrder[lModifier] : nOrder;
|
|
577
|
+
const rOrder = rModifier ? ModifierKeyOrder[rModifier] : nOrder;
|
|
578
|
+
if (lOrder !== rOrder) {
|
|
579
|
+
return lOrder - rOrder;
|
|
580
|
+
}
|
|
581
|
+
if (lModifier) {
|
|
582
|
+
return 0;
|
|
583
|
+
}
|
|
584
|
+
return l.toLowerCase().localeCompare(r.toLowerCase());
|
|
585
|
+
});
|
|
586
|
+
}
|
|
587
|
+
/**
|
|
588
|
+
* 首字母大写
|
|
589
|
+
* @param {string} value 字符串
|
|
590
|
+
* @returns {string}
|
|
591
|
+
*/
|
|
592
|
+
static upperFirst(value) {
|
|
593
|
+
return value ? `${value.charAt(0).toUpperCase()}${value.slice(1)}` : "";
|
|
594
|
+
}
|
|
595
|
+
};
|
|
596
|
+
|
|
597
|
+
// src/renderer/utils/message-util.ts
|
|
598
|
+
import { ElMessage, ElMessageBox, ElNotification } from "element-plus";
|
|
599
|
+
var MessageUtil = class _MessageUtil {
|
|
600
|
+
//<editor-fold desc="Message">
|
|
601
|
+
/**
|
|
602
|
+
* 默认消息配置
|
|
603
|
+
* @type {XoMessageOptions}
|
|
604
|
+
* @private
|
|
605
|
+
*/
|
|
606
|
+
static defaultOptions = {
|
|
607
|
+
duration: 3e3,
|
|
608
|
+
grouping: true,
|
|
609
|
+
offset: 16
|
|
610
|
+
};
|
|
611
|
+
/**
|
|
612
|
+
* 打开消息
|
|
613
|
+
* @param {MessageOptions} options 消息配置
|
|
614
|
+
* @returns {MessageHandler}
|
|
615
|
+
*/
|
|
616
|
+
static open(options) {
|
|
617
|
+
const placement = options.placement ?? _MessageUtil.defaultOptions.placement ?? "top";
|
|
618
|
+
const defaultOffset = _MessageUtil.defaultOptions.offset ?? 16;
|
|
619
|
+
const offset = placement.startsWith("bottom") ? defaultOffset : defaultOffset + (window.xionTitleBar?.height ?? 0);
|
|
620
|
+
return ElMessage({
|
|
621
|
+
..._MessageUtil.defaultOptions,
|
|
622
|
+
...options,
|
|
623
|
+
offset: options.offset ?? offset
|
|
624
|
+
});
|
|
625
|
+
}
|
|
626
|
+
/**
|
|
627
|
+
* 显示指定类型消息
|
|
628
|
+
* @param {MessageType} type 消息类型
|
|
629
|
+
* @param {XoMessageContent} message 消息内容
|
|
630
|
+
* @param {XoMessageOptions} options 消息配置
|
|
631
|
+
* @returns {MessageHandler}
|
|
632
|
+
* @private
|
|
633
|
+
*/
|
|
634
|
+
static show(type, message, options) {
|
|
635
|
+
return _MessageUtil.open({
|
|
636
|
+
...options,
|
|
637
|
+
type,
|
|
638
|
+
message
|
|
639
|
+
});
|
|
640
|
+
}
|
|
641
|
+
/**
|
|
642
|
+
* 成功消息
|
|
643
|
+
* @param {XoMessageContent} message 消息内容
|
|
644
|
+
* @param {XoMessageOptions} options 消息配置
|
|
645
|
+
* @returns {MessageHandler}
|
|
646
|
+
*/
|
|
647
|
+
static success(message, options = {}) {
|
|
648
|
+
return _MessageUtil.show("success", message, options);
|
|
649
|
+
}
|
|
650
|
+
/**
|
|
651
|
+
* 主要消息
|
|
652
|
+
* @param {XoMessageContent} message 消息内容
|
|
653
|
+
* @param {XoMessageOptions} options 消息配置
|
|
654
|
+
* @returns {MessageHandler}
|
|
655
|
+
*/
|
|
656
|
+
static primary(message, options = {}) {
|
|
657
|
+
return _MessageUtil.show("primary", message, options);
|
|
658
|
+
}
|
|
659
|
+
/**
|
|
660
|
+
* 信息消息
|
|
661
|
+
* @param {XoMessageContent} message 消息内容
|
|
662
|
+
* @param {XoMessageOptions} options 消息配置
|
|
663
|
+
* @returns {MessageHandler}
|
|
664
|
+
*/
|
|
665
|
+
static info(message, options = {}) {
|
|
666
|
+
return _MessageUtil.show("info", message, options);
|
|
667
|
+
}
|
|
668
|
+
/**
|
|
669
|
+
* 警告消息
|
|
670
|
+
* @param {XoMessageContent} message 消息内容
|
|
671
|
+
* @param {XoMessageOptions} options 消息配置
|
|
672
|
+
* @returns {MessageHandler}
|
|
673
|
+
*/
|
|
674
|
+
static warning(message, options = {}) {
|
|
675
|
+
return _MessageUtil.show("warning", message, options);
|
|
676
|
+
}
|
|
677
|
+
/**
|
|
678
|
+
* 错误消息
|
|
679
|
+
* @param {unknown} error 错误
|
|
680
|
+
* @param {string | XoMessageOptions} fallbackOptions 兜底消息或消息配置
|
|
681
|
+
* @param {XoMessageOptions} options 消息配置
|
|
682
|
+
* @returns {MessageHandler}
|
|
683
|
+
*/
|
|
684
|
+
static error(error, fallbackOptions = "\u64CD\u4F5C\u5931\u8D25", options = {}) {
|
|
685
|
+
const fallback = typeof fallbackOptions === "string" ? fallbackOptions : "\u64CD\u4F5C\u5931\u8D25";
|
|
686
|
+
const config = typeof fallbackOptions === "string" ? options : fallbackOptions;
|
|
687
|
+
return _MessageUtil.show("error", _MessageUtil.parseErrorMessage(error, fallback), config);
|
|
688
|
+
}
|
|
689
|
+
/**
|
|
690
|
+
* 关闭全部消息
|
|
691
|
+
* @param {MessageType} type 消息类型
|
|
692
|
+
*/
|
|
693
|
+
static closeAll(type) {
|
|
694
|
+
ElMessage.closeAll(type);
|
|
695
|
+
}
|
|
696
|
+
/**
|
|
697
|
+
* 解析错误消息
|
|
698
|
+
* @param {unknown} error 错误
|
|
699
|
+
* @param {string} fallback 兜底消息
|
|
700
|
+
* @returns {string}
|
|
701
|
+
* @private
|
|
702
|
+
*/
|
|
703
|
+
static parseErrorMessage(error, fallback) {
|
|
704
|
+
if (typeof error === "string") {
|
|
705
|
+
return error.trim() || fallback;
|
|
706
|
+
}
|
|
707
|
+
if (error instanceof Error) {
|
|
708
|
+
return error.message || fallback;
|
|
709
|
+
}
|
|
710
|
+
if (_MessageUtil.isMessageObject(error)) {
|
|
711
|
+
return error.message.trim() || fallback;
|
|
712
|
+
}
|
|
713
|
+
return fallback;
|
|
714
|
+
}
|
|
715
|
+
/**
|
|
716
|
+
* 判断是否为包含 message 的对象
|
|
717
|
+
* @param {unknown} value 值
|
|
718
|
+
* @returns {value is {message: string}}
|
|
719
|
+
* @private
|
|
720
|
+
*/
|
|
721
|
+
static isMessageObject(value) {
|
|
722
|
+
return typeof value === "object" && value !== null && "message" in value && typeof value.message === "string";
|
|
723
|
+
}
|
|
724
|
+
//</editor-fold>
|
|
725
|
+
//<editor-fold desc="Notification">
|
|
726
|
+
/**
|
|
727
|
+
* 打开通知
|
|
728
|
+
* @param {NotificationOptions} options 通知配置
|
|
729
|
+
* @returns {NotificationHandle}
|
|
730
|
+
*/
|
|
731
|
+
static notify(options) {
|
|
732
|
+
const position = options.position ?? "top-right";
|
|
733
|
+
const offset = position.startsWith("bottom") ? 0 : window.xionTitleBar?.height ?? 0;
|
|
734
|
+
return ElNotification({
|
|
735
|
+
...options,
|
|
736
|
+
offset: options.offset ?? offset
|
|
737
|
+
});
|
|
738
|
+
}
|
|
739
|
+
/**
|
|
740
|
+
* 关闭全部通知
|
|
741
|
+
*/
|
|
742
|
+
static closeAllNotifications() {
|
|
743
|
+
ElNotification.closeAll();
|
|
744
|
+
}
|
|
745
|
+
//</editor-fold>
|
|
746
|
+
//<editor-fold desc="MessageBox">
|
|
747
|
+
/**
|
|
748
|
+
* 默认消息弹窗配置
|
|
749
|
+
* @type {XoMessageBoxOptions}
|
|
750
|
+
* @private
|
|
751
|
+
*/
|
|
752
|
+
static defaultBoxOptions = {
|
|
753
|
+
confirmButtonText: "\u786E\u5B9A",
|
|
754
|
+
cancelButtonText: "\u53D6\u6D88"
|
|
755
|
+
};
|
|
756
|
+
/**
|
|
757
|
+
* 警告弹窗
|
|
758
|
+
* @param {XoMessageBoxContent} message 消息内容
|
|
759
|
+
* @param {string | XoMessageBoxOptions} titleOptions 标题
|
|
760
|
+
* @param {XoMessageBoxOptions} options 消息弹窗配置
|
|
761
|
+
* @returns {Promise<void>}
|
|
762
|
+
*/
|
|
763
|
+
static async alert(message, titleOptions = "\u63D0\u793A", options = {}) {
|
|
764
|
+
const title = typeof titleOptions === "string" ? titleOptions : "\u63D0\u793A";
|
|
765
|
+
const config = typeof titleOptions === "string" ? options : titleOptions;
|
|
766
|
+
try {
|
|
767
|
+
await ElMessageBox.alert(message, title, {
|
|
768
|
+
..._MessageUtil.defaultBoxOptions,
|
|
769
|
+
...config
|
|
770
|
+
});
|
|
771
|
+
} catch (reason) {
|
|
772
|
+
if (!_MessageUtil.isBoxDismissed(reason)) {
|
|
773
|
+
throw reason;
|
|
774
|
+
}
|
|
775
|
+
}
|
|
776
|
+
}
|
|
777
|
+
/**
|
|
778
|
+
* 确认弹窗
|
|
779
|
+
* @param {XoMessageBoxContent} message 消息内容
|
|
780
|
+
* @param {string | XoMessageBoxOptions} titleOptions 标题
|
|
781
|
+
* @param {XoMessageBoxOptions} options 消息弹窗配置
|
|
782
|
+
* @returns {Promise<boolean>} 是否确认
|
|
783
|
+
*/
|
|
784
|
+
static async confirm(message, titleOptions = "\u63D0\u793A", options = {}) {
|
|
785
|
+
const title = typeof titleOptions === "string" ? titleOptions : "\u63D0\u793A";
|
|
786
|
+
const config = typeof titleOptions === "string" ? options : titleOptions;
|
|
787
|
+
try {
|
|
788
|
+
await ElMessageBox.confirm(message, title, {
|
|
789
|
+
..._MessageUtil.defaultBoxOptions,
|
|
790
|
+
...config
|
|
791
|
+
});
|
|
792
|
+
return true;
|
|
793
|
+
} catch (reason) {
|
|
794
|
+
if (_MessageUtil.isBoxDismissed(reason)) {
|
|
795
|
+
return false;
|
|
796
|
+
}
|
|
797
|
+
throw reason;
|
|
798
|
+
}
|
|
799
|
+
}
|
|
800
|
+
/**
|
|
801
|
+
* 输入弹窗
|
|
802
|
+
* @param {XoMessageBoxContent} message 消息内容
|
|
803
|
+
* @param {string | XoMessageBoxOptions} titleOptions 标题
|
|
804
|
+
* @param {XoMessageBoxOptions} options 消息弹窗配置
|
|
805
|
+
* @returns {Promise<string | undefined>} 输入值,取消或关闭时返回 undefined
|
|
806
|
+
*/
|
|
807
|
+
static async prompt(message, titleOptions = "\u63D0\u793A", options = {}) {
|
|
808
|
+
const title = typeof titleOptions === "string" ? titleOptions : "\u63D0\u793A";
|
|
809
|
+
const config = typeof titleOptions === "string" ? options : titleOptions;
|
|
810
|
+
try {
|
|
811
|
+
const { value } = await ElMessageBox.prompt(message, title, {
|
|
812
|
+
..._MessageUtil.defaultBoxOptions,
|
|
813
|
+
...config
|
|
814
|
+
});
|
|
815
|
+
return value;
|
|
816
|
+
} catch (reason) {
|
|
817
|
+
if (_MessageUtil.isBoxDismissed(reason)) {
|
|
818
|
+
return void 0;
|
|
819
|
+
}
|
|
820
|
+
throw reason;
|
|
821
|
+
}
|
|
822
|
+
}
|
|
823
|
+
//</editor-fold>
|
|
824
|
+
/**
|
|
825
|
+
* 关闭当前消息弹窗
|
|
826
|
+
*/
|
|
827
|
+
static closeBox() {
|
|
828
|
+
ElMessageBox.close();
|
|
829
|
+
}
|
|
830
|
+
/**
|
|
831
|
+
* 判断消息弹窗是否被取消或关闭
|
|
832
|
+
* @param {unknown} reason Promise 拒绝原因
|
|
833
|
+
* @returns {boolean}
|
|
834
|
+
* @private
|
|
835
|
+
*/
|
|
836
|
+
static isBoxDismissed(reason) {
|
|
837
|
+
return reason === "cancel" || reason === "close";
|
|
838
|
+
}
|
|
839
|
+
//</editor-fold>
|
|
840
|
+
};
|
|
841
|
+
|
|
842
|
+
// src/shared/utils/log-util.ts
|
|
843
|
+
var MaxMessageLength = 16 * 1024;
|
|
844
|
+
var MaxValueLength = 8 * 1024;
|
|
845
|
+
var MaxDataItems = 100;
|
|
846
|
+
var MaxCollectionItems = 100;
|
|
847
|
+
var MaxDepth = 10;
|
|
848
|
+
var MaxNodes = 500;
|
|
849
|
+
var LogUtil = class _LogUtil {
|
|
850
|
+
/**
|
|
851
|
+
* 标准化渲染进程日志请求
|
|
852
|
+
* @param {unknown} message 日志消息
|
|
853
|
+
* @param {unknown} data 附加数据
|
|
854
|
+
* @returns {XoIpcLogger.Request}
|
|
855
|
+
*/
|
|
856
|
+
static normalizeRequest(message, data) {
|
|
857
|
+
const budget = { remaining: MaxNodes };
|
|
858
|
+
const seen = /* @__PURE__ */ new WeakSet();
|
|
859
|
+
return {
|
|
860
|
+
message: _LogUtil.normalizeText(typeof message === "string" ? message : String(message ?? ""), MaxMessageLength),
|
|
861
|
+
data: (Array.isArray(data) ? data : []).slice(0, MaxDataItems).map((value) => _LogUtil.normalizeValue(value, 0, seen, budget))
|
|
862
|
+
};
|
|
863
|
+
}
|
|
864
|
+
/**
|
|
865
|
+
* 标准化日志值
|
|
866
|
+
* @param {unknown} value 原始值
|
|
867
|
+
* @param {number} depth 当前深度
|
|
868
|
+
* @param {WeakSet<object>} seen 已处理对象
|
|
869
|
+
* @param {NormalizeBudget} budget 处理预算
|
|
870
|
+
* @param {boolean} preserveNewlines 是否保留换行
|
|
871
|
+
* @returns {XoIpcLogger.Value}
|
|
872
|
+
* @private
|
|
873
|
+
*/
|
|
874
|
+
static normalizeValue(value, depth, seen, budget, preserveNewlines = false) {
|
|
875
|
+
if (budget.remaining <= 0) return "[Truncated]";
|
|
876
|
+
budget.remaining--;
|
|
877
|
+
if (value === null) return null;
|
|
878
|
+
if (typeof value === "string") return _LogUtil.normalizeText(value, MaxValueLength, preserveNewlines);
|
|
879
|
+
if (typeof value === "boolean") return value;
|
|
880
|
+
if (typeof value === "number") return Number.isFinite(value) ? value : String(value);
|
|
881
|
+
if (typeof value === "bigint") return `${value}n`;
|
|
882
|
+
if (typeof value === "undefined") return "[undefined]";
|
|
883
|
+
if (typeof value === "symbol") return `[Symbol ${value.description ?? ""}]`;
|
|
884
|
+
if (typeof value === "function") return `[Function ${value.name || "anonymous"}]`;
|
|
885
|
+
if (value instanceof Date) {
|
|
886
|
+
return Number.isNaN(value.getTime()) ? "[Invalid Date]" : value.toISOString();
|
|
887
|
+
}
|
|
888
|
+
if (value instanceof Error) {
|
|
889
|
+
return {
|
|
890
|
+
name: _LogUtil.normalizeText(value.name, MaxValueLength),
|
|
891
|
+
message: _LogUtil.normalizeText(value.message, MaxValueLength),
|
|
892
|
+
stack: _LogUtil.normalizeText(value.stack ?? "", MaxValueLength, true)
|
|
893
|
+
};
|
|
894
|
+
}
|
|
895
|
+
if (depth >= MaxDepth) return "[Max Depth]";
|
|
896
|
+
if (seen.has(value)) return "[Circular]";
|
|
897
|
+
seen.add(value);
|
|
898
|
+
try {
|
|
899
|
+
if (Array.isArray(value)) {
|
|
900
|
+
return value.slice(0, MaxCollectionItems).map((item) => _LogUtil.normalizeValue(item, depth + 1, seen, budget));
|
|
901
|
+
}
|
|
902
|
+
return Object.fromEntries(
|
|
903
|
+
Object.entries(value).slice(0, MaxCollectionItems).map(([key, item]) => [
|
|
904
|
+
_LogUtil.normalizeText(key, 128),
|
|
905
|
+
_LogUtil.normalizeValue(item, depth + 1, seen, budget, key === "stack")
|
|
906
|
+
])
|
|
907
|
+
);
|
|
908
|
+
} catch {
|
|
909
|
+
return "[Unserializable Object]";
|
|
910
|
+
} finally {
|
|
911
|
+
seen.delete(value);
|
|
912
|
+
}
|
|
913
|
+
}
|
|
914
|
+
/**
|
|
915
|
+
* 清理日志文本中的控制字符并限制长度
|
|
916
|
+
* @param {string} text 原始文本
|
|
917
|
+
* @param {number} maxLength 最大长度
|
|
918
|
+
* @param {boolean} preserveNewlines 是否保留换行
|
|
919
|
+
* @returns {string}
|
|
920
|
+
* @private
|
|
921
|
+
*/
|
|
922
|
+
static normalizeText(text, maxLength, preserveNewlines = false) {
|
|
923
|
+
const normalized = preserveNewlines ? text.replace(/\r\n?/g, "\n") : text.replace(/\r\n?|\n/g, "\\n");
|
|
924
|
+
return normalized.replace(/[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F]/g, "").slice(0, maxLength);
|
|
925
|
+
}
|
|
926
|
+
};
|
|
927
|
+
|
|
928
|
+
// src/renderer/utils/renderer-log-util.ts
|
|
929
|
+
var RendererLogUtil = class _RendererLogUtil {
|
|
930
|
+
/**
|
|
931
|
+
* 写入 debug 日志
|
|
932
|
+
* @param {string} message 日志消息
|
|
933
|
+
* @param {unknown[]} data 附加数据
|
|
934
|
+
* @returns {Promise<void>}
|
|
935
|
+
*/
|
|
936
|
+
static async debug(message, ...data) {
|
|
937
|
+
await _RendererLogUtil.write("debug", message, data);
|
|
938
|
+
}
|
|
939
|
+
/**
|
|
940
|
+
* 写入 info 日志
|
|
941
|
+
* @param {string} message 日志消息
|
|
942
|
+
* @param {unknown[]} data 附加数据
|
|
943
|
+
* @returns {Promise<void>}
|
|
944
|
+
*/
|
|
945
|
+
static async info(message, ...data) {
|
|
946
|
+
await _RendererLogUtil.write("info", message, data);
|
|
947
|
+
}
|
|
948
|
+
/**
|
|
949
|
+
* 写入 warn 日志
|
|
950
|
+
* @param {string} message 日志消息
|
|
951
|
+
* @param {unknown[]} data 附加数据
|
|
952
|
+
* @returns {Promise<void>}
|
|
953
|
+
*/
|
|
954
|
+
static async warn(message, ...data) {
|
|
955
|
+
await _RendererLogUtil.write("warn", message, data);
|
|
956
|
+
}
|
|
957
|
+
/**
|
|
958
|
+
* 写入 error 日志
|
|
959
|
+
* @param {string} message 日志消息
|
|
960
|
+
* @param {unknown[]} data 附加数据
|
|
961
|
+
* @returns {Promise<void>}
|
|
962
|
+
*/
|
|
963
|
+
static async error(message, ...data) {
|
|
964
|
+
await _RendererLogUtil.write("error", message, data);
|
|
965
|
+
}
|
|
966
|
+
/**
|
|
967
|
+
* 标准化并写入日志
|
|
968
|
+
* @param {XoIpcLogger.Level} level 日志等级
|
|
969
|
+
* @param {string} message 日志消息
|
|
970
|
+
* @param {unknown[]} data 附加数据
|
|
971
|
+
* @returns {Promise<void>}
|
|
972
|
+
* @private
|
|
973
|
+
*/
|
|
974
|
+
static async write(level, message, data) {
|
|
975
|
+
const normalized = LogUtil.normalizeRequest(message, data);
|
|
976
|
+
await window.xion.log[level](normalized.message, ...normalized.data);
|
|
977
|
+
}
|
|
978
|
+
};
|
|
979
|
+
|
|
980
|
+
// src/renderer/utils/renderer-util.ts
|
|
981
|
+
import { Fragment, isProxy, toRaw } from "vue";
|
|
982
|
+
var RendererUtil = class _RendererUtil {
|
|
983
|
+
/**
|
|
984
|
+
* 将字符串转换为 CSS 文本
|
|
985
|
+
* @param {string | undefined} value 字符串值
|
|
986
|
+
* @returns {string}
|
|
987
|
+
*/
|
|
988
|
+
static toCssText(value) {
|
|
989
|
+
if (value === void 0) {
|
|
990
|
+
return void 0;
|
|
991
|
+
}
|
|
992
|
+
return typeof value === "string" ? value : "";
|
|
993
|
+
}
|
|
994
|
+
/**
|
|
995
|
+
* 将数字转换为 CSS 尺寸
|
|
996
|
+
* @param {number | string | undefined} value 尺寸值
|
|
997
|
+
* @returns {string}
|
|
998
|
+
*/
|
|
999
|
+
static toCssSize(value) {
|
|
1000
|
+
if (value === void 0) {
|
|
1001
|
+
return void 0;
|
|
1002
|
+
}
|
|
1003
|
+
return typeof value === "number" ? `${value}px` : value;
|
|
1004
|
+
}
|
|
1005
|
+
/**
|
|
1006
|
+
* 判断插槽是否有内容
|
|
1007
|
+
* @param {Slots} slots 插槽对象
|
|
1008
|
+
* @param {string} name 插槽名称
|
|
1009
|
+
* @returns {boolean}
|
|
1010
|
+
*/
|
|
1011
|
+
static hasSlot(slots, name) {
|
|
1012
|
+
return _RendererUtil.hasVNodeContent(slots[name]?.() ?? []);
|
|
1013
|
+
}
|
|
1014
|
+
/**
|
|
1015
|
+
* 判断 VNode 是否有内容
|
|
1016
|
+
* @param {VNode[]} nodes VNode 数组
|
|
1017
|
+
* @returns {boolean}
|
|
1018
|
+
*/
|
|
1019
|
+
static hasVNodeContent(nodes) {
|
|
1020
|
+
return nodes.some((node) => {
|
|
1021
|
+
if (node.type === Comment) {
|
|
1022
|
+
return false;
|
|
1023
|
+
}
|
|
1024
|
+
if (node.type === Text) {
|
|
1025
|
+
return String(node.children).trim().length > 0;
|
|
1026
|
+
}
|
|
1027
|
+
if (node.type === Fragment) {
|
|
1028
|
+
return Array.isArray(node.children) ? _RendererUtil.hasVNodeContent(node.children) : false;
|
|
1029
|
+
}
|
|
1030
|
+
return true;
|
|
1031
|
+
});
|
|
1032
|
+
}
|
|
1033
|
+
/**
|
|
1034
|
+
* 获取 Vue Proxy 的原始对象
|
|
1035
|
+
*/
|
|
1036
|
+
static toRaw(value) {
|
|
1037
|
+
return isProxy(value) ? toRaw(value) : value;
|
|
1038
|
+
}
|
|
1039
|
+
};
|
|
1040
|
+
|
|
1041
|
+
// src/renderer/utils/router-util.ts
|
|
1042
|
+
import { computed as computed2 } from "vue";
|
|
1043
|
+
var RouterUtil = class _RouterUtil {
|
|
1044
|
+
/**
|
|
1045
|
+
* 路由实例
|
|
1046
|
+
* @type {Router | undefined}
|
|
1047
|
+
* @private
|
|
1048
|
+
*/
|
|
1049
|
+
static router;
|
|
1050
|
+
/**
|
|
1051
|
+
* 路由重定向监听移除方法
|
|
1052
|
+
* @type {(() => void) | undefined}
|
|
1053
|
+
* @private
|
|
1054
|
+
*/
|
|
1055
|
+
static offRouteRedirect;
|
|
1056
|
+
/**
|
|
1057
|
+
* 安装路由实例
|
|
1058
|
+
* @param {Router} router 路由实例
|
|
1059
|
+
*/
|
|
1060
|
+
static install(router) {
|
|
1061
|
+
this.router = router;
|
|
1062
|
+
this.bindRouteRedirect();
|
|
1063
|
+
}
|
|
1064
|
+
/**
|
|
1065
|
+
* 获取路由实例
|
|
1066
|
+
* @returns {Router}
|
|
1067
|
+
* @private
|
|
1068
|
+
*/
|
|
1069
|
+
static getRouter() {
|
|
1070
|
+
if (!this.router) {
|
|
1071
|
+
throw new Error("RouterUtil \u672A\u5B89\u88C5\u8DEF\u7531\u5B9E\u4F8B\uFF0C\u8BF7\u5148\u8C03\u7528 RouterUtil.install(router)");
|
|
1072
|
+
}
|
|
1073
|
+
return this.router;
|
|
1074
|
+
}
|
|
1075
|
+
/**
|
|
1076
|
+
* 绑定路由重定向监听
|
|
1077
|
+
* @private
|
|
1078
|
+
*/
|
|
1079
|
+
static bindRouteRedirect() {
|
|
1080
|
+
this.offRouteRedirect?.();
|
|
1081
|
+
this.offRouteRedirect = void 0;
|
|
1082
|
+
if (!window.xion?.window?.onRouteRedirect) {
|
|
1083
|
+
return;
|
|
1084
|
+
}
|
|
1085
|
+
this.offRouteRedirect = window.xion.window.onRouteRedirect((request) => {
|
|
1086
|
+
_RouterUtil.redirectRoute(request);
|
|
1087
|
+
});
|
|
1088
|
+
}
|
|
1089
|
+
/**
|
|
1090
|
+
* 重定向路由
|
|
1091
|
+
* @param {XoWindow.RouteRedirectRequest} request 路由重定向请求
|
|
1092
|
+
* @private
|
|
1093
|
+
*/
|
|
1094
|
+
static redirectRoute(request) {
|
|
1095
|
+
const messageTitle = "\u8DEF\u7531\u8DF3\u8F6C\u5931\u8D25";
|
|
1096
|
+
try {
|
|
1097
|
+
const route = request.routeName !== void 0 ? {
|
|
1098
|
+
...typeof request.route === "object" ? request.route : {},
|
|
1099
|
+
name: request.routeName
|
|
1100
|
+
} : request.route;
|
|
1101
|
+
if (!route) {
|
|
1102
|
+
MessageUtil.error(new Error("\u7F3A\u5C11\u8DEF\u7531\u76EE\u6807"), messageTitle);
|
|
1103
|
+
return;
|
|
1104
|
+
}
|
|
1105
|
+
const router = this.getRouter();
|
|
1106
|
+
const navigation = request.mode === "replace" ? router.replace(route) : router.push(route);
|
|
1107
|
+
void navigation.catch((error) => {
|
|
1108
|
+
MessageUtil.error(error, messageTitle);
|
|
1109
|
+
});
|
|
1110
|
+
} catch (error) {
|
|
1111
|
+
MessageUtil.error(error, messageTitle);
|
|
1112
|
+
}
|
|
1113
|
+
}
|
|
1114
|
+
/**
|
|
1115
|
+
* 获取父路由
|
|
1116
|
+
* @returns {RouteLocationMatched | null}
|
|
1117
|
+
*/
|
|
1118
|
+
static getParentRoute() {
|
|
1119
|
+
const matched = this.getRouter().currentRoute.value.matched;
|
|
1120
|
+
return matched.length > 1 ? matched[matched.length - 2] : null;
|
|
1121
|
+
}
|
|
1122
|
+
/**
|
|
1123
|
+
* 获取父路由名称
|
|
1124
|
+
* @returns {string}
|
|
1125
|
+
*/
|
|
1126
|
+
static getParentRouteName() {
|
|
1127
|
+
const parentRoute = _RouterUtil.getParentRoute();
|
|
1128
|
+
return typeof parentRoute?.name === "string" ? parentRoute.name : "";
|
|
1129
|
+
}
|
|
1130
|
+
/**
|
|
1131
|
+
* 获取当前路由名称
|
|
1132
|
+
* @returns {ComputedRef<string | symbol | undefined>}
|
|
1133
|
+
*/
|
|
1134
|
+
static getCurrentRouteName() {
|
|
1135
|
+
return computed2(() => this.getRouter().currentRoute.value.name);
|
|
1136
|
+
}
|
|
1137
|
+
/**
|
|
1138
|
+
* 判断路由是否激活
|
|
1139
|
+
* @param {XoComponentSidebarMenuRouteName} routeName 路由名称
|
|
1140
|
+
* @param {XoComponentSidebarMenuRouteName[]} activeRoutes 用于判断是否激活的路由名称数组,如果为空就使用 route 比对
|
|
1141
|
+
* @returns {boolean}
|
|
1142
|
+
*/
|
|
1143
|
+
static isRouteActive(routeName, activeRoutes) {
|
|
1144
|
+
const currentName = this.getRouter().currentRoute.value.name;
|
|
1145
|
+
if (!currentName) return false;
|
|
1146
|
+
return activeRoutes?.length ? activeRoutes.includes(currentName) : routeName === currentName;
|
|
1147
|
+
}
|
|
1148
|
+
/**
|
|
1149
|
+
* Router push by name
|
|
1150
|
+
* @param {RouteRecordName} name 路由名称
|
|
1151
|
+
* @param {LocationQueryRaw} query 请求参数
|
|
1152
|
+
*/
|
|
1153
|
+
static push(name, query) {
|
|
1154
|
+
void this.getRouter().push({ name, query });
|
|
1155
|
+
}
|
|
1156
|
+
/**
|
|
1157
|
+
* Router push
|
|
1158
|
+
* @param {RouteLocationRaw} to 路由目标
|
|
1159
|
+
*/
|
|
1160
|
+
static pushTo(to) {
|
|
1161
|
+
void this.getRouter().push(to);
|
|
1162
|
+
}
|
|
1163
|
+
/**
|
|
1164
|
+
* Router replace by name
|
|
1165
|
+
* @param {RouteRecordName} name 路由名称
|
|
1166
|
+
* @param {LocationQueryRaw} query 请求参数
|
|
1167
|
+
*/
|
|
1168
|
+
static replace(name, query) {
|
|
1169
|
+
void this.getRouter().replace({ name, query });
|
|
1170
|
+
}
|
|
1171
|
+
/**
|
|
1172
|
+
* Router replace by name
|
|
1173
|
+
* @param {RouteLocationRaw} to 路由目标
|
|
1174
|
+
*/
|
|
1175
|
+
static replaceTo(to) {
|
|
1176
|
+
void this.getRouter().replace(to);
|
|
1177
|
+
}
|
|
1178
|
+
/**
|
|
1179
|
+
* 路由会退
|
|
1180
|
+
*/
|
|
1181
|
+
static back() {
|
|
1182
|
+
this.getRouter().back();
|
|
1183
|
+
}
|
|
1184
|
+
/**
|
|
1185
|
+
* 路由前进
|
|
1186
|
+
*/
|
|
1187
|
+
static forward() {
|
|
1188
|
+
this.getRouter().forward();
|
|
1189
|
+
}
|
|
1190
|
+
/**
|
|
1191
|
+
* 路由历史跳转
|
|
1192
|
+
* @param {number} delta 跳转步数
|
|
1193
|
+
*/
|
|
1194
|
+
static go(delta) {
|
|
1195
|
+
this.getRouter().go(delta);
|
|
1196
|
+
}
|
|
1197
|
+
/**
|
|
1198
|
+
* 获取路由名称
|
|
1199
|
+
* @returns {RouteRecordNameGeneric}
|
|
1200
|
+
*/
|
|
1201
|
+
static getName() {
|
|
1202
|
+
return this.getRouter().currentRoute.value.name;
|
|
1203
|
+
}
|
|
1204
|
+
/**
|
|
1205
|
+
* 获取路由路径
|
|
1206
|
+
* @returns {string}
|
|
1207
|
+
*/
|
|
1208
|
+
static getPath() {
|
|
1209
|
+
return this.getRouter().currentRoute.value.path;
|
|
1210
|
+
}
|
|
1211
|
+
/**
|
|
1212
|
+
* 获取路由完整路径
|
|
1213
|
+
* @returns {string}
|
|
1214
|
+
*/
|
|
1215
|
+
static getFullPath() {
|
|
1216
|
+
return this.getRouter().currentRoute.value.fullPath;
|
|
1217
|
+
}
|
|
1218
|
+
/**
|
|
1219
|
+
* 获取路由元信息
|
|
1220
|
+
* @returns {RouteMeta}
|
|
1221
|
+
*/
|
|
1222
|
+
static getMeta() {
|
|
1223
|
+
return this.getRouter().currentRoute.value.meta;
|
|
1224
|
+
}
|
|
1225
|
+
/**
|
|
1226
|
+
* 获取路由参数
|
|
1227
|
+
* @returns {RouteParamsGeneric}
|
|
1228
|
+
*/
|
|
1229
|
+
static getParams() {
|
|
1230
|
+
return this.getRouter().currentRoute.value.params;
|
|
1231
|
+
}
|
|
1232
|
+
/**
|
|
1233
|
+
* 获取当前路由指定路径参数的值
|
|
1234
|
+
*
|
|
1235
|
+
* 路由参数由路径中的动态片段产生,例如 /user/:id 的 id
|
|
1236
|
+
* 当参数为数组时,返回数组中的第一个值。
|
|
1237
|
+
*
|
|
1238
|
+
* @param {string} key 参数名
|
|
1239
|
+
* @param {string} defaults 参数不存在时返回的默认值
|
|
1240
|
+
* @returns {string}
|
|
1241
|
+
*/
|
|
1242
|
+
static getParam(key, defaults = "") {
|
|
1243
|
+
const value = _RouterUtil.getParams()[key];
|
|
1244
|
+
if (value === void 0 || value === null) {
|
|
1245
|
+
return defaults;
|
|
1246
|
+
}
|
|
1247
|
+
return Array.isArray(value) ? value[0] ?? defaults : value;
|
|
1248
|
+
}
|
|
1249
|
+
/**
|
|
1250
|
+
* 获取当前路由指定路径参数的值数组
|
|
1251
|
+
*
|
|
1252
|
+
* 字符串参数会转换为单元素数组,重复路径参数会完整返回
|
|
1253
|
+
*
|
|
1254
|
+
* @param {string} key 参数名
|
|
1255
|
+
* @param {string[]} defaults 参数不存在时返回的默认值
|
|
1256
|
+
* @returns {string[]}
|
|
1257
|
+
*/
|
|
1258
|
+
static getParamArray(key, defaults = []) {
|
|
1259
|
+
const value = _RouterUtil.getParams()[key];
|
|
1260
|
+
if (value === void 0 || value === null) {
|
|
1261
|
+
return defaults;
|
|
1262
|
+
}
|
|
1263
|
+
return Array.isArray(value) ? value : [value];
|
|
1264
|
+
}
|
|
1265
|
+
/**
|
|
1266
|
+
* 获取请求参数映射
|
|
1267
|
+
* @returns {LocationQuery}
|
|
1268
|
+
*/
|
|
1269
|
+
static getQueryMap() {
|
|
1270
|
+
return this.getRouter().currentRoute.value.query;
|
|
1271
|
+
}
|
|
1272
|
+
/**
|
|
1273
|
+
* 获取请求参数的值的数组,单个结果也按数组返回
|
|
1274
|
+
* @param {string} key 参数名
|
|
1275
|
+
* @param {string[]} defaults 默认值
|
|
1276
|
+
* @returns {string[]}
|
|
1277
|
+
*/
|
|
1278
|
+
static getQueryArray(key, defaults = []) {
|
|
1279
|
+
const values = _RouterUtil.getQueryMap()[key];
|
|
1280
|
+
if (values === void 0 || values === null) {
|
|
1281
|
+
return defaults;
|
|
1282
|
+
}
|
|
1283
|
+
return Array.isArray(values) ? values.filter((value) => value !== null) : [values];
|
|
1284
|
+
}
|
|
1285
|
+
/**
|
|
1286
|
+
* 获取请求参数的值,如果值是数组,取第一个值返回
|
|
1287
|
+
* @param {string} key 参数名
|
|
1288
|
+
* @param {string} defaults 默认值
|
|
1289
|
+
* @returns {string}
|
|
1290
|
+
*/
|
|
1291
|
+
static getQuery(key, defaults = "") {
|
|
1292
|
+
return _RouterUtil.getQueryArray(key)[0] ?? defaults;
|
|
1293
|
+
}
|
|
1294
|
+
/**
|
|
1295
|
+
* location 重定向
|
|
1296
|
+
* @param {string} url 重定向地址
|
|
1297
|
+
*/
|
|
1298
|
+
static locationRedirect(url) {
|
|
1299
|
+
window.location.href = url;
|
|
1300
|
+
}
|
|
1301
|
+
/**
|
|
1302
|
+
* location 刷新
|
|
1303
|
+
*/
|
|
1304
|
+
static locationReload() {
|
|
1305
|
+
window.location.reload();
|
|
1306
|
+
}
|
|
1307
|
+
/**
|
|
1308
|
+
* 获取当前页面 href 路径
|
|
1309
|
+
* @returns {string}
|
|
1310
|
+
*/
|
|
1311
|
+
static getLocationHref() {
|
|
1312
|
+
return window.location.href;
|
|
1313
|
+
}
|
|
1314
|
+
/**
|
|
1315
|
+
* 拨打电话链接
|
|
1316
|
+
* @param {string} tel 电话号码
|
|
1317
|
+
* @returns {string}
|
|
1318
|
+
*/
|
|
1319
|
+
static tel(tel) {
|
|
1320
|
+
return `tel:${tel}`;
|
|
1321
|
+
}
|
|
1322
|
+
};
|
|
1323
|
+
|
|
1324
|
+
// src/renderer/utils/shortcut-util.ts
|
|
1325
|
+
var ShortcutUtil = class {
|
|
1326
|
+
/**
|
|
1327
|
+
* 创建全局快捷键
|
|
1328
|
+
* @param {XoShortcut.ID} id 快捷键ID
|
|
1329
|
+
* @param {string[]} keys 按键组合
|
|
1330
|
+
* @returns {XoShortcut.Key}
|
|
1331
|
+
*/
|
|
1332
|
+
static globalKey(id, keys) {
|
|
1333
|
+
return {
|
|
1334
|
+
id,
|
|
1335
|
+
keys,
|
|
1336
|
+
enabled: true,
|
|
1337
|
+
scope: "global"
|
|
1338
|
+
};
|
|
1339
|
+
}
|
|
1340
|
+
/**
|
|
1341
|
+
* 创建应用级快捷键
|
|
1342
|
+
* @param {XoShortcut.ID} id 快捷键ID
|
|
1343
|
+
* @param {string[]} keys 按键组合
|
|
1344
|
+
* @returns {XoShortcut.Key}
|
|
1345
|
+
*/
|
|
1346
|
+
static appKey(id, keys) {
|
|
1347
|
+
return {
|
|
1348
|
+
id,
|
|
1349
|
+
keys,
|
|
1350
|
+
enabled: true,
|
|
1351
|
+
scope: "app"
|
|
1352
|
+
};
|
|
1353
|
+
}
|
|
1354
|
+
};
|
|
1355
|
+
|
|
1356
|
+
// src/renderer/utils/storage-util.ts
|
|
1357
|
+
var prefix = "StorageUtil:";
|
|
1358
|
+
var StorageUtil = class {
|
|
1359
|
+
/**
|
|
1360
|
+
* 保存数据
|
|
1361
|
+
* @template T 数据类型
|
|
1362
|
+
* @param {string} key 键
|
|
1363
|
+
* @param {T} value 值
|
|
1364
|
+
* @param {number} expiresIn 可选有效期,单位毫秒,不传表示永不过期
|
|
1365
|
+
* @returns {void}
|
|
1366
|
+
* @throws {RangeError} 有效期不是大于 0 的有限数字时抛出
|
|
1367
|
+
* @example
|
|
1368
|
+
* // 不过期保存
|
|
1369
|
+
* StorageUtil.save('login.authType', 'totp')
|
|
1370
|
+
*
|
|
1371
|
+
* // 24 小时后过期
|
|
1372
|
+
* StorageUtil.save('login.authType', 'totp', 24 * 60 * 60 * 1000)
|
|
1373
|
+
*/
|
|
1374
|
+
static save(key, value, expiresIn) {
|
|
1375
|
+
if (key === "") {
|
|
1376
|
+
return;
|
|
1377
|
+
}
|
|
1378
|
+
if (expiresIn !== void 0 && (!Number.isFinite(expiresIn) || expiresIn <= 0)) {
|
|
1379
|
+
throw new RangeError("\u7F13\u5B58\u6709\u6548\u671F\u5FC5\u987B\u662F\u5927\u4E8E 0 \u7684\u6570\u5B57");
|
|
1380
|
+
}
|
|
1381
|
+
const entry = {
|
|
1382
|
+
expiresAt: expiresIn === void 0 ? null : Date.now() + expiresIn,
|
|
1383
|
+
value
|
|
1384
|
+
};
|
|
1385
|
+
window.localStorage.setItem(`${prefix}${key}`, JSON.stringify(entry));
|
|
1386
|
+
}
|
|
1387
|
+
/**
|
|
1388
|
+
* 获取数据
|
|
1389
|
+
* <p>数据不存在、过期或内容无效时返回 null</p>
|
|
1390
|
+
* @template T 数据类型
|
|
1391
|
+
* @param {string} key 键
|
|
1392
|
+
* @returns {T | null} 缓存数据
|
|
1393
|
+
* @example
|
|
1394
|
+
* // 获取数据,过期后返回 null 并自动删除
|
|
1395
|
+
* const value = StorageUtil.get<T>('key')
|
|
1396
|
+
*/
|
|
1397
|
+
static get(key) {
|
|
1398
|
+
const result = this.read(key);
|
|
1399
|
+
return result?.value ?? null;
|
|
1400
|
+
}
|
|
1401
|
+
/**
|
|
1402
|
+
* 判断数据是否存在且未过期
|
|
1403
|
+
* @param {string} key 键
|
|
1404
|
+
* @returns {boolean} 数据是否存在且未过期
|
|
1405
|
+
* @example
|
|
1406
|
+
* // 判断是否存在且未过期
|
|
1407
|
+
* const exists = StorageUtil.has('key')
|
|
1408
|
+
*/
|
|
1409
|
+
static has(key) {
|
|
1410
|
+
return this.read(key) !== null;
|
|
1411
|
+
}
|
|
1412
|
+
/**
|
|
1413
|
+
* 删除数据
|
|
1414
|
+
* @param {string} key 键
|
|
1415
|
+
* @returns {void}
|
|
1416
|
+
* @example
|
|
1417
|
+
* // 删除指定缓存
|
|
1418
|
+
* StorageUtil.remove('key')
|
|
1419
|
+
*/
|
|
1420
|
+
static remove(key) {
|
|
1421
|
+
if (key === "") {
|
|
1422
|
+
return;
|
|
1423
|
+
}
|
|
1424
|
+
window.localStorage.removeItem(`${prefix}${key}`);
|
|
1425
|
+
}
|
|
1426
|
+
/**
|
|
1427
|
+
* 清理全部由 StorageUtil 保存且已经过期的数据
|
|
1428
|
+
* <p>不会删除普通 localStorage 数据和旧版未包装数据</p>
|
|
1429
|
+
* @returns {number} 删除的数据数量
|
|
1430
|
+
* @example
|
|
1431
|
+
* // 清理全部由 StorageUtil 保存且已过期的数据
|
|
1432
|
+
* const count = StorageUtil.clearExpired()
|
|
1433
|
+
*/
|
|
1434
|
+
static clearExpired() {
|
|
1435
|
+
const expiredKeys = [];
|
|
1436
|
+
for (let index = 0; index < window.localStorage.length; index++) {
|
|
1437
|
+
const key = window.localStorage.key(index);
|
|
1438
|
+
if (key === null) {
|
|
1439
|
+
continue;
|
|
1440
|
+
}
|
|
1441
|
+
const data = window.localStorage.getItem(key);
|
|
1442
|
+
if (data === null) {
|
|
1443
|
+
continue;
|
|
1444
|
+
}
|
|
1445
|
+
try {
|
|
1446
|
+
const parsed = JSON.parse(data);
|
|
1447
|
+
if (this.isStorageEntry(parsed) && this.isExpired(parsed)) {
|
|
1448
|
+
expiredKeys.push(key);
|
|
1449
|
+
}
|
|
1450
|
+
} catch {
|
|
1451
|
+
}
|
|
1452
|
+
}
|
|
1453
|
+
expiredKeys.forEach((key) => window.localStorage.removeItem(key));
|
|
1454
|
+
return expiredKeys.length;
|
|
1455
|
+
}
|
|
1456
|
+
/**
|
|
1457
|
+
* 读取并校验存储数据
|
|
1458
|
+
* @template T 数据类型
|
|
1459
|
+
* @param {string} key 键
|
|
1460
|
+
* @returns {{value: T} | null} 有效数据,不存在或无效时返回 null
|
|
1461
|
+
* @private
|
|
1462
|
+
*/
|
|
1463
|
+
static read(key) {
|
|
1464
|
+
if (key === "") {
|
|
1465
|
+
return null;
|
|
1466
|
+
}
|
|
1467
|
+
const data = window.localStorage.getItem(`${prefix}${key}`);
|
|
1468
|
+
if (data === null) {
|
|
1469
|
+
return null;
|
|
1470
|
+
}
|
|
1471
|
+
try {
|
|
1472
|
+
const parsed = JSON.parse(data);
|
|
1473
|
+
if (!this.isStorageEntry(parsed)) {
|
|
1474
|
+
return null;
|
|
1475
|
+
}
|
|
1476
|
+
if (this.isExpired(parsed)) {
|
|
1477
|
+
window.localStorage.removeItem(`${prefix}${key}`);
|
|
1478
|
+
return null;
|
|
1479
|
+
}
|
|
1480
|
+
return {
|
|
1481
|
+
value: parsed.value
|
|
1482
|
+
};
|
|
1483
|
+
} catch {
|
|
1484
|
+
window.localStorage.removeItem(`${prefix}${key}`);
|
|
1485
|
+
return null;
|
|
1486
|
+
}
|
|
1487
|
+
}
|
|
1488
|
+
/**
|
|
1489
|
+
* 判断数据是否为 StorageUtil 包装结构
|
|
1490
|
+
* @param {unknown} value 待判断数据
|
|
1491
|
+
* @returns {value is Entry<unknown>} 是否为 StorageUtil 包装结构
|
|
1492
|
+
* @private
|
|
1493
|
+
*/
|
|
1494
|
+
static isStorageEntry(value) {
|
|
1495
|
+
if (value === null || value === void 0 || typeof value !== "object" || Array.isArray(value)) {
|
|
1496
|
+
return false;
|
|
1497
|
+
}
|
|
1498
|
+
const entry = value;
|
|
1499
|
+
return (entry.expiresAt === null || typeof entry.expiresAt === "number") && Object.hasOwn(entry, "value");
|
|
1500
|
+
}
|
|
1501
|
+
/**
|
|
1502
|
+
* 判断存储数据是否已经过期
|
|
1503
|
+
* @param {Entry<unknown>} entry 存储数据
|
|
1504
|
+
* @returns {boolean} 是否已经过期
|
|
1505
|
+
* @private
|
|
1506
|
+
*/
|
|
1507
|
+
static isExpired(entry) {
|
|
1508
|
+
return entry.expiresAt !== null && entry.expiresAt <= Date.now();
|
|
1509
|
+
}
|
|
1510
|
+
};
|
|
1511
|
+
export {
|
|
1512
|
+
AuthRouteUtil,
|
|
1513
|
+
ContextUtil,
|
|
1514
|
+
ErrorUtil,
|
|
1515
|
+
KeyboardUtil,
|
|
1516
|
+
MessageUtil,
|
|
1517
|
+
RendererLogUtil,
|
|
1518
|
+
RendererUtil,
|
|
1519
|
+
RouterUtil,
|
|
1520
|
+
ShortcutUtil,
|
|
1521
|
+
StorageUtil
|
|
1522
|
+
};
|