@typed/template 0.14.0 → 1.0.0-beta.1
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 +121 -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 +298 -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 +29 -227
- 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 +408 -0
- package/src/Parser.test.ts +923 -0
- package/src/Parser.ts +598 -10
- package/src/Render.test.ts +337 -0
- package/src/Render.ts +878 -63
- package/src/RenderEvent.ts +169 -40
- package/src/RenderQueue.ts +291 -385
- 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/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 -246
- 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 -65
- 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 -343
- 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 -79
- 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 -246
- 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 -42
- 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 -338
- 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 -148
- package/src/ElementSource.ts +0 -510
- 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 -70
- 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
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export function buildTemplateFragment(document, template) {
|
|
2
|
+
const root = document.createDocumentFragment();
|
|
3
|
+
for (const node of template.nodes) {
|
|
4
|
+
root.appendChild(buildTemplateNode(document, node));
|
|
5
|
+
}
|
|
6
|
+
return root;
|
|
7
|
+
}
|
|
8
|
+
function buildTemplateNode(document, node) {
|
|
9
|
+
switch (node._tag) {
|
|
10
|
+
case "comment":
|
|
11
|
+
return document.createComment(node.value);
|
|
12
|
+
case "comment-part":
|
|
13
|
+
return document.createComment(`c_${node.index}`);
|
|
14
|
+
case "sparse-comment": {
|
|
15
|
+
return document.createComment(`c_${node.nodes.map((n) => (n._tag === "text" ? "" : n.index)).join("_")}`);
|
|
16
|
+
}
|
|
17
|
+
case "doctype":
|
|
18
|
+
return document.implementation.createDocumentType(node.name, node.publicId ?? "", node.systemId ?? "");
|
|
19
|
+
case "element":
|
|
20
|
+
return buildTemplateElement(document, node);
|
|
21
|
+
case "self-closing-element":
|
|
22
|
+
return buildTemplateSelfClosingElement(document, node);
|
|
23
|
+
case "text-only-element":
|
|
24
|
+
return buildTemplateTextOnlyElement(document, node);
|
|
25
|
+
case "text":
|
|
26
|
+
return document.createTextNode(node.value);
|
|
27
|
+
case "node":
|
|
28
|
+
return document.createComment(`/n_${node.index}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function buildTemplateElement(document, node) {
|
|
32
|
+
const element = document.createElement(node.tagName);
|
|
33
|
+
addStaticAttributes(element, node.attributes);
|
|
34
|
+
for (const child of node.children) {
|
|
35
|
+
element.appendChild(buildTemplateNode(document, child));
|
|
36
|
+
}
|
|
37
|
+
return element;
|
|
38
|
+
}
|
|
39
|
+
function addStaticAttributes(element, attributes) {
|
|
40
|
+
for (const attribute of attributes) {
|
|
41
|
+
if (attribute._tag === "attribute") {
|
|
42
|
+
element.setAttribute(attribute.name, attribute.value);
|
|
43
|
+
}
|
|
44
|
+
else if (attribute._tag === "boolean") {
|
|
45
|
+
element.toggleAttribute(attribute.name, true);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function buildTemplateSelfClosingElement(document, node) {
|
|
50
|
+
const element = document.createElement(node.tagName);
|
|
51
|
+
addStaticAttributes(element, node.attributes);
|
|
52
|
+
return element;
|
|
53
|
+
}
|
|
54
|
+
function buildTemplateTextOnlyElement(document, node) {
|
|
55
|
+
const element = document.createElement(node.tagName);
|
|
56
|
+
addStaticAttributes(element, node.attributes);
|
|
57
|
+
if (node.textContent && node.textContent._tag === "text") {
|
|
58
|
+
element.textContent = node.textContent.value;
|
|
59
|
+
}
|
|
60
|
+
return element;
|
|
61
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/internal/diff.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,IAAI,GACf,GAAG,KAAK,CAAC,IAAI,CAAC,EACd,GAAG,KAAK,CAAC,IAAI,CAAC,EACd,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,EAC1C,QAAQ,IAAI,WAwHb,CAAC"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
// @see https://github.com/WebReflection/udomdiff
|
|
2
|
+
export const diff = (a, b, get, before) => {
|
|
3
|
+
const parentNode = before.parentNode;
|
|
4
|
+
const bLength = b.length;
|
|
5
|
+
let aEnd = a.length;
|
|
6
|
+
let bEnd = bLength;
|
|
7
|
+
let aStart = 0;
|
|
8
|
+
let bStart = 0;
|
|
9
|
+
let map = null;
|
|
10
|
+
while (aStart < aEnd || bStart < bEnd) {
|
|
11
|
+
// append head, tail, or nodes in between: fast path
|
|
12
|
+
if (aEnd === aStart) {
|
|
13
|
+
// we could be in a situation where the rest of nodes that
|
|
14
|
+
// need to be added are not at the end, and in such case
|
|
15
|
+
// the node to `insertBefore`, if the index is more than 0
|
|
16
|
+
// must be retrieved, otherwise it's gonna be the first item.
|
|
17
|
+
const node = bEnd < bLength ? (bStart ? get(b[bStart - 1], -0).nextSibling : get(b[bEnd], 0)) : before;
|
|
18
|
+
while (bStart < bEnd) {
|
|
19
|
+
parentNode.insertBefore(get(b[bStart++], 1), node);
|
|
20
|
+
}
|
|
21
|
+
} // remove head or tail: fast path
|
|
22
|
+
else if (bEnd === bStart) {
|
|
23
|
+
while (aStart < aEnd) {
|
|
24
|
+
// remove the node only if it's unknown or not live
|
|
25
|
+
if (!map || !map.has(a[aStart])) {
|
|
26
|
+
// @ts-ignore
|
|
27
|
+
get(a[aStart], -1).remove();
|
|
28
|
+
}
|
|
29
|
+
aStart++;
|
|
30
|
+
}
|
|
31
|
+
} // same node: fast path
|
|
32
|
+
else if (a[aStart] === b[bStart]) {
|
|
33
|
+
aStart++;
|
|
34
|
+
bStart++;
|
|
35
|
+
} // same tail: fast path
|
|
36
|
+
else if (a[aEnd - 1] === b[bEnd - 1]) {
|
|
37
|
+
aEnd--;
|
|
38
|
+
bEnd--;
|
|
39
|
+
} // The once here single last swap "fast path" has been removed in v1.1.0
|
|
40
|
+
// https://github.com/WebReflection/udomdiff/blob/single-final-swap/esm/index.js#L69-L85
|
|
41
|
+
// reverse swap: also fast path
|
|
42
|
+
else if (a[aStart] === b[bEnd - 1] && b[bStart] === a[aEnd - 1]) {
|
|
43
|
+
// this is a "shrink" operation that could happen in these cases:
|
|
44
|
+
// [1, 2, 3, 4, 5]
|
|
45
|
+
// [1, 4, 3, 2, 5]
|
|
46
|
+
// or asymmetric too
|
|
47
|
+
// [1, 2, 3, 4, 5]
|
|
48
|
+
// [1, 2, 3, 5, 6, 4]
|
|
49
|
+
const node = get(a[--aEnd], -0).nextSibling;
|
|
50
|
+
parentNode.insertBefore(get(b[bStart++], 1), get(a[aStart++], -0).nextSibling);
|
|
51
|
+
parentNode.insertBefore(get(b[--bEnd], 1), node);
|
|
52
|
+
// mark the future index as identical (yeah, it's dirty, but cheap 👍)
|
|
53
|
+
// The main reason to do this, is that when a[aEnd] will be reached,
|
|
54
|
+
// the loop will likely be on the fast path, as identical to b[bEnd].
|
|
55
|
+
// In the best case scenario, the next loop will skip the tail,
|
|
56
|
+
// but in the worst one, this node will be considered as already
|
|
57
|
+
// processed, bailing out pretty quickly from the map index check
|
|
58
|
+
a[aEnd] = b[bEnd];
|
|
59
|
+
} // map based fallback, "slow" path
|
|
60
|
+
else {
|
|
61
|
+
// the map requires an O(bEnd - bStart) operation once
|
|
62
|
+
// to store all future nodes indexes for later purposes.
|
|
63
|
+
// In the worst case scenario, this is a full O(N) cost,
|
|
64
|
+
// and such scenario happens at least when all nodes are different,
|
|
65
|
+
// but also if both first and last items of the lists are different
|
|
66
|
+
if (!map) {
|
|
67
|
+
map = new Map();
|
|
68
|
+
let i = bStart;
|
|
69
|
+
while (i < bEnd) {
|
|
70
|
+
map.set(b[i], i++);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const index = map.get(a[aStart]) ?? -1;
|
|
74
|
+
// this node has no meaning in the future list, so it's more than safe
|
|
75
|
+
// to remove it, and check the next live node out instead, meaning
|
|
76
|
+
// that only the live list index should be forwarded
|
|
77
|
+
if (index < 0)
|
|
78
|
+
get(a[aStart++], -1).remove();
|
|
79
|
+
// it's a future node, hence it needs some handling
|
|
80
|
+
else {
|
|
81
|
+
// if it's not already processed, look on demand for the next LCS
|
|
82
|
+
if (bStart < index && index < bEnd) {
|
|
83
|
+
let i = aStart;
|
|
84
|
+
// counts the amount of nodes that are the same in the future
|
|
85
|
+
let sequence = 1;
|
|
86
|
+
while (++i < aEnd && i < bEnd && map.get(a[i]) === index + sequence) {
|
|
87
|
+
sequence++;
|
|
88
|
+
}
|
|
89
|
+
// effort decision here: if the sequence is longer than replaces
|
|
90
|
+
// needed to reach such sequence, which would brings again this loop
|
|
91
|
+
// to the fast path, prepend the difference before a sequence,
|
|
92
|
+
// and move only the future list index forward, so that aStart
|
|
93
|
+
// and bStart will be aligned again, hence on the fast path.
|
|
94
|
+
// An example considering aStart and bStart are both 0:
|
|
95
|
+
// a: [1, 2, 3, 4]
|
|
96
|
+
// b: [7, 1, 2, 3, 6]
|
|
97
|
+
// this would place 7 before 1 and, from that time on, 1, 2, and 3
|
|
98
|
+
// will be processed at zero cost
|
|
99
|
+
if (sequence > index - bStart) {
|
|
100
|
+
const node = get(a[aStart], 0);
|
|
101
|
+
while (bStart < index) {
|
|
102
|
+
parentNode.insertBefore(get(b[bStart++], 1), node);
|
|
103
|
+
}
|
|
104
|
+
} // if the effort wasn't good enough, fallback to a replace,
|
|
105
|
+
// moving both source and target indexes forward, hoping that some
|
|
106
|
+
// similar node will be found later on, to go back to the fast path
|
|
107
|
+
else {
|
|
108
|
+
// TODO: benchmark replaceWith instead
|
|
109
|
+
parentNode.replaceChild(get(b[bStart++], 1), get(a[aStart++], -1));
|
|
110
|
+
}
|
|
111
|
+
} // otherwise move the source forward, 'cause there's nothing to do
|
|
112
|
+
else {
|
|
113
|
+
aStart++;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return b;
|
|
119
|
+
};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { type EventHandler } from "../EventHandler.js";
|
|
2
|
+
export declare function makeTextContentUpdater(element: Node): (value: unknown) => void;
|
|
3
|
+
export declare function makeAttributeValueUpdater(element: HTMLElement | SVGElement, attr: Attr): (value: string | null | undefined) => void;
|
|
4
|
+
export declare function makeClassListUpdater(element: HTMLElement | SVGElement): (classNames: ReadonlyArray<string>) => void;
|
|
5
|
+
export declare function makeDatasetUpdater(element: HTMLElement | SVGElement): (value: unknown) => void;
|
|
6
|
+
export declare function diffStrings(previous: ReadonlyArray<string> | null | undefined, current: ReadonlyArray<string> | null | undefined): {
|
|
7
|
+
added: ReadonlyArray<string>;
|
|
8
|
+
removed: ReadonlyArray<string>;
|
|
9
|
+
unchanged: ReadonlyArray<string>;
|
|
10
|
+
};
|
|
11
|
+
export declare function diffDataSet(a: Record<string, string | undefined> | null | undefined, b: Record<string, string | undefined> | null | undefined): {
|
|
12
|
+
added: Array<readonly [string, string | undefined]>;
|
|
13
|
+
removed: ReadonlyArray<string>;
|
|
14
|
+
} | null;
|
|
15
|
+
export declare function getClassList(value: unknown): ReadonlyArray<string>;
|
|
16
|
+
/**
|
|
17
|
+
* Splits a string of class names (like those used in HTML `class=""` attributes)
|
|
18
|
+
* into an array of individual class names (words), separated by whitespace.
|
|
19
|
+
*
|
|
20
|
+
* This function avoids creating intermediate arrays and unnecessary string copying by:
|
|
21
|
+
* - Scanning the string one character at a time
|
|
22
|
+
* - Skipping over all leading whitespace for each word
|
|
23
|
+
* - Collecting all consecutive non-whitespace characters as a "word"
|
|
24
|
+
* - Repeating until the input is exhausted
|
|
25
|
+
*
|
|
26
|
+
* All ASCII "whitespace" characters with code <= 32 are considered as delimiters.
|
|
27
|
+
* This is more efficient than `String.prototype.trim` and `String.prototype.split(/\s+/)`
|
|
28
|
+
* as it only allocates memory for the result array, not for intermediate or empty strings.
|
|
29
|
+
*
|
|
30
|
+
* Example:
|
|
31
|
+
* splitClassNames(" foo bar\tbaz\nqux ") // => ["foo", "bar", "baz", "qux"]
|
|
32
|
+
*/
|
|
33
|
+
export declare function splitClassNames(value: string): Array<string>;
|
|
34
|
+
export declare function matchNodeValue<A, B>(document: Document, value: unknown, onText: (text: string) => A, onNodes: (nodes: Array<Node>) => B): A | B;
|
|
35
|
+
export declare function renderEventToArray(document: Document, x: unknown): Array<Node>;
|
|
36
|
+
export declare function diffChildren(comment: Comment, currentNodes: Array<Node>, nextNodes: Array<Node>, get: (entry: Node, action: number) => Node): Node[];
|
|
37
|
+
export declare function findNodePartEndComment(parent: Element, index: number): Comment;
|
|
38
|
+
export declare function findNodePartStartComment(parent: Element, index: number): Comment;
|
|
39
|
+
export declare function makeNodeUpdater(document: Document, comment: Comment, text?: Text | null, nodes?: Array<Node>): (value: unknown) => void;
|
|
40
|
+
export declare function makeBooleanUpdater(element: HTMLElement | SVGElement, name: string): (value: boolean) => void;
|
|
41
|
+
export declare function getAttributeValue(value: unknown): string | null | undefined;
|
|
42
|
+
export declare function getBooleanValue(value: unknown): boolean;
|
|
43
|
+
export declare function getDatasetValue(value: unknown): Record<string, string | undefined> | null | undefined;
|
|
44
|
+
export declare function getEventHandlerValue<E, R>(value: unknown): EventHandler<Event, E, R> | null | undefined;
|
|
45
|
+
//# sourceMappingURL=dom.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom.d.ts","sourceRoot":"","sources":["../../src/internal/dom.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import { isNullish, isObject } from "effect/Predicate";
|
|
3
|
+
import { CouldNotFindCommentError } from "../errors.js";
|
|
4
|
+
import { fromEffectOrEventHandler, isEventHandler } from "../EventHandler.js";
|
|
5
|
+
import { isRenderEvent, RenderEventTypeId, } from "../RenderEvent.js";
|
|
6
|
+
import { diffable, isComment } from "../Wire.js";
|
|
7
|
+
import { diff } from "./diff.js";
|
|
8
|
+
import { renderToString } from "./encoding.js";
|
|
9
|
+
export function makeTextContentUpdater(element) {
|
|
10
|
+
return (value) => {
|
|
11
|
+
element.textContent = renderToString(value, "");
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export function makeAttributeValueUpdater(element, attr) {
|
|
15
|
+
let isSet = false;
|
|
16
|
+
const setValue = (value) => {
|
|
17
|
+
if (isNullish(value)) {
|
|
18
|
+
element.removeAttribute(attr.name);
|
|
19
|
+
isSet = false;
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
attr.value = value;
|
|
23
|
+
if (isSet === false) {
|
|
24
|
+
element.setAttributeNode(attr);
|
|
25
|
+
isSet = true;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
return setValue;
|
|
30
|
+
}
|
|
31
|
+
export function makeClassListUpdater(element) {
|
|
32
|
+
// We do double-bookeeping such that we don't assume we know everything about the classList
|
|
33
|
+
// Other DOM-based libraries might have additional classes in the classList, so we need to allow them to exist
|
|
34
|
+
// outside of our control.
|
|
35
|
+
let classList = Array.from(element.classList);
|
|
36
|
+
return (classNames) => {
|
|
37
|
+
const { added, removed } = diffStrings(classList, classNames);
|
|
38
|
+
if (added.length > 0) {
|
|
39
|
+
element.classList.add(...added);
|
|
40
|
+
}
|
|
41
|
+
if (removed.length > 0) {
|
|
42
|
+
element.classList.remove(...removed);
|
|
43
|
+
}
|
|
44
|
+
classList = classNames;
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
export function makeDatasetUpdater(element) {
|
|
48
|
+
// We do double-bookeeping such that we don't assume we know everything about the dataset
|
|
49
|
+
// Other DOM-based libraries might have additional keys in the dataset, so we need to allow them to exist
|
|
50
|
+
// outside of our control.
|
|
51
|
+
const previous = { ...element.dataset };
|
|
52
|
+
return (value) => {
|
|
53
|
+
const diff = diffDataSet(previous, value);
|
|
54
|
+
if (diff) {
|
|
55
|
+
const { added, removed } = diff;
|
|
56
|
+
removed.forEach((k) => {
|
|
57
|
+
delete element.dataset[k];
|
|
58
|
+
delete previous[k];
|
|
59
|
+
});
|
|
60
|
+
added.forEach(([k, v]) => {
|
|
61
|
+
element.dataset[k] = v;
|
|
62
|
+
previous[k] = v;
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export function diffStrings(previous, current) {
|
|
68
|
+
if (previous == null || previous.length === 0) {
|
|
69
|
+
return {
|
|
70
|
+
added: current || [],
|
|
71
|
+
removed: [],
|
|
72
|
+
unchanged: [],
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
else if (current == null || current.length === 0) {
|
|
76
|
+
return {
|
|
77
|
+
added: [],
|
|
78
|
+
removed: previous,
|
|
79
|
+
unchanged: [],
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
const previousSet = new Set(previous);
|
|
84
|
+
const currentSet = new Set(current);
|
|
85
|
+
const added = current.filter((c) => !previousSet.has(c));
|
|
86
|
+
const removed = [];
|
|
87
|
+
const unchanged = [];
|
|
88
|
+
for (let i = 0; i < previous.length; ++i) {
|
|
89
|
+
if (currentSet.has(previous[i])) {
|
|
90
|
+
unchanged.push(previous[i]);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
removed.push(previous[i]);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
added,
|
|
98
|
+
removed,
|
|
99
|
+
unchanged,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
export function diffDataSet(a, b) {
|
|
104
|
+
if (!a)
|
|
105
|
+
return b ? { added: Object.entries(b), removed: [] } : null;
|
|
106
|
+
if (!b)
|
|
107
|
+
return { added: [], removed: Object.keys(a) };
|
|
108
|
+
const { added, removed, unchanged } = diffStrings(Object.keys(a), Object.keys(b));
|
|
109
|
+
return {
|
|
110
|
+
added: added.concat(unchanged).map((k) => [k, b[k]]),
|
|
111
|
+
removed,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
export function getClassList(value) {
|
|
115
|
+
if (isNullish(value))
|
|
116
|
+
return [];
|
|
117
|
+
if (Array.isArray(value))
|
|
118
|
+
return value.flatMap(getClassList);
|
|
119
|
+
return splitClassNames(renderToString(value, ""));
|
|
120
|
+
}
|
|
121
|
+
const ASCII_SPACE_CODE = 32;
|
|
122
|
+
/**
|
|
123
|
+
* Splits a string of class names (like those used in HTML `class=""` attributes)
|
|
124
|
+
* into an array of individual class names (words), separated by whitespace.
|
|
125
|
+
*
|
|
126
|
+
* This function avoids creating intermediate arrays and unnecessary string copying by:
|
|
127
|
+
* - Scanning the string one character at a time
|
|
128
|
+
* - Skipping over all leading whitespace for each word
|
|
129
|
+
* - Collecting all consecutive non-whitespace characters as a "word"
|
|
130
|
+
* - Repeating until the input is exhausted
|
|
131
|
+
*
|
|
132
|
+
* All ASCII "whitespace" characters with code <= 32 are considered as delimiters.
|
|
133
|
+
* This is more efficient than `String.prototype.trim` and `String.prototype.split(/\s+/)`
|
|
134
|
+
* as it only allocates memory for the result array, not for intermediate or empty strings.
|
|
135
|
+
*
|
|
136
|
+
* Example:
|
|
137
|
+
* splitClassNames(" foo bar\tbaz\nqux ") // => ["foo", "bar", "baz", "qux"]
|
|
138
|
+
*/
|
|
139
|
+
export function splitClassNames(value) {
|
|
140
|
+
const result = [];
|
|
141
|
+
let start = 0;
|
|
142
|
+
const len = value.length;
|
|
143
|
+
while (start < len) {
|
|
144
|
+
// Skip leading whitespace (all ASCII <= 32)
|
|
145
|
+
while (start < len && value.charCodeAt(start) <= ASCII_SPACE_CODE)
|
|
146
|
+
start++;
|
|
147
|
+
if (start >= len)
|
|
148
|
+
break;
|
|
149
|
+
// Find the end of the word (next whitespace)
|
|
150
|
+
let end = start + 1;
|
|
151
|
+
while (end < len && value.charCodeAt(end) > ASCII_SPACE_CODE)
|
|
152
|
+
end++;
|
|
153
|
+
result.push(value.slice(start, end));
|
|
154
|
+
// Move start past the end of the last word (one char after end)
|
|
155
|
+
start = end + 1;
|
|
156
|
+
}
|
|
157
|
+
return result;
|
|
158
|
+
}
|
|
159
|
+
export function matchNodeValue(document, value, onText, onNodes) {
|
|
160
|
+
switch (typeof value) {
|
|
161
|
+
// primitives are handled as text content
|
|
162
|
+
case "string":
|
|
163
|
+
case "symbol":
|
|
164
|
+
case "number":
|
|
165
|
+
case "bigint":
|
|
166
|
+
case "boolean":
|
|
167
|
+
return onText(String(value));
|
|
168
|
+
case "undefined":
|
|
169
|
+
case "function":
|
|
170
|
+
case "object": {
|
|
171
|
+
if (isNullish(value)) {
|
|
172
|
+
return onNodes([]);
|
|
173
|
+
}
|
|
174
|
+
else if (isRenderEvent(value)) {
|
|
175
|
+
return onNodes(unwrapRenderEvent(document, value));
|
|
176
|
+
}
|
|
177
|
+
else if (Array.isArray(value)) {
|
|
178
|
+
return onNodes(value.flatMap((_) => renderEventToArray(document, _)));
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
return onNodes(renderEventToArray(document, value));
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
export function renderEventToArray(document, x) {
|
|
187
|
+
switch (typeof x) {
|
|
188
|
+
case "string":
|
|
189
|
+
case "number":
|
|
190
|
+
case "bigint":
|
|
191
|
+
case "boolean":
|
|
192
|
+
case "symbol":
|
|
193
|
+
return [document.createTextNode(String(x))];
|
|
194
|
+
case "undefined":
|
|
195
|
+
case "function":
|
|
196
|
+
case "object":
|
|
197
|
+
if (isNullish(x))
|
|
198
|
+
return [];
|
|
199
|
+
if (isRenderEvent(x))
|
|
200
|
+
return unwrapRenderEvent(document, x);
|
|
201
|
+
if (Array.isArray(x))
|
|
202
|
+
return x.flatMap((_) => renderEventToArray(document, _));
|
|
203
|
+
return [x];
|
|
204
|
+
default:
|
|
205
|
+
return [];
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
function unwrapRenderEvent(document, x) {
|
|
209
|
+
if (x[RenderEventTypeId] === "dom")
|
|
210
|
+
return unwrapDomRenderEvent(x);
|
|
211
|
+
return unwrapHtmlRenderEvent(document, x);
|
|
212
|
+
}
|
|
213
|
+
function unwrapDomRenderEvent(x) {
|
|
214
|
+
const value = x.content;
|
|
215
|
+
return Array.isArray(value) ? value : [value];
|
|
216
|
+
}
|
|
217
|
+
function unwrapHtmlRenderEvent(document, x) {
|
|
218
|
+
const tmp = document.createElement("template");
|
|
219
|
+
tmp.innerHTML = x.html;
|
|
220
|
+
return Array.from(tmp.childNodes);
|
|
221
|
+
}
|
|
222
|
+
export function diffChildren(comment, currentNodes, nextNodes, get) {
|
|
223
|
+
return diff(currentNodes, nextNodes, get, comment);
|
|
224
|
+
}
|
|
225
|
+
const commentCache = new WeakMap();
|
|
226
|
+
function getCommentCacheKey(index, isEnd) {
|
|
227
|
+
return isEnd ? -index - 1 : index;
|
|
228
|
+
}
|
|
229
|
+
function findCommentInElement(parent, index, isEnd) {
|
|
230
|
+
let cache = commentCache.get(parent);
|
|
231
|
+
if (cache === undefined) {
|
|
232
|
+
cache = new Map();
|
|
233
|
+
commentCache.set(parent, cache);
|
|
234
|
+
}
|
|
235
|
+
const cacheKey = getCommentCacheKey(index, isEnd);
|
|
236
|
+
const cached = cache.get(cacheKey);
|
|
237
|
+
if (cached !== undefined) {
|
|
238
|
+
return cached;
|
|
239
|
+
}
|
|
240
|
+
const childNodes = parent.childNodes;
|
|
241
|
+
const searchValue = isEnd ? `/n_${index}` : `n_${index}`;
|
|
242
|
+
for (let i = 0; i < childNodes.length; ++i) {
|
|
243
|
+
const node = childNodes[i];
|
|
244
|
+
if (isCommentWithValue(node, searchValue)) {
|
|
245
|
+
cache.set(cacheKey, node);
|
|
246
|
+
return node;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
throw new CouldNotFindCommentError(index);
|
|
250
|
+
}
|
|
251
|
+
export function findNodePartEndComment(parent, index) {
|
|
252
|
+
return findCommentInElement(parent, index, true);
|
|
253
|
+
}
|
|
254
|
+
export function findNodePartStartComment(parent, index) {
|
|
255
|
+
return findCommentInElement(parent, index, false);
|
|
256
|
+
}
|
|
257
|
+
function isCommentWithValue(node, value) {
|
|
258
|
+
return isComment(node) && node.nodeValue === value;
|
|
259
|
+
}
|
|
260
|
+
export function makeNodeUpdater(document, comment, text = null, nodes = []) {
|
|
261
|
+
const element = comment.parentNode;
|
|
262
|
+
const get = diffable(document);
|
|
263
|
+
const updateCommentText = (value) => {
|
|
264
|
+
if (text === null) {
|
|
265
|
+
text = document.createTextNode("");
|
|
266
|
+
element.insertBefore(text, comment);
|
|
267
|
+
}
|
|
268
|
+
text.textContent = renderToString(value, "");
|
|
269
|
+
nodes = diffChildren(comment, nodes, [text], get);
|
|
270
|
+
};
|
|
271
|
+
const updateNodes = (updatedNodes) => {
|
|
272
|
+
nodes = diffChildren(comment, nodes, updatedNodes, get);
|
|
273
|
+
};
|
|
274
|
+
return (value) => {
|
|
275
|
+
matchNodeValue(document, value, updateCommentText, updateNodes);
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
export function makeBooleanUpdater(element, name) {
|
|
279
|
+
return (value) => {
|
|
280
|
+
element.toggleAttribute(name, value);
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
export function getAttributeValue(value) {
|
|
284
|
+
if (isNullish(value))
|
|
285
|
+
return null;
|
|
286
|
+
return renderToString(value, "");
|
|
287
|
+
}
|
|
288
|
+
export function getBooleanValue(value) {
|
|
289
|
+
return !!value;
|
|
290
|
+
}
|
|
291
|
+
export function getDatasetValue(value) {
|
|
292
|
+
if (isNullish(value))
|
|
293
|
+
return null;
|
|
294
|
+
if (isObject(value))
|
|
295
|
+
return value;
|
|
296
|
+
return null;
|
|
297
|
+
}
|
|
298
|
+
export function getEventHandlerValue(value) {
|
|
299
|
+
if (isNullish(value))
|
|
300
|
+
return null;
|
|
301
|
+
if (isEventHandler(value) || Effect.isEffect(value))
|
|
302
|
+
return fromEffectOrEventHandler(value);
|
|
303
|
+
return null;
|
|
304
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function escape(s: unknown): string;
|
|
2
|
+
export declare function unescape(s: string): any;
|
|
3
|
+
export declare function escapeHtml(str: string): string;
|
|
4
|
+
export declare function unescapeHtml(html: string): string;
|
|
5
|
+
export declare function renderToString(value: unknown, delimiter?: string): string;
|
|
6
|
+
export declare function renderToEscapedString(value: unknown, delimiter: string): string;
|
|
7
|
+
//# sourceMappingURL=encoding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["../../src/internal/encoding.ts"],"names":[],"mappings":"AAIA,wBAAgB,MAAM,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAuBzC;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,OAYjC;AAaD,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CA8C9C;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,UAMxC;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,GAAE,MAAW,GAAG,MAAM,CAgC7E;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE/E"}
|