@zeltjs/adapter-electron 0.8.2-canary.1 → 0.9.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.
@@ -176,7 +176,7 @@ const isTextContentType = (contentType) => TEXT_CONTENT_TYPE_PREFIXES.some((pref
176
176
  const toBody = (body) => (0, ts_pattern.match)(body).with({ kind: "none" }, () => null).with({ kind: "text" }, ({ value }) => value).with({ kind: "arrayBuffer" }, ({ value }) => value).exhaustive();
177
177
  const toRequest = (payload, baseUrl) => {
178
178
  const headers = payload.headers.map(([k, v]) => [k, v]);
179
- return new Request(baseUrl + payload.path, {
179
+ return new Request(baseUrl.replace(/\/+$/, "") + payload.path, {
180
180
  method: payload.method,
181
181
  headers,
182
182
  body: BODY_FORBIDDEN_METHODS.has(payload.method) ? null : toBody(payload.body)
@@ -207,10 +207,12 @@ const toIpcResponse = async (response, method) => {
207
207
  body
208
208
  };
209
209
  };
210
- const setupIpcBridge = (ipcMain, fetch, channel) => {
211
- ipcMain.handle(channel, async (_event, payload) => {
210
+ /** @throws {ZeltContextNotAvailableError} */ const ipcEvent = () => (0, _zeltjs_core.getContext)("ipcEvent");
211
+ /** @throws {ZeltContextNotAvailableError} */ const setupIpcBridge = (ipcMain, fetch, channel) => {
212
+ ipcMain.handle(channel, async (event, payload) => (0, _zeltjs_core.runInContext)(async () => {
213
+ (0, _zeltjs_core.setContext)("ipcEvent", event);
212
214
  return toIpcResponse(await fetch(toRequest(payload, channel)), payload.method);
213
- });
215
+ }));
214
216
  return () => {
215
217
  ipcMain.removeHandler(channel);
216
218
  };
@@ -218,7 +220,7 @@ const setupIpcBridge = (ipcMain, fetch, channel) => {
218
220
  //#endregion
219
221
  //#region src/main/on-electron.ts
220
222
  const DEFAULT_IPC_CHANNEL = "http://zelt-ipc";
221
- const onElectron = async (app, options = {}) => {
223
+ /** @throws {ZeltContextNotAvailableError} */ const onElectron = async (app, options = {}) => {
222
224
  const readyApp = await app.createRuntime({
223
225
  fallbackConfigs: [ElectronEnvAdaptor],
224
226
  warmup: options.warmup ?? true
@@ -260,6 +262,7 @@ Object.defineProperty(exports, "ElectronWindowRuntimeService", {
260
262
  return ElectronWindowRuntimeService;
261
263
  }
262
264
  });
265
+ exports.ipcEvent = ipcEvent;
263
266
  exports.onElectron = onElectron;
264
267
  exports.setupIpcBridge = setupIpcBridge;
265
268
  exports.toIpcResponse = toIpcResponse;
@@ -1,6 +1,6 @@
1
1
  import { n as IpcFetchResponse, t as IpcFetchRequest } from "../ipc.types-DgxeccV3.cjs";
2
2
  import { ConfiguredFeature, CreateRuntimeOptions, EnvAdaptor, HttpCapabilities, Lifecycle, LifecycleManager, ReadyValue, RuntimeApp } from "@zeltjs/core";
3
- import { App, BrowserWindow, BrowserWindowConstructorOptions, Dialog, IpcMain, Menu, Protocol, Rectangle, Screen, Shell, WebContents } from "electron";
3
+ import { App, BrowserWindow, BrowserWindowConstructorOptions, Dialog, IpcMain, IpcMainInvokeEvent, Menu, Protocol, Rectangle, Screen, Shell, WebContents } from "electron";
4
4
 
5
5
  //#region src/main/electron.adaptor.d.ts
6
6
  type ElectronReady = {
@@ -93,10 +93,18 @@ declare class ElectronWindowRegistryService {
93
93
  //#region src/main/ipc-bridge.d.ts
94
94
  declare const toRequest: (payload: IpcFetchRequest, baseUrl: string) => Request;
95
95
  declare const toIpcResponse: (response: Response, method: string) => Promise<IpcFetchResponse>;
96
+ declare module '@zeltjs/core' {
97
+ interface RequestContextSchema {
98
+ ipcEvent: IpcMainInvokeEvent;
99
+ }
100
+ }
96
101
  type IpcMainLike = {
97
- handle(channel: string, listener: (event: unknown, payload: IpcFetchRequest) => unknown): void;
102
+ handle(channel: string, listener: (event: IpcMainInvokeEvent, payload: IpcFetchRequest) => unknown): void;
98
103
  removeHandler(channel: string): void;
99
104
  };
105
+ /** @throws {ZeltContextNotAvailableError} */
106
+ declare const ipcEvent: () => IpcMainInvokeEvent | undefined;
107
+ /** @throws {ZeltContextNotAvailableError} */
100
108
  declare const setupIpcBridge: (ipcMain: IpcMainLike, fetch: (request: Request) => Promise<Response>, channel: string) => (() => void);
101
109
  //#endregion
102
110
  //#region src/main/on-electron.d.ts
@@ -116,7 +124,8 @@ type OnElectronApp = {
116
124
  readonly fetch: (request: Request) => Promise<Response>;
117
125
  readonly shutdown: () => Promise<void>;
118
126
  };
127
+ /** @throws {ZeltContextNotAvailableError} */
119
128
  declare const onElectron: (app: HttpApp, options?: ElectronAppOptions) => Promise<OnElectronApp>;
120
129
  //#endregion
121
- export { ElectronAdaptor, type ElectronAppOptions, ElectronEnvAdaptor, type ElectronReady, ElectronWindowRegistryService, ElectronWindowRuntimeService, type OnElectronApp, type WindowDefinition, type WindowHandle, type WindowId, type WindowLoadTarget, type WindowOpenHandlerResult, type WindowRuntime, onElectron, setupIpcBridge, toIpcResponse, toRequest };
130
+ export { ElectronAdaptor, type ElectronAppOptions, ElectronEnvAdaptor, type ElectronReady, ElectronWindowRegistryService, ElectronWindowRuntimeService, type OnElectronApp, type WindowDefinition, type WindowHandle, type WindowId, type WindowLoadTarget, type WindowOpenHandlerResult, type WindowRuntime, ipcEvent, onElectron, setupIpcBridge, toIpcResponse, toRequest };
122
131
  //# sourceMappingURL=index.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../../src/main/electron.adaptor.ts","../../src/main/electron-env.adaptor.ts","../../src/main/window.types.ts","../../src/main/electron-window-runtime.service.ts","../../src/main/electron-window-registry.service.ts","../../src/main/ipc-bridge.ts","../../src/main/on-electron.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../../src/main/electron.adaptor.ts","../../src/main/electron-env.adaptor.ts","../../src/main/window.types.ts","../../src/main/electron-window-runtime.service.ts","../../src/main/electron-window-registry.service.ts","../../src/main/ipc-bridge.ts","../../src/main/on-electron.ts"],"mappings":";;;;;KAeY,aAAA;EAAA,SACD,GAAA,EAAK,GAAA;EAAA,SACL,OAAA,EAAS,OAAA;EAAA,SACT,QAAA,EAAU,QAAA;EAAA,SACV,KAAA,EAAO,KAAA;EAAA,SACP,MAAA,EAAQ,MAAA;EAAA,SACR,MAAA,EAAQ,MAAA;EAAA,SACR,IAAA,SAAa,IAAA;EAAA,SACb,mBAAA,GAAsB,OAAA,EAAS,+BAAA,KAAoC,aAAA;EAAA,SACnE,aAAA,QAAqB,aAAA;EAAA,SACrB,eAAA,GAAkB,WAAA,EAAa,WAAA,KAAgB,aAAA;EAAA,SAC/C,MAAA,GAAS,EAAA,aAAe,aAAA;EAAA,SACxB,gBAAA,QAAwB,aAAA;AAAA;AAAA,cAItB,eAAA,YAA2B,SAAA,CAAU,aAAA;EAAA,SACvC,KAAA,EAAO,UAAA,CAAW,aAAA;cAEf,gBAAA,GAAgB,gBAAA;EAItB,OAAA,CAAA,GAAW,OAAA,CAAQ,aAAA;EA8BzB,QAAA,CAAA;AAAA;;;cCjEW,kBAAA,SAA2B,UAAA;EAC7B,GAAA,CAAI,GAAA;AAAA;;;KCFH,QAAA;AAAA,KAEA,uBAAA;EAAA,SAAqC,MAAA;AAAA;AAAA,KAErC,YAAA;EAAA,SACD,EAAA;EAAA,SACA,MAAA,EAAQ,aAAA;EACjB,KAAA;EACA,KAAA;EACA,IAAA;EACA,WAAA;EACA,QAAA;EACA,SAAA,IAAa,SAAA;EACb,SAAA,CAAU,MAAA,EAAQ,OAAA,CAAQ,SAAA;EAC1B,QAAA,CAAS,IAAA;EACT,OAAA,CAAQ,GAAA;EACR,EAAA,CAAG,KAAA,8BAAmC,OAAA;EACtC,cAAA,CAAe,KAAA,8BAAmC,OAAA,MAAa,IAAA;EAC/D,WAAA;IACE,IAAA,CAAK,OAAA,aAAoB,IAAA;IACzB,oBAAA,CAAqB,OAAA,GAAU,OAAA;MAAW,GAAA;IAAA,MAAkB,uBAAA;EAAA;AAAA;AAAA,KAIpD,gBAAA;EACN,IAAA;EAAA,SAAuB,IAAA;AAAA;EACvB,IAAA;EAAA,SAAsB,GAAA;AAAA;AAAA,KAEhB,gBAAA;EAAA,SACD,EAAA,EAAI,QAAA;EAAA,SACJ,OAAA,EAAS,+BAAA;EAAA,SACT,UAAA,EAAY,gBAAA;AAAA;AAAA,KAGX,aAAA;EACV,IAAA,CAAK,UAAA,EAAY,gBAAA,GAAmB,YAAA;AAAA;;;cC9BzB,4BAAA,YAAwC,aAAA;EAAA,iBACtB,WAAA;cAAA,WAAA,GAAa,eAAA;EAE1C,IAAA,CAAK,UAAA,EAAY,gBAAA,GAAmB,YAAA;EAcpC,kBAAA,CAAmB,GAAA,EAAK,aAAA,GAAgB,YAAA;AAAA;;;cCnB7B,6BAAA;EAAA,iBAGkB,OAAA;EAAA,iBAFZ,OAAA;cAEY,OAAA,GAAO,4BAAA;EAEpC,IAAA,CAAK,UAAA,EAAY,gBAAA,GAAmB,YAAA;EAiBpC,KAAA,CAAM,EAAA,EAAI,QAAA;EAOV,QAAA,CAAA;EAQA,KAAA,CAAA;AAAA;;;cChBW,SAAA,GAAa,OAAA,EAAS,eAAA,EAAiB,OAAA,aAAkB,OAAA;AAAA,cASzD,aAAA,GACX,QAAA,EAAU,QAAA,EACV,MAAA,aACC,OAAA,CAAQ,gBAAA;AAAA;EAAA,UA2BC,oBAAA;IACR,QAAA,EAAU,kBAAA;EAAA;AAAA;AAAA,KAIT,WAAA;EACH,MAAA,CACE,OAAA,UACA,QAAA,GAAW,KAAA,EAAO,kBAAA,EAAoB,OAAA,EAAS,eAAA;EAEjD,aAAA,CAAc,OAAA;AAAA;;cAIH,QAAA,QAAe,kBAAA;;cAGf,cAAA,GACX,OAAA,EAAS,WAAA,EACT,KAAA,GAAQ,OAAA,EAAS,OAAA,KAAY,OAAA,CAAQ,QAAA,GACrC,OAAA;;;KC3EG,UAAA;AAAA,KAEO,kBAAA;EAAA,SACD,MAAA;EAAA,SACA,UAAA,GAAa,UAAA;AAAA;AAAA,KAGnB,cAAA,GAAiB,UAAA,UAAoB,iBAAA;EAAA,SAC/B,IAAA,EAAM,gBAAA;AAAA;AAAA,KAGZ,OAAA;EAAA,SACM,aAAA,GAAgB,OAAA,GAAU,oBAAA,KAAyB,OAAA,CAAQ,cAAA;AAAA;AAAA,KAG1D,aAAA;EAAA,SACD,GAAA,EAAK,cAAA;EAAA,SACL,KAAA,GAAQ,OAAA,EAAS,OAAA,KAAY,OAAA,CAAQ,QAAA;EAAA,SACrC,QAAA,QAAgB,OAAA;AAAA;;cAMd,UAAA,GACX,GAAA,EAAK,OAAA,EACL,OAAA,GAAS,kBAAA,KACR,OAAA,CAAQ,aAAA"}
@@ -1,6 +1,6 @@
1
1
  import { n as IpcFetchResponse, t as IpcFetchRequest } from "../ipc.types-OYZhXKH2.js";
2
2
  import { ConfiguredFeature, CreateRuntimeOptions, EnvAdaptor, HttpCapabilities, Lifecycle, LifecycleManager, ReadyValue, RuntimeApp } from "@zeltjs/core";
3
- import { App, BrowserWindow, BrowserWindowConstructorOptions, Dialog, IpcMain, Menu, Protocol, Rectangle, Screen, Shell, WebContents } from "electron";
3
+ import { App, BrowserWindow, BrowserWindowConstructorOptions, Dialog, IpcMain, IpcMainInvokeEvent, Menu, Protocol, Rectangle, Screen, Shell, WebContents } from "electron";
4
4
 
5
5
  //#region src/main/electron.adaptor.d.ts
6
6
  type ElectronReady = {
@@ -93,10 +93,18 @@ declare class ElectronWindowRegistryService {
93
93
  //#region src/main/ipc-bridge.d.ts
94
94
  declare const toRequest: (payload: IpcFetchRequest, baseUrl: string) => Request;
95
95
  declare const toIpcResponse: (response: Response, method: string) => Promise<IpcFetchResponse>;
96
+ declare module '@zeltjs/core' {
97
+ interface RequestContextSchema {
98
+ ipcEvent: IpcMainInvokeEvent;
99
+ }
100
+ }
96
101
  type IpcMainLike = {
97
- handle(channel: string, listener: (event: unknown, payload: IpcFetchRequest) => unknown): void;
102
+ handle(channel: string, listener: (event: IpcMainInvokeEvent, payload: IpcFetchRequest) => unknown): void;
98
103
  removeHandler(channel: string): void;
99
104
  };
105
+ /** @throws {ZeltContextNotAvailableError} */
106
+ declare const ipcEvent: () => IpcMainInvokeEvent | undefined;
107
+ /** @throws {ZeltContextNotAvailableError} */
100
108
  declare const setupIpcBridge: (ipcMain: IpcMainLike, fetch: (request: Request) => Promise<Response>, channel: string) => (() => void);
101
109
  //#endregion
102
110
  //#region src/main/on-electron.d.ts
@@ -116,7 +124,8 @@ type OnElectronApp = {
116
124
  readonly fetch: (request: Request) => Promise<Response>;
117
125
  readonly shutdown: () => Promise<void>;
118
126
  };
127
+ /** @throws {ZeltContextNotAvailableError} */
119
128
  declare const onElectron: (app: HttpApp, options?: ElectronAppOptions) => Promise<OnElectronApp>;
120
129
  //#endregion
121
- export { ElectronAdaptor, type ElectronAppOptions, ElectronEnvAdaptor, type ElectronReady, ElectronWindowRegistryService, ElectronWindowRuntimeService, type OnElectronApp, type WindowDefinition, type WindowHandle, type WindowId, type WindowLoadTarget, type WindowOpenHandlerResult, type WindowRuntime, onElectron, setupIpcBridge, toIpcResponse, toRequest };
130
+ export { ElectronAdaptor, type ElectronAppOptions, ElectronEnvAdaptor, type ElectronReady, ElectronWindowRegistryService, ElectronWindowRuntimeService, type OnElectronApp, type WindowDefinition, type WindowHandle, type WindowId, type WindowLoadTarget, type WindowOpenHandlerResult, type WindowRuntime, ipcEvent, onElectron, setupIpcBridge, toIpcResponse, toRequest };
122
131
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/main/electron.adaptor.ts","../../src/main/electron-env.adaptor.ts","../../src/main/window.types.ts","../../src/main/electron-window-runtime.service.ts","../../src/main/electron-window-registry.service.ts","../../src/main/ipc-bridge.ts","../../src/main/on-electron.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/main/electron.adaptor.ts","../../src/main/electron-env.adaptor.ts","../../src/main/window.types.ts","../../src/main/electron-window-runtime.service.ts","../../src/main/electron-window-registry.service.ts","../../src/main/ipc-bridge.ts","../../src/main/on-electron.ts"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { Config, EnvAdaptor, Injectable, LifecycleManager, inject } from "@zeltjs/core";
1
+ import { Config, EnvAdaptor, Injectable, LifecycleManager, getContext, inject, runInContext, setContext } from "@zeltjs/core";
2
2
  import { match } from "ts-pattern";
3
3
  //#region src/main/electron.adaptor.ts
4
4
  function _ts_decorate$3(decorators, target, key, desc) {
@@ -175,7 +175,7 @@ const isTextContentType = (contentType) => TEXT_CONTENT_TYPE_PREFIXES.some((pref
175
175
  const toBody = (body) => match(body).with({ kind: "none" }, () => null).with({ kind: "text" }, ({ value }) => value).with({ kind: "arrayBuffer" }, ({ value }) => value).exhaustive();
176
176
  const toRequest = (payload, baseUrl) => {
177
177
  const headers = payload.headers.map(([k, v]) => [k, v]);
178
- return new Request(baseUrl + payload.path, {
178
+ return new Request(baseUrl.replace(/\/+$/, "") + payload.path, {
179
179
  method: payload.method,
180
180
  headers,
181
181
  body: BODY_FORBIDDEN_METHODS.has(payload.method) ? null : toBody(payload.body)
@@ -206,10 +206,12 @@ const toIpcResponse = async (response, method) => {
206
206
  body
207
207
  };
208
208
  };
209
- const setupIpcBridge = (ipcMain, fetch, channel) => {
210
- ipcMain.handle(channel, async (_event, payload) => {
209
+ /** @throws {ZeltContextNotAvailableError} */ const ipcEvent = () => getContext("ipcEvent");
210
+ /** @throws {ZeltContextNotAvailableError} */ const setupIpcBridge = (ipcMain, fetch, channel) => {
211
+ ipcMain.handle(channel, async (event, payload) => runInContext(async () => {
212
+ setContext("ipcEvent", event);
211
213
  return toIpcResponse(await fetch(toRequest(payload, channel)), payload.method);
212
- });
214
+ }));
213
215
  return () => {
214
216
  ipcMain.removeHandler(channel);
215
217
  };
@@ -217,7 +219,7 @@ const setupIpcBridge = (ipcMain, fetch, channel) => {
217
219
  //#endregion
218
220
  //#region src/main/on-electron.ts
219
221
  const DEFAULT_IPC_CHANNEL = "http://zelt-ipc";
220
- const onElectron = async (app, options = {}) => {
222
+ /** @throws {ZeltContextNotAvailableError} */ const onElectron = async (app, options = {}) => {
221
223
  const readyApp = await app.createRuntime({
222
224
  fallbackConfigs: [ElectronEnvAdaptor],
223
225
  warmup: options.warmup ?? true
@@ -235,6 +237,6 @@ const onElectron = async (app, options = {}) => {
235
237
  };
236
238
  };
237
239
  //#endregion
238
- export { ElectronAdaptor, ElectronEnvAdaptor, ElectronWindowRegistryService, ElectronWindowRuntimeService, onElectron, setupIpcBridge, toIpcResponse, toRequest };
240
+ export { ElectronAdaptor, ElectronEnvAdaptor, ElectronWindowRegistryService, ElectronWindowRuntimeService, ipcEvent, onElectron, setupIpcBridge, toIpcResponse, toRequest };
239
241
 
240
242
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["Injectable","inject","LifecycleManager","ElectronAdaptor","startup","app","BrowserWindow","BW","dialog","ipcMain","Menu","protocol","screen","shell","whenReady","createBrowserWindow","options","getAllWindows","fromWebContents","wc","fromId","id","getFocusedWindow","shutdown","ready","quit","lifecycleManager","register","Config","EnvAdaptor","ElectronEnvAdaptor","get","key","process","env","Injectable","inject","match","ElectronAdaptor","ElectronWindowRuntimeService","open","definition","handle","createWindowHandle","electronApp","ready","createBrowserWindow","options","loadTarget","type","loadURL","url","loadFile","path","win","id","native","close","focus","show","isDestroyed","getTitle","getBounds","setBounds","bounds","on","event","handler","with","e","exhaustive","removeListener","webContents","send","channel","args","setWindowOpenHandler","Injectable","inject","ElectronWindowRuntimeService","ElectronWindowRegistryService","open","definition","existing","windows","get","id","isDestroyed","focus","handle","runtime","set","on","delete","close","closeAll","values","count","size","Map","match","BODY_FORBIDDEN_METHODS","Set","NO_BODY_STATUSES","TEXT_CONTENT_TYPE_PREFIXES","isTextContentType","contentType","some","prefix","startsWith","toBody","body","with","kind","value","exhaustive","toRequest","payload","baseUrl","headers","map","k","v","Request","path","method","has","toIpcResponse","response","forEach","key","push","status","get","text","arrayBuffer","statusText","setupIpcBridge","ipcMain","fetch","channel","handle","_event","request","removeHandler","ElectronAdaptor","ElectronEnvAdaptor","setupIpcBridge","DEFAULT_IPC_CHANNEL","onElectron","app","options","readyApp","createRuntime","fallbackConfigs","warmup","electronApp","get","channel","ipcChannel","removeIpcHandler","ready","ipcMain","http","fetch","shutdown"],"sources":["../../src/main/electron.adaptor.ts","../../src/main/electron-env.adaptor.ts","../../src/main/electron-window-runtime.service.ts","../../src/main/electron-window-registry.service.ts","../../src/main/ipc-bridge.ts","../../src/main/on-electron.ts"],"sourcesContent":["import type { Lifecycle, ReadyValue } from '@zeltjs/core';\nimport { Injectable, inject, LifecycleManager } from '@zeltjs/core';\nimport type {\n App,\n BrowserWindow,\n BrowserWindowConstructorOptions,\n Dialog,\n IpcMain,\n Menu,\n Protocol,\n Screen,\n Shell,\n WebContents,\n} from 'electron';\n\nexport type ElectronReady = {\n readonly app: App;\n readonly ipcMain: IpcMain;\n readonly protocol: Protocol;\n readonly shell: Shell;\n readonly screen: Screen;\n readonly dialog: Dialog;\n readonly Menu: typeof Menu;\n readonly createBrowserWindow: (options: BrowserWindowConstructorOptions) => BrowserWindow;\n readonly getAllWindows: () => BrowserWindow[];\n readonly fromWebContents: (webContents: WebContents) => BrowserWindow | null;\n readonly fromId: (id: number) => BrowserWindow | null;\n readonly getFocusedWindow: () => BrowserWindow | null;\n};\n\n@Injectable()\nexport class ElectronAdaptor implements Lifecycle<ElectronReady> {\n readonly ready: ReadyValue<ElectronReady>;\n\n constructor(lifecycleManager = inject(LifecycleManager)) {\n this.ready = lifecycleManager.register(this);\n }\n\n async startup(): Promise<ElectronReady> {\n const {\n app,\n BrowserWindow: BW,\n dialog,\n ipcMain,\n Menu,\n protocol,\n screen,\n shell,\n } = await import('electron');\n\n await app.whenReady();\n\n return {\n app,\n ipcMain,\n protocol,\n shell,\n screen,\n dialog,\n Menu,\n createBrowserWindow: (options: BrowserWindowConstructorOptions) => new BW(options),\n getAllWindows: () => BW.getAllWindows(),\n fromWebContents: (wc: WebContents) => BW.fromWebContents(wc),\n fromId: (id: number) => BW.fromId(id),\n getFocusedWindow: () => BW.getFocusedWindow(),\n };\n }\n\n shutdown(): void {\n this.ready.app.quit();\n }\n}\n","import { Config, EnvAdaptor } from '@zeltjs/core';\n\n@Config\nexport class ElectronEnvAdaptor extends EnvAdaptor {\n override get(key: string): string | undefined {\n return process.env[key];\n }\n}\n","import { Injectable, inject } from '@zeltjs/core';\nimport type { BrowserWindow } from 'electron';\nimport { match } from 'ts-pattern';\nimport { ElectronAdaptor } from './electron.adaptor';\nimport type { WindowDefinition, WindowHandle, WindowRuntime } from './window.types';\n\n@Injectable()\nexport class ElectronWindowRuntimeService implements WindowRuntime {\n constructor(private readonly electronApp: ElectronAdaptor = inject(ElectronAdaptor)) {}\n\n open(definition: WindowDefinition): WindowHandle {\n const handle = this.createWindowHandle(\n this.electronApp.ready.createBrowserWindow(definition.options),\n );\n\n if (definition.loadTarget.type === 'url') {\n handle.loadURL(definition.loadTarget.url);\n } else {\n handle.loadFile(definition.loadTarget.path);\n }\n\n return handle;\n }\n\n createWindowHandle(win: BrowserWindow): WindowHandle {\n return {\n id: win.id,\n native: win,\n close: () => win.close(),\n focus: () => win.focus(),\n show: () => win.show(),\n isDestroyed: () => win.isDestroyed(),\n getTitle: () => win.getTitle(),\n getBounds: () => win.getBounds(),\n setBounds: (bounds) => win.setBounds(bounds),\n loadFile: (path) => {\n void win.loadFile(path);\n },\n loadURL: (url) => {\n void win.loadURL(url);\n },\n on: (event, handler) => {\n match(event)\n .with('closed', (e) => win.on(e, handler))\n .with('ready-to-show', (e) => win.on(e, handler))\n .exhaustive();\n },\n removeListener: (event, handler) => {\n match(event)\n .with('closed', (e) => win.removeListener(e, handler))\n .with('ready-to-show', (e) => win.removeListener(e, handler))\n .exhaustive();\n },\n webContents: {\n send: (channel, ...args) => win.webContents.send(channel, ...args),\n setWindowOpenHandler: (handler) => win.webContents.setWindowOpenHandler(handler),\n },\n };\n }\n}\n","import { Injectable, inject } from '@zeltjs/core';\nimport { ElectronWindowRuntimeService } from './electron-window-runtime.service';\nimport type { WindowDefinition, WindowHandle, WindowId } from './window.types';\n\n@Injectable()\nexport class ElectronWindowRegistryService {\n private readonly windows = new Map<WindowId, WindowHandle>();\n\n constructor(private readonly runtime = inject(ElectronWindowRuntimeService)) {}\n\n open(definition: WindowDefinition): WindowHandle {\n const existing = this.windows.get(definition.id);\n if (existing && !existing.isDestroyed()) {\n existing.focus();\n return existing;\n }\n\n const handle = this.runtime.open(definition);\n this.windows.set(definition.id, handle);\n\n handle.on('closed', () => {\n this.windows.delete(definition.id);\n });\n\n return handle;\n }\n\n close(id: WindowId): void {\n const handle = this.windows.get(id);\n if (handle && !handle.isDestroyed()) {\n handle.close();\n }\n }\n\n closeAll(): void {\n for (const handle of this.windows.values()) {\n if (!handle.isDestroyed()) {\n handle.close();\n }\n }\n }\n\n count(): number {\n return this.windows.size;\n }\n}\n","import { match } from 'ts-pattern';\n\nimport type { IpcBody, IpcFetchRequest, IpcFetchResponse } from '../shared/ipc.types';\n\nconst BODY_FORBIDDEN_METHODS = new Set(['GET', 'HEAD']);\nconst NO_BODY_STATUSES = new Set([204, 205, 304]);\nconst TEXT_CONTENT_TYPE_PREFIXES = [\n 'text/',\n 'application/json',\n 'application/xml',\n 'application/javascript',\n 'application/x-www-form-urlencoded',\n];\n\nconst isTextContentType = (contentType: string): boolean =>\n TEXT_CONTENT_TYPE_PREFIXES.some((prefix) => contentType.startsWith(prefix));\n\nconst toBody = (body: IpcBody): BodyInit | null =>\n match(body)\n .with({ kind: 'none' }, () => null)\n .with({ kind: 'text' }, ({ value }) => value)\n .with({ kind: 'arrayBuffer' }, ({ value }) => value)\n .exhaustive();\n\nexport const toRequest = (payload: IpcFetchRequest, baseUrl: string): Request => {\n const headers: [string, string][] = payload.headers.map(([k, v]) => [k, v]);\n return new Request(baseUrl + payload.path, {\n method: payload.method,\n headers,\n body: BODY_FORBIDDEN_METHODS.has(payload.method) ? null : toBody(payload.body),\n });\n};\n\nexport const toIpcResponse = async (\n response: Response,\n method: string,\n): Promise<IpcFetchResponse> => {\n const headers: [string, string][] = [];\n response.headers.forEach((value, key) => {\n headers.push([key, value]);\n });\n\n let body: IpcBody;\n if (NO_BODY_STATUSES.has(response.status) || method === 'HEAD') {\n body = { kind: 'none' };\n } else {\n const contentType = response.headers.get('content-type');\n if (contentType && isTextContentType(contentType)) {\n body = { kind: 'text', value: await response.text() };\n } else {\n body = { kind: 'arrayBuffer', value: await response.arrayBuffer() };\n }\n }\n\n return {\n status: response.status,\n statusText: response.statusText,\n headers,\n body,\n };\n};\n\ntype IpcMainLike = {\n handle(channel: string, listener: (event: unknown, payload: IpcFetchRequest) => unknown): void;\n removeHandler(channel: string): void;\n};\n\nexport const setupIpcBridge = (\n ipcMain: IpcMainLike,\n fetch: (request: Request) => Promise<Response>,\n channel: string,\n): (() => void) => {\n ipcMain.handle(channel, async (_event: unknown, payload: IpcFetchRequest) => {\n const request = toRequest(payload, channel);\n const response = await fetch(request);\n return toIpcResponse(response, payload.method);\n });\n\n return () => {\n ipcMain.removeHandler(channel);\n };\n};\n","import type {\n ConfiguredFeature,\n CreateRuntimeOptions,\n HttpCapabilities,\n RuntimeApp,\n} from '@zeltjs/core';\nimport { ElectronAdaptor } from './electron.adaptor';\nimport { ElectronEnvAdaptor } from './electron-env.adaptor';\nimport { setupIpcBridge } from './ipc-bridge';\n\ntype IpcChannel = `http://${string}` | `https://${string}`;\n\nexport type ElectronAppOptions = {\n readonly warmup?: boolean;\n readonly ipcChannel?: IpcChannel;\n};\n\ntype HttpRuntimeApp = RuntimeApp<readonly ConfiguredFeature[]> & {\n readonly http: HttpCapabilities;\n};\n\ntype HttpApp = {\n readonly createRuntime: (options?: CreateRuntimeOptions) => Promise<HttpRuntimeApp>;\n};\n\nexport type OnElectronApp = {\n readonly get: HttpRuntimeApp['get'];\n readonly fetch: (request: Request) => Promise<Response>;\n readonly shutdown: () => Promise<void>;\n};\n\nconst DEFAULT_IPC_CHANNEL = 'http://zelt-ipc';\n\nexport const onElectron = async (\n app: HttpApp,\n options: ElectronAppOptions = {},\n): Promise<OnElectronApp> => {\n const readyApp = await app.createRuntime({\n fallbackConfigs: [ElectronEnvAdaptor],\n warmup: options.warmup ?? true,\n });\n\n const electronApp = await readyApp.get(ElectronAdaptor);\n const channel = options.ipcChannel ?? DEFAULT_IPC_CHANNEL;\n\n const removeIpcHandler = setupIpcBridge(electronApp.ready.ipcMain, readyApp.http.fetch, channel);\n\n return {\n get: readyApp.get,\n fetch: readyApp.http.fetch,\n shutdown: async () => {\n removeIpcHandler();\n await readyApp.shutdown();\n },\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["Injectable","inject","LifecycleManager","ElectronAdaptor","startup","app","BrowserWindow","BW","dialog","ipcMain","Menu","protocol","screen","shell","whenReady","createBrowserWindow","options","getAllWindows","fromWebContents","wc","fromId","id","getFocusedWindow","shutdown","ready","quit","lifecycleManager","register","Config","EnvAdaptor","ElectronEnvAdaptor","get","key","process","env","Injectable","inject","match","ElectronAdaptor","ElectronWindowRuntimeService","open","definition","handle","createWindowHandle","electronApp","ready","createBrowserWindow","options","loadTarget","type","loadURL","url","loadFile","path","win","id","native","close","focus","show","isDestroyed","getTitle","getBounds","setBounds","bounds","on","event","handler","with","e","exhaustive","removeListener","webContents","send","channel","args","setWindowOpenHandler","Injectable","inject","ElectronWindowRuntimeService","ElectronWindowRegistryService","open","definition","existing","windows","get","id","isDestroyed","focus","handle","runtime","set","on","delete","close","closeAll","values","count","size","Map","getContext","runInContext","setContext","match","BODY_FORBIDDEN_METHODS","Set","NO_BODY_STATUSES","TEXT_CONTENT_TYPE_PREFIXES","isTextContentType","contentType","some","prefix","startsWith","toBody","body","with","kind","value","exhaustive","toRequest","payload","baseUrl","headers","map","k","v","Request","replace","path","method","has","toIpcResponse","response","forEach","key","push","status","get","text","arrayBuffer","statusText","ipcEvent","setupIpcBridge","ipcMain","fetch","channel","handle","event","request","removeHandler","ElectronAdaptor","ElectronEnvAdaptor","setupIpcBridge","DEFAULT_IPC_CHANNEL","onElectron","app","options","readyApp","createRuntime","fallbackConfigs","warmup","electronApp","get","channel","ipcChannel","removeIpcHandler","ready","ipcMain","http","fetch","shutdown"],"sources":["../../src/main/electron.adaptor.ts","../../src/main/electron-env.adaptor.ts","../../src/main/electron-window-runtime.service.ts","../../src/main/electron-window-registry.service.ts","../../src/main/ipc-bridge.ts","../../src/main/on-electron.ts"],"sourcesContent":["import type { Lifecycle, ReadyValue } from '@zeltjs/core';\nimport { Injectable, inject, LifecycleManager } from '@zeltjs/core';\nimport type {\n App,\n BrowserWindow,\n BrowserWindowConstructorOptions,\n Dialog,\n IpcMain,\n Menu,\n Protocol,\n Screen,\n Shell,\n WebContents,\n} from 'electron';\n\nexport type ElectronReady = {\n readonly app: App;\n readonly ipcMain: IpcMain;\n readonly protocol: Protocol;\n readonly shell: Shell;\n readonly screen: Screen;\n readonly dialog: Dialog;\n readonly Menu: typeof Menu;\n readonly createBrowserWindow: (options: BrowserWindowConstructorOptions) => BrowserWindow;\n readonly getAllWindows: () => BrowserWindow[];\n readonly fromWebContents: (webContents: WebContents) => BrowserWindow | null;\n readonly fromId: (id: number) => BrowserWindow | null;\n readonly getFocusedWindow: () => BrowserWindow | null;\n};\n\n@Injectable()\nexport class ElectronAdaptor implements Lifecycle<ElectronReady> {\n readonly ready: ReadyValue<ElectronReady>;\n\n constructor(lifecycleManager = inject(LifecycleManager)) {\n this.ready = lifecycleManager.register(this);\n }\n\n async startup(): Promise<ElectronReady> {\n const {\n app,\n BrowserWindow: BW,\n dialog,\n ipcMain,\n Menu,\n protocol,\n screen,\n shell,\n } = await import('electron');\n\n await app.whenReady();\n\n return {\n app,\n ipcMain,\n protocol,\n shell,\n screen,\n dialog,\n Menu,\n createBrowserWindow: (options: BrowserWindowConstructorOptions) => new BW(options),\n getAllWindows: () => BW.getAllWindows(),\n fromWebContents: (wc: WebContents) => BW.fromWebContents(wc),\n fromId: (id: number) => BW.fromId(id),\n getFocusedWindow: () => BW.getFocusedWindow(),\n };\n }\n\n shutdown(): void {\n this.ready.app.quit();\n }\n}\n","import { Config, EnvAdaptor } from '@zeltjs/core';\n\n@Config\nexport class ElectronEnvAdaptor extends EnvAdaptor {\n override get(key: string): string | undefined {\n return process.env[key];\n }\n}\n","import { Injectable, inject } from '@zeltjs/core';\nimport type { BrowserWindow } from 'electron';\nimport { match } from 'ts-pattern';\nimport { ElectronAdaptor } from './electron.adaptor';\nimport type { WindowDefinition, WindowHandle, WindowRuntime } from './window.types';\n\n@Injectable()\nexport class ElectronWindowRuntimeService implements WindowRuntime {\n constructor(private readonly electronApp: ElectronAdaptor = inject(ElectronAdaptor)) {}\n\n open(definition: WindowDefinition): WindowHandle {\n const handle = this.createWindowHandle(\n this.electronApp.ready.createBrowserWindow(definition.options),\n );\n\n if (definition.loadTarget.type === 'url') {\n handle.loadURL(definition.loadTarget.url);\n } else {\n handle.loadFile(definition.loadTarget.path);\n }\n\n return handle;\n }\n\n createWindowHandle(win: BrowserWindow): WindowHandle {\n return {\n id: win.id,\n native: win,\n close: () => win.close(),\n focus: () => win.focus(),\n show: () => win.show(),\n isDestroyed: () => win.isDestroyed(),\n getTitle: () => win.getTitle(),\n getBounds: () => win.getBounds(),\n setBounds: (bounds) => win.setBounds(bounds),\n loadFile: (path) => {\n void win.loadFile(path);\n },\n loadURL: (url) => {\n void win.loadURL(url);\n },\n on: (event, handler) => {\n match(event)\n .with('closed', (e) => win.on(e, handler))\n .with('ready-to-show', (e) => win.on(e, handler))\n .exhaustive();\n },\n removeListener: (event, handler) => {\n match(event)\n .with('closed', (e) => win.removeListener(e, handler))\n .with('ready-to-show', (e) => win.removeListener(e, handler))\n .exhaustive();\n },\n webContents: {\n send: (channel, ...args) => win.webContents.send(channel, ...args),\n setWindowOpenHandler: (handler) => win.webContents.setWindowOpenHandler(handler),\n },\n };\n }\n}\n","import { Injectable, inject } from '@zeltjs/core';\nimport { ElectronWindowRuntimeService } from './electron-window-runtime.service';\nimport type { WindowDefinition, WindowHandle, WindowId } from './window.types';\n\n@Injectable()\nexport class ElectronWindowRegistryService {\n private readonly windows = new Map<WindowId, WindowHandle>();\n\n constructor(private readonly runtime = inject(ElectronWindowRuntimeService)) {}\n\n open(definition: WindowDefinition): WindowHandle {\n const existing = this.windows.get(definition.id);\n if (existing && !existing.isDestroyed()) {\n existing.focus();\n return existing;\n }\n\n const handle = this.runtime.open(definition);\n this.windows.set(definition.id, handle);\n\n handle.on('closed', () => {\n this.windows.delete(definition.id);\n });\n\n return handle;\n }\n\n close(id: WindowId): void {\n const handle = this.windows.get(id);\n if (handle && !handle.isDestroyed()) {\n handle.close();\n }\n }\n\n closeAll(): void {\n for (const handle of this.windows.values()) {\n if (!handle.isDestroyed()) {\n handle.close();\n }\n }\n }\n\n count(): number {\n return this.windows.size;\n }\n}\n","import { getContext, runInContext, setContext } from '@zeltjs/core';\nimport type { IpcMainInvokeEvent } from 'electron';\nimport { match } from 'ts-pattern';\n\nimport type { IpcBody, IpcFetchRequest, IpcFetchResponse } from '../shared/ipc.types';\n\nconst BODY_FORBIDDEN_METHODS = new Set(['GET', 'HEAD']);\nconst NO_BODY_STATUSES = new Set([204, 205, 304]);\nconst TEXT_CONTENT_TYPE_PREFIXES = [\n 'text/',\n 'application/json',\n 'application/xml',\n 'application/javascript',\n 'application/x-www-form-urlencoded',\n];\n\nconst isTextContentType = (contentType: string): boolean =>\n TEXT_CONTENT_TYPE_PREFIXES.some((prefix) => contentType.startsWith(prefix));\n\nconst toBody = (body: IpcBody): BodyInit | null =>\n match(body)\n .with({ kind: 'none' }, () => null)\n .with({ kind: 'text' }, ({ value }) => value)\n .with({ kind: 'arrayBuffer' }, ({ value }) => value)\n .exhaustive();\n\nexport const toRequest = (payload: IpcFetchRequest, baseUrl: string): Request => {\n const headers: [string, string][] = payload.headers.map(([k, v]) => [k, v]);\n return new Request(baseUrl.replace(/\\/+$/, '') + payload.path, {\n method: payload.method,\n headers,\n body: BODY_FORBIDDEN_METHODS.has(payload.method) ? null : toBody(payload.body),\n });\n};\n\nexport const toIpcResponse = async (\n response: Response,\n method: string,\n): Promise<IpcFetchResponse> => {\n const headers: [string, string][] = [];\n response.headers.forEach((value, key) => {\n headers.push([key, value]);\n });\n\n let body: IpcBody;\n if (NO_BODY_STATUSES.has(response.status) || method === 'HEAD') {\n body = { kind: 'none' };\n } else {\n const contentType = response.headers.get('content-type');\n if (contentType && isTextContentType(contentType)) {\n body = { kind: 'text', value: await response.text() };\n } else {\n body = { kind: 'arrayBuffer', value: await response.arrayBuffer() };\n }\n }\n\n return {\n status: response.status,\n statusText: response.statusText,\n headers,\n body,\n };\n};\n\ndeclare module '@zeltjs/core' {\n interface RequestContextSchema {\n ipcEvent: IpcMainInvokeEvent;\n }\n}\n\ntype IpcMainLike = {\n handle(\n channel: string,\n listener: (event: IpcMainInvokeEvent, payload: IpcFetchRequest) => unknown,\n ): void;\n removeHandler(channel: string): void;\n};\n\n/** @throws {ZeltContextNotAvailableError} */\nexport const ipcEvent = (): IpcMainInvokeEvent | undefined => getContext('ipcEvent');\n\n/** @throws {ZeltContextNotAvailableError} */\nexport const setupIpcBridge = (\n ipcMain: IpcMainLike,\n fetch: (request: Request) => Promise<Response>,\n channel: string,\n): (() => void) => {\n ipcMain.handle(channel, async (event, payload) =>\n runInContext(async () => {\n setContext('ipcEvent', event);\n const request = toRequest(payload, channel);\n const response = await fetch(request);\n return toIpcResponse(response, payload.method);\n }),\n );\n\n return () => {\n ipcMain.removeHandler(channel);\n };\n};\n","import type {\n ConfiguredFeature,\n CreateRuntimeOptions,\n HttpCapabilities,\n RuntimeApp,\n} from '@zeltjs/core';\nimport { ElectronAdaptor } from './electron.adaptor';\nimport { ElectronEnvAdaptor } from './electron-env.adaptor';\nimport { setupIpcBridge } from './ipc-bridge';\n\ntype IpcChannel = `http://${string}` | `https://${string}`;\n\nexport type ElectronAppOptions = {\n readonly warmup?: boolean;\n readonly ipcChannel?: IpcChannel;\n};\n\ntype HttpRuntimeApp = RuntimeApp<readonly ConfiguredFeature[]> & {\n readonly http: HttpCapabilities;\n};\n\ntype HttpApp = {\n readonly createRuntime: (options?: CreateRuntimeOptions) => Promise<HttpRuntimeApp>;\n};\n\nexport type OnElectronApp = {\n readonly get: HttpRuntimeApp['get'];\n readonly fetch: (request: Request) => Promise<Response>;\n readonly shutdown: () => Promise<void>;\n};\n\nconst DEFAULT_IPC_CHANNEL = 'http://zelt-ipc';\n\n/** @throws {ZeltContextNotAvailableError} */\nexport const onElectron = async (\n app: HttpApp,\n options: ElectronAppOptions = {},\n): Promise<OnElectronApp> => {\n const readyApp = await app.createRuntime({\n fallbackConfigs: [ElectronEnvAdaptor],\n warmup: options.warmup ?? true,\n });\n\n const electronApp = await readyApp.get(ElectronAdaptor);\n const channel = options.ipcChannel ?? DEFAULT_IPC_CHANNEL;\n\n const removeIpcHandler = setupIpcBridge(electronApp.ready.ipcMain, readyApp.http.fetch, channel);\n\n return {\n get: readyApp.get,\n fetch: readyApp.http.fetch,\n shutdown: async () => {\n removeIpcHandler();\n await readyApp.shutdown();\n },\n };\n};\n"],"mappings":"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"}
@@ -1,14 +1,11 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ let electron = require("electron");
2
3
  //#region src/preload/expose-ipc.ts
3
4
  const DEFAULT_IPC_CHANNEL = "http://zelt-ipc";
4
- const loadElectron = () => {
5
- return require("electron");
6
- };
7
5
  const exposeIpc = (options = {}) => {
8
6
  const channel = options.channel ?? DEFAULT_IPC_CHANNEL;
9
- const { contextBridge, ipcRenderer } = loadElectron();
10
- const sender = (request) => ipcRenderer.invoke(channel, request);
11
- if (process.contextIsolated) contextBridge.exposeInMainWorld(channel, sender);
7
+ const sender = (request) => electron.ipcRenderer.invoke(channel, request);
8
+ if (process.contextIsolated) electron.contextBridge.exposeInMainWorld(channel, sender);
12
9
  else Reflect.set(globalThis, channel, sender);
13
10
  };
14
11
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../../src/preload/expose-ipc.ts"],"mappings":";;;KAMY,gBAAA;EAAA,SACD,OAAA;AAAA;AAAA,cAcE,SAAA,GAAa,OAAA,GAAS,gBAAA"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../../src/preload/expose-ipc.ts"],"mappings":";;;KAMY,gBAAA;EAAA,SACD,OAAA;AAAA;AAAA,cAGE,SAAA,GAAa,OAAA,GAAS,gBAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/preload/expose-ipc.ts"],"mappings":";;;KAMY,gBAAA;EAAA,SACD,OAAA;AAAA;AAAA,cAcE,SAAA,GAAa,OAAA,GAAS,gBAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/preload/expose-ipc.ts"],"mappings":";;;KAMY,gBAAA;EAAA,SACD,OAAA;AAAA;AAAA,cAGE,SAAA,GAAa,OAAA,GAAS,gBAAA"}
@@ -1,15 +1,8 @@
1
- import { createRequire } from "node:module";
2
- //#region \0rolldown/runtime.js
3
- var __require = /* @__PURE__ */ createRequire(import.meta.url);
4
- //#endregion
1
+ import { contextBridge, ipcRenderer } from "electron";
5
2
  //#region src/preload/expose-ipc.ts
6
3
  const DEFAULT_IPC_CHANNEL = "http://zelt-ipc";
7
- const loadElectron = () => {
8
- return __require("electron");
9
- };
10
4
  const exposeIpc = (options = {}) => {
11
5
  const channel = options.channel ?? DEFAULT_IPC_CHANNEL;
12
- const { contextBridge, ipcRenderer } = loadElectron();
13
6
  const sender = (request) => ipcRenderer.invoke(channel, request);
14
7
  if (process.contextIsolated) contextBridge.exposeInMainWorld(channel, sender);
15
8
  else Reflect.set(globalThis, channel, sender);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["DEFAULT_IPC_CHANNEL","loadElectron","mod","require","exposeIpc","options","channel","contextBridge","ipcRenderer","sender","request","invoke","process","contextIsolated","exposeInMainWorld","Reflect","set","globalThis"],"sources":["../../src/preload/expose-ipc.ts"],"sourcesContent":["import type { ContextBridge, IpcRenderer } from 'electron';\n\nimport type { IpcFetchRequest, IpcFetchResponse } from '../shared/ipc.types';\n\nconst DEFAULT_IPC_CHANNEL = 'http://zelt-ipc';\n\nexport type ExposeIpcOptions = {\n readonly channel?: string;\n};\n\ntype ElectronPreload = {\n readonly contextBridge: ContextBridge;\n readonly ipcRenderer: IpcRenderer;\n};\n\n// In the preload context electron is only available via require (no ESM in preload).\nconst loadElectron = (): ElectronPreload => {\n const mod: ElectronPreload = require('electron');\n return mod;\n};\n\nexport const exposeIpc = (options: ExposeIpcOptions = {}): void => {\n const channel = options.channel ?? DEFAULT_IPC_CHANNEL;\n const { contextBridge, ipcRenderer } = loadElectron();\n\n const sender = (request: IpcFetchRequest): Promise<IpcFetchResponse> =>\n ipcRenderer.invoke(channel, request);\n\n if (process.contextIsolated) {\n contextBridge.exposeInMainWorld(channel, sender);\n } else {\n Reflect.set(globalThis, channel, sender);\n }\n};\n"],"mappings":";;;;;AAIA,MAAMA,sBAAsB;AAY5B,MAAMC,qBAAe;AAEnB,QAAA,UADqC,WAC9BC;;AAGT,MAAaE,aAAaC,UAA4B,EAAE,KAAA;CACtD,MAAMC,UAAUD,QAAQC,WAAWN;CACnC,MAAM,EAAEO,eAAeC,gBAAgBP,cAAAA;CAEvC,MAAMQ,UAAUC,YACdF,YAAYG,OAAOL,SAASI,QAAAA;AAE9B,KAAIE,QAAQC,gBACVN,eAAcO,kBAAkBR,SAASG,OAAAA;KAEzCM,SAAQC,IAAIC,YAAYX,SAASG,OAAAA"}
1
+ {"version":3,"file":"index.js","names":["contextBridge","ipcRenderer","DEFAULT_IPC_CHANNEL","exposeIpc","options","channel","sender","request","invoke","process","contextIsolated","exposeInMainWorld","Reflect","set","globalThis"],"sources":["../../src/preload/expose-ipc.ts"],"sourcesContent":["import { contextBridge, ipcRenderer } from 'electron';\n\nimport type { IpcFetchRequest, IpcFetchResponse } from '../shared/ipc.types';\n\nconst DEFAULT_IPC_CHANNEL = 'http://zelt-ipc';\n\nexport type ExposeIpcOptions = {\n readonly channel?: string;\n};\n\nexport const exposeIpc = (options: ExposeIpcOptions = {}): void => {\n const channel = options.channel ?? DEFAULT_IPC_CHANNEL;\n\n const sender = (request: IpcFetchRequest): Promise<IpcFetchResponse> =>\n ipcRenderer.invoke(channel, request);\n\n if (process.contextIsolated) {\n contextBridge.exposeInMainWorld(channel, sender);\n } else {\n Reflect.set(globalThis, channel, sender);\n }\n};\n"],"mappings":";;AAIA,MAAME,sBAAsB;AAM5B,MAAaC,aAAaC,UAA4B,EAAE,KAAA;CACtD,MAAMC,UAAUD,QAAQC,WAAWH;CAEnC,MAAMI,UAAUC,YACdN,YAAYO,OAAOH,SAASE,QAAAA;AAE9B,KAAIE,QAAQC,gBACVV,eAAcW,kBAAkBN,SAASC,OAAAA;KAEzCM,SAAQC,IAAIC,YAAYT,SAASC,OAAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zeltjs/adapter-electron",
3
- "version": "0.8.2-canary.1",
3
+ "version": "0.9.0",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -49,7 +49,7 @@
49
49
  ],
50
50
  "dependencies": {
51
51
  "ts-pattern": "5.7.1",
52
- "@zeltjs/core": "0.8.2-canary.1"
52
+ "@zeltjs/core": "0.9.0"
53
53
  },
54
54
  "devDependencies": {
55
55
  "@types/node": "22.19.17"