@alloy-js/core 0.23.0-dev.10 → 0.23.0-dev.12
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/dev/src/binder.js +488 -0
- package/dist/dev/src/binder.js.map +1 -0
- package/dist/dev/src/code.js +181 -0
- package/dist/dev/src/code.js.map +1 -0
- package/dist/dev/src/components/AccessExpression.js +230 -0
- package/dist/dev/src/components/AccessExpression.js.map +1 -0
- package/dist/dev/src/components/AccessExpression.test.js +237 -0
- package/dist/dev/src/components/AccessExpression.test.js.map +1 -0
- package/dist/dev/src/components/AppendFile.js +246 -0
- package/dist/dev/src/components/AppendFile.js.map +1 -0
- package/dist/dev/src/components/Block.js +66 -0
- package/dist/dev/src/components/Block.js.map +1 -0
- package/dist/dev/src/components/CopyFile.js +16 -0
- package/dist/dev/src/components/CopyFile.js.map +1 -0
- package/dist/dev/src/components/Declaration.js +70 -0
- package/dist/dev/src/components/Declaration.js.map +1 -0
- package/dist/dev/src/components/For.js +40 -0
- package/dist/dev/src/components/For.js.map +1 -0
- package/dist/dev/src/components/Indent.js +37 -0
- package/dist/dev/src/components/Indent.js.map +1 -0
- package/dist/dev/src/components/List.js +29 -0
- package/dist/dev/src/components/List.js.map +1 -0
- package/dist/dev/src/components/MemberDeclaration.js +70 -0
- package/dist/dev/src/components/MemberDeclaration.js.map +1 -0
- package/dist/dev/src/components/MemberName.js +11 -0
- package/dist/dev/src/components/MemberName.js.map +1 -0
- package/dist/dev/src/components/MemberScope.js +57 -0
- package/dist/dev/src/components/MemberScope.js.map +1 -0
- package/dist/dev/src/components/Name.js +11 -0
- package/dist/dev/src/components/Name.js.map +1 -0
- package/dist/dev/src/components/Output.js +72 -0
- package/dist/dev/src/components/Output.js.map +1 -0
- package/dist/dev/src/components/Prose.js +32 -0
- package/dist/dev/src/components/Prose.js.map +1 -0
- package/dist/dev/src/components/ReferenceOrContent.js +12 -0
- package/dist/dev/src/components/ReferenceOrContent.js.map +1 -0
- package/dist/dev/src/components/Scope.js +50 -0
- package/dist/dev/src/components/Scope.js.map +1 -0
- package/dist/dev/src/components/Show.js +4 -0
- package/dist/dev/src/components/Show.js.map +1 -0
- package/dist/dev/src/components/SourceDirectory.js +41 -0
- package/dist/dev/src/components/SourceDirectory.js.map +1 -0
- package/dist/dev/src/components/SourceFile.js +52 -0
- package/dist/dev/src/components/SourceFile.js.map +1 -0
- package/dist/dev/src/components/StatementList.js +20 -0
- package/dist/dev/src/components/StatementList.js.map +1 -0
- package/dist/dev/src/components/Switch.js +42 -0
- package/dist/dev/src/components/Switch.js.map +1 -0
- package/dist/dev/src/components/TemplateFile.js +153 -0
- package/dist/dev/src/components/TemplateFile.js.map +1 -0
- package/dist/dev/src/components/UpdateFile.js +71 -0
- package/dist/dev/src/components/UpdateFile.js.map +1 -0
- package/dist/dev/src/components/Wrap.js +18 -0
- package/dist/dev/src/components/Wrap.js.map +1 -0
- package/dist/dev/src/components/index.js +25 -0
- package/dist/dev/src/components/index.js.map +1 -0
- package/dist/dev/src/components/stc/index.js +27 -0
- package/dist/dev/src/components/stc/index.js.map +1 -0
- package/dist/dev/src/components/stc/sti.js +10 -0
- package/dist/dev/src/components/stc/sti.js.map +1 -0
- package/dist/dev/src/content-slot.js +78 -0
- package/dist/dev/src/content-slot.js.map +1 -0
- package/dist/dev/src/content-slot.test.js +89 -0
- package/dist/dev/src/content-slot.test.js.map +1 -0
- package/dist/dev/src/context/assignment.js +46 -0
- package/dist/dev/src/context/assignment.js.map +1 -0
- package/dist/dev/src/context/binder.js +12 -0
- package/dist/dev/src/context/binder.js.map +1 -0
- package/dist/dev/src/context/declaration.js +3 -0
- package/dist/dev/src/context/declaration.js.map +1 -0
- package/dist/dev/src/context/format-options.js +32 -0
- package/dist/dev/src/context/format-options.js.map +1 -0
- package/dist/dev/src/context/index.js +11 -0
- package/dist/dev/src/context/index.js.map +1 -0
- package/dist/dev/src/context/member-declaration.js +11 -0
- package/dist/dev/src/context/member-declaration.js.map +1 -0
- package/dist/dev/src/context/member-scope.js +12 -0
- package/dist/dev/src/context/member-scope.js.map +1 -0
- package/dist/dev/src/context/name-policy.js +13 -0
- package/dist/dev/src/context/name-policy.js.map +1 -0
- package/dist/dev/src/context/scope.js +13 -0
- package/dist/dev/src/context/scope.js.map +1 -0
- package/dist/dev/src/context/source-directory.js +3 -0
- package/dist/dev/src/context/source-directory.js.map +1 -0
- package/dist/dev/src/context/source-file.js +3 -0
- package/dist/dev/src/context/source-file.js.map +1 -0
- package/dist/dev/src/context.js +47 -0
- package/dist/dev/src/context.js.map +1 -0
- package/dist/dev/src/debug/cli.js +163 -0
- package/dist/dev/src/debug/cli.js.map +1 -0
- package/dist/dev/src/debug/diagnostics.test.js +50 -0
- package/dist/dev/src/debug/diagnostics.test.js.map +1 -0
- package/dist/dev/src/debug/effects.js +293 -0
- package/dist/dev/src/debug/effects.js.map +1 -0
- package/dist/dev/src/debug/effects.test.js +280 -0
- package/dist/dev/src/debug/effects.test.js.map +1 -0
- package/dist/dev/src/debug/files.js +29 -0
- package/dist/dev/src/debug/files.js.map +1 -0
- package/dist/dev/src/debug/files.test.js +78 -0
- package/dist/dev/src/debug/files.test.js.map +1 -0
- package/dist/dev/src/debug/index.js +71 -0
- package/dist/dev/src/debug/index.js.map +1 -0
- package/dist/dev/src/debug/message-format.test.js +836 -0
- package/dist/dev/src/debug/message-format.test.js.map +1 -0
- package/dist/dev/src/debug/render-tree-orphans.test.js +365 -0
- package/dist/dev/src/debug/render-tree-orphans.test.js.map +1 -0
- package/dist/dev/src/debug/render.js +479 -0
- package/dist/dev/src/debug/render.js.map +1 -0
- package/dist/dev/src/debug/render.test.js +363 -0
- package/dist/dev/src/debug/render.test.js.map +1 -0
- package/dist/dev/src/debug/serialize.js +70 -0
- package/dist/dev/src/debug/serialize.js.map +1 -0
- package/dist/dev/src/debug/source-map.js +111 -0
- package/dist/dev/src/debug/source-map.js.map +1 -0
- package/dist/dev/src/debug/symbols.js +196 -0
- package/dist/dev/src/debug/symbols.js.map +1 -0
- package/dist/dev/src/debug/symbols.test.js +93 -0
- package/dist/dev/src/debug/symbols.test.js.map +1 -0
- package/dist/dev/src/debug/trace-writer.js +658 -0
- package/dist/dev/src/debug/trace-writer.js.map +1 -0
- package/dist/dev/src/debug/trace.js +459 -0
- package/dist/dev/src/debug/trace.js.map +1 -0
- package/dist/dev/src/devtools/devtools-protocol.js +2 -0
- package/dist/dev/src/devtools/devtools-protocol.js.map +1 -0
- package/dist/dev/src/devtools/devtools-server.browser.js +33 -0
- package/dist/dev/src/devtools/devtools-server.browser.js.map +1 -0
- package/dist/dev/src/devtools/devtools-server.js +444 -0
- package/dist/dev/src/devtools/devtools-server.js.map +1 -0
- package/dist/dev/src/devtools/devtools-transport.js +114 -0
- package/dist/dev/src/devtools/devtools-transport.js.map +1 -0
- package/dist/dev/src/devtools-entry.browser.js +2 -0
- package/dist/dev/src/devtools-entry.browser.js.map +1 -0
- package/dist/dev/src/devtools-entry.js +2 -0
- package/dist/dev/src/devtools-entry.js.map +1 -0
- package/dist/dev/src/diagnostics.js +89 -0
- package/dist/dev/src/diagnostics.js.map +1 -0
- package/dist/dev/src/host/alloy-host.browser.js +32 -0
- package/dist/dev/src/host/alloy-host.browser.js.map +1 -0
- package/dist/dev/src/host/alloy-host.js +144 -0
- package/dist/dev/src/host/alloy-host.js.map +1 -0
- package/dist/dev/src/host/interface.js +2 -0
- package/dist/dev/src/host/interface.js.map +1 -0
- package/dist/dev/src/index.browser.js +3 -0
- package/dist/dev/src/index.browser.js.map +1 -0
- package/dist/dev/src/index.js +27 -0
- package/dist/dev/src/index.js.map +1 -0
- package/dist/dev/src/inspect.browser.js +6 -0
- package/dist/dev/src/inspect.browser.js.map +1 -0
- package/dist/dev/src/inspect.js +2 -0
- package/dist/dev/src/inspect.js.map +1 -0
- package/dist/dev/src/jsx-runtime.js +17 -0
- package/dist/dev/src/jsx-runtime.js.map +1 -0
- package/dist/dev/src/library-symbol-reference.js +5 -0
- package/dist/dev/src/library-symbol-reference.js.map +1 -0
- package/dist/dev/src/name-policy.js +24 -0
- package/dist/dev/src/name-policy.js.map +1 -0
- package/dist/dev/src/pretty-string/pretty-string.js +100 -0
- package/dist/dev/src/pretty-string/pretty-string.js.map +1 -0
- package/dist/dev/src/pretty-string/pretty-string.test.js +38 -0
- package/dist/dev/src/pretty-string/pretty-string.test.js.map +1 -0
- package/dist/dev/src/print-hook.js +10 -0
- package/dist/dev/src/print-hook.js.map +1 -0
- package/dist/dev/src/props-combinators.js +109 -0
- package/dist/dev/src/props-combinators.js.map +1 -0
- package/dist/dev/src/reactive-union-set.js +213 -0
- package/dist/dev/src/reactive-union-set.js.map +1 -0
- package/dist/dev/src/reactivity.js +426 -0
- package/dist/dev/src/reactivity.js.map +1 -0
- package/dist/dev/src/refkey.js +167 -0
- package/dist/dev/src/refkey.js.map +1 -0
- package/dist/dev/src/render-stack.js +251 -0
- package/dist/dev/src/render-stack.js.map +1 -0
- package/dist/dev/src/render.js +872 -0
- package/dist/dev/src/render.js.map +1 -0
- package/dist/dev/src/resource.js +124 -0
- package/dist/dev/src/resource.js.map +1 -0
- package/dist/dev/src/runtime/component.js +41 -0
- package/dist/dev/src/runtime/component.js.map +1 -0
- package/dist/dev/src/runtime/intrinsic.js +12 -0
- package/dist/dev/src/runtime/intrinsic.js.map +1 -0
- package/dist/dev/src/scheduler.js +217 -0
- package/dist/dev/src/scheduler.js.map +1 -0
- package/dist/dev/src/stc.js +40 -0
- package/dist/dev/src/stc.js.map +1 -0
- package/dist/dev/src/sti.js +31 -0
- package/dist/dev/src/sti.js.map +1 -0
- package/dist/dev/src/symbols/basic-scope.js +21 -0
- package/dist/dev/src/symbols/basic-scope.js.map +1 -0
- package/dist/dev/src/symbols/basic-symbol.js +34 -0
- package/dist/dev/src/symbols/basic-symbol.js.map +1 -0
- package/dist/dev/src/symbols/decl.js +26 -0
- package/dist/dev/src/symbols/decl.js.map +1 -0
- package/dist/dev/src/symbols/index.js +10 -0
- package/dist/dev/src/symbols/index.js.map +1 -0
- package/dist/dev/src/symbols/output-scope.js +202 -0
- package/dist/dev/src/symbols/output-scope.js.map +1 -0
- package/dist/dev/src/symbols/output-space.js +36 -0
- package/dist/dev/src/symbols/output-space.js.map +1 -0
- package/dist/dev/src/symbols/output-symbol.js +504 -0
- package/dist/dev/src/symbols/output-symbol.js.map +1 -0
- package/dist/dev/src/symbols/symbol-flow.js +106 -0
- package/dist/dev/src/symbols/symbol-flow.js.map +1 -0
- package/dist/dev/src/symbols/symbol-slot.js +68 -0
- package/dist/dev/src/symbols/symbol-slot.js.map +1 -0
- package/dist/dev/src/symbols/symbol-slot.test.js +43 -0
- package/dist/dev/src/symbols/symbol-slot.test.js.map +1 -0
- package/dist/dev/src/symbols/symbol-table.js +93 -0
- package/dist/dev/src/symbols/symbol-table.js.map +1 -0
- package/dist/dev/src/tap.js +109 -0
- package/dist/dev/src/tap.js.map +1 -0
- package/dist/dev/src/trace.js +2 -0
- package/dist/dev/src/trace.js.map +1 -0
- package/dist/dev/src/tracer.js +180 -0
- package/dist/dev/src/tracer.js.map +1 -0
- package/dist/dev/src/utils.js +487 -0
- package/dist/dev/src/utils.js.map +1 -0
- package/dist/dev/src/write-output.js +47 -0
- package/dist/dev/src/write-output.js.map +1 -0
- package/dist/dev/test/browser-build.test.js +86 -0
- package/dist/dev/test/browser-build.test.js.map +1 -0
- package/dist/dev/test/children.test.js +44 -0
- package/dist/dev/test/children.test.js.map +1 -0
- package/dist/dev/test/components/append-file.test.js +394 -0
- package/dist/dev/test/components/append-file.test.js.map +1 -0
- package/dist/dev/test/components/block.test.js +83 -0
- package/dist/dev/test/components/block.test.js.map +1 -0
- package/dist/dev/test/components/copy-file.test.js +119 -0
- package/dist/dev/test/components/copy-file.test.js.map +1 -0
- package/dist/dev/test/components/declaration.test.js +40 -0
- package/dist/dev/test/components/declaration.test.js.map +1 -0
- package/dist/dev/test/components/list.test.js +250 -0
- package/dist/dev/test/components/list.test.js.map +1 -0
- package/dist/dev/test/components/prose.test.js +42 -0
- package/dist/dev/test/components/prose.test.js.map +1 -0
- package/dist/dev/test/components/reference-or-content.test.js +246 -0
- package/dist/dev/test/components/reference-or-content.test.js.map +1 -0
- package/dist/dev/test/components/source-file.test.js +271 -0
- package/dist/dev/test/components/source-file.test.js.map +1 -0
- package/dist/dev/test/components/template-file.test.js +200 -0
- package/dist/dev/test/components/template-file.test.js.map +1 -0
- package/dist/dev/test/components/update-file.test.js +210 -0
- package/dist/dev/test/components/update-file.test.js.map +1 -0
- package/dist/dev/test/components/wrap.test.js +48 -0
- package/dist/dev/test/components/wrap.test.js.map +1 -0
- package/dist/dev/test/control-flow/for.test.js +318 -0
- package/dist/dev/test/control-flow/for.test.js.map +1 -0
- package/dist/dev/test/control-flow/match.test.js +112 -0
- package/dist/dev/test/control-flow/match.test.js.map +1 -0
- package/dist/dev/test/control-flow/show.test.js +38 -0
- package/dist/dev/test/control-flow/show.test.js.map +1 -0
- package/dist/dev/test/lazy-isempty.test.js +121 -0
- package/dist/dev/test/lazy-isempty.test.js.map +1 -0
- package/dist/dev/test/name-policy.test.js +28 -0
- package/dist/dev/test/name-policy.test.js.map +1 -0
- package/dist/dev/test/props-with-defaults.test.js +94 -0
- package/dist/dev/test/props-with-defaults.test.js.map +1 -0
- package/dist/dev/test/reactive-union-set-disposers.test.js +98 -0
- package/dist/dev/test/reactive-union-set-disposers.test.js.map +1 -0
- package/dist/dev/test/reactive-union-set.test.js +171 -0
- package/dist/dev/test/reactive-union-set.test.js.map +1 -0
- package/dist/dev/test/reactivity/circular-reactives.test.js +62 -0
- package/dist/dev/test/reactivity/circular-reactives.test.js.map +1 -0
- package/dist/dev/test/reactivity/cleanup.test.js +96 -0
- package/dist/dev/test/reactivity/cleanup.test.js.map +1 -0
- package/dist/dev/test/reactivity/memo.test.js +17 -0
- package/dist/dev/test/reactivity/memo.test.js.map +1 -0
- package/dist/dev/test/reactivity/ref-rendering.test.js +38 -0
- package/dist/dev/test/reactivity/ref-rendering.test.js.map +1 -0
- package/dist/dev/test/reactivity/shallow-reactive.test.js +52 -0
- package/dist/dev/test/reactivity/shallow-reactive.test.js.map +1 -0
- package/dist/dev/test/reactivity/test.test.js +74 -0
- package/dist/dev/test/reactivity/test.test.js.map +1 -0
- package/dist/dev/test/reactivity/untrack.test.js +27 -0
- package/dist/dev/test/reactivity/untrack.test.js.map +1 -0
- package/dist/dev/test/refkey.test.js +36 -0
- package/dist/dev/test/refkey.test.js.map +1 -0
- package/dist/dev/test/rendering/basic.test.js +194 -0
- package/dist/dev/test/rendering/basic.test.js.map +1 -0
- package/dist/dev/test/rendering/code.test.js +64 -0
- package/dist/dev/test/rendering/code.test.js.map +1 -0
- package/dist/dev/test/rendering/formatting.test.js +797 -0
- package/dist/dev/test/rendering/formatting.test.js.map +1 -0
- package/dist/dev/test/rendering/indent.test.js +183 -0
- package/dist/dev/test/rendering/indent.test.js.map +1 -0
- package/dist/dev/test/rendering/memoization.test.js +37 -0
- package/dist/dev/test/rendering/memoization.test.js.map +1 -0
- package/dist/dev/test/rendering/print-render-stack.test.js +287 -0
- package/dist/dev/test/rendering/print-render-stack.test.js.map +1 -0
- package/dist/dev/test/rendering/refkeys.test.js +37 -0
- package/dist/dev/test/rendering/refkeys.test.js.map +1 -0
- package/dist/dev/test/scheduler-extended.test.js +96 -0
- package/dist/dev/test/scheduler-extended.test.js.map +1 -0
- package/dist/dev/test/scheduler.test.js +46 -0
- package/dist/dev/test/scheduler.test.js.map +1 -0
- package/dist/dev/test/split-props.test.js +78 -0
- package/dist/dev/test/split-props.test.js.map +1 -0
- package/dist/dev/test/stc.test.js +35 -0
- package/dist/dev/test/stc.test.js.map +1 -0
- package/dist/dev/test/symbols/output-scope.test.js +180 -0
- package/dist/dev/test/symbols/output-scope.test.js.map +1 -0
- package/dist/dev/test/symbols/output-symbol.test.js +202 -0
- package/dist/dev/test/symbols/output-symbol.test.js.map +1 -0
- package/dist/dev/test/symbols/resolution.test.js +487 -0
- package/dist/dev/test/symbols/resolution.test.js.map +1 -0
- package/dist/dev/test/symbols/symbol-table.test.js +15 -0
- package/dist/dev/test/symbols/symbol-table.test.js.map +1 -0
- package/dist/dev/test/symbols/utils.js +26 -0
- package/dist/dev/test/symbols/utils.js.map +1 -0
- package/dist/dev/test/utils.test.js +317 -0
- package/dist/dev/test/utils.test.js.map +1 -0
- package/dist/dev/testing/create-test-wrapper.js +76 -0
- package/dist/dev/testing/create-test-wrapper.js.map +1 -0
- package/dist/dev/testing/devtools-utils.js +162 -0
- package/dist/dev/testing/devtools-utils.js.map +1 -0
- package/dist/dev/testing/extend-expect.js +167 -0
- package/dist/dev/testing/extend-expect.js.map +1 -0
- package/dist/dev/testing/extend-expect.test.js +234 -0
- package/dist/dev/testing/extend-expect.test.js.map +1 -0
- package/dist/dev/testing/index.js +4 -0
- package/dist/dev/testing/index.js.map +1 -0
- package/dist/dev/testing/render.js +23 -0
- package/dist/dev/testing/render.js.map +1 -0
- package/dist/dev/testing/vitest.d.js +2 -0
- package/dist/dev/testing/vitest.d.js.map +1 -0
- 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 +119 -54
- 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 +91 -131
- 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/source-map.d.ts +22 -0
- package/dist/src/debug/source-map.d.ts.map +1 -0
- package/dist/src/debug/source-map.js +111 -0
- package/dist/src/debug/source-map.js.map +1 -0
- 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 +36 -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/test/browser-build.test.js +1 -1
- package/dist/test/browser-build.test.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 +9 -3
- 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 +198 -64
- 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 +196 -125
- package/src/debug/source-map.ts +135 -0
- 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 +41 -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/test/browser-build.test.ts +1 -1
- package/testing/devtools-utils.ts +46 -4
- package/vitest.config.ts +8 -0
package/src/debug/render.ts
CHANGED
|
@@ -13,11 +13,28 @@ import {
|
|
|
13
13
|
type PrintHook,
|
|
14
14
|
type RenderedTextTree,
|
|
15
15
|
} from "../print-hook.js";
|
|
16
|
-
import { untrack } from "../reactivity.js";
|
|
16
|
+
import { getContext, untrack } from "../reactivity.js";
|
|
17
17
|
import type { ComponentCreator } from "../runtime/component.js";
|
|
18
18
|
import { flushJobsAsync } from "../scheduler.js";
|
|
19
19
|
import { sanitizeRecord } from "./serialize.js";
|
|
20
|
-
import {
|
|
20
|
+
import { resolveComponentSource } from "./source-map.js";
|
|
21
|
+
import {
|
|
22
|
+
deleteDirectory,
|
|
23
|
+
deleteOutputFile,
|
|
24
|
+
insertDirectory,
|
|
25
|
+
insertOutputFile,
|
|
26
|
+
insertRenderError,
|
|
27
|
+
insertRenderNode,
|
|
28
|
+
isTraceEnabled,
|
|
29
|
+
notifyFlushComplete,
|
|
30
|
+
notifyRenderComplete,
|
|
31
|
+
notifyRenderReset,
|
|
32
|
+
deleteRenderNode as traceDeleteRenderNode,
|
|
33
|
+
updateRenderNodeProps as traceUpdateRenderNodeProps,
|
|
34
|
+
updateEffectComponentByContext,
|
|
35
|
+
updateRenderNodeContext,
|
|
36
|
+
} from "./trace-writer.js";
|
|
37
|
+
import { isDebugEnabled, logDevtoolsMessage } from "./trace.js";
|
|
21
38
|
|
|
22
39
|
/** The kind discriminant for render tree nodes. */
|
|
23
40
|
export type RenderTreeNodeKind = RenderTreeNode["kind"];
|
|
@@ -63,6 +80,10 @@ type TrackedNode = RenderedTextTree | PrintHook;
|
|
|
63
80
|
let nodeIds = new WeakMap<TrackedNode, number>();
|
|
64
81
|
let idToNode = new Map<number, TrackedNode>();
|
|
65
82
|
let entryIds = new WeakMap<RenderedTextTree, number[]>();
|
|
83
|
+
let nodeKinds = new WeakMap<
|
|
84
|
+
TrackedNode,
|
|
85
|
+
{ kind: string; name?: string; source?: RenderTreeNodeInfo["source"] }
|
|
86
|
+
>();
|
|
66
87
|
let fileNodes = new Map<number, { path: string; filetype: string }>();
|
|
67
88
|
let directoryNodes = new Map<number, { path: string }>();
|
|
68
89
|
let nodeProps = new Map<number, string | undefined>();
|
|
@@ -94,11 +115,7 @@ function serializeRenderTreeProps(input: Record<string, unknown> | undefined) {
|
|
|
94
115
|
|
|
95
116
|
function emitNodeRemoved(parentId: number | null, id: number) {
|
|
96
117
|
clearRenderTreeChildrenForId(id);
|
|
97
|
-
|
|
98
|
-
type: "render:nodeRemoved",
|
|
99
|
-
parentId,
|
|
100
|
-
id,
|
|
101
|
-
});
|
|
118
|
+
traceDeleteRenderNode(id);
|
|
102
119
|
|
|
103
120
|
rerenderActions.delete(id);
|
|
104
121
|
nodeProps.delete(id);
|
|
@@ -106,19 +123,13 @@ function emitNodeRemoved(parentId: number | null, id: number) {
|
|
|
106
123
|
|
|
107
124
|
const fileInfo = fileNodes.get(id);
|
|
108
125
|
if (fileInfo) {
|
|
109
|
-
|
|
110
|
-
type: "files:fileRemoved",
|
|
111
|
-
path: fileInfo.path,
|
|
112
|
-
});
|
|
126
|
+
deleteOutputFile(fileInfo.path);
|
|
113
127
|
fileNodes.delete(id);
|
|
114
128
|
}
|
|
115
129
|
|
|
116
130
|
const dirInfo = directoryNodes.get(id);
|
|
117
131
|
if (dirInfo) {
|
|
118
|
-
|
|
119
|
-
type: "files:directoryRemoved",
|
|
120
|
-
path: dirInfo.path,
|
|
121
|
-
});
|
|
132
|
+
deleteDirectory(dirInfo.path);
|
|
122
133
|
directoryNodes.delete(id);
|
|
123
134
|
}
|
|
124
135
|
}
|
|
@@ -134,7 +145,13 @@ function getEntryList(parent: RenderedTextTree) {
|
|
|
134
145
|
|
|
135
146
|
function getOrCreateNodeId(node: TrackedNode) {
|
|
136
147
|
const existing = nodeIds.get(node);
|
|
137
|
-
if (existing)
|
|
148
|
+
if (existing) {
|
|
149
|
+
// Restore reverse mapping — emitNodeRemoved deletes idToNode but nodeIds
|
|
150
|
+
// (WeakMap) survives. Without this, clearRenderTreeChildrenForId can't
|
|
151
|
+
// find the node on the next cleanup, leaving orphaned children in the DB.
|
|
152
|
+
idToNode.set(existing, node);
|
|
153
|
+
return existing;
|
|
154
|
+
}
|
|
138
155
|
const id = nextId++;
|
|
139
156
|
nodeIds.set(node, id);
|
|
140
157
|
idToNode.set(id, node);
|
|
@@ -142,7 +159,7 @@ function getOrCreateNodeId(node: TrackedNode) {
|
|
|
142
159
|
}
|
|
143
160
|
|
|
144
161
|
export function getRenderNodeId(node: RenderedTextTree | PrintHook) {
|
|
145
|
-
if (!
|
|
162
|
+
if (!isDebugEnabled()) return undefined;
|
|
146
163
|
return getOrCreateNodeId(node);
|
|
147
164
|
}
|
|
148
165
|
|
|
@@ -152,33 +169,38 @@ function setEntryId(parent: RenderedTextTree, index: number, id: number) {
|
|
|
152
169
|
}
|
|
153
170
|
|
|
154
171
|
export function initialize(root: RenderedTextTree) {
|
|
155
|
-
if (!
|
|
172
|
+
if (!isDebugEnabled()) return;
|
|
156
173
|
ensureDevtoolsHandler();
|
|
157
174
|
nodeIds = new WeakMap();
|
|
158
175
|
idToNode = new Map();
|
|
159
176
|
entryIds = new WeakMap();
|
|
177
|
+
nodeKinds = new WeakMap();
|
|
160
178
|
fileNodes = new Map();
|
|
161
179
|
directoryNodes = new Map();
|
|
162
180
|
nodeProps = new Map();
|
|
163
181
|
rerenderActions = new Map();
|
|
164
182
|
nextId = 1;
|
|
165
|
-
|
|
183
|
+
notifyRenderReset();
|
|
166
184
|
const rootId = getOrCreateNodeId(root);
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
185
|
+
insertRenderNode(
|
|
186
|
+
rootId,
|
|
187
|
+
null,
|
|
188
|
+
"root",
|
|
189
|
+
undefined,
|
|
190
|
+
undefined,
|
|
191
|
+
undefined,
|
|
192
|
+
undefined,
|
|
193
|
+
undefined,
|
|
194
|
+
null,
|
|
195
|
+
undefined,
|
|
196
|
+
);
|
|
175
197
|
}
|
|
176
198
|
|
|
177
199
|
export function registerRenderNodeActions(
|
|
178
200
|
node: RenderedTextTree | PrintHook,
|
|
179
201
|
actions: RenderNodeActions,
|
|
180
202
|
) {
|
|
181
|
-
if (!
|
|
203
|
+
if (!isDebugEnabled()) return;
|
|
182
204
|
const id = getOrCreateNodeId(node);
|
|
183
205
|
rerenderActions.set(id, actions);
|
|
184
206
|
}
|
|
@@ -186,7 +208,7 @@ export function registerRenderNodeActions(
|
|
|
186
208
|
export function unregisterRenderNodeActions(
|
|
187
209
|
node: RenderedTextTree | PrintHook,
|
|
188
210
|
) {
|
|
189
|
-
if (!
|
|
211
|
+
if (!isDebugEnabled()) return;
|
|
190
212
|
const id = nodeIds.get(node);
|
|
191
213
|
if (id !== undefined) {
|
|
192
214
|
rerenderActions.delete(id);
|
|
@@ -223,18 +245,21 @@ export function recordTextNode(
|
|
|
223
245
|
index: number,
|
|
224
246
|
value: string,
|
|
225
247
|
) {
|
|
226
|
-
if (!
|
|
248
|
+
if (!isDebugEnabled()) return;
|
|
227
249
|
const id = nextId++;
|
|
228
250
|
setEntryId(parent, index, id);
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
251
|
+
insertRenderNode(
|
|
252
|
+
id,
|
|
253
|
+
getOrCreateNodeId(parent),
|
|
254
|
+
"text",
|
|
255
|
+
undefined,
|
|
256
|
+
undefined,
|
|
257
|
+
undefined,
|
|
258
|
+
undefined,
|
|
259
|
+
undefined,
|
|
260
|
+
null,
|
|
261
|
+
value,
|
|
262
|
+
);
|
|
238
263
|
}
|
|
239
264
|
|
|
240
265
|
function recordNodeAdded(
|
|
@@ -243,20 +268,30 @@ function recordNodeAdded(
|
|
|
243
268
|
node: RenderedTextTree | PrintHook,
|
|
244
269
|
info: RenderTreeNodeInfo,
|
|
245
270
|
) {
|
|
246
|
-
if (!
|
|
271
|
+
if (!isDebugEnabled()) return;
|
|
247
272
|
const id = getOrCreateNodeId(node);
|
|
248
273
|
if (info.propsSerialized !== undefined) {
|
|
249
274
|
nodeProps.set(id, info.propsSerialized);
|
|
250
275
|
}
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
id,
|
|
257
|
-
...info,
|
|
258
|
-
},
|
|
276
|
+
// Remember the kind and source so cached re-adds preserve them
|
|
277
|
+
nodeKinds.set(node, {
|
|
278
|
+
kind: info.kind,
|
|
279
|
+
name: info.name,
|
|
280
|
+
source: info.source,
|
|
259
281
|
});
|
|
282
|
+
setEntryId(parent, index, id);
|
|
283
|
+
insertRenderNode(
|
|
284
|
+
id,
|
|
285
|
+
getOrCreateNodeId(parent),
|
|
286
|
+
info.kind,
|
|
287
|
+
info.name,
|
|
288
|
+
info.propsSerialized,
|
|
289
|
+
info.source?.fileName,
|
|
290
|
+
info.source?.lineNumber,
|
|
291
|
+
info.source?.columnNumber,
|
|
292
|
+
null,
|
|
293
|
+
undefined,
|
|
294
|
+
);
|
|
260
295
|
}
|
|
261
296
|
|
|
262
297
|
function recordSubtreeAdded(
|
|
@@ -264,25 +299,35 @@ function recordSubtreeAdded(
|
|
|
264
299
|
subtree: RenderedTextTree,
|
|
265
300
|
info: RenderTreeNodeInfo = { kind: "fragment" },
|
|
266
301
|
) {
|
|
267
|
-
if (!
|
|
302
|
+
if (!isDebugEnabled()) return;
|
|
268
303
|
const parentId = getOrCreateNodeId(parentNode);
|
|
269
304
|
// Check if this node was previously rendered (cached) by seeing if it already has an ID
|
|
270
305
|
const existingId = nodeIds.get(subtree);
|
|
271
306
|
const isCached = existingId !== undefined;
|
|
272
307
|
const id = isCached ? existingId : getOrCreateNodeId(subtree);
|
|
308
|
+
// Merge source from previously-saved nodeKinds if the caller didn't provide one
|
|
309
|
+
const savedKind = nodeKinds.get(subtree);
|
|
310
|
+
const source = info.source ?? savedKind?.source;
|
|
311
|
+
// Remember the kind and source so cached re-adds preserve them
|
|
312
|
+
nodeKinds.set(subtree, { kind: info.kind, name: info.name, source });
|
|
273
313
|
// Track in entryIds so clearRenderTreeChildren can find and remove it
|
|
274
314
|
if (Array.isArray(parentNode)) {
|
|
275
315
|
const list = getEntryList(parentNode);
|
|
276
316
|
list.push(id);
|
|
277
317
|
}
|
|
278
|
-
|
|
279
|
-
|
|
318
|
+
insertRenderNode(
|
|
319
|
+
id,
|
|
280
320
|
parentId,
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
321
|
+
info.kind,
|
|
322
|
+
info.name,
|
|
323
|
+
info.propsSerialized,
|
|
324
|
+
source?.fileName,
|
|
325
|
+
source?.lineNumber,
|
|
326
|
+
source?.columnNumber,
|
|
327
|
+
null,
|
|
328
|
+
undefined,
|
|
329
|
+
);
|
|
330
|
+
|
|
286
331
|
// For cached nodes, we need to recursively re-add all their children since
|
|
287
332
|
// clearRenderTreeChildren removed them when the parent re-rendered
|
|
288
333
|
if (isCached) {
|
|
@@ -297,9 +342,15 @@ function recordSubtreeAdded(
|
|
|
297
342
|
* to be explicitly re-added.
|
|
298
343
|
*/
|
|
299
344
|
function recordCachedSubtreeChildrenRecursively(node: RenderedTextTree) {
|
|
300
|
-
if (!
|
|
345
|
+
if (!isDebugEnabled()) return;
|
|
301
346
|
const parentId = getOrCreateNodeId(node);
|
|
302
347
|
|
|
348
|
+
// Clear any previously-recorded children from the DB before re-adding.
|
|
349
|
+
// The in-memory tree may have changed since the last cached re-add
|
|
350
|
+
// (e.g., a memo inside the cached subtree re-ran), so old DB children
|
|
351
|
+
// that are no longer in the tree would become orphans.
|
|
352
|
+
clearRenderTreeChildren(node);
|
|
353
|
+
|
|
303
354
|
// Rebuild the entryIds for this node
|
|
304
355
|
const list = getEntryList(node);
|
|
305
356
|
list.length = 0;
|
|
@@ -312,55 +363,70 @@ function recordCachedSubtreeChildrenRecursively(node: RenderedTextTree) {
|
|
|
312
363
|
const id = nextId++;
|
|
313
364
|
list.push(id);
|
|
314
365
|
idToNode.set(id, child as unknown as RenderedTextTree);
|
|
315
|
-
|
|
316
|
-
|
|
366
|
+
insertRenderNode(
|
|
367
|
+
id,
|
|
317
368
|
parentId,
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
369
|
+
"text",
|
|
370
|
+
undefined,
|
|
371
|
+
undefined,
|
|
372
|
+
undefined,
|
|
373
|
+
undefined,
|
|
374
|
+
undefined,
|
|
375
|
+
null,
|
|
376
|
+
child,
|
|
377
|
+
);
|
|
324
378
|
}
|
|
325
379
|
} else if (Array.isArray(child)) {
|
|
326
|
-
// Nested RenderedTextTree - record and recurse
|
|
380
|
+
// Nested RenderedTextTree - record and recurse, preserving original kind and source
|
|
327
381
|
const id = getOrCreateNodeId(child);
|
|
328
382
|
list.push(id);
|
|
329
|
-
|
|
330
|
-
|
|
383
|
+
const savedKind = nodeKinds.get(child);
|
|
384
|
+
insertRenderNode(
|
|
385
|
+
id,
|
|
331
386
|
parentId,
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
387
|
+
savedKind?.kind ?? "fragment",
|
|
388
|
+
savedKind?.name,
|
|
389
|
+
undefined,
|
|
390
|
+
savedKind?.source?.fileName,
|
|
391
|
+
savedKind?.source?.lineNumber,
|
|
392
|
+
savedKind?.source?.columnNumber,
|
|
393
|
+
null,
|
|
394
|
+
undefined,
|
|
395
|
+
);
|
|
337
396
|
recordCachedSubtreeChildrenRecursively(child);
|
|
338
397
|
} else if (isPrintHook(child)) {
|
|
339
398
|
// PrintHook - record and recurse into subtree
|
|
340
399
|
const id = getOrCreateNodeId(child);
|
|
341
400
|
list.push(id);
|
|
342
|
-
|
|
343
|
-
|
|
401
|
+
insertRenderNode(
|
|
402
|
+
id,
|
|
344
403
|
parentId,
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
404
|
+
"printHook",
|
|
405
|
+
(child as { name?: string }).name ?? "hook",
|
|
406
|
+
undefined,
|
|
407
|
+
undefined,
|
|
408
|
+
undefined,
|
|
409
|
+
undefined,
|
|
410
|
+
null,
|
|
411
|
+
undefined,
|
|
412
|
+
);
|
|
351
413
|
if (child.subtree) {
|
|
352
414
|
const subtreeId = getOrCreateNodeId(child.subtree);
|
|
353
415
|
const hookList = getEntryList(child as unknown as RenderedTextTree);
|
|
354
416
|
hookList.length = 0;
|
|
355
417
|
hookList.push(subtreeId);
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
418
|
+
insertRenderNode(
|
|
419
|
+
subtreeId,
|
|
420
|
+
id,
|
|
421
|
+
"fragment",
|
|
422
|
+
undefined,
|
|
423
|
+
undefined,
|
|
424
|
+
undefined,
|
|
425
|
+
undefined,
|
|
426
|
+
undefined,
|
|
427
|
+
null,
|
|
428
|
+
undefined,
|
|
429
|
+
);
|
|
364
430
|
recordCachedSubtreeChildrenRecursively(child.subtree);
|
|
365
431
|
}
|
|
366
432
|
}
|
|
@@ -371,20 +437,16 @@ function recordNodePropsUpdated(
|
|
|
371
437
|
node: RenderedTextTree | PrintHook,
|
|
372
438
|
propsSerialized: string | undefined,
|
|
373
439
|
) {
|
|
374
|
-
if (!
|
|
440
|
+
if (!isDebugEnabled()) return;
|
|
375
441
|
const id = getOrCreateNodeId(node);
|
|
376
442
|
const previous = nodeProps.get(id);
|
|
377
443
|
if (previous === propsSerialized) return;
|
|
378
444
|
nodeProps.set(id, propsSerialized);
|
|
379
|
-
|
|
380
|
-
type: "render:nodeUpdated",
|
|
381
|
-
id,
|
|
382
|
-
propsSerialized,
|
|
383
|
-
});
|
|
445
|
+
traceUpdateRenderNodeProps(id, propsSerialized);
|
|
384
446
|
}
|
|
385
447
|
|
|
386
448
|
function clearRenderTreeChildren(parent: RenderedTextTree) {
|
|
387
|
-
if (!
|
|
449
|
+
if (!isDebugEnabled()) return;
|
|
388
450
|
const list = entryIds.get(parent);
|
|
389
451
|
if (!list || list.length === 0) return;
|
|
390
452
|
const parentId = getOrCreateNodeId(parent);
|
|
@@ -403,9 +465,15 @@ function clearRenderTreeChildrenForId(id: number) {
|
|
|
403
465
|
clearRenderTreeChildren(node);
|
|
404
466
|
return;
|
|
405
467
|
}
|
|
468
|
+
// For PrintHook nodes: clear the subtree's children, then remove
|
|
469
|
+
// the subtree node itself (which is a child of this hook).
|
|
406
470
|
const subtree = (node as { subtree?: RenderedTextTree }).subtree;
|
|
407
471
|
if (subtree && Array.isArray(subtree)) {
|
|
408
472
|
clearRenderTreeChildren(subtree);
|
|
473
|
+
const subtreeId = nodeIds.get(subtree);
|
|
474
|
+
if (subtreeId !== undefined) {
|
|
475
|
+
emitNodeRemoved(id, subtreeId);
|
|
476
|
+
}
|
|
409
477
|
}
|
|
410
478
|
}
|
|
411
479
|
|
|
@@ -414,14 +482,11 @@ function clearRenderTreeChildrenForId(id: number) {
|
|
|
414
482
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
415
483
|
|
|
416
484
|
function recordDirectoryNode(node: RenderedTextTree, path: string) {
|
|
417
|
-
if (!
|
|
485
|
+
if (!isDebugEnabled()) return;
|
|
418
486
|
const id = getOrCreateNodeId(node);
|
|
419
487
|
if (directoryNodes.has(id)) return;
|
|
420
488
|
directoryNodes.set(id, { path });
|
|
421
|
-
|
|
422
|
-
type: "files:directoryAdded",
|
|
423
|
-
path,
|
|
424
|
-
});
|
|
489
|
+
insertDirectory(path);
|
|
425
490
|
}
|
|
426
491
|
|
|
427
492
|
function recordFileNode(
|
|
@@ -429,36 +494,25 @@ function recordFileNode(
|
|
|
429
494
|
path: string,
|
|
430
495
|
filetype: string,
|
|
431
496
|
) {
|
|
432
|
-
if (!
|
|
497
|
+
if (!isDebugEnabled()) return;
|
|
433
498
|
const id = getOrCreateNodeId(node);
|
|
434
499
|
if (fileNodes.has(id)) return;
|
|
435
500
|
fileNodes.set(id, { path, filetype });
|
|
436
|
-
|
|
437
|
-
type: "files:fileAdded",
|
|
438
|
-
path,
|
|
439
|
-
filetype,
|
|
440
|
-
renderNodeId: id,
|
|
441
|
-
});
|
|
501
|
+
insertOutputFile(path, filetype, id);
|
|
442
502
|
}
|
|
443
503
|
|
|
444
504
|
function removeFileEntriesForNode(node: RenderedTextTree | PrintHook) {
|
|
445
|
-
if (!
|
|
505
|
+
if (!isDebugEnabled()) return;
|
|
446
506
|
const id = nodeIds.get(node);
|
|
447
507
|
if (id === undefined) return;
|
|
448
508
|
const fileInfo = fileNodes.get(id);
|
|
449
509
|
if (fileInfo) {
|
|
450
|
-
|
|
451
|
-
type: "files:fileRemoved",
|
|
452
|
-
path: fileInfo.path,
|
|
453
|
-
});
|
|
510
|
+
deleteOutputFile(fileInfo.path);
|
|
454
511
|
fileNodes.delete(id);
|
|
455
512
|
}
|
|
456
513
|
const dirInfo = directoryNodes.get(id);
|
|
457
514
|
if (dirInfo) {
|
|
458
|
-
|
|
459
|
-
type: "files:directoryRemoved",
|
|
460
|
-
path: dirInfo.path,
|
|
461
|
-
});
|
|
515
|
+
deleteDirectory(dirInfo.path);
|
|
462
516
|
directoryNodes.delete(id);
|
|
463
517
|
}
|
|
464
518
|
}
|
|
@@ -482,7 +536,7 @@ export function beginComponent(
|
|
|
482
536
|
actions,
|
|
483
537
|
} = options;
|
|
484
538
|
|
|
485
|
-
if (!
|
|
539
|
+
if (!isDebugEnabled()) {
|
|
486
540
|
return {
|
|
487
541
|
recordDirectory() {},
|
|
488
542
|
recordFile() {},
|
|
@@ -501,6 +555,7 @@ export function beginComponent(
|
|
|
501
555
|
}
|
|
502
556
|
}
|
|
503
557
|
const propsSerialized = serializeRenderTreeProps(propsSource);
|
|
558
|
+
const resolvedSource = resolveComponentSource(source);
|
|
504
559
|
if (isExisting) {
|
|
505
560
|
clearRenderTreeChildren(node);
|
|
506
561
|
} else {
|
|
@@ -508,9 +563,17 @@ export function beginComponent(
|
|
|
508
563
|
kind: "component",
|
|
509
564
|
name: componentName,
|
|
510
565
|
propsSerialized,
|
|
511
|
-
source,
|
|
566
|
+
source: resolvedSource,
|
|
512
567
|
});
|
|
513
568
|
}
|
|
569
|
+
|
|
570
|
+
if (isTraceEnabled()) {
|
|
571
|
+
const ctx = getContext();
|
|
572
|
+
if (ctx) {
|
|
573
|
+
updateRenderNodeContext(getOrCreateNodeId(node), ctx.id);
|
|
574
|
+
updateEffectComponentByContext(ctx.id, componentName);
|
|
575
|
+
}
|
|
576
|
+
}
|
|
514
577
|
recordNodePropsUpdated(node, propsSerialized);
|
|
515
578
|
registerRenderNodeActions(node, actions);
|
|
516
579
|
|
|
@@ -610,7 +673,7 @@ export function error(
|
|
|
610
673
|
error: RenderErrorInfo,
|
|
611
674
|
componentStack: RenderErrorStackEntry[],
|
|
612
675
|
) {
|
|
613
|
-
if (!
|
|
676
|
+
if (!isDebugEnabled()) return;
|
|
614
677
|
const serializedStack = untrack(() =>
|
|
615
678
|
componentStack.map((entry) => ({
|
|
616
679
|
name: entry.name,
|
|
@@ -619,21 +682,29 @@ export function error(
|
|
|
619
682
|
source: entry.source,
|
|
620
683
|
})),
|
|
621
684
|
);
|
|
622
|
-
|
|
685
|
+
logDevtoolsMessage({
|
|
623
686
|
type: "render:error" as const,
|
|
624
687
|
id: nextErrorId++,
|
|
625
688
|
name: error.name,
|
|
626
689
|
message: error.message,
|
|
627
690
|
stack: error.stack,
|
|
628
691
|
componentStack: serializedStack,
|
|
629
|
-
};
|
|
630
|
-
|
|
692
|
+
});
|
|
693
|
+
|
|
694
|
+
insertRenderError(
|
|
695
|
+
error.name,
|
|
696
|
+
error.message,
|
|
697
|
+
error.stack,
|
|
698
|
+
JSON.stringify(serializedStack),
|
|
699
|
+
);
|
|
631
700
|
}
|
|
632
701
|
|
|
633
702
|
export function complete() {
|
|
634
|
-
|
|
703
|
+
logDevtoolsMessage({ type: "render:complete" });
|
|
704
|
+
notifyRenderComplete();
|
|
635
705
|
}
|
|
636
706
|
|
|
637
707
|
export function flushJobsComplete() {
|
|
638
|
-
|
|
708
|
+
logDevtoolsMessage({ type: "flushJobs:complete" });
|
|
709
|
+
notifyFlushComplete();
|
|
639
710
|
}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared source-map resolution utilities.
|
|
3
|
+
*
|
|
4
|
+
* Used by both effect source capture (effects.ts) and component source
|
|
5
|
+
* resolution (render.ts) to convert file paths and resolve source maps.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { SourceLocation } from "../devtools/devtools-protocol.js";
|
|
9
|
+
|
|
10
|
+
// Lazily loaded findSourceMap from node:module
|
|
11
|
+
let findSourceMap:
|
|
12
|
+
| ((path: string) =>
|
|
13
|
+
| {
|
|
14
|
+
findEntry: (
|
|
15
|
+
line: number,
|
|
16
|
+
col: number,
|
|
17
|
+
) =>
|
|
18
|
+
| {
|
|
19
|
+
originalSource: string;
|
|
20
|
+
originalLine: number;
|
|
21
|
+
originalColumn: number;
|
|
22
|
+
}
|
|
23
|
+
| undefined;
|
|
24
|
+
}
|
|
25
|
+
| undefined)
|
|
26
|
+
| undefined;
|
|
27
|
+
let loaded = false;
|
|
28
|
+
let realpathSync: ((path: string) => string) | undefined;
|
|
29
|
+
let fileURLToPath: ((url: string | URL) => string) | undefined;
|
|
30
|
+
const realpathCache = new Map<string, string>();
|
|
31
|
+
|
|
32
|
+
export function loadSourceMapSupport() {
|
|
33
|
+
if (loaded) return;
|
|
34
|
+
loaded = true;
|
|
35
|
+
try {
|
|
36
|
+
const mod = process.getBuiltinModule?.("node:module") as
|
|
37
|
+
| typeof import("node:module")
|
|
38
|
+
| undefined;
|
|
39
|
+
if (mod && typeof mod.findSourceMap === "function") {
|
|
40
|
+
findSourceMap = mod.findSourceMap as typeof findSourceMap;
|
|
41
|
+
}
|
|
42
|
+
} catch {
|
|
43
|
+
// not available
|
|
44
|
+
}
|
|
45
|
+
try {
|
|
46
|
+
const fs = process.getBuiltinModule?.("node:fs") as
|
|
47
|
+
| typeof import("node:fs")
|
|
48
|
+
| undefined;
|
|
49
|
+
if (fs) {
|
|
50
|
+
realpathSync = fs.realpathSync;
|
|
51
|
+
}
|
|
52
|
+
} catch {
|
|
53
|
+
// not available
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
const url = process.getBuiltinModule?.("node:url") as
|
|
57
|
+
| typeof import("node:url")
|
|
58
|
+
| undefined;
|
|
59
|
+
if (url) {
|
|
60
|
+
fileURLToPath = url.fileURLToPath;
|
|
61
|
+
}
|
|
62
|
+
} catch {
|
|
63
|
+
// not available
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export function getRealPath(fileName: string): string {
|
|
68
|
+
if (!realpathSync) return fileName;
|
|
69
|
+
let real = realpathCache.get(fileName);
|
|
70
|
+
if (real === undefined) {
|
|
71
|
+
try {
|
|
72
|
+
real = realpathSync(fileName);
|
|
73
|
+
} catch {
|
|
74
|
+
real = fileName;
|
|
75
|
+
}
|
|
76
|
+
realpathCache.set(fileName, real);
|
|
77
|
+
}
|
|
78
|
+
return real;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export function resolveSourceMap(
|
|
82
|
+
fileName: string,
|
|
83
|
+
line: number,
|
|
84
|
+
col: number,
|
|
85
|
+
): { fileName: string; line: number; col: number } {
|
|
86
|
+
if (!findSourceMap) return { fileName, line, col };
|
|
87
|
+
// pnpm uses symlinks; findSourceMap only matches the real path
|
|
88
|
+
const real = getRealPath(fileName);
|
|
89
|
+
const map = findSourceMap(real);
|
|
90
|
+
if (!map) return { fileName, line, col };
|
|
91
|
+
const entry = map.findEntry(line - 1, col - 1);
|
|
92
|
+
if (!entry) return { fileName, line, col };
|
|
93
|
+
return {
|
|
94
|
+
fileName: entry.originalSource,
|
|
95
|
+
line: entry.originalLine + 1,
|
|
96
|
+
col: entry.originalColumn + 1,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function stripFileUrl(path: string): string {
|
|
101
|
+
if (!path.startsWith("file://")) return path;
|
|
102
|
+
if (fileURLToPath) return fileURLToPath(path);
|
|
103
|
+
return new URL(path).pathname;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Resolve a component source location. Handles:
|
|
108
|
+
* - `file://` URLs from import.meta.url (converts to file path)
|
|
109
|
+
* - Source map resolution (maps compiled .js to original .tsx)
|
|
110
|
+
* - Plain absolute paths (legacy format, returned as-is)
|
|
111
|
+
*/
|
|
112
|
+
export function resolveComponentSource(
|
|
113
|
+
source: SourceLocation | undefined,
|
|
114
|
+
): SourceLocation | undefined {
|
|
115
|
+
if (!source?.fileName) return source;
|
|
116
|
+
loadSourceMapSupport();
|
|
117
|
+
|
|
118
|
+
const fileName = stripFileUrl(source.fileName);
|
|
119
|
+
|
|
120
|
+
if (source.lineNumber != null && source.columnNumber != null) {
|
|
121
|
+
// Resolve through source maps to get the original .tsx path
|
|
122
|
+
const resolved = resolveSourceMap(
|
|
123
|
+
fileName,
|
|
124
|
+
source.lineNumber,
|
|
125
|
+
source.columnNumber,
|
|
126
|
+
);
|
|
127
|
+
return {
|
|
128
|
+
fileName: stripFileUrl(resolved.fileName),
|
|
129
|
+
lineNumber: resolved.line,
|
|
130
|
+
columnNumber: resolved.col,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return { ...source, fileName };
|
|
135
|
+
}
|