electron-multi-app-kit 0.1.0

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 (42) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +611 -0
  3. package/dist/core/context.d.ts +15 -0
  4. package/dist/core/eventBus.d.ts +2 -0
  5. package/dist/core/lifecycle.d.ts +9 -0
  6. package/dist/create-app.d.ts +30 -0
  7. package/dist/index-CtN4cHF_.mjs +4 -0
  8. package/dist/index.d.ts +28 -0
  9. package/dist/index.js +1 -0
  10. package/dist/modules/autoLaunch.d.ts +47 -0
  11. package/dist/modules/batchDownloader.d.ts +89 -0
  12. package/dist/modules/downloader.d.ts +38 -0
  13. package/dist/modules/downloader.optimized.d.ts +45 -0
  14. package/dist/modules/instance.d.ts +8 -0
  15. package/dist/modules/ipc/builtins/dialog.d.ts +6 -0
  16. package/dist/modules/ipc/builtins/downloader.d.ts +6 -0
  17. package/dist/modules/ipc/builtins/fs-api.d.ts +4 -0
  18. package/dist/modules/ipc/builtins/notification.d.ts +5 -0
  19. package/dist/modules/ipc/builtins/shell.d.ts +5 -0
  20. package/dist/modules/ipc/builtins/window-control.d.ts +5 -0
  21. package/dist/modules/ipc/builtins/window-move.d.ts +7 -0
  22. package/dist/modules/ipc/index.d.ts +15 -0
  23. package/dist/modules/session.d.ts +6 -0
  24. package/dist/modules/tray.d.ts +7 -0
  25. package/dist/modules/updater.d.ts +5 -0
  26. package/dist/modules/window/manager.d.ts +103 -0
  27. package/dist/modules/window/useFloatWin.d.ts +6 -0
  28. package/dist/modules/window/useWinDrag.d.ts +8 -0
  29. package/dist/preload/base.d.ts +34 -0
  30. package/dist/preload/events.d.ts +6 -0
  31. package/dist/preload/index.d.ts +1 -0
  32. package/dist/preload/index.js +1 -0
  33. package/dist/renderer/composable/useIpcRenderer.d.ts +28 -0
  34. package/dist/renderer/composable/useWindowMove.d.ts +23 -0
  35. package/dist/renderer/index.d.ts +4 -0
  36. package/dist/renderer/index.js +1 -0
  37. package/dist/renderer/style.css +1 -0
  38. package/dist/types.d.ts +127 -0
  39. package/dist/utils/clone.d.ts +4 -0
  40. package/dist/utils/debounce.d.ts +4 -0
  41. package/dist/utils/merge.d.ts +7 -0
  42. package/package.json +62 -0
