@easy-electron/preload 1.0.1-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/index.cjs +1072 -0
- package/dist/index.d.cts +234 -0
- package/dist/index.d.mts +234 -0
- package/dist/index.d.ts +234 -0
- package/dist/index.mjs +1048 -0
- package/dist/runtime-entry.cjs +11 -0
- package/dist/runtime-entry.d.cts +106 -0
- package/dist/runtime-entry.d.mts +106 -0
- package/dist/runtime-entry.d.ts +106 -0
- package/dist/runtime-entry.mjs +2 -0
- package/dist/shared/preload.CkLc48BZ.mjs +24 -0
- package/dist/shared/preload.OqYa61Ym.cjs +29 -0
- package/package.json +54 -0
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
export { EVENT_MODULE_KEY, EventHandlerConfig, EventHandlerMap, IPC_MODULE_KEY, IpcHandleFunction, IpcHandlerConfig, IpcHandlerMap, IpcHandlerValue, IpcOnFunction, defineEvents, defineIpc } from './runtime-entry.cjs';
|
|
2
|
+
import 'electron';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* EasyPreload 生成器配置
|
|
6
|
+
*/
|
|
7
|
+
interface EasyPreloadGeneratorConfig {
|
|
8
|
+
/**
|
|
9
|
+
* 扫描目录(默认 './electron')
|
|
10
|
+
*/
|
|
11
|
+
dir?: string;
|
|
12
|
+
/**
|
|
13
|
+
* IPC 源文件匹配模式(支持数组和 glob 格式)
|
|
14
|
+
* 默认 ['**\/*.ipc.ts']
|
|
15
|
+
*/
|
|
16
|
+
source?: string | string[];
|
|
17
|
+
/**
|
|
18
|
+
* 事件源文件匹配模式(支持数组和 glob 格式)
|
|
19
|
+
* 默认 ['**\/*.events.ts']
|
|
20
|
+
*/
|
|
21
|
+
events?: string | string[];
|
|
22
|
+
/**
|
|
23
|
+
* 忽略的文件模式(glob 格式)
|
|
24
|
+
* 默认 ['\*\*\/node_modules\/\*\*', '\*\*\/dist\/\*\*', '\*\*\/dist-electron\/\*\*']
|
|
25
|
+
*/
|
|
26
|
+
ignores?: string[];
|
|
27
|
+
/**
|
|
28
|
+
* preload 输出路径
|
|
29
|
+
* 默认 ./electron/preload.ts
|
|
30
|
+
*/
|
|
31
|
+
output: string;
|
|
32
|
+
/**
|
|
33
|
+
* 类型定义输出路径
|
|
34
|
+
* 默认 ./types/electron.d.ts
|
|
35
|
+
*/
|
|
36
|
+
typesOutput: string;
|
|
37
|
+
/**
|
|
38
|
+
* 全局对象名称(默认 'elec')
|
|
39
|
+
*/
|
|
40
|
+
globalName?: string;
|
|
41
|
+
/**
|
|
42
|
+
* 是否在生成的类型定义中保留方法注释(默认 true)
|
|
43
|
+
*/
|
|
44
|
+
preserveComments?: boolean;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* EasyPreload 生成器
|
|
49
|
+
*
|
|
50
|
+
* 扫描项目中的 IPC 和 Event 定义文件,自动生成:
|
|
51
|
+
* 1. preload.ts — contextBridge 桥接文件,暴露 IPC 调用和事件监听到渲染进程
|
|
52
|
+
* 2. electron.d.ts — 类型定义文件,为 window.elec 提供完整的类型提示
|
|
53
|
+
*/
|
|
54
|
+
declare class EasyPreloadGenerator {
|
|
55
|
+
private readonly config;
|
|
56
|
+
private readonly logger;
|
|
57
|
+
constructor(config: EasyPreloadGeneratorConfig);
|
|
58
|
+
/**
|
|
59
|
+
* 执行生成,扫描 IPC 和 Event 定义文件,输出 preload 和类型文件
|
|
60
|
+
*/
|
|
61
|
+
generate(): void;
|
|
62
|
+
/**
|
|
63
|
+
* 扫描 IPC 定义文件
|
|
64
|
+
*/
|
|
65
|
+
private scanIpc;
|
|
66
|
+
/**
|
|
67
|
+
* 扫描 Event 定义文件
|
|
68
|
+
*/
|
|
69
|
+
private scanEvents;
|
|
70
|
+
/**
|
|
71
|
+
* 生成 preload.ts 文件内容
|
|
72
|
+
*
|
|
73
|
+
* 结构:
|
|
74
|
+
* ```ts
|
|
75
|
+
* contextBridge.exposeInMainWorld('globalName', {
|
|
76
|
+
* // 无模块 IPC 方法(顶层)
|
|
77
|
+
* ping: () => ipcRenderer.invoke('ping'),
|
|
78
|
+
* // 有模块 IPC 方法(嵌套对象)
|
|
79
|
+
* test: {
|
|
80
|
+
* getData: (id) => ipcRenderer.invoke('test:getData', id),
|
|
81
|
+
* },
|
|
82
|
+
* // 事件(嵌套在 events 下)
|
|
83
|
+
* events: {
|
|
84
|
+
* onXxx: (callback) => { ... },
|
|
85
|
+
* module: { onYyy: (callback) => { ... } },
|
|
86
|
+
* },
|
|
87
|
+
* })
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
private generatePreload;
|
|
91
|
+
/**
|
|
92
|
+
* 生成 preload 中的 IPC 调用代码
|
|
93
|
+
*
|
|
94
|
+
* 无模块的处理器直接放在顶层,有模块的嵌套在模块名对象下。
|
|
95
|
+
* 根据 handlerType 选择 invoke(handle/handleOnce)或 send(on/once)。
|
|
96
|
+
*/
|
|
97
|
+
private generatePreloadIpc;
|
|
98
|
+
/**
|
|
99
|
+
* 生成单个 IPC 方法的 preload 代码
|
|
100
|
+
*
|
|
101
|
+
* @param name 方法名
|
|
102
|
+
* @param channel IPC 通道名
|
|
103
|
+
* @param handler 处理器信息
|
|
104
|
+
* @returns 方法代码字符串(不含尾部逗号)
|
|
105
|
+
*/
|
|
106
|
+
private generatePreloadIpcMethod;
|
|
107
|
+
/**
|
|
108
|
+
* 生成 preload 中的事件监听代码
|
|
109
|
+
*
|
|
110
|
+
* 所有事件嵌套在 `events` 对象下。
|
|
111
|
+
* 无模块的事件直接放在 events 下,有模块的嵌套在 events.module 下。
|
|
112
|
+
*/
|
|
113
|
+
private generatePreloadEvents;
|
|
114
|
+
/**
|
|
115
|
+
* 生成单个事件的监听/移除方法代码
|
|
116
|
+
*
|
|
117
|
+
* 根据 handler 的 once 和 remove 属性生成:
|
|
118
|
+
* - on/once 监听方法
|
|
119
|
+
* - removeSingle 方法(remove 为 'single' 或 'both')
|
|
120
|
+
* - removeAll 方法(remove 为 'all' 或 'both')
|
|
121
|
+
*
|
|
122
|
+
* @param name 事件名(如 onDownloadProgress)
|
|
123
|
+
* @param channel IPC 通道名
|
|
124
|
+
* @param handler 事件处理器模型
|
|
125
|
+
* @param lines 输出行数组
|
|
126
|
+
* @param indent 缩进字符串
|
|
127
|
+
*/
|
|
128
|
+
private generatePreloadEventMethods;
|
|
129
|
+
/**
|
|
130
|
+
* 生成事件的 remove 方法代码
|
|
131
|
+
*/
|
|
132
|
+
private generatePreloadRemoveMethods;
|
|
133
|
+
/**
|
|
134
|
+
* 生成类型定义文件内容
|
|
135
|
+
*
|
|
136
|
+
* 结构:
|
|
137
|
+
* ```ts
|
|
138
|
+
* interface ElecApi {
|
|
139
|
+
* ping: () => Promise<string>
|
|
140
|
+
* test: { getData: (id: string) => Promise<Data> }
|
|
141
|
+
* }
|
|
142
|
+
* export interface ElecEvents {
|
|
143
|
+
* onXxx: (callback: (data: T) => void) => () => void
|
|
144
|
+
* }
|
|
145
|
+
* declare global {
|
|
146
|
+
* interface Window { elec: ElecApi & { events: ElecEvents } }
|
|
147
|
+
* }
|
|
148
|
+
* export {}
|
|
149
|
+
* ```
|
|
150
|
+
*/
|
|
151
|
+
private generateTypes;
|
|
152
|
+
/**
|
|
153
|
+
* 生成 ElecApi 接口中的 IPC 方法类型
|
|
154
|
+
*/
|
|
155
|
+
private generateTypesIpc;
|
|
156
|
+
/**
|
|
157
|
+
* 生成单个 IPC 方法的类型签名
|
|
158
|
+
*
|
|
159
|
+
* @param name 方法名
|
|
160
|
+
* @param handler 处理器信息
|
|
161
|
+
* @param lines 输出行数组
|
|
162
|
+
* @param indent 缩进字符串
|
|
163
|
+
*/
|
|
164
|
+
private generateTypesIpcMethod;
|
|
165
|
+
/**
|
|
166
|
+
* 生成 ElecEvents 接口中的事件方法类型
|
|
167
|
+
*/
|
|
168
|
+
private generateTypesEvents;
|
|
169
|
+
/**
|
|
170
|
+
* 生成单个事件的类型签名(监听 + remove 方法)
|
|
171
|
+
*/
|
|
172
|
+
private generateTypesEventMethods;
|
|
173
|
+
/**
|
|
174
|
+
* 收集所有 IPC 和 Event 定义中引用的类型导入语句
|
|
175
|
+
*
|
|
176
|
+
* 将各文件的 imports 映射合并,按模块路径分组,
|
|
177
|
+
* 生成相对于输出文件的 import type 语句。
|
|
178
|
+
*
|
|
179
|
+
* @param ipcDefs IPC 定义列表
|
|
180
|
+
* @param eventDefs Event 定义列表
|
|
181
|
+
* @returns import 语句列表
|
|
182
|
+
*/
|
|
183
|
+
private collectTypeImports;
|
|
184
|
+
/**
|
|
185
|
+
* 将源文件中的模块路径转换为相对于输出文件的路径
|
|
186
|
+
*
|
|
187
|
+
* 支持三种输入:
|
|
188
|
+
* - 相对路径(以 . 开头): 相对于源文件解析后再转换
|
|
189
|
+
* - 绝对路径: 直接计算相对于输出文件的路径
|
|
190
|
+
* - 包导入(非相对/绝对路径): 直接返回
|
|
191
|
+
*
|
|
192
|
+
* @param sourceFilePath 源文件绝对路径
|
|
193
|
+
* @param modulePath 模块路径(相对、绝对或包名)
|
|
194
|
+
* @returns 相对于输出文件的模块路径
|
|
195
|
+
*/
|
|
196
|
+
private resolveImportPath;
|
|
197
|
+
/**
|
|
198
|
+
* 将事件名转换为 IPC 通道名(camelCase → kebab-case)
|
|
199
|
+
*
|
|
200
|
+
* 去掉 on/once 前缀后转换:
|
|
201
|
+
* - onDownloadProgress → download-progress
|
|
202
|
+
* - onceReady → ready
|
|
203
|
+
*
|
|
204
|
+
* @param name 事件名
|
|
205
|
+
* @returns 通道名
|
|
206
|
+
*/
|
|
207
|
+
private toEventChannel;
|
|
208
|
+
/**
|
|
209
|
+
* 去掉事件名的 on/once 前缀,返回大写开头的基础名
|
|
210
|
+
*
|
|
211
|
+
* - onDownloadProgress → DownloadProgress
|
|
212
|
+
* - onceReady → Ready
|
|
213
|
+
*
|
|
214
|
+
* @param name 事件名
|
|
215
|
+
* @returns 基础名(首字母大写)
|
|
216
|
+
*/
|
|
217
|
+
private stripEventPrefix;
|
|
218
|
+
/**
|
|
219
|
+
* 确保返回类型被 Promise 包裹
|
|
220
|
+
*
|
|
221
|
+
* - 已经是 Promise<T> → 原样返回
|
|
222
|
+
* - 其他类型 → 包裹为 Promise<T>
|
|
223
|
+
*
|
|
224
|
+
* @param returnType 原始返回类型
|
|
225
|
+
* @returns Promise 包裹后的返回类型
|
|
226
|
+
*/
|
|
227
|
+
private ensurePromise;
|
|
228
|
+
/**
|
|
229
|
+
* 写入文件,自动创建目录
|
|
230
|
+
*/
|
|
231
|
+
private writeFile;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
export { EasyPreloadGenerator };
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
export { EVENT_MODULE_KEY, EventHandlerConfig, EventHandlerMap, IPC_MODULE_KEY, IpcHandleFunction, IpcHandlerConfig, IpcHandlerMap, IpcHandlerValue, IpcOnFunction, defineEvents, defineIpc } from './runtime-entry.mjs';
|
|
2
|
+
import 'electron';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* EasyPreload 生成器配置
|
|
6
|
+
*/
|
|
7
|
+
interface EasyPreloadGeneratorConfig {
|
|
8
|
+
/**
|
|
9
|
+
* 扫描目录(默认 './electron')
|
|
10
|
+
*/
|
|
11
|
+
dir?: string;
|
|
12
|
+
/**
|
|
13
|
+
* IPC 源文件匹配模式(支持数组和 glob 格式)
|
|
14
|
+
* 默认 ['**\/*.ipc.ts']
|
|
15
|
+
*/
|
|
16
|
+
source?: string | string[];
|
|
17
|
+
/**
|
|
18
|
+
* 事件源文件匹配模式(支持数组和 glob 格式)
|
|
19
|
+
* 默认 ['**\/*.events.ts']
|
|
20
|
+
*/
|
|
21
|
+
events?: string | string[];
|
|
22
|
+
/**
|
|
23
|
+
* 忽略的文件模式(glob 格式)
|
|
24
|
+
* 默认 ['\*\*\/node_modules\/\*\*', '\*\*\/dist\/\*\*', '\*\*\/dist-electron\/\*\*']
|
|
25
|
+
*/
|
|
26
|
+
ignores?: string[];
|
|
27
|
+
/**
|
|
28
|
+
* preload 输出路径
|
|
29
|
+
* 默认 ./electron/preload.ts
|
|
30
|
+
*/
|
|
31
|
+
output: string;
|
|
32
|
+
/**
|
|
33
|
+
* 类型定义输出路径
|
|
34
|
+
* 默认 ./types/electron.d.ts
|
|
35
|
+
*/
|
|
36
|
+
typesOutput: string;
|
|
37
|
+
/**
|
|
38
|
+
* 全局对象名称(默认 'elec')
|
|
39
|
+
*/
|
|
40
|
+
globalName?: string;
|
|
41
|
+
/**
|
|
42
|
+
* 是否在生成的类型定义中保留方法注释(默认 true)
|
|
43
|
+
*/
|
|
44
|
+
preserveComments?: boolean;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* EasyPreload 生成器
|
|
49
|
+
*
|
|
50
|
+
* 扫描项目中的 IPC 和 Event 定义文件,自动生成:
|
|
51
|
+
* 1. preload.ts — contextBridge 桥接文件,暴露 IPC 调用和事件监听到渲染进程
|
|
52
|
+
* 2. electron.d.ts — 类型定义文件,为 window.elec 提供完整的类型提示
|
|
53
|
+
*/
|
|
54
|
+
declare class EasyPreloadGenerator {
|
|
55
|
+
private readonly config;
|
|
56
|
+
private readonly logger;
|
|
57
|
+
constructor(config: EasyPreloadGeneratorConfig);
|
|
58
|
+
/**
|
|
59
|
+
* 执行生成,扫描 IPC 和 Event 定义文件,输出 preload 和类型文件
|
|
60
|
+
*/
|
|
61
|
+
generate(): void;
|
|
62
|
+
/**
|
|
63
|
+
* 扫描 IPC 定义文件
|
|
64
|
+
*/
|
|
65
|
+
private scanIpc;
|
|
66
|
+
/**
|
|
67
|
+
* 扫描 Event 定义文件
|
|
68
|
+
*/
|
|
69
|
+
private scanEvents;
|
|
70
|
+
/**
|
|
71
|
+
* 生成 preload.ts 文件内容
|
|
72
|
+
*
|
|
73
|
+
* 结构:
|
|
74
|
+
* ```ts
|
|
75
|
+
* contextBridge.exposeInMainWorld('globalName', {
|
|
76
|
+
* // 无模块 IPC 方法(顶层)
|
|
77
|
+
* ping: () => ipcRenderer.invoke('ping'),
|
|
78
|
+
* // 有模块 IPC 方法(嵌套对象)
|
|
79
|
+
* test: {
|
|
80
|
+
* getData: (id) => ipcRenderer.invoke('test:getData', id),
|
|
81
|
+
* },
|
|
82
|
+
* // 事件(嵌套在 events 下)
|
|
83
|
+
* events: {
|
|
84
|
+
* onXxx: (callback) => { ... },
|
|
85
|
+
* module: { onYyy: (callback) => { ... } },
|
|
86
|
+
* },
|
|
87
|
+
* })
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
private generatePreload;
|
|
91
|
+
/**
|
|
92
|
+
* 生成 preload 中的 IPC 调用代码
|
|
93
|
+
*
|
|
94
|
+
* 无模块的处理器直接放在顶层,有模块的嵌套在模块名对象下。
|
|
95
|
+
* 根据 handlerType 选择 invoke(handle/handleOnce)或 send(on/once)。
|
|
96
|
+
*/
|
|
97
|
+
private generatePreloadIpc;
|
|
98
|
+
/**
|
|
99
|
+
* 生成单个 IPC 方法的 preload 代码
|
|
100
|
+
*
|
|
101
|
+
* @param name 方法名
|
|
102
|
+
* @param channel IPC 通道名
|
|
103
|
+
* @param handler 处理器信息
|
|
104
|
+
* @returns 方法代码字符串(不含尾部逗号)
|
|
105
|
+
*/
|
|
106
|
+
private generatePreloadIpcMethod;
|
|
107
|
+
/**
|
|
108
|
+
* 生成 preload 中的事件监听代码
|
|
109
|
+
*
|
|
110
|
+
* 所有事件嵌套在 `events` 对象下。
|
|
111
|
+
* 无模块的事件直接放在 events 下,有模块的嵌套在 events.module 下。
|
|
112
|
+
*/
|
|
113
|
+
private generatePreloadEvents;
|
|
114
|
+
/**
|
|
115
|
+
* 生成单个事件的监听/移除方法代码
|
|
116
|
+
*
|
|
117
|
+
* 根据 handler 的 once 和 remove 属性生成:
|
|
118
|
+
* - on/once 监听方法
|
|
119
|
+
* - removeSingle 方法(remove 为 'single' 或 'both')
|
|
120
|
+
* - removeAll 方法(remove 为 'all' 或 'both')
|
|
121
|
+
*
|
|
122
|
+
* @param name 事件名(如 onDownloadProgress)
|
|
123
|
+
* @param channel IPC 通道名
|
|
124
|
+
* @param handler 事件处理器模型
|
|
125
|
+
* @param lines 输出行数组
|
|
126
|
+
* @param indent 缩进字符串
|
|
127
|
+
*/
|
|
128
|
+
private generatePreloadEventMethods;
|
|
129
|
+
/**
|
|
130
|
+
* 生成事件的 remove 方法代码
|
|
131
|
+
*/
|
|
132
|
+
private generatePreloadRemoveMethods;
|
|
133
|
+
/**
|
|
134
|
+
* 生成类型定义文件内容
|
|
135
|
+
*
|
|
136
|
+
* 结构:
|
|
137
|
+
* ```ts
|
|
138
|
+
* interface ElecApi {
|
|
139
|
+
* ping: () => Promise<string>
|
|
140
|
+
* test: { getData: (id: string) => Promise<Data> }
|
|
141
|
+
* }
|
|
142
|
+
* export interface ElecEvents {
|
|
143
|
+
* onXxx: (callback: (data: T) => void) => () => void
|
|
144
|
+
* }
|
|
145
|
+
* declare global {
|
|
146
|
+
* interface Window { elec: ElecApi & { events: ElecEvents } }
|
|
147
|
+
* }
|
|
148
|
+
* export {}
|
|
149
|
+
* ```
|
|
150
|
+
*/
|
|
151
|
+
private generateTypes;
|
|
152
|
+
/**
|
|
153
|
+
* 生成 ElecApi 接口中的 IPC 方法类型
|
|
154
|
+
*/
|
|
155
|
+
private generateTypesIpc;
|
|
156
|
+
/**
|
|
157
|
+
* 生成单个 IPC 方法的类型签名
|
|
158
|
+
*
|
|
159
|
+
* @param name 方法名
|
|
160
|
+
* @param handler 处理器信息
|
|
161
|
+
* @param lines 输出行数组
|
|
162
|
+
* @param indent 缩进字符串
|
|
163
|
+
*/
|
|
164
|
+
private generateTypesIpcMethod;
|
|
165
|
+
/**
|
|
166
|
+
* 生成 ElecEvents 接口中的事件方法类型
|
|
167
|
+
*/
|
|
168
|
+
private generateTypesEvents;
|
|
169
|
+
/**
|
|
170
|
+
* 生成单个事件的类型签名(监听 + remove 方法)
|
|
171
|
+
*/
|
|
172
|
+
private generateTypesEventMethods;
|
|
173
|
+
/**
|
|
174
|
+
* 收集所有 IPC 和 Event 定义中引用的类型导入语句
|
|
175
|
+
*
|
|
176
|
+
* 将各文件的 imports 映射合并,按模块路径分组,
|
|
177
|
+
* 生成相对于输出文件的 import type 语句。
|
|
178
|
+
*
|
|
179
|
+
* @param ipcDefs IPC 定义列表
|
|
180
|
+
* @param eventDefs Event 定义列表
|
|
181
|
+
* @returns import 语句列表
|
|
182
|
+
*/
|
|
183
|
+
private collectTypeImports;
|
|
184
|
+
/**
|
|
185
|
+
* 将源文件中的模块路径转换为相对于输出文件的路径
|
|
186
|
+
*
|
|
187
|
+
* 支持三种输入:
|
|
188
|
+
* - 相对路径(以 . 开头): 相对于源文件解析后再转换
|
|
189
|
+
* - 绝对路径: 直接计算相对于输出文件的路径
|
|
190
|
+
* - 包导入(非相对/绝对路径): 直接返回
|
|
191
|
+
*
|
|
192
|
+
* @param sourceFilePath 源文件绝对路径
|
|
193
|
+
* @param modulePath 模块路径(相对、绝对或包名)
|
|
194
|
+
* @returns 相对于输出文件的模块路径
|
|
195
|
+
*/
|
|
196
|
+
private resolveImportPath;
|
|
197
|
+
/**
|
|
198
|
+
* 将事件名转换为 IPC 通道名(camelCase → kebab-case)
|
|
199
|
+
*
|
|
200
|
+
* 去掉 on/once 前缀后转换:
|
|
201
|
+
* - onDownloadProgress → download-progress
|
|
202
|
+
* - onceReady → ready
|
|
203
|
+
*
|
|
204
|
+
* @param name 事件名
|
|
205
|
+
* @returns 通道名
|
|
206
|
+
*/
|
|
207
|
+
private toEventChannel;
|
|
208
|
+
/**
|
|
209
|
+
* 去掉事件名的 on/once 前缀,返回大写开头的基础名
|
|
210
|
+
*
|
|
211
|
+
* - onDownloadProgress → DownloadProgress
|
|
212
|
+
* - onceReady → Ready
|
|
213
|
+
*
|
|
214
|
+
* @param name 事件名
|
|
215
|
+
* @returns 基础名(首字母大写)
|
|
216
|
+
*/
|
|
217
|
+
private stripEventPrefix;
|
|
218
|
+
/**
|
|
219
|
+
* 确保返回类型被 Promise 包裹
|
|
220
|
+
*
|
|
221
|
+
* - 已经是 Promise<T> → 原样返回
|
|
222
|
+
* - 其他类型 → 包裹为 Promise<T>
|
|
223
|
+
*
|
|
224
|
+
* @param returnType 原始返回类型
|
|
225
|
+
* @returns Promise 包裹后的返回类型
|
|
226
|
+
*/
|
|
227
|
+
private ensurePromise;
|
|
228
|
+
/**
|
|
229
|
+
* 写入文件,自动创建目录
|
|
230
|
+
*/
|
|
231
|
+
private writeFile;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
export { EasyPreloadGenerator };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
export { EVENT_MODULE_KEY, EventHandlerConfig, EventHandlerMap, IPC_MODULE_KEY, IpcHandleFunction, IpcHandlerConfig, IpcHandlerMap, IpcHandlerValue, IpcOnFunction, defineEvents, defineIpc } from './runtime-entry.js';
|
|
2
|
+
import 'electron';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* EasyPreload 生成器配置
|
|
6
|
+
*/
|
|
7
|
+
interface EasyPreloadGeneratorConfig {
|
|
8
|
+
/**
|
|
9
|
+
* 扫描目录(默认 './electron')
|
|
10
|
+
*/
|
|
11
|
+
dir?: string;
|
|
12
|
+
/**
|
|
13
|
+
* IPC 源文件匹配模式(支持数组和 glob 格式)
|
|
14
|
+
* 默认 ['**\/*.ipc.ts']
|
|
15
|
+
*/
|
|
16
|
+
source?: string | string[];
|
|
17
|
+
/**
|
|
18
|
+
* 事件源文件匹配模式(支持数组和 glob 格式)
|
|
19
|
+
* 默认 ['**\/*.events.ts']
|
|
20
|
+
*/
|
|
21
|
+
events?: string | string[];
|
|
22
|
+
/**
|
|
23
|
+
* 忽略的文件模式(glob 格式)
|
|
24
|
+
* 默认 ['\*\*\/node_modules\/\*\*', '\*\*\/dist\/\*\*', '\*\*\/dist-electron\/\*\*']
|
|
25
|
+
*/
|
|
26
|
+
ignores?: string[];
|
|
27
|
+
/**
|
|
28
|
+
* preload 输出路径
|
|
29
|
+
* 默认 ./electron/preload.ts
|
|
30
|
+
*/
|
|
31
|
+
output: string;
|
|
32
|
+
/**
|
|
33
|
+
* 类型定义输出路径
|
|
34
|
+
* 默认 ./types/electron.d.ts
|
|
35
|
+
*/
|
|
36
|
+
typesOutput: string;
|
|
37
|
+
/**
|
|
38
|
+
* 全局对象名称(默认 'elec')
|
|
39
|
+
*/
|
|
40
|
+
globalName?: string;
|
|
41
|
+
/**
|
|
42
|
+
* 是否在生成的类型定义中保留方法注释(默认 true)
|
|
43
|
+
*/
|
|
44
|
+
preserveComments?: boolean;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* EasyPreload 生成器
|
|
49
|
+
*
|
|
50
|
+
* 扫描项目中的 IPC 和 Event 定义文件,自动生成:
|
|
51
|
+
* 1. preload.ts — contextBridge 桥接文件,暴露 IPC 调用和事件监听到渲染进程
|
|
52
|
+
* 2. electron.d.ts — 类型定义文件,为 window.elec 提供完整的类型提示
|
|
53
|
+
*/
|
|
54
|
+
declare class EasyPreloadGenerator {
|
|
55
|
+
private readonly config;
|
|
56
|
+
private readonly logger;
|
|
57
|
+
constructor(config: EasyPreloadGeneratorConfig);
|
|
58
|
+
/**
|
|
59
|
+
* 执行生成,扫描 IPC 和 Event 定义文件,输出 preload 和类型文件
|
|
60
|
+
*/
|
|
61
|
+
generate(): void;
|
|
62
|
+
/**
|
|
63
|
+
* 扫描 IPC 定义文件
|
|
64
|
+
*/
|
|
65
|
+
private scanIpc;
|
|
66
|
+
/**
|
|
67
|
+
* 扫描 Event 定义文件
|
|
68
|
+
*/
|
|
69
|
+
private scanEvents;
|
|
70
|
+
/**
|
|
71
|
+
* 生成 preload.ts 文件内容
|
|
72
|
+
*
|
|
73
|
+
* 结构:
|
|
74
|
+
* ```ts
|
|
75
|
+
* contextBridge.exposeInMainWorld('globalName', {
|
|
76
|
+
* // 无模块 IPC 方法(顶层)
|
|
77
|
+
* ping: () => ipcRenderer.invoke('ping'),
|
|
78
|
+
* // 有模块 IPC 方法(嵌套对象)
|
|
79
|
+
* test: {
|
|
80
|
+
* getData: (id) => ipcRenderer.invoke('test:getData', id),
|
|
81
|
+
* },
|
|
82
|
+
* // 事件(嵌套在 events 下)
|
|
83
|
+
* events: {
|
|
84
|
+
* onXxx: (callback) => { ... },
|
|
85
|
+
* module: { onYyy: (callback) => { ... } },
|
|
86
|
+
* },
|
|
87
|
+
* })
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
private generatePreload;
|
|
91
|
+
/**
|
|
92
|
+
* 生成 preload 中的 IPC 调用代码
|
|
93
|
+
*
|
|
94
|
+
* 无模块的处理器直接放在顶层,有模块的嵌套在模块名对象下。
|
|
95
|
+
* 根据 handlerType 选择 invoke(handle/handleOnce)或 send(on/once)。
|
|
96
|
+
*/
|
|
97
|
+
private generatePreloadIpc;
|
|
98
|
+
/**
|
|
99
|
+
* 生成单个 IPC 方法的 preload 代码
|
|
100
|
+
*
|
|
101
|
+
* @param name 方法名
|
|
102
|
+
* @param channel IPC 通道名
|
|
103
|
+
* @param handler 处理器信息
|
|
104
|
+
* @returns 方法代码字符串(不含尾部逗号)
|
|
105
|
+
*/
|
|
106
|
+
private generatePreloadIpcMethod;
|
|
107
|
+
/**
|
|
108
|
+
* 生成 preload 中的事件监听代码
|
|
109
|
+
*
|
|
110
|
+
* 所有事件嵌套在 `events` 对象下。
|
|
111
|
+
* 无模块的事件直接放在 events 下,有模块的嵌套在 events.module 下。
|
|
112
|
+
*/
|
|
113
|
+
private generatePreloadEvents;
|
|
114
|
+
/**
|
|
115
|
+
* 生成单个事件的监听/移除方法代码
|
|
116
|
+
*
|
|
117
|
+
* 根据 handler 的 once 和 remove 属性生成:
|
|
118
|
+
* - on/once 监听方法
|
|
119
|
+
* - removeSingle 方法(remove 为 'single' 或 'both')
|
|
120
|
+
* - removeAll 方法(remove 为 'all' 或 'both')
|
|
121
|
+
*
|
|
122
|
+
* @param name 事件名(如 onDownloadProgress)
|
|
123
|
+
* @param channel IPC 通道名
|
|
124
|
+
* @param handler 事件处理器模型
|
|
125
|
+
* @param lines 输出行数组
|
|
126
|
+
* @param indent 缩进字符串
|
|
127
|
+
*/
|
|
128
|
+
private generatePreloadEventMethods;
|
|
129
|
+
/**
|
|
130
|
+
* 生成事件的 remove 方法代码
|
|
131
|
+
*/
|
|
132
|
+
private generatePreloadRemoveMethods;
|
|
133
|
+
/**
|
|
134
|
+
* 生成类型定义文件内容
|
|
135
|
+
*
|
|
136
|
+
* 结构:
|
|
137
|
+
* ```ts
|
|
138
|
+
* interface ElecApi {
|
|
139
|
+
* ping: () => Promise<string>
|
|
140
|
+
* test: { getData: (id: string) => Promise<Data> }
|
|
141
|
+
* }
|
|
142
|
+
* export interface ElecEvents {
|
|
143
|
+
* onXxx: (callback: (data: T) => void) => () => void
|
|
144
|
+
* }
|
|
145
|
+
* declare global {
|
|
146
|
+
* interface Window { elec: ElecApi & { events: ElecEvents } }
|
|
147
|
+
* }
|
|
148
|
+
* export {}
|
|
149
|
+
* ```
|
|
150
|
+
*/
|
|
151
|
+
private generateTypes;
|
|
152
|
+
/**
|
|
153
|
+
* 生成 ElecApi 接口中的 IPC 方法类型
|
|
154
|
+
*/
|
|
155
|
+
private generateTypesIpc;
|
|
156
|
+
/**
|
|
157
|
+
* 生成单个 IPC 方法的类型签名
|
|
158
|
+
*
|
|
159
|
+
* @param name 方法名
|
|
160
|
+
* @param handler 处理器信息
|
|
161
|
+
* @param lines 输出行数组
|
|
162
|
+
* @param indent 缩进字符串
|
|
163
|
+
*/
|
|
164
|
+
private generateTypesIpcMethod;
|
|
165
|
+
/**
|
|
166
|
+
* 生成 ElecEvents 接口中的事件方法类型
|
|
167
|
+
*/
|
|
168
|
+
private generateTypesEvents;
|
|
169
|
+
/**
|
|
170
|
+
* 生成单个事件的类型签名(监听 + remove 方法)
|
|
171
|
+
*/
|
|
172
|
+
private generateTypesEventMethods;
|
|
173
|
+
/**
|
|
174
|
+
* 收集所有 IPC 和 Event 定义中引用的类型导入语句
|
|
175
|
+
*
|
|
176
|
+
* 将各文件的 imports 映射合并,按模块路径分组,
|
|
177
|
+
* 生成相对于输出文件的 import type 语句。
|
|
178
|
+
*
|
|
179
|
+
* @param ipcDefs IPC 定义列表
|
|
180
|
+
* @param eventDefs Event 定义列表
|
|
181
|
+
* @returns import 语句列表
|
|
182
|
+
*/
|
|
183
|
+
private collectTypeImports;
|
|
184
|
+
/**
|
|
185
|
+
* 将源文件中的模块路径转换为相对于输出文件的路径
|
|
186
|
+
*
|
|
187
|
+
* 支持三种输入:
|
|
188
|
+
* - 相对路径(以 . 开头): 相对于源文件解析后再转换
|
|
189
|
+
* - 绝对路径: 直接计算相对于输出文件的路径
|
|
190
|
+
* - 包导入(非相对/绝对路径): 直接返回
|
|
191
|
+
*
|
|
192
|
+
* @param sourceFilePath 源文件绝对路径
|
|
193
|
+
* @param modulePath 模块路径(相对、绝对或包名)
|
|
194
|
+
* @returns 相对于输出文件的模块路径
|
|
195
|
+
*/
|
|
196
|
+
private resolveImportPath;
|
|
197
|
+
/**
|
|
198
|
+
* 将事件名转换为 IPC 通道名(camelCase → kebab-case)
|
|
199
|
+
*
|
|
200
|
+
* 去掉 on/once 前缀后转换:
|
|
201
|
+
* - onDownloadProgress → download-progress
|
|
202
|
+
* - onceReady → ready
|
|
203
|
+
*
|
|
204
|
+
* @param name 事件名
|
|
205
|
+
* @returns 通道名
|
|
206
|
+
*/
|
|
207
|
+
private toEventChannel;
|
|
208
|
+
/**
|
|
209
|
+
* 去掉事件名的 on/once 前缀,返回大写开头的基础名
|
|
210
|
+
*
|
|
211
|
+
* - onDownloadProgress → DownloadProgress
|
|
212
|
+
* - onceReady → Ready
|
|
213
|
+
*
|
|
214
|
+
* @param name 事件名
|
|
215
|
+
* @returns 基础名(首字母大写)
|
|
216
|
+
*/
|
|
217
|
+
private stripEventPrefix;
|
|
218
|
+
/**
|
|
219
|
+
* 确保返回类型被 Promise 包裹
|
|
220
|
+
*
|
|
221
|
+
* - 已经是 Promise<T> → 原样返回
|
|
222
|
+
* - 其他类型 → 包裹为 Promise<T>
|
|
223
|
+
*
|
|
224
|
+
* @param returnType 原始返回类型
|
|
225
|
+
* @returns Promise 包裹后的返回类型
|
|
226
|
+
*/
|
|
227
|
+
private ensurePromise;
|
|
228
|
+
/**
|
|
229
|
+
* 写入文件,自动创建目录
|
|
230
|
+
*/
|
|
231
|
+
private writeFile;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
export { EasyPreloadGenerator };
|