tinker-electron-debug 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.
- package/README.md +26 -0
- package/dist/preload/index.mjs +379 -0
- package/dist/renderer/assets/app-D7MQ0-qv.js +167 -0
- package/dist/renderer/assets/app-LcvhA8qm.css +32 -0
- package/dist/renderer/index.html +12 -0
- package/icon.png +0 -0
- package/package.json +52 -0
package/README.md
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# tinker-electron-debug
|
|
2
|
+
|
|
3
|
+
An Electron app debugger plugin for [TINKER](https://github.com/liriliri/tinker), enabling remote debugging of in-production Electron applications.
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
## Features
|
|
8
|
+
|
|
9
|
+
- **Auto-detect** Electron apps installed on the system
|
|
10
|
+
- **Launch & attach** debugger with a single click
|
|
11
|
+
- **Inspect pages** — view Node.js and renderer process targets
|
|
12
|
+
- **DevTools integration** — open Chrome DevTools for any target
|
|
13
|
+
- **Live log output** — stream stdout/stderr in a built-in terminal
|
|
14
|
+
- **Multi-session** support for debugging multiple apps simultaneously
|
|
15
|
+
|
|
16
|
+
## Installation
|
|
17
|
+
|
|
18
|
+
Download and install TINKER from `https://tinker.liriliri.io/`, then run `npm i -g tinker-electron-debug`.
|
|
19
|
+
|
|
20
|
+
## Usage
|
|
21
|
+
|
|
22
|
+
1. Select an Electron app from the app grid
|
|
23
|
+
2. The app launches with debugging ports enabled
|
|
24
|
+
3. Inspect Node.js or renderer process targets in the page list
|
|
25
|
+
4. Click **Inspect** to open Chrome DevTools for a target
|
|
26
|
+
5. View live log output in the terminal below
|
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
import { contextBridge as K } from "electron";
|
|
2
|
+
import l from "fs";
|
|
3
|
+
import x from "path";
|
|
4
|
+
import h from "process";
|
|
5
|
+
import { spawn as $ } from "child_process";
|
|
6
|
+
import H from "got";
|
|
7
|
+
import rr from "net";
|
|
8
|
+
import tr from "ws";
|
|
9
|
+
function er(t) {
|
|
10
|
+
return t && t.__esModule && Object.prototype.hasOwnProperty.call(t, "default") ? t.default : t;
|
|
11
|
+
}
|
|
12
|
+
var y = { exports: {} }, E = { exports: {} }, A = { exports: {} }, S = { exports: {} }, b = { exports: {} };
|
|
13
|
+
(function(t, r) {
|
|
14
|
+
var s = Object.prototype.toString;
|
|
15
|
+
r = function(o) {
|
|
16
|
+
return s.call(o);
|
|
17
|
+
}, t.exports = r;
|
|
18
|
+
})(b, b.exports);
|
|
19
|
+
var m = b.exports;
|
|
20
|
+
(function(t, r) {
|
|
21
|
+
var s = m;
|
|
22
|
+
r = function(o) {
|
|
23
|
+
return s(o) === "[object Number]";
|
|
24
|
+
}, t.exports = r;
|
|
25
|
+
})(S, S.exports);
|
|
26
|
+
var nr = S.exports, O = { exports: {} };
|
|
27
|
+
(function(t, r) {
|
|
28
|
+
var s = m;
|
|
29
|
+
r = function(o) {
|
|
30
|
+
var i = s(o);
|
|
31
|
+
return i === "[object Function]" || i === "[object GeneratorFunction]" || i === "[object AsyncFunction]";
|
|
32
|
+
}, t.exports = r;
|
|
33
|
+
})(O, O.exports);
|
|
34
|
+
var V = O.exports;
|
|
35
|
+
(function(t, r) {
|
|
36
|
+
var s = nr, o = V, i = Math.pow(2, 53) - 1;
|
|
37
|
+
r = function(e) {
|
|
38
|
+
if (!e) return !1;
|
|
39
|
+
var n = e.length;
|
|
40
|
+
return s(n) && n >= 0 && n <= i && !o(e);
|
|
41
|
+
}, t.exports = r;
|
|
42
|
+
})(A, A.exports);
|
|
43
|
+
var J = A.exports, k = { exports: {} }, j = { exports: {} }, D = { exports: {} };
|
|
44
|
+
(function(t, r) {
|
|
45
|
+
r = function(s) {
|
|
46
|
+
var o = typeof s;
|
|
47
|
+
return !!s && (o === "function" || o === "object");
|
|
48
|
+
}, t.exports = r;
|
|
49
|
+
})(D, D.exports);
|
|
50
|
+
var or = D.exports, P = { exports: {} };
|
|
51
|
+
(function(t, r) {
|
|
52
|
+
var s = m;
|
|
53
|
+
Array.isArray ? r = Array.isArray : r = function(o) {
|
|
54
|
+
return s(o) === "[object Array]";
|
|
55
|
+
}, t.exports = r;
|
|
56
|
+
})(P, P.exports);
|
|
57
|
+
var w = P.exports, C = { exports: {} }, M = { exports: {} };
|
|
58
|
+
(function(t, r) {
|
|
59
|
+
r = function(s) {
|
|
60
|
+
return s === void 0;
|
|
61
|
+
}, t.exports = r;
|
|
62
|
+
})(M, M.exports);
|
|
63
|
+
var I = M.exports;
|
|
64
|
+
(function(t, r) {
|
|
65
|
+
var s = I;
|
|
66
|
+
r = function(o, i, e) {
|
|
67
|
+
if (s(i)) return o;
|
|
68
|
+
switch (e ?? 3) {
|
|
69
|
+
case 1:
|
|
70
|
+
return function(n) {
|
|
71
|
+
return o.call(i, n);
|
|
72
|
+
};
|
|
73
|
+
case 3:
|
|
74
|
+
return function(n, c, a) {
|
|
75
|
+
return o.call(i, n, c, a);
|
|
76
|
+
};
|
|
77
|
+
case 4:
|
|
78
|
+
return function(n, c, a, u) {
|
|
79
|
+
return o.call(i, n, c, a, u);
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
return function() {
|
|
83
|
+
return o.apply(i, arguments);
|
|
84
|
+
};
|
|
85
|
+
}, t.exports = r;
|
|
86
|
+
})(C, C.exports);
|
|
87
|
+
var Y = C.exports, F = { exports: {} }, N = { exports: {} }, T = { exports: {} }, U = { exports: {} };
|
|
88
|
+
(function(t, r) {
|
|
89
|
+
var s = Object.prototype.hasOwnProperty;
|
|
90
|
+
r = function(o, i) {
|
|
91
|
+
return s.call(o, i);
|
|
92
|
+
}, t.exports = r;
|
|
93
|
+
})(U, U.exports);
|
|
94
|
+
var Z = U.exports;
|
|
95
|
+
(function(t, r) {
|
|
96
|
+
var s = Z;
|
|
97
|
+
Object.keys ? r = Object.keys : r = function(o) {
|
|
98
|
+
var i = [];
|
|
99
|
+
for (var e in o)
|
|
100
|
+
s(o, e) && i.push(e);
|
|
101
|
+
return i;
|
|
102
|
+
}, t.exports = r;
|
|
103
|
+
})(T, T.exports);
|
|
104
|
+
var g = T.exports, L = { exports: {} }, W = { exports: {} };
|
|
105
|
+
(function(t, r) {
|
|
106
|
+
var s = J, o = g, i = Y;
|
|
107
|
+
r = function(e, n, c) {
|
|
108
|
+
n = i(n, c);
|
|
109
|
+
var a, u;
|
|
110
|
+
if (s(e))
|
|
111
|
+
for (a = 0, u = e.length; a < u; a++) n(e[a], a, e);
|
|
112
|
+
else {
|
|
113
|
+
var p = o(e);
|
|
114
|
+
for (a = 0, u = p.length; a < u; a++)
|
|
115
|
+
n(e[p[a]], p[a], e);
|
|
116
|
+
}
|
|
117
|
+
return e;
|
|
118
|
+
}, t.exports = r;
|
|
119
|
+
})(W, W.exports);
|
|
120
|
+
var sr = W.exports;
|
|
121
|
+
(function(t, r) {
|
|
122
|
+
var s = I, o = sr;
|
|
123
|
+
r = function(i, e) {
|
|
124
|
+
return function(n) {
|
|
125
|
+
return o(arguments, function(c, a) {
|
|
126
|
+
if (a !== 0) {
|
|
127
|
+
var u = i(c);
|
|
128
|
+
o(u, function(p) {
|
|
129
|
+
(!e || s(n[p])) && (n[p] = c[p]);
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}), n;
|
|
133
|
+
};
|
|
134
|
+
}, t.exports = r;
|
|
135
|
+
})(L, L.exports);
|
|
136
|
+
var ir = L.exports;
|
|
137
|
+
(function(t, r) {
|
|
138
|
+
var s = g, o = ir;
|
|
139
|
+
r = o(s), t.exports = r;
|
|
140
|
+
})(N, N.exports);
|
|
141
|
+
var ar = N.exports, _ = { exports: {} };
|
|
142
|
+
(function(t, r) {
|
|
143
|
+
var s = g;
|
|
144
|
+
r = function(o, i) {
|
|
145
|
+
var e = s(i), n = e.length;
|
|
146
|
+
if (o == null) return !n;
|
|
147
|
+
o = Object(o);
|
|
148
|
+
for (var c = 0; c < n; c++) {
|
|
149
|
+
var a = e[c];
|
|
150
|
+
if (i[a] !== o[a] || !(a in o)) return !1;
|
|
151
|
+
}
|
|
152
|
+
return !0;
|
|
153
|
+
}, t.exports = r;
|
|
154
|
+
})(_, _.exports);
|
|
155
|
+
var cr = _.exports;
|
|
156
|
+
(function(t, r) {
|
|
157
|
+
var s = ar, o = cr;
|
|
158
|
+
r = function(i) {
|
|
159
|
+
return i = s({}, i), function(e) {
|
|
160
|
+
return o(e, i);
|
|
161
|
+
};
|
|
162
|
+
}, t.exports = r;
|
|
163
|
+
})(F, F.exports);
|
|
164
|
+
var ur = F.exports, q = { exports: {} };
|
|
165
|
+
(function(t, r) {
|
|
166
|
+
r = function(s) {
|
|
167
|
+
return s;
|
|
168
|
+
}, t.exports = r;
|
|
169
|
+
})(q, q.exports);
|
|
170
|
+
var pr = q.exports, z = { exports: {} }, G = { exports: {} }, R = { exports: {} };
|
|
171
|
+
(function(t, r) {
|
|
172
|
+
var s = Z, o = w;
|
|
173
|
+
r = function(n, c) {
|
|
174
|
+
if (o(n)) return n;
|
|
175
|
+
if (c && s(c, n)) return [n];
|
|
176
|
+
var a = [];
|
|
177
|
+
return n.replace(i, function(u, p, f, v) {
|
|
178
|
+
a.push(f ? v.replace(e, "$1") : p || u);
|
|
179
|
+
}), a;
|
|
180
|
+
};
|
|
181
|
+
var i = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g, e = /\\(\\)?/g;
|
|
182
|
+
t.exports = r;
|
|
183
|
+
})(R, R.exports);
|
|
184
|
+
var fr = R.exports;
|
|
185
|
+
(function(t, r) {
|
|
186
|
+
var s = I, o = fr;
|
|
187
|
+
r = function(i, e) {
|
|
188
|
+
e = o(e, i);
|
|
189
|
+
var n;
|
|
190
|
+
for (n = e.shift(); !s(n); ) {
|
|
191
|
+
if (i = i[n], i == null) return;
|
|
192
|
+
n = e.shift();
|
|
193
|
+
}
|
|
194
|
+
return i;
|
|
195
|
+
}, t.exports = r;
|
|
196
|
+
})(G, G.exports);
|
|
197
|
+
var vr = G.exports;
|
|
198
|
+
(function(t, r) {
|
|
199
|
+
var s = w, o = vr;
|
|
200
|
+
r = function(e) {
|
|
201
|
+
return s(e) ? function(n) {
|
|
202
|
+
return o(n, e);
|
|
203
|
+
} : i(e);
|
|
204
|
+
};
|
|
205
|
+
function i(e) {
|
|
206
|
+
return function(n) {
|
|
207
|
+
return n == null ? void 0 : n[e];
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
t.exports = r;
|
|
211
|
+
})(z, z.exports);
|
|
212
|
+
var xr = z.exports;
|
|
213
|
+
(function(t, r) {
|
|
214
|
+
var s = V, o = or, i = w, e = Y, n = ur, c = pr, a = xr;
|
|
215
|
+
r = function(u, p, f) {
|
|
216
|
+
return u == null ? c : s(u) ? e(u, p, f) : o(u) && !i(u) ? n(u) : a(u);
|
|
217
|
+
}, t.exports = r;
|
|
218
|
+
})(j, j.exports);
|
|
219
|
+
var lr = j.exports;
|
|
220
|
+
(function(t, r) {
|
|
221
|
+
var s = lr, o = g, i = J;
|
|
222
|
+
r = function(e, n, c) {
|
|
223
|
+
n = s(n, c);
|
|
224
|
+
for (var a = !i(e) && o(e), u = (a || e).length, p = Array(u), f = 0; f < u; f++) {
|
|
225
|
+
var v = a ? a[f] : f;
|
|
226
|
+
p[f] = n(e[v], v, e);
|
|
227
|
+
}
|
|
228
|
+
return p;
|
|
229
|
+
}, t.exports = r;
|
|
230
|
+
})(k, k.exports);
|
|
231
|
+
var dr = k.exports, B = { exports: {} };
|
|
232
|
+
(function(t, r) {
|
|
233
|
+
var s = m;
|
|
234
|
+
r = function(o) {
|
|
235
|
+
return s(o) === "[object String]";
|
|
236
|
+
}, t.exports = r;
|
|
237
|
+
})(B, B.exports);
|
|
238
|
+
var mr = B.exports;
|
|
239
|
+
(function(t, r) {
|
|
240
|
+
var s = J, o = dr, i = w, e = mr;
|
|
241
|
+
r = function(n) {
|
|
242
|
+
return n ? i(n) ? n : s(n) && !e(n) ? o(n) : [n] : [];
|
|
243
|
+
}, t.exports = r;
|
|
244
|
+
})(E, E.exports);
|
|
245
|
+
var wr = E.exports;
|
|
246
|
+
(function(t, r) {
|
|
247
|
+
const s = wr, o = rr;
|
|
248
|
+
r = function(e, n) {
|
|
249
|
+
return e = s(e), e.push(0), e.reduce((c, a) => c.catch(() => i(a, n)), Promise.reject());
|
|
250
|
+
};
|
|
251
|
+
function i(e, n) {
|
|
252
|
+
return new Promise((c, a) => {
|
|
253
|
+
const u = o.createServer();
|
|
254
|
+
u.unref(), u.on("error", a);
|
|
255
|
+
const p = {};
|
|
256
|
+
p.port = e, n && (p.host = n), u.listen(p, () => {
|
|
257
|
+
const { port: f } = u.address();
|
|
258
|
+
u.close(() => {
|
|
259
|
+
c(f);
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
t.exports = r;
|
|
265
|
+
})(y, y.exports);
|
|
266
|
+
var gr = y.exports;
|
|
267
|
+
const Q = /* @__PURE__ */ er(gr);
|
|
268
|
+
function hr(t) {
|
|
269
|
+
return l.existsSync(
|
|
270
|
+
x.join(t, "Contents/Frameworks/Electron Framework.framework")
|
|
271
|
+
);
|
|
272
|
+
}
|
|
273
|
+
function yr(t) {
|
|
274
|
+
const r = x.dirname(t), s = x.join(r, "resources");
|
|
275
|
+
return l.existsSync(s) ? [
|
|
276
|
+
"electron.asar",
|
|
277
|
+
"default_app.asar",
|
|
278
|
+
"app.asar",
|
|
279
|
+
"app.asar.unpacked"
|
|
280
|
+
].some((o) => l.existsSync(x.join(s, o))) : !1;
|
|
281
|
+
}
|
|
282
|
+
function Er(t) {
|
|
283
|
+
return l.existsSync(x.join(t, "../resources/electron.asar")) || l.existsSync(x.join(t, "../LICENSE.electron.txt")) || l.existsSync(x.join(t, "../chrome-sandbox"));
|
|
284
|
+
}
|
|
285
|
+
const d = /* @__PURE__ */ new Map();
|
|
286
|
+
function Ar(t, r, s) {
|
|
287
|
+
return new Promise((o, i) => {
|
|
288
|
+
const e = new tr(t, {
|
|
289
|
+
headers: { Origin: "devtools://devtools" }
|
|
290
|
+
});
|
|
291
|
+
e.on("open", () => {
|
|
292
|
+
e.send(JSON.stringify({ id: 1, method: r, params: s }));
|
|
293
|
+
}), e.on("message", (n) => {
|
|
294
|
+
try {
|
|
295
|
+
const c = JSON.parse(n.toString());
|
|
296
|
+
c.id === 1 && (e.close(), o(c));
|
|
297
|
+
} catch {
|
|
298
|
+
}
|
|
299
|
+
}), e.on("error", i), setTimeout(() => {
|
|
300
|
+
e.terminate(), i(new Error("timeout"));
|
|
301
|
+
}, 5e3);
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
const Sr = {
|
|
305
|
+
isElectronApp: (t) => {
|
|
306
|
+
const r = h.platform;
|
|
307
|
+
return r === "darwin" ? hr(t) : r === "win32" ? yr(t) : Er(t);
|
|
308
|
+
},
|
|
309
|
+
launchApp: async (t, r, s, o) => {
|
|
310
|
+
var p, f;
|
|
311
|
+
const [i, e] = await Promise.all([
|
|
312
|
+
Q(0, "127.0.0.1"),
|
|
313
|
+
Q(0, "127.0.0.1")
|
|
314
|
+
]);
|
|
315
|
+
let n = r;
|
|
316
|
+
if (h.platform === "darwin") {
|
|
317
|
+
const v = x.join(r, "Contents/MacOS");
|
|
318
|
+
if (l.existsSync(v)) {
|
|
319
|
+
const X = l.readdirSync(v);
|
|
320
|
+
X[0] && (n = x.join(v, X[0]));
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
const c = h.platform === "win32" ? x.dirname(n) : "/", a = $(
|
|
324
|
+
n,
|
|
325
|
+
[
|
|
326
|
+
`--inspect=${i}`,
|
|
327
|
+
`--remote-debugging-port=${e}`,
|
|
328
|
+
"--remote-allow-origins=devtools://devtools"
|
|
329
|
+
],
|
|
330
|
+
{ cwd: c }
|
|
331
|
+
), u = (v) => s(v.toString());
|
|
332
|
+
return (p = a.stdout) == null || p.on("data", u), (f = a.stderr) == null || f.on("data", u), a.on("close", () => {
|
|
333
|
+
d.delete(t), o();
|
|
334
|
+
}), d.set(t, { nodePort: i, windowPort: e, kill: () => a.kill() }), { nodePort: i, windowPort: e };
|
|
335
|
+
},
|
|
336
|
+
stopApp: (t) => {
|
|
337
|
+
var r;
|
|
338
|
+
(r = d.get(t)) == null || r.kill(), d.delete(t);
|
|
339
|
+
},
|
|
340
|
+
getPages: async (t) => {
|
|
341
|
+
try {
|
|
342
|
+
return await H(`http://127.0.0.1:${t}/json`, {
|
|
343
|
+
timeout: { request: 2e3 }
|
|
344
|
+
}).json();
|
|
345
|
+
} catch {
|
|
346
|
+
return [];
|
|
347
|
+
}
|
|
348
|
+
},
|
|
349
|
+
openDevTools: async (t, r) => {
|
|
350
|
+
var c;
|
|
351
|
+
const o = (await H(
|
|
352
|
+
`http://127.0.0.1:${t}/json`,
|
|
353
|
+
{ timeout: { request: 2e3 } }
|
|
354
|
+
).json())[0];
|
|
355
|
+
if (!(o != null && o.webSocketDebuggerUrl))
|
|
356
|
+
throw new Error("No node target found");
|
|
357
|
+
const i = r.replace(/^\/devtools/, "devtools://devtools/bundled").replace(/^chrome-devtools:\/\//, "devtools://"), e = `
|
|
358
|
+
(function() {
|
|
359
|
+
const { BrowserWindow } = process.mainModule.require('electron');
|
|
360
|
+
const win = new BrowserWindow({
|
|
361
|
+
width: 1280,
|
|
362
|
+
height: 800,
|
|
363
|
+
webPreferences: { nodeIntegration: false }
|
|
364
|
+
});
|
|
365
|
+
win.loadURL(${JSON.stringify(i)});
|
|
366
|
+
win.show();
|
|
367
|
+
})()
|
|
368
|
+
`, n = await Ar(
|
|
369
|
+
o.webSocketDebuggerUrl,
|
|
370
|
+
"Runtime.evaluate",
|
|
371
|
+
{ expression: e, awaitPromise: !1 }
|
|
372
|
+
);
|
|
373
|
+
if (n != null && n.exceptionDetails)
|
|
374
|
+
throw new Error(
|
|
375
|
+
((c = n.exceptionDetails.exception) == null ? void 0 : c.description) || n.exceptionDetails.text
|
|
376
|
+
);
|
|
377
|
+
}
|
|
378
|
+
};
|
|
379
|
+
K.exposeInMainWorld("electronDebug", Sr);
|