what-devtools 0.5.5 → 0.6.2
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 +1 -1
- package/dist/index.js +348 -0
- package/dist/index.js.map +7 -0
- package/dist/index.min.js +2 -0
- package/dist/index.min.js.map +7 -0
- package/dist/panel.js +476 -0
- package/dist/panel.js.map +7 -0
- package/dist/panel.min.js +2 -0
- package/dist/panel.min.js.map +7 -0
- package/index.d.ts +22 -0
- package/package.json +21 -9
- package/panel.d.ts +2 -0
- package/src/DevPanel.jsx +138 -124
- package/src/index.js +72 -9
package/README.md
CHANGED
package/dist/index.js
ADDED
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
// packages/devtools/src/index.js
|
|
2
|
+
var installed = false;
|
|
3
|
+
var signalId = 0;
|
|
4
|
+
var effectId = 0;
|
|
5
|
+
var componentId = 0;
|
|
6
|
+
var signals = /* @__PURE__ */ new Map();
|
|
7
|
+
var effects = /* @__PURE__ */ new Map();
|
|
8
|
+
var components = /* @__PURE__ */ new Map();
|
|
9
|
+
var subsToSignalId = /* @__PURE__ */ new WeakMap();
|
|
10
|
+
var errors = [];
|
|
11
|
+
var MAX_ERRORS = 100;
|
|
12
|
+
var hydrationMismatches = [];
|
|
13
|
+
var MAX_HYDRATION_MISMATCHES = 50;
|
|
14
|
+
var listeners = /* @__PURE__ */ new Set();
|
|
15
|
+
function emit(event, data) {
|
|
16
|
+
for (const fn of listeners) {
|
|
17
|
+
try {
|
|
18
|
+
fn(event, data);
|
|
19
|
+
} catch {
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function safeSerialize(value, depth = 0, seen) {
|
|
24
|
+
if (depth > 6) return "[max depth]";
|
|
25
|
+
if (value === null || value === void 0) return value;
|
|
26
|
+
const type = typeof value;
|
|
27
|
+
if (type === "string" || type === "number" || type === "boolean") return value;
|
|
28
|
+
if (type === "function") return `[Function: ${value.name || "anonymous"}]`;
|
|
29
|
+
if (type === "symbol") return `[Symbol: ${value.description || ""}]`;
|
|
30
|
+
if (type === "bigint") return value.toString() + "n";
|
|
31
|
+
if (typeof Node !== "undefined" && value instanceof Node) {
|
|
32
|
+
const tag = value.nodeName?.toLowerCase() || "node";
|
|
33
|
+
const id = value.id ? `#${value.id}` : "";
|
|
34
|
+
const cls = value.className ? `.${String(value.className).split(" ")[0]}` : "";
|
|
35
|
+
return `[DOM: <${tag}${id}${cls}>]`;
|
|
36
|
+
}
|
|
37
|
+
if (!seen) seen = /* @__PURE__ */ new Set();
|
|
38
|
+
if (seen.has(value)) return "[Circular]";
|
|
39
|
+
seen.add(value);
|
|
40
|
+
if (value instanceof Map) {
|
|
41
|
+
if (value.size > 50) return `[Map: ${value.size} entries]`;
|
|
42
|
+
const obj = {};
|
|
43
|
+
for (const [k, v] of value) {
|
|
44
|
+
obj[String(k)] = safeSerialize(v, depth + 1, seen);
|
|
45
|
+
}
|
|
46
|
+
return { __type: "Map", entries: obj };
|
|
47
|
+
}
|
|
48
|
+
if (value instanceof Set) {
|
|
49
|
+
if (value.size > 50) return `[Set: ${value.size} items]`;
|
|
50
|
+
return { __type: "Set", values: [...value].map((v) => safeSerialize(v, depth + 1, seen)) };
|
|
51
|
+
}
|
|
52
|
+
if (Array.isArray(value)) {
|
|
53
|
+
if (value.length > 100) {
|
|
54
|
+
return [...value.slice(0, 100).map((v) => safeSerialize(v, depth + 1, seen)), `... (${value.length} total)`];
|
|
55
|
+
}
|
|
56
|
+
return value.map((v) => safeSerialize(v, depth + 1, seen));
|
|
57
|
+
}
|
|
58
|
+
if (value instanceof Error) {
|
|
59
|
+
return { __type: "Error", name: value.name, message: value.message, stack: value.stack };
|
|
60
|
+
}
|
|
61
|
+
if (value instanceof Date) return { __type: "Date", iso: value.toISOString() };
|
|
62
|
+
if (value instanceof RegExp) return value.toString();
|
|
63
|
+
if (type === "object") {
|
|
64
|
+
const keys = Object.keys(value);
|
|
65
|
+
if (keys.length > 100) {
|
|
66
|
+
const obj2 = {};
|
|
67
|
+
for (const k of keys.slice(0, 100)) {
|
|
68
|
+
obj2[k] = safeSerialize(value[k], depth + 1, seen);
|
|
69
|
+
}
|
|
70
|
+
obj2["..."] = `(${keys.length} total keys)`;
|
|
71
|
+
return obj2;
|
|
72
|
+
}
|
|
73
|
+
const obj = {};
|
|
74
|
+
for (const k of keys) {
|
|
75
|
+
obj[k] = safeSerialize(value[k], depth + 1, seen);
|
|
76
|
+
}
|
|
77
|
+
return obj;
|
|
78
|
+
}
|
|
79
|
+
return String(value);
|
|
80
|
+
}
|
|
81
|
+
function registerSignal(sig, name) {
|
|
82
|
+
if (!installed) return;
|
|
83
|
+
const id = ++signalId;
|
|
84
|
+
const entry = {
|
|
85
|
+
id,
|
|
86
|
+
name: sig._debugName || name || `signal_${id}`,
|
|
87
|
+
ref: sig,
|
|
88
|
+
createdAt: Date.now(),
|
|
89
|
+
internal: false
|
|
90
|
+
};
|
|
91
|
+
signals.set(id, entry);
|
|
92
|
+
sig._devId = id;
|
|
93
|
+
if (sig._subs) subsToSignalId.set(sig._subs, id);
|
|
94
|
+
emit("signal:created", entry);
|
|
95
|
+
return id;
|
|
96
|
+
}
|
|
97
|
+
function notifySignalUpdate(sig) {
|
|
98
|
+
if (!installed) return;
|
|
99
|
+
const id = sig._devId;
|
|
100
|
+
if (id == null) return;
|
|
101
|
+
const entry = signals.get(id);
|
|
102
|
+
if (entry) {
|
|
103
|
+
emit("signal:updated", { id, name: entry.name, value: sig.peek() });
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function unregisterSignal(sig) {
|
|
107
|
+
if (!installed) return;
|
|
108
|
+
const id = sig._devId;
|
|
109
|
+
if (id == null) return;
|
|
110
|
+
signals.delete(id);
|
|
111
|
+
emit("signal:disposed", { id });
|
|
112
|
+
}
|
|
113
|
+
function registerEffect(e, name) {
|
|
114
|
+
if (!installed) return;
|
|
115
|
+
const id = ++effectId;
|
|
116
|
+
const entry = {
|
|
117
|
+
id,
|
|
118
|
+
name: name || e.fn?.name || `effect_${id}`,
|
|
119
|
+
createdAt: Date.now(),
|
|
120
|
+
depSignalIds: [],
|
|
121
|
+
runCount: 0,
|
|
122
|
+
lastRunAt: null
|
|
123
|
+
};
|
|
124
|
+
effects.set(id, entry);
|
|
125
|
+
e._devId = id;
|
|
126
|
+
emit("effect:created", entry);
|
|
127
|
+
return id;
|
|
128
|
+
}
|
|
129
|
+
function trackEffectRun(e) {
|
|
130
|
+
const id = e._devId;
|
|
131
|
+
if (id == null) return;
|
|
132
|
+
const entry = effects.get(id);
|
|
133
|
+
if (!entry) return;
|
|
134
|
+
const depSignalIds = [];
|
|
135
|
+
if (e.deps) {
|
|
136
|
+
for (const subSet of e.deps) {
|
|
137
|
+
const sigId = subsToSignalId.get(subSet);
|
|
138
|
+
if (sigId != null) depSignalIds.push(sigId);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
entry.depSignalIds = depSignalIds;
|
|
142
|
+
entry.runCount = (entry.runCount || 0) + 1;
|
|
143
|
+
entry.lastRunAt = Date.now();
|
|
144
|
+
emit("effect:run", { id, depSignalIds: entry.depSignalIds, runCount: entry.runCount });
|
|
145
|
+
}
|
|
146
|
+
function unregisterEffect(e) {
|
|
147
|
+
if (!installed) return;
|
|
148
|
+
const id = e._devId;
|
|
149
|
+
if (id == null) return;
|
|
150
|
+
effects.delete(id);
|
|
151
|
+
emit("effect:disposed", { id });
|
|
152
|
+
}
|
|
153
|
+
function captureError(err, typeOrContext, context) {
|
|
154
|
+
const resolvedContext = typeof typeOrContext === "string" ? { ...context || {}, type: typeOrContext } : typeOrContext || context || {};
|
|
155
|
+
const entry = {
|
|
156
|
+
message: err?.message || String(err),
|
|
157
|
+
stack: err?.stack || null,
|
|
158
|
+
type: resolvedContext?.type || "unknown",
|
|
159
|
+
effectId: resolvedContext?.effect?._devId || null,
|
|
160
|
+
timestamp: Date.now()
|
|
161
|
+
};
|
|
162
|
+
errors.push(entry);
|
|
163
|
+
if (errors.length > MAX_ERRORS) errors.shift();
|
|
164
|
+
emit("error:captured", entry);
|
|
165
|
+
}
|
|
166
|
+
function registerComponent(name, element, parentDevId) {
|
|
167
|
+
if (!installed) return;
|
|
168
|
+
const id = ++componentId;
|
|
169
|
+
const entry = {
|
|
170
|
+
id,
|
|
171
|
+
name: name || "Anonymous",
|
|
172
|
+
element,
|
|
173
|
+
parentId: parentDevId || null,
|
|
174
|
+
mountedAt: Date.now()
|
|
175
|
+
};
|
|
176
|
+
components.set(id, entry);
|
|
177
|
+
emit("component:mounted", entry);
|
|
178
|
+
return id;
|
|
179
|
+
}
|
|
180
|
+
function unregisterComponent(id) {
|
|
181
|
+
if (!installed) return;
|
|
182
|
+
components.delete(id);
|
|
183
|
+
emit("component:unmounted", { id });
|
|
184
|
+
}
|
|
185
|
+
function subscribe(fn) {
|
|
186
|
+
listeners.add(fn);
|
|
187
|
+
return () => listeners.delete(fn);
|
|
188
|
+
}
|
|
189
|
+
function getSnapshot(opts = {}) {
|
|
190
|
+
const { includeInternal = false } = opts;
|
|
191
|
+
const signalList = [];
|
|
192
|
+
for (const [id, entry] of signals) {
|
|
193
|
+
if (!includeInternal && entry.internal) continue;
|
|
194
|
+
signalList.push({
|
|
195
|
+
id,
|
|
196
|
+
name: entry.name,
|
|
197
|
+
value: entry.ref.peek()
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
const effectList = [];
|
|
201
|
+
for (const [id, entry] of effects) {
|
|
202
|
+
effectList.push({
|
|
203
|
+
id,
|
|
204
|
+
name: entry.name,
|
|
205
|
+
depSignalIds: entry.depSignalIds || [],
|
|
206
|
+
runCount: entry.runCount || 0,
|
|
207
|
+
lastRunAt: entry.lastRunAt || null
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
const componentList = [];
|
|
211
|
+
for (const [id, entry] of components) {
|
|
212
|
+
componentList.push({ id, name: entry.name, parentId: entry.parentId });
|
|
213
|
+
}
|
|
214
|
+
return {
|
|
215
|
+
signals: signalList,
|
|
216
|
+
effects: effectList,
|
|
217
|
+
components: componentList,
|
|
218
|
+
errors: errors.slice(),
|
|
219
|
+
hydrationMismatches: hydrationMismatches.slice()
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
function getErrors(opts = {}) {
|
|
223
|
+
const { since } = opts;
|
|
224
|
+
if (since) return errors.filter((e) => e.timestamp > since);
|
|
225
|
+
return errors.slice();
|
|
226
|
+
}
|
|
227
|
+
function getHydrationMismatches(opts = {}) {
|
|
228
|
+
const { since } = opts;
|
|
229
|
+
if (since) return hydrationMismatches.filter((m) => m.timestamp > since);
|
|
230
|
+
return hydrationMismatches.slice();
|
|
231
|
+
}
|
|
232
|
+
function resetDevTools() {
|
|
233
|
+
signals.clear();
|
|
234
|
+
effects.clear();
|
|
235
|
+
components.clear();
|
|
236
|
+
errors.length = 0;
|
|
237
|
+
hydrationMismatches.length = 0;
|
|
238
|
+
listeners.clear();
|
|
239
|
+
signalId = 0;
|
|
240
|
+
effectId = 0;
|
|
241
|
+
componentId = 0;
|
|
242
|
+
}
|
|
243
|
+
function installDevTools(core) {
|
|
244
|
+
if (installed) return;
|
|
245
|
+
installed = true;
|
|
246
|
+
const hooks = {
|
|
247
|
+
onSignalCreate: (sig) => registerSignal(sig),
|
|
248
|
+
onSignalUpdate: (sig) => notifySignalUpdate(sig),
|
|
249
|
+
onSignalDispose: (sig) => unregisterSignal(sig),
|
|
250
|
+
onEffectCreate: (e) => registerEffect(e),
|
|
251
|
+
onEffectDispose: (e) => unregisterEffect(e),
|
|
252
|
+
onEffectRun: (e) => trackEffectRun(e),
|
|
253
|
+
onError: (err, context) => captureError(err, context),
|
|
254
|
+
onHydrationMismatch: (info) => {
|
|
255
|
+
const entry = {
|
|
256
|
+
type: "hydration_mismatch",
|
|
257
|
+
component: info.component,
|
|
258
|
+
expected: info.expected,
|
|
259
|
+
actual: info.actual,
|
|
260
|
+
mismatchCount: info.mismatchCount,
|
|
261
|
+
timestamp: Date.now()
|
|
262
|
+
};
|
|
263
|
+
hydrationMismatches.push(entry);
|
|
264
|
+
if (hydrationMismatches.length > MAX_HYDRATION_MISMATCHES) hydrationMismatches.shift();
|
|
265
|
+
emit("hydration:mismatch", entry);
|
|
266
|
+
},
|
|
267
|
+
onComponentMount: (ctx) => {
|
|
268
|
+
const name = ctx.Component?.displayName || ctx.Component?.name || "Anonymous";
|
|
269
|
+
const parentDevId = ctx._parentCtx?._devId || null;
|
|
270
|
+
const id = registerComponent(name, ctx._wrapper, parentDevId);
|
|
271
|
+
ctx._devId = id;
|
|
272
|
+
},
|
|
273
|
+
onComponentUnmount: (ctx) => {
|
|
274
|
+
if (ctx._devId != null) unregisterComponent(ctx._devId);
|
|
275
|
+
}
|
|
276
|
+
};
|
|
277
|
+
if (core && core.__setDevToolsHooks) {
|
|
278
|
+
core.__setDevToolsHooks(hooks);
|
|
279
|
+
if (typeof window !== "undefined") window.__WHAT_CORE__ = core;
|
|
280
|
+
} else {
|
|
281
|
+
try {
|
|
282
|
+
import("what-core/devtools").then((mod) => {
|
|
283
|
+
if (mod.__setDevToolsHooks) mod.__setDevToolsHooks(hooks);
|
|
284
|
+
if (typeof window !== "undefined") window.__WHAT_CORE_DEVTOOLS__ = mod;
|
|
285
|
+
}).catch((error) => warnDevToolsImportFailure(error));
|
|
286
|
+
} catch (error) {
|
|
287
|
+
warnDevToolsImportFailure(error);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
if (typeof window !== "undefined") {
|
|
291
|
+
window.__WHAT_DEVTOOLS__ = {
|
|
292
|
+
get signals() {
|
|
293
|
+
return getSnapshot().signals;
|
|
294
|
+
},
|
|
295
|
+
get effects() {
|
|
296
|
+
return getSnapshot().effects;
|
|
297
|
+
},
|
|
298
|
+
get components() {
|
|
299
|
+
return getSnapshot().components;
|
|
300
|
+
},
|
|
301
|
+
get errors() {
|
|
302
|
+
return getErrors();
|
|
303
|
+
},
|
|
304
|
+
get hydrationMismatches() {
|
|
305
|
+
return getHydrationMismatches();
|
|
306
|
+
},
|
|
307
|
+
getSnapshot,
|
|
308
|
+
getErrors,
|
|
309
|
+
getHydrationMismatches,
|
|
310
|
+
subscribe,
|
|
311
|
+
safeSerialize,
|
|
312
|
+
captureError,
|
|
313
|
+
resetDevTools,
|
|
314
|
+
_registries: { signals, effects, components, errors, hydrationMismatches }
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
function warnDevToolsImportFailure(error) {
|
|
319
|
+
const isDev = typeof process === "undefined" || true;
|
|
320
|
+
if (!isDev || typeof console === "undefined") return;
|
|
321
|
+
console.warn(
|
|
322
|
+
"[what-devtools] Could not import what-core/devtools. Pass installDevTools({ __setDevToolsHooks }) or verify package subpath exports.",
|
|
323
|
+
error
|
|
324
|
+
);
|
|
325
|
+
}
|
|
326
|
+
export {
|
|
327
|
+
captureError,
|
|
328
|
+
components,
|
|
329
|
+
effects,
|
|
330
|
+
errors,
|
|
331
|
+
getErrors,
|
|
332
|
+
getHydrationMismatches,
|
|
333
|
+
getSnapshot,
|
|
334
|
+
hydrationMismatches,
|
|
335
|
+
installDevTools,
|
|
336
|
+
notifySignalUpdate,
|
|
337
|
+
registerComponent,
|
|
338
|
+
registerEffect,
|
|
339
|
+
registerSignal,
|
|
340
|
+
resetDevTools,
|
|
341
|
+
safeSerialize,
|
|
342
|
+
signals,
|
|
343
|
+
subscribe,
|
|
344
|
+
unregisterComponent,
|
|
345
|
+
unregisterEffect,
|
|
346
|
+
unregisterSignal
|
|
347
|
+
};
|
|
348
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/index.js"],
|
|
4
|
+
"sourcesContent": ["/**\n * What Framework DevTools\n *\n * Runtime instrumentation for debugging signals, effects, and components.\n * In dev mode, exposes a `window.__WHAT_DEVTOOLS__` global for inspection.\n *\n * Usage:\n * import { installDevTools } from 'what-devtools';\n * installDevTools(); // Call once at app entry\n *\n * Then inspect in console:\n * __WHAT_DEVTOOLS__.signals // Map of all live signals\n * __WHAT_DEVTOOLS__.components // Map of mounted components\n * __WHAT_DEVTOOLS__.effects // Map of active effects\n */\n\nlet installed = false;\nlet signalId = 0;\nlet effectId = 0;\nlet componentId = 0;\n\n// Registries\nconst signals = new Map(); // id \u2192 { name, ref, createdAt, internal }\nconst effects = new Map(); // id \u2192 { name, createdAt, depSignalIds, runCount, lastRunAt }\nconst components = new Map(); // id \u2192 { name, element, mountedAt, parentId }\n\n// Reverse lookup: subscriber Set \u2192 signal ID (O(1) dep resolution)\nconst subsToSignalId = new WeakMap();\n\n// Error log (capped at 100)\nconst errors = [];\nconst MAX_ERRORS = 100;\n\n// Hydration mismatch log (capped at 50)\nconst hydrationMismatches = [];\nconst MAX_HYDRATION_MISMATCHES = 50;\n\n// Event listeners for the DevPanel\nconst listeners = new Set();\n\nfunction emit(event, data) {\n for (const fn of listeners) {\n try { fn(event, data); } catch {}\n }\n}\n\n/**\n * Safely serialize a value for transport (WS, JSON).\n * Handles DOM nodes, functions, circular refs, Maps, Sets, large collections.\n */\nexport function safeSerialize(value, depth = 0, seen) {\n if (depth > 6) return '[max depth]';\n if (value === null || value === undefined) return value;\n\n const type = typeof value;\n if (type === 'string' || type === 'number' || type === 'boolean') return value;\n if (type === 'function') return `[Function: ${value.name || 'anonymous'}]`;\n if (type === 'symbol') return `[Symbol: ${value.description || ''}]`;\n if (type === 'bigint') return value.toString() + 'n';\n\n // DOM nodes\n if (typeof Node !== 'undefined' && value instanceof Node) {\n const tag = value.nodeName?.toLowerCase() || 'node';\n const id = value.id ? `#${value.id}` : '';\n const cls = value.className ? `.${String(value.className).split(' ')[0]}` : '';\n return `[DOM: <${tag}${id}${cls}>]`;\n }\n\n if (!seen) seen = new Set();\n if (seen.has(value)) return '[Circular]';\n seen.add(value);\n\n // Map\n if (value instanceof Map) {\n if (value.size > 50) return `[Map: ${value.size} entries]`;\n const obj = {};\n for (const [k, v] of value) {\n obj[String(k)] = safeSerialize(v, depth + 1, seen);\n }\n return { __type: 'Map', entries: obj };\n }\n\n // Set\n if (value instanceof Set) {\n if (value.size > 50) return `[Set: ${value.size} items]`;\n return { __type: 'Set', values: [...value].map(v => safeSerialize(v, depth + 1, seen)) };\n }\n\n // Array\n if (Array.isArray(value)) {\n if (value.length > 100) {\n return [...value.slice(0, 100).map(v => safeSerialize(v, depth + 1, seen)), `... (${value.length} total)`];\n }\n return value.map(v => safeSerialize(v, depth + 1, seen));\n }\n\n // Error\n if (value instanceof Error) {\n return { __type: 'Error', name: value.name, message: value.message, stack: value.stack };\n }\n\n // Date\n if (value instanceof Date) return { __type: 'Date', iso: value.toISOString() };\n\n // RegExp\n if (value instanceof RegExp) return value.toString();\n\n // Plain object\n if (type === 'object') {\n const keys = Object.keys(value);\n if (keys.length > 100) {\n const obj = {};\n for (const k of keys.slice(0, 100)) {\n obj[k] = safeSerialize(value[k], depth + 1, seen);\n }\n obj['...'] = `(${keys.length} total keys)`;\n return obj;\n }\n const obj = {};\n for (const k of keys) {\n obj[k] = safeSerialize(value[k], depth + 1, seen);\n }\n return obj;\n }\n\n return String(value);\n}\n\n/**\n * Register a signal with the devtools.\n * Called from reactive.js __DEV__ hooks.\n */\nexport function registerSignal(sig, name) {\n if (!installed) return;\n const id = ++signalId;\n const entry = {\n id,\n name: sig._debugName || name || `signal_${id}`,\n ref: sig,\n createdAt: Date.now(),\n internal: false,\n };\n signals.set(id, entry);\n sig._devId = id;\n // Reverse lookup for O(1) effect dep resolution\n if (sig._subs) subsToSignalId.set(sig._subs, id);\n emit('signal:created', entry);\n return id;\n}\n\n/**\n * Notify devtools that a signal value changed.\n */\nexport function notifySignalUpdate(sig) {\n if (!installed) return;\n const id = sig._devId;\n if (id == null) return;\n const entry = signals.get(id);\n if (entry) {\n emit('signal:updated', { id, name: entry.name, value: sig.peek() });\n }\n}\n\n/**\n * Unregister a signal (when disposed via createRoot cleanup).\n */\nexport function unregisterSignal(sig) {\n if (!installed) return;\n const id = sig._devId;\n if (id == null) return;\n signals.delete(id);\n emit('signal:disposed', { id });\n}\n\n/**\n * Register an effect with the devtools.\n */\nexport function registerEffect(e, name) {\n if (!installed) return;\n const id = ++effectId;\n const entry = {\n id,\n name: name || e.fn?.name || `effect_${id}`,\n createdAt: Date.now(),\n depSignalIds: [],\n runCount: 0,\n lastRunAt: null,\n };\n effects.set(id, entry);\n e._devId = id;\n emit('effect:created', entry);\n return id;\n}\n\n/**\n * Track effect dependencies and run count after an effect runs.\n */\nfunction trackEffectRun(e) {\n const id = e._devId;\n if (id == null) return;\n const entry = effects.get(id);\n if (!entry) return;\n\n // Resolve deps via WeakMap reverse lookup \u2014 O(m) where m = number of deps\n const depSignalIds = [];\n if (e.deps) {\n for (const subSet of e.deps) {\n const sigId = subsToSignalId.get(subSet);\n if (sigId != null) depSignalIds.push(sigId);\n }\n }\n\n entry.depSignalIds = depSignalIds;\n entry.runCount = (entry.runCount || 0) + 1;\n entry.lastRunAt = Date.now();\n emit('effect:run', { id, depSignalIds: entry.depSignalIds, runCount: entry.runCount });\n}\n\n/**\n * Unregister an effect.\n */\nexport function unregisterEffect(e) {\n if (!installed) return;\n const id = e._devId;\n if (id == null) return;\n effects.delete(id);\n emit('effect:disposed', { id });\n}\n\n/**\n * Capture a runtime error.\n */\nexport function captureError(err, typeOrContext, context) {\n const resolvedContext = typeof typeOrContext === 'string'\n ? { ...(context || {}), type: typeOrContext }\n : (typeOrContext || context || {});\n const entry = {\n message: err?.message || String(err),\n stack: err?.stack || null,\n type: resolvedContext?.type || 'unknown',\n effectId: resolvedContext?.effect?._devId || null,\n timestamp: Date.now(),\n };\n errors.push(entry);\n if (errors.length > MAX_ERRORS) errors.shift();\n emit('error:captured', entry);\n}\n\n/**\n * Register a component mount.\n */\nexport function registerComponent(name, element, parentDevId) {\n if (!installed) return;\n const id = ++componentId;\n const entry = {\n id,\n name: name || 'Anonymous',\n element,\n parentId: parentDevId || null,\n mountedAt: Date.now(),\n };\n components.set(id, entry);\n emit('component:mounted', entry);\n return id;\n}\n\n/**\n * Unregister a component (unmount).\n */\nexport function unregisterComponent(id) {\n if (!installed) return;\n components.delete(id);\n emit('component:unmounted', { id });\n}\n\n/**\n * Subscribe to devtools events.\n * Returns an unsubscribe function.\n */\nexport function subscribe(fn) {\n listeners.add(fn);\n return () => listeners.delete(fn);\n}\n\n/**\n * Get a snapshot of all tracked state.\n * @param {object} [opts] - Options\n * @param {boolean} [opts.includeInternal=false] - Include framework-internal signals\n */\nexport function getSnapshot(opts = {}) {\n const { includeInternal = false } = opts;\n\n const signalList = [];\n for (const [id, entry] of signals) {\n if (!includeInternal && entry.internal) continue;\n signalList.push({\n id,\n name: entry.name,\n value: entry.ref.peek(),\n });\n }\n\n const effectList = [];\n for (const [id, entry] of effects) {\n effectList.push({\n id,\n name: entry.name,\n depSignalIds: entry.depSignalIds || [],\n runCount: entry.runCount || 0,\n lastRunAt: entry.lastRunAt || null,\n });\n }\n\n const componentList = [];\n for (const [id, entry] of components) {\n componentList.push({ id, name: entry.name, parentId: entry.parentId });\n }\n\n return {\n signals: signalList,\n effects: effectList,\n components: componentList,\n errors: errors.slice(),\n hydrationMismatches: hydrationMismatches.slice(),\n };\n}\n\n/**\n * Get captured errors.\n * @param {object} [opts]\n * @param {number} [opts.since] - Only errors after this timestamp\n */\nexport function getErrors(opts = {}) {\n const { since } = opts;\n if (since) return errors.filter(e => e.timestamp > since);\n return errors.slice();\n}\n\n/**\n * Get captured hydration mismatches.\n * @param {object} [opts]\n * @param {number} [opts.since] - Only mismatches after this timestamp\n */\nexport function getHydrationMismatches(opts = {}) {\n const { since } = opts;\n if (since) return hydrationMismatches.filter(m => m.timestamp > since);\n return hydrationMismatches.slice();\n}\n\n/**\n * Reset devtools registries and captured logs.\n */\nexport function resetDevTools() {\n signals.clear();\n effects.clear();\n components.clear();\n errors.length = 0;\n hydrationMismatches.length = 0;\n listeners.clear();\n signalId = 0;\n effectId = 0;\n componentId = 0;\n}\n\n/**\n * Install devtools. Call once at app startup.\n * Wires into what-core's __DEV__ hooks and exposes `window.__WHAT_DEVTOOLS__`.\n *\n * @param {object} [core] - Optional what-core module. If not provided, attempts dynamic import.\n */\nexport function installDevTools(core) {\n if (installed) return;\n installed = true;\n\n const hooks = {\n onSignalCreate: (sig) => registerSignal(sig),\n onSignalUpdate: (sig) => notifySignalUpdate(sig),\n onSignalDispose: (sig) => unregisterSignal(sig),\n onEffectCreate: (e) => registerEffect(e),\n onEffectDispose: (e) => unregisterEffect(e),\n onEffectRun: (e) => trackEffectRun(e),\n onError: (err, context) => captureError(err, context),\n onHydrationMismatch: (info) => {\n const entry = {\n type: 'hydration_mismatch',\n component: info.component,\n expected: info.expected,\n actual: info.actual,\n mismatchCount: info.mismatchCount,\n timestamp: Date.now(),\n };\n hydrationMismatches.push(entry);\n if (hydrationMismatches.length > MAX_HYDRATION_MISMATCHES) hydrationMismatches.shift();\n emit('hydration:mismatch', entry);\n },\n onComponentMount: (ctx) => {\n const name = ctx.Component?.displayName || ctx.Component?.name || 'Anonymous';\n const parentDevId = ctx._parentCtx?._devId || null;\n const id = registerComponent(name, ctx._wrapper, parentDevId);\n ctx._devId = id;\n },\n onComponentUnmount: (ctx) => {\n if (ctx._devId != null) unregisterComponent(ctx._devId);\n },\n };\n\n // Wire into what-core's reactive system\n if (core && core.__setDevToolsHooks) {\n core.__setDevToolsHooks(hooks);\n if (typeof window !== 'undefined') window.__WHAT_CORE__ = core;\n } else {\n try {\n import('what-core/devtools').then(mod => {\n if (mod.__setDevToolsHooks) mod.__setDevToolsHooks(hooks);\n if (typeof window !== 'undefined') window.__WHAT_CORE_DEVTOOLS__ = mod;\n }).catch((error) => warnDevToolsImportFailure(error));\n } catch (error) {\n warnDevToolsImportFailure(error);\n }\n }\n\n if (typeof window !== 'undefined') {\n window.__WHAT_DEVTOOLS__ = {\n get signals() { return getSnapshot().signals; },\n get effects() { return getSnapshot().effects; },\n get components() { return getSnapshot().components; },\n get errors() { return getErrors(); },\n get hydrationMismatches() { return getHydrationMismatches(); },\n getSnapshot,\n getErrors,\n getHydrationMismatches,\n subscribe,\n safeSerialize,\n captureError,\n resetDevTools,\n _registries: { signals, effects, components, errors, hydrationMismatches },\n };\n }\n}\n\nexport { signals, effects, components, errors, hydrationMismatches };\n\nfunction warnDevToolsImportFailure(error) {\n const isDev = typeof process === 'undefined' || process.env?.NODE_ENV !== 'production';\n if (!isDev || typeof console === 'undefined') return;\n console.warn(\n '[what-devtools] Could not import what-core/devtools. Pass installDevTools({ __setDevToolsHooks }) or verify package subpath exports.',\n error\n );\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["obj"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var f=!1,D=0,C=0,k=0,p=new Map,l=new Map,m=new Map,E=new WeakMap,d=[],b=100,a=[],A=50,_=new Set;function c(n,e){for(let t of _)try{t(n,e)}catch{}}function u(n,e=0,t){if(e>6)return"[max depth]";if(n==null)return n;let o=typeof n;if(o==="string"||o==="number"||o==="boolean")return n;if(o==="function")return`[Function: ${n.name||"anonymous"}]`;if(o==="symbol")return`[Symbol: ${n.description||""}]`;if(o==="bigint")return n.toString()+"n";if(typeof Node<"u"&&n instanceof Node){let r=n.nodeName?.toLowerCase()||"node",i=n.id?`#${n.id}`:"",s=n.className?`.${String(n.className).split(" ")[0]}`:"";return`[DOM: <${r}${i}${s}>]`}if(t||(t=new Set),t.has(n))return"[Circular]";if(t.add(n),n instanceof Map){if(n.size>50)return`[Map: ${n.size} entries]`;let r={};for(let[i,s]of n)r[String(i)]=u(s,e+1,t);return{__type:"Map",entries:r}}if(n instanceof Set)return n.size>50?`[Set: ${n.size} items]`:{__type:"Set",values:[...n].map(r=>u(r,e+1,t))};if(Array.isArray(n))return n.length>100?[...n.slice(0,100).map(r=>u(r,e+1,t)),`... (${n.length} total)`]:n.map(r=>u(r,e+1,t));if(n instanceof Error)return{__type:"Error",name:n.name,message:n.message,stack:n.stack};if(n instanceof Date)return{__type:"Date",iso:n.toISOString()};if(n instanceof RegExp)return n.toString();if(o==="object"){let r=Object.keys(n);if(r.length>100){let s={};for(let y of r.slice(0,100))s[y]=u(n[y],e+1,t);return s["..."]=`(${r.length} total keys)`,s}let i={};for(let s of r)i[s]=u(n[s],e+1,t);return i}return String(n)}function M(n,e){if(!f)return;let t=++D,o={id:t,name:n._debugName||e||`signal_${t}`,ref:n,createdAt:Date.now(),internal:!1};return p.set(t,o),n._devId=t,n._subs&&E.set(n._subs,t),c("signal:created",o),t}function T(n){if(!f)return;let e=n._devId;if(e==null)return;let t=p.get(e);t&&c("signal:updated",{id:e,name:t.name,value:n.peek()})}function x(n){if(!f)return;let e=n._devId;e!=null&&(p.delete(e),c("signal:disposed",{id:e}))}function R(n,e){if(!f)return;let t=++C,o={id:t,name:e||n.fn?.name||`effect_${t}`,createdAt:Date.now(),depSignalIds:[],runCount:0,lastRunAt:null};return l.set(t,o),n._devId=t,c("effect:created",o),t}function $(n){let e=n._devId;if(e==null)return;let t=l.get(e);if(!t)return;let o=[];if(n.deps)for(let r of n.deps){let i=E.get(r);i!=null&&o.push(i)}t.depSignalIds=o,t.runCount=(t.runCount||0)+1,t.lastRunAt=Date.now(),c("effect:run",{id:e,depSignalIds:t.depSignalIds,runCount:t.runCount})}function H(n){if(!f)return;let e=n._devId;e!=null&&(l.delete(e),c("effect:disposed",{id:e}))}function S(n,e,t){let o=typeof e=="string"?{...t||{},type:e}:e||t||{},r={message:n?.message||String(n),stack:n?.stack||null,type:o?.type||"unknown",effectId:o?.effect?._devId||null,timestamp:Date.now()};d.push(r),d.length>b&&d.shift(),c("error:captured",r)}function N(n,e,t){if(!f)return;let o=++k,r={id:o,name:n||"Anonymous",element:e,parentId:t||null,mountedAt:Date.now()};return m.set(o,r),c("component:mounted",r),o}function O(n){f&&(m.delete(n),c("component:unmounted",{id:n}))}function L(n){return _.add(n),()=>_.delete(n)}function g(n={}){let{includeInternal:e=!1}=n,t=[];for(let[i,s]of p)!e&&s.internal||t.push({id:i,name:s.name,value:s.ref.peek()});let o=[];for(let[i,s]of l)o.push({id:i,name:s.name,depSignalIds:s.depSignalIds||[],runCount:s.runCount||0,lastRunAt:s.lastRunAt||null});let r=[];for(let[i,s]of m)r.push({id:i,name:s.name,parentId:s.parentId});return{signals:t,effects:o,components:r,errors:d.slice(),hydrationMismatches:a.slice()}}function h(n={}){let{since:e}=n;return e?d.filter(t=>t.timestamp>e):d.slice()}function I(n={}){let{since:e}=n;return e?a.filter(t=>t.timestamp>e):a.slice()}function j(){p.clear(),l.clear(),m.clear(),d.length=0,a.length=0,_.clear(),D=0,C=0,k=0}function z(n){if(f)return;f=!0;let e={onSignalCreate:t=>M(t),onSignalUpdate:t=>T(t),onSignalDispose:t=>x(t),onEffectCreate:t=>R(t),onEffectDispose:t=>H(t),onEffectRun:t=>$(t),onError:(t,o)=>S(t,o),onHydrationMismatch:t=>{let o={type:"hydration_mismatch",component:t.component,expected:t.expected,actual:t.actual,mismatchCount:t.mismatchCount,timestamp:Date.now()};a.push(o),a.length>A&&a.shift(),c("hydration:mismatch",o)},onComponentMount:t=>{let o=t.Component?.displayName||t.Component?.name||"Anonymous",r=t._parentCtx?._devId||null,i=N(o,t._wrapper,r);t._devId=i},onComponentUnmount:t=>{t._devId!=null&&O(t._devId)}};if(n&&n.__setDevToolsHooks)n.__setDevToolsHooks(e),typeof window<"u"&&(window.__WHAT_CORE__=n);else try{import("what-core/devtools").then(t=>{t.__setDevToolsHooks&&t.__setDevToolsHooks(e),typeof window<"u"&&(window.__WHAT_CORE_DEVTOOLS__=t)}).catch(t=>w(t))}catch(t){w(t)}typeof window<"u"&&(window.__WHAT_DEVTOOLS__={get signals(){return g().signals},get effects(){return g().effects},get components(){return g().components},get errors(){return h()},get hydrationMismatches(){return I()},getSnapshot:g,getErrors:h,getHydrationMismatches:I,subscribe:L,safeSerialize:u,captureError:S,resetDevTools:j,_registries:{signals:p,effects:l,components:m,errors:d,hydrationMismatches:a}})}function w(n){!(typeof process>"u")||typeof console>"u"||console.warn("[what-devtools] Could not import what-core/devtools. Pass installDevTools({ __setDevToolsHooks }) or verify package subpath exports.",n)}export{S as captureError,m as components,l as effects,d as errors,h as getErrors,I as getHydrationMismatches,g as getSnapshot,a as hydrationMismatches,z as installDevTools,T as notifySignalUpdate,N as registerComponent,R as registerEffect,M as registerSignal,j as resetDevTools,u as safeSerialize,p as signals,L as subscribe,O as unregisterComponent,H as unregisterEffect,x as unregisterSignal};
|
|
2
|
+
//# sourceMappingURL=index.min.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/index.js"],
|
|
4
|
+
"sourcesContent": ["/**\n * What Framework DevTools\n *\n * Runtime instrumentation for debugging signals, effects, and components.\n * In dev mode, exposes a `window.__WHAT_DEVTOOLS__` global for inspection.\n *\n * Usage:\n * import { installDevTools } from 'what-devtools';\n * installDevTools(); // Call once at app entry\n *\n * Then inspect in console:\n * __WHAT_DEVTOOLS__.signals // Map of all live signals\n * __WHAT_DEVTOOLS__.components // Map of mounted components\n * __WHAT_DEVTOOLS__.effects // Map of active effects\n */\n\nlet installed = false;\nlet signalId = 0;\nlet effectId = 0;\nlet componentId = 0;\n\n// Registries\nconst signals = new Map(); // id \u2192 { name, ref, createdAt, internal }\nconst effects = new Map(); // id \u2192 { name, createdAt, depSignalIds, runCount, lastRunAt }\nconst components = new Map(); // id \u2192 { name, element, mountedAt, parentId }\n\n// Reverse lookup: subscriber Set \u2192 signal ID (O(1) dep resolution)\nconst subsToSignalId = new WeakMap();\n\n// Error log (capped at 100)\nconst errors = [];\nconst MAX_ERRORS = 100;\n\n// Hydration mismatch log (capped at 50)\nconst hydrationMismatches = [];\nconst MAX_HYDRATION_MISMATCHES = 50;\n\n// Event listeners for the DevPanel\nconst listeners = new Set();\n\nfunction emit(event, data) {\n for (const fn of listeners) {\n try { fn(event, data); } catch {}\n }\n}\n\n/**\n * Safely serialize a value for transport (WS, JSON).\n * Handles DOM nodes, functions, circular refs, Maps, Sets, large collections.\n */\nexport function safeSerialize(value, depth = 0, seen) {\n if (depth > 6) return '[max depth]';\n if (value === null || value === undefined) return value;\n\n const type = typeof value;\n if (type === 'string' || type === 'number' || type === 'boolean') return value;\n if (type === 'function') return `[Function: ${value.name || 'anonymous'}]`;\n if (type === 'symbol') return `[Symbol: ${value.description || ''}]`;\n if (type === 'bigint') return value.toString() + 'n';\n\n // DOM nodes\n if (typeof Node !== 'undefined' && value instanceof Node) {\n const tag = value.nodeName?.toLowerCase() || 'node';\n const id = value.id ? `#${value.id}` : '';\n const cls = value.className ? `.${String(value.className).split(' ')[0]}` : '';\n return `[DOM: <${tag}${id}${cls}>]`;\n }\n\n if (!seen) seen = new Set();\n if (seen.has(value)) return '[Circular]';\n seen.add(value);\n\n // Map\n if (value instanceof Map) {\n if (value.size > 50) return `[Map: ${value.size} entries]`;\n const obj = {};\n for (const [k, v] of value) {\n obj[String(k)] = safeSerialize(v, depth + 1, seen);\n }\n return { __type: 'Map', entries: obj };\n }\n\n // Set\n if (value instanceof Set) {\n if (value.size > 50) return `[Set: ${value.size} items]`;\n return { __type: 'Set', values: [...value].map(v => safeSerialize(v, depth + 1, seen)) };\n }\n\n // Array\n if (Array.isArray(value)) {\n if (value.length > 100) {\n return [...value.slice(0, 100).map(v => safeSerialize(v, depth + 1, seen)), `... (${value.length} total)`];\n }\n return value.map(v => safeSerialize(v, depth + 1, seen));\n }\n\n // Error\n if (value instanceof Error) {\n return { __type: 'Error', name: value.name, message: value.message, stack: value.stack };\n }\n\n // Date\n if (value instanceof Date) return { __type: 'Date', iso: value.toISOString() };\n\n // RegExp\n if (value instanceof RegExp) return value.toString();\n\n // Plain object\n if (type === 'object') {\n const keys = Object.keys(value);\n if (keys.length > 100) {\n const obj = {};\n for (const k of keys.slice(0, 100)) {\n obj[k] = safeSerialize(value[k], depth + 1, seen);\n }\n obj['...'] = `(${keys.length} total keys)`;\n return obj;\n }\n const obj = {};\n for (const k of keys) {\n obj[k] = safeSerialize(value[k], depth + 1, seen);\n }\n return obj;\n }\n\n return String(value);\n}\n\n/**\n * Register a signal with the devtools.\n * Called from reactive.js __DEV__ hooks.\n */\nexport function registerSignal(sig, name) {\n if (!installed) return;\n const id = ++signalId;\n const entry = {\n id,\n name: sig._debugName || name || `signal_${id}`,\n ref: sig,\n createdAt: Date.now(),\n internal: false,\n };\n signals.set(id, entry);\n sig._devId = id;\n // Reverse lookup for O(1) effect dep resolution\n if (sig._subs) subsToSignalId.set(sig._subs, id);\n emit('signal:created', entry);\n return id;\n}\n\n/**\n * Notify devtools that a signal value changed.\n */\nexport function notifySignalUpdate(sig) {\n if (!installed) return;\n const id = sig._devId;\n if (id == null) return;\n const entry = signals.get(id);\n if (entry) {\n emit('signal:updated', { id, name: entry.name, value: sig.peek() });\n }\n}\n\n/**\n * Unregister a signal (when disposed via createRoot cleanup).\n */\nexport function unregisterSignal(sig) {\n if (!installed) return;\n const id = sig._devId;\n if (id == null) return;\n signals.delete(id);\n emit('signal:disposed', { id });\n}\n\n/**\n * Register an effect with the devtools.\n */\nexport function registerEffect(e, name) {\n if (!installed) return;\n const id = ++effectId;\n const entry = {\n id,\n name: name || e.fn?.name || `effect_${id}`,\n createdAt: Date.now(),\n depSignalIds: [],\n runCount: 0,\n lastRunAt: null,\n };\n effects.set(id, entry);\n e._devId = id;\n emit('effect:created', entry);\n return id;\n}\n\n/**\n * Track effect dependencies and run count after an effect runs.\n */\nfunction trackEffectRun(e) {\n const id = e._devId;\n if (id == null) return;\n const entry = effects.get(id);\n if (!entry) return;\n\n // Resolve deps via WeakMap reverse lookup \u2014 O(m) where m = number of deps\n const depSignalIds = [];\n if (e.deps) {\n for (const subSet of e.deps) {\n const sigId = subsToSignalId.get(subSet);\n if (sigId != null) depSignalIds.push(sigId);\n }\n }\n\n entry.depSignalIds = depSignalIds;\n entry.runCount = (entry.runCount || 0) + 1;\n entry.lastRunAt = Date.now();\n emit('effect:run', { id, depSignalIds: entry.depSignalIds, runCount: entry.runCount });\n}\n\n/**\n * Unregister an effect.\n */\nexport function unregisterEffect(e) {\n if (!installed) return;\n const id = e._devId;\n if (id == null) return;\n effects.delete(id);\n emit('effect:disposed', { id });\n}\n\n/**\n * Capture a runtime error.\n */\nexport function captureError(err, typeOrContext, context) {\n const resolvedContext = typeof typeOrContext === 'string'\n ? { ...(context || {}), type: typeOrContext }\n : (typeOrContext || context || {});\n const entry = {\n message: err?.message || String(err),\n stack: err?.stack || null,\n type: resolvedContext?.type || 'unknown',\n effectId: resolvedContext?.effect?._devId || null,\n timestamp: Date.now(),\n };\n errors.push(entry);\n if (errors.length > MAX_ERRORS) errors.shift();\n emit('error:captured', entry);\n}\n\n/**\n * Register a component mount.\n */\nexport function registerComponent(name, element, parentDevId) {\n if (!installed) return;\n const id = ++componentId;\n const entry = {\n id,\n name: name || 'Anonymous',\n element,\n parentId: parentDevId || null,\n mountedAt: Date.now(),\n };\n components.set(id, entry);\n emit('component:mounted', entry);\n return id;\n}\n\n/**\n * Unregister a component (unmount).\n */\nexport function unregisterComponent(id) {\n if (!installed) return;\n components.delete(id);\n emit('component:unmounted', { id });\n}\n\n/**\n * Subscribe to devtools events.\n * Returns an unsubscribe function.\n */\nexport function subscribe(fn) {\n listeners.add(fn);\n return () => listeners.delete(fn);\n}\n\n/**\n * Get a snapshot of all tracked state.\n * @param {object} [opts] - Options\n * @param {boolean} [opts.includeInternal=false] - Include framework-internal signals\n */\nexport function getSnapshot(opts = {}) {\n const { includeInternal = false } = opts;\n\n const signalList = [];\n for (const [id, entry] of signals) {\n if (!includeInternal && entry.internal) continue;\n signalList.push({\n id,\n name: entry.name,\n value: entry.ref.peek(),\n });\n }\n\n const effectList = [];\n for (const [id, entry] of effects) {\n effectList.push({\n id,\n name: entry.name,\n depSignalIds: entry.depSignalIds || [],\n runCount: entry.runCount || 0,\n lastRunAt: entry.lastRunAt || null,\n });\n }\n\n const componentList = [];\n for (const [id, entry] of components) {\n componentList.push({ id, name: entry.name, parentId: entry.parentId });\n }\n\n return {\n signals: signalList,\n effects: effectList,\n components: componentList,\n errors: errors.slice(),\n hydrationMismatches: hydrationMismatches.slice(),\n };\n}\n\n/**\n * Get captured errors.\n * @param {object} [opts]\n * @param {number} [opts.since] - Only errors after this timestamp\n */\nexport function getErrors(opts = {}) {\n const { since } = opts;\n if (since) return errors.filter(e => e.timestamp > since);\n return errors.slice();\n}\n\n/**\n * Get captured hydration mismatches.\n * @param {object} [opts]\n * @param {number} [opts.since] - Only mismatches after this timestamp\n */\nexport function getHydrationMismatches(opts = {}) {\n const { since } = opts;\n if (since) return hydrationMismatches.filter(m => m.timestamp > since);\n return hydrationMismatches.slice();\n}\n\n/**\n * Reset devtools registries and captured logs.\n */\nexport function resetDevTools() {\n signals.clear();\n effects.clear();\n components.clear();\n errors.length = 0;\n hydrationMismatches.length = 0;\n listeners.clear();\n signalId = 0;\n effectId = 0;\n componentId = 0;\n}\n\n/**\n * Install devtools. Call once at app startup.\n * Wires into what-core's __DEV__ hooks and exposes `window.__WHAT_DEVTOOLS__`.\n *\n * @param {object} [core] - Optional what-core module. If not provided, attempts dynamic import.\n */\nexport function installDevTools(core) {\n if (installed) return;\n installed = true;\n\n const hooks = {\n onSignalCreate: (sig) => registerSignal(sig),\n onSignalUpdate: (sig) => notifySignalUpdate(sig),\n onSignalDispose: (sig) => unregisterSignal(sig),\n onEffectCreate: (e) => registerEffect(e),\n onEffectDispose: (e) => unregisterEffect(e),\n onEffectRun: (e) => trackEffectRun(e),\n onError: (err, context) => captureError(err, context),\n onHydrationMismatch: (info) => {\n const entry = {\n type: 'hydration_mismatch',\n component: info.component,\n expected: info.expected,\n actual: info.actual,\n mismatchCount: info.mismatchCount,\n timestamp: Date.now(),\n };\n hydrationMismatches.push(entry);\n if (hydrationMismatches.length > MAX_HYDRATION_MISMATCHES) hydrationMismatches.shift();\n emit('hydration:mismatch', entry);\n },\n onComponentMount: (ctx) => {\n const name = ctx.Component?.displayName || ctx.Component?.name || 'Anonymous';\n const parentDevId = ctx._parentCtx?._devId || null;\n const id = registerComponent(name, ctx._wrapper, parentDevId);\n ctx._devId = id;\n },\n onComponentUnmount: (ctx) => {\n if (ctx._devId != null) unregisterComponent(ctx._devId);\n },\n };\n\n // Wire into what-core's reactive system\n if (core && core.__setDevToolsHooks) {\n core.__setDevToolsHooks(hooks);\n if (typeof window !== 'undefined') window.__WHAT_CORE__ = core;\n } else {\n try {\n import('what-core/devtools').then(mod => {\n if (mod.__setDevToolsHooks) mod.__setDevToolsHooks(hooks);\n if (typeof window !== 'undefined') window.__WHAT_CORE_DEVTOOLS__ = mod;\n }).catch((error) => warnDevToolsImportFailure(error));\n } catch (error) {\n warnDevToolsImportFailure(error);\n }\n }\n\n if (typeof window !== 'undefined') {\n window.__WHAT_DEVTOOLS__ = {\n get signals() { return getSnapshot().signals; },\n get effects() { return getSnapshot().effects; },\n get components() { return getSnapshot().components; },\n get errors() { return getErrors(); },\n get hydrationMismatches() { return getHydrationMismatches(); },\n getSnapshot,\n getErrors,\n getHydrationMismatches,\n subscribe,\n safeSerialize,\n captureError,\n resetDevTools,\n _registries: { signals, effects, components, errors, hydrationMismatches },\n };\n }\n}\n\nexport { signals, effects, components, errors, hydrationMismatches };\n\nfunction warnDevToolsImportFailure(error) {\n const isDev = typeof process === 'undefined' || process.env?.NODE_ENV !== 'production';\n if (!isDev || typeof console === 'undefined') return;\n console.warn(\n '[what-devtools] Could not import what-core/devtools. Pass installDevTools({ __setDevToolsHooks }) or verify package subpath exports.',\n error\n );\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["installed", "signalId", "effectId", "componentId", "signals", "effects", "components", "subsToSignalId", "errors", "MAX_ERRORS", "hydrationMismatches", "MAX_HYDRATION_MISMATCHES", "listeners", "emit", "event", "data", "fn", "safeSerialize", "value", "depth", "seen", "type", "tag", "id", "cls", "obj", "k", "v", "keys", "registerSignal", "sig", "name", "entry", "notifySignalUpdate", "unregisterSignal", "registerEffect", "e", "trackEffectRun", "depSignalIds", "subSet", "sigId", "unregisterEffect", "captureError", "err", "typeOrContext", "context", "resolvedContext", "registerComponent", "element", "parentDevId", "unregisterComponent", "subscribe", "getSnapshot", "opts", "includeInternal", "signalList", "effectList", "componentList", "getErrors", "since", "getHydrationMismatches", "m", "resetDevTools", "installDevTools", "core", "hooks", "info", "ctx", "mod", "error", "warnDevToolsImportFailure", "warnDevToolsImportFailure", "error"]
|
|
7
|
+
}
|