@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.
Files changed (542) hide show
  1. package/README.md +1 -0
  2. package/dist/bin/icon-generator.d.ts +22 -0
  3. package/dist/bin/index.d.ts +5 -0
  4. package/dist/bin/index.js +92 -0
  5. package/dist/bin/logo-generator.d.ts +22 -0
  6. package/dist/chunk-files/chunk-34OODP7M.js +147 -0
  7. package/dist/chunk-files/chunk-3KBZWBNP.js +51 -0
  8. package/dist/chunk-files/chunk-3R6EJDYR.js +10 -0
  9. package/dist/chunk-files/chunk-3RVKOFMP.js +68 -0
  10. package/dist/chunk-files/chunk-3S5OTD47.js +35 -0
  11. package/dist/chunk-files/chunk-3XB4IEWO.js +195 -0
  12. package/dist/chunk-files/chunk-3XOVD6UX.js +8 -0
  13. package/dist/chunk-files/chunk-4HEDNQUP.js +426 -0
  14. package/dist/chunk-files/chunk-4SSGMLEE.js +934 -0
  15. package/dist/chunk-files/chunk-5PKWVAQP.js +92 -0
  16. package/dist/chunk-files/chunk-6BOPFOZD.js +19 -0
  17. package/dist/chunk-files/chunk-6FDO72PN.js +25 -0
  18. package/dist/chunk-files/chunk-6X74EPRM.js +0 -0
  19. package/dist/chunk-files/chunk-B2FI5WI5.js +67 -0
  20. package/dist/chunk-files/chunk-B7DTBTWQ.js +74 -0
  21. package/dist/chunk-files/chunk-BFD2LHLK.js +60 -0
  22. package/dist/chunk-files/chunk-BJOPQNB2.js +319 -0
  23. package/dist/chunk-files/chunk-BMOLIJ3W.js +89 -0
  24. package/dist/chunk-files/chunk-BPTFUGTP.js +97 -0
  25. package/dist/chunk-files/chunk-CSUNGWAE.js +405 -0
  26. package/dist/chunk-files/chunk-D5ZV4VMI.js +627 -0
  27. package/dist/chunk-files/chunk-DD6WZ4NY.js +841 -0
  28. package/dist/chunk-files/chunk-DEODEAKM.js +19 -0
  29. package/dist/chunk-files/chunk-DRMV3M5V.js +1970 -0
  30. package/dist/chunk-files/chunk-EQTU45UO.js +21 -0
  31. package/dist/chunk-files/chunk-F7YTK2MY.js +154 -0
  32. package/dist/chunk-files/chunk-FMQTZ3QV.js +17 -0
  33. package/dist/chunk-files/chunk-FPN7JYR4.js +67 -0
  34. package/dist/chunk-files/chunk-FULHNQ4O.js +1243 -0
  35. package/dist/chunk-files/chunk-GN2FNR3Z.js +259 -0
  36. package/dist/chunk-files/chunk-GROGDGEL.js +177 -0
  37. package/dist/chunk-files/chunk-GUOSVDXA.js +34 -0
  38. package/dist/chunk-files/chunk-HT5V5A7S.js +6 -0
  39. package/dist/chunk-files/chunk-ID3YDA2K.js +19 -0
  40. package/dist/chunk-files/chunk-IH3R2NDR.js +230 -0
  41. package/dist/chunk-files/chunk-IMGYTSWY.js +261 -0
  42. package/dist/chunk-files/chunk-J34MOWJP.js +26 -0
  43. package/dist/chunk-files/chunk-KFK47PDH.js +77 -0
  44. package/dist/chunk-files/chunk-KFV4GXVE.js +11 -0
  45. package/dist/chunk-files/chunk-LFHJJQW3.js +723 -0
  46. package/dist/chunk-files/chunk-LQ67F6EY.js +32 -0
  47. package/dist/chunk-files/chunk-MJ6Q3TIX.js +703 -0
  48. package/dist/chunk-files/chunk-OUFO3LM4.js +135 -0
  49. package/dist/chunk-files/chunk-P4CX6I4J.js +14 -0
  50. package/dist/chunk-files/chunk-PL5KNBCY.js +78 -0
  51. package/dist/chunk-files/chunk-PVWRRUOK.js +11 -0
  52. package/dist/chunk-files/chunk-Q7LCZIQP.js +15 -0
  53. package/dist/chunk-files/chunk-Q7YMMN7J.js +220 -0
  54. package/dist/chunk-files/chunk-RAVPJRBA.js +118 -0
  55. package/dist/chunk-files/chunk-RN7AI33H.js +26 -0
  56. package/dist/chunk-files/chunk-RODB64YF.js +148 -0
  57. package/dist/chunk-files/chunk-SVTZ4T6S.js +10 -0
  58. package/dist/chunk-files/chunk-T3QCAOCO.js +20 -0
  59. package/dist/chunk-files/chunk-U4XEWVBH.js +19 -0
  60. package/dist/chunk-files/chunk-UCMR6V67.js +746 -0
  61. package/dist/chunk-files/chunk-UFYEZIUE.js +1269 -0
  62. package/dist/chunk-files/chunk-UIJUY7QZ.js +18 -0
  63. package/dist/chunk-files/chunk-VGDNICVG.js +67 -0
  64. package/dist/chunk-files/chunk-W2I3I7U7.js +35 -0
  65. package/dist/chunk-files/chunk-WGYOMA43.js +33 -0
  66. package/dist/chunk-files/chunk-WKVLVI6N.js +44 -0
  67. package/dist/chunk-files/chunk-WOJ2UKI7.js +11 -0
  68. package/dist/chunk-files/chunk-Y3OEXVQ2.js +59 -0
  69. package/dist/chunk-files/chunk-YLZRRUY7.js +6 -0
  70. package/dist/chunk-files/chunk-YTHS2ZV7.js +51 -0
  71. package/dist/chunk-files/chunk-YXAEUJKJ.js +331 -0
  72. package/dist/chunk-files/chunk-YZOJOLFL.js +121 -0
  73. package/dist/main/app/app-lifecycle-abstract.d.ts +190 -0
  74. package/dist/main/app/app-lifecycle.d.ts +7 -0
  75. package/dist/main/app/icons/icon.ico +0 -0
  76. package/dist/main/app/index.d.ts +8 -0
  77. package/dist/main/app/index.js +1226 -0
  78. package/dist/main/app/types/app.d.ts +74 -0
  79. package/dist/main/app/xo-app-abstract.d.ts +464 -0
  80. package/dist/main/app/xo-app.d.ts +23 -0
  81. package/dist/main/auth/index.d.ts +8 -0
  82. package/dist/main/auth/index.js +109 -0
  83. package/dist/main/auth/jwt-auth-manager.d.ts +302 -0
  84. package/dist/main/auth/jwt-auth-provider-abstract.d.ts +100 -0
  85. package/dist/main/auth/jwt-auth-refresh-rejected-error.d.ts +12 -0
  86. package/dist/main/auth/jwt-auth-session-changed-error.d.ts +12 -0
  87. package/dist/main/auth/types/jwt-auth-manager.d.ts +13 -0
  88. package/dist/main/banner/banner-abstract.d.ts +38 -0
  89. package/dist/main/banner/banner-manager.d.ts +20 -0
  90. package/dist/main/banner/index.d.ts +6 -0
  91. package/dist/main/banner/index.js +10 -0
  92. package/dist/main/banner/types/banner.d.ts +17 -0
  93. package/dist/main/config/app-config.d.ts +6 -0
  94. package/dist/main/config/index.d.ts +13 -0
  95. package/dist/main/config/index.js +33 -0
  96. package/dist/main/config/logger-config.d.ts +6 -0
  97. package/dist/main/config/remote-service-config.d.ts +6 -0
  98. package/dist/main/config/tray-config.d.ts +6 -0
  99. package/dist/main/config/types/app.d.ts +38 -0
  100. package/dist/main/config/types/logger.d.ts +82 -0
  101. package/dist/main/config/types/window.d.ts +35 -0
  102. package/dist/main/config/updater-config.d.ts +6 -0
  103. package/dist/main/config/window/main-window-config.d.ts +6 -0
  104. package/dist/main/config/window/setting-window-config.d.ts +6 -0
  105. package/dist/main/file-association/file-association-handlers-abstract.d.ts +23 -0
  106. package/dist/main/file-association/file-association-manager-abstract.d.ts +87 -0
  107. package/dist/main/file-association/file-association-manager.d.ts +13 -0
  108. package/dist/main/file-association/handlers/app-file-association-handlers.d.ts +12 -0
  109. package/dist/main/file-association/index.d.ts +8 -0
  110. package/dist/main/file-association/index.js +13 -0
  111. package/dist/main/file-association/types/file-association.d.ts +31 -0
  112. package/dist/main/ipc/handlers/app-handlers.d.ts +13 -0
  113. package/dist/main/ipc/handlers/auth-handlers.d.ts +12 -0
  114. package/dist/main/ipc/handlers/clipboard-handlers.d.ts +13 -0
  115. package/dist/main/ipc/handlers/contex-menu-handlers.d.ts +13 -0
  116. package/dist/main/ipc/handlers/dialog-handlers.d.ts +13 -0
  117. package/dist/main/ipc/handlers/file-handlers.d.ts +13 -0
  118. package/dist/main/ipc/handlers/log-handlers.d.ts +45 -0
  119. package/dist/main/ipc/handlers/remote-service-handlers.d.ts +13 -0
  120. package/dist/main/ipc/handlers/shell-handlers.d.ts +13 -0
  121. package/dist/main/ipc/handlers/theme-handlers.d.ts +13 -0
  122. package/dist/main/ipc/handlers/updater-handlers.d.ts +13 -0
  123. package/dist/main/ipc/handlers/window-handlers.d.ts +13 -0
  124. package/dist/main/ipc/index.d.ts +20 -0
  125. package/dist/main/ipc/index.js +60 -0
  126. package/dist/main/ipc/ipc-handlers-abstract.d.ts +23 -0
  127. package/dist/main/ipc/ipc-manager-abstract.d.ts +46 -0
  128. package/dist/main/ipc/ipc-manager.d.ts +13 -0
  129. package/dist/main/ipc/types/ipc-handler.d.ts +22 -0
  130. package/dist/main/ipc/utils/ipc-handler-util.d.ts +24 -0
  131. package/dist/main/logger/index.d.ts +4 -0
  132. package/dist/main/logger/index.js +13 -0
  133. package/dist/main/logger/xo-logger.d.ts +113 -0
  134. package/dist/main/menu/consts/menu-type.d.ts +1 -0
  135. package/dist/main/menu/index.d.ts +8 -0
  136. package/dist/main/menu/index.js +28 -0
  137. package/dist/main/menu/menu-items.d.ts +192 -0
  138. package/dist/main/menu/menu-manager-abstract.d.ts +273 -0
  139. package/dist/main/menu/menu-manager.d.ts +12 -0
  140. package/dist/main/menu/types/menu.d.ts +101 -0
  141. package/dist/main/mode/app-mode.d.ts +32 -0
  142. package/dist/main/mode/index.d.ts +5 -0
  143. package/dist/main/mode/index.js +9 -0
  144. package/dist/main/mode/types/mode.d.ts +25 -0
  145. package/dist/main/protocol/consts/protocol-keys.d.ts +10 -0
  146. package/dist/main/protocol/handlers/app-protocol-handlers.d.ts +12 -0
  147. package/dist/main/protocol/index.d.ts +9 -0
  148. package/dist/main/protocol/index.js +15 -0
  149. package/dist/main/protocol/protocol-handlers-abstract.d.ts +23 -0
  150. package/dist/main/protocol/protocol-manager-abstract.d.ts +85 -0
  151. package/dist/main/protocol/protocol-manager.d.ts +13 -0
  152. package/dist/main/protocol/types/protocol.d.ts +33 -0
  153. package/dist/main/remote-service/consts/remote-service-methods.d.ts +5 -0
  154. package/dist/main/remote-service/index.d.ts +7 -0
  155. package/dist/main/remote-service/index.js +17 -0
  156. package/dist/main/remote-service/remote-service-manager-abstract.d.ts +303 -0
  157. package/dist/main/remote-service/remote-service-manager.d.ts +7 -0
  158. package/dist/main/remote-service/types/remote-service.d.ts +9 -0
  159. package/dist/main/renderer-protocol/handlers/renderer-remote-service-protocol-handlers.d.ts +130 -0
  160. package/dist/main/renderer-protocol/handlers/renderer-root-protocol-handlers.d.ts +65 -0
  161. package/dist/main/renderer-protocol/index.d.ts +9 -0
  162. package/dist/main/renderer-protocol/index.js +18 -0
  163. package/dist/main/renderer-protocol/renderer-protocol-handlers-abstract.d.ts +23 -0
  164. package/dist/main/renderer-protocol/renderer-protocol-manager-abstract.d.ts +78 -0
  165. package/dist/main/renderer-protocol/renderer-protocol-manager.d.ts +13 -0
  166. package/dist/main/renderer-protocol/types/renderer-protocol.d.ts +34 -0
  167. package/dist/main/shortcut/handlers/app-shortcut-handlers.d.ts +11 -0
  168. package/dist/main/shortcut/handlers/window-shortcut-handlers.d.ts +11 -0
  169. package/dist/main/shortcut/index.d.ts +9 -0
  170. package/dist/main/shortcut/index.js +17 -0
  171. package/dist/main/shortcut/shortcut-handlers-abstract.d.ts +18 -0
  172. package/dist/main/shortcut/shortcut-manager-abstract.d.ts +121 -0
  173. package/dist/main/shortcut/shortcut-manager.d.ts +12 -0
  174. package/dist/main/shortcut/types/shortcut.d.ts +50 -0
  175. package/dist/main/store/app-store.d.ts +179 -0
  176. package/dist/main/store/index.d.ts +7 -0
  177. package/dist/main/store/index.js +13 -0
  178. package/dist/main/store/jwt-auth-store.d.ts +36 -0
  179. package/dist/main/store/types/app-store.d.ts +46 -0
  180. package/dist/main/store/types/jwt-auth-store.d.ts +14 -0
  181. package/dist/main/theme/consts/theme-sources.d.ts +10 -0
  182. package/dist/main/theme/index.d.ts +7 -0
  183. package/dist/main/theme/index.js +16 -0
  184. package/dist/main/theme/theme-manager-abstract.d.ts +93 -0
  185. package/dist/main/theme/theme-manager.d.ts +7 -0
  186. package/dist/main/theme/types/theme.d.ts +38 -0
  187. package/dist/main/tray/consts/tray-animation-name.d.ts +1 -0
  188. package/dist/main/tray/consts/tray-icon-name.d.ts +1 -0
  189. package/dist/main/tray/icons/blur.ico +0 -0
  190. package/dist/main/tray/icons/error.ico +0 -0
  191. package/dist/main/tray/icons/focus.ico +0 -0
  192. package/dist/main/tray/icons/none.ico +0 -0
  193. package/dist/main/tray/icons/offline.ico +0 -0
  194. package/dist/main/tray/icons/online.ico +0 -0
  195. package/dist/main/tray/icons/success.ico +0 -0
  196. package/dist/main/tray/index.d.ts +11 -0
  197. package/dist/main/tray/index.js +27 -0
  198. package/dist/main/tray/tray-animation.d.ts +48 -0
  199. package/dist/main/tray/tray-icon.d.ts +51 -0
  200. package/dist/main/tray/tray-lifecycle-abstract.d.ts +154 -0
  201. package/dist/main/tray/tray-lifecycle.d.ts +7 -0
  202. package/dist/main/tray/tray-manager.d.ts +173 -0
  203. package/dist/main/tray/types/tray.d.ts +81 -0
  204. package/dist/main/updater/dev-app-update.yml +5 -0
  205. package/dist/main/updater/index.d.ts +6 -0
  206. package/dist/main/updater/index.js +20 -0
  207. package/dist/main/updater/types/updater.d.ts +167 -0
  208. package/dist/main/updater/updater-manager-abstract.d.ts +237 -0
  209. package/dist/main/updater/updater-manager.d.ts +7 -0
  210. package/dist/main/utils/file-association-util.d.ts +43 -0
  211. package/dist/main/utils/index.d.ts +14 -0
  212. package/dist/main/utils/index.js +105 -0
  213. package/dist/main/utils/menu-util.d.ts +12 -0
  214. package/dist/main/utils/protocol-util.d.ts +49 -0
  215. package/dist/main/utils/runtime-config-util.d.ts +75 -0
  216. package/dist/main/utils/shortcut-util.d.ts +38 -0
  217. package/dist/main/utils/tray-util.d.ts +18 -0
  218. package/dist/main/utils/window-util.d.ts +55 -0
  219. package/dist/main/utils/xo-app-root-util.d.ts +30 -0
  220. package/dist/main/utils/xo-app-util.d.ts +24 -0
  221. package/dist/main/utils/xo-path-util.d.ts +59 -0
  222. package/dist/main/utils/xo-util.d.ts +17 -0
  223. package/dist/main/window/index.d.ts +10 -0
  224. package/dist/main/window/index.js +36 -0
  225. package/dist/main/window/main/main-window-lifecycle.d.ts +7 -0
  226. package/dist/main/window/main/main-window-type.d.ts +5 -0
  227. package/dist/main/window/setting/setting-window-lifecycle.d.ts +7 -0
  228. package/dist/main/window/setting/setting-window-type.d.ts +5 -0
  229. package/dist/main/window/types/window.d.ts +86 -0
  230. package/dist/main/window/window-lifecycle-abstract.d.ts +514 -0
  231. package/dist/main/window/window-manager.d.ts +422 -0
  232. package/dist/preload/bridge/bridge-abstract.d.ts +11 -0
  233. package/dist/preload/bridge/bridge.d.ts +35 -0
  234. package/dist/preload/bridge/index.d.ts +6 -0
  235. package/dist/preload/bridge/index.js +117 -0
  236. package/dist/preload/bridge/preload.cjs +1706 -0
  237. package/dist/preload/bridge/preload.internal.d.ts +1 -0
  238. package/dist/preload/bridge/types/bridge.d.ts +19 -0
  239. package/dist/preload/bridges/app/app-bridge.d.ts +142 -0
  240. package/dist/preload/bridges/app/types/app.d.ts +65 -0
  241. package/dist/preload/bridges/auth/auth-bridge.d.ts +36 -0
  242. package/dist/preload/bridges/auth/types/auth.d.ts +23 -0
  243. package/dist/preload/bridges/clipboard/clipboard-bridge.d.ts +37 -0
  244. package/dist/preload/bridges/clipboard/types/clipboard.d.ts +23 -0
  245. package/dist/preload/bridges/context-menu/context-menu-bridge.d.ts +27 -0
  246. package/dist/preload/bridges/context-menu/types/context-menu.d.ts +19 -0
  247. package/dist/preload/bridges/dialog/dialog-bridge.d.ts +30 -0
  248. package/dist/preload/bridges/dialog/types/dialog.d.ts +41 -0
  249. package/dist/preload/bridges/file/file-bridge.d.ts +34 -0
  250. package/dist/preload/bridges/file/types/file.d.ts +21 -0
  251. package/dist/preload/bridges/index.d.ts +29 -0
  252. package/dist/preload/bridges/index.js +40 -0
  253. package/dist/preload/bridges/ipc/ipc-bridge.d.ts +43 -0
  254. package/dist/preload/bridges/ipc/types/ipc.d.ts +23 -0
  255. package/dist/preload/bridges/log/log-bridge.d.ts +52 -0
  256. package/dist/preload/bridges/log/types/log.d.ts +20 -0
  257. package/dist/preload/bridges/remote-service/remote-service-bridge.d.ts +55 -0
  258. package/dist/preload/bridges/remote-service/types/remote-service.d.ts +29 -0
  259. package/dist/preload/bridges/shell/shell-bridge.d.ts +27 -0
  260. package/dist/preload/bridges/shell/types/shell.d.ts +19 -0
  261. package/dist/preload/bridges/theme/theme-bridge.d.ts +32 -0
  262. package/dist/preload/bridges/theme/types/theme.d.ts +21 -0
  263. package/dist/preload/bridges/updater/types/updater.d.ts +35 -0
  264. package/dist/preload/bridges/updater/updater-bridge.d.ts +66 -0
  265. package/dist/preload/bridges/window/internal/route-redirect-buffer.d.ts +36 -0
  266. package/dist/preload/bridges/window/types/window.d.ts +53 -0
  267. package/dist/preload/bridges/window/window-bridge.d.ts +118 -0
  268. package/dist/preload/utils/bridge-util.d.ts +43 -0
  269. package/dist/preload/utils/index.d.ts +4 -0
  270. package/dist/preload/utils/index.js +7 -0
  271. package/dist/renderer/app/bootstrap-renderer.d.ts +6 -0
  272. package/dist/renderer/app/index.d.ts +5 -0
  273. package/dist/renderer/app/index.js +164 -0
  274. package/dist/renderer/app/styles-element-plus.internal.d.ts +2 -0
  275. package/dist/renderer/app/styles-xion.internal.d.ts +2 -0
  276. package/dist/renderer/app/types/app.d.ts +51 -0
  277. package/dist/renderer/components/captcha/internal/captcha-controller.d.ts +280 -0
  278. package/dist/renderer/components/captcha/internal/captcha-css-property.d.ts +25 -0
  279. package/dist/renderer/components/captcha/internal/captcha-defaults.d.ts +33 -0
  280. package/dist/renderer/components/captcha/internal/captcha-errors.d.ts +21 -0
  281. package/dist/renderer/components/captcha/internal/captcha-helper.d.ts +72 -0
  282. package/dist/renderer/components/captcha/internal/captcha-injector.d.ts +16 -0
  283. package/dist/renderer/components/captcha/internal/captcha-runtime-types.d.ts +153 -0
  284. package/dist/renderer/components/captcha/internal/captcha-service.d.ts +22 -0
  285. package/dist/renderer/components/captcha/internal/captcha-slide-types.d.ts +62 -0
  286. package/dist/renderer/components/captcha/internal/captcha-ui-patch.d.ts +43 -0
  287. package/dist/renderer/components/captcha/internal/captcha-wasm-loader.d.ts +36 -0
  288. package/dist/renderer/components/captcha/style/index.less +132 -0
  289. package/dist/renderer/components/captcha/types/captcha.d.ts +132 -0
  290. package/dist/renderer/components/captcha/xo-captcha-host.vue +151 -0
  291. package/dist/renderer/components/captcha/xo-captcha.vue +83 -0
  292. package/dist/renderer/components/captcha.d.ts +40 -0
  293. package/dist/renderer/components/context-menu/types/context-menu.d.ts +55 -0
  294. package/dist/renderer/components/context-menu/xo-context-menu-items.vue +112 -0
  295. package/dist/renderer/components/context-menu/xo-context-menu.vue +356 -0
  296. package/dist/renderer/components/context-menu.d.ts +32 -0
  297. package/dist/renderer/components/divider/types/divider.d.ts +31 -0
  298. package/dist/renderer/components/divider/xo-divider.vue +176 -0
  299. package/dist/renderer/components/form/types/form-flex-row.d.ts +21 -0
  300. package/dist/renderer/components/form/types/form-flex.d.ts +49 -0
  301. package/dist/renderer/components/form/xo-form-flex-row.vue +122 -0
  302. package/dist/renderer/components/form/xo-form-flex.vue +115 -0
  303. package/dist/renderer/components/index.d.ts +70 -0
  304. package/dist/renderer/components/index.js +1282 -0
  305. package/dist/renderer/components/layouts/types/app-layout.d.ts +29 -0
  306. package/dist/renderer/components/layouts/types/mini-layout.d.ts +23 -0
  307. package/dist/renderer/components/layouts/types/simple-layout.d.ts +17 -0
  308. package/dist/renderer/components/layouts/xo-app-layout.vue +350 -0
  309. package/dist/renderer/components/layouts/xo-mini-layout.vue +207 -0
  310. package/dist/renderer/components/layouts/xo-simple-layout.vue +43 -0
  311. package/dist/renderer/components/pages/types/app-page.d.ts +25 -0
  312. package/dist/renderer/components/pages/types/bootstrap-page.d.ts +35 -0
  313. package/dist/renderer/components/pages/types/dynamic-page.d.ts +20 -0
  314. package/dist/renderer/components/pages/types/settings-page.d.ts +23 -0
  315. package/dist/renderer/components/pages/xo-app-page.vue +230 -0
  316. package/dist/renderer/components/pages/xo-bootstrap-page.vue +93 -0
  317. package/dist/renderer/components/pages/xo-dynamic-page.vue +28 -0
  318. package/dist/renderer/components/pages/xo-settings-page.vue +143 -0
  319. package/dist/renderer/components/radio-group/types/radio-group.d.ts +30 -0
  320. package/dist/renderer/components/radio-group/xo-radio-group.vue +38 -0
  321. package/dist/renderer/components/service-status-bar/types/service-status-bar.d.ts +65 -0
  322. package/dist/renderer/components/service-status-bar/xo-service-status-bar.vue +193 -0
  323. package/dist/renderer/components/settings-components/types/setting-app-opacity.d.ts +19 -0
  324. package/dist/renderer/components/settings-components/types/setting-log-level.d.ts +23 -0
  325. package/dist/renderer/components/settings-components/types/setting-shortcut-keys-record-for-form-flex-rows.d.ts +47 -0
  326. package/dist/renderer/components/settings-components/types/setting-shortcut-keys-record.d.ts +23 -0
  327. package/dist/renderer/components/settings-components/types/setting-window-material.d.ts +23 -0
  328. package/dist/renderer/components/settings-components/xo-setting-app-opacity.vue +105 -0
  329. package/dist/renderer/components/settings-components/xo-setting-log-level.vue +84 -0
  330. package/dist/renderer/components/settings-components/xo-setting-shortcut-keys-record-for-form-flex-rows.vue +37 -0
  331. package/dist/renderer/components/settings-components/xo-setting-shortcut-keys-record.vue +74 -0
  332. package/dist/renderer/components/settings-components/xo-setting-window-material.vue +83 -0
  333. package/dist/renderer/components/settings-pages/types/setting-page-folder.d.ts +41 -0
  334. package/dist/renderer/components/settings-pages/types/setting-page-general.d.ts +23 -0
  335. package/dist/renderer/components/settings-pages/types/setting-page-remote-service.d.ts +19 -0
  336. package/dist/renderer/components/settings-pages/types/setting-page-updater.d.ts +27 -0
  337. package/dist/renderer/components/settings-pages/xo-setting-page-folder.vue +137 -0
  338. package/dist/renderer/components/settings-pages/xo-setting-page-general.vue +255 -0
  339. package/dist/renderer/components/settings-pages/xo-setting-page-remote-service.vue +183 -0
  340. package/dist/renderer/components/settings-pages/xo-setting-page-updater.vue +350 -0
  341. package/dist/renderer/components/shortcut-keys-record/types/shortcut-keys-record.d.ts +25 -0
  342. package/dist/renderer/components/shortcut-keys-record/xo-shortcut-keys-record.vue +161 -0
  343. package/dist/renderer/components/side-bar/types/sidebar-logo.d.ts +39 -0
  344. package/dist/renderer/components/side-bar/xo-sidebar-logo.vue +133 -0
  345. package/dist/renderer/components/spacing-line/types/spacing-line.d.ts +17 -0
  346. package/dist/renderer/components/spacing-line/xo-spacing-line.vue +53 -0
  347. package/dist/renderer/components/theme-switch/types/theme-switch-mini.d.ts +21 -0
  348. package/dist/renderer/components/theme-switch/types/theme-switch.d.ts +45 -0
  349. package/dist/renderer/components/theme-switch/xo-theme-switch-mini.vue +93 -0
  350. package/dist/renderer/components/theme-switch/xo-theme-switch.vue +200 -0
  351. package/dist/renderer/components/title-bar/types/title-bar.d.ts +58 -0
  352. package/dist/renderer/components/title-bar/xo-title-bar.vue +364 -0
  353. package/dist/renderer/components/types/sidebar-menu.d.ts +37 -0
  354. package/dist/renderer/components/types/vue.d.ts +9 -0
  355. package/dist/renderer/components/updater/types/updater.d.ts +97 -0
  356. package/dist/renderer/components/updater/xo-updater.vue +1190 -0
  357. package/dist/renderer/components/window-control/types/window-control.d.ts +17 -0
  358. package/dist/renderer/components/window-control/xo-window-control.vue +193 -0
  359. package/dist/renderer/composables/index.d.ts +7 -0
  360. package/dist/renderer/composables/index.js +570 -0
  361. package/dist/renderer/composables/use-xo-boolean.d.ts +14 -0
  362. package/dist/renderer/composables/use-xo-data-loader.d.ts +73 -0
  363. package/dist/renderer/composables/use-xo-form-control.d.ts +84 -0
  364. package/dist/renderer/composables/use-xo-updater-action.d.ts +25 -0
  365. package/dist/renderer/global/index.d.ts +4 -0
  366. package/dist/renderer/global/index.js +0 -0
  367. package/dist/renderer/global/types/window.d.ts +21 -0
  368. package/dist/renderer/icons/demo.css +539 -0
  369. package/dist/renderer/icons/iconfont.css +490 -0
  370. package/dist/renderer/services/index.d.ts +6 -0
  371. package/dist/renderer/services/index.js +444 -0
  372. package/dist/renderer/services/orval-axios-mutator.d.ts +9 -0
  373. package/dist/renderer/services/types/xo-api.d.ts +92 -0
  374. package/dist/renderer/services/xo-api-requester.d.ts +129 -0
  375. package/dist/renderer/store/app/app-store.d.ts +68 -0
  376. package/dist/renderer/store/auth/auth-store.d.ts +43 -0
  377. package/dist/renderer/store/index.d.ts +9 -0
  378. package/dist/renderer/store/index.js +595 -0
  379. package/dist/renderer/store/remote-service/remote-service-store.d.ts +52 -0
  380. package/dist/renderer/store/theme/theme-store.d.ts +52 -0
  381. package/dist/renderer/store/updater/updater-store.d.ts +88 -0
  382. package/dist/renderer/store/window/window-store.d.ts +58 -0
  383. package/dist/renderer/styles/css/element-plus.less +280 -0
  384. package/dist/renderer/styles/css/iconfont-patch.less +6 -0
  385. package/dist/renderer/styles/css/reset.less +83 -0
  386. package/dist/renderer/styles/css/scrollbar.less +56 -0
  387. package/dist/renderer/styles/index.less +35 -0
  388. package/dist/renderer/styles/mixin.less +144 -0
  389. package/dist/renderer/styles/var/element-plus/dark.less +32 -0
  390. package/dist/renderer/styles/var/element-plus/root.less +88 -0
  391. package/dist/renderer/styles/var/global/dark.less +10 -0
  392. package/dist/renderer/styles/var/global/root.less +46 -0
  393. package/dist/renderer/styles/var/layout/dark.less +7 -0
  394. package/dist/renderer/styles/var/layout/root.less +9 -0
  395. package/dist/renderer/styles/var/scrollbar/dark.less +13 -0
  396. package/dist/renderer/styles/var/scrollbar/root.less +35 -0
  397. package/dist/renderer/utils/auth-route-util.d.ts +117 -0
  398. package/dist/renderer/utils/context-util.d.ts +13 -0
  399. package/dist/renderer/utils/error-util.d.ts +12 -0
  400. package/dist/renderer/utils/index.d.ts +14 -0
  401. package/dist/renderer/utils/index.js +1522 -0
  402. package/dist/renderer/utils/keyboard-util.d.ts +86 -0
  403. package/dist/renderer/utils/message-util.d.ts +161 -0
  404. package/dist/renderer/utils/renderer-log-util.d.ts +44 -0
  405. package/dist/renderer/utils/renderer-util.d.ts +37 -0
  406. package/dist/renderer/utils/router-util.d.ts +186 -0
  407. package/dist/renderer/utils/shortcut-util.d.ts +20 -0
  408. package/dist/renderer/utils/storage-util.d.ts +85 -0
  409. package/dist/renderer/utils/types/vue-router.d.ts +17 -0
  410. package/dist/shared/app/consts/app-launch-mode.d.ts +9 -0
  411. package/dist/shared/app/consts/update-mode.d.ts +8 -0
  412. package/dist/shared/app/consts/window-close-behavior.d.ts +8 -0
  413. package/dist/shared/app/consts/window-material.d.ts +8 -0
  414. package/dist/shared/app/consts/xion-name.d.ts +5 -0
  415. package/dist/shared/app/electron-app-config.d.ts +5 -0
  416. package/dist/shared/app/index.d.ts +16 -0
  417. package/dist/shared/app/index.js +30 -0
  418. package/dist/shared/app/types/app-info.d.ts +32 -0
  419. package/dist/shared/app/types/app-launch-mode.d.ts +13 -0
  420. package/dist/shared/app/types/app-paths.d.ts +27 -0
  421. package/dist/shared/app/types/general-settings.d.ts +27 -0
  422. package/dist/shared/app/types/on-window-close.d.ts +13 -0
  423. package/dist/shared/app/types/update-mode.d.ts +13 -0
  424. package/dist/shared/app/types/window-material.d.ts +2 -0
  425. package/dist/shared/auth/const/auth-status.d.ts +2 -0
  426. package/dist/shared/auth/index.d.ts +5 -0
  427. package/dist/shared/auth/index.js +5 -0
  428. package/dist/shared/auth/types/auth.d.ts +78 -0
  429. package/dist/shared/color/consts/color.d.ts +5 -0
  430. package/dist/shared/color/index.d.ts +5 -0
  431. package/dist/shared/color/index.js +6 -0
  432. package/dist/shared/color/types/color.d.ts +26 -0
  433. package/dist/shared/electron-builder/index.d.ts +4 -0
  434. package/dist/shared/electron-builder/index.js +0 -0
  435. package/dist/shared/electron-builder/types/electron-builder-options.d.ts +34 -0
  436. package/dist/shared/errors/index.d.ts +4 -0
  437. package/dist/shared/errors/index.js +10 -0
  438. package/dist/shared/errors/ipc-invoke-error.d.ts +32 -0
  439. package/dist/shared/ipc/channels/app-channels.d.ts +56 -0
  440. package/dist/shared/ipc/channels/auth-channels.d.ts +14 -0
  441. package/dist/shared/ipc/channels/clipboard-channels.d.ts +14 -0
  442. package/dist/shared/ipc/channels/context-menu-channels.d.ts +10 -0
  443. package/dist/shared/ipc/channels/dialog-channels.d.ts +12 -0
  444. package/dist/shared/ipc/channels/file-channels.d.ts +12 -0
  445. package/dist/shared/ipc/channels/log-channels.d.ts +14 -0
  446. package/dist/shared/ipc/channels/remote-service-channels.d.ts +20 -0
  447. package/dist/shared/ipc/channels/shell-channels.d.ts +10 -0
  448. package/dist/shared/ipc/channels/theme-channels.d.ts +12 -0
  449. package/dist/shared/ipc/channels/updater-channels.d.ts +26 -0
  450. package/dist/shared/ipc/channels/window-channels.d.ts +44 -0
  451. package/dist/shared/ipc/consts/ipc-channel.d.ts +1 -0
  452. package/dist/shared/ipc/index.d.ts +19 -0
  453. package/dist/shared/ipc/index.js +46 -0
  454. package/dist/shared/ipc/ipc-result.d.ts +20 -0
  455. package/dist/shared/ipc/types/ipc-logger.d.ts +27 -0
  456. package/dist/shared/ipc/types/ipc.d.ts +61 -0
  457. package/dist/shared/logger/consts/log-levels.d.ts +14 -0
  458. package/dist/shared/logger/index.d.ts +4 -0
  459. package/dist/shared/logger/index.js +10 -0
  460. package/dist/shared/menu/consts/menu-command.d.ts +1 -0
  461. package/dist/shared/menu/index.d.ts +6 -0
  462. package/dist/shared/menu/index.js +10 -0
  463. package/dist/shared/menu/menu-command.d.ts +24 -0
  464. package/dist/shared/menu/types/menu.d.ts +72 -0
  465. package/dist/shared/mode/consts/command.d.ts +10 -0
  466. package/dist/shared/mode/consts/mode.d.ts +22 -0
  467. package/dist/shared/mode/index.d.ts +5 -0
  468. package/dist/shared/mode/index.js +18 -0
  469. package/dist/shared/remote-service/const/remote-service.d.ts +8 -0
  470. package/dist/shared/remote-service/index.d.ts +5 -0
  471. package/dist/shared/remote-service/index.js +38 -0
  472. package/dist/shared/remote-service/types/remote-service.d.ts +146 -0
  473. package/dist/shared/renderer/index.d.ts +7 -0
  474. package/dist/shared/renderer/index.js +0 -0
  475. package/dist/shared/renderer/types/element-plus.d.ts +20 -0
  476. package/dist/shared/renderer/types/input.d.ts +11 -0
  477. package/dist/shared/renderer/types/options.d.ts +22 -0
  478. package/dist/shared/renderer/types/switch.d.ts +11 -0
  479. package/dist/shared/renderer-protocol/consts/renderer-protocol-keys.d.ts +10 -0
  480. package/dist/shared/renderer-protocol/index.d.ts +5 -0
  481. package/dist/shared/renderer-protocol/index.js +6 -0
  482. package/dist/shared/renderer-protocol/types/renderer-protocol.d.ts +7 -0
  483. package/dist/shared/runtime/index.d.ts +4 -0
  484. package/dist/shared/runtime/index.js +0 -0
  485. package/dist/shared/runtime/types/runtime.d.ts +20 -0
  486. package/dist/shared/shortcut/consts/shortcut-handler-ids.d.ts +9 -0
  487. package/dist/shared/shortcut/consts/shortcut-id.d.ts +1 -0
  488. package/dist/shared/shortcut/index.d.ts +6 -0
  489. package/dist/shared/shortcut/index.js +10 -0
  490. package/dist/shared/shortcut/types/shortcut.d.ts +13 -0
  491. package/dist/shared/utils/bytes-util.d.ts +16 -0
  492. package/dist/shared/utils/index.d.ts +15 -0
  493. package/dist/shared/utils/index.js +42 -0
  494. package/dist/shared/utils/ipc-util.d.ts +12 -0
  495. package/dist/shared/utils/log-util.d.ts +33 -0
  496. package/dist/shared/utils/menu-util.d.ts +12 -0
  497. package/dist/shared/utils/number-util.d.ts +12 -0
  498. package/dist/shared/utils/object-util.d.ts +88 -0
  499. package/dist/shared/utils/regexp-util.d.ts +22 -0
  500. package/dist/shared/utils/shortcut-util.d.ts +12 -0
  501. package/dist/shared/utils/string-util.d.ts +14 -0
  502. package/dist/shared/utils/time-util.d.ts +32 -0
  503. package/dist/shared/utils/validator-util.d.ts +12 -0
  504. package/dist/shared/utils/window-shared-util.d.ts +26 -0
  505. package/dist/shared/window/consts/window-record-id.d.ts +2 -0
  506. package/dist/shared/window/consts/window-type-name.d.ts +1 -0
  507. package/dist/shared/window/identity/main-window-identity.d.ts +5 -0
  508. package/dist/shared/window/identity/setting-window-identity.d.ts +5 -0
  509. package/dist/shared/window/index.d.ts +8 -0
  510. package/dist/shared/window/index.js +23 -0
  511. package/dist/shared/window/types/window.d.ts +84 -0
  512. package/dist/types/index.d.ts +102 -0
  513. package/dist/types/index.js +0 -0
  514. package/dist/vite/build/build-chunk.d.ts +53 -0
  515. package/dist/vite/build/build-csp-update.d.ts +80 -0
  516. package/dist/vite/build/build-obfuscation.d.ts +33 -0
  517. package/dist/vite/build/component-map.d.ts +38 -0
  518. package/dist/vite/build/component-resolver.d.ts +6 -0
  519. package/dist/vite/build/index.d.ts +9 -0
  520. package/dist/vite/build/index.js +18 -0
  521. package/dist/vite/build/types/build.d.ts +13 -0
  522. package/dist/vite/config/electron-app-config.d.ts +6 -0
  523. package/dist/vite/config/electron-builder-config.d.ts +8 -0
  524. package/dist/vite/config/electron-vite-config.d.ts +9 -0
  525. package/dist/vite/config/index.d.ts +11 -0
  526. package/dist/vite/config/index.js +2259 -0
  527. package/dist/vite/config/types/electron-app-options.d.ts +22 -0
  528. package/dist/vite/config/types/electron-builder-options.d.ts +16 -0
  529. package/dist/vite/config/types/electron-vite-options.d.ts +43 -0
  530. package/dist/vite/config/types/vite-obfuscation.d.ts +36 -0
  531. package/dist/vite/config/vite-obfuscation-config.d.ts +6 -0
  532. package/dist/vite/mode/index.d.ts +4 -0
  533. package/dist/vite/mode/index.js +8 -0
  534. package/dist/vite/mode/vite-mode.d.ts +37 -0
  535. package/dist/vite/orval/index.d.ts +4 -0
  536. package/dist/vite/orval/index.js +75 -0
  537. package/dist/vite/orval/orval-global-types.d.ts +23 -0
  538. package/dist/vite/utils/file-write-vite-util.d.ts +30 -0
  539. package/dist/vite/utils/index.d.ts +5 -0
  540. package/dist/vite/utils/index.js +10 -0
  541. package/dist/vite/utils/runtime-config-vite-util.d.ts +39 -0
  542. 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
+ };