@@ -0,0 +1,23 @@
1
+ export type useWindowMove = typeof useWindowMove;
2
+ /**
3
+ * 窗口拖动
4
+ *
5
+ * @param events 监听事件
6
+ * @param handle 默认值:electron-handle--window-drag
7
+ * @example
8
+ * ```ts
9
+ * useWindowMove({
10
+ * onMoveStart(){...}
11
+ * onMove(){...}
12
+ * onMoveEnd(){...}
13
+ * })
14
+ * ```
15
+ * ```vue
16
+ <div class="electron-handle--window-drag"></div>
17
+ * ```
18
+ */
19
+ export declare function useWindowMove(events?: {
20
+ onMoveStart?: () => void;
21
+ onMove?: () => void;
22
+ onMoveEnd?: () => void;
23
+ }, handle?: string): void;
@@ -0,0 +1,4 @@
1
+ export { useIpcRenderer } from './composable/useIpcRenderer';
2
+ export { useWindowMove } from './composable/useWindowMove';
3
+ export { default as NavBar } from './components/NavBar.vue';
4
+ export { default as ElectronIcon } from './components/ElectronIcon.vue';
@@ -0,0 +1 @@
1
+ import{onUnmounted as e,onMounted as n,defineComponent as o,openBlock as i,createBlock as a,resolveDynamicComponent as t,mergeProps as r,ref as s,resolveComponent as l,withDirectives as c,createElementBlock as d,normalizeClass as v,createElementVNode as m,toDisplayString as u,createVNode as w,withCtx as p,renderSlot as f,createCommentVNode as k,vShow as z}from"vue";function b(){const n={};return e(()=>{for(const[e,o]of Object.entries(n))window.ipcRenderer?.off(e,o)}),{...window.ipcRenderer,invoke:(e,...n)=>{if(!window.ipcRenderer)throw new Error("The environment does not support ipcRenderer.");return window.ipcRenderer.invoke(e,...n)},on:(e,o)=>{if(n[e]=o,!window.ipcRenderer)throw new Error("The environment does not support ipcRenderer.");return window.ipcRenderer.on(e,o)}}}function x(o={},i="electron-handle--window-drag"){let a=!1,t=0,r=0;function s(e){e.target?.classList.contains(i)&&(a=!0,t=e.screenX,r=e.screenY,window.ipcRenderer.send("window-move-start"),o.onMoveStart?.())}function l(e){a&&(window.ipcRenderer.send("window-move",{x:e.screenX-t,y:e.screenY-r}),o.onMove?.())}function c(){a&&(a=!1,window.ipcRenderer.send("window-move-end"),o.onMoveEnd?.())}n(()=>{document.addEventListener("mousedown",s),document.addEventListener("mousemove",l),document.addEventListener("mouseup",c)}),e(()=>{document.removeEventListener("mousedown",s),document.removeEventListener("mousemove",l),document.removeEventListener("mouseup",c)})}const y=/* @__PURE__ */o({name:"electron-icon",__name:"ElectronIcon",props:{name:{},color:{},size:{},classPrefix:{default:"ec"},tag:{default:"i"}},setup:e=>(n,o)=>(i(),a(t(e.tag),r(n.$attrs,{class:["electron-icon",e.classPrefix,`${e.classPrefix}-${e.name}`],style:{color:e.color,fontSize:e.size?/^\d+$/.test(e.size.toString())?e.size+"px":e.size:void 0}}),null,16,["class","style"]))}),g={class:"nav-bar-icon"},R=["src"],h={class:"nav-bar-title"},E={class:"nav-bar-tools"},_=["title"],L=/* @__PURE__ */((e,n)=>{const o=e.__vccOpts||e;for(const[i,a]of n)o[i]=a;return o})(/* @__PURE__ */o({name:"nav-bar",__name:"NavBar",props:{title:{},icon:{}},setup(e){const n=b(),o=s(!1),t=s(""),r=s(""),x=s(!1),L=s(!1),S=s(!1),$=s(!1),C=s(!1),M=s(!1),O=s(!1);function B(e){switch(e){case"always-on-top":window.ipcRenderer.invoke("window-control","toggleAlwaysOnTop");break;case"minimize":window.ipcRenderer.invoke("window-control","minimize");break;case"maximize":if(!O.value)return;window.ipcRenderer.invoke("window-control","toggleMaximize");break;case"close":window.ipcRenderer.invoke("window-control","close")}}return n.invoke("window-control","$props").then(e=>{x.value=e.isMaximized,L.value=e.isAlwaysOnTop,S.value=e.isFullScreen,$.value=e.minimizable,C.value=e.maximizable,M.value=e.closable,O.value=e.resizable}),n.invoke("window-manager-api","getWindowConfig").then(e=>{e&&(t.value=e.title||"标题",!1===e.frame||e.titleBarStyle&&["hidden","hiddenInset","customButtonsOnHover"].includes(e.titleBarStyle)?o.value=!0:o.value=!1)}),n.on("fullscreen-change",(e,n)=>{S.value=n}),n.on("maximize",()=>{x.value=!0}),n.on("unmaximize",()=>{x.value=!1}),n.on("minimize",()=>{}),n.on("restore",()=>{}),n.on("always-on-top-changed",(e,n)=>{L.value=n}),(n,s)=>{const b=l("expanded");return o.value?c((i(),d("div",{key:0,class:v(["electron--nav-bar",{"is-full-screen":S.value}])},[m("div",g,[m("img",{src:e.icon||r.value,alt:"icon"},null,8,R)]),m("div",h,u(e.title||t.value),1),w(b,{class:"nav-bar-content"},{default:p(()=>[f(n.$slots,"default",{},void 0,!0)]),_:3}),m("div",E,[m("div",{class:v(["nav-bar-tools-item",{active:L.value}]),onClick:s[0]||(s[0]=e=>B("always-on-top")),title:"前置"},[L.value?(i(),a(y,{key:1,name:"fixed",class:"nav-icon--large"})):(i(),a(y,{key:0,name:"fixed-o",class:"nav-icon--large"}))],2),$.value?(i(),d("div",{key:0,class:"nav-bar-tools-item",onClick:s[1]||(s[1]=e=>B("minimize")),title:"最小化"},[w(y,{name:"minimize",class:"nav-icon--normal"})])):k("",!0),C.value?(i(),d("div",{key:1,class:v(["nav-bar-tools-item",{disabled:!O.value}]),onClick:s[2]||(s[2]=e=>B("maximize")),title:x.value?"还原":"最大化"},[x.value?(i(),a(y,{key:1,name:"unmaximize-o",class:"nav-icon--normal"})):(i(),a(y,{key:0,name:"maximize-o",class:"nav-icon--normal"}))],10,_)):k("",!0),M.value?(i(),d("div",{key:2,class:"nav-bar-tools-item close-btn",onClick:s[3]||(s[3]=e=>B("close")),title:"关闭"},[w(y,{name:"close",class:"nav-icon--normal"})])):k("",!0)])],2)),[[z,!S.value]]):k("",!0)}}}),[["__scopeId","data-v-b93ede0f"]]);export{y as ElectronIcon,L as NavBar,b as useIpcRenderer,x as useWindowMove};
@@ -0,0 +1 @@
1
+ @charset "UTF-8";html.MODAL-OPENED{filter:brightness(.2);background:#fff}.electron-loading--text{background:linear-gradient(90deg,transparent,#808080,transparent);background-size:200% 100%;background-clip:text;-webkit-background-clip:text;color:transparent;-webkit-text-fill-color:transparent;animation:electron-shine 1.3s infinite linear;font-size:20px}@keyframes electron-shine{0%{background-position:-100% 0}to{background-position:100% 0}}@font-face{font-family:ec;src:url(data:font/woff2;base64,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) format("woff2"),url(data:font/woff;base64,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) format("woff"),url(data:font/ttf;base64,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) format("truetype")}.ec{font-family:ec!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ec-face-recognition:before{content:""}.ec-calendar-o:before{content:""}.ec-exchange:before{content:""}.ec-refresh:before{content:""}.ec-copy-o:before{content:""}.ec-sign:before{content:""}.ec-webpage:before{content:""}.ec-mobil:before{content:""}.ec-record:before{content:""}.ec-template:before{content:""}.ec-edit-batch:before{content:""}.ec-power:before{content:""}.ec-menu-more-o:before{content:""}.ec-drag-handle:before{content:""}.ec-close:before{content:""}.ec-fixed-o:before{content:""}.ec-fixed:before{content:""}.ec-maximize-o:before{content:""}.ec-help-o:before{content:""}.ec-more-o:before{content:""}.ec-plus-o:before{content:""}.ec-quit-o:before{content:""}.ec-unmaximize-o:before{content:""}.ec-info-o:before{content:""}.ec-search-o:before{content:""}.ec-warning-o:before{content:""}.ec-plus:before{content:""}.ec-setting-o:before{content:""}.ec-minimize:before{content:""}.ec-arrow-down-1:before{content:""}.ec-checked:before{content:""}.ec-arrow-left-1:before{content:""}.ec-arrow-up-1:before{content:""}.ec-arrow-right-1:before{content:""}.ec-checked-o:before{content:""}.ec-fcc[data-v-b93ede0f]{display:flex;justify-content:center;align-items:center}.electron--nav-bar[data-v-b93ede0f]{position:fixed;top:0;left:0;right:0;width:100%;height:var(--app-nav-bar-size, 40px);background-color:var(--app-color-f, white);color:var(--app-color-0, black);-webkit-app-region:drag;display:flex;align-items:center;z-index:9;-webkit-touch-callout:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.electron--nav-bar .nav-bar-icon[data-v-b93ede0f]{display:flex;justify-content:center;align-items:center;width:var(--app-nav-bar-size, 40px);height:var(--app-nav-bar-size, 40px);cursor:pointer}.electron--nav-bar .nav-bar-icon>img[data-v-b93ede0f]{display:block;width:calc(var(--app-nav-bar-size, 40px) * .5);height:calc(var(--app-nav-bar-size, 40px) * .5)}.electron--nav-bar .nav-bar-title[data-v-b93ede0f]{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-size:calc(var(--app-nav-bar-size, 40px) * 14 / 40)}.electron--nav-bar .nav-bar-tools[data-v-b93ede0f]{display:flex;align-items:center;-webkit-app-region:no-drag}.electron--nav-bar .nav-bar-tools .nav-bar-tools-item[data-v-b93ede0f]{display:flex;justify-content:center;align-items:center;width:calc(var(--app-nav-bar-size, 40px) * 5 / 4);height:var(--app-nav-bar-size, 40px);cursor:pointer}.electron--nav-bar .nav-bar-tools .nav-bar-tools-item.disabled[data-v-b93ede0f]{opacity:.5;cursor:not-allowed;background-color:var(--app-color-f, white)!important}.electron--nav-bar .nav-bar-tools .nav-bar-tools-item.active[data-v-b93ede0f]{color:#39f}.electron--nav-bar .nav-bar-tools .nav-bar-tools-item[data-v-b93ede0f]:hover{background-color:var(--app-color-e, #eee)}.electron--nav-bar .nav-bar-tools .nav-bar-tools-item[data-v-b93ede0f]:active{background-color:var(--app-color-c, #ccc)}.electron--nav-bar .nav-bar-tools .nav-bar-tools-item.close-btn[data-v-b93ede0f]:hover{background-color:var(--app-color-red, red);color:var(--app-color-f, white)}.electron--nav-bar .nav-bar-tools .nav-bar-tools-item.close-btn[data-v-b93ede0f]:active{background-color:var(--app-color-red-light, rgb(255, 82, 82));color:var(--app-color-f, white)}.electron--nav-bar .nav-bar-tools .nav-bar-tools-item .nav-icon--large[data-v-b93ede0f]{font-size:calc(var(--app-nav-bar-size, 40px) * 16 / 40)}.electron--nav-bar .nav-bar-tools .nav-bar-tools-item .nav-icon--normal[data-v-b93ede0f]{font-size:calc(var(--app-nav-bar-size, 40px) * 12 / 40)}.electron--nav-bar[data-v-b93ede0f]:not(.is-full-screen)+*{margin-top:var(--app-nav-bar-size, 40px)}
@@ -0,0 +1,127 @@
1
+ import { BrowserWindow, BrowserWindowConstructorOptions, IpcMain, IpcMainInvokeEvent, Menu, MenuItemConstructorOptions, NativeImage, Tray } from 'electron';
2
+ import { IpcContext } from './modules/ipc';
3
+ import { WindowBaseType } from './modules/window/manager';
4
+ import { ElectronCliContext } from './core/context';
5
+ export interface ElectronCliPaths {
6
+ /** 渲染进程构建产物根目录(替代 RENDERER_DIST) */
7
+ rendererDist: string;
8
+ /** 主进程构建产物根目录(替代 MAIN_DIST) */
9
+ mainDist: string;
10
+ /** 静态资源/public 目录(替代 VITE_PUBLIC) */
11
+ publicDir: string;
12
+ /** preload 脚本的绝对路径(替代 PRELOAD 常量) */
13
+ preloadScript: string;
14
+ /** 应用图标路径(用于窗口图标和托盘) */
15
+ iconPath: string;
16
+ /** 应用图标路径(用于托盘) */
17
+ trayIconPath?: string | NativeImage;
18
+ /** 自定义 User-Agent(用于未注入 node 的 webContents) */
19
+ userAgent?: string;
20
+ }
21
+ export interface WindowDefinition<W = string> {
22
+ /** 窗口类型标识(替代 WindowType 枚举值) */
23
+ type: W;
24
+ /** BrowserWindow 构造选项 */
25
+ options: BrowserWindowConstructorOptions;
26
+ /** 窗口创建后的回调 — 替代硬编码的 onCreateMain 等 */
27
+ onCreate?: (win: BrowserWindow) => void;
28
+ onReady?: (win: BrowserWindow) => void;
29
+ onRendererReady?: (win: BrowserWindow) => void;
30
+ }
31
+ export interface IpcHandlerDefinition {
32
+ /** IPC 通道名称 */
33
+ channel: string;
34
+ /** 注册方式:handle(请求-响应)或 on(单向通知) */
35
+ type: 'handle' | 'on';
36
+ /** handler 函数 */
37
+ handler: (event: IpcMainInvokeEvent, ...args: any[]) => any;
38
+ }
39
+ /** 内置 IPC 模块名称 */
40
+ export type BuiltinIpcModule = 'window-control' | 'fs-api' | 'dialog' | 'shell' | 'downloader' | 'notification' | 'window-move';
41
+ export interface IpcOptions<W extends WindowBaseType = WindowBaseType> {
42
+ /** 用户自定义 handler — 即 useIpcEvents(ipcMain) 的核心能力 */
43
+ extraHandlers?: IpcHandlerDefinition[];
44
+ /** 禁用指定的内置 IPC 模块 */
45
+ disabledBuiltins?: BuiltinIpcModule[];
46
+ /** 按 channel 名覆盖内置 handler */
47
+ overrides?: Record<string, IpcHandlerDefinition>;
48
+ /**
49
+ * 完全自由的 ipcMain 配置回调
50
+ * — 在注册完内置模块后调用,传入 ipcMain 实例,用户可任意注册/覆盖事件
51
+ */
52
+ setup?: (ipcMain: IpcMain, ctx: IpcContext<W>) => void;
53
+ }
54
+ export interface LifecycleHooks<W extends WindowBaseType = WindowBaseType> {
55
+ /** app.whenReady() 内,窗口创建前调用 */
56
+ onReady?: () => void | Promise<void>;
57
+ /** app.whenReady() 内,窗口创建后调用 */
58
+ afterReady?: () => void | Promise<void>;
59
+ /** 覆盖默认的 window-all-closed 行为(默认非 macOS 时 app.quit()) */
60
+ onAllWindowsClosed?: () => void;
61
+ /** 覆盖默认的 macOS activate 行为 */
62
+ onActivate?: () => void;
63
+ /** WindowManager.create() 内,窗口创建后调用,并且再自身的onCreate执行后 */
64
+ onCreateWindow?: (win: BrowserWindow, type: W | null) => void;
65
+ /** 窗口加载 hash 路由时调用 */
66
+ onLoadHashRoute?: (win: BrowserWindow, hash: string, options: BrowserWindowConstructorOptions) => void;
67
+ }
68
+ export interface SessionConfig {
69
+ /** 额外的 onBeforeSendHeaders 拦截器 */
70
+ onBeforeSendHeaders?: (details: Electron.OnBeforeSendHeadersListenerDetails, callback: (response: Electron.HeadersReceivedResponse) => void) => void;
71
+ }
72
+ export interface TrayConfig<W extends WindowBaseType> {
73
+ enabled: boolean;
74
+ /** 自定义托盘菜单项 */
75
+ menuItems?: MenuItemConstructorOptions[] | (() => MenuItemConstructorOptions[]);
76
+ /** 托盘提示文字 */
77
+ tooltip?: string;
78
+ /** 托盘双击行为(默认打开主窗口) */
79
+ onDoubleClick?: () => void;
80
+ /**自定义配置 */
81
+ setup?: (tray: Tray, menu: Menu, ctx: ElectronCliContext<W>) => void;
82
+ }
83
+ export interface InstanceConfig {
84
+ enabled: boolean;
85
+ /** 第二个实例启动时的回调(默认打开主窗口) */
86
+ onSecondInstance?: () => void;
87
+ }
88
+ export interface UpdaterConfig {
89
+ enabled: boolean;
90
+ /** 更新服务器 feed URL */
91
+ feedUrl: string;
92
+ /** 更新通道 */
93
+ channel?: string;
94
+ /** 更新可用时的回调 */
95
+ onUpdateAvailable?: (info: {
96
+ version: string;
97
+ releaseNotes?: string;
98
+ }) => void;
99
+ /** 更新出错时的回调 */
100
+ onUpdateError?: (error: Error) => void;
101
+ /** 更新下载完成后的回调(默认弹窗询问是否重启) */
102
+ onUpdateDownloaded?: () => void;
103
+ }
104
+ export interface ElectronCliConfig<W extends WindowBaseType = string> {
105
+ /** 路径配置(必填) */
106
+ paths: ElectronCliPaths;
107
+ /** 窗口定义列表(必填) */
108
+ windows: WindowDefinition<W>[];
109
+ /** 主窗口的 type 标识 */
110
+ mainWindowType: W;
111
+ /** 是否为开发模式 */
112
+ isDev?: boolean;
113
+ /** 生命周期钩子 */
114
+ lifecycle?: LifecycleHooks<W>;
115
+ /** IPC 配置 */
116
+ ipc?: IpcOptions<W>;
117
+ /** Session 配置 */
118
+ session?: SessionConfig;
119
+ /** 托盘配置 */
120
+ tray?: TrayConfig<W>;
121
+ /** 单实例锁配置 */
122
+ instance?: InstanceConfig;
123
+ /** 自动更新配置 */
124
+ updater?: UpdaterConfig;
125
+ /** 默认 BrowserWindow 选项(会与各窗口的 options 合并) */
126
+ defaultWindowOptions?: BrowserWindowConstructorOptions;
127
+ }
@@ -0,0 +1,4 @@
1
+ /**
2
+ * JSON 深克隆 — 替代 comfy-tool 的 Util.cloneJSON
3
+ */
4
+ export declare function cloneJSON<T>(obj: T): T;
@@ -0,0 +1,4 @@
1
+ /**
2
+ * 防抖函数 — 替代 comfy-tool 的 Util.debounce
3
+ */
4
+ export declare function debounce<T extends (...args: any[]) => any>(fn: T, delay: number): (...args: Parameters<T>) => void;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * 深度合并对象 — 替代 comfy-tool 的 Util.merge
3
+ * 支持 deepMerge 选项控制是否深度合并嵌套对象
4
+ */
5
+ export declare function merge<T extends Record<string, any>>(target: T, source: Partial<T>, options?: {
6
+ deepMerge?: boolean;
7
+ }): T;
package/package.json ADDED
@@ -0,0 +1,62 @@
1
+ {
2
+ "name": "electron-multi-app-kit",
3
+ "version": "0.1.0",
4
+ "description": "Electron main process lifecycle & module library — setup-style with hook-based customization",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "import": "./dist/index.js",
10
+ "types": "./dist/index.d.ts"
11
+ },
12
+ "./preload": {
13
+ "import": "./dist/preload/index.js",
14
+ "types": "./dist/preload/index.d.ts"
15
+ },
16
+ "./renderer": {
17
+ "import": "./dist/renderer/index.js",
18
+ "types": "./dist/renderer/index.d.ts"
19
+ },
20
+ "./renderer/style.css": "./dist/renderer/style.css"
21
+ },
22
+ "files": [
23
+ "dist",
24
+ "README.md"
25
+ ],
26
+ "scripts": {
27
+ "build": "vite build && node -e \"var f=require('fs');f.renameSync('dist/electron-multi-app-kit.css','dist/renderer/style.css');\"",
28
+ "dev": "vite build --watch",
29
+ "typecheck": "vue-tsc --noEmit"
30
+ },
31
+ "peerDependencies": {
32
+ "electron": ">=22.0.0",
33
+ "vue": ">=3.0.0"
34
+ },
35
+ "dependencies": {
36
+ "electron-log": "^5.4.1",
37
+ "electron-updater": "^6.6.2",
38
+ "mime-types": "^3.0.2",
39
+ "archiver": "^8.0.0"
40
+ },
41
+ "devDependencies": {
42
+ "@types/archiver": "^8.0.0",
43
+ "@types/minimatch": "^5.1.2",
44
+ "@vitejs/plugin-vue": "^6.0.7",
45
+ "electron": "22.3.27",
46
+ "sass-embedded": "^1.100.0",
47
+ "terser": "^5.48.0",
48
+ "typescript": "^5.8.3",
49
+ "vite": "^7.3.5",
50
+ "vite-plugin-dts": "^5.0.2",
51
+ "vue": "^3.5.35",
52
+ "vue-tsc": "^3.3.3"
53
+ },
54
+ "keywords": [
55
+ "electron",
56
+ "cli",
57
+ "lifecycle",
58
+ "ipc",
59
+ "window-manager"
60
+ ],
61
+ "license": "MIT"
62
+ }