@alloy-js/core 0.23.0-dev.0 → 0.23.0-dev.10

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 (316) hide show
  1. package/CHANGELOG.md +0 -22
  2. package/dist/devtools/index.html +68 -0
  3. package/dist/src/binder.d.ts +2 -0
  4. package/dist/src/binder.d.ts.map +1 -1
  5. package/dist/src/binder.js +55 -12
  6. package/dist/src/binder.js.map +1 -1
  7. package/dist/src/components/AccessExpression.d.ts +78 -0
  8. package/dist/src/components/AccessExpression.d.ts.map +1 -0
  9. package/dist/src/components/AccessExpression.js +218 -0
  10. package/dist/src/components/AccessExpression.js.map +1 -0
  11. package/dist/src/components/AccessExpression.test.d.ts +2 -0
  12. package/dist/src/components/AccessExpression.test.d.ts.map +1 -0
  13. package/dist/src/components/AccessExpression.test.js +137 -0
  14. package/dist/src/components/AccessExpression.test.js.map +1 -0
  15. package/dist/src/components/AppendFile.d.ts.map +1 -1
  16. package/dist/src/components/AppendFile.js +14 -3
  17. package/dist/src/components/AppendFile.js.map +1 -1
  18. package/dist/src/components/Block.js +1 -1
  19. package/dist/src/components/Block.js.map +1 -1
  20. package/dist/src/components/Declaration.d.ts.map +1 -1
  21. package/dist/src/components/Declaration.js +2 -1
  22. package/dist/src/components/Declaration.js.map +1 -1
  23. package/dist/src/components/Prose.js +2 -2
  24. package/dist/src/components/Prose.js.map +1 -1
  25. package/dist/src/components/Scope.d.ts.map +1 -1
  26. package/dist/src/components/Scope.js +6 -1
  27. package/dist/src/components/Scope.js.map +1 -1
  28. package/dist/src/components/SourceDirectory.d.ts.map +1 -1
  29. package/dist/src/components/SourceDirectory.js +1 -2
  30. package/dist/src/components/SourceDirectory.js.map +1 -1
  31. package/dist/src/components/TemplateFile.d.ts.map +1 -1
  32. package/dist/src/components/TemplateFile.js +18 -3
  33. package/dist/src/components/TemplateFile.js.map +1 -1
  34. package/dist/src/components/index.d.ts +1 -0
  35. package/dist/src/components/index.d.ts.map +1 -1
  36. package/dist/src/components/index.js +1 -0
  37. package/dist/src/components/index.js.map +1 -1
  38. package/dist/src/content-slot.d.ts.map +1 -1
  39. package/dist/src/content-slot.js +7 -6
  40. package/dist/src/content-slot.js.map +1 -1
  41. package/dist/src/context.d.ts.map +1 -1
  42. package/dist/src/context.js +10 -3
  43. package/dist/src/context.js.map +1 -1
  44. package/dist/src/debug/cli.d.ts +6 -0
  45. package/dist/src/debug/cli.d.ts.map +1 -0
  46. package/dist/src/{debug.js → debug/cli.js} +78 -84
  47. package/dist/src/debug/cli.js.map +1 -0
  48. package/dist/src/debug/diagnostics.test.d.ts +2 -0
  49. package/dist/src/debug/diagnostics.test.d.ts.map +1 -0
  50. package/dist/src/debug/diagnostics.test.js +45 -0
  51. package/dist/src/debug/diagnostics.test.js.map +1 -0
  52. package/dist/src/debug/effects.d.ts +73 -0
  53. package/dist/src/debug/effects.d.ts.map +1 -0
  54. package/dist/src/debug/effects.js +228 -0
  55. package/dist/src/debug/effects.js.map +1 -0
  56. package/dist/src/debug/effects.test.d.ts +2 -0
  57. package/dist/src/debug/effects.test.d.ts.map +1 -0
  58. package/dist/src/debug/effects.test.js +84 -0
  59. package/dist/src/debug/effects.test.js.map +1 -0
  60. package/dist/src/debug/files.d.ts +14 -0
  61. package/dist/src/debug/files.d.ts.map +1 -0
  62. package/dist/src/debug/files.js +40 -0
  63. package/dist/src/debug/files.js.map +1 -0
  64. package/dist/src/debug/files.test.d.ts +2 -0
  65. package/dist/src/debug/files.test.d.ts.map +1 -0
  66. package/dist/src/debug/files.test.js +89 -0
  67. package/dist/src/debug/files.test.js.map +1 -0
  68. package/dist/src/debug/index.d.ts +61 -0
  69. package/dist/src/debug/index.d.ts.map +1 -0
  70. package/dist/src/debug/index.js +69 -0
  71. package/dist/src/debug/index.js.map +1 -0
  72. package/dist/src/debug/render.d.ts +57 -0
  73. package/dist/src/debug/render.d.ts.map +1 -0
  74. package/dist/src/debug/render.js +519 -0
  75. package/dist/src/debug/render.js.map +1 -0
  76. package/dist/src/debug/render.test.d.ts +2 -0
  77. package/dist/src/debug/render.test.d.ts.map +1 -0
  78. package/dist/src/debug/render.test.js +328 -0
  79. package/dist/src/debug/render.test.js.map +1 -0
  80. package/dist/src/debug/serialize.d.ts +9 -0
  81. package/dist/src/debug/serialize.d.ts.map +1 -0
  82. package/dist/src/debug/serialize.js +70 -0
  83. package/dist/src/debug/serialize.js.map +1 -0
  84. package/dist/src/debug/symbols.d.ts +15 -0
  85. package/dist/src/debug/symbols.d.ts.map +1 -0
  86. package/dist/src/debug/symbols.js +173 -0
  87. package/dist/src/debug/symbols.js.map +1 -0
  88. package/dist/src/debug/symbols.test.d.ts +2 -0
  89. package/dist/src/debug/symbols.test.d.ts.map +1 -0
  90. package/dist/src/debug/symbols.test.js +104 -0
  91. package/dist/src/debug/symbols.test.js.map +1 -0
  92. package/dist/src/debug/trace.d.ts +342 -0
  93. package/dist/src/debug/trace.d.ts.map +1 -0
  94. package/dist/src/debug/trace.js +443 -0
  95. package/dist/src/debug/trace.js.map +1 -0
  96. package/dist/src/devtools/devtools-protocol.d.ts +232 -0
  97. package/dist/src/devtools/devtools-protocol.d.ts.map +1 -0
  98. package/dist/src/devtools/devtools-protocol.js +2 -0
  99. package/dist/src/devtools/devtools-protocol.js.map +1 -0
  100. package/dist/src/devtools/devtools-server.browser.d.ts +28 -0
  101. package/dist/src/devtools/devtools-server.browser.d.ts.map +1 -0
  102. package/dist/src/devtools/devtools-server.browser.js +36 -0
  103. package/dist/src/devtools/devtools-server.browser.js.map +1 -0
  104. package/dist/src/devtools/devtools-server.d.ts +72 -0
  105. package/dist/src/devtools/devtools-server.d.ts.map +1 -0
  106. package/dist/src/devtools/devtools-server.js +256 -0
  107. package/dist/src/devtools/devtools-server.js.map +1 -0
  108. package/dist/src/devtools/devtools-transport.d.ts +23 -0
  109. package/dist/src/devtools/devtools-transport.d.ts.map +1 -0
  110. package/dist/src/devtools/devtools-transport.js +114 -0
  111. package/dist/src/devtools/devtools-transport.js.map +1 -0
  112. package/dist/src/devtools-entry.browser.d.ts +4 -0
  113. package/dist/src/devtools-entry.browser.d.ts.map +1 -0
  114. package/dist/src/devtools-entry.browser.js +2 -0
  115. package/dist/src/devtools-entry.browser.js.map +1 -0
  116. package/dist/src/devtools-entry.d.ts +4 -0
  117. package/dist/src/devtools-entry.d.ts.map +1 -0
  118. package/dist/src/devtools-entry.js +2 -0
  119. package/dist/src/devtools-entry.js.map +1 -0
  120. package/dist/src/diagnostics.d.ts +34 -0
  121. package/dist/src/diagnostics.d.ts.map +1 -0
  122. package/dist/src/diagnostics.js +89 -0
  123. package/dist/src/diagnostics.js.map +1 -0
  124. package/dist/src/index.d.ts +3 -2
  125. package/dist/src/index.d.ts.map +1 -1
  126. package/dist/src/index.js +3 -2
  127. package/dist/src/index.js.map +1 -1
  128. package/dist/src/print-hook.d.ts +14 -0
  129. package/dist/src/print-hook.d.ts.map +1 -0
  130. package/dist/src/print-hook.js +10 -0
  131. package/dist/src/print-hook.js.map +1 -0
  132. package/dist/src/reactive-union-set.d.ts.map +1 -1
  133. package/dist/src/reactive-union-set.js +28 -3
  134. package/dist/src/reactive-union-set.js.map +1 -1
  135. package/dist/src/reactivity.d.ts +50 -8
  136. package/dist/src/reactivity.d.ts.map +1 -1
  137. package/dist/src/reactivity.js +225 -39
  138. package/dist/src/reactivity.js.map +1 -1
  139. package/dist/src/render-stack.d.ts +30 -0
  140. package/dist/src/render-stack.d.ts.map +1 -0
  141. package/dist/src/render-stack.js +251 -0
  142. package/dist/src/render-stack.js.map +1 -0
  143. package/dist/src/render.d.ts +9 -19
  144. package/dist/src/render.d.ts.map +1 -1
  145. package/dist/src/render.js +371 -159
  146. package/dist/src/render.js.map +1 -1
  147. package/dist/src/resource.d.ts.map +1 -1
  148. package/dist/src/resource.js +5 -0
  149. package/dist/src/resource.js.map +1 -1
  150. package/dist/src/runtime/component.d.ts +7 -1
  151. package/dist/src/runtime/component.d.ts.map +1 -1
  152. package/dist/src/runtime/component.js +4 -1
  153. package/dist/src/runtime/component.js.map +1 -1
  154. package/dist/src/scheduler.d.ts +8 -0
  155. package/dist/src/scheduler.d.ts.map +1 -1
  156. package/dist/src/scheduler.js +69 -3
  157. package/dist/src/scheduler.js.map +1 -1
  158. package/dist/src/symbols/basic-symbol.d.ts.map +1 -1
  159. package/dist/src/symbols/basic-symbol.js +6 -1
  160. package/dist/src/symbols/basic-symbol.js.map +1 -1
  161. package/dist/src/symbols/decl.d.ts.map +1 -1
  162. package/dist/src/symbols/decl.js +5 -1
  163. package/dist/src/symbols/decl.js.map +1 -1
  164. package/dist/src/symbols/output-scope.d.ts +2 -1
  165. package/dist/src/symbols/output-scope.d.ts.map +1 -1
  166. package/dist/src/symbols/output-scope.js +13 -8
  167. package/dist/src/symbols/output-scope.js.map +1 -1
  168. package/dist/src/symbols/output-symbol.d.ts +1 -0
  169. package/dist/src/symbols/output-symbol.d.ts.map +1 -1
  170. package/dist/src/symbols/output-symbol.js +25 -8
  171. package/dist/src/symbols/output-symbol.js.map +1 -1
  172. package/dist/src/symbols/symbol-flow.d.ts.map +1 -1
  173. package/dist/src/symbols/symbol-flow.js +24 -8
  174. package/dist/src/symbols/symbol-flow.js.map +1 -1
  175. package/dist/src/symbols/symbol-slot.d.ts.map +1 -1
  176. package/dist/src/symbols/symbol-slot.js +15 -0
  177. package/dist/src/symbols/symbol-slot.js.map +1 -1
  178. package/dist/src/symbols/symbol-slot.test.d.ts +2 -0
  179. package/dist/src/symbols/symbol-slot.test.d.ts.map +1 -0
  180. package/dist/src/symbols/symbol-slot.test.js +35 -0
  181. package/dist/src/symbols/symbol-slot.test.js.map +1 -0
  182. package/dist/src/symbols/symbol-table.d.ts.map +1 -1
  183. package/dist/src/symbols/symbol-table.js +6 -5
  184. package/dist/src/symbols/symbol-table.js.map +1 -1
  185. package/dist/src/trace.d.ts +2 -0
  186. package/dist/src/trace.d.ts.map +1 -0
  187. package/dist/src/trace.js +2 -0
  188. package/dist/src/trace.js.map +1 -0
  189. package/dist/src/tracer.d.ts +2 -228
  190. package/dist/src/tracer.d.ts.map +1 -1
  191. package/dist/src/tracer.js +5 -298
  192. package/dist/src/tracer.js.map +1 -1
  193. package/dist/src/utils.d.ts.map +1 -1
  194. package/dist/src/utils.js +7 -5
  195. package/dist/src/utils.js.map +1 -1
  196. package/dist/test/components/append-file.test.d.ts.map +1 -1
  197. package/dist/test/components/append-file.test.js +18 -10
  198. package/dist/test/components/append-file.test.js.map +1 -1
  199. package/dist/test/components/template-file.test.d.ts.map +1 -1
  200. package/dist/test/components/template-file.test.js +6 -4
  201. package/dist/test/components/template-file.test.js.map +1 -1
  202. package/dist/test/lazy-isempty.test.d.ts +2 -0
  203. package/dist/test/lazy-isempty.test.d.ts.map +1 -0
  204. package/dist/test/lazy-isempty.test.js +89 -0
  205. package/dist/test/lazy-isempty.test.js.map +1 -0
  206. package/dist/test/reactive-union-set-disposers.test.d.ts +2 -0
  207. package/dist/test/reactive-union-set-disposers.test.d.ts.map +1 -0
  208. package/dist/test/reactive-union-set-disposers.test.js +98 -0
  209. package/dist/test/reactive-union-set-disposers.test.js.map +1 -0
  210. package/dist/test/reactivity/shallow-reactive.test.d.ts +2 -0
  211. package/dist/test/reactivity/shallow-reactive.test.d.ts.map +1 -0
  212. package/dist/test/reactivity/shallow-reactive.test.js +52 -0
  213. package/dist/test/reactivity/shallow-reactive.test.js.map +1 -0
  214. package/dist/test/rendering/basic.test.js +3 -0
  215. package/dist/test/rendering/basic.test.js.map +1 -1
  216. package/dist/test/rendering/print-render-stack.test.d.ts +2 -0
  217. package/dist/test/rendering/print-render-stack.test.d.ts.map +1 -0
  218. package/dist/test/rendering/print-render-stack.test.js +207 -0
  219. package/dist/test/rendering/print-render-stack.test.js.map +1 -0
  220. package/dist/test/scheduler-extended.test.d.ts +2 -0
  221. package/dist/test/scheduler-extended.test.d.ts.map +1 -0
  222. package/dist/test/scheduler-extended.test.js +96 -0
  223. package/dist/test/scheduler-extended.test.js.map +1 -0
  224. package/dist/test/scheduler.test.d.ts +2 -0
  225. package/dist/test/scheduler.test.d.ts.map +1 -0
  226. package/dist/test/scheduler.test.js +46 -0
  227. package/dist/test/scheduler.test.js.map +1 -0
  228. package/dist/testing/create-test-wrapper.d.ts +1 -1
  229. package/dist/testing/create-test-wrapper.d.ts.map +1 -1
  230. package/dist/testing/create-test-wrapper.js +1 -1
  231. package/dist/testing/create-test-wrapper.js.map +1 -1
  232. package/dist/testing/devtools-utils.d.ts +26 -0
  233. package/dist/testing/devtools-utils.d.ts.map +1 -0
  234. package/dist/testing/devtools-utils.js +140 -0
  235. package/dist/testing/devtools-utils.js.map +1 -0
  236. package/dist/testing/extend-expect.d.ts.map +1 -1
  237. package/dist/testing/extend-expect.js +63 -1
  238. package/dist/testing/extend-expect.js.map +1 -1
  239. package/dist/testing/render.d.ts +2 -2
  240. package/dist/testing/render.d.ts.map +1 -1
  241. package/dist/testing/render.js +2 -2
  242. package/dist/testing/render.js.map +1 -1
  243. package/dist/tsconfig.tsbuildinfo +1 -1
  244. package/package.json +21 -7
  245. package/scripts/copy-devtools-ui.mjs +26 -0
  246. package/src/binder.ts +71 -16
  247. package/src/components/AccessExpression.test.tsx +132 -0
  248. package/src/components/AccessExpression.tsx +344 -0
  249. package/src/components/AppendFile.tsx +14 -9
  250. package/src/components/Block.tsx +1 -1
  251. package/src/components/Declaration.tsx +2 -1
  252. package/src/components/Prose.tsx +1 -1
  253. package/src/components/Scope.tsx +6 -1
  254. package/src/components/SourceDirectory.tsx +1 -2
  255. package/src/components/TemplateFile.tsx +18 -9
  256. package/src/components/index.tsx +1 -0
  257. package/src/content-slot.tsx +7 -7
  258. package/src/context.ts +17 -6
  259. package/src/{debug.ts → debug/cli.ts} +112 -127
  260. package/src/debug/diagnostics.test.tsx +55 -0
  261. package/src/debug/effects.test.tsx +89 -0
  262. package/src/debug/effects.ts +317 -0
  263. package/src/debug/files.test.tsx +96 -0
  264. package/src/debug/files.ts +40 -0
  265. package/src/debug/index.ts +128 -0
  266. package/src/debug/render.test.tsx +379 -0
  267. package/src/debug/render.ts +639 -0
  268. package/src/debug/serialize.ts +85 -0
  269. package/src/debug/symbols.test.tsx +106 -0
  270. package/src/debug/symbols.ts +239 -0
  271. package/src/debug/trace.ts +312 -0
  272. package/src/devtools/devtools-protocol.ts +312 -0
  273. package/src/devtools/devtools-server.browser.ts +71 -0
  274. package/src/devtools/devtools-server.ts +290 -0
  275. package/src/devtools/devtools-transport.ts +154 -0
  276. package/src/devtools-entry.browser.ts +52 -0
  277. package/src/devtools-entry.ts +54 -0
  278. package/src/diagnostics.ts +141 -0
  279. package/src/index.ts +2 -7
  280. package/src/print-hook.ts +22 -0
  281. package/src/reactive-union-set.ts +85 -44
  282. package/src/reactivity.ts +301 -59
  283. package/src/render-stack.ts +294 -0
  284. package/src/render.ts +470 -216
  285. package/src/resource.ts +28 -19
  286. package/src/runtime/component.ts +11 -0
  287. package/src/scheduler.ts +80 -4
  288. package/src/symbols/basic-symbol.ts +6 -1
  289. package/src/symbols/decl.ts +5 -1
  290. package/src/symbols/output-scope.ts +21 -13
  291. package/src/symbols/output-symbol.ts +34 -14
  292. package/src/symbols/symbol-flow.ts +76 -39
  293. package/src/symbols/symbol-slot.test.tsx +41 -0
  294. package/src/symbols/symbol-slot.tsx +47 -20
  295. package/src/symbols/symbol-table.ts +6 -10
  296. package/src/trace.ts +1 -0
  297. package/src/tracer.ts +13 -242
  298. package/src/utils.tsx +24 -17
  299. package/temp/api.json +4187 -1603
  300. package/test/components/append-file.test.tsx +36 -29
  301. package/test/components/template-file.test.tsx +11 -11
  302. package/test/lazy-isempty.test.tsx +106 -0
  303. package/test/reactive-union-set-disposers.test.tsx +112 -0
  304. package/test/reactivity/shallow-reactive.test.tsx +56 -0
  305. package/test/rendering/basic.test.tsx +4 -0
  306. package/test/rendering/print-render-stack.test.tsx +244 -0
  307. package/test/scheduler-extended.test.tsx +122 -0
  308. package/test/scheduler.test.tsx +50 -0
  309. package/testing/create-test-wrapper.tsx +1 -1
  310. package/testing/devtools-utils.ts +203 -0
  311. package/testing/extend-expect.ts +89 -0
  312. package/testing/render.ts +2 -2
  313. package/testing/vitest.d.ts +9 -0
  314. package/dist/src/debug.d.ts +0 -15
  315. package/dist/src/debug.d.ts.map +0 -1
  316. package/dist/src/debug.js.map +0 -1
