@typed/template 0.13.0 → 1.0.0-beta.0
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/README.md +108 -2
- package/dist/EventHandler.d.ts +273 -0
- package/dist/EventHandler.d.ts.map +1 -0
- package/dist/EventHandler.js +261 -0
- package/dist/EventSource.d.ts +82 -0
- package/dist/EventSource.d.ts.map +1 -0
- package/dist/EventSource.js +127 -0
- package/dist/Html.d.ts +122 -0
- package/dist/Html.d.ts.map +1 -0
- package/dist/Html.js +250 -0
- package/dist/HtmlChunk.d.ts +118 -0
- package/dist/HtmlChunk.d.ts.map +1 -0
- package/dist/HtmlChunk.js +211 -0
- package/dist/HydrateContext.d.ts +28 -0
- package/dist/HydrateContext.d.ts.map +1 -0
- package/dist/HydrateContext.js +25 -0
- package/dist/Parser.d.ts +35 -0
- package/dist/Parser.d.ts.map +1 -0
- package/dist/Parser.js +437 -0
- package/dist/Render.d.ts +195 -0
- package/dist/Render.d.ts.map +1 -0
- package/dist/Render.js +609 -0
- package/dist/RenderEvent.d.ts +179 -0
- package/dist/RenderEvent.d.ts.map +1 -0
- package/dist/RenderEvent.js +102 -0
- package/dist/RenderQueue.d.ts +167 -0
- package/dist/RenderQueue.d.ts.map +1 -0
- package/dist/RenderQueue.js +297 -0
- package/dist/RenderTemplate.d.ts +90 -0
- package/dist/RenderTemplate.d.ts.map +1 -0
- package/dist/RenderTemplate.js +87 -0
- package/dist/Renderable.d.ts +88 -0
- package/dist/Renderable.d.ts.map +1 -0
- package/dist/Renderable.js +3 -0
- package/dist/{dts/Template.d.ts → Template.d.ts} +109 -74
- package/dist/Template.d.ts.map +1 -0
- package/dist/{esm/Template.js → Template.js} +96 -56
- package/dist/Wire.d.ts +169 -0
- package/dist/Wire.d.ts.map +1 -0
- package/dist/Wire.js +217 -0
- package/dist/errors.d.ts +145 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +159 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/internal/IndexRefCounter.d.ts +11 -0
- package/dist/internal/IndexRefCounter.d.ts.map +1 -0
- package/dist/internal/IndexRefCounter.js +42 -0
- package/dist/internal/ParentChildNodes.d.ts +6 -0
- package/dist/internal/ParentChildNodes.d.ts.map +1 -0
- package/dist/internal/ParentChildNodes.js +1 -0
- package/dist/internal/PathStack.d.ts +9 -0
- package/dist/internal/PathStack.d.ts.map +1 -0
- package/dist/internal/PathStack.js +18 -0
- package/dist/internal/buildTemplateFragement.d.ts +3 -0
- package/dist/internal/buildTemplateFragement.d.ts.map +1 -0
- package/dist/internal/buildTemplateFragement.js +61 -0
- package/dist/internal/diff.d.ts +2 -0
- package/dist/internal/diff.d.ts.map +1 -0
- package/dist/internal/diff.js +119 -0
- package/dist/internal/dom.d.ts +45 -0
- package/dist/internal/dom.d.ts.map +1 -0
- package/dist/internal/dom.js +304 -0
- package/dist/internal/encoding.d.ts +7 -0
- package/dist/internal/encoding.d.ts.map +1 -0
- package/dist/internal/encoding.js +134 -0
- package/dist/{dts/internal/v2/hydration-template.d.ts → internal/hydration.d.ts} +10 -7
- package/dist/internal/hydration.d.ts.map +1 -0
- package/dist/{esm/internal/v2/hydration-template.js → internal/hydration.js} +80 -26
- package/dist/internal/keyToPartType.d.ts +2 -0
- package/dist/internal/keyToPartType.d.ts.map +1 -0
- package/dist/internal/keyToPartType.js +110 -0
- package/dist/internal/meta.d.ts +17 -0
- package/dist/internal/meta.d.ts.map +1 -0
- package/dist/internal/meta.js +14 -0
- package/dist/internal/takeOneIfNotRenderEvent.d.ts +4 -0
- package/dist/internal/takeOneIfNotRenderEvent.d.ts.map +1 -0
- package/dist/internal/takeOneIfNotRenderEvent.js +10 -0
- package/dist/internal/templateHash.d.ts +2 -0
- package/dist/internal/templateHash.d.ts.map +1 -0
- package/dist/internal/templateHash.js +14 -0
- package/dist/many.d.ts +68 -0
- package/dist/many.d.ts.map +1 -0
- package/dist/many.js +107 -0
- package/package.json +22 -223
- package/src/EventHandler.ts +318 -86
- package/src/EventSource.ts +202 -0
- package/src/Html.test.ts +490 -0
- package/src/Html.ts +292 -333
- package/src/HtmlChunk.ts +290 -332
- package/src/HydrateContext.ts +40 -0
- package/src/Hydration.test.ts +409 -0
- package/src/Parser.test.ts +924 -0
- package/src/Parser.ts +598 -10
- package/src/Render.test.ts +338 -0
- package/src/Render.ts +878 -63
- package/src/RenderEvent.ts +169 -40
- package/src/RenderQueue.ts +290 -383
- package/src/RenderTemplate.ts +98 -31
- package/src/Renderable.ts +122 -24
- package/src/Template.ts +246 -145
- package/src/Wire.ts +309 -0
- package/src/errors.ts +173 -0
- package/src/index.ts +14 -66
- package/src/internal/IndexRefCounter.ts +53 -0
- package/src/internal/ParentChildNodes.ts +7 -0
- package/src/internal/PathStack.ts +23 -0
- package/src/internal/buildTemplateFragement.ts +82 -0
- package/src/internal/diff.ts +127 -0
- package/src/internal/dom.ts +357 -0
- package/src/internal/encoding.ts +147 -0
- package/src/internal/hydration.ts +406 -0
- package/src/internal/keyToPartType.ts +113 -0
- package/src/internal/meta.ts +25 -0
- package/src/internal/takeOneIfNotRenderEvent.ts +19 -0
- package/src/internal/templateHash.ts +18 -0
- package/src/many.ts +148 -0
- package/tsconfig.json +6 -0
- package/Directive/package.json +0 -6
- package/ElementRef/package.json +0 -6
- package/ElementSource/package.json +0 -6
- package/Entry/package.json +0 -6
- package/EventHandler/package.json +0 -6
- package/Html/package.json +0 -6
- package/HtmlChunk/package.json +0 -6
- package/Hydrate/package.json +0 -6
- package/LICENSE +0 -21
- package/Many/package.json +0 -6
- package/Meta/package.json +0 -6
- package/Parser/package.json +0 -6
- package/Part/package.json +0 -6
- package/Placeholder/package.json +0 -6
- package/Platform/package.json +0 -6
- package/Render/package.json +0 -6
- package/RenderContext/package.json +0 -6
- package/RenderEvent/package.json +0 -6
- package/RenderQueue/package.json +0 -6
- package/RenderTemplate/package.json +0 -6
- package/Renderable/package.json +0 -6
- package/Template/package.json +0 -6
- package/Test/package.json +0 -6
- package/Vitest/package.json +0 -6
- package/compiler-tools/package.json +0 -6
- package/dist/cjs/Directive.js +0 -76
- package/dist/cjs/Directive.js.map +0 -1
- package/dist/cjs/ElementRef.js +0 -92
- package/dist/cjs/ElementRef.js.map +0 -1
- package/dist/cjs/ElementSource.js +0 -242
- package/dist/cjs/ElementSource.js.map +0 -1
- package/dist/cjs/Entry.js +0 -6
- package/dist/cjs/Entry.js.map +0 -1
- package/dist/cjs/EventHandler.js +0 -76
- package/dist/cjs/EventHandler.js.map +0 -1
- package/dist/cjs/Html.js +0 -224
- package/dist/cjs/Html.js.map +0 -1
- package/dist/cjs/HtmlChunk.js +0 -306
- package/dist/cjs/HtmlChunk.js.map +0 -1
- package/dist/cjs/Hydrate.js +0 -43
- package/dist/cjs/Hydrate.js.map +0 -1
- package/dist/cjs/Many.js +0 -66
- package/dist/cjs/Many.js.map +0 -1
- package/dist/cjs/Meta.js +0 -50
- package/dist/cjs/Meta.js.map +0 -1
- package/dist/cjs/Parser.js +0 -19
- package/dist/cjs/Parser.js.map +0 -1
- package/dist/cjs/Part.js +0 -6
- package/dist/cjs/Part.js.map +0 -1
- package/dist/cjs/Placeholder.js +0 -34
- package/dist/cjs/Placeholder.js.map +0 -1
- package/dist/cjs/Platform.js +0 -66
- package/dist/cjs/Platform.js.map +0 -1
- package/dist/cjs/Render.js +0 -50
- package/dist/cjs/Render.js.map +0 -1
- package/dist/cjs/RenderContext.js +0 -67
- package/dist/cjs/RenderContext.js.map +0 -1
- package/dist/cjs/RenderEvent.js +0 -52
- package/dist/cjs/RenderEvent.js.map +0 -1
- package/dist/cjs/RenderQueue.js +0 -341
- package/dist/cjs/RenderQueue.js.map +0 -1
- package/dist/cjs/RenderTemplate.js +0 -26
- package/dist/cjs/RenderTemplate.js.map +0 -1
- package/dist/cjs/Renderable.js +0 -6
- package/dist/cjs/Renderable.js.map +0 -1
- package/dist/cjs/Template.js +0 -305
- package/dist/cjs/Template.js.map +0 -1
- package/dist/cjs/Test.js +0 -184
- package/dist/cjs/Test.js.map +0 -1
- package/dist/cjs/Vitest.js +0 -52
- package/dist/cjs/Vitest.js.map +0 -1
- package/dist/cjs/compiler-tools.js +0 -100
- package/dist/cjs/compiler-tools.js.map +0 -1
- package/dist/cjs/index.js +0 -138
- package/dist/cjs/index.js.map +0 -1
- package/dist/cjs/internal/EventSource.js +0 -129
- package/dist/cjs/internal/EventSource.js.map +0 -1
- package/dist/cjs/internal/HydrateContext.js +0 -13
- package/dist/cjs/internal/HydrateContext.js.map +0 -1
- package/dist/cjs/internal/browser.js +0 -110
- package/dist/cjs/internal/browser.js.map +0 -1
- package/dist/cjs/internal/character-entities.js +0 -2141
- package/dist/cjs/internal/character-entities.js.map +0 -1
- package/dist/cjs/internal/chunks.js +0 -68
- package/dist/cjs/internal/chunks.js.map +0 -1
- package/dist/cjs/internal/errors.js +0 -52
- package/dist/cjs/internal/errors.js.map +0 -1
- package/dist/cjs/internal/indexRefCounter.js +0 -52
- package/dist/cjs/internal/indexRefCounter.js.map +0 -1
- package/dist/cjs/internal/module-augmentation.js +0 -6
- package/dist/cjs/internal/module-augmentation.js.map +0 -1
- package/dist/cjs/internal/parser.js +0 -568
- package/dist/cjs/internal/parser.js.map +0 -1
- package/dist/cjs/internal/parser2.js +0 -382
- package/dist/cjs/internal/parser2.js.map +0 -1
- package/dist/cjs/internal/server-parts.js +0 -124
- package/dist/cjs/internal/server-parts.js.map +0 -1
- package/dist/cjs/internal/server.js +0 -48
- package/dist/cjs/internal/server.js.map +0 -1
- package/dist/cjs/internal/utils.js +0 -136
- package/dist/cjs/internal/utils.js.map +0 -1
- package/dist/cjs/internal/v2/SyncPart.js +0 -6
- package/dist/cjs/internal/v2/SyncPart.js.map +0 -1
- package/dist/cjs/internal/v2/helpers.js +0 -15
- package/dist/cjs/internal/v2/helpers.js.map +0 -1
- package/dist/cjs/internal/v2/hydration-template.js +0 -269
- package/dist/cjs/internal/v2/hydration-template.js.map +0 -1
- package/dist/cjs/internal/v2/parts.js +0 -169
- package/dist/cjs/internal/v2/parts.js.map +0 -1
- package/dist/cjs/internal/v2/render-entry.js +0 -110
- package/dist/cjs/internal/v2/render-entry.js.map +0 -1
- package/dist/cjs/internal/v2/render-sync-parts.js +0 -318
- package/dist/cjs/internal/v2/render-sync-parts.js.map +0 -1
- package/dist/cjs/internal/v2/render.js +0 -592
- package/dist/cjs/internal/v2/render.js.map +0 -1
- package/dist/cjs/internal/v2/sync-parts.js +0 -115
- package/dist/cjs/internal/v2/sync-parts.js.map +0 -1
- package/dist/dts/Directive.d.ts +0 -70
- package/dist/dts/Directive.d.ts.map +0 -1
- package/dist/dts/ElementRef.d.ts +0 -42
- package/dist/dts/ElementRef.d.ts.map +0 -1
- package/dist/dts/ElementSource.d.ts +0 -77
- package/dist/dts/ElementSource.d.ts.map +0 -1
- package/dist/dts/Entry.d.ts +0 -26
- package/dist/dts/Entry.d.ts.map +0 -1
- package/dist/dts/EventHandler.d.ts +0 -73
- package/dist/dts/EventHandler.d.ts.map +0 -1
- package/dist/dts/Html.d.ts +0 -35
- package/dist/dts/Html.d.ts.map +0 -1
- package/dist/dts/HtmlChunk.d.ts +0 -56
- package/dist/dts/HtmlChunk.d.ts.map +0 -1
- package/dist/dts/Hydrate.d.ts +0 -19
- package/dist/dts/Hydrate.d.ts.map +0 -1
- package/dist/dts/Many.d.ts +0 -32
- package/dist/dts/Many.d.ts.map +0 -1
- package/dist/dts/Meta.d.ts +0 -33
- package/dist/dts/Meta.d.ts.map +0 -1
- package/dist/dts/Parser.d.ts +0 -13
- package/dist/dts/Parser.d.ts.map +0 -1
- package/dist/dts/Part.d.ts +0 -121
- package/dist/dts/Part.d.ts.map +0 -1
- package/dist/dts/Placeholder.d.ts +0 -48
- package/dist/dts/Placeholder.d.ts.map +0 -1
- package/dist/dts/Platform.d.ts +0 -21
- package/dist/dts/Platform.d.ts.map +0 -1
- package/dist/dts/Render.d.ts +0 -31
- package/dist/dts/Render.d.ts.map +0 -1
- package/dist/dts/RenderContext.d.ts +0 -70
- package/dist/dts/RenderContext.d.ts.map +0 -1
- package/dist/dts/RenderEvent.d.ts +0 -42
- package/dist/dts/RenderEvent.d.ts.map +0 -1
- package/dist/dts/RenderQueue.d.ts +0 -103
- package/dist/dts/RenderQueue.d.ts.map +0 -1
- package/dist/dts/RenderTemplate.d.ts +0 -25
- package/dist/dts/RenderTemplate.d.ts.map +0 -1
- package/dist/dts/Renderable.d.ts +0 -28
- package/dist/dts/Renderable.d.ts.map +0 -1
- package/dist/dts/Template.d.ts.map +0 -1
- package/dist/dts/Test.d.ts +0 -85
- package/dist/dts/Test.d.ts.map +0 -1
- package/dist/dts/Vitest.d.ts +0 -43
- package/dist/dts/Vitest.d.ts.map +0 -1
- package/dist/dts/compiler-tools.d.ts +0 -143
- package/dist/dts/compiler-tools.d.ts.map +0 -1
- package/dist/dts/index.d.ts +0 -65
- package/dist/dts/index.d.ts.map +0 -1
- package/dist/dts/internal/EventSource.d.ts +0 -13
- package/dist/dts/internal/EventSource.d.ts.map +0 -1
- package/dist/dts/internal/HydrateContext.d.ts +0 -2
- package/dist/dts/internal/HydrateContext.d.ts.map +0 -1
- package/dist/dts/internal/browser.d.ts +0 -8
- package/dist/dts/internal/browser.d.ts.map +0 -1
- package/dist/dts/internal/character-entities.d.ts +0 -2133
- package/dist/dts/internal/character-entities.d.ts.map +0 -1
- package/dist/dts/internal/chunks.d.ts +0 -23
- package/dist/dts/internal/chunks.d.ts.map +0 -1
- package/dist/dts/internal/errors.d.ts +0 -22
- package/dist/dts/internal/errors.d.ts.map +0 -1
- package/dist/dts/internal/indexRefCounter.d.ts +0 -7
- package/dist/dts/internal/indexRefCounter.d.ts.map +0 -1
- package/dist/dts/internal/module-augmentation.d.ts +0 -32
- package/dist/dts/internal/module-augmentation.d.ts.map +0 -1
- package/dist/dts/internal/parser.d.ts +0 -33
- package/dist/dts/internal/parser.d.ts.map +0 -1
- package/dist/dts/internal/parser2.d.ts +0 -12
- package/dist/dts/internal/parser2.d.ts.map +0 -1
- package/dist/dts/internal/server-parts.d.ts +0 -223
- package/dist/dts/internal/server-parts.d.ts.map +0 -1
- package/dist/dts/internal/server.d.ts +0 -5
- package/dist/dts/internal/server.d.ts.map +0 -1
- package/dist/dts/internal/utils.d.ts +0 -19
- package/dist/dts/internal/utils.d.ts.map +0 -1
- package/dist/dts/internal/v2/SyncPart.d.ts +0 -87
- package/dist/dts/internal/v2/SyncPart.d.ts.map +0 -1
- package/dist/dts/internal/v2/helpers.d.ts +0 -3
- package/dist/dts/internal/v2/helpers.d.ts.map +0 -1
- package/dist/dts/internal/v2/hydration-template.d.ts.map +0 -1
- package/dist/dts/internal/v2/parts.d.ts +0 -245
- package/dist/dts/internal/v2/parts.d.ts.map +0 -1
- package/dist/dts/internal/v2/render-entry.d.ts +0 -6
- package/dist/dts/internal/v2/render-entry.d.ts.map +0 -1
- package/dist/dts/internal/v2/render-sync-parts.d.ts +0 -22
- package/dist/dts/internal/v2/render-sync-parts.d.ts.map +0 -1
- package/dist/dts/internal/v2/render.d.ts +0 -83
- package/dist/dts/internal/v2/render.d.ts.map +0 -1
- package/dist/dts/internal/v2/sync-parts.d.ts +0 -129
- package/dist/dts/internal/v2/sync-parts.d.ts.map +0 -1
- package/dist/esm/Directive.js +0 -64
- package/dist/esm/Directive.js.map +0 -1
- package/dist/esm/ElementRef.js +0 -76
- package/dist/esm/ElementRef.js.map +0 -1
- package/dist/esm/ElementSource.js +0 -240
- package/dist/esm/ElementSource.js.map +0 -1
- package/dist/esm/Entry.js +0 -2
- package/dist/esm/Entry.js.map +0 -1
- package/dist/esm/EventHandler.js +0 -68
- package/dist/esm/EventHandler.js.map +0 -1
- package/dist/esm/Html.js +0 -230
- package/dist/esm/Html.js.map +0 -1
- package/dist/esm/HtmlChunk.js +0 -330
- package/dist/esm/HtmlChunk.js.map +0 -1
- package/dist/esm/Hydrate.js +0 -31
- package/dist/esm/Hydrate.js.map +0 -1
- package/dist/esm/Many.js +0 -54
- package/dist/esm/Many.js.map +0 -1
- package/dist/esm/Meta.js +0 -40
- package/dist/esm/Meta.js.map +0 -1
- package/dist/esm/Parser.js +0 -13
- package/dist/esm/Parser.js.map +0 -1
- package/dist/esm/Part.js +0 -5
- package/dist/esm/Part.js.map +0 -1
- package/dist/esm/Placeholder.js +0 -26
- package/dist/esm/Placeholder.js.map +0 -1
- package/dist/esm/Platform.js +0 -43
- package/dist/esm/Platform.js.map +0 -1
- package/dist/esm/Render.js +0 -36
- package/dist/esm/Render.js.map +0 -1
- package/dist/esm/RenderContext.js +0 -54
- package/dist/esm/RenderContext.js.map +0 -1
- package/dist/esm/RenderEvent.js +0 -43
- package/dist/esm/RenderEvent.js.map +0 -1
- package/dist/esm/RenderQueue.js +0 -336
- package/dist/esm/RenderQueue.js.map +0 -1
- package/dist/esm/RenderTemplate.js +0 -16
- package/dist/esm/RenderTemplate.js.map +0 -1
- package/dist/esm/Renderable.js +0 -2
- package/dist/esm/Renderable.js.map +0 -1
- package/dist/esm/Template.js.map +0 -1
- package/dist/esm/Test.js +0 -167
- package/dist/esm/Test.js.map +0 -1
- package/dist/esm/Vitest.js +0 -44
- package/dist/esm/Vitest.js.map +0 -1
- package/dist/esm/compiler-tools.js +0 -91
- package/dist/esm/compiler-tools.js.map +0 -1
- package/dist/esm/index.js +0 -65
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/internal/EventSource.js +0 -126
- package/dist/esm/internal/EventSource.js.map +0 -1
- package/dist/esm/internal/HydrateContext.js +0 -7
- package/dist/esm/internal/HydrateContext.js.map +0 -1
- package/dist/esm/internal/browser.js +0 -103
- package/dist/esm/internal/browser.js.map +0 -1
- package/dist/esm/internal/character-entities.js +0 -2134
- package/dist/esm/internal/character-entities.js.map +0 -1
- package/dist/esm/internal/chunks.js +0 -60
- package/dist/esm/internal/chunks.js.map +0 -1
- package/dist/esm/internal/errors.js +0 -46
- package/dist/esm/internal/errors.js.map +0 -1
- package/dist/esm/internal/indexRefCounter.js +0 -47
- package/dist/esm/internal/indexRefCounter.js.map +0 -1
- package/dist/esm/internal/module-augmentation.js +0 -2
- package/dist/esm/internal/module-augmentation.js.map +0 -1
- package/dist/esm/internal/parser.js +0 -596
- package/dist/esm/internal/parser.js.map +0 -1
- package/dist/esm/internal/parser2.js +0 -393
- package/dist/esm/internal/parser2.js.map +0 -1
- package/dist/esm/internal/server-parts.js +0 -109
- package/dist/esm/internal/server-parts.js.map +0 -1
- package/dist/esm/internal/server.js +0 -22
- package/dist/esm/internal/server.js.map +0 -1
- package/dist/esm/internal/utils.js +0 -119
- package/dist/esm/internal/utils.js.map +0 -1
- package/dist/esm/internal/v2/SyncPart.js +0 -5
- package/dist/esm/internal/v2/SyncPart.js.map +0 -1
- package/dist/esm/internal/v2/helpers.js +0 -12
- package/dist/esm/internal/v2/helpers.js.map +0 -1
- package/dist/esm/internal/v2/hydration-template.js.map +0 -1
- package/dist/esm/internal/v2/parts.js +0 -150
- package/dist/esm/internal/v2/parts.js.map +0 -1
- package/dist/esm/internal/v2/render-entry.js +0 -102
- package/dist/esm/internal/v2/render-entry.js.map +0 -1
- package/dist/esm/internal/v2/render-sync-parts.js +0 -265
- package/dist/esm/internal/v2/render-sync-parts.js.map +0 -1
- package/dist/esm/internal/v2/render.js +0 -521
- package/dist/esm/internal/v2/render.js.map +0 -1
- package/dist/esm/internal/v2/sync-parts.js +0 -102
- package/dist/esm/internal/v2/sync-parts.js.map +0 -1
- package/dist/esm/package.json +0 -4
- package/src/Directive.ts +0 -114
- package/src/ElementRef.ts +0 -126
- package/src/ElementSource.ts +0 -432
- package/src/Entry.ts +0 -28
- package/src/Hydrate.ts +0 -51
- package/src/Many.ts +0 -161
- package/src/Meta.ts +0 -45
- package/src/Part.ts +0 -154
- package/src/Placeholder.ts +0 -78
- package/src/Platform.ts +0 -71
- package/src/RenderContext.ts +0 -121
- package/src/Test.ts +0 -354
- package/src/Vitest.ts +0 -141
- package/src/compiler-tools.ts +0 -250
- package/src/internal/EventSource.ts +0 -188
- package/src/internal/HydrateContext.ts +0 -22
- package/src/internal/browser.ts +0 -138
- package/src/internal/character-entities.ts +0 -2136
- package/src/internal/chunks.ts +0 -89
- package/src/internal/errors.ts +0 -49
- package/src/internal/external.d.ts +0 -11
- package/src/internal/indexRefCounter.ts +0 -54
- package/src/internal/module-augmentation.ts +0 -44
- package/src/internal/parser.ts +0 -757
- package/src/internal/parser2.ts +0 -468
- package/src/internal/server-parts.ts +0 -161
- package/src/internal/server.ts +0 -37
- package/src/internal/utils.ts +0 -153
- package/src/internal/v2/SyncPart.ts +0 -112
- package/src/internal/v2/helpers.ts +0 -13
- package/src/internal/v2/hydration-template.ts +0 -308
- package/src/internal/v2/parts.ts +0 -254
- package/src/internal/v2/render-entry.ts +0 -131
- package/src/internal/v2/render-sync-parts.ts +0 -440
- package/src/internal/v2/render.ts +0 -813
- package/src/internal/v2/sync-parts.ts +0 -133
|
@@ -1,813 +0,0 @@
|
|
|
1
|
-
import * as Context from "@typed/context"
|
|
2
|
-
import * as Fx from "@typed/fx"
|
|
3
|
-
import type { Rendered } from "@typed/wire"
|
|
4
|
-
import { isText, persistent } from "@typed/wire"
|
|
5
|
-
import { Option } from "effect"
|
|
6
|
-
import * as Cause from "effect/Cause"
|
|
7
|
-
import * as Chunk from "effect/Chunk"
|
|
8
|
-
import * as Effect from "effect/Effect"
|
|
9
|
-
import * as ExecutionStrategy from "effect/ExecutionStrategy"
|
|
10
|
-
import { flow } from "effect/Function"
|
|
11
|
-
import * as Scope from "effect/Scope"
|
|
12
|
-
import { type Directive, isDirective } from "../../Directive.js"
|
|
13
|
-
import * as ElementRef from "../../ElementRef.js"
|
|
14
|
-
import * as ElementSource from "../../ElementSource.js"
|
|
15
|
-
import * as EventHandler from "../../EventHandler.js"
|
|
16
|
-
import type { Placeholder } from "../../Placeholder.js"
|
|
17
|
-
import type { ToRendered } from "../../Render.js"
|
|
18
|
-
import type { Renderable } from "../../Renderable.js"
|
|
19
|
-
import type { RenderContext } from "../../RenderContext.js"
|
|
20
|
-
import { DomRenderEvent, type RenderEvent } from "../../RenderEvent.js"
|
|
21
|
-
import { DEFAULT_PRIORITY, RenderQueue } from "../../RenderQueue.js"
|
|
22
|
-
import type { RenderTemplate } from "../../RenderTemplate.js"
|
|
23
|
-
import type * as Template from "../../Template.js"
|
|
24
|
-
import { CouldNotFindCommentError, isHydrationError } from "../errors.js"
|
|
25
|
-
import type { EventSource } from "../EventSource.js"
|
|
26
|
-
import { makeEventSource } from "../EventSource.js"
|
|
27
|
-
import { HydrateContext } from "../HydrateContext.js"
|
|
28
|
-
import type { IndexRefCounter } from "../indexRefCounter.js"
|
|
29
|
-
import { makeRefCounter } from "../indexRefCounter.js"
|
|
30
|
-
import type { ParentChildNodes } from "../utils.js"
|
|
31
|
-
import { findHoleComment, findHydratePath, findPath, isCommentWithValue, keyToPartType } from "../utils.js"
|
|
32
|
-
import { isNullOrUndefined } from "./helpers.js"
|
|
33
|
-
import type { HydrationHole, HydrationNode, HydrationTemplate } from "./hydration-template.js"
|
|
34
|
-
import {
|
|
35
|
-
findHydrationHole,
|
|
36
|
-
findHydrationMany,
|
|
37
|
-
findHydrationTemplate,
|
|
38
|
-
getChildNodes,
|
|
39
|
-
getNodes,
|
|
40
|
-
getPreviousNodes
|
|
41
|
-
} from "./hydration-template.js"
|
|
42
|
-
import { EventPartImpl, RefPartImpl, syncPartToPart } from "./parts.js"
|
|
43
|
-
import { getBrowserEntry } from "./render-entry.js"
|
|
44
|
-
import * as SyncPartsInternal from "./render-sync-parts.js"
|
|
45
|
-
import type { SyncPart } from "./SyncPart.js"
|
|
46
|
-
|
|
47
|
-
export type TemplateContext = {
|
|
48
|
-
/**
|
|
49
|
-
* @internal
|
|
50
|
-
*/
|
|
51
|
-
expected: number
|
|
52
|
-
/**
|
|
53
|
-
* @internal
|
|
54
|
-
*/
|
|
55
|
-
spreadIndex: number
|
|
56
|
-
|
|
57
|
-
readonly context: Context.Context<Scope.Scope>
|
|
58
|
-
readonly document: Document
|
|
59
|
-
readonly eventSource: EventSource
|
|
60
|
-
readonly parentScope: Scope.Scope
|
|
61
|
-
readonly queue: RenderQueue
|
|
62
|
-
readonly refCounter: IndexRefCounter
|
|
63
|
-
readonly renderContext: RenderContext
|
|
64
|
-
readonly scope: Scope.CloseableScope
|
|
65
|
-
readonly values: ReadonlyArray<Renderable<any, any>>
|
|
66
|
-
readonly onCause: (cause: Cause.Cause<any>) => Effect.Effect<unknown>
|
|
67
|
-
readonly manyKey: string | undefined
|
|
68
|
-
|
|
69
|
-
readonly hydrateContext: Option.Option<HydrateContext>
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
export const renderTemplate: (
|
|
73
|
-
document: Document,
|
|
74
|
-
renderContext: RenderContext
|
|
75
|
-
) => RenderTemplate = (document, renderContext) =>
|
|
76
|
-
<Values extends ReadonlyArray<Renderable<any, any>>>(
|
|
77
|
-
templateStrings: TemplateStringsArray,
|
|
78
|
-
values: Values
|
|
79
|
-
) => {
|
|
80
|
-
const entry = getBrowserEntry(document, renderContext, templateStrings)
|
|
81
|
-
|
|
82
|
-
return Fx.make<
|
|
83
|
-
RenderEvent,
|
|
84
|
-
Placeholder.Error<Values[number]>,
|
|
85
|
-
Scope.Scope | RenderQueue | Placeholder.Context<Values[number]>
|
|
86
|
-
>(function render(
|
|
87
|
-
sink
|
|
88
|
-
): Effect.Effect<unknown, never, Scope.Scope | RenderQueue | Placeholder.Context<Values[number]>> {
|
|
89
|
-
return Effect.catchAllCause(
|
|
90
|
-
Effect.gen(function*() {
|
|
91
|
-
// Create a context for rendering our template
|
|
92
|
-
const ctx = yield* makeTemplateContext<Values>(
|
|
93
|
-
document,
|
|
94
|
-
renderContext,
|
|
95
|
-
values,
|
|
96
|
-
sink.onFailure
|
|
97
|
-
)
|
|
98
|
-
|
|
99
|
-
const hydration = attemptHydration(ctx, entry.template.hash)
|
|
100
|
-
|
|
101
|
-
let effects: Array<Effect.Effect<void, any, any>>
|
|
102
|
-
let content: DocumentFragment
|
|
103
|
-
let wire: Rendered | undefined
|
|
104
|
-
|
|
105
|
-
if (Option.isSome(hydration)) {
|
|
106
|
-
const { hydrateCtx, where } = hydration.value
|
|
107
|
-
effects = setupHydrateParts(entry.template.parts, {
|
|
108
|
-
...ctx,
|
|
109
|
-
where,
|
|
110
|
-
manyKey: hydrateCtx.manyKey,
|
|
111
|
-
makeHydrateContext: (where: HydrationNode): HydrateContext => ({
|
|
112
|
-
where,
|
|
113
|
-
hydrate: true
|
|
114
|
-
})
|
|
115
|
-
})
|
|
116
|
-
|
|
117
|
-
wire = getWire(where)
|
|
118
|
-
} else {
|
|
119
|
-
content = ctx.document.importNode(entry.content, true)
|
|
120
|
-
effects = setupRenderParts(entry.template.parts, content, ctx)
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
if (effects.length > 0) {
|
|
124
|
-
yield* Effect.forEach(effects, flow(Effect.catchAllCause(ctx.onCause), Effect.forkIn(ctx.scope)))
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
// If there's anything to wait on and it's not already done, wait for an initial value
|
|
128
|
-
// for all asynchronous sources.
|
|
129
|
-
if (ctx.expected > 0 && (yield* ctx.refCounter.expect(ctx.expected))) {
|
|
130
|
-
yield* ctx.refCounter.wait
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
// If we're not hydrating, we need to create our wire from our content
|
|
134
|
-
if (wire === undefined) {
|
|
135
|
-
wire = persistent(ctx.document, content!)
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
// Setup our event listeners for our wire.
|
|
139
|
-
// We use the parentScope to allow event listeners to exist
|
|
140
|
-
// beyond the lifetime of the current Fiber, but no further than its parent template.
|
|
141
|
-
yield* ctx.eventSource.setup(wire, ctx.parentScope)
|
|
142
|
-
|
|
143
|
-
// If we're hydrating, we need to mark this part of the stack as hydrated
|
|
144
|
-
if (Option.isSome(hydration)) {
|
|
145
|
-
hydration.value.hydrateCtx.hydrate = false
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
// Emit our DomRenderEvent
|
|
149
|
-
yield* sink.onSuccess(DomRenderEvent(wire)).pipe(
|
|
150
|
-
// Ensure our templates last forever in the DOM environment
|
|
151
|
-
// so event listeners are kept attached to the current Scope.
|
|
152
|
-
Effect.zipRight(Effect.never),
|
|
153
|
-
// Close our scope whenever the current Fiber is interrupted
|
|
154
|
-
Effect.onExit((exit) => Scope.close(ctx.scope, exit))
|
|
155
|
-
)
|
|
156
|
-
}),
|
|
157
|
-
(cause) => {
|
|
158
|
-
const hydrationFailure = Chunk.findFirst(Cause.defects(cause), isHydrationError)
|
|
159
|
-
if (Option.isSome(hydrationFailure)) {
|
|
160
|
-
return HydrateContext.pipe(
|
|
161
|
-
Effect.tap((ctx) => ctx.hydrate = false),
|
|
162
|
-
Effect.flatMap(() => render(sink))
|
|
163
|
-
)
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
return sink.onFailure(cause)
|
|
167
|
-
}
|
|
168
|
-
)
|
|
169
|
-
})
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
export function makeTemplateContext<Values extends ReadonlyArray<Renderable<any, any>>>(
|
|
173
|
-
document: Document,
|
|
174
|
-
renderContext: RenderContext,
|
|
175
|
-
values: ReadonlyArray<Renderable<any, any>>,
|
|
176
|
-
onCause: (cause: Cause.Cause<Placeholder.Error<Values[number]>>) => Effect.Effect<unknown>
|
|
177
|
-
): Effect.Effect<TemplateContext, never, Scope.Scope | RenderQueue | Placeholder.Context<Values[number]>> {
|
|
178
|
-
return Effect.gen(function*() {
|
|
179
|
-
const refCounter = yield* makeRefCounter
|
|
180
|
-
const context = yield* Effect.context<Placeholder.Context<Values[number]> | Scope.Scope | RenderQueue>()
|
|
181
|
-
const queue = Context.get(context, RenderQueue)
|
|
182
|
-
const parentScope = Context.get(context, Scope.Scope)
|
|
183
|
-
const eventSource = makeEventSource()
|
|
184
|
-
const scope = yield* Scope.fork(parentScope, ExecutionStrategy.sequential)
|
|
185
|
-
const hydrateContext = Context.getOption(context, HydrateContext)
|
|
186
|
-
const templateContext: TemplateContext = {
|
|
187
|
-
context: Context.add(context, Scope.Scope, scope),
|
|
188
|
-
expected: 0,
|
|
189
|
-
document,
|
|
190
|
-
eventSource,
|
|
191
|
-
hydrateContext,
|
|
192
|
-
parentScope,
|
|
193
|
-
manyKey: undefined,
|
|
194
|
-
queue,
|
|
195
|
-
refCounter,
|
|
196
|
-
renderContext,
|
|
197
|
-
scope,
|
|
198
|
-
values,
|
|
199
|
-
spreadIndex: values.length,
|
|
200
|
-
onCause
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
return templateContext
|
|
204
|
-
})
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
export function attemptHydration(
|
|
208
|
-
ctx: TemplateContext,
|
|
209
|
-
hash: string
|
|
210
|
-
): Option.Option<{ readonly where: HydrationTemplate; readonly hydrateCtx: HydrateContext }> {
|
|
211
|
-
if (Option.isSome(ctx.hydrateContext) && ctx.hydrateContext.value.hydrate) {
|
|
212
|
-
const hydrateCtx = ctx.hydrateContext.value
|
|
213
|
-
const where = findHydrationTemplateByHash(hydrateCtx, hash)
|
|
214
|
-
if (where === null) {
|
|
215
|
-
hydrateCtx.hydrate = false
|
|
216
|
-
return Option.none()
|
|
217
|
-
} else {
|
|
218
|
-
return Option.some({ where, hydrateCtx })
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
return Option.none()
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
function setupRenderParts(
|
|
226
|
-
parts: Template.Template["parts"],
|
|
227
|
-
content: ParentChildNodes,
|
|
228
|
-
ctx: TemplateContext
|
|
229
|
-
) {
|
|
230
|
-
const effects: Array<Effect.Effect<void, any, any>> = []
|
|
231
|
-
|
|
232
|
-
for (const [part, path] of parts) {
|
|
233
|
-
const effect = setupRenderPart(part, content, path, ctx)
|
|
234
|
-
if (effect) {
|
|
235
|
-
effects.push(effect)
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
return effects
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
function setupRenderPart(
|
|
243
|
-
part: Template.PartNode | Template.SparsePartNode,
|
|
244
|
-
content: ParentChildNodes,
|
|
245
|
-
path: Chunk.Chunk<number>,
|
|
246
|
-
ctx: TemplateContext
|
|
247
|
-
) {
|
|
248
|
-
switch (part._tag) {
|
|
249
|
-
case "attr":
|
|
250
|
-
return setupAttrPart(part, findPath(content, path) as HTMLElement | SVGElement, ctx, ctx.values[part.index])
|
|
251
|
-
case "boolean-part":
|
|
252
|
-
return setupBooleanPart(
|
|
253
|
-
part,
|
|
254
|
-
findPath(content, path) as HTMLElement | SVGElement,
|
|
255
|
-
ctx,
|
|
256
|
-
ctx.values[part.index]
|
|
257
|
-
)
|
|
258
|
-
case "className-part":
|
|
259
|
-
return setupClassNamePart(
|
|
260
|
-
part,
|
|
261
|
-
findPath(content, path) as HTMLElement | SVGElement,
|
|
262
|
-
ctx,
|
|
263
|
-
ctx.values[part.index]
|
|
264
|
-
)
|
|
265
|
-
case "comment-part":
|
|
266
|
-
return setupCommentPart(part, findPath(content, path) as Comment, ctx, ctx.values[part.index])
|
|
267
|
-
case "data":
|
|
268
|
-
return setupDataPart(part, findPath(content, path) as HTMLElement | SVGElement, ctx, ctx.values[part.index])
|
|
269
|
-
case "event":
|
|
270
|
-
return setupEventPart(part, findPath(content, path) as HTMLElement | SVGElement, ctx, ctx.values[part.index])
|
|
271
|
-
case "node": {
|
|
272
|
-
const parent = findPath(content, path) as Element
|
|
273
|
-
const comment = findHoleComment(parent, part.index)
|
|
274
|
-
return setupNodePart(part, comment, ctx, null, [])
|
|
275
|
-
}
|
|
276
|
-
case "properties":
|
|
277
|
-
return setupPropertiesPart(findPath(content, path) as HTMLElement | SVGElement, ctx, ctx.values[part.index])
|
|
278
|
-
case "property":
|
|
279
|
-
return setupPropertyPart(
|
|
280
|
-
part,
|
|
281
|
-
findPath(content, path) as HTMLElement | SVGElement,
|
|
282
|
-
ctx,
|
|
283
|
-
ctx.values[part.index]
|
|
284
|
-
)
|
|
285
|
-
case "ref":
|
|
286
|
-
return setupRefPart(part, findPath(content, path) as HTMLElement | SVGElement, ctx)
|
|
287
|
-
case "sparse-attr":
|
|
288
|
-
return setupSparseAttrPart(part, findPath(content, path) as HTMLElement | SVGElement, ctx)
|
|
289
|
-
case "sparse-class-name":
|
|
290
|
-
return setupSparseClassNamePart(part, findPath(content, path) as HTMLElement | SVGElement, ctx)
|
|
291
|
-
case "sparse-comment":
|
|
292
|
-
return setupSparseCommentPart(part, findPath(content, path) as Comment, ctx)
|
|
293
|
-
case "text-part": {
|
|
294
|
-
const parent = findPath(content, path) as Element
|
|
295
|
-
const comment = findHoleComment(parent, part.index)
|
|
296
|
-
return setupTextPart(part, comment, ctx)
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
export function setupAttrPart(
|
|
302
|
-
{ index, name }: Pick<Template.AttrPartNode, "index" | "name">,
|
|
303
|
-
element: HTMLElement | SVGElement,
|
|
304
|
-
ctx: TemplateContext,
|
|
305
|
-
renderable: Renderable<any, any>
|
|
306
|
-
) {
|
|
307
|
-
const attr = element.getAttributeNode(name) ?? ctx.document.createAttribute(name)
|
|
308
|
-
const part = SyncPartsInternal.makeAttributePart(index, element, attr)
|
|
309
|
-
return matchSyncPart(renderable, ctx, part)
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
export function setupBooleanPart(
|
|
313
|
-
{ index, name }: Pick<Template.BooleanPartNode, "index" | "name">,
|
|
314
|
-
element: HTMLElement | SVGElement,
|
|
315
|
-
ctx: TemplateContext,
|
|
316
|
-
renderable: Renderable<any, any>
|
|
317
|
-
) {
|
|
318
|
-
const part = SyncPartsInternal.makeBooleanAttributePart(name, index, element)
|
|
319
|
-
return matchSyncPart(renderable, ctx, part)
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
export function setupClassNamePart(
|
|
323
|
-
{ index }: Pick<Template.ClassNamePartNode, "index">,
|
|
324
|
-
element: HTMLElement | SVGElement,
|
|
325
|
-
ctx: TemplateContext,
|
|
326
|
-
renderable: Renderable<any, any>
|
|
327
|
-
) {
|
|
328
|
-
const part = SyncPartsInternal.makeClassNamePart(index, element)
|
|
329
|
-
return matchSyncPart(renderable, ctx, part)
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
export function setupCommentPart(
|
|
333
|
-
{ index }: Pick<Template.CommentPartNode, "index">,
|
|
334
|
-
comment: Comment,
|
|
335
|
-
ctx: TemplateContext,
|
|
336
|
-
renderable: Renderable<any, any>
|
|
337
|
-
) {
|
|
338
|
-
const part = SyncPartsInternal.makeCommentPart(index, comment)
|
|
339
|
-
return matchSyncPart(renderable, ctx, part)
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
export function setupDataPart(
|
|
343
|
-
{ index }: Pick<Template.DataPartNode, "index">,
|
|
344
|
-
element: HTMLElement | SVGElement,
|
|
345
|
-
ctx: TemplateContext,
|
|
346
|
-
renderable: Renderable<any, any>
|
|
347
|
-
) {
|
|
348
|
-
const part = SyncPartsInternal.makeDataPart(index, element)
|
|
349
|
-
return matchSyncPart(renderable, ctx, part)
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
export function setupEventPart(
|
|
353
|
-
{ index, name }: Pick<Template.EventPartNode, "index" | "name">,
|
|
354
|
-
element: HTMLElement | SVGElement,
|
|
355
|
-
ctx: TemplateContext,
|
|
356
|
-
renderable: Renderable<any, any>
|
|
357
|
-
) {
|
|
358
|
-
if (isNullOrUndefined(renderable)) return null
|
|
359
|
-
|
|
360
|
-
if (isDirective(renderable)) {
|
|
361
|
-
return renderable(
|
|
362
|
-
new EventPartImpl(
|
|
363
|
-
name,
|
|
364
|
-
index,
|
|
365
|
-
ElementSource.fromElement(element),
|
|
366
|
-
ctx.onCause,
|
|
367
|
-
(handler) => ctx.eventSource.addEventListener(element, name, handler)
|
|
368
|
-
)
|
|
369
|
-
)
|
|
370
|
-
} else {
|
|
371
|
-
const handler = getEventHandler(renderable, ctx.context, ctx.onCause)
|
|
372
|
-
if (handler === null) return null
|
|
373
|
-
ctx.eventSource.addEventListener(element, name, handler)
|
|
374
|
-
return null
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
export function getEventHandler<E, R>(
|
|
379
|
-
renderable: any,
|
|
380
|
-
ctx: Context.Context<any> | Context.Context<never>,
|
|
381
|
-
onCause: (cause: Cause.Cause<E>) => Effect.Effect<unknown>
|
|
382
|
-
): EventHandler.EventHandler<never, never> | null {
|
|
383
|
-
if (renderable && typeof renderable === "object") {
|
|
384
|
-
if (EventHandler.EventHandlerTypeId in renderable) {
|
|
385
|
-
return EventHandler.make(
|
|
386
|
-
(ev) =>
|
|
387
|
-
Effect.provide(
|
|
388
|
-
Effect.catchAllCause((renderable as EventHandler.EventHandler<Event, E, R>).handler(ev), onCause),
|
|
389
|
-
ctx as any
|
|
390
|
-
),
|
|
391
|
-
(renderable as EventHandler.EventHandler<Event, E, R>).options
|
|
392
|
-
)
|
|
393
|
-
} else if (Effect.EffectTypeId in renderable) {
|
|
394
|
-
return EventHandler.make(() => Effect.provide(Effect.catchAllCause(renderable, onCause), ctx))
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
return null
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
export function setupNodePart(
|
|
402
|
-
{ index }: Template.NodePart,
|
|
403
|
-
comment: Comment,
|
|
404
|
-
ctx: TemplateContext,
|
|
405
|
-
text: Text | null,
|
|
406
|
-
nodes: Array<Node>
|
|
407
|
-
) {
|
|
408
|
-
const part = SyncPartsInternal.makeNodePart(index, comment, ctx.document, text, nodes)
|
|
409
|
-
const renderable = ctx.values[index]
|
|
410
|
-
return matchSyncPart(renderable, ctx, part)
|
|
411
|
-
}
|
|
412
|
-
|
|
413
|
-
export function setupPropertyPart(
|
|
414
|
-
{ index, name }: Pick<Template.PropertyPartNode, "index" | "name">,
|
|
415
|
-
element: HTMLElement | SVGElement,
|
|
416
|
-
ctx: TemplateContext,
|
|
417
|
-
renderable: Renderable<any, any>
|
|
418
|
-
) {
|
|
419
|
-
const part = SyncPartsInternal.makePropertyPart(name, index, element)
|
|
420
|
-
return matchSyncPart(renderable, ctx, part)
|
|
421
|
-
}
|
|
422
|
-
|
|
423
|
-
export function setupRefPart(
|
|
424
|
-
{ index }: Pick<Template.RefPartNode, "index">,
|
|
425
|
-
element: HTMLElement | SVGElement,
|
|
426
|
-
renderable: Renderable<any, any>
|
|
427
|
-
) {
|
|
428
|
-
if (isNullOrUndefined(renderable)) return null
|
|
429
|
-
else if (isDirective(renderable)) {
|
|
430
|
-
return renderable(
|
|
431
|
-
new RefPartImpl(ElementSource.fromElement(element), index)
|
|
432
|
-
)
|
|
433
|
-
} else if (ElementRef.isElementRef(renderable)) {
|
|
434
|
-
// TODO: We need to enable only setting these values once the Template has been rendered into the DOM
|
|
435
|
-
return ElementRef.set(renderable, element)
|
|
436
|
-
} else {
|
|
437
|
-
return null
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
|
|
441
|
-
export function setupPropertiesPart(
|
|
442
|
-
element: HTMLElement | SVGElement,
|
|
443
|
-
ctx: TemplateContext,
|
|
444
|
-
renderable: Renderable<any, any>
|
|
445
|
-
) {
|
|
446
|
-
if (renderable && typeof renderable === "object") {
|
|
447
|
-
const effects: Array<Effect.Effect<void, any, any>> = []
|
|
448
|
-
const addEffect = (effect: Effect.Effect<void, any, any> | null | undefined) => {
|
|
449
|
-
if (isNullOrUndefined(effect)) return
|
|
450
|
-
effects.push(effect)
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
for (const [key, value] of Object.entries(renderable as Record<string, any>)) {
|
|
454
|
-
const [type, name] = keyToPartType(key)
|
|
455
|
-
const index = ++ctx.spreadIndex
|
|
456
|
-
switch (type) {
|
|
457
|
-
case "attr":
|
|
458
|
-
addEffect(setupAttrPart({ index, name }, element, ctx, value))
|
|
459
|
-
break
|
|
460
|
-
case "boolean":
|
|
461
|
-
addEffect(setupBooleanPart({ index, name }, element, ctx, value))
|
|
462
|
-
break
|
|
463
|
-
case "class":
|
|
464
|
-
addEffect(setupClassNamePart({ index }, element, ctx, value))
|
|
465
|
-
break
|
|
466
|
-
case "data":
|
|
467
|
-
addEffect(setupDataPart({ index }, element, ctx, value))
|
|
468
|
-
break
|
|
469
|
-
case "event":
|
|
470
|
-
addEffect(setupEventPart({ index, name }, element, ctx, value))
|
|
471
|
-
break
|
|
472
|
-
case "property":
|
|
473
|
-
addEffect(setupPropertyPart({ index, name }, element, ctx, value))
|
|
474
|
-
break
|
|
475
|
-
}
|
|
476
|
-
}
|
|
477
|
-
|
|
478
|
-
return Effect.all(effects, { concurrency: "unbounded" })
|
|
479
|
-
}
|
|
480
|
-
|
|
481
|
-
return null
|
|
482
|
-
}
|
|
483
|
-
|
|
484
|
-
export function setupSparseAttrPart(
|
|
485
|
-
{ name, nodes }: Pick<Template.SparseAttrNode, "name" | "nodes">,
|
|
486
|
-
element: HTMLElement | SVGElement,
|
|
487
|
-
ctx: TemplateContext
|
|
488
|
-
) {
|
|
489
|
-
ctx.expected++
|
|
490
|
-
const attr = element.getAttributeNode(name) ?? ctx.document.createAttribute(name)
|
|
491
|
-
const index = nodes.find((n): n is Template.AttrPartNode => n._tag === "attr")!.index
|
|
492
|
-
return SyncPartsInternal.handleSparseAttribute(
|
|
493
|
-
element,
|
|
494
|
-
attr,
|
|
495
|
-
nodes,
|
|
496
|
-
ctx.values,
|
|
497
|
-
(f) => Effect.zipRight(ctx.queue.add(attr, f, DEFAULT_PRIORITY), ctx.refCounter.release(index))
|
|
498
|
-
)
|
|
499
|
-
}
|
|
500
|
-
|
|
501
|
-
export function setupSparseClassNamePart(
|
|
502
|
-
{ nodes }: Pick<Template.SparseClassNameNode, "nodes">,
|
|
503
|
-
element: HTMLElement | SVGElement,
|
|
504
|
-
ctx: TemplateContext
|
|
505
|
-
) {
|
|
506
|
-
ctx.expected++
|
|
507
|
-
const index = nodes.find((n): n is Template.ClassNamePartNode => n._tag === "className-part")!.index
|
|
508
|
-
return SyncPartsInternal.handleSparseClassName(
|
|
509
|
-
element,
|
|
510
|
-
nodes,
|
|
511
|
-
ctx.values,
|
|
512
|
-
(f) => Effect.zipRight(ctx.queue.add(element.classList, f, DEFAULT_PRIORITY), ctx.refCounter.release(index))
|
|
513
|
-
)
|
|
514
|
-
}
|
|
515
|
-
|
|
516
|
-
export function setupSparseCommentPart(
|
|
517
|
-
{ nodes }: Pick<Template.SparseCommentNode, "nodes">,
|
|
518
|
-
comment: Comment,
|
|
519
|
-
ctx: TemplateContext
|
|
520
|
-
) {
|
|
521
|
-
ctx.expected++
|
|
522
|
-
const index = nodes.find((n): n is Template.CommentPartNode => n._tag === "comment-part")!.index
|
|
523
|
-
return SyncPartsInternal.handleSparseComment(
|
|
524
|
-
comment,
|
|
525
|
-
nodes,
|
|
526
|
-
ctx.values,
|
|
527
|
-
(f) => Effect.zipRight(ctx.queue.add(comment, f, DEFAULT_PRIORITY), ctx.refCounter.release(index))
|
|
528
|
-
)
|
|
529
|
-
}
|
|
530
|
-
|
|
531
|
-
export function setupTextPart({ index }: Template.TextPartNode, comment: Comment, ctx: TemplateContext) {
|
|
532
|
-
const text = comment.previousSibling
|
|
533
|
-
? SyncPartsInternal.getPreviousTextSibling(comment.previousSibling) ?? createText(ctx.document, comment)
|
|
534
|
-
: createText(ctx.document, comment)
|
|
535
|
-
const part = SyncPartsInternal.makeTextPart(index, text)
|
|
536
|
-
const renderable = ctx.values[index]
|
|
537
|
-
return matchSyncPart(renderable, ctx, part)
|
|
538
|
-
}
|
|
539
|
-
|
|
540
|
-
function createText(document: Document, comment: Comment) {
|
|
541
|
-
const text = document.createTextNode("")
|
|
542
|
-
comment.parentNode!.insertBefore(text, comment)
|
|
543
|
-
return text
|
|
544
|
-
}
|
|
545
|
-
|
|
546
|
-
export function matchSyncPart(
|
|
547
|
-
renderable: Renderable<any, any>,
|
|
548
|
-
ctx: TemplateContext,
|
|
549
|
-
syncPart: SyncPart
|
|
550
|
-
) {
|
|
551
|
-
return matchRenderable(renderable, ctx, {
|
|
552
|
-
Fx: (fx) =>
|
|
553
|
-
fx.run(Fx.Sink.make(
|
|
554
|
-
ctx.onCause,
|
|
555
|
-
(value) => runSyncUpdate(syncPart, value, ctx)
|
|
556
|
-
)),
|
|
557
|
-
Effect: (effect) => Effect.flatMap(effect, (value) => runSyncUpdate(syncPart, value, ctx)),
|
|
558
|
-
Directive: (directive) => directive(syncPartToPart(syncPart, ({ value }) => runSyncUpdate(syncPart, value, ctx))),
|
|
559
|
-
Otherwise: (value) => {
|
|
560
|
-
syncPart.update(value as never)
|
|
561
|
-
return null
|
|
562
|
-
}
|
|
563
|
-
})
|
|
564
|
-
}
|
|
565
|
-
|
|
566
|
-
function unwrapRenderable<E, R>(renderable: unknown): Fx.Fx<any, E, R> {
|
|
567
|
-
switch (typeof renderable) {
|
|
568
|
-
case "undefined":
|
|
569
|
-
case "object": {
|
|
570
|
-
if (renderable === null || renderable === undefined) return Fx.succeed(null)
|
|
571
|
-
else if (Array.isArray(renderable)) {
|
|
572
|
-
return renderable.length === 0
|
|
573
|
-
? Fx.succeed(null)
|
|
574
|
-
: Fx.map(Fx.tuple(renderable.map(unwrapRenderable)), (xs) => xs.flat()) as any
|
|
575
|
-
} else if (Fx.FxTypeId in renderable) {
|
|
576
|
-
return renderable as any
|
|
577
|
-
} else if (Effect.EffectTypeId in renderable) {
|
|
578
|
-
return Fx.fromFxEffect(Effect.map(renderable as any, unwrapRenderable<E, R>))
|
|
579
|
-
} else return Fx.succeed(renderable as any)
|
|
580
|
-
}
|
|
581
|
-
default:
|
|
582
|
-
return Fx.succeed(renderable)
|
|
583
|
-
}
|
|
584
|
-
}
|
|
585
|
-
|
|
586
|
-
export function runSyncUpdate(
|
|
587
|
-
syncPart: SyncPart,
|
|
588
|
-
value: any,
|
|
589
|
-
ctx: TemplateContext
|
|
590
|
-
) {
|
|
591
|
-
return Effect.zipRight(
|
|
592
|
-
ctx.queue.add(syncPart, () => syncPart.update(value as never), DEFAULT_PRIORITY),
|
|
593
|
-
ctx.refCounter.release(syncPart.index)
|
|
594
|
-
)
|
|
595
|
-
}
|
|
596
|
-
|
|
597
|
-
export function matchRenderable(
|
|
598
|
-
renderable: Renderable<any, any>,
|
|
599
|
-
ctx: TemplateContext,
|
|
600
|
-
matches: {
|
|
601
|
-
Fx: (fx: Fx.Fx<any, any, any>) => Effect.Effect<void, any, any>
|
|
602
|
-
Effect: (effect: Effect.Effect<any, any, any>) => Effect.Effect<void, any, any>
|
|
603
|
-
Directive: (directive: Directive<any, any>) => Effect.Effect<void, any, any>
|
|
604
|
-
Otherwise: (_: any) => Effect.Effect<void, any, any> | null
|
|
605
|
-
}
|
|
606
|
-
): Effect.Effect<void, any, any> | null {
|
|
607
|
-
if (Fx.isFx(renderable)) {
|
|
608
|
-
ctx.expected++
|
|
609
|
-
return matches.Fx(renderable)
|
|
610
|
-
} else if (Effect.isEffect(renderable)) {
|
|
611
|
-
ctx.expected++
|
|
612
|
-
return matches.Effect(renderable)
|
|
613
|
-
} else if (isDirective<any, any>(renderable)) {
|
|
614
|
-
ctx.expected++
|
|
615
|
-
return matches.Directive(renderable)
|
|
616
|
-
} else if (Array.isArray(renderable)) {
|
|
617
|
-
return matches.Fx(unwrapRenderable(renderable))
|
|
618
|
-
} else {
|
|
619
|
-
return matches.Otherwise(renderable)
|
|
620
|
-
}
|
|
621
|
-
}
|
|
622
|
-
|
|
623
|
-
export function attachRoot<T extends RenderEvent | null>(
|
|
624
|
-
cache: RenderContext["renderCache"],
|
|
625
|
-
where: HTMLElement,
|
|
626
|
-
what: RenderEvent | null // TODO: Should we support HTML RenderEvents here too?,
|
|
627
|
-
): Effect.Effect<ToRendered<T>> {
|
|
628
|
-
return Effect.sync(() => {
|
|
629
|
-
const wire = what?.valueOf() as ToRendered<T>
|
|
630
|
-
const previous = cache.get(where)
|
|
631
|
-
|
|
632
|
-
if (wire !== previous) {
|
|
633
|
-
if (previous && !wire) removeChildren(where, previous)
|
|
634
|
-
|
|
635
|
-
cache.set(where, wire || null)
|
|
636
|
-
|
|
637
|
-
if (wire) replaceChildren(where, wire)
|
|
638
|
-
|
|
639
|
-
return wire as ToRendered<T>
|
|
640
|
-
}
|
|
641
|
-
|
|
642
|
-
return previous as ToRendered<T>
|
|
643
|
-
})
|
|
644
|
-
}
|
|
645
|
-
|
|
646
|
-
export function removeChildren(where: HTMLElement, previous: Rendered) {
|
|
647
|
-
for (const node of getNodesFromRendered(previous)) {
|
|
648
|
-
where.removeChild(node)
|
|
649
|
-
}
|
|
650
|
-
}
|
|
651
|
-
|
|
652
|
-
export function replaceChildren(where: HTMLElement, wire: Rendered) {
|
|
653
|
-
where.replaceChildren(...getNodesFromRendered(wire))
|
|
654
|
-
}
|
|
655
|
-
|
|
656
|
-
export function getNodesFromRendered(rendered: Rendered): Array<globalThis.Node> {
|
|
657
|
-
const value = rendered.valueOf() as globalThis.Node | Array<globalThis.Node>
|
|
658
|
-
return Array.isArray(value) ? value : [value]
|
|
659
|
-
}
|
|
660
|
-
|
|
661
|
-
export type HydrateTemplateContext = TemplateContext & {
|
|
662
|
-
readonly where: HydrationNode
|
|
663
|
-
readonly makeHydrateContext: (where: HydrationNode, index: number) => HydrateContext
|
|
664
|
-
}
|
|
665
|
-
|
|
666
|
-
export function findHydrationTemplateByHash(hydrateCtx: HydrateContext, hash: string): HydrationTemplate | null {
|
|
667
|
-
// If there is not a manyKey, we can just find the template by its hash
|
|
668
|
-
if (hydrateCtx.manyKey === undefined) {
|
|
669
|
-
return findHydrationTemplate(getChildNodes(hydrateCtx.where), hash)
|
|
670
|
-
}
|
|
671
|
-
|
|
672
|
-
// If there is a manyKey, we need to find the many node first
|
|
673
|
-
const many = findHydrationMany(getChildNodes(hydrateCtx.where), hydrateCtx.manyKey)
|
|
674
|
-
|
|
675
|
-
if (many === null) return null
|
|
676
|
-
|
|
677
|
-
// Then we can find the template by its hash
|
|
678
|
-
return findHydrationTemplate(getChildNodes(many), hash)
|
|
679
|
-
}
|
|
680
|
-
|
|
681
|
-
export function setupHydrateParts(parts: Template.Template["parts"], ctx: HydrateTemplateContext) {
|
|
682
|
-
const effects: Array<Effect.Effect<void, any, any>> = []
|
|
683
|
-
|
|
684
|
-
for (const [part, path] of parts) {
|
|
685
|
-
const effect = setupHydratePart(part, path, ctx)
|
|
686
|
-
if (effect) {
|
|
687
|
-
effects.push(effect)
|
|
688
|
-
}
|
|
689
|
-
}
|
|
690
|
-
|
|
691
|
-
return effects
|
|
692
|
-
}
|
|
693
|
-
|
|
694
|
-
export function setupHydratePart(
|
|
695
|
-
part: Template.PartNode | Template.SparsePartNode,
|
|
696
|
-
path: Chunk.Chunk<number>,
|
|
697
|
-
ctx: HydrateTemplateContext
|
|
698
|
-
) {
|
|
699
|
-
switch (part._tag) {
|
|
700
|
-
case "attr":
|
|
701
|
-
return setupAttrPart(part, findHydratePath(ctx.where, path) as any, ctx, ctx.values[part.index])
|
|
702
|
-
case "boolean-part":
|
|
703
|
-
return setupBooleanPart(part, findHydratePath(ctx.where, path) as any, ctx, ctx.values[part.index])
|
|
704
|
-
case "className-part":
|
|
705
|
-
return setupClassNamePart(part, findHydratePath(ctx.where, path) as any, ctx, ctx.values[part.index])
|
|
706
|
-
case "comment-part":
|
|
707
|
-
return setupCommentPart(part, findHydratePath(ctx.where, path) as any, ctx, ctx.values[part.index])
|
|
708
|
-
case "data":
|
|
709
|
-
return setupDataPart(part, findHydratePath(ctx.where, path) as any, ctx, ctx.values[part.index])
|
|
710
|
-
case "event":
|
|
711
|
-
return setupEventPart(part, findHydratePath(ctx.where, path) as any, ctx, ctx.values[part.index])
|
|
712
|
-
case "node": {
|
|
713
|
-
const hole = findHydrationHole(getChildNodes(ctx.where), part.index)
|
|
714
|
-
if (hole === null) {
|
|
715
|
-
throw new CouldNotFindCommentError(part.index)
|
|
716
|
-
}
|
|
717
|
-
return setupHydratedNodePart(part, hole, ctx)
|
|
718
|
-
}
|
|
719
|
-
case "properties":
|
|
720
|
-
return setupPropertiesPart(findHydratePath(ctx.where, path) as any, ctx, ctx.values[part.index])
|
|
721
|
-
case "property":
|
|
722
|
-
return setupPropertyPart(part, findHydratePath(ctx.where, path) as any, ctx, ctx.values[part.index])
|
|
723
|
-
case "ref":
|
|
724
|
-
return setupRefPart(part, findHydratePath(ctx.where, path) as any, ctx.values[part.index])
|
|
725
|
-
case "sparse-attr":
|
|
726
|
-
return setupSparseAttrPart(part, findHydratePath(ctx.where, path) as any, ctx)
|
|
727
|
-
case "sparse-class-name":
|
|
728
|
-
return setupSparseClassNamePart(part, findHydratePath(ctx.where, path) as any, ctx)
|
|
729
|
-
case "sparse-comment":
|
|
730
|
-
return setupSparseCommentPart(part, findHydratePath(ctx.where, path) as any, ctx)
|
|
731
|
-
case "text-part": {
|
|
732
|
-
const hole = findHydrationHole(getChildNodes(ctx.where), part.index)
|
|
733
|
-
if (hole === null) throw new CouldNotFindCommentError(part.index)
|
|
734
|
-
return setupTextPart(part, hole.endComment, ctx)
|
|
735
|
-
}
|
|
736
|
-
}
|
|
737
|
-
}
|
|
738
|
-
|
|
739
|
-
export function setupHydratedNodePart(
|
|
740
|
-
part: Template.NodePart,
|
|
741
|
-
hole: HydrationHole,
|
|
742
|
-
ctx: HydrateTemplateContext
|
|
743
|
-
) {
|
|
744
|
-
const nestedCtx = ctx.makeHydrateContext(hole, part.index)
|
|
745
|
-
const previousNodes = getPreviousNodes(hole)
|
|
746
|
-
const text = previousNodes.length === 2 && isCommentWithValue(previousNodes[0], "text") && isText(previousNodes[1])
|
|
747
|
-
? previousNodes[1]
|
|
748
|
-
: null
|
|
749
|
-
const effect = setupNodePart(part, hole.endComment, ctx, text, text === null ? previousNodes : [text])
|
|
750
|
-
if (effect === null) return null
|
|
751
|
-
return Effect.provideService(effect, HydrateContext, nestedCtx)
|
|
752
|
-
}
|
|
753
|
-
|
|
754
|
-
export function findRootParentChildNodes(where: HTMLElement): ParentChildNodes {
|
|
755
|
-
const childNodes = findRootChildNodes(where)
|
|
756
|
-
|
|
757
|
-
return {
|
|
758
|
-
parentNode: where,
|
|
759
|
-
childNodes
|
|
760
|
-
}
|
|
761
|
-
}
|
|
762
|
-
|
|
763
|
-
const START = "typed-start"
|
|
764
|
-
const END = "typed-end"
|
|
765
|
-
|
|
766
|
-
// Finds all of the childNodes between the "typed-start" and "typed-end" comments
|
|
767
|
-
export function findRootChildNodes(where: HTMLElement): Array<Node> {
|
|
768
|
-
let start = -1
|
|
769
|
-
let end = -1
|
|
770
|
-
|
|
771
|
-
const { childNodes } = where
|
|
772
|
-
const length = childNodes.length
|
|
773
|
-
|
|
774
|
-
for (let i = 0; i < length; i++) {
|
|
775
|
-
const node = childNodes[i]
|
|
776
|
-
|
|
777
|
-
if (node.nodeType === node.COMMENT_NODE && node.nodeValue === START) {
|
|
778
|
-
start = i
|
|
779
|
-
break
|
|
780
|
-
}
|
|
781
|
-
}
|
|
782
|
-
|
|
783
|
-
for (let i = length - 1; i >= Math.max(start, 0); i--) {
|
|
784
|
-
const node = childNodes[i]
|
|
785
|
-
|
|
786
|
-
if (node.nodeType === node.COMMENT_NODE && node.nodeValue === END) {
|
|
787
|
-
end = i
|
|
788
|
-
break
|
|
789
|
-
}
|
|
790
|
-
}
|
|
791
|
-
|
|
792
|
-
// If we can't find the start and end comments, just return all childNodes
|
|
793
|
-
if (start === -1 && end === -1) {
|
|
794
|
-
return Array.from(childNodes)
|
|
795
|
-
}
|
|
796
|
-
|
|
797
|
-
start = start === -1 ? 0 : start
|
|
798
|
-
end = end === -1 ? length - 1 : end
|
|
799
|
-
|
|
800
|
-
const rootChildNodes: Array<Node> = Array(end - start)
|
|
801
|
-
|
|
802
|
-
for (let i = start + 1, j = 0; i <= end; i++) {
|
|
803
|
-
rootChildNodes[j++] = childNodes[i]
|
|
804
|
-
}
|
|
805
|
-
|
|
806
|
-
return rootChildNodes
|
|
807
|
-
}
|
|
808
|
-
|
|
809
|
-
export function getWire(where: HydrationNode) {
|
|
810
|
-
const nodes = getNodes(where)
|
|
811
|
-
if (nodes.length === 1) return nodes[0]
|
|
812
|
-
return nodes
|
|
813
|
-
}
|