@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/src/context.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { shallowRef } from "@vue/reactivity";
|
|
2
2
|
import { effect, getContext } from "./reactivity.js";
|
|
3
3
|
import type { Children, ComponentDefinition } from "./runtime/component.js";
|
|
4
|
-
import {
|
|
4
|
+
import type { StcSignature } from "./stc.js";
|
|
5
5
|
|
|
6
6
|
export interface ComponentContext<T> {
|
|
7
7
|
id: symbol;
|
|
@@ -11,6 +11,23 @@ export interface ComponentContext<T> {
|
|
|
11
11
|
name?: string;
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
+
let _stcImpl:
|
|
15
|
+
| (<T extends {}>(Component: ComponentDefinition<T>) => StcSignature<T>)
|
|
16
|
+
| null = null;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Registers the {@link stc} factory used to lazily build `ProviderStc`.
|
|
20
|
+
* Called once by `stc.ts` at module initialization to break the
|
|
21
|
+
* `context.ts ↔ stc.ts` import cycle.
|
|
22
|
+
*
|
|
23
|
+
* @internal
|
|
24
|
+
*/
|
|
25
|
+
export function _registerStcImpl(
|
|
26
|
+
impl: <T extends {}>(Component: ComponentDefinition<T>) => StcSignature<T>,
|
|
27
|
+
): void {
|
|
28
|
+
_stcImpl = impl;
|
|
29
|
+
}
|
|
30
|
+
|
|
14
31
|
export interface ContextProviderProps<T = unknown> {
|
|
15
32
|
value?: T;
|
|
16
33
|
children?: Children;
|
|
@@ -57,13 +74,29 @@ export function createContext<T = unknown>(
|
|
|
57
74
|
|
|
58
75
|
return rendered.value;
|
|
59
76
|
}
|
|
60
|
-
const ctx = {
|
|
77
|
+
const ctx: ComponentContext<T> = {
|
|
61
78
|
id,
|
|
62
79
|
default: defaultValue,
|
|
63
80
|
name,
|
|
64
81
|
Provider,
|
|
65
|
-
|
|
66
|
-
|
|
82
|
+
} as ComponentContext<T>;
|
|
83
|
+
Object.defineProperty(ctx, "ProviderStc", {
|
|
84
|
+
configurable: true,
|
|
85
|
+
enumerable: true,
|
|
86
|
+
get() {
|
|
87
|
+
if (_stcImpl === null) {
|
|
88
|
+
throw new Error("ProviderStc accessed before stc module initialized.");
|
|
89
|
+
}
|
|
90
|
+
const value = _stcImpl(Provider);
|
|
91
|
+
Object.defineProperty(this, "ProviderStc", {
|
|
92
|
+
value,
|
|
93
|
+
enumerable: true,
|
|
94
|
+
writable: true,
|
|
95
|
+
configurable: true,
|
|
96
|
+
});
|
|
97
|
+
return value;
|
|
98
|
+
},
|
|
99
|
+
});
|
|
67
100
|
(Provider as any).contextName = name;
|
|
68
101
|
contextsByKey.set(id, ctx);
|
|
69
102
|
return ctx;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser stub for CLI debug utilities.
|
|
3
|
+
*
|
|
4
|
+
* Replaces `cli.ts` in browser builds so that `cli-table3` and
|
|
5
|
+
* `picocolors` (Node-only packages) are never imported.
|
|
6
|
+
* All functions are no-ops since CLI debugging is not relevant in browsers.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export function debugStack(): void {}
|
|
10
|
+
|
|
11
|
+
export function debugContext(): void {}
|
|
12
|
+
|
|
13
|
+
export function debugTree(): void {}
|
|
14
|
+
|
|
15
|
+
export function debugWatch(): void {}
|
|
16
|
+
|
|
17
|
+
export function debugRender(): void {}
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
resetDevtoolsServerForTests,
|
|
11
11
|
} from "../devtools/devtools-server.js";
|
|
12
12
|
import { DiagnosticsCollector } from "../diagnostics.js";
|
|
13
|
-
import { renderAsync } from "../render.js";
|
|
13
|
+
import { renderAsync } from "../render-output.js";
|
|
14
14
|
|
|
15
15
|
let socket: WebSocket | undefined;
|
|
16
16
|
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
resetDevtoolsServerForTests,
|
|
12
12
|
} from "../devtools/devtools-server.js";
|
|
13
13
|
import { effect, memo, ref } from "../reactivity.js";
|
|
14
|
-
import { renderAsync } from "../render.js";
|
|
14
|
+
import { renderAsync } from "../render-output.js";
|
|
15
15
|
import { flushJobsAsync } from "../scheduler.js";
|
|
16
16
|
import { debug } from "./index.js";
|
|
17
17
|
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Throttled file-content streaming for devtools.
|
|
3
|
+
*
|
|
4
|
+
* As the render tree mutates, the debug system finds the enclosing
|
|
5
|
+
* `alloy:source-file` wrapper for the changed node and marks it dirty.
|
|
6
|
+
* When a devtools client is connected, dirty files are re-printed at
|
|
7
|
+
* most once per second so users can watch file content build up during
|
|
8
|
+
* rendering. When devtools is not connected, dirty files are flushed
|
|
9
|
+
* once at the end of render via {@link flushAllDirtyFiles}.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { isDevtoolsConnected } from "../devtools/devtools-server.js";
|
|
13
|
+
import type { PrintTreeOptions } from "../output-types.js";
|
|
14
|
+
import { getContextForNode } from "../render/node-context.js";
|
|
15
|
+
import { ElementNode, type AlloyNode } from "../render/node.js";
|
|
16
|
+
import { printNodeToString } from "../render/printer.js";
|
|
17
|
+
import { updated as filesUpdated } from "./files.js";
|
|
18
|
+
import { isDebugEnabled } from "./trace.js";
|
|
19
|
+
|
|
20
|
+
const DEVTOOLS_FLUSH_INTERVAL_MS = 1000;
|
|
21
|
+
|
|
22
|
+
const dirtyFiles = new Set<ElementNode>();
|
|
23
|
+
const lastFlushTimeByFile = new Map<string, number>();
|
|
24
|
+
|
|
25
|
+
/** Find the nearest alloy:source-file ancestor (inclusive). */
|
|
26
|
+
function findSourceFileWrapper(node: AlloyNode): ElementNode | undefined {
|
|
27
|
+
let cur: AlloyNode | null = node;
|
|
28
|
+
while (cur !== null) {
|
|
29
|
+
if (cur instanceof ElementNode && cur.localName === "alloy:source-file") {
|
|
30
|
+
return cur;
|
|
31
|
+
}
|
|
32
|
+
cur = cur.parentNode;
|
|
33
|
+
}
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
interface SourceFileMeta {
|
|
38
|
+
path: string;
|
|
39
|
+
filetype: string;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function getSourceFileMeta(wrapper: ElementNode): SourceFileMeta | undefined {
|
|
43
|
+
const ctx = getContextForNode(wrapper);
|
|
44
|
+
const meta = ctx?.meta as
|
|
45
|
+
| {
|
|
46
|
+
sourceFile?: SourceFileMeta;
|
|
47
|
+
sourceFileReady?: boolean;
|
|
48
|
+
printOptions?: PrintTreeOptions;
|
|
49
|
+
}
|
|
50
|
+
| undefined;
|
|
51
|
+
if (meta?.sourceFileReady === false) return undefined;
|
|
52
|
+
return meta?.sourceFile;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function getPrintOptions(wrapper: ElementNode): PrintTreeOptions | undefined {
|
|
56
|
+
const ctx = getContextForNode(wrapper);
|
|
57
|
+
const meta = ctx?.meta as { printOptions?: PrintTreeOptions } | undefined;
|
|
58
|
+
return meta?.printOptions;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function flushFile(wrapper: ElementNode): void {
|
|
62
|
+
const sf = getSourceFileMeta(wrapper);
|
|
63
|
+
if (!sf) return;
|
|
64
|
+
const printOpts = getPrintOptions(wrapper);
|
|
65
|
+
let contents: string;
|
|
66
|
+
try {
|
|
67
|
+
contents = printNodeToString(wrapper, {
|
|
68
|
+
printWidth: printOpts?.printWidth ?? 80,
|
|
69
|
+
tabWidth: printOpts?.tabWidth ?? 2,
|
|
70
|
+
useTabs: printOpts?.useTabs ?? false,
|
|
71
|
+
}).formatted;
|
|
72
|
+
} catch {
|
|
73
|
+
// Mid-render the tree may be in an inconsistent state — skip this
|
|
74
|
+
// flush attempt and pick it up on the next mutation.
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (printOpts?.insertFinalNewLine !== false && !contents.endsWith("\n")) {
|
|
78
|
+
contents += "\n";
|
|
79
|
+
}
|
|
80
|
+
filesUpdated({ path: sf.path, filetype: sf.filetype, contents });
|
|
81
|
+
lastFlushTimeByFile.set(sf.path, Date.now());
|
|
82
|
+
dirtyFiles.delete(wrapper);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Mark the source file containing `node` as dirty. When devtools is
|
|
87
|
+
* connected and at least 1s has elapsed since this file was last flushed,
|
|
88
|
+
* print and broadcast its content immediately.
|
|
89
|
+
*/
|
|
90
|
+
export function markFileDirtyForNode(node: AlloyNode): void {
|
|
91
|
+
if (!isDebugEnabled()) return;
|
|
92
|
+
const wrapper = findSourceFileWrapper(node);
|
|
93
|
+
if (!wrapper) return;
|
|
94
|
+
dirtyFiles.add(wrapper);
|
|
95
|
+
if (!isDevtoolsConnected()) return;
|
|
96
|
+
const sf = getSourceFileMeta(wrapper);
|
|
97
|
+
if (!sf) return;
|
|
98
|
+
const last = lastFlushTimeByFile.get(sf.path) ?? 0;
|
|
99
|
+
if (Date.now() - last < DEVTOOLS_FLUSH_INTERVAL_MS) return;
|
|
100
|
+
flushFile(wrapper);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** Flush every dirty file. Called at end of render. */
|
|
104
|
+
export function flushAllDirtyFiles(): void {
|
|
105
|
+
if (dirtyFiles.size === 0) return;
|
|
106
|
+
for (const wrapper of [...dirtyFiles]) {
|
|
107
|
+
flushFile(wrapper);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/** Reset all streaming state. Called when a new render begins. */
|
|
112
|
+
export function reset(): void {
|
|
113
|
+
dirtyFiles.clear();
|
|
114
|
+
lastFlushTimeByFile.clear();
|
|
115
|
+
}
|
package/src/debug/files.test.tsx
CHANGED
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
enableDevtools,
|
|
12
12
|
resetDevtoolsServerForTests,
|
|
13
13
|
} from "../devtools/devtools-server.js";
|
|
14
|
-
import { renderAsync } from "../render.js";
|
|
14
|
+
import { renderAsync } from "../render-output.js";
|
|
15
15
|
|
|
16
16
|
let socket: WebSocket | undefined;
|
|
17
17
|
|
|
@@ -61,16 +61,20 @@ it("emits file and directory add/update/remove messages", async () => {
|
|
|
61
61
|
type: "directory:added",
|
|
62
62
|
path: "src",
|
|
63
63
|
});
|
|
64
|
-
expect(initialFiles
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
64
|
+
expect(initialFiles).toEqual(
|
|
65
|
+
expect.arrayContaining([
|
|
66
|
+
expect.objectContaining({
|
|
67
|
+
type: "file:added",
|
|
68
|
+
path: "src/index.ts",
|
|
69
|
+
filetype: "ts",
|
|
70
|
+
}),
|
|
71
|
+
expect.objectContaining({
|
|
72
|
+
type: "file:updated",
|
|
73
|
+
path: "src/index.ts",
|
|
74
|
+
content: expect.any(String),
|
|
75
|
+
}),
|
|
76
|
+
]),
|
|
77
|
+
);
|
|
74
78
|
|
|
75
79
|
collector.stop();
|
|
76
80
|
});
|
package/src/debug/index.ts
CHANGED
|
@@ -27,16 +27,14 @@ import {
|
|
|
27
27
|
updated,
|
|
28
28
|
} from "./files.js";
|
|
29
29
|
import {
|
|
30
|
-
appendCustomContext,
|
|
31
|
-
appendFragmentChild,
|
|
32
|
-
appendPrintHook,
|
|
33
|
-
appendTextNode,
|
|
34
30
|
beginComponent,
|
|
35
31
|
complete,
|
|
36
32
|
error,
|
|
37
33
|
flushJobsComplete,
|
|
38
34
|
initialize,
|
|
39
|
-
|
|
35
|
+
isRerenderEnabled,
|
|
36
|
+
nodeAttached,
|
|
37
|
+
nodeDetached,
|
|
40
38
|
} from "./render.js";
|
|
41
39
|
import {
|
|
42
40
|
registerScope,
|
|
@@ -55,7 +53,11 @@ export type {
|
|
|
55
53
|
EffectEdgeDebugInfo,
|
|
56
54
|
RefDebugInfo,
|
|
57
55
|
} from "./effects.js";
|
|
58
|
-
export {
|
|
56
|
+
export {
|
|
57
|
+
getRenderNodeId,
|
|
58
|
+
type RenderNodeActions,
|
|
59
|
+
type RenderTreeNodeInfo,
|
|
60
|
+
} from "./render.js";
|
|
59
61
|
export type {
|
|
60
62
|
BeginComponentOptions,
|
|
61
63
|
ComponentDebugSession,
|
|
@@ -94,12 +96,10 @@ export const debug = {
|
|
|
94
96
|
},
|
|
95
97
|
render: {
|
|
96
98
|
initialize,
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
appendPrintHook,
|
|
100
|
-
appendFragmentChild,
|
|
99
|
+
nodeAttached,
|
|
100
|
+
nodeDetached,
|
|
101
101
|
beginComponent,
|
|
102
|
-
|
|
102
|
+
isRerenderEnabled,
|
|
103
103
|
error,
|
|
104
104
|
complete,
|
|
105
105
|
flushJobsComplete,
|
|
@@ -22,7 +22,7 @@ import {
|
|
|
22
22
|
resetDevtoolsServerForTests,
|
|
23
23
|
} from "../devtools/devtools-server.js";
|
|
24
24
|
import { effect, ref } from "../reactivity.js";
|
|
25
|
-
import { renderAsync } from "../render.js";
|
|
25
|
+
import { renderAsync } from "../render-output.js";
|
|
26
26
|
import { flushJobsAsync } from "../scheduler.js";
|
|
27
27
|
import { debug } from "./index.js";
|
|
28
28
|
|
|
@@ -56,7 +56,10 @@ afterEach(async () => {
|
|
|
56
56
|
describe("subscriptions", () => {
|
|
57
57
|
it("only receives messages for subscribed channels", async () => {
|
|
58
58
|
// Subscribe to render only — should NOT see effects, refs, etc.
|
|
59
|
-
const collector = await createMessageCollector(socket!, [
|
|
59
|
+
const collector = await createMessageCollector(socket!, [
|
|
60
|
+
"render",
|
|
61
|
+
"components",
|
|
62
|
+
]);
|
|
60
63
|
await renderAsync(<Output>hello</Output>);
|
|
61
64
|
const messages = await collector.waitForRender();
|
|
62
65
|
collector.stop();
|
|
@@ -107,7 +110,10 @@ describe("subscriptions", () => {
|
|
|
107
110
|
|
|
108
111
|
describe("render:node_added", () => {
|
|
109
112
|
it("root node has null parent_id and kind 'root'", async () => {
|
|
110
|
-
const collector = await createMessageCollector(socket!, [
|
|
113
|
+
const collector = await createMessageCollector(socket!, [
|
|
114
|
+
"render",
|
|
115
|
+
"components",
|
|
116
|
+
]);
|
|
111
117
|
await renderAsync(<Output />);
|
|
112
118
|
const messages = await collector.waitForRender();
|
|
113
119
|
collector.stop();
|
|
@@ -124,20 +130,22 @@ describe("render:node_added", () => {
|
|
|
124
130
|
});
|
|
125
131
|
});
|
|
126
132
|
|
|
127
|
-
it("component
|
|
128
|
-
const collector = await createMessageCollector(socket!, [
|
|
133
|
+
it("component instance has numeric id, parent_id, and name", async () => {
|
|
134
|
+
const collector = await createMessageCollector(socket!, [
|
|
135
|
+
"render",
|
|
136
|
+
"components",
|
|
137
|
+
]);
|
|
129
138
|
await renderAsync(<Output />);
|
|
130
139
|
const messages = await collector.waitForRender();
|
|
131
140
|
collector.stop();
|
|
132
141
|
|
|
133
142
|
const output = messages.find(
|
|
134
|
-
(m) => m.type === "
|
|
143
|
+
(m) => m.type === "component:added" && m.name === "Output",
|
|
135
144
|
);
|
|
136
145
|
expect(output).toMatchObject({
|
|
137
|
-
type: "
|
|
146
|
+
type: "component:added",
|
|
138
147
|
id: expect.any(Number),
|
|
139
|
-
parent_id:
|
|
140
|
-
kind: "component",
|
|
148
|
+
parent_id: null,
|
|
141
149
|
name: "Output",
|
|
142
150
|
});
|
|
143
151
|
});
|
|
@@ -156,23 +164,26 @@ describe("render:node_added", () => {
|
|
|
156
164
|
expect(text!.parent_id).toEqual(expect.any(Number));
|
|
157
165
|
});
|
|
158
166
|
|
|
159
|
-
it("non-text node has null value (not undefined)", async () => {
|
|
167
|
+
it("non-text render node has null value (not undefined)", async () => {
|
|
160
168
|
const collector = await createMessageCollector(socket!, ["render"]);
|
|
161
169
|
await renderAsync(<Output>hello</Output>);
|
|
162
170
|
const messages = await collector.waitForRender();
|
|
163
171
|
collector.stop();
|
|
164
172
|
|
|
165
|
-
const
|
|
166
|
-
(m) => m.type === "render:node_added" && m.kind === "
|
|
173
|
+
const nonText = messages.find(
|
|
174
|
+
(m) => m.type === "render:node_added" && m.kind === "directory",
|
|
167
175
|
);
|
|
168
|
-
expect(
|
|
176
|
+
expect(nonText!.value).toBeNull();
|
|
169
177
|
});
|
|
170
178
|
});
|
|
171
179
|
|
|
172
180
|
describe("render:node_removed", () => {
|
|
173
181
|
it("is emitted when a reactive component removes children", async () => {
|
|
174
182
|
const show = ref(true);
|
|
175
|
-
const collector = await createMessageCollector(socket!, [
|
|
183
|
+
const collector = await createMessageCollector(socket!, [
|
|
184
|
+
"render",
|
|
185
|
+
"components",
|
|
186
|
+
]);
|
|
176
187
|
|
|
177
188
|
function Conditional() {
|
|
178
189
|
return () => (show.value ? "visible" : "");
|
|
@@ -691,7 +702,10 @@ describe("debugger:info", () => {
|
|
|
691
702
|
|
|
692
703
|
describe("null vs undefined contract", () => {
|
|
693
704
|
it("nullable fields arrive as null (not undefined or missing)", async () => {
|
|
694
|
-
const collector = await createMessageCollector(socket!, [
|
|
705
|
+
const collector = await createMessageCollector(socket!, [
|
|
706
|
+
"render",
|
|
707
|
+
"components",
|
|
708
|
+
]);
|
|
695
709
|
await renderAsync(<Output>hello</Output>);
|
|
696
710
|
const messages = await collector.waitForRender();
|
|
697
711
|
collector.stop();
|
|
@@ -705,14 +719,13 @@ describe("null vs undefined contract", () => {
|
|
|
705
719
|
expect(root!.parent_id).toBeNull();
|
|
706
720
|
expect("parent_id" in root!).toBe(true);
|
|
707
721
|
|
|
708
|
-
// Component
|
|
722
|
+
// Component facts are not render nodes.
|
|
709
723
|
const component = messages.find(
|
|
710
724
|
(m: DevtoolsMessage) =>
|
|
711
|
-
m.type === "
|
|
725
|
+
m.type === "component:added" && m.name === "Output",
|
|
712
726
|
);
|
|
713
727
|
expect(component).toBeDefined();
|
|
714
|
-
expect(component!.
|
|
715
|
-
expect("value" in component!).toBe(true);
|
|
728
|
+
expect(component!.parent_id).toBeNull();
|
|
716
729
|
|
|
717
730
|
// source_file is nullable
|
|
718
731
|
expect("source_file" in root!).toBe(true);
|
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
resetDevtoolsServerForTests,
|
|
14
14
|
} from "../devtools/devtools-server.js";
|
|
15
15
|
import { ref } from "../reactivity.js";
|
|
16
|
-
import { renderAsync } from "../render.js";
|
|
16
|
+
import { renderAsync } from "../render-output.js";
|
|
17
17
|
import { flushJobsAsync } from "../scheduler.js";
|
|
18
18
|
|
|
19
19
|
/**
|
|
@@ -242,28 +242,19 @@ describe("render tree node orphans", () => {
|
|
|
242
242
|
|
|
243
243
|
expect(orphans).toEqual([]);
|
|
244
244
|
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
list.push(node.value);
|
|
251
|
-
textByParent.set(node.parentId, list);
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
for (const [parentId, values] of textByParent) {
|
|
255
|
-
const dupes = values.filter((v, i) => values.indexOf(v) !== i);
|
|
256
|
-
expect(dupes, `Duplicate text nodes under parent ${parentId}`).toEqual(
|
|
257
|
-
[],
|
|
258
|
-
);
|
|
259
|
-
}
|
|
245
|
+
const textValues = [...active.values()]
|
|
246
|
+
.filter((node) => node.kind === "text")
|
|
247
|
+
.map((node) => node.value);
|
|
248
|
+
expect(textValues).toEqual(expect.arrayContaining(["a", "y", "z"]));
|
|
249
|
+
expect(textValues).not.toEqual(expect.arrayContaining(["b", "c", "x"]));
|
|
260
250
|
|
|
261
251
|
collector.stop();
|
|
262
252
|
});
|
|
263
253
|
|
|
264
254
|
it("no orphans when For with separators re-renders and keeps some items", async () => {
|
|
265
255
|
// mapJoin creates separator/joiner slots between items. These separators
|
|
266
|
-
// contain
|
|
256
|
+
// contain nested formatter-control subtrees that are part of the cached
|
|
257
|
+
// element tree.
|
|
267
258
|
// When items change, the cached subtree is re-added but separator fragments
|
|
268
259
|
// from previous renders must be properly cascade-deleted.
|
|
269
260
|
//
|
|
@@ -285,8 +276,8 @@ describe("render tree node orphans", () => {
|
|
|
285
276
|
const items = ref(["a", "b", "c", "d"]);
|
|
286
277
|
const collector = await createMessageCollector(socket!);
|
|
287
278
|
|
|
288
|
-
// Nested blocks simulate the deeply nested
|
|
289
|
-
//
|
|
279
|
+
// Nested blocks simulate the deeply nested formatter-control trees found in
|
|
280
|
+
// real emitters (e.g., flight-instructor).
|
|
290
281
|
function Item(props: { value: string }) {
|
|
291
282
|
return (
|
|
292
283
|
<Block>
|