@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.
Files changed (131) hide show
  1. package/dist/devtools/index.html +29 -17
  2. package/dist/src/binder.d.ts.map +1 -1
  3. package/dist/src/binder.js +5 -0
  4. package/dist/src/binder.js.map +1 -1
  5. package/dist/src/components/For.d.ts.map +1 -1
  6. package/dist/src/components/For.js +1 -1
  7. package/dist/src/components/For.js.map +1 -1
  8. package/dist/src/components/List.d.ts.map +1 -1
  9. package/dist/src/components/List.js +1 -1
  10. package/dist/src/components/List.js.map +1 -1
  11. package/dist/src/components/Switch.d.ts.map +1 -1
  12. package/dist/src/components/Switch.js +1 -1
  13. package/dist/src/components/Switch.js.map +1 -1
  14. package/dist/src/debug/diagnostics.test.js +3 -2
  15. package/dist/src/debug/diagnostics.test.js.map +1 -1
  16. package/dist/src/debug/effects.d.ts +12 -4
  17. package/dist/src/debug/effects.d.ts.map +1 -1
  18. package/dist/src/debug/effects.js +182 -52
  19. package/dist/src/debug/effects.js.map +1 -1
  20. package/dist/src/debug/effects.test.js +213 -41
  21. package/dist/src/debug/effects.test.js.map +1 -1
  22. package/dist/src/debug/files.d.ts.map +1 -1
  23. package/dist/src/debug/files.js +7 -18
  24. package/dist/src/debug/files.js.map +1 -1
  25. package/dist/src/debug/files.test.js +13 -36
  26. package/dist/src/debug/files.test.js.map +1 -1
  27. package/dist/src/debug/index.d.ts +4 -2
  28. package/dist/src/debug/index.d.ts.map +1 -1
  29. package/dist/src/debug/index.js +4 -2
  30. package/dist/src/debug/index.js.map +1 -1
  31. package/dist/src/debug/message-format.test.d.ts +2 -0
  32. package/dist/src/debug/message-format.test.d.ts.map +1 -0
  33. package/dist/src/debug/message-format.test.js +700 -0
  34. package/dist/src/debug/message-format.test.js.map +1 -0
  35. package/dist/src/debug/render-tree-orphans.test.d.ts +2 -0
  36. package/dist/src/debug/render-tree-orphans.test.d.ts.map +1 -0
  37. package/dist/src/debug/render-tree-orphans.test.js +297 -0
  38. package/dist/src/debug/render-tree-orphans.test.js.map +1 -0
  39. package/dist/src/debug/render.d.ts.map +1 -1
  40. package/dist/src/debug/render.js +83 -130
  41. package/dist/src/debug/render.js.map +1 -1
  42. package/dist/src/debug/render.test.js +91 -128
  43. package/dist/src/debug/render.test.js.map +1 -1
  44. package/dist/src/debug/symbols.d.ts +6 -5
  45. package/dist/src/debug/symbols.d.ts.map +1 -1
  46. package/dist/src/debug/symbols.js +46 -23
  47. package/dist/src/debug/symbols.js.map +1 -1
  48. package/dist/src/debug/symbols.test.js +15 -26
  49. package/dist/src/debug/symbols.test.js.map +1 -1
  50. package/dist/src/debug/trace-writer.d.ts +55 -0
  51. package/dist/src/debug/trace-writer.d.ts.map +1 -0
  52. package/dist/src/debug/trace-writer.js +658 -0
  53. package/dist/src/debug/trace-writer.js.map +1 -0
  54. package/dist/src/debug/trace.d.ts +10 -10
  55. package/dist/src/debug/trace.d.ts.map +1 -1
  56. package/dist/src/debug/trace.js +23 -20
  57. package/dist/src/debug/trace.js.map +1 -1
  58. package/dist/src/devtools/devtools-protocol.d.ts +318 -161
  59. package/dist/src/devtools/devtools-protocol.d.ts.map +1 -1
  60. package/dist/src/devtools/devtools-server.browser.d.ts +0 -5
  61. package/dist/src/devtools/devtools-server.browser.d.ts.map +1 -1
  62. package/dist/src/devtools/devtools-server.browser.js +0 -3
  63. package/dist/src/devtools/devtools-server.browser.js.map +1 -1
  64. package/dist/src/devtools/devtools-server.d.ts +0 -6
  65. package/dist/src/devtools/devtools-server.d.ts.map +1 -1
  66. package/dist/src/devtools/devtools-server.js +212 -24
  67. package/dist/src/devtools/devtools-server.js.map +1 -1
  68. package/dist/src/devtools/devtools-transport.d.ts +2 -2
  69. package/dist/src/devtools/devtools-transport.d.ts.map +1 -1
  70. package/dist/src/devtools/devtools-transport.js +2 -2
  71. package/dist/src/devtools/devtools-transport.js.map +1 -1
  72. package/dist/src/devtools-entry.browser.d.ts +1 -1
  73. package/dist/src/devtools-entry.browser.d.ts.map +1 -1
  74. package/dist/src/devtools-entry.browser.js.map +1 -1
  75. package/dist/src/devtools-entry.d.ts +1 -1
  76. package/dist/src/devtools-entry.d.ts.map +1 -1
  77. package/dist/src/devtools-entry.js.map +1 -1
  78. package/dist/src/diagnostics.d.ts.map +1 -1
  79. package/dist/src/diagnostics.js +5 -5
  80. package/dist/src/diagnostics.js.map +1 -1
  81. package/dist/src/reactivity.d.ts +13 -2
  82. package/dist/src/reactivity.d.ts.map +1 -1
  83. package/dist/src/reactivity.js +96 -13
  84. package/dist/src/reactivity.js.map +1 -1
  85. package/dist/src/render.d.ts.map +1 -1
  86. package/dist/src/render.js +84 -30
  87. package/dist/src/render.js.map +1 -1
  88. package/dist/src/scheduler.d.ts +5 -0
  89. package/dist/src/scheduler.d.ts.map +1 -1
  90. package/dist/src/scheduler.js +94 -23
  91. package/dist/src/scheduler.js.map +1 -1
  92. package/dist/src/utils.d.ts.map +1 -1
  93. package/dist/src/utils.js +11 -5
  94. package/dist/src/utils.js.map +1 -1
  95. package/dist/testing/devtools-utils.d.ts +12 -3
  96. package/dist/testing/devtools-utils.d.ts.map +1 -1
  97. package/dist/testing/devtools-utils.js +26 -4
  98. package/dist/testing/devtools-utils.js.map +1 -1
  99. package/dist/tsconfig.tsbuildinfo +1 -1
  100. package/package.json +1 -1
  101. package/src/binder.ts +47 -38
  102. package/src/components/For.tsx +14 -10
  103. package/src/components/List.tsx +7 -4
  104. package/src/components/Switch.tsx +11 -7
  105. package/src/debug/diagnostics.test.tsx +3 -2
  106. package/src/debug/effects.test.tsx +248 -36
  107. package/src/debug/effects.ts +276 -62
  108. package/src/debug/files.test.tsx +15 -35
  109. package/src/debug/files.ts +11 -11
  110. package/src/debug/index.ts +4 -0
  111. package/src/debug/message-format.test.tsx +759 -0
  112. package/src/debug/render-tree-orphans.test.tsx +344 -0
  113. package/src/debug/render.test.tsx +96 -118
  114. package/src/debug/render.ts +183 -124
  115. package/src/debug/symbols.test.tsx +19 -20
  116. package/src/debug/symbols.ts +106 -23
  117. package/src/debug/trace-writer.ts +969 -0
  118. package/src/debug/trace.ts +25 -28
  119. package/src/devtools/devtools-protocol.ts +361 -176
  120. package/src/devtools/devtools-server.browser.ts +0 -9
  121. package/src/devtools/devtools-server.ts +210 -32
  122. package/src/devtools/devtools-transport.ts +4 -4
  123. package/src/devtools-entry.browser.ts +11 -15
  124. package/src/devtools-entry.ts +9 -15
  125. package/src/diagnostics.ts +14 -5
  126. package/src/reactivity.ts +113 -17
  127. package/src/render.ts +104 -30
  128. package/src/scheduler.ts +145 -26
  129. package/src/utils.tsx +7 -4
  130. package/temp/api.json +142 -20
  131. package/testing/devtools-utils.ts +46 -4
