@alloy-js/core 0.23.0-dev.10 → 0.23.0-dev.11
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/dist/devtools/index.html +29 -17
- package/dist/src/binder.d.ts.map +1 -1
- package/dist/src/binder.js +5 -0
- package/dist/src/binder.js.map +1 -1
- package/dist/src/components/For.d.ts.map +1 -1
- package/dist/src/components/For.js +1 -1
- package/dist/src/components/For.js.map +1 -1
- package/dist/src/components/List.d.ts.map +1 -1
- package/dist/src/components/List.js +1 -1
- package/dist/src/components/List.js.map +1 -1
- package/dist/src/components/Switch.d.ts.map +1 -1
- package/dist/src/components/Switch.js +1 -1
- package/dist/src/components/Switch.js.map +1 -1
- package/dist/src/debug/diagnostics.test.js +3 -2
- package/dist/src/debug/diagnostics.test.js.map +1 -1
- package/dist/src/debug/effects.d.ts +12 -4
- package/dist/src/debug/effects.d.ts.map +1 -1
- package/dist/src/debug/effects.js +182 -52
- package/dist/src/debug/effects.js.map +1 -1
- package/dist/src/debug/effects.test.js +213 -41
- package/dist/src/debug/effects.test.js.map +1 -1
- package/dist/src/debug/files.d.ts.map +1 -1
- package/dist/src/debug/files.js +7 -18
- package/dist/src/debug/files.js.map +1 -1
- package/dist/src/debug/files.test.js +13 -36
- package/dist/src/debug/files.test.js.map +1 -1
- package/dist/src/debug/index.d.ts +4 -2
- package/dist/src/debug/index.d.ts.map +1 -1
- package/dist/src/debug/index.js +4 -2
- package/dist/src/debug/index.js.map +1 -1
- package/dist/src/debug/message-format.test.d.ts +2 -0
- package/dist/src/debug/message-format.test.d.ts.map +1 -0
- package/dist/src/debug/message-format.test.js +700 -0
- package/dist/src/debug/message-format.test.js.map +1 -0
- package/dist/src/debug/render-tree-orphans.test.d.ts +2 -0
- package/dist/src/debug/render-tree-orphans.test.d.ts.map +1 -0
- package/dist/src/debug/render-tree-orphans.test.js +297 -0
- package/dist/src/debug/render-tree-orphans.test.js.map +1 -0
- package/dist/src/debug/render.d.ts.map +1 -1
- package/dist/src/debug/render.js +83 -130
- package/dist/src/debug/render.js.map +1 -1
- package/dist/src/debug/render.test.js +91 -128
- package/dist/src/debug/render.test.js.map +1 -1
- package/dist/src/debug/symbols.d.ts +6 -5
- package/dist/src/debug/symbols.d.ts.map +1 -1
- package/dist/src/debug/symbols.js +46 -23
- package/dist/src/debug/symbols.js.map +1 -1
- package/dist/src/debug/symbols.test.js +15 -26
- package/dist/src/debug/symbols.test.js.map +1 -1
- package/dist/src/debug/trace-writer.d.ts +55 -0
- package/dist/src/debug/trace-writer.d.ts.map +1 -0
- package/dist/src/debug/trace-writer.js +658 -0
- package/dist/src/debug/trace-writer.js.map +1 -0
- package/dist/src/debug/trace.d.ts +10 -10
- package/dist/src/debug/trace.d.ts.map +1 -1
- package/dist/src/debug/trace.js +23 -20
- package/dist/src/debug/trace.js.map +1 -1
- package/dist/src/devtools/devtools-protocol.d.ts +318 -161
- package/dist/src/devtools/devtools-protocol.d.ts.map +1 -1
- package/dist/src/devtools/devtools-server.browser.d.ts +0 -5
- package/dist/src/devtools/devtools-server.browser.d.ts.map +1 -1
- package/dist/src/devtools/devtools-server.browser.js +0 -3
- package/dist/src/devtools/devtools-server.browser.js.map +1 -1
- package/dist/src/devtools/devtools-server.d.ts +0 -6
- package/dist/src/devtools/devtools-server.d.ts.map +1 -1
- package/dist/src/devtools/devtools-server.js +212 -24
- package/dist/src/devtools/devtools-server.js.map +1 -1
- package/dist/src/devtools/devtools-transport.d.ts +2 -2
- package/dist/src/devtools/devtools-transport.d.ts.map +1 -1
- package/dist/src/devtools/devtools-transport.js +2 -2
- package/dist/src/devtools/devtools-transport.js.map +1 -1
- package/dist/src/devtools-entry.browser.d.ts +1 -1
- package/dist/src/devtools-entry.browser.d.ts.map +1 -1
- package/dist/src/devtools-entry.browser.js.map +1 -1
- package/dist/src/devtools-entry.d.ts +1 -1
- package/dist/src/devtools-entry.d.ts.map +1 -1
- package/dist/src/devtools-entry.js.map +1 -1
- package/dist/src/diagnostics.d.ts.map +1 -1
- package/dist/src/diagnostics.js +5 -5
- package/dist/src/diagnostics.js.map +1 -1
- package/dist/src/reactivity.d.ts +13 -2
- package/dist/src/reactivity.d.ts.map +1 -1
- package/dist/src/reactivity.js +96 -13
- package/dist/src/reactivity.js.map +1 -1
- package/dist/src/render.d.ts.map +1 -1
- package/dist/src/render.js +84 -30
- package/dist/src/render.js.map +1 -1
- package/dist/src/scheduler.d.ts +5 -0
- package/dist/src/scheduler.d.ts.map +1 -1
- package/dist/src/scheduler.js +94 -23
- package/dist/src/scheduler.js.map +1 -1
- package/dist/src/utils.d.ts.map +1 -1
- package/dist/src/utils.js +11 -5
- package/dist/src/utils.js.map +1 -1
- package/dist/testing/devtools-utils.d.ts +12 -3
- package/dist/testing/devtools-utils.d.ts.map +1 -1
- package/dist/testing/devtools-utils.js +26 -4
- package/dist/testing/devtools-utils.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/binder.ts +47 -38
- package/src/components/For.tsx +14 -10
- package/src/components/List.tsx +7 -4
- package/src/components/Switch.tsx +11 -7
- package/src/debug/diagnostics.test.tsx +3 -2
- package/src/debug/effects.test.tsx +248 -36
- package/src/debug/effects.ts +276 -62
- package/src/debug/files.test.tsx +15 -35
- package/src/debug/files.ts +11 -11
- package/src/debug/index.ts +4 -0
- package/src/debug/message-format.test.tsx +759 -0
- package/src/debug/render-tree-orphans.test.tsx +344 -0
- package/src/debug/render.test.tsx +96 -118
- package/src/debug/render.ts +183 -124
- package/src/debug/symbols.test.tsx +19 -20
- package/src/debug/symbols.ts +106 -23
- package/src/debug/trace-writer.ts +969 -0
- package/src/debug/trace.ts +25 -28
- package/src/devtools/devtools-protocol.ts +361 -176
- package/src/devtools/devtools-server.browser.ts +0 -9
- package/src/devtools/devtools-server.ts +210 -32
- package/src/devtools/devtools-transport.ts +4 -4
- package/src/devtools-entry.browser.ts +11 -15
- package/src/devtools-entry.ts +9 -15
- package/src/diagnostics.ts +14 -5
- package/src/reactivity.ts +113 -17
- package/src/render.ts +104 -30
- package/src/scheduler.ts +145 -26
- package/src/utils.tsx +7 -4
- package/temp/api.json +142 -20
- package/testing/devtools-utils.ts +46 -4
|
@@ -5,6 +5,15 @@
|
|
|
5
5
|
* messages, and reset. Transport details (HTTP/WebSocket) are delegated
|
|
6
6
|
* to devtools-transport.ts.
|
|
7
7
|
*/
|
|
8
|
+
import type { ChangeChannel, ChangeEvent } from "../debug/trace-writer.js";
|
|
9
|
+
import {
|
|
10
|
+
ALL_CHANNELS,
|
|
11
|
+
closeTrace,
|
|
12
|
+
initTrace,
|
|
13
|
+
isTraceEnabled,
|
|
14
|
+
queryChannel,
|
|
15
|
+
setChangeListener,
|
|
16
|
+
} from "../debug/trace-writer.js";
|
|
8
17
|
import {
|
|
9
18
|
createTransport,
|
|
10
19
|
getAlloyVersion,
|
|
@@ -15,11 +24,6 @@ import {
|
|
|
15
24
|
// Public types
|
|
16
25
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
17
26
|
|
|
18
|
-
export interface DevtoolsMessage {
|
|
19
|
-
type: string;
|
|
20
|
-
[key: string]: unknown;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
27
|
export interface DevtoolsIncomingMessage {
|
|
24
28
|
type: string;
|
|
25
29
|
[key: string]: unknown;
|
|
@@ -47,6 +51,95 @@ let devtoolsInitialized = false;
|
|
|
47
51
|
let loggedDevtoolsLinks = false;
|
|
48
52
|
let waitingForConnection = false;
|
|
49
53
|
let configuredPort: number | undefined;
|
|
54
|
+
let tempDbPath: string | null = null;
|
|
55
|
+
let subscribedPromise: Promise<void> | null = null;
|
|
56
|
+
let resolveSubscribed: (() => void) | null = null;
|
|
57
|
+
|
|
58
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
59
|
+
// Per-client subscription state
|
|
60
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
61
|
+
|
|
62
|
+
interface ClientState {
|
|
63
|
+
subscriptions: Set<ChangeChannel>;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const clientStates = new Map<any, ClientState>();
|
|
67
|
+
|
|
68
|
+
function eventToMessageType(event: ChangeEvent): string {
|
|
69
|
+
const map: Record<string, Record<string, string>> = {
|
|
70
|
+
render: {
|
|
71
|
+
added: "render:node_added",
|
|
72
|
+
updated: "render:node_updated",
|
|
73
|
+
removed: "render:node_removed",
|
|
74
|
+
reset: "render:reset",
|
|
75
|
+
},
|
|
76
|
+
effects: { added: "effect:added", updated: "effect:updated" },
|
|
77
|
+
refs: { added: "ref:added" },
|
|
78
|
+
edges: { added: `edge:${(event.data as any).edge_type ?? "track"}` },
|
|
79
|
+
symbols: {
|
|
80
|
+
added: "symbol:added",
|
|
81
|
+
updated: "symbol:updated",
|
|
82
|
+
removed: "symbol:removed",
|
|
83
|
+
},
|
|
84
|
+
scopes: {
|
|
85
|
+
added: "scope:added",
|
|
86
|
+
updated: "scope:updated",
|
|
87
|
+
removed: "scope:removed",
|
|
88
|
+
},
|
|
89
|
+
files: {
|
|
90
|
+
added: "file:added",
|
|
91
|
+
updated: "file:updated",
|
|
92
|
+
removed: "file:removed",
|
|
93
|
+
},
|
|
94
|
+
directories: { added: "directory:added", removed: "directory:removed" },
|
|
95
|
+
diagnostics: { added: "diagnostics:report" },
|
|
96
|
+
errors: { added: "render:error" },
|
|
97
|
+
lifecycle: { added: "effect:lifecycle" },
|
|
98
|
+
scheduler: { added: "scheduler:job" },
|
|
99
|
+
};
|
|
100
|
+
return (
|
|
101
|
+
map[event.channel]?.[event.action] ?? `${event.channel}:${event.action}`
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function channelToInitialMessageType(
|
|
106
|
+
channel: ChangeChannel,
|
|
107
|
+
row: Record<string, unknown>,
|
|
108
|
+
): string {
|
|
109
|
+
const map: Record<string, string> = {
|
|
110
|
+
render: "render:node_added",
|
|
111
|
+
effects: "effect:added",
|
|
112
|
+
refs: "ref:added",
|
|
113
|
+
symbols: "symbol:added",
|
|
114
|
+
scopes: "scope:added",
|
|
115
|
+
files: "file:added",
|
|
116
|
+
directories: "directory:added",
|
|
117
|
+
diagnostics: "diagnostics:report",
|
|
118
|
+
errors: "render:error",
|
|
119
|
+
lifecycle: "effect:lifecycle",
|
|
120
|
+
scheduler: "scheduler:job",
|
|
121
|
+
};
|
|
122
|
+
if (channel === "edges") {
|
|
123
|
+
return `edge:${(row.type as string) ?? "track"}`;
|
|
124
|
+
}
|
|
125
|
+
return map[channel] ?? `${channel}:added`;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function sendInitialState(socket: any, channels: ChangeChannel[]): void {
|
|
129
|
+
if (!isTraceEnabled()) return;
|
|
130
|
+
for (const channel of channels) {
|
|
131
|
+
const rows = queryChannel(channel);
|
|
132
|
+
for (const row of rows) {
|
|
133
|
+
const msgType = channelToInitialMessageType(channel, row);
|
|
134
|
+
// Remap SQLite column names that collide with the message `type` field
|
|
135
|
+
if (channel === "effects" && row.type !== undefined) {
|
|
136
|
+
row.effect_type = row.type;
|
|
137
|
+
}
|
|
138
|
+
const msg = { ...row, type: msgType };
|
|
139
|
+
socket.send(JSON.stringify(msg));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
50
143
|
|
|
51
144
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
52
145
|
// Environment helpers
|
|
@@ -98,6 +191,38 @@ export function getDevtoolsServerInfo(): DevtoolsServerInfo | null {
|
|
|
98
191
|
return { port: transportState.port, connected: transportState.connected };
|
|
99
192
|
}
|
|
100
193
|
|
|
194
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
195
|
+
// Temp SQLite for devtools
|
|
196
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
197
|
+
|
|
198
|
+
async function ensureSqliteForDevtools(): Promise<void> {
|
|
199
|
+
if (isTraceEnabled()) return;
|
|
200
|
+
const os = await import("node:os");
|
|
201
|
+
const path = await import("node:path");
|
|
202
|
+
tempDbPath = path.join(os.tmpdir(), `alloy-debug-${process.pid}.db`);
|
|
203
|
+
await initTrace(tempDbPath);
|
|
204
|
+
process.on("exit", () => {
|
|
205
|
+
if (!tempDbPath) return;
|
|
206
|
+
try {
|
|
207
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
208
|
+
const fs = require("node:fs");
|
|
209
|
+
fs.unlinkSync(tempDbPath);
|
|
210
|
+
try {
|
|
211
|
+
fs.unlinkSync(tempDbPath + "-wal");
|
|
212
|
+
} catch {
|
|
213
|
+
/* ignore */
|
|
214
|
+
}
|
|
215
|
+
try {
|
|
216
|
+
fs.unlinkSync(tempDbPath + "-shm");
|
|
217
|
+
} catch {
|
|
218
|
+
/* ignore */
|
|
219
|
+
}
|
|
220
|
+
} catch {
|
|
221
|
+
/* ignore cleanup failures */
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
|
|
101
226
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
102
227
|
// Server lifecycle
|
|
103
228
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
@@ -108,6 +233,13 @@ async function ensureServer(): Promise<DevtoolsTransportState> {
|
|
|
108
233
|
transportPromise = createTransport({
|
|
109
234
|
port: configuredPort ?? resolveDebugPort(),
|
|
110
235
|
onConnection(socket) {
|
|
236
|
+
// Start with no subscriptions — client must subscribe explicitly.
|
|
237
|
+
clientStates.set(socket, { subscriptions: new Set() });
|
|
238
|
+
if (!subscribedPromise) {
|
|
239
|
+
subscribedPromise = new Promise<void>((resolve) => {
|
|
240
|
+
resolveSubscribed = resolve;
|
|
241
|
+
});
|
|
242
|
+
}
|
|
111
243
|
if (waitingForConnection) {
|
|
112
244
|
waitingForConnection = false;
|
|
113
245
|
process.stdout.write(" Connected!\n");
|
|
@@ -117,21 +249,75 @@ async function ensureServer(): Promise<DevtoolsTransportState> {
|
|
|
117
249
|
type: "debugger:info",
|
|
118
250
|
version: getAlloyVersion(),
|
|
119
251
|
cwd: getCwd(),
|
|
252
|
+
sourceMapEnabled: process.execArgv.includes("--enable-source-maps"),
|
|
120
253
|
}),
|
|
121
254
|
);
|
|
122
255
|
},
|
|
123
|
-
onMessage(raw) {
|
|
256
|
+
onMessage(raw, socket) {
|
|
124
257
|
const message = raw as DevtoolsIncomingMessage;
|
|
125
258
|
if (!message || !message.type) return;
|
|
259
|
+
|
|
260
|
+
if (message.type === "subscribe") {
|
|
261
|
+
const channels = (message as any).channels as string[];
|
|
262
|
+
const state = clientStates.get(socket);
|
|
263
|
+
if (state && channels && Array.isArray(channels)) {
|
|
264
|
+
const validChannels = channels.filter((ch) =>
|
|
265
|
+
ALL_CHANNELS.includes(ch as ChangeChannel),
|
|
266
|
+
) as ChangeChannel[];
|
|
267
|
+
state.subscriptions = new Set(validChannels);
|
|
268
|
+
sendInitialState(socket, validChannels);
|
|
269
|
+
}
|
|
270
|
+
resolveSubscribed?.();
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
if (message.type === "unsubscribe") {
|
|
274
|
+
const channels = (message as any).channels as string[];
|
|
275
|
+
const state = clientStates.get(socket);
|
|
276
|
+
if (state && channels) {
|
|
277
|
+
for (const ch of channels)
|
|
278
|
+
state.subscriptions.delete(ch as ChangeChannel);
|
|
279
|
+
}
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
|
|
126
283
|
for (const handler of messageHandlers) {
|
|
127
284
|
handler(message);
|
|
128
285
|
}
|
|
129
286
|
},
|
|
130
|
-
onDisconnect() {
|
|
131
|
-
|
|
287
|
+
onDisconnect(socket) {
|
|
288
|
+
clientStates.delete(socket);
|
|
132
289
|
},
|
|
133
290
|
}).then((state) => {
|
|
134
291
|
transportState = state;
|
|
292
|
+
|
|
293
|
+
// Wire up the change notification bus to forward events to subscribed clients
|
|
294
|
+
setChangeListener((event: ChangeEvent) => {
|
|
295
|
+
if (!transportState) return;
|
|
296
|
+
|
|
297
|
+
// Lifecycle signals are broadcast to ALL connected clients
|
|
298
|
+
const signalType = (event.data as any)?._signal as string | undefined;
|
|
299
|
+
if (signalType) {
|
|
300
|
+
const payload = JSON.stringify({ type: signalType });
|
|
301
|
+
for (const client of transportState.clients) {
|
|
302
|
+
if (client.readyState === client.OPEN) {
|
|
303
|
+
client.send(payload);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
const msgType = eventToMessageType(event);
|
|
310
|
+
const message = { ...event.data, type: msgType };
|
|
311
|
+
const payload = JSON.stringify(message);
|
|
312
|
+
|
|
313
|
+
for (const [client, clientState] of clientStates) {
|
|
314
|
+
if (client.readyState !== client.OPEN) continue;
|
|
315
|
+
if (clientState.subscriptions.has(event.channel)) {
|
|
316
|
+
client.send(payload);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
});
|
|
320
|
+
|
|
135
321
|
if (!loggedDevtoolsLinks) {
|
|
136
322
|
loggedDevtoolsLinks = true;
|
|
137
323
|
// eslint-disable-next-line no-console
|
|
@@ -173,8 +359,14 @@ async function ensureServer(): Promise<DevtoolsTransportState> {
|
|
|
173
359
|
export async function waitForDevtoolsConnection(): Promise<void> {
|
|
174
360
|
devtoolsExplicitlyEnabled = true;
|
|
175
361
|
const server = await ensureServer();
|
|
176
|
-
if (server.connected)
|
|
177
|
-
|
|
362
|
+
if (!server.connected) {
|
|
363
|
+
await server.ready;
|
|
364
|
+
}
|
|
365
|
+
// Wait for the client to send its initial subscribe message so that
|
|
366
|
+
// messages emitted during a synchronous render are not dropped.
|
|
367
|
+
if (subscribedPromise) {
|
|
368
|
+
await subscribedPromise;
|
|
369
|
+
}
|
|
178
370
|
}
|
|
179
371
|
|
|
180
372
|
/**
|
|
@@ -191,6 +383,7 @@ export async function enableDevtools(
|
|
|
191
383
|
if (options?.port !== undefined) {
|
|
192
384
|
configuredPort = options.port;
|
|
193
385
|
}
|
|
386
|
+
await ensureSqliteForDevtools();
|
|
194
387
|
const server = await ensureServer();
|
|
195
388
|
return { port: server.port, connected: server.connected };
|
|
196
389
|
}
|
|
@@ -203,6 +396,7 @@ export async function initDevtoolsIfEnabled(): Promise<void> {
|
|
|
203
396
|
if (devtoolsInitialized) return;
|
|
204
397
|
if (!isDevtoolsEnabled()) return;
|
|
205
398
|
devtoolsInitialized = true;
|
|
399
|
+
await ensureSqliteForDevtools();
|
|
206
400
|
await waitForDevtoolsConnection();
|
|
207
401
|
}
|
|
208
402
|
|
|
@@ -232,28 +426,6 @@ export async function enableDevtoolsAndConnect(
|
|
|
232
426
|
// Messaging
|
|
233
427
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
234
428
|
|
|
235
|
-
/** Broadcast a message to all connected devtools clients. */
|
|
236
|
-
export function broadcastDevtoolsMessage(message: DevtoolsMessage) {
|
|
237
|
-
if (!isDevtoolsEnabled()) return;
|
|
238
|
-
if (!transportState) return;
|
|
239
|
-
if (transportState.clients.size === 0) return;
|
|
240
|
-
|
|
241
|
-
try {
|
|
242
|
-
const payload = JSON.stringify(message);
|
|
243
|
-
for (const client of transportState.clients) {
|
|
244
|
-
if (client.readyState === client.OPEN) {
|
|
245
|
-
client.send(payload);
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
} catch (err) {
|
|
249
|
-
// eslint-disable-next-line no-console
|
|
250
|
-
console.error(
|
|
251
|
-
`Failed to send devtools message (type: ${message.type}):`,
|
|
252
|
-
err,
|
|
253
|
-
);
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
|
|
257
429
|
/** Register a handler for incoming devtools messages. Returns an unsubscribe function. */
|
|
258
430
|
export function registerDevtoolsMessageHandler(
|
|
259
431
|
handler: (message: DevtoolsIncomingMessage) => void,
|
|
@@ -278,6 +450,8 @@ export function assertDevtoolsConnectedForSyncRender() {
|
|
|
278
450
|
|
|
279
451
|
/** Reset all devtools state. For use in tests only. */
|
|
280
452
|
export async function resetDevtoolsServerForTests() {
|
|
453
|
+
setChangeListener(null);
|
|
454
|
+
clientStates.clear();
|
|
281
455
|
if (transportState) {
|
|
282
456
|
await transportState.close();
|
|
283
457
|
}
|
|
@@ -287,4 +461,8 @@ export async function resetDevtoolsServerForTests() {
|
|
|
287
461
|
devtoolsInitialized = false;
|
|
288
462
|
configuredPort = undefined;
|
|
289
463
|
loggedDevtoolsLinks = false;
|
|
464
|
+
subscribedPromise = null;
|
|
465
|
+
resolveSubscribed = null;
|
|
466
|
+
// Close the trace DB so each test starts fresh
|
|
467
|
+
closeTrace();
|
|
290
468
|
}
|
|
@@ -58,8 +58,8 @@ function loadDevtoolsUiHtml(): string | null {
|
|
|
58
58
|
export interface CreateTransportOptions {
|
|
59
59
|
port: number;
|
|
60
60
|
onConnection(socket: any): void;
|
|
61
|
-
onMessage(message: unknown): void;
|
|
62
|
-
onDisconnect(): void;
|
|
61
|
+
onMessage(message: unknown, socket: any): void;
|
|
62
|
+
onDisconnect(socket: any): void;
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
/**
|
|
@@ -137,7 +137,7 @@ export async function createTransport(
|
|
|
137
137
|
|
|
138
138
|
socket.on("message", (data) => {
|
|
139
139
|
try {
|
|
140
|
-
options.onMessage(JSON.parse(String(data)));
|
|
140
|
+
options.onMessage(JSON.parse(String(data)), socket);
|
|
141
141
|
} catch {
|
|
142
142
|
// ignore malformed messages
|
|
143
143
|
}
|
|
@@ -146,7 +146,7 @@ export async function createTransport(
|
|
|
146
146
|
socket.on("close", () => {
|
|
147
147
|
clients.delete(socket);
|
|
148
148
|
state.connected = clients.size > 0;
|
|
149
|
-
options.onDisconnect();
|
|
149
|
+
options.onDisconnect(socket);
|
|
150
150
|
});
|
|
151
151
|
});
|
|
152
152
|
|
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
export type {
|
|
2
|
-
|
|
2
|
+
// Individual server→client message types
|
|
3
3
|
ClientToServerMessage,
|
|
4
4
|
DebuggerInfoMessage,
|
|
5
|
-
|
|
5
|
+
DiagnosticRow,
|
|
6
6
|
DiagnosticsReportMessage,
|
|
7
7
|
DirectoryAddedMessage,
|
|
8
8
|
DirectoryRemovedMessage,
|
|
9
9
|
EffectAddedMessage,
|
|
10
|
-
EffectEdgeInfo,
|
|
11
10
|
EffectEdgeUpdatedMessage,
|
|
12
|
-
EffectInfo,
|
|
13
11
|
EffectTrackMessage,
|
|
14
12
|
EffectTriggerMessage,
|
|
15
13
|
EffectUpdatedMessage,
|
|
@@ -18,27 +16,25 @@ export type {
|
|
|
18
16
|
FileUpdatedMessage,
|
|
19
17
|
FlushJobsCompleteMessage,
|
|
20
18
|
RefAddedMessage,
|
|
21
|
-
RefInfo,
|
|
22
19
|
RenderCompleteMessage,
|
|
23
20
|
RenderErrorMessage,
|
|
24
|
-
RenderErrorStackEntry,
|
|
25
21
|
RenderNodeAddedMessage,
|
|
26
22
|
RenderNodeRemovedMessage,
|
|
27
23
|
RenderNodeUpdatedMessage,
|
|
28
24
|
RenderResetMessage,
|
|
29
|
-
|
|
25
|
+
// Individual client→server message types
|
|
30
26
|
RerenderBreakRequestMessage,
|
|
31
27
|
RerenderRequestMessage,
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
ScopeUpdateMessage,
|
|
28
|
+
ScopeAddedMessage,
|
|
29
|
+
ScopeRemovedMessage,
|
|
30
|
+
ScopeUpdatedMessage,
|
|
36
31
|
ServerToClientMessage,
|
|
37
32
|
SourceLocation,
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
33
|
+
SubscribeMessage,
|
|
34
|
+
SymbolAddedMessage,
|
|
35
|
+
SymbolRemovedMessage,
|
|
36
|
+
SymbolUpdatedMessage,
|
|
37
|
+
UnsubscribeMessage,
|
|
42
38
|
} from "./devtools/devtools-protocol.js";
|
|
43
39
|
export {
|
|
44
40
|
enableDevtools,
|
package/src/devtools-entry.ts
CHANGED
|
@@ -1,16 +1,13 @@
|
|
|
1
1
|
export type {
|
|
2
2
|
// Individual server→client message types
|
|
3
|
-
BatchMessage,
|
|
4
3
|
ClientToServerMessage,
|
|
5
4
|
DebuggerInfoMessage,
|
|
6
|
-
|
|
5
|
+
DiagnosticRow,
|
|
7
6
|
DiagnosticsReportMessage,
|
|
8
7
|
DirectoryAddedMessage,
|
|
9
8
|
DirectoryRemovedMessage,
|
|
10
9
|
EffectAddedMessage,
|
|
11
|
-
EffectEdgeInfo,
|
|
12
10
|
EffectEdgeUpdatedMessage,
|
|
13
|
-
EffectInfo,
|
|
14
11
|
EffectTrackMessage,
|
|
15
12
|
EffectTriggerMessage,
|
|
16
13
|
EffectUpdatedMessage,
|
|
@@ -19,28 +16,25 @@ export type {
|
|
|
19
16
|
FileUpdatedMessage,
|
|
20
17
|
FlushJobsCompleteMessage,
|
|
21
18
|
RefAddedMessage,
|
|
22
|
-
RefInfo,
|
|
23
19
|
RenderCompleteMessage,
|
|
24
20
|
RenderErrorMessage,
|
|
25
|
-
RenderErrorStackEntry,
|
|
26
21
|
RenderNodeAddedMessage,
|
|
27
22
|
RenderNodeRemovedMessage,
|
|
28
23
|
RenderNodeUpdatedMessage,
|
|
29
24
|
RenderResetMessage,
|
|
30
|
-
RenderTreeNode,
|
|
31
25
|
// Individual client→server message types
|
|
32
26
|
RerenderBreakRequestMessage,
|
|
33
27
|
RerenderRequestMessage,
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
ScopeUpdateMessage,
|
|
28
|
+
ScopeAddedMessage,
|
|
29
|
+
ScopeRemovedMessage,
|
|
30
|
+
ScopeUpdatedMessage,
|
|
38
31
|
ServerToClientMessage,
|
|
39
32
|
SourceLocation,
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
33
|
+
SubscribeMessage,
|
|
34
|
+
SymbolAddedMessage,
|
|
35
|
+
SymbolRemovedMessage,
|
|
36
|
+
SymbolUpdatedMessage,
|
|
37
|
+
UnsubscribeMessage,
|
|
44
38
|
} from "./devtools/devtools-protocol.js";
|
|
45
39
|
export {
|
|
46
40
|
enableDevtools,
|
package/src/diagnostics.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { getRenderNodeId } from "./debug/index.js";
|
|
2
|
-
import {
|
|
2
|
+
import { insertDiagnostic } from "./debug/trace-writer.js";
|
|
3
3
|
import { getContext } from "./reactivity.js";
|
|
4
4
|
import { getRenderStackSnapshot } from "./render-stack.js";
|
|
5
5
|
import type { SourceLocation } from "./runtime/component.js";
|
|
@@ -77,10 +77,19 @@ export class DiagnosticsCollector {
|
|
|
77
77
|
}
|
|
78
78
|
|
|
79
79
|
private broadcast() {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
80
|
+
const diagnostics = this.getDiagnostics();
|
|
81
|
+
for (const diagnostic of diagnostics) {
|
|
82
|
+
insertDiagnostic(
|
|
83
|
+
diagnostic.message,
|
|
84
|
+
diagnostic.severity,
|
|
85
|
+
diagnostic.source?.fileName,
|
|
86
|
+
diagnostic.source?.lineNumber,
|
|
87
|
+
diagnostic.source?.columnNumber,
|
|
88
|
+
diagnostic.componentStack ?
|
|
89
|
+
JSON.stringify(diagnostic.componentStack)
|
|
90
|
+
: undefined,
|
|
91
|
+
);
|
|
92
|
+
}
|
|
84
93
|
}
|
|
85
94
|
}
|
|
86
95
|
|