@alloy-js/core 0.24.0-dev.1 → 0.24.0-dev.6
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/CHANGELOG.md +8 -0
- package/dist/dev/src/components/AccessExpression.test.js +1 -1
- package/dist/dev/src/components/AccessExpression.test.js.map +1 -1
- package/dist/dev/src/components/Output.js +3 -2
- package/dist/dev/src/components/Output.js.map +1 -1
- package/dist/dev/src/components/SourceFile.js.map +1 -1
- package/dist/dev/src/content-slot.test.js +1 -1
- package/dist/dev/src/content-slot.test.js.map +1 -1
- package/dist/dev/src/context.js +30 -3
- package/dist/dev/src/context.js.map +1 -1
- package/dist/dev/src/debug/cli.browser.js +14 -0
- package/dist/dev/src/debug/cli.browser.js.map +1 -0
- package/dist/dev/src/debug/diagnostics.test.js +1 -1
- package/dist/dev/src/debug/diagnostics.test.js.map +1 -1
- package/dist/dev/src/debug/effects.test.js +1 -1
- package/dist/dev/src/debug/effects.test.js.map +1 -1
- package/dist/dev/src/debug/file-streaming.js +103 -0
- package/dist/dev/src/debug/file-streaming.js.map +1 -0
- package/dist/dev/src/debug/files.test.js +4 -5
- package/dist/dev/src/debug/files.test.js.map +1 -1
- package/dist/dev/src/debug/index.js +4 -6
- package/dist/dev/src/debug/index.js.map +1 -1
- package/dist/dev/src/debug/message-format.test.js +50 -52
- package/dist/dev/src/debug/message-format.test.js.map +1 -1
- package/dist/dev/src/debug/render-tree-orphans.test.js +13 -23
- package/dist/dev/src/debug/render-tree-orphans.test.js.map +1 -1
- package/dist/dev/src/debug/render.js +529 -352
- package/dist/dev/src/debug/render.js.map +1 -1
- package/dist/dev/src/debug/render.test.js +171 -92
- package/dist/dev/src/debug/render.test.js.map +1 -1
- package/dist/dev/src/debug/trace-db.browser.js +11 -0
- package/dist/dev/src/debug/trace-db.browser.js.map +1 -0
- package/dist/dev/src/debug/trace-db.js +40 -0
- package/dist/dev/src/debug/trace-db.js.map +1 -0
- package/dist/dev/src/debug/trace-writer.js +130 -39
- package/dist/dev/src/debug/trace-writer.js.map +1 -1
- package/dist/dev/src/debug/trace.js +0 -36
- package/dist/dev/src/debug/trace.js.map +1 -1
- package/dist/dev/src/devtools/devtools-server.js +55 -32
- package/dist/dev/src/devtools/devtools-server.js.map +1 -1
- package/dist/dev/src/devtools-entry.browser.js.map +1 -1
- package/dist/dev/src/devtools-entry.js.map +1 -1
- package/dist/dev/src/diagnostics.js +19 -1
- package/dist/dev/src/diagnostics.js.map +1 -1
- package/dist/dev/src/index.js +5 -2
- package/dist/dev/src/index.js.map +1 -1
- package/dist/dev/src/jsx-runtime.js +14 -8
- package/dist/dev/src/jsx-runtime.js.map +1 -1
- package/dist/dev/src/output-types.js +2 -0
- package/dist/dev/src/output-types.js.map +1 -0
- package/dist/dev/src/reactivity.js +155 -13
- package/dist/dev/src/reactivity.js.map +1 -1
- package/dist/dev/src/render/get-string-width.js +61 -0
- package/dist/dev/src/render/get-string-width.js.map +1 -0
- package/dist/dev/src/render/index.js +2 -0
- package/dist/dev/src/render/index.js.map +1 -0
- package/dist/dev/src/render/node-context.js +7 -0
- package/dist/dev/src/render/node-context.js.map +1 -0
- package/dist/dev/src/render/node.js +386 -0
- package/dist/dev/src/render/node.js.map +1 -0
- package/dist/dev/src/render/printer-support.js +180 -0
- package/dist/dev/src/render/printer-support.js.map +1 -0
- package/dist/dev/src/render/printer.js +797 -0
- package/dist/dev/src/render/printer.js.map +1 -0
- package/dist/dev/src/render-error.js +79 -0
- package/dist/dev/src/render-error.js.map +1 -0
- package/dist/dev/src/render-output.js +209 -0
- package/dist/dev/src/render-output.js.map +1 -0
- package/dist/dev/src/runtime/create-intrinsic.js +53 -0
- package/dist/dev/src/runtime/create-intrinsic.js.map +1 -0
- package/dist/dev/src/runtime/fragment.js +21 -0
- package/dist/dev/src/runtime/fragment.js.map +1 -0
- package/dist/dev/src/runtime/index.js +13 -0
- package/dist/dev/src/runtime/index.js.map +1 -0
- package/dist/dev/src/runtime/insert.js +453 -0
- package/dist/dev/src/runtime/insert.js.map +1 -0
- package/dist/dev/src/runtime/intrinsic.js +1 -11
- package/dist/dev/src/runtime/intrinsic.js.map +1 -1
- package/dist/dev/src/scheduler.js +38 -14
- package/dist/dev/src/scheduler.js.map +1 -1
- package/dist/dev/src/stc.js +2 -0
- package/dist/dev/src/stc.js.map +1 -1
- package/dist/dev/src/sti.js +1 -1
- package/dist/dev/src/sti.js.map +1 -1
- package/dist/dev/src/symbols/symbol-slot.test.js +1 -1
- package/dist/dev/src/symbols/symbol-slot.test.js.map +1 -1
- package/dist/dev/src/test-render.js +78 -0
- package/dist/dev/src/test-render.js.map +1 -0
- package/dist/dev/src/utils.js +47 -35
- package/dist/dev/src/utils.js.map +1 -1
- package/dist/dev/test/babel-e2e.test.js +218 -0
- package/dist/dev/test/babel-e2e.test.js.map +1 -0
- package/dist/dev/test/browser-build.test.js +70 -9
- package/dist/dev/test/browser-build.test.js.map +1 -1
- package/dist/dev/test/components/block.test.js +1 -1
- package/dist/dev/test/components/block.test.js.map +1 -1
- package/dist/dev/test/components/copy-file.test.js +7 -7
- package/dist/dev/test/components/copy-file.test.js.map +1 -1
- package/dist/dev/test/components/update-file.test.js +1 -1
- package/dist/dev/test/components/update-file.test.js.map +1 -1
- package/dist/dev/test/components/wrap.test.js +1 -1
- package/dist/dev/test/components/wrap.test.js.map +1 -1
- package/dist/dev/test/control-flow/match.test.js +1 -1
- package/dist/dev/test/control-flow/match.test.js.map +1 -1
- package/dist/dev/test/control-flow/show.test.js +1 -1
- package/dist/dev/test/control-flow/show.test.js.map +1 -1
- package/dist/dev/test/lazy-isempty.test.js +6 -6
- package/dist/dev/test/lazy-isempty.test.js.map +1 -1
- package/dist/dev/test/node.test.js +80 -0
- package/dist/dev/test/node.test.js.map +1 -0
- package/dist/dev/test/output-e2e.test.js +194 -0
- package/dist/dev/test/output-e2e.test.js.map +1 -0
- package/dist/dev/test/reactivity/circular-reactives.test.js +1 -1
- package/dist/dev/test/reactivity/circular-reactives.test.js.map +1 -1
- package/dist/dev/test/reactivity/cleanup.test.js +1 -1
- package/dist/dev/test/reactivity/cleanup.test.js.map +1 -1
- package/dist/dev/test/rendering/memoization.test.js +6 -1
- package/dist/dev/test/rendering/memoization.test.js.map +1 -1
- package/dist/dev/test/rendering/render-output-diagnostics.test.js +102 -0
- package/dist/dev/test/rendering/render-output-diagnostics.test.js.map +1 -0
- package/dist/dev/test/runtime.test.js +385 -0
- package/dist/dev/test/runtime.test.js.map +1 -0
- package/dist/dev/test/tree-test-utils.js +16 -0
- package/dist/dev/test/tree-test-utils.js.map +1 -0
- package/dist/dev/test/utils.test.js +1 -1
- package/dist/dev/test/utils.test.js.map +1 -1
- package/dist/dev/testing/devtools-utils.js +1 -1
- package/dist/dev/testing/devtools-utils.js.map +1 -1
- package/dist/dev/testing/extend-expect.js +7 -33
- package/dist/dev/testing/extend-expect.js.map +1 -1
- package/dist/dev/testing/render.js +7 -17
- package/dist/dev/testing/render.js.map +1 -1
- package/dist/devtools/index.html +17 -17
- package/dist/src/components/AccessExpression.test.js +1 -1
- package/dist/src/components/AccessExpression.test.js.map +1 -1
- package/dist/src/components/Output.d.ts +1 -1
- package/dist/src/components/Output.d.ts.map +1 -1
- package/dist/src/components/Output.js +2 -1
- package/dist/src/components/Output.js.map +1 -1
- package/dist/src/components/ReferenceOrContent.d.ts +1 -1
- package/dist/src/components/ReferenceOrContent.d.ts.map +1 -1
- package/dist/src/components/SourceFile.d.ts +1 -1
- package/dist/src/components/SourceFile.d.ts.map +1 -1
- package/dist/src/components/SourceFile.js.map +1 -1
- package/dist/src/content-slot.test.js +1 -1
- package/dist/src/content-slot.test.js.map +1 -1
- package/dist/src/context/format-options.d.ts +1 -1
- package/dist/src/context/format-options.d.ts.map +1 -1
- package/dist/src/context.d.ts +9 -1
- package/dist/src/context.d.ts.map +1 -1
- package/dist/src/context.js +30 -3
- package/dist/src/context.js.map +1 -1
- package/dist/src/debug/cli.browser.d.ts +13 -0
- package/dist/src/debug/cli.browser.d.ts.map +1 -0
- package/dist/src/debug/cli.browser.js +14 -0
- package/dist/src/debug/cli.browser.js.map +1 -0
- package/dist/src/debug/diagnostics.test.js +1 -1
- package/dist/src/debug/diagnostics.test.js.map +1 -1
- package/dist/src/debug/effects.test.js +1 -1
- package/dist/src/debug/effects.test.js.map +1 -1
- package/dist/src/debug/file-streaming.d.ts +22 -0
- package/dist/src/debug/file-streaming.d.ts.map +1 -0
- package/dist/src/debug/file-streaming.js +103 -0
- package/dist/src/debug/file-streaming.js.map +1 -0
- package/dist/src/debug/files.test.js +4 -5
- package/dist/src/debug/files.test.js.map +1 -1
- package/dist/src/debug/index.d.ts +5 -7
- package/dist/src/debug/index.d.ts.map +1 -1
- package/dist/src/debug/index.js +4 -6
- package/dist/src/debug/index.js.map +1 -1
- package/dist/src/debug/message-format.test.js +16 -18
- package/dist/src/debug/message-format.test.js.map +1 -1
- package/dist/src/debug/render-tree-orphans.test.js +8 -18
- package/dist/src/debug/render-tree-orphans.test.js.map +1 -1
- package/dist/src/debug/render.d.ts +71 -21
- package/dist/src/debug/render.d.ts.map +1 -1
- package/dist/src/debug/render.js +529 -352
- package/dist/src/debug/render.js.map +1 -1
- package/dist/src/debug/render.test.js +137 -74
- package/dist/src/debug/render.test.js.map +1 -1
- package/dist/src/debug/trace-db.browser.d.ts +9 -0
- package/dist/src/debug/trace-db.browser.d.ts.map +1 -0
- package/dist/src/debug/trace-db.browser.js +11 -0
- package/dist/src/debug/trace-db.browser.js.map +1 -0
- package/dist/src/debug/trace-db.d.ts +16 -0
- package/dist/src/debug/trace-db.d.ts.map +1 -0
- package/dist/src/debug/trace-db.js +40 -0
- package/dist/src/debug/trace-db.js.map +1 -0
- package/dist/src/debug/trace-writer.d.ts +6 -1
- package/dist/src/debug/trace-writer.d.ts.map +1 -1
- package/dist/src/debug/trace-writer.js +130 -39
- package/dist/src/debug/trace-writer.js.map +1 -1
- package/dist/src/debug/trace.d.ts +0 -36
- package/dist/src/debug/trace.d.ts.map +1 -1
- package/dist/src/debug/trace.js +0 -36
- package/dist/src/debug/trace.js.map +1 -1
- package/dist/src/devtools/devtools-protocol.d.ts +34 -1
- package/dist/src/devtools/devtools-protocol.d.ts.map +1 -1
- package/dist/src/devtools/devtools-server.d.ts.map +1 -1
- package/dist/src/devtools/devtools-server.js +55 -32
- package/dist/src/devtools/devtools-server.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 +4 -0
- package/dist/src/diagnostics.d.ts.map +1 -1
- package/dist/src/diagnostics.js +19 -1
- package/dist/src/diagnostics.js.map +1 -1
- package/dist/src/index.d.ts +5 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +5 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/jsx-runtime.d.ts +13 -4
- package/dist/src/jsx-runtime.d.ts.map +1 -1
- package/dist/src/jsx-runtime.js +14 -8
- package/dist/src/jsx-runtime.js.map +1 -1
- package/dist/src/output-types.d.ts +40 -0
- package/dist/src/output-types.d.ts.map +1 -0
- package/dist/src/output-types.js +2 -0
- package/dist/src/output-types.js.map +1 -0
- package/dist/src/reactivity.d.ts +49 -18
- package/dist/src/reactivity.d.ts.map +1 -1
- package/dist/src/reactivity.js +155 -13
- package/dist/src/reactivity.js.map +1 -1
- package/dist/src/render/get-string-width.d.ts +19 -0
- package/dist/src/render/get-string-width.d.ts.map +1 -0
- package/dist/src/render/get-string-width.js +61 -0
- package/dist/src/render/get-string-width.js.map +1 -0
- package/dist/src/render/index.d.ts +2 -0
- package/dist/src/render/index.d.ts.map +1 -0
- package/dist/src/render/index.js +2 -0
- package/dist/src/render/index.js.map +1 -0
- package/dist/src/render/node-context.d.ts +5 -0
- package/dist/src/render/node-context.d.ts.map +1 -0
- package/dist/src/render/node-context.js +7 -0
- package/dist/src/render/node-context.js.map +1 -0
- package/dist/src/render/node.d.ts +146 -0
- package/dist/src/render/node.d.ts.map +1 -0
- package/dist/src/render/node.js +386 -0
- package/dist/src/render/node.js.map +1 -0
- package/dist/src/render/printer-support.d.ts +50 -0
- package/dist/src/render/printer-support.d.ts.map +1 -0
- package/dist/src/render/printer-support.js +180 -0
- package/dist/src/render/printer-support.js.map +1 -0
- package/dist/src/render/printer.d.ts +35 -0
- package/dist/src/render/printer.d.ts.map +1 -0
- package/dist/src/render/printer.js +797 -0
- package/dist/src/render/printer.js.map +1 -0
- package/dist/src/render-error.d.ts +4 -0
- package/dist/src/render-error.d.ts.map +1 -0
- package/dist/src/render-error.js +79 -0
- package/dist/src/render-error.js.map +1 -0
- package/dist/src/render-output.d.ts +42 -0
- package/dist/src/render-output.d.ts.map +1 -0
- package/dist/src/render-output.js +209 -0
- package/dist/src/render-output.js.map +1 -0
- package/dist/src/runtime/component.d.ts +2 -2
- package/dist/src/runtime/component.d.ts.map +1 -1
- package/dist/src/runtime/create-intrinsic.d.ts +28 -0
- package/dist/src/runtime/create-intrinsic.d.ts.map +1 -0
- package/dist/src/runtime/create-intrinsic.js +53 -0
- package/dist/src/runtime/create-intrinsic.js.map +1 -0
- package/dist/src/runtime/fragment.d.ts +16 -0
- package/dist/src/runtime/fragment.d.ts.map +1 -0
- package/dist/src/runtime/fragment.js +21 -0
- package/dist/src/runtime/fragment.js.map +1 -0
- package/dist/src/runtime/index.d.ts +12 -0
- package/dist/src/runtime/index.d.ts.map +1 -0
- package/dist/src/runtime/index.js +13 -0
- package/dist/src/runtime/index.js.map +1 -0
- package/dist/src/runtime/insert.d.ts +29 -0
- package/dist/src/runtime/insert.d.ts.map +1 -0
- package/dist/src/runtime/insert.js +453 -0
- package/dist/src/runtime/insert.js.map +1 -0
- package/dist/src/runtime/intrinsic.d.ts +12 -29
- package/dist/src/runtime/intrinsic.d.ts.map +1 -1
- package/dist/src/runtime/intrinsic.js +1 -11
- package/dist/src/runtime/intrinsic.js.map +1 -1
- package/dist/src/scheduler.d.ts.map +1 -1
- package/dist/src/scheduler.js +38 -14
- package/dist/src/scheduler.js.map +1 -1
- package/dist/src/stc.d.ts.map +1 -1
- package/dist/src/stc.js +2 -0
- package/dist/src/stc.js.map +1 -1
- package/dist/src/sti.d.ts +7 -6
- package/dist/src/sti.d.ts.map +1 -1
- package/dist/src/sti.js +1 -1
- package/dist/src/sti.js.map +1 -1
- package/dist/src/symbols/symbol-slot.test.js +1 -1
- package/dist/src/symbols/symbol-slot.test.js.map +1 -1
- package/dist/src/test-render.d.ts +31 -0
- package/dist/src/test-render.d.ts.map +1 -0
- package/dist/src/test-render.js +78 -0
- package/dist/src/test-render.js.map +1 -0
- package/dist/src/utils.d.ts +1 -1
- package/dist/src/utils.d.ts.map +1 -1
- package/dist/src/utils.js +40 -28
- package/dist/src/utils.js.map +1 -1
- package/dist/src/write-output.d.ts +1 -1
- package/dist/src/write-output.d.ts.map +1 -1
- package/dist/test/babel-e2e.test.d.ts +13 -0
- package/dist/test/babel-e2e.test.d.ts.map +1 -0
- package/dist/test/babel-e2e.test.js +218 -0
- package/dist/test/babel-e2e.test.js.map +1 -0
- package/dist/test/browser-build.test.js +70 -9
- package/dist/test/browser-build.test.js.map +1 -1
- package/dist/test/components/block.test.js +1 -1
- package/dist/test/components/block.test.js.map +1 -1
- package/dist/test/components/copy-file.test.d.ts.map +1 -1
- package/dist/test/components/copy-file.test.js +1 -1
- package/dist/test/components/copy-file.test.js.map +1 -1
- package/dist/test/components/update-file.test.js +1 -1
- package/dist/test/components/update-file.test.js.map +1 -1
- package/dist/test/components/wrap.test.js +1 -1
- package/dist/test/components/wrap.test.js.map +1 -1
- package/dist/test/control-flow/match.test.js +1 -1
- package/dist/test/control-flow/match.test.js.map +1 -1
- package/dist/test/control-flow/show.test.js +1 -1
- package/dist/test/control-flow/show.test.js.map +1 -1
- package/dist/test/lazy-isempty.test.js +6 -6
- package/dist/test/lazy-isempty.test.js.map +1 -1
- package/dist/test/node.test.d.ts +2 -0
- package/dist/test/node.test.d.ts.map +1 -0
- package/dist/test/node.test.js +80 -0
- package/dist/test/node.test.js.map +1 -0
- package/dist/test/output-e2e.test.d.ts +13 -0
- package/dist/test/output-e2e.test.d.ts.map +1 -0
- package/dist/test/output-e2e.test.js +194 -0
- package/dist/test/output-e2e.test.js.map +1 -0
- package/dist/test/reactivity/circular-reactives.test.js +1 -1
- package/dist/test/reactivity/circular-reactives.test.js.map +1 -1
- package/dist/test/reactivity/cleanup.test.js +1 -1
- package/dist/test/reactivity/cleanup.test.js.map +1 -1
- package/dist/test/rendering/memoization.test.js +6 -1
- package/dist/test/rendering/memoization.test.js.map +1 -1
- package/dist/test/rendering/render-output-diagnostics.test.d.ts +2 -0
- package/dist/test/rendering/render-output-diagnostics.test.d.ts.map +1 -0
- package/dist/test/rendering/render-output-diagnostics.test.js +82 -0
- package/dist/test/rendering/render-output-diagnostics.test.js.map +1 -0
- package/dist/test/runtime.test.d.ts +11 -0
- package/dist/test/runtime.test.d.ts.map +1 -0
- package/dist/test/runtime.test.js +385 -0
- package/dist/test/runtime.test.js.map +1 -0
- package/dist/test/tree-test-utils.d.ts +3 -0
- package/dist/test/tree-test-utils.d.ts.map +1 -0
- package/dist/test/tree-test-utils.js +16 -0
- package/dist/test/tree-test-utils.js.map +1 -0
- package/dist/test/utils.test.js +1 -1
- package/dist/test/utils.test.js.map +1 -1
- package/dist/testing/devtools-utils.d.ts.map +1 -1
- package/dist/testing/devtools-utils.js +1 -1
- package/dist/testing/devtools-utils.js.map +1 -1
- package/dist/testing/extend-expect.d.ts.map +1 -1
- package/dist/testing/extend-expect.js +7 -33
- package/dist/testing/extend-expect.js.map +1 -1
- package/dist/testing/render.d.ts +7 -9
- package/dist/testing/render.d.ts.map +1 -1
- package/dist/testing/render.js +7 -17
- package/dist/testing/render.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/docs/api/components/Output.md +0 -3
- package/docs/api/components/SourceFile.md +0 -3
- package/docs/api/functions/createComment.md +18 -0
- package/docs/api/functions/createElement.md +19 -0
- package/docs/api/functions/createFragment.md +17 -0
- package/docs/api/functions/createTextNode.md +18 -0
- package/docs/api/functions/emitDiagnosticForTree.md +19 -0
- package/docs/api/functions/ensureIsEmpty.md +1 -1
- package/docs/api/functions/getContextForNode.md +18 -0
- package/docs/api/functions/getContextForRenderNode.md +4 -4
- package/docs/api/functions/getDiagnosticsForTree.md +7 -5
- package/docs/api/functions/getRegisteredDiagnosticsForTree.md +18 -0
- package/docs/api/functions/index.md +17 -12
- package/docs/api/functions/isCustomContext.md +4 -4
- package/docs/api/functions/notifyContentState.md +6 -0
- package/docs/api/functions/printTree.md +6 -16
- package/docs/api/functions/registerDiagnosticsForTree.md +19 -0
- package/docs/api/functions/render.md +1 -2
- package/docs/api/functions/renderAsync.md +1 -2
- package/docs/api/functions/renderTree.md +8 -5
- package/docs/api/functions/reportDiagnosticsForTree.md +18 -0
- package/docs/api/functions/runInContext.md +28 -0
- package/docs/api/functions/sourceFilesForTree.md +6 -16
- package/docs/api/index.md +3 -3
- package/docs/api/testing/functions/index.md +1 -1
- package/docs/api/testing/functions/renderToString.md +1 -1
- package/docs/api/types/AlloyNode.md +22 -0
- package/docs/api/types/Child.md +1 -1
- package/docs/api/types/CommentNode.md +15 -0
- package/docs/api/types/Context.md +13 -15
- package/docs/api/types/ElementNode.md +18 -0
- package/docs/api/types/FragmentNode.md +12 -0
- package/docs/api/types/Insertable.md +7 -0
- package/docs/api/types/NodeType.md +5 -0
- package/docs/api/types/OutputDirectory.md +0 -50
- package/docs/api/types/PrintTreeOptions.md +0 -1
- package/docs/api/types/RenderTreeOptions.md +7 -0
- package/docs/api/types/StiComponentCreator.md +4 -4
- package/docs/api/types/StiSignature.md +1 -1
- package/docs/api/types/TextNode.md +16 -0
- package/docs/api/types/index.md +10 -28
- package/docs/api/variables/COMMENT_NODE.md +5 -0
- package/docs/api/variables/ELEMENT_NODE.md +11 -0
- package/docs/api/variables/FRAGMENT_NODE.md +5 -0
- package/docs/api/variables/TEXT_NODE.md +5 -0
- package/docs/api/variables/index.md +4 -2
- package/docs/formatting.md +1 -1
- package/docs/rendering.md +4 -4
- package/package.json +11 -7
- package/src/components/AccessExpression.test.tsx +1 -1
- package/src/components/Output.tsx +2 -1
- package/src/components/SourceFile.tsx +1 -1
- package/src/content-slot.test.tsx +1 -1
- package/src/context/format-options.ts +1 -1
- package/src/context.ts +37 -4
- package/src/debug/cli.browser.ts +17 -0
- package/src/debug/diagnostics.test.tsx +1 -1
- package/src/debug/effects.test.tsx +1 -1
- package/src/debug/file-streaming.ts +115 -0
- package/src/debug/files.test.tsx +15 -11
- package/src/debug/index.ts +11 -11
- package/src/debug/message-format.test.tsx +32 -19
- package/src/debug/render-tree-orphans.test.tsx +10 -19
- package/src/debug/render.test.tsx +206 -78
- package/src/debug/render.ts +642 -495
- package/src/debug/trace-db.browser.ts +12 -0
- package/src/debug/trace-db.ts +42 -0
- package/src/debug/trace-writer.ts +173 -41
- package/src/debug/trace.ts +0 -20
- package/src/devtools/devtools-protocol.ts +43 -0
- package/src/devtools/devtools-server.ts +57 -32
- package/src/devtools-entry.browser.ts +5 -0
- package/src/devtools-entry.ts +5 -0
- package/src/diagnostics.ts +31 -0
- package/src/index.ts +66 -2
- package/src/jsx-runtime.ts +16 -14
- package/src/output-types.ts +47 -0
- package/src/reactivity.ts +186 -40
- package/src/render/get-string-width.ts +201 -0
- package/src/render/index.ts +1 -0
- package/src/render/node-context.ts +14 -0
- package/src/render/node.ts +442 -0
- package/src/render/printer-support.ts +209 -0
- package/src/render/printer.ts +817 -0
- package/src/render-error.ts +98 -0
- package/src/render-output.ts +243 -0
- package/src/runtime/component.ts +2 -2
- package/src/runtime/create-intrinsic.ts +56 -0
- package/src/runtime/fragment.ts +22 -0
- package/src/runtime/index.ts +12 -0
- package/src/runtime/insert.ts +569 -0
- package/src/runtime/intrinsic.ts +14 -70
- package/src/scheduler.ts +40 -25
- package/src/stc.ts +3 -0
- package/src/sti.ts +17 -20
- package/src/symbols/symbol-slot.test.tsx +1 -1
- package/src/test-render.ts +103 -0
- package/src/utils.tsx +55 -37
- package/src/write-output.ts +1 -1
- package/temp/api-testing.json +390 -14
- package/temp/api.json +4320 -4144
- package/test/babel-e2e.test.ts +224 -0
- package/test/browser-build.test.ts +81 -9
- package/test/components/block.test.tsx +1 -1
- package/test/components/copy-file.test.tsx +2 -1
- package/test/components/update-file.test.tsx +1 -1
- package/test/components/wrap.test.tsx +1 -1
- package/test/control-flow/match.test.tsx +1 -1
- package/test/control-flow/show.test.tsx +1 -1
- package/test/lazy-isempty.test.tsx +6 -6
- package/test/node.test.ts +90 -0
- package/test/output-e2e.test.ts +198 -0
- package/test/reactivity/circular-reactives.test.tsx +1 -1
- package/test/reactivity/cleanup.test.tsx +1 -1
- package/test/rendering/memoization.test.tsx +6 -1
- package/test/rendering/render-output-diagnostics.test.tsx +120 -0
- package/test/runtime.test.ts +448 -0
- package/test/tree-test-utils.ts +23 -0
- package/test/utils.test.tsx +1 -1
- package/testing/devtools-utils.ts +2 -0
- package/testing/extend-expect.ts +8 -46
- package/testing/render.ts +17 -21
- package/dist/dev/src/print-hook.js +0 -10
- package/dist/dev/src/print-hook.js.map +0 -1
- package/dist/dev/src/render.js +0 -872
- package/dist/dev/src/render.js.map +0 -1
- package/dist/src/print-hook.d.ts +0 -14
- package/dist/src/print-hook.d.ts.map +0 -1
- package/dist/src/print-hook.js +0 -10
- package/dist/src/print-hook.js.map +0 -1
- package/dist/src/render.d.ts +0 -155
- package/dist/src/render.d.ts.map +0 -1
- package/dist/src/render.js +0 -872
- package/dist/src/render.js.map +0 -1
- package/docs/api/functions/createIntrinsic.md +0 -19
- package/docs/api/functions/createRenderTreeHook.md +0 -19
- package/docs/api/functions/getElementCache.md +0 -17
- package/docs/api/functions/isIntrinsicElement.md +0 -18
- package/docs/api/functions/isPrintHook.md +0 -18
- package/docs/api/types/AlignIntrinsicElement.md +0 -5
- package/docs/api/types/BrIntrinsicElement.md +0 -5
- package/docs/api/types/BreakParentIntrinsicElement.md +0 -5
- package/docs/api/types/DedentIntrinsicElement.md +0 -5
- package/docs/api/types/DedentToRootIntrinsicElement.md +0 -5
- package/docs/api/types/ElementCache.md +0 -5
- package/docs/api/types/ElementCacheKey.md +0 -5
- package/docs/api/types/FillIntrinsicElement.md +0 -5
- package/docs/api/types/GroupIntrinsicElement.md +0 -5
- package/docs/api/types/HardlineIntrinsicElement.md +0 -5
- package/docs/api/types/HbrIntrinsicElement.md +0 -5
- package/docs/api/types/IfBreakIntrinsicElement.md +0 -5
- package/docs/api/types/IndentIfBreakIntrinsicElement.md +0 -5
- package/docs/api/types/IndentIntrinsicElement.md +0 -5
- package/docs/api/types/IntrinsicElement.md +0 -5
- package/docs/api/types/IntrinsicElementBase.md +0 -9
- package/docs/api/types/LbrIntrinsicElement.md +0 -5
- package/docs/api/types/LineIntrinsicElement.md +0 -5
- package/docs/api/types/LineSuffixBoundaryIntrinsicElement.md +0 -5
- package/docs/api/types/LineSuffixIntrinsicElement.md +0 -5
- package/docs/api/types/LiterallineIntrinsicElement.md +0 -5
- package/docs/api/types/MarkAsRootIntrinsicElement.md +0 -5
- package/docs/api/types/PrintHook.md +0 -10
- package/docs/api/types/RenderedTextTree.md +0 -5
- package/docs/api/types/SbrIntrinsicElement.md +0 -5
- package/docs/api/types/SoftlineIntrinsicElement.md +0 -5
- package/docs/api/variables/intrinsicElementKey.md +0 -5
- package/docs/api/variables/printHookTag.md +0 -7
- package/src/print-hook.ts +0 -22
- package/src/render.ts +0 -1154
package/dist/src/debug/render.js
CHANGED
|
@@ -1,355 +1,507 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Debug-render module — bridges the AlloyNode render tree to the
|
|
3
|
+
* trace-writer SQLite DB and the devtools WebSocket protocol.
|
|
4
|
+
*
|
|
5
|
+
* # Tree shape
|
|
6
|
+
*
|
|
7
|
+
* The trace tree mirrors the real AlloyNode tree. Component invocations
|
|
8
|
+
* are recorded separately as canonical metadata (`component_instances`
|
|
9
|
+
* and `component_roots`) so devtools can derive presentation groupings
|
|
10
|
+
* without storing UI artifacts as render nodes.
|
|
11
|
+
*
|
|
12
|
+
* Real AlloyNodes are exposed as:
|
|
13
|
+
*
|
|
14
|
+
* - `TextNode` → `kind: "text"`, with `value: data`
|
|
15
|
+
* - `ElementNode` with a marker `localName` (`alloy:source-file`,
|
|
16
|
+
* `alloy:directory`, `alloy:copy-file`) → `kind` set to the marker
|
|
17
|
+
* - any other `ElementNode` → `kind: "intrinsic"` with `name: localName`
|
|
18
|
+
* - `FragmentNode` → `kind: "fragment"`
|
|
19
|
+
* - `CommentNode` (slot/ctx markers) → not exposed (skipped)
|
|
20
|
+
*
|
|
21
|
+
* # Hook surface
|
|
22
|
+
*
|
|
23
|
+
* Mutation hooks:
|
|
24
|
+
* - `nodeAttached(node, parent, before)` — called from
|
|
25
|
+
* `render/node.ts::insertBefore`. Emits a `node_added` event for
|
|
26
|
+
* `node` (and any descendants it brings with it, e.g. a previously
|
|
27
|
+
* built subtree being moved or a fragment splice).
|
|
28
|
+
* - `nodeDetached(node, parent)` — called from
|
|
29
|
+
* `render/node.ts::detach`. Emits `node_removed` for `node` and all
|
|
30
|
+
* descendants.
|
|
31
|
+
*
|
|
32
|
+
* Lifecycle hooks:
|
|
33
|
+
* - `initialize(root)` — called at the start of each `render` /
|
|
34
|
+
* `renderAsync`. Resets module state and emits `render:reset`.
|
|
35
|
+
* - `complete()` — emits `render:complete`.
|
|
36
|
+
* - `flushJobsComplete()` — emits `flushJobs:complete`.
|
|
37
|
+
* - `error(info, stack)` — emits `render:error` and writes a
|
|
38
|
+
* `render_errors` row.
|
|
39
|
+
*
|
|
40
|
+
* Component hooks:
|
|
41
|
+
* - `beginComponent(opts)` — records a component instance and captures
|
|
42
|
+
* the real top-level AlloyNodes it emits.
|
|
43
|
+
*
|
|
44
|
+
* Each hook short-circuits when neither devtools nor the trace DB
|
|
45
|
+
* are enabled.
|
|
46
|
+
*/
|
|
47
|
+
|
|
1
48
|
import { watch } from "@vue/reactivity";
|
|
2
49
|
import * as devalue from "devalue";
|
|
3
50
|
import { isDevtoolsEnabled, registerDevtoolsMessageHandler } from "../devtools/devtools-server.js";
|
|
4
|
-
import { isPrintHook } from "../print-hook.js";
|
|
5
51
|
import { getContext, untrack } from "../reactivity.js";
|
|
52
|
+
import { getContextForNode } from "../render/node-context.js";
|
|
53
|
+
import { AlloyNode, CommentNode, ELEMENT_NODE, FRAGMENT_NODE, setMutationListener, TEXT_NODE } from "../render/node.js";
|
|
6
54
|
import { flushJobsAsync } from "../scheduler.js";
|
|
55
|
+
import { flushAllDirtyFiles, markFileDirtyForNode, reset as resetFileStreaming } from "./file-streaming.js";
|
|
7
56
|
import { sanitizeRecord } from "./serialize.js";
|
|
8
57
|
import { resolveComponentSource } from "./source-map.js";
|
|
9
|
-
import {
|
|
58
|
+
import { deleteComponentInstance, deleteComponentRoot, insertComponentInstance, insertComponentRoot, insertDirectory, insertOutputFile, insertRenderError, isTraceEnabled, notifyFlushComplete, notifyRenderComplete, notifyRenderReset, deleteRenderNode as traceDeleteRenderNode, insertRenderNode as traceInsertRenderNode, updateComponentInstanceProps, updateEffectComponentByContext } from "./trace-writer.js";
|
|
10
59
|
import { isDebugEnabled, logDevtoolsMessage } from "./trace.js";
|
|
11
60
|
|
|
61
|
+
// #region Public debug types used by runtime and devtools integration
|
|
62
|
+
|
|
12
63
|
/** The kind discriminant for render tree nodes. */
|
|
13
64
|
|
|
14
65
|
/** Information about a render tree node, used when recording nodes to devtools. */
|
|
15
66
|
|
|
16
|
-
|
|
67
|
+
export function isRerenderEnabled() {
|
|
68
|
+
return isDevtoolsEnabled();
|
|
69
|
+
}
|
|
70
|
+
// #endregion
|
|
17
71
|
|
|
18
|
-
//
|
|
19
|
-
// Module state — reset in initialize()
|
|
20
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
72
|
+
// #region Module state
|
|
21
73
|
|
|
74
|
+
/** Map AlloyNode → trace node id (assigned when first emitted). */
|
|
22
75
|
let nodeIds = new WeakMap();
|
|
23
|
-
|
|
24
|
-
let
|
|
25
|
-
|
|
76
|
+
/** AlloyNodes that have been emitted to the trace tree. */
|
|
77
|
+
let tracked = new WeakSet();
|
|
78
|
+
/** Component owner captured while a subtree is built before being rooted. */
|
|
79
|
+
let pendingOwnerComponent = new WeakMap();
|
|
80
|
+
/** Component roots captured while a subtree is built before being rooted. */
|
|
81
|
+
let pendingRootComponents = new WeakMap();
|
|
82
|
+
/** Sidecar metadata per node id — kind + name + source for cleanup re-emit. */
|
|
83
|
+
let nodeKinds = new Map();
|
|
84
|
+
/** Sidecar: nodes that own a file/directory entry in the trace DB. */
|
|
26
85
|
let fileNodes = new Map();
|
|
27
86
|
let directoryNodes = new Map();
|
|
87
|
+
/** Latest props-serialized value per id (for de-duplicated updates). */
|
|
28
88
|
let nodeProps = new Map();
|
|
89
|
+
/** Devtools-side rerender bindings keyed by render-tree node id. */
|
|
29
90
|
let rerenderActions = new Map();
|
|
30
|
-
let
|
|
31
|
-
let
|
|
91
|
+
let componentStack = [];
|
|
92
|
+
let componentsById = new Map();
|
|
93
|
+
let componentByContextId = new Map();
|
|
94
|
+
let ownerComponentByNodeId = new Map();
|
|
95
|
+
let childComponentsById = new Map();
|
|
96
|
+
let rootComponentsByNodeId = new Map();
|
|
32
97
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
try {
|
|
47
|
-
return devalue.stringify(sanitized);
|
|
48
|
-
} catch {
|
|
49
|
-
return undefined;
|
|
98
|
+
/**
|
|
99
|
+
* Reverse index: parent render-tree id → set of currently-emitted child
|
|
100
|
+
* render-tree ids. Maintained by every `insertRenderNode` call in this
|
|
101
|
+
* module, and used by `emitRemoved` to cascade-remove descendants whose
|
|
102
|
+
* lifetime is bound to the removed parent.
|
|
103
|
+
*/
|
|
104
|
+
let renderChildIds = new Map();
|
|
105
|
+
function insertRenderNode(id, parentId, kind, name, props, sourceFile, sourceLine, sourceCol, contextId, value) {
|
|
106
|
+
if (parentId !== null) {
|
|
107
|
+
let set = renderChildIds.get(parentId);
|
|
108
|
+
if (!set) {
|
|
109
|
+
set = new Set();
|
|
110
|
+
renderChildIds.set(parentId, set);
|
|
50
111
|
}
|
|
51
|
-
|
|
112
|
+
set.add(id);
|
|
113
|
+
}
|
|
114
|
+
traceInsertRenderNode(id, parentId, kind, name, props, sourceFile, sourceLine, sourceCol, contextId, value);
|
|
52
115
|
}
|
|
116
|
+
let nextId = 1;
|
|
117
|
+
let nextErrorId = 1;
|
|
118
|
+
let handlerRegistered = false;
|
|
53
119
|
|
|
54
|
-
//
|
|
55
|
-
// Node ID management & tree structure
|
|
56
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
120
|
+
// #endregion
|
|
57
121
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
idToNode.delete(id);
|
|
64
|
-
const fileInfo = fileNodes.get(id);
|
|
65
|
-
if (fileInfo) {
|
|
66
|
-
deleteOutputFile(fileInfo.path);
|
|
67
|
-
fileNodes.delete(id);
|
|
122
|
+
// #region Lifecycle
|
|
123
|
+
|
|
124
|
+
export function initialize(root) {
|
|
125
|
+
for (const frame of componentsById.values()) {
|
|
126
|
+
frame.stopWatch?.();
|
|
68
127
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
directoryNodes.delete(id);
|
|
128
|
+
if (!isDebugEnabled()) {
|
|
129
|
+
setMutationListener(null);
|
|
130
|
+
return;
|
|
73
131
|
}
|
|
132
|
+
ensureDevtoolsHandler();
|
|
133
|
+
nodeIds = new WeakMap();
|
|
134
|
+
tracked = new WeakSet();
|
|
135
|
+
pendingOwnerComponent = new WeakMap();
|
|
136
|
+
pendingRootComponents = new WeakMap();
|
|
137
|
+
renderChildIds = new Map();
|
|
138
|
+
nodeKinds = new Map();
|
|
139
|
+
fileNodes = new Map();
|
|
140
|
+
directoryNodes = new Map();
|
|
141
|
+
nodeProps = new Map();
|
|
142
|
+
rerenderActions = new Map();
|
|
143
|
+
componentStack = [];
|
|
144
|
+
componentsById = new Map();
|
|
145
|
+
componentByContextId = new Map();
|
|
146
|
+
ownerComponentByNodeId = new Map();
|
|
147
|
+
childComponentsById = new Map();
|
|
148
|
+
rootComponentsByNodeId = new Map();
|
|
149
|
+
nextId = 1;
|
|
150
|
+
resetFileStreaming();
|
|
151
|
+
setMutationListener({
|
|
152
|
+
attached: nodeAttached,
|
|
153
|
+
detached: nodeDetached
|
|
154
|
+
});
|
|
155
|
+
notifyRenderReset();
|
|
156
|
+
const rootId = getOrCreateNodeId(root);
|
|
157
|
+
tracked.add(root);
|
|
158
|
+
nodeKinds.set(rootId, {
|
|
159
|
+
kind: "root"
|
|
160
|
+
});
|
|
161
|
+
insertRenderNode(rootId, null, "root", undefined, undefined, undefined, undefined, undefined, null, undefined);
|
|
74
162
|
}
|
|
75
|
-
function
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
163
|
+
export function complete() {
|
|
164
|
+
flushAllDirtyFiles();
|
|
165
|
+
logDevtoolsMessage({
|
|
166
|
+
type: "render:complete"
|
|
167
|
+
});
|
|
168
|
+
notifyRenderComplete();
|
|
169
|
+
}
|
|
170
|
+
export function flushJobsComplete() {
|
|
171
|
+
logDevtoolsMessage({
|
|
172
|
+
type: "flushJobs:complete"
|
|
173
|
+
});
|
|
174
|
+
notifyFlushComplete();
|
|
82
175
|
}
|
|
176
|
+
|
|
177
|
+
// #endregion
|
|
178
|
+
|
|
179
|
+
// #region Node-id management
|
|
180
|
+
|
|
83
181
|
function getOrCreateNodeId(node) {
|
|
84
182
|
const existing = nodeIds.get(node);
|
|
85
|
-
if (existing)
|
|
86
|
-
// Restore reverse mapping — emitNodeRemoved deletes idToNode but nodeIds
|
|
87
|
-
// (WeakMap) survives. Without this, clearRenderTreeChildrenForId can't
|
|
88
|
-
// find the node on the next cleanup, leaving orphaned children in the DB.
|
|
89
|
-
idToNode.set(existing, node);
|
|
90
|
-
return existing;
|
|
91
|
-
}
|
|
183
|
+
if (existing !== undefined) return existing;
|
|
92
184
|
const id = nextId++;
|
|
93
185
|
nodeIds.set(node, id);
|
|
94
|
-
idToNode.set(id, node);
|
|
95
186
|
return id;
|
|
96
187
|
}
|
|
97
188
|
export function getRenderNodeId(node) {
|
|
98
189
|
if (!isDebugEnabled()) return undefined;
|
|
99
|
-
|
|
190
|
+
if (!(node instanceof AlloyNode)) return undefined;
|
|
191
|
+
return nodeIds.get(node);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// #endregion
|
|
195
|
+
|
|
196
|
+
// #region Kind classification
|
|
197
|
+
|
|
198
|
+
const SKIPPED_COMMENT_DATAS = new Set(["slot:start", "slot:end", "slot:item:start", "slot:item:end", "ctx:start", "ctx:end", "component:start", "component:end"]);
|
|
199
|
+
function shouldExposeNode(node) {
|
|
200
|
+
if (node instanceof CommentNode) {
|
|
201
|
+
// Bookkeeping comments are not part of the render tree.
|
|
202
|
+
return !SKIPPED_COMMENT_DATAS.has(node.data);
|
|
203
|
+
}
|
|
204
|
+
return true;
|
|
100
205
|
}
|
|
101
|
-
function
|
|
102
|
-
const
|
|
103
|
-
|
|
206
|
+
function classifyNode(node) {
|
|
207
|
+
const t = node.nodeType;
|
|
208
|
+
if (t === TEXT_NODE) {
|
|
209
|
+
return {
|
|
210
|
+
kind: "text",
|
|
211
|
+
value: node.data
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
if (t === FRAGMENT_NODE) {
|
|
215
|
+
return {
|
|
216
|
+
kind: "fragment"
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
if (t === ELEMENT_NODE) {
|
|
220
|
+
const ln = node.localName;
|
|
221
|
+
if (ln === "alloy:source-file" || ln === "alloy:directory" || ln === "alloy:copy-file") {
|
|
222
|
+
return {
|
|
223
|
+
kind: ln.slice("alloy:".length),
|
|
224
|
+
name: ln
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
return {
|
|
228
|
+
kind: "intrinsic",
|
|
229
|
+
name: ln
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
// CommentNode that's exposed — generic "comment" kind. Marker
|
|
233
|
+
// comments are filtered out by `shouldExposeNode`, so this is rare.
|
|
234
|
+
return {
|
|
235
|
+
kind: "comment",
|
|
236
|
+
value: node.data
|
|
237
|
+
};
|
|
104
238
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
fileNodes = new Map();
|
|
113
|
-
directoryNodes = new Map();
|
|
114
|
-
nodeProps = new Map();
|
|
115
|
-
rerenderActions = new Map();
|
|
116
|
-
nextId = 1;
|
|
117
|
-
notifyRenderReset();
|
|
118
|
-
const rootId = getOrCreateNodeId(root);
|
|
119
|
-
insertRenderNode(rootId, null, "root", undefined, undefined, undefined, undefined, undefined, null, undefined);
|
|
239
|
+
|
|
240
|
+
// #endregion
|
|
241
|
+
|
|
242
|
+
// #region Component ownership resolution
|
|
243
|
+
|
|
244
|
+
function currentComponentFrame() {
|
|
245
|
+
return componentStack[componentStack.length - 1];
|
|
120
246
|
}
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
rerenderActions.set(id, actions);
|
|
247
|
+
function currentContextComponentFrame() {
|
|
248
|
+
const ctx = getContext();
|
|
249
|
+
return ctx ? componentByContextId.get(ctx.id) : undefined;
|
|
125
250
|
}
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
251
|
+
function findRootComponentsForAttach(parent) {
|
|
252
|
+
const frames = [];
|
|
253
|
+
for (let i = componentStack.length - 1; i >= 0; i--) {
|
|
254
|
+
const frame = componentStack[i];
|
|
255
|
+
if (frame.hostParent === parent) frames.unshift(frame);
|
|
131
256
|
}
|
|
257
|
+
return frames;
|
|
132
258
|
}
|
|
133
|
-
function
|
|
134
|
-
if (
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
259
|
+
function ownerFrameForAttach(parentId, inheritedOwner) {
|
|
260
|
+
if (inheritedOwner) return inheritedOwner;
|
|
261
|
+
const active = currentComponentFrame();
|
|
262
|
+
if (active) return active;
|
|
263
|
+
const contextFrame = currentContextComponentFrame();
|
|
264
|
+
if (contextFrame) return contextFrame;
|
|
265
|
+
if (parentId !== null) {
|
|
266
|
+
const parentOwner = ownerComponentByNodeId.get(parentId);
|
|
267
|
+
if (parentOwner !== undefined) return componentsById.get(parentOwner);
|
|
268
|
+
}
|
|
269
|
+
return undefined;
|
|
270
|
+
}
|
|
271
|
+
function recordComponentRoot(frame, renderNodeId) {
|
|
272
|
+
if (frame.rootSet.has(renderNodeId)) return;
|
|
273
|
+
frame.rootSet.add(renderNodeId);
|
|
274
|
+
const ordinal = frame.roots.length;
|
|
275
|
+
frame.roots.push(renderNodeId);
|
|
276
|
+
let components = rootComponentsByNodeId.get(renderNodeId);
|
|
277
|
+
if (!components) {
|
|
278
|
+
components = new Set();
|
|
279
|
+
rootComponentsByNodeId.set(renderNodeId, components);
|
|
280
|
+
}
|
|
281
|
+
components.add(frame.id);
|
|
282
|
+
insertComponentRoot(frame.id, renderNodeId, ordinal);
|
|
283
|
+
if (ordinal === 0) {
|
|
284
|
+
if (frame.file) {
|
|
285
|
+
fileNodes.set(renderNodeId, frame.file);
|
|
286
|
+
insertOutputFile(frame.file.path, frame.file.filetype, renderNodeId);
|
|
139
287
|
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
const id = Number(rawId);
|
|
143
|
-
if (!Number.isFinite(id)) return;
|
|
144
|
-
const actions = rerenderActions.get(id);
|
|
145
|
-
if (!actions) return;
|
|
146
|
-
if (message.type === "render:rerender") {
|
|
147
|
-
actions.rerender();
|
|
148
|
-
} else {
|
|
149
|
-
actions.rerenderAndBreak();
|
|
288
|
+
if (frame.directory) {
|
|
289
|
+
directoryNodes.set(renderNodeId, frame.directory);
|
|
150
290
|
}
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
}
|
|
154
|
-
export function recordTextNode(parent, index, value) {
|
|
155
|
-
if (!isDebugEnabled()) return;
|
|
156
|
-
const id = nextId++;
|
|
157
|
-
setEntryId(parent, index, id);
|
|
158
|
-
insertRenderNode(id, getOrCreateNodeId(parent), "text", undefined, undefined, undefined, undefined, undefined, null, value);
|
|
291
|
+
}
|
|
292
|
+
if (frame.actions) rerenderActions.set(renderNodeId, frame.actions);
|
|
159
293
|
}
|
|
160
|
-
function
|
|
161
|
-
if (!
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
}
|
|
172
|
-
setEntryId(parent, index, id);
|
|
173
|
-
insertRenderNode(id, getOrCreateNodeId(parent), info.kind, info.name, info.propsSerialized, info.source?.fileName, info.source?.lineNumber, info.source?.columnNumber, null, undefined);
|
|
294
|
+
function removeComponentRoot(frame, renderNodeId, deleteWhenEmpty = true) {
|
|
295
|
+
if (!frame.rootSet.delete(renderNodeId)) return;
|
|
296
|
+
frame.roots = frame.roots.filter(id => id !== renderNodeId);
|
|
297
|
+
const components = rootComponentsByNodeId.get(renderNodeId);
|
|
298
|
+
if (components) {
|
|
299
|
+
components.delete(frame.id);
|
|
300
|
+
if (components.size === 0) rootComponentsByNodeId.delete(renderNodeId);
|
|
301
|
+
}
|
|
302
|
+
deleteComponentRoot(frame.id, renderNodeId);
|
|
303
|
+
if (deleteWhenEmpty && frame.rootSet.size === 0) {
|
|
304
|
+
deleteComponentFrame(frame);
|
|
305
|
+
}
|
|
174
306
|
}
|
|
175
|
-
function
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
if (
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
// Merge source from previously-saved nodeKinds if the caller didn't provide one
|
|
185
|
-
const savedKind = nodeKinds.get(subtree);
|
|
186
|
-
const source = info.source ?? savedKind?.source;
|
|
187
|
-
// Remember the kind and source so cached re-adds preserve them
|
|
188
|
-
nodeKinds.set(subtree, {
|
|
189
|
-
kind: info.kind,
|
|
190
|
-
name: info.name,
|
|
191
|
-
source
|
|
192
|
-
});
|
|
193
|
-
// Track in entryIds so clearRenderTreeChildren can find and remove it
|
|
194
|
-
if (Array.isArray(parentNode)) {
|
|
195
|
-
const list = getEntryList(parentNode);
|
|
196
|
-
list.push(id);
|
|
307
|
+
function deleteComponentFrame(frame) {
|
|
308
|
+
if (!componentsById.delete(frame.id)) return;
|
|
309
|
+
const children = childComponentsById.get(frame.id);
|
|
310
|
+
if (children) {
|
|
311
|
+
childComponentsById.delete(frame.id);
|
|
312
|
+
for (const childId of [...children]) {
|
|
313
|
+
const child = componentsById.get(childId);
|
|
314
|
+
if (child) deleteComponentFrame(child);
|
|
315
|
+
}
|
|
197
316
|
}
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
317
|
+
for (const rootId of [...frame.roots]) {
|
|
318
|
+
removeComponentRoot(frame, rootId, false);
|
|
319
|
+
}
|
|
320
|
+
if (frame.parentComponentId !== null) {
|
|
321
|
+
const siblings = childComponentsById.get(frame.parentComponentId);
|
|
322
|
+
siblings?.delete(frame.id);
|
|
323
|
+
}
|
|
324
|
+
if (frame.contextId !== null && componentByContextId.get(frame.contextId)?.id === frame.id) {
|
|
325
|
+
componentByContextId.delete(frame.contextId);
|
|
204
326
|
}
|
|
327
|
+
nodeProps.delete(frame.id);
|
|
328
|
+
frame.stopWatch?.();
|
|
329
|
+
deleteComponentInstance(frame.id);
|
|
205
330
|
}
|
|
206
331
|
|
|
207
332
|
/**
|
|
208
|
-
*
|
|
209
|
-
*
|
|
210
|
-
*
|
|
211
|
-
*
|
|
333
|
+
* Decide whether `attachedParent` is currently part of the live trace
|
|
334
|
+
* tree (rooted at the initialized root), and if so which trace node id
|
|
335
|
+
* should be the new node's parent.
|
|
336
|
+
*
|
|
337
|
+
* Returns `undefined` when `attachedParent` isn't tracked — the caller
|
|
338
|
+
* should defer emission until the subtree is later attached at a
|
|
339
|
+
* tracked location.
|
|
212
340
|
*/
|
|
213
|
-
function
|
|
214
|
-
if (
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
// Clear any previously-recorded children from the DB before re-adding.
|
|
218
|
-
// The in-memory tree may have changed since the last cached re-add
|
|
219
|
-
// (e.g., a memo inside the cached subtree re-ran), so old DB children
|
|
220
|
-
// that are no longer in the tree would become orphans.
|
|
221
|
-
clearRenderTreeChildren(node);
|
|
222
|
-
|
|
223
|
-
// Rebuild the entryIds for this node
|
|
224
|
-
const list = getEntryList(node);
|
|
225
|
-
list.length = 0;
|
|
226
|
-
for (let i = 0; i < node.length; i++) {
|
|
227
|
-
const child = node[i];
|
|
228
|
-
if (typeof child === "string") {
|
|
229
|
-
// Text nodes - re-record them with new IDs
|
|
230
|
-
if (child !== "") {
|
|
231
|
-
const id = nextId++;
|
|
232
|
-
list.push(id);
|
|
233
|
-
idToNode.set(id, child);
|
|
234
|
-
insertRenderNode(id, parentId, "text", undefined, undefined, undefined, undefined, undefined, null, child);
|
|
235
|
-
}
|
|
236
|
-
} else if (Array.isArray(child)) {
|
|
237
|
-
// Nested RenderedTextTree - record and recurse, preserving original kind and source
|
|
238
|
-
const id = getOrCreateNodeId(child);
|
|
239
|
-
list.push(id);
|
|
240
|
-
const savedKind = nodeKinds.get(child);
|
|
241
|
-
insertRenderNode(id, parentId, savedKind?.kind ?? "fragment", savedKind?.name, undefined, savedKind?.source?.fileName, savedKind?.source?.lineNumber, savedKind?.source?.columnNumber, null, undefined);
|
|
242
|
-
recordCachedSubtreeChildrenRecursively(child);
|
|
243
|
-
} else if (isPrintHook(child)) {
|
|
244
|
-
// PrintHook - record and recurse into subtree
|
|
245
|
-
const id = getOrCreateNodeId(child);
|
|
246
|
-
list.push(id);
|
|
247
|
-
insertRenderNode(id, parentId, "printHook", child.name ?? "hook", undefined, undefined, undefined, undefined, null, undefined);
|
|
248
|
-
if (child.subtree) {
|
|
249
|
-
const subtreeId = getOrCreateNodeId(child.subtree);
|
|
250
|
-
const hookList = getEntryList(child);
|
|
251
|
-
hookList.length = 0;
|
|
252
|
-
hookList.push(subtreeId);
|
|
253
|
-
insertRenderNode(subtreeId, id, "fragment", undefined, undefined, undefined, undefined, undefined, null, undefined);
|
|
254
|
-
recordCachedSubtreeChildrenRecursively(child.subtree);
|
|
255
|
-
}
|
|
256
|
-
}
|
|
341
|
+
function resolveParentId(node, attachedParent) {
|
|
342
|
+
if (tracked.has(attachedParent)) {
|
|
343
|
+
const id = nodeIds.get(attachedParent);
|
|
344
|
+
return id === undefined ? null : id;
|
|
257
345
|
}
|
|
346
|
+
return undefined;
|
|
258
347
|
}
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
348
|
+
|
|
349
|
+
// #endregion
|
|
350
|
+
|
|
351
|
+
// #region Tree-mutation hooks
|
|
352
|
+
|
|
353
|
+
/**
|
|
354
|
+
* Called after `node` is attached as a child of `parent`. Emits an
|
|
355
|
+
* `added` event for `node` itself (if exposed) and recursively for any
|
|
356
|
+
* descendants it brought with it (move / fragment splice / cached subtree).
|
|
357
|
+
*
|
|
358
|
+
* If `parent` isn't part of the live tree yet, stamps the active component
|
|
359
|
+
* ownership onto `node` and defers emission until the subtree finally attaches.
|
|
360
|
+
*/
|
|
361
|
+
export function nodeAttached(node, parent) {
|
|
268
362
|
if (!isDebugEnabled()) return;
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
const
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
}
|
|
363
|
+
markFileDirtyForNode(parent);
|
|
364
|
+
const parentId = resolveParentId(node, parent);
|
|
365
|
+
const ownerFrame = currentComponentFrame() ?? currentContextComponentFrame();
|
|
366
|
+
let rootFrames = findRootComponentsForAttach(parent);
|
|
367
|
+
if (rootFrames.length === 0 && ownerFrame !== undefined && parentId !== undefined && (parentId === null || ownerComponentByNodeId.get(parentId) !== ownerFrame.id)) {
|
|
368
|
+
rootFrames = [ownerFrame];
|
|
276
369
|
}
|
|
277
|
-
|
|
370
|
+
if (parentId === undefined) {
|
|
371
|
+
if (ownerFrame) pendingOwnerComponent.set(node, ownerFrame);
|
|
372
|
+
if (rootFrames.length > 0) pendingRootComponents.set(node, rootFrames);
|
|
373
|
+
return;
|
|
374
|
+
}
|
|
375
|
+
attachWithSelf(node, parentId, ownerFrame, rootFrames);
|
|
278
376
|
}
|
|
279
|
-
function
|
|
280
|
-
const
|
|
281
|
-
if (
|
|
282
|
-
|
|
283
|
-
|
|
377
|
+
function attachWithSelf(node, parentId, inheritedOwner, inheritedRoots) {
|
|
378
|
+
const pendingOwner = pendingOwnerComponent.get(node);
|
|
379
|
+
if (pendingOwner !== undefined) {
|
|
380
|
+
pendingOwnerComponent.delete(node);
|
|
381
|
+
}
|
|
382
|
+
const pendingRoots = pendingRootComponents.get(node);
|
|
383
|
+
if (pendingRoots !== undefined) {
|
|
384
|
+
pendingRootComponents.delete(node);
|
|
385
|
+
}
|
|
386
|
+
const ownerFrame = ownerFrameForAttach(parentId, pendingOwner ?? inheritedOwner);
|
|
387
|
+
const rootFrames = pendingRoots ?? inheritedRoots;
|
|
388
|
+
if (!shouldExposeNode(node)) {
|
|
389
|
+
for (let c = node.firstChild; c !== null; c = c.nextSibling) {
|
|
390
|
+
attachWithSelf(c, parentId, ownerFrame, rootFrames);
|
|
391
|
+
}
|
|
284
392
|
return;
|
|
285
393
|
}
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
394
|
+
if (tracked.has(node)) {
|
|
395
|
+
// Already eagerly emitted (e.g. an alloy:* wrapper pre-emitted via
|
|
396
|
+
// ensureWrapperHostTracked while inside a thunk body). Don't re-emit;
|
|
397
|
+
// just walk newly-attached children that may not have been seen yet.
|
|
398
|
+
const existingId = nodeIds.get(node);
|
|
399
|
+
for (let c = node.firstChild; c !== null; c = c.nextSibling) {
|
|
400
|
+
if (!tracked.has(c)) {
|
|
401
|
+
attachWithSelf(c, existingId, ownerFrame, []);
|
|
402
|
+
}
|
|
294
403
|
}
|
|
404
|
+
return;
|
|
295
405
|
}
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
299
|
-
// File / directory node tracking
|
|
300
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
301
|
-
|
|
302
|
-
function recordDirectoryNode(node, path) {
|
|
303
|
-
if (!isDebugEnabled()) return;
|
|
304
406
|
const id = getOrCreateNodeId(node);
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
407
|
+
emitAdded(node, id, parentId);
|
|
408
|
+
tracked.add(node);
|
|
409
|
+
if (ownerFrame !== undefined) {
|
|
410
|
+
ownerComponentByNodeId.set(id, ownerFrame.id);
|
|
411
|
+
}
|
|
412
|
+
for (const rootFrame of rootFrames) {
|
|
413
|
+
recordComponentRoot(rootFrame, id);
|
|
414
|
+
}
|
|
415
|
+
for (let c = node.firstChild; c !== null; c = c.nextSibling) {
|
|
416
|
+
if (!tracked.has(c)) attachWithSelf(c, id, ownerFrame, []);
|
|
417
|
+
}
|
|
310
418
|
}
|
|
311
|
-
function
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
419
|
+
function emitAdded(node, id, parentId) {
|
|
420
|
+
const cls = classifyNode(node);
|
|
421
|
+
// Stamp metadata so cleanup re-emit (and `error()` stack resolution)
|
|
422
|
+
// can recover identity.
|
|
423
|
+
let entry = nodeKinds.get(id);
|
|
424
|
+
if (!entry) {
|
|
425
|
+
entry = {
|
|
426
|
+
kind: cls.kind,
|
|
427
|
+
name: cls.name
|
|
428
|
+
};
|
|
429
|
+
nodeKinds.set(id, entry);
|
|
430
|
+
} else {
|
|
431
|
+
entry.kind = cls.kind;
|
|
432
|
+
if (cls.name !== undefined) entry.name = cls.name;
|
|
433
|
+
}
|
|
434
|
+
const props = nodeProps.get(id);
|
|
435
|
+
insertRenderNode(id, parentId, cls.kind, cls.name, props, entry.source?.fileName, entry.source?.lineNumber, entry.source?.columnNumber, getContextForNode(node)?.id ?? null, cls.value);
|
|
320
436
|
}
|
|
321
|
-
|
|
437
|
+
|
|
438
|
+
/**
|
|
439
|
+
* Called after `node` has been detached. Emits `node_removed` for
|
|
440
|
+
* `node` and all of its still-attached descendants in post-order.
|
|
441
|
+
*/
|
|
442
|
+
export function nodeDetached(node, formerParent) {
|
|
322
443
|
if (!isDebugEnabled()) return;
|
|
444
|
+
markFileDirtyForNode(formerParent);
|
|
445
|
+
detachRecursive(node);
|
|
446
|
+
}
|
|
447
|
+
function detachRecursive(node) {
|
|
448
|
+
for (let c = node.firstChild; c !== null; c = c.nextSibling) {
|
|
449
|
+
detachRecursive(c);
|
|
450
|
+
}
|
|
451
|
+
if (!tracked.has(node)) return;
|
|
452
|
+
tracked.delete(node);
|
|
453
|
+
if (!shouldExposeNode(node)) return;
|
|
323
454
|
const id = nodeIds.get(node);
|
|
324
455
|
if (id === undefined) return;
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
456
|
+
emitRemoved(id);
|
|
457
|
+
}
|
|
458
|
+
function emitRemoved(id) {
|
|
459
|
+
const componentIds = rootComponentsByNodeId.get(id);
|
|
460
|
+
if (componentIds) {
|
|
461
|
+
for (const componentId of [...componentIds]) {
|
|
462
|
+
const component = componentsById.get(componentId);
|
|
463
|
+
if (component) removeComponentRoot(component, id);
|
|
464
|
+
}
|
|
329
465
|
}
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
466
|
+
traceDeleteRenderNode(id);
|
|
467
|
+
rerenderActions.delete(id);
|
|
468
|
+
nodeProps.delete(id);
|
|
469
|
+
nodeKinds.delete(id);
|
|
470
|
+
// Files & directories owned by this node.
|
|
471
|
+
fileNodes.delete(id);
|
|
472
|
+
directoryNodes.delete(id);
|
|
473
|
+
ownerComponentByNodeId.delete(id);
|
|
474
|
+
// Cascade to any descendants currently registered as children of this id.
|
|
475
|
+
const children = renderChildIds.get(id);
|
|
476
|
+
if (children !== undefined) {
|
|
477
|
+
renderChildIds.delete(id);
|
|
478
|
+
for (const childId of children) {
|
|
479
|
+
emitRemoved(childId);
|
|
480
|
+
}
|
|
334
481
|
}
|
|
335
482
|
}
|
|
336
483
|
|
|
337
|
-
//
|
|
338
|
-
// Public API — called from render.ts via the debug object
|
|
339
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
484
|
+
// #endregion
|
|
340
485
|
|
|
341
|
-
|
|
486
|
+
// #region Component lifecycle
|
|
487
|
+
|
|
488
|
+
function serializeRenderTreeProps(input) {
|
|
489
|
+
return untrack(() => {
|
|
490
|
+
if (!input) return undefined;
|
|
491
|
+
const {
|
|
492
|
+
children: _children,
|
|
493
|
+
...rest
|
|
494
|
+
} = input;
|
|
495
|
+
const sanitized = sanitizeRecord(rest);
|
|
496
|
+
if (!sanitized) return undefined;
|
|
497
|
+
try {
|
|
498
|
+
return devalue.stringify(sanitized);
|
|
499
|
+
} catch {
|
|
500
|
+
return undefined;
|
|
501
|
+
}
|
|
502
|
+
});
|
|
503
|
+
}
|
|
342
504
|
export function beginComponent(options) {
|
|
343
|
-
const {
|
|
344
|
-
parent,
|
|
345
|
-
index,
|
|
346
|
-
node,
|
|
347
|
-
component,
|
|
348
|
-
propsSource,
|
|
349
|
-
source,
|
|
350
|
-
isExisting,
|
|
351
|
-
actions
|
|
352
|
-
} = options;
|
|
353
505
|
if (!isDebugEnabled()) {
|
|
354
506
|
return {
|
|
355
507
|
recordDirectory() {},
|
|
@@ -357,6 +509,13 @@ export function beginComponent(options) {
|
|
|
357
509
|
dispose() {}
|
|
358
510
|
};
|
|
359
511
|
}
|
|
512
|
+
const {
|
|
513
|
+
component,
|
|
514
|
+
propsSource,
|
|
515
|
+
source,
|
|
516
|
+
parent,
|
|
517
|
+
actions
|
|
518
|
+
} = options;
|
|
360
519
|
return untrack(() => {
|
|
361
520
|
let componentName = component.component.name;
|
|
362
521
|
if (componentName === "Provider") {
|
|
@@ -367,86 +526,114 @@ export function beginComponent(options) {
|
|
|
367
526
|
}
|
|
368
527
|
const propsSerialized = serializeRenderTreeProps(propsSource);
|
|
369
528
|
const resolvedSource = resolveComponentSource(source);
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
529
|
+
const id = nextId++;
|
|
530
|
+
const ctx = getContext();
|
|
531
|
+
const parentComponent = componentStack[componentStack.length - 1] ?? (ctx?.owner ? componentByContextId.get(ctx.owner.id) : undefined);
|
|
532
|
+
const frame = {
|
|
533
|
+
id,
|
|
534
|
+
parentComponentId: parentComponent?.id ?? null,
|
|
535
|
+
hostParent: parent,
|
|
536
|
+
name: componentName,
|
|
537
|
+
propsSerialized,
|
|
538
|
+
source: resolvedSource,
|
|
539
|
+
contextId: ctx?.id ?? null,
|
|
540
|
+
roots: [],
|
|
541
|
+
rootSet: new Set(),
|
|
542
|
+
actions
|
|
543
|
+
};
|
|
544
|
+
componentsById.set(id, frame);
|
|
545
|
+
if (frame.parentComponentId !== null) {
|
|
546
|
+
let children = childComponentsById.get(frame.parentComponentId);
|
|
547
|
+
if (!children) {
|
|
548
|
+
children = new Set();
|
|
549
|
+
childComponentsById.set(frame.parentComponentId, children);
|
|
385
550
|
}
|
|
551
|
+
children.add(id);
|
|
552
|
+
}
|
|
553
|
+
componentStack.push(frame);
|
|
554
|
+
if (ctx) componentByContextId.set(ctx.id, frame);
|
|
555
|
+
if (propsSerialized !== undefined) nodeProps.set(id, propsSerialized);
|
|
556
|
+
insertComponentInstance(id, frame.parentComponentId, componentName, propsSerialized, resolvedSource?.fileName, resolvedSource?.lineNumber, resolvedSource?.columnNumber, frame.contextId);
|
|
557
|
+
if (isTraceEnabled() && ctx) {
|
|
558
|
+
updateEffectComponentByContext(ctx.id, componentName);
|
|
386
559
|
}
|
|
387
|
-
|
|
388
|
-
|
|
560
|
+
|
|
561
|
+
// Watch reactive props and re-emit on change.
|
|
389
562
|
let stopWatch;
|
|
390
563
|
if (propsSource) {
|
|
391
|
-
const propKeys = Object.keys(propsSource).filter(
|
|
564
|
+
const propKeys = Object.keys(propsSource).filter(k => k !== "children");
|
|
392
565
|
if (propKeys.length > 0) {
|
|
393
|
-
stopWatch = watch(() => propKeys.map(
|
|
394
|
-
const
|
|
395
|
-
|
|
566
|
+
stopWatch = watch(() => propKeys.map(k => propsSource[k]), () => {
|
|
567
|
+
const next = serializeRenderTreeProps(propsSource);
|
|
568
|
+
const previous = nodeProps.get(id);
|
|
569
|
+
if (previous === next) return;
|
|
570
|
+
nodeProps.set(id, next);
|
|
571
|
+
updateComponentInstanceProps(id, next);
|
|
396
572
|
});
|
|
397
573
|
}
|
|
398
574
|
}
|
|
575
|
+
frame.stopWatch = stopWatch;
|
|
576
|
+
let disposed = false;
|
|
399
577
|
return {
|
|
400
578
|
recordDirectory(path) {
|
|
401
|
-
|
|
579
|
+
if (frame.directory) return;
|
|
580
|
+
frame.directory = {
|
|
581
|
+
path
|
|
582
|
+
};
|
|
583
|
+
insertDirectory(path);
|
|
402
584
|
},
|
|
403
585
|
recordFile(path, filetype) {
|
|
404
|
-
|
|
586
|
+
if (frame.file) return;
|
|
587
|
+
frame.file = {
|
|
588
|
+
path,
|
|
589
|
+
filetype
|
|
590
|
+
};
|
|
405
591
|
},
|
|
406
592
|
dispose() {
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
593
|
+
if (disposed) return;
|
|
594
|
+
disposed = true;
|
|
595
|
+
for (let i = componentStack.length - 1; i >= 0; i--) {
|
|
596
|
+
if (componentStack[i].id === id) {
|
|
597
|
+
componentStack.splice(i, 1);
|
|
598
|
+
break;
|
|
599
|
+
}
|
|
600
|
+
}
|
|
410
601
|
}
|
|
411
602
|
};
|
|
412
603
|
});
|
|
413
604
|
}
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
clearRenderTreeChildren(node);
|
|
439
|
-
return;
|
|
440
|
-
}
|
|
441
|
-
recordSubtreeAdded(parent, node, {
|
|
442
|
-
kind: "memo"
|
|
605
|
+
|
|
606
|
+
// #endregion
|
|
607
|
+
|
|
608
|
+
// #region Devtools rerender bridge
|
|
609
|
+
|
|
610
|
+
function ensureDevtoolsHandler() {
|
|
611
|
+
if (handlerRegistered || !isDevtoolsEnabled()) return;
|
|
612
|
+
handlerRegistered = true;
|
|
613
|
+
registerDevtoolsMessageHandler(message => {
|
|
614
|
+
if (message.type !== "render:rerender" && message.type !== "render:rerenderAndBreak") {
|
|
615
|
+
return;
|
|
616
|
+
}
|
|
617
|
+
const rawId = message.id;
|
|
618
|
+
if (typeof rawId !== "number" && typeof rawId !== "string") return;
|
|
619
|
+
const id = Number(rawId);
|
|
620
|
+
if (!Number.isFinite(id)) return;
|
|
621
|
+
const actions = rerenderActions.get(id);
|
|
622
|
+
if (!actions) return;
|
|
623
|
+
if (message.type === "render:rerender") {
|
|
624
|
+
actions.rerender();
|
|
625
|
+
} else {
|
|
626
|
+
actions.rerenderAndBreak();
|
|
627
|
+
}
|
|
628
|
+
void flushJobsAsync();
|
|
443
629
|
});
|
|
444
630
|
}
|
|
445
|
-
let nextErrorId = 1;
|
|
446
631
|
|
|
447
|
-
|
|
632
|
+
// #endregion
|
|
448
633
|
|
|
449
|
-
|
|
634
|
+
// #region Errors
|
|
635
|
+
|
|
636
|
+
export function error(err, componentStack) {
|
|
450
637
|
if (!isDebugEnabled()) return;
|
|
451
638
|
const serializedStack = untrack(() => componentStack.map(entry => ({
|
|
452
639
|
name: entry.name,
|
|
@@ -457,23 +644,13 @@ export function error(error, componentStack) {
|
|
|
457
644
|
logDevtoolsMessage({
|
|
458
645
|
type: "render:error",
|
|
459
646
|
id: nextErrorId++,
|
|
460
|
-
name:
|
|
461
|
-
message:
|
|
462
|
-
stack:
|
|
647
|
+
name: err.name,
|
|
648
|
+
message: err.message,
|
|
649
|
+
stack: err.stack,
|
|
463
650
|
componentStack: serializedStack
|
|
464
651
|
});
|
|
465
|
-
insertRenderError(
|
|
466
|
-
}
|
|
467
|
-
export function complete() {
|
|
468
|
-
logDevtoolsMessage({
|
|
469
|
-
type: "render:complete"
|
|
470
|
-
});
|
|
471
|
-
notifyRenderComplete();
|
|
472
|
-
}
|
|
473
|
-
export function flushJobsComplete() {
|
|
474
|
-
logDevtoolsMessage({
|
|
475
|
-
type: "flushJobs:complete"
|
|
476
|
-
});
|
|
477
|
-
notifyFlushComplete();
|
|
652
|
+
insertRenderError(err.name, err.message, err.stack, JSON.stringify(serializedStack));
|
|
478
653
|
}
|
|
654
|
+
|
|
655
|
+
// #endregion
|
|
479
656
|
//# sourceMappingURL=render.js.map
|