@@ -5,8 +5,16 @@ import type { OutputSymbol } from "../symbols/output-symbol.js";
5
5
  import { getRenderNodeId } from "./render.js";
6
6
  import { sanitizeRecord } from "./serialize.js";
7
7
  import {
8
- emitDevtoolsMessage,
9
- isDevtoolsEnabled,
8
+ insertScope,
9
+ insertSymbol,
10
+ deleteScope as traceDeleteScope,
11
+ deleteSymbol as traceDeleteSymbol,
12
+ updateScope as traceUpdateScope,
13
+ updateSymbol as traceUpdateSymbol,
14
+ } from "./trace-writer.js";
15
+ import {
16
+ isDebugEnabled,
17
+ logDevtoolsMessage,
10
18
  TracePhase,
11
19
  traceType,
12
20
  } from "./trace.js";
@@ -147,25 +155,49 @@ function snapshotSymbol(
147
155
  };
148
156
  }
149
157
 
158
+ const scopeRenderNodes = new Map<number, { value: number | null }>();
159
+
150
160
  export function registerScope(scope: OutputScope) {
151
- if (!isDevtoolsEnabled()) return;
161
+ if (!isDebugEnabled()) return;
152
162
  if (scopeWatchers.has(scope.id)) return;
153
163
  untrack(() => {
154
- const renderNodeId = getRenderNodeIdForCurrentContext();
155
- let previous = snapshotScope(scope, renderNodeId);
156
- emitDevtoolsMessage({
164
+ const renderNodeRef = { value: getRenderNodeIdForCurrentContext() };
165
+ scopeRenderNodes.set(scope.id, renderNodeRef);
166
+ let previous = snapshotScope(scope, renderNodeRef.value);
167
+ logDevtoolsMessage({
157
168
  type: traceType(TracePhase.scope.create),
158
169
  scope: previous,
159
170
  });
171
+
172
+ insertScope(
173
+ previous.id,
174
+ previous.name,
175
+ previous.parentId ?? undefined,
176
+ previous.ownerSymbolId ?? undefined,
177
+ previous.renderNodeId ?? undefined,
178
+ previous.isMemberScope,
179
+ previous.metadata ? JSON.stringify(previous.metadata) : undefined,
180
+ );
181
+
160
182
  const stop = watch(
161
- () => snapshotScope(scope, renderNodeId),
183
+ () => snapshotScope(scope, renderNodeRef.value),
162
184
  (next) => {
163
185
  if (!shallowEqual(previous, next)) {
164
186
  previous = next;
165
- emitDevtoolsMessage({
187
+ logDevtoolsMessage({
166
188
  type: traceType(TracePhase.scope.update),
167
189
  scope: next,
168
190
  });
191
+
192
+ traceUpdateScope(
193
+ next.id,
194
+ next.name,
195
+ next.parentId ?? undefined,
196
+ next.ownerSymbolId ?? undefined,
197
+ next.renderNodeId ?? undefined,
198
+ next.isMemberScope,
199
+ next.metadata ? JSON.stringify(next.metadata) : undefined,
200
+ );
169
201
  }
170
202
  },
171
203
  );
@@ -173,45 +205,94 @@ export function registerScope(scope: OutputScope) {
173
205
  });
174
206
  }
175
207
 
208
+ /**
209
+ * Update a scope's render_node_id to the current context's render node.
210
+ * Called when a scope is mounted in the component tree (e.g. via the Scope
211
+ * component with a `value` prop) so that the scope is associated with where
212
+ * it lives in the render tree rather than where it was instantiated.
213
+ */
214
+ export function relocateScope(scope: OutputScope) {
215
+ if (!isDebugEnabled()) return;
216
+ untrack(() => {
217
+ const renderNodeId = getRenderNodeIdForCurrentContext();
218
+ if (renderNodeId !== null) {
219
+ const renderNodeRef = scopeRenderNodes.get(scope.id);
220
+ if (renderNodeRef) {
221
+ renderNodeRef.value = renderNodeId;
222
+ }
223
+ const snapshot = snapshotScope(scope, renderNodeId);
224
+ traceUpdateScope(
225
+ snapshot.id,
226
+ snapshot.name,
227
+ snapshot.parentId ?? undefined,
228
+ snapshot.ownerSymbolId ?? undefined,
229
+ snapshot.renderNodeId ?? undefined,
230
+ snapshot.isMemberScope,
231
+ snapshot.metadata ? JSON.stringify(snapshot.metadata) : undefined,
232
+ );
233
+ }
234
+ });
235
+ }
236
+
176
237
  export function unregisterScope(scope: OutputScope) {
177
- if (!isDevtoolsEnabled()) return;
238
+ if (!isDebugEnabled()) return;
178
239
  const stop = scopeWatchers.get(scope.id);
179
240
  if (stop) stop();
180
241
  scopeWatchers.delete(scope.id);
181
- emitDevtoolsMessage({
242
+ logDevtoolsMessage({
182
243
  type: traceType(TracePhase.scope.delete),
183
244
  id: scope.id,
184
245
  });
185
- }
186
246
 
187
- /**
188
- * Re-register a pre-existing scope under the current render context.
189
- * Called when `<Scope value={existingScope}>` mounts an already-created scope
190
- * into a new location in the render tree.
191
- */
192
- export function relocateScope(_scope: OutputScope) {
193
- // Placeholder — real implementation added in the trace-writer branch.
247
+ traceDeleteScope(scope.id);
194
248
  }
195
249
 
196
250
  export function registerSymbol(symbol: OutputSymbol) {
197
- if (!isDevtoolsEnabled()) return;
251
+ if (!isDebugEnabled()) return;
198
252
  if (symbolWatchers.has(symbol.id)) return;
199
253
  untrack(() => {
200
254
  const renderNodeId = getRenderNodeIdForCurrentContext();
201
255
  let previous = snapshotSymbol(symbol, renderNodeId);
202
- emitDevtoolsMessage({
256
+ logDevtoolsMessage({
203
257
  type: traceType(TracePhase.symbol.create),
204
258
  symbol: previous,
205
259
  });
260
+
261
+ insertSymbol(
262
+ previous.id,
263
+ previous.name,
264
+ previous.originalName,
265
+ previous.scopeId ?? undefined,
266
+ previous.ownerSymbolId ?? undefined,
267
+ previous.renderNodeId ?? undefined,
268
+ previous.isMemberSymbol,
269
+ previous.isTransient,
270
+ previous.isAlias,
271
+ previous.metadata ? JSON.stringify(previous.metadata) : undefined,
272
+ );
273
+
206
274
  const stop = watch(
207
275
  () => snapshotSymbol(symbol, renderNodeId),
208
276
  (next) => {
209
277
  if (!shallowEqual(previous, next)) {
210
278
  previous = next;
211
- emitDevtoolsMessage({
279
+ logDevtoolsMessage({
212
280
  type: traceType(TracePhase.symbol.update),
213
281
  symbol: next,
214
282
  });
283
+
284
+ traceUpdateSymbol(
285
+ next.id,
286
+ next.name,
287
+ next.originalName,
288
+ next.scopeId ?? undefined,
289
+ next.ownerSymbolId ?? undefined,
290
+ next.renderNodeId ?? undefined,
291
+ next.isMemberSymbol,
292
+ next.isTransient,
293
+ next.isAlias,
294
+ next.metadata ? JSON.stringify(next.metadata) : undefined,
295
+ );
215
296
  }
216
297
  },
217
298
  );
@@ -220,14 +301,16 @@ export function registerSymbol(symbol: OutputSymbol) {
220
301
  }
221
302
 
222
303
  export function unregisterSymbol(symbol: OutputSymbol) {
223
- if (!isDevtoolsEnabled()) return;
304
+ if (!isDebugEnabled()) return;
224
305
  const stop = symbolWatchers.get(symbol.id);
225
306
  if (stop) stop();
226
307
  symbolWatchers.delete(symbol.id);
227
- emitDevtoolsMessage({
308
+ logDevtoolsMessage({
228
309
  type: traceType(TracePhase.symbol.delete),
229
310
  id: symbol.id,
230
311
  });
312
+
313
+ traceDeleteSymbol(symbol.id);
231
314
  }
232
315
 
233
316
  /** Stop all watchers and clear tracked state. Called when a new render begins. */