@@ -1,127 +1,16 @@
1
- import { isReactive } from "@vue/reactivity";
2
1
  import Table from "cli-table3";
3
2
  import pc from "picocolors";
4
- import { contextsByKey } from "./context.js";
5
- import { Context, getContext } from "./reactivity.js";
3
+ import { contextsByKey } from "../context.js";
4
+ import { getContext, untrack } from "../reactivity.js";
5
+ import { isReactiveTarget } from "./effects.js";
6
6
 
7
- interface DebugInterface {
8
- component: {
9
- stack(): void;
10
- tree(): void;
11
- watch(): void;
12
- render(): void;
13
- context(): void;
14
- };
15
- }
16
-
17
- const debug: DebugInterface = {
18
- component: {
19
- stack: debugStack,
20
- tree() {
21
- //eslint-disable-next-line no-console
22
- console.log("tree");
23
- },
24
- watch() {
25
- //eslint-disable-next-line no-console
26
- console.log("watch");
27
- },
28
- render() {
29
- //eslint-disable-next-line no-console
30
- console.log("render");
31
- },
32
- context: debugContext,
33
- },
34
- };
35
-
36
- function debugStack() {
37
- let currentContext = getContext();
38
- let foundContexts: Context[] = [];
39
- while (currentContext !== null) {
40
- if (
41
- currentContext.context &&
42
- Object.getOwnPropertySymbols(currentContext.context)[0]
43
- ) {
44
- foundContexts.push(currentContext);
45
- }
46
-
47
- if (
48
- currentContext.componentOwner &&
49
- currentContext.componentOwner.component.name !== "Provider"
50
- ) {
51
- process.stdout.write(
52
- style.component.name(currentContext.componentOwner.component.name) +
53
- "\n",
54
- );
55
- const table = kvTable();
56
- const props = currentContext.componentOwner.props;
57
-
58
- table.push([
59
- { hAlign: "right", content: "props" },
60
- props && Object.keys(props).length > 0 ?
61
- dumpValue(props)
62
- : pc.gray("(none)"),
63
- ]);
64
-
65
- table.push([
66
- { hAlign: "right", content: "contexts" },
67
- foundContexts.length > 0 ?
68
- foundContexts.map((c) => printContext(c, true)).join("\n")
69
- : pc.gray("(none)"),
70
- ]);
71
-
72
- process.stdout.write(table.toString() + "\n\n");
73
- foundContexts = [];
74
- }
75
-
76
- currentContext = currentContext.owner;
77
- }
78
- }
79
-
80
- function debugContext() {
81
- let currentContext = getContext();
82
- while (currentContext !== null) {
83
- //eslint-disable-next-line no-console
84
- console.log(printContext(currentContext));
85
- currentContext = currentContext.owner;
86
- }
87
- }
88
- function printContext(context: Context, omitOwner: boolean = false) {
89
- if (!context.context) return "";
90
- const key = Object.getOwnPropertySymbols(context.context)[0];
91
- if (!key) return "";
92
- const contextDefinition = contextsByKey.get(key);
93
- const contextName = contextDefinition?.name ?? "unknown context";
94
- const value = context.context[key];
95
-
96
- let output = style.context.name(contextName);
97
- if (!omitOwner) {
98
- const owner = findContextOwner(context);
99
- output += " provided by " + style.component.name(owner);
100
- }
101
-
102
- output += "\n" + dumpValue(value) + "\n";
103
-
104
- return output;
105
- }
106
-
107
- function findContextOwner(context: Context) {
108
- let currentContext: Context | null = context;
109
- while (
110
- currentContext &&
111
- (currentContext.componentOwner === undefined ||
112
- currentContext.componentOwner.component.name === "Provider")
113
- ) {
114
- currentContext = currentContext.owner;
7
+ function reactiveTag(value: unknown) {
8
+ if (isReactiveTarget(value)) {
9
+ return " " + pc.greenBright(`reactive`) + " ";
115
10
  }
116
-
117
- return currentContext?.componentOwner?.component.name ?? "unknown";
118
- }
119
- declare global {
120
- var debug: DebugInterface;
11
+ return "";
121
12
  }
122
13
 
123
- globalThis.debug = debug;
124
-
125
14
  const style = {
126
15
  value: {
127
16
  primitive(value: string | number | boolean | null | undefined) {
@@ -151,13 +40,6 @@ const style = {
151
40
  },
152
41
  };
153
42
 
154
- function reactiveTag(value: unknown) {
155
- if (isReactive(value)) {
156
- return " " + pc.greenBright(`reactive`) + " ";
157
- }
158
- return "";
159
- }
160
-
161
43
  function dumpValue(value: unknown, level = 0) {
162
44
  switch (typeof value) {
163
45
  case "boolean":
@@ -210,6 +92,109 @@ function kvTable(sep = " ") {
210
92
  });
211
93
  }
212
94
 
213
- export function shouldDebug() {
214
- return typeof process !== "undefined" && !!process.env?.ALLOY_DEBUG;
95
+ function printContext(
96
+ context: ReturnType<typeof getContext>,
97
+ omitOwner = false,
98
+ ) {
99
+ if (!context?.context) return "";
100
+ const key = Object.getOwnPropertySymbols(context.context)[0];
101
+ if (!key) return "";
102
+ const contextDefinition = contextsByKey.get(key);
103
+ const contextName = contextDefinition?.name ?? "unknown context";
104
+ const value = context.context[key];
105
+
106
+ let output = style.context.name(contextName);
107
+ if (!omitOwner) {
108
+ const owner = findContextOwner(context);
109
+ output += " provided by " + style.component.name(owner);
110
+ }
111
+
112
+ output += "\n" + dumpValue(value) + "\n";
113
+
114
+ return output;
115
+ }
116
+
117
+ function findContextOwner(context: ReturnType<typeof getContext>) {
118
+ let currentContext = context;
119
+ while (
120
+ currentContext &&
121
+ (currentContext.componentOwner === undefined ||
122
+ currentContext.componentOwner.component.name === "Provider")
123
+ ) {
124
+ currentContext = currentContext.owner;
125
+ }
126
+
127
+ return currentContext?.componentOwner?.component.name ?? "unknown";
128
+ }
129
+
130
+ export function debugStack() {
131
+ untrack(() => {
132
+ let currentContext = getContext();
133
+ let foundContexts: (typeof currentContext)[] = [];
134
+ while (currentContext !== null) {
135
+ if (
136
+ currentContext.context &&
137
+ Object.getOwnPropertySymbols(currentContext.context)[0]
138
+ ) {
139
+ foundContexts.push(currentContext);
140
+ }
141
+
142
+ if (
143
+ currentContext.componentOwner &&
144
+ currentContext.componentOwner.component.name !== "Provider"
145
+ ) {
146
+ process.stdout.write(
147
+ style.component.name(currentContext.componentOwner.component.name) +
148
+ "\n",
149
+ );
150
+ const table = kvTable();
151
+ const props = currentContext.componentOwner.props;
152
+
153
+ table.push([
154
+ { hAlign: "right", content: "props" },
155
+ props && Object.keys(props).length > 0 ?
156
+ dumpValue(props)
157
+ : pc.gray("(none)"),
158
+ ]);
159
+
160
+ table.push([
161
+ { hAlign: "right", content: "contexts" },
162
+ foundContexts.length > 0 ?
163
+ foundContexts.map((c) => printContext(c, true)).join("\n")
164
+ : pc.gray("(none)"),
165
+ ]);
166
+
167
+ process.stdout.write(table.toString() + "\n\n");
168
+ foundContexts = [];
169
+ }
170
+
171
+ currentContext = currentContext.owner;
172
+ }
173
+ });
174
+ }
175
+
176
+ export function debugContext() {
177
+ untrack(() => {
178
+ let currentContext = getContext();
179
+ while (currentContext !== null) {
180
+ // eslint-disable-next-line no-console
181
+ console.log(printContext(currentContext));
182
+ currentContext = currentContext.owner;
183
+ }
184
+ });
185
+ }
186
+
187
+ export function debugTree() {
188
+ // eslint-disable-next-line no-console
189
+ console.log("tree");
190
+ }
191
+
192
+ export function debugWatch() {
193
+ // eslint-disable-next-line no-console
194
+ console.log("watch");
195
+ }
196
+
197
+ export function debugRender() {
198
+ // eslint-disable-next-line no-console
199
+ console.log("render");
215
200
  }
@@ -0,0 +1,55 @@
1
+ import { afterEach, beforeEach, expect, it } from "vitest";
2
+ import WebSocket from "ws";
3
+ import {
4
+ createMessageCollector,
5
+ type DevtoolsMessage,
6
+ } from "../../testing/devtools-utils.js";
7
+ import { Output } from "../components/Output.jsx";
8
+ import {
9
+ enableDevtools,
10
+ resetDevtoolsServerForTests,
11
+ } from "../devtools/devtools-server.js";
12
+ import { DiagnosticsCollector } from "../diagnostics.js";
13
+ import { renderAsync } from "../render.js";
14
+
15
+ let socket: WebSocket | undefined;
16
+
17
+ beforeEach(async () => {
18
+ const server = await enableDevtools({ port: 0 });
19
+ socket = new WebSocket(`ws://127.0.0.1:${server.port}`);
20
+
21
+ await new Promise<void>((resolve, reject) => {
22
+ socket?.once("open", resolve);
23
+ socket?.once("error", reject);
24
+ });
25
+ });
26
+
27
+ afterEach(async () => {
28
+ if (socket) {
29
+ socket.close();
30
+ socket = undefined;
31
+ }
32
+
33
+ await resetDevtoolsServerForTests();
34
+ });
35
+
36
+ it("emits diagnostics:report messages", async () => {
37
+ const collector = createMessageCollector(socket!);
38
+ const diagnostics = new DiagnosticsCollector();
39
+
40
+ diagnostics.emit({ message: "Test diagnostic", severity: "warning" });
41
+
42
+ await renderAsync(<Output>{"ok"}</Output>);
43
+
44
+ const messages = await collector.waitForRender();
45
+ const diagnosticsMessages = messages.filter(
46
+ (m: DevtoolsMessage) => m.type === "diagnostics:report",
47
+ );
48
+
49
+ collector.stop();
50
+
51
+ expect(diagnosticsMessages[0]).toMatchObject({
52
+ type: "diagnostics:report",
53
+ diagnostics: expect.any(Array),
54
+ });
55
+ });
@@ -0,0 +1,89 @@
1
+ import { afterEach, beforeEach, expect, it } from "vitest";
2
+ import WebSocket from "ws";
3
+ import {
4
+ createMessageCollector,
5
+ filterEffectsMessages,
6
+ } from "../../testing/devtools-utils.js";
7
+ import { Output } from "../components/Output.jsx";
8
+ import {
9
+ enableDevtools,
10
+ resetDevtoolsServerForTests,
11
+ } from "../devtools/devtools-server.js";
12
+ import { effect, ref } from "../reactivity.js";
13
+ import { renderAsync } from "../render.js";
14
+ import { debug } from "./index.js";
15
+
16
+ let socket: WebSocket | undefined;
17
+
18
+ beforeEach(async () => {
19
+ debug.effect.reset();
20
+
21
+ const server = await enableDevtools({ port: 0 });
22
+ socket = new WebSocket(`ws://127.0.0.1:${server.port}`);
23
+ await new Promise<void>((resolve, reject) => {
24
+ socket?.once("open", resolve);
25
+ socket?.once("error", reject);
26
+ });
27
+ });
28
+
29
+ afterEach(async () => {
30
+ if (socket) {
31
+ socket.close();
32
+ socket = undefined;
33
+ }
34
+
35
+ await resetDevtoolsServerForTests();
36
+ debug.effect.reset();
37
+ });
38
+
39
+ it("emits effect, ref, edge, and update messages", async () => {
40
+ const collector = createMessageCollector(socket!);
41
+ const r1 = ref(0);
42
+
43
+ // Create an effect that reads r1.
44
+ let observed = 0;
45
+ effect(() => {
46
+ observed = r1.value;
47
+ });
48
+
49
+ // Mutate r1 to trigger the effect.
50
+ r1.value = 42;
51
+
52
+ await renderAsync(<Output>{"ok"}</Output>);
53
+
54
+ const messages = await collector.waitForRender();
55
+ const effectsMessages = filterEffectsMessages(messages);
56
+ collector.stop();
57
+
58
+ // Check that core message types are present
59
+ const byType = (type: string) =>
60
+ effectsMessages.filter((m: any) => m.type === type);
61
+ expect(byType("effect:refAdded").length).toBeGreaterThanOrEqual(1);
62
+ expect(byType("effect:effectAdded").length).toBeGreaterThanOrEqual(1);
63
+ expect(byType("effect:track").length).toBeGreaterThanOrEqual(1);
64
+ expect(byType("effect:trigger").length).toBeGreaterThanOrEqual(1);
65
+ expect(byType("effect:effectUpdated").length).toBeGreaterThanOrEqual(1);
66
+
67
+ // Verify message shapes
68
+ expect(byType("effect:refAdded")[0]).toMatchObject({
69
+ ref: expect.objectContaining({ id: expect.any(Number), kind: "ref" }),
70
+ });
71
+ expect(byType("effect:effectAdded")[0]).toMatchObject({
72
+ effect: expect.objectContaining({ id: expect.any(Number) }),
73
+ });
74
+ expect(byType("effect:track")[0]).toMatchObject({
75
+ edge: expect.objectContaining({
76
+ type: "track",
77
+ effectId: expect.any(Number),
78
+ refId: expect.any(Number),
79
+ }),
80
+ });
81
+ expect(byType("effect:trigger")[0]).toMatchObject({
82
+ edge: expect.objectContaining({
83
+ effectId: expect.any(Number),
84
+ refId: expect.any(Number),
85
+ }),
86
+ });
87
+
88
+ expect(observed).toBe(42);
89
+ });