@anyreplay/electron 0.0.0-stage → 0.2.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/README.md +82 -2
- package/dist/bridge-BQKD7rrG.d.cts +53 -0
- package/dist/bridge-BQKD7rrG.d.ts +53 -0
- package/dist/chunk-5TQ2HVGX.js +18 -0
- package/dist/chunk-5TQ2HVGX.js.map +1 -0
- package/dist/index.cjs +177 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +80 -0
- package/dist/index.d.ts +80 -0
- package/dist/index.js +137 -0
- package/dist/index.js.map +1 -0
- package/dist/main.cjs +143 -0
- package/dist/main.cjs.map +1 -0
- package/dist/main.d.cts +66 -0
- package/dist/main.d.ts +66 -0
- package/dist/main.js +105 -0
- package/dist/main.js.map +1 -0
- package/dist/preload.cjs +86 -0
- package/dist/preload.cjs.map +1 -0
- package/dist/preload.d.cts +22 -0
- package/dist/preload.d.ts +22 -0
- package/dist/preload.js +51 -0
- package/dist/preload.js.map +1 -0
- package/package.json +74 -3
package/dist/preload.cjs
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/preload.ts
|
|
21
|
+
var preload_exports = {};
|
|
22
|
+
__export(preload_exports, {
|
|
23
|
+
exposeAnyReplay: () => exposeAnyReplay
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(preload_exports);
|
|
26
|
+
var import_electron = require("electron");
|
|
27
|
+
|
|
28
|
+
// src/bridge.ts
|
|
29
|
+
var BRIDGE_KEY = "anyreplayElectron";
|
|
30
|
+
var CHANNELS = {
|
|
31
|
+
/** renderer → main (invoke): `AppInfo`. */
|
|
32
|
+
appInfo: "anyreplay:app-info",
|
|
33
|
+
/** main → renderer: flush now, then answer on `flushed` with the same id. */
|
|
34
|
+
flush: "anyreplay:flush",
|
|
35
|
+
/** renderer → main: a flush asked for by `flush` has finished. */
|
|
36
|
+
flushed: "anyreplay:flushed",
|
|
37
|
+
/** main → renderer: an uncaught exception in the main process. */
|
|
38
|
+
mainError: "anyreplay:main-error"
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
// src/preload.ts
|
|
42
|
+
function exposeAnyReplay() {
|
|
43
|
+
let flushHandler = null;
|
|
44
|
+
let errorListener = null;
|
|
45
|
+
import_electron.ipcRenderer.on(CHANNELS.flush, (_event, id) => {
|
|
46
|
+
void (async () => {
|
|
47
|
+
try {
|
|
48
|
+
await flushHandler?.();
|
|
49
|
+
} catch {
|
|
50
|
+
}
|
|
51
|
+
import_electron.ipcRenderer.send(CHANNELS.flushed, id);
|
|
52
|
+
})();
|
|
53
|
+
});
|
|
54
|
+
import_electron.ipcRenderer.on(CHANNELS.mainError, (_event, error) => {
|
|
55
|
+
try {
|
|
56
|
+
errorListener?.(error);
|
|
57
|
+
} catch {
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
const bridge = {
|
|
61
|
+
version: 1,
|
|
62
|
+
appInfo: async () => {
|
|
63
|
+
try {
|
|
64
|
+
return await import_electron.ipcRenderer.invoke(CHANNELS.appInfo) ?? {};
|
|
65
|
+
} catch {
|
|
66
|
+
return {};
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
onFlushRequest: (flush) => {
|
|
70
|
+
flushHandler = flush;
|
|
71
|
+
},
|
|
72
|
+
onMainError: (listener) => {
|
|
73
|
+
errorListener = listener;
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
if (process.contextIsolated) {
|
|
77
|
+
import_electron.contextBridge.exposeInMainWorld(BRIDGE_KEY, bridge);
|
|
78
|
+
} else {
|
|
79
|
+
globalThis[BRIDGE_KEY] = bridge;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
83
|
+
0 && (module.exports = {
|
|
84
|
+
exposeAnyReplay
|
|
85
|
+
});
|
|
86
|
+
//# sourceMappingURL=preload.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/preload.ts","../src/bridge.ts"],"sourcesContent":["import { contextBridge, ipcRenderer } from 'electron';\nimport { BRIDGE_KEY, CHANNELS, type AnyReplayBridge, type AppInfo, type MainErrorMessage } from './bridge.js';\n\n/**\n * Exposes `window.anyreplayElectron` to the page. Call it once from your\n * preload script:\n *\n * ```ts\n * // preload.ts\n * import { exposeAnyReplay } from '@anyreplay/electron/preload';\n * exposeAnyReplay();\n * ```\n *\n * Works with `contextIsolation: true` and `sandbox: true` (Electron's\n * defaults) and needs no `nodeIntegration`: it uses only `contextBridge` and\n * `ipcRenderer`, the two modules a sandboxed preload has. A sandboxed preload\n * cannot `import` from `node_modules` at run time, so bundle it (Electron\n * Forge, electron-vite and electron-builder setups all do).\n *\n * With `contextIsolation: false` there is no bridge to cross; the API is put\n * on `window` directly.\n */\nexport function exposeAnyReplay(): void {\n let flushHandler: (() => Promise<void> | void) | null = null;\n let errorListener: ((error: MainErrorMessage) => void) | null = null;\n\n ipcRenderer.on(CHANNELS.flush, (_event, id: unknown) => {\n void (async () => {\n try {\n await flushHandler?.();\n } catch {\n /* a failed flush still has to be answered, or quitting waits for the timeout */\n }\n ipcRenderer.send(CHANNELS.flushed, id);\n })();\n });\n\n ipcRenderer.on(CHANNELS.mainError, (_event, error: MainErrorMessage) => {\n try {\n errorListener?.(error);\n } catch {\n /* never let the recorder break the window */\n }\n });\n\n const bridge: AnyReplayBridge = {\n version: 1,\n appInfo: async (): Promise<AppInfo> => {\n try {\n return ((await ipcRenderer.invoke(CHANNELS.appInfo)) ?? {}) as AppInfo;\n } catch {\n // No handler: `setupAnyReplay()` was not called in the main process.\n // The renderer falls back to the options it was given.\n return {};\n }\n },\n onFlushRequest: (flush) => { flushHandler = flush; },\n onMainError: (listener) => { errorListener = listener; },\n };\n\n if (process.contextIsolated) {\n contextBridge.exposeInMainWorld(BRIDGE_KEY, bridge);\n } else {\n (globalThis as unknown as Record<string, unknown>)[BRIDGE_KEY] = bridge;\n }\n}\n","/**\n * The contract between the three halves of the Electron SDK.\n *\n * The renderer records; the preload script is the only code that can talk to\n * the main process; the main process knows the app's id and version and sees\n * the app quit. They share nothing but these names, so each entry point can be\n * imported on its own without pulling in the others (or the recorder, which\n * has no business in the main process).\n */\n\n/** The global the preload script exposes through `contextBridge`. */\nexport const BRIDGE_KEY = 'anyreplayElectron';\n\n/** IPC channels. All of them, so a reviewer can see exactly what crosses. */\nexport const CHANNELS = {\n /** renderer → main (invoke): `AppInfo`. */\n appInfo: 'anyreplay:app-info',\n /** main → renderer: flush now, then answer on `flushed` with the same id. */\n flush: 'anyreplay:flush',\n /** renderer → main: a flush asked for by `flush` has finished. */\n flushed: 'anyreplay:flushed',\n /** main → renderer: an uncaught exception in the main process. */\n mainError: 'anyreplay:main-error',\n} as const;\n\n/** What the main process says about the app. */\nexport interface AppInfo {\n /** The app id (§2.2 of the SDK contract), already checked against the id pattern. Absent when none could be found. */\n appId?: string;\n /** `app.getVersion()`. */\n appVersion?: string;\n}\n\n/** An uncaught exception in the main process, as sent to a window. Raw: the renderer redacts it. */\nexport interface MainErrorMessage {\n name?: string;\n message: string;\n stack?: string;\n}\n\n/**\n * What the preload script exposes on `window.anyreplayElectron`.\n *\n * Deliberately narrow: three fixed channels, no generic `send` or `invoke`, so\n * exposing it gives page script no more reach into the main process than\n * asking for the app's version and answering a flush.\n */\nexport interface AnyReplayBridge {\n /** The bridge's own version, so a newer renderer can tell an older preload apart. */\n readonly version: 1;\n appInfo: () => Promise<AppInfo>;\n /** The renderer's flush; called when the main process is about to quit. Replaces any earlier one. */\n onFlushRequest: (flush: () => Promise<void> | void) => void;\n /** Called with each main-process error forwarded to this window. Replaces any earlier listener. */\n onMainError: (listener: (error: MainErrorMessage) => void) => void;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAA2C;;;ACWpC,IAAM,aAAa;AAGnB,IAAM,WAAW;AAAA;AAAA,EAEtB,SAAS;AAAA;AAAA,EAET,OAAO;AAAA;AAAA,EAEP,SAAS;AAAA;AAAA,EAET,WAAW;AACb;;;ADDO,SAAS,kBAAwB;AACtC,MAAI,eAAoD;AACxD,MAAI,gBAA4D;AAEhE,8BAAY,GAAG,SAAS,OAAO,CAAC,QAAQ,OAAgB;AACtD,UAAM,YAAY;AAChB,UAAI;AACF,cAAM,eAAe;AAAA,MACvB,QAAQ;AAAA,MAER;AACA,kCAAY,KAAK,SAAS,SAAS,EAAE;AAAA,IACvC,GAAG;AAAA,EACL,CAAC;AAED,8BAAY,GAAG,SAAS,WAAW,CAAC,QAAQ,UAA4B;AACtE,QAAI;AACF,sBAAgB,KAAK;AAAA,IACvB,QAAQ;AAAA,IAER;AAAA,EACF,CAAC;AAED,QAAM,SAA0B;AAAA,IAC9B,SAAS;AAAA,IACT,SAAS,YAA8B;AACrC,UAAI;AACF,eAAS,MAAM,4BAAY,OAAO,SAAS,OAAO,KAAM,CAAC;AAAA,MAC3D,QAAQ;AAGN,eAAO,CAAC;AAAA,MACV;AAAA,IACF;AAAA,IACA,gBAAgB,CAAC,UAAU;AAAE,qBAAe;AAAA,IAAO;AAAA,IACnD,aAAa,CAAC,aAAa;AAAE,sBAAgB;AAAA,IAAU;AAAA,EACzD;AAEA,MAAI,QAAQ,iBAAiB;AAC3B,kCAAc,kBAAkB,YAAY,MAAM;AAAA,EACpD,OAAO;AACL,IAAC,WAAkD,UAAU,IAAI;AAAA,EACnE;AACF;","names":[]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exposes `window.anyreplayElectron` to the page. Call it once from your
|
|
3
|
+
* preload script:
|
|
4
|
+
*
|
|
5
|
+
* ```ts
|
|
6
|
+
* // preload.ts
|
|
7
|
+
* import { exposeAnyReplay } from '@anyreplay/electron/preload';
|
|
8
|
+
* exposeAnyReplay();
|
|
9
|
+
* ```
|
|
10
|
+
*
|
|
11
|
+
* Works with `contextIsolation: true` and `sandbox: true` (Electron's
|
|
12
|
+
* defaults) and needs no `nodeIntegration`: it uses only `contextBridge` and
|
|
13
|
+
* `ipcRenderer`, the two modules a sandboxed preload has. A sandboxed preload
|
|
14
|
+
* cannot `import` from `node_modules` at run time, so bundle it (Electron
|
|
15
|
+
* Forge, electron-vite and electron-builder setups all do).
|
|
16
|
+
*
|
|
17
|
+
* With `contextIsolation: false` there is no bridge to cross; the API is put
|
|
18
|
+
* on `window` directly.
|
|
19
|
+
*/
|
|
20
|
+
declare function exposeAnyReplay(): void;
|
|
21
|
+
|
|
22
|
+
export { exposeAnyReplay };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exposes `window.anyreplayElectron` to the page. Call it once from your
|
|
3
|
+
* preload script:
|
|
4
|
+
*
|
|
5
|
+
* ```ts
|
|
6
|
+
* // preload.ts
|
|
7
|
+
* import { exposeAnyReplay } from '@anyreplay/electron/preload';
|
|
8
|
+
* exposeAnyReplay();
|
|
9
|
+
* ```
|
|
10
|
+
*
|
|
11
|
+
* Works with `contextIsolation: true` and `sandbox: true` (Electron's
|
|
12
|
+
* defaults) and needs no `nodeIntegration`: it uses only `contextBridge` and
|
|
13
|
+
* `ipcRenderer`, the two modules a sandboxed preload has. A sandboxed preload
|
|
14
|
+
* cannot `import` from `node_modules` at run time, so bundle it (Electron
|
|
15
|
+
* Forge, electron-vite and electron-builder setups all do).
|
|
16
|
+
*
|
|
17
|
+
* With `contextIsolation: false` there is no bridge to cross; the API is put
|
|
18
|
+
* on `window` directly.
|
|
19
|
+
*/
|
|
20
|
+
declare function exposeAnyReplay(): void;
|
|
21
|
+
|
|
22
|
+
export { exposeAnyReplay };
|
package/dist/preload.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import {
|
|
2
|
+
BRIDGE_KEY,
|
|
3
|
+
CHANNELS
|
|
4
|
+
} from "./chunk-5TQ2HVGX.js";
|
|
5
|
+
|
|
6
|
+
// src/preload.ts
|
|
7
|
+
import { contextBridge, ipcRenderer } from "electron";
|
|
8
|
+
function exposeAnyReplay() {
|
|
9
|
+
let flushHandler = null;
|
|
10
|
+
let errorListener = null;
|
|
11
|
+
ipcRenderer.on(CHANNELS.flush, (_event, id) => {
|
|
12
|
+
void (async () => {
|
|
13
|
+
try {
|
|
14
|
+
await flushHandler?.();
|
|
15
|
+
} catch {
|
|
16
|
+
}
|
|
17
|
+
ipcRenderer.send(CHANNELS.flushed, id);
|
|
18
|
+
})();
|
|
19
|
+
});
|
|
20
|
+
ipcRenderer.on(CHANNELS.mainError, (_event, error) => {
|
|
21
|
+
try {
|
|
22
|
+
errorListener?.(error);
|
|
23
|
+
} catch {
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
const bridge = {
|
|
27
|
+
version: 1,
|
|
28
|
+
appInfo: async () => {
|
|
29
|
+
try {
|
|
30
|
+
return await ipcRenderer.invoke(CHANNELS.appInfo) ?? {};
|
|
31
|
+
} catch {
|
|
32
|
+
return {};
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
onFlushRequest: (flush) => {
|
|
36
|
+
flushHandler = flush;
|
|
37
|
+
},
|
|
38
|
+
onMainError: (listener) => {
|
|
39
|
+
errorListener = listener;
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
if (process.contextIsolated) {
|
|
43
|
+
contextBridge.exposeInMainWorld(BRIDGE_KEY, bridge);
|
|
44
|
+
} else {
|
|
45
|
+
globalThis[BRIDGE_KEY] = bridge;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export {
|
|
49
|
+
exposeAnyReplay
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=preload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/preload.ts"],"sourcesContent":["import { contextBridge, ipcRenderer } from 'electron';\nimport { BRIDGE_KEY, CHANNELS, type AnyReplayBridge, type AppInfo, type MainErrorMessage } from './bridge.js';\n\n/**\n * Exposes `window.anyreplayElectron` to the page. Call it once from your\n * preload script:\n *\n * ```ts\n * // preload.ts\n * import { exposeAnyReplay } from '@anyreplay/electron/preload';\n * exposeAnyReplay();\n * ```\n *\n * Works with `contextIsolation: true` and `sandbox: true` (Electron's\n * defaults) and needs no `nodeIntegration`: it uses only `contextBridge` and\n * `ipcRenderer`, the two modules a sandboxed preload has. A sandboxed preload\n * cannot `import` from `node_modules` at run time, so bundle it (Electron\n * Forge, electron-vite and electron-builder setups all do).\n *\n * With `contextIsolation: false` there is no bridge to cross; the API is put\n * on `window` directly.\n */\nexport function exposeAnyReplay(): void {\n let flushHandler: (() => Promise<void> | void) | null = null;\n let errorListener: ((error: MainErrorMessage) => void) | null = null;\n\n ipcRenderer.on(CHANNELS.flush, (_event, id: unknown) => {\n void (async () => {\n try {\n await flushHandler?.();\n } catch {\n /* a failed flush still has to be answered, or quitting waits for the timeout */\n }\n ipcRenderer.send(CHANNELS.flushed, id);\n })();\n });\n\n ipcRenderer.on(CHANNELS.mainError, (_event, error: MainErrorMessage) => {\n try {\n errorListener?.(error);\n } catch {\n /* never let the recorder break the window */\n }\n });\n\n const bridge: AnyReplayBridge = {\n version: 1,\n appInfo: async (): Promise<AppInfo> => {\n try {\n return ((await ipcRenderer.invoke(CHANNELS.appInfo)) ?? {}) as AppInfo;\n } catch {\n // No handler: `setupAnyReplay()` was not called in the main process.\n // The renderer falls back to the options it was given.\n return {};\n }\n },\n onFlushRequest: (flush) => { flushHandler = flush; },\n onMainError: (listener) => { errorListener = listener; },\n };\n\n if (process.contextIsolated) {\n contextBridge.exposeInMainWorld(BRIDGE_KEY, bridge);\n } else {\n (globalThis as unknown as Record<string, unknown>)[BRIDGE_KEY] = bridge;\n }\n}\n"],"mappings":";;;;;;AAAA,SAAS,eAAe,mBAAmB;AAsBpC,SAAS,kBAAwB;AACtC,MAAI,eAAoD;AACxD,MAAI,gBAA4D;AAEhE,cAAY,GAAG,SAAS,OAAO,CAAC,QAAQ,OAAgB;AACtD,UAAM,YAAY;AAChB,UAAI;AACF,cAAM,eAAe;AAAA,MACvB,QAAQ;AAAA,MAER;AACA,kBAAY,KAAK,SAAS,SAAS,EAAE;AAAA,IACvC,GAAG;AAAA,EACL,CAAC;AAED,cAAY,GAAG,SAAS,WAAW,CAAC,QAAQ,UAA4B;AACtE,QAAI;AACF,sBAAgB,KAAK;AAAA,IACvB,QAAQ;AAAA,IAER;AAAA,EACF,CAAC;AAED,QAAM,SAA0B;AAAA,IAC9B,SAAS;AAAA,IACT,SAAS,YAA8B;AACrC,UAAI;AACF,eAAS,MAAM,YAAY,OAAO,SAAS,OAAO,KAAM,CAAC;AAAA,MAC3D,QAAQ;AAGN,eAAO,CAAC;AAAA,MACV;AAAA,IACF;AAAA,IACA,gBAAgB,CAAC,UAAU;AAAE,qBAAe;AAAA,IAAO;AAAA,IACnD,aAAa,CAAC,aAAa;AAAE,sBAAgB;AAAA,IAAU;AAAA,EACzD;AAEA,MAAI,QAAQ,iBAAiB;AAC3B,kBAAc,kBAAkB,YAAY,MAAM;AAAA,EACpD,OAAO;AACL,IAAC,WAAkD,UAAU,IAAI;AAAA,EACnE;AACF;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,77 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@anyreplay/electron",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.2.1",
|
|
4
|
+
"description": "Session replay for Electron apps: records each window with the AnyReplay browser SDK, reports the app's id and version, and flushes before the app quits.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"homepage": "https://anyreplay.com",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/baemtech/anyreplay-sdk.git",
|
|
10
|
+
"directory": "electron"
|
|
11
|
+
},
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/baemtech/anyreplay-sdk/issues"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"session-replay",
|
|
17
|
+
"session-recording",
|
|
18
|
+
"electron",
|
|
19
|
+
"desktop",
|
|
20
|
+
"anyreplay"
|
|
21
|
+
],
|
|
22
|
+
"type": "module",
|
|
23
|
+
"main": "./dist/index.cjs",
|
|
24
|
+
"module": "./dist/index.js",
|
|
25
|
+
"types": "./dist/index.d.ts",
|
|
26
|
+
"exports": {
|
|
27
|
+
".": {
|
|
28
|
+
"types": "./dist/index.d.ts",
|
|
29
|
+
"import": "./dist/index.js",
|
|
30
|
+
"require": "./dist/index.cjs"
|
|
31
|
+
},
|
|
32
|
+
"./preload": {
|
|
33
|
+
"types": "./dist/preload.d.ts",
|
|
34
|
+
"import": "./dist/preload.js",
|
|
35
|
+
"require": "./dist/preload.cjs"
|
|
36
|
+
},
|
|
37
|
+
"./main": {
|
|
38
|
+
"types": "./dist/main.d.ts",
|
|
39
|
+
"import": "./dist/main.js",
|
|
40
|
+
"require": "./dist/main.cjs"
|
|
41
|
+
},
|
|
42
|
+
"./package.json": "./package.json"
|
|
43
|
+
},
|
|
44
|
+
"files": [
|
|
45
|
+
"dist",
|
|
46
|
+
"README.md",
|
|
47
|
+
"LICENSE"
|
|
48
|
+
],
|
|
49
|
+
"sideEffects": false,
|
|
50
|
+
"publishConfig": {
|
|
51
|
+
"access": "public"
|
|
52
|
+
},
|
|
53
|
+
"dependencies": {
|
|
54
|
+
"@anyreplay/browser": "^0.2.1"
|
|
55
|
+
},
|
|
56
|
+
"peerDependencies": {
|
|
57
|
+
"electron": ">=28"
|
|
58
|
+
},
|
|
59
|
+
"peerDependenciesMeta": {
|
|
60
|
+
"electron": {
|
|
61
|
+
"optional": true
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
"devDependencies": {
|
|
65
|
+
"electron": "38.8.6",
|
|
66
|
+
"jsdom": "25.0.1",
|
|
67
|
+
"tsup": "8.3.5",
|
|
68
|
+
"typescript": "5.8.3",
|
|
69
|
+
"vitest": "2.1.8",
|
|
70
|
+
"@anyreplay/shared": "0.1.0"
|
|
71
|
+
},
|
|
72
|
+
"scripts": {
|
|
73
|
+
"build": "tsup",
|
|
74
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
75
|
+
"test": "vitest run"
|
|
76
|
+
}
|
|
6
77
|
}
|