@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
package/README.md
CHANGED
|
@@ -1,5 +1,124 @@
|
|
|
1
1
|
# @typed/template
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> **Beta:** This package is in beta; APIs may change.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
`@typed/template` provides **type-safe, reactive UIs that integrate with Effect**. It is the core UI layer for typed-smol apps: HTML literals (`html`), DOM rendering, SSR (HTML strings), hydration, event handlers with Effect, and keyed list rendering. Templates are **Fx streams** (`Fx<RenderEvent, E, R>`); you provide a `RenderTemplate` service (e.g. `DomRenderTemplate` for the browser or `HtmlRenderTemplate` for SSR).
|
|
6
|
+
|
|
7
|
+
## Dependencies
|
|
8
|
+
|
|
9
|
+
- `effect`
|
|
10
|
+
- `@typed/fx`
|
|
11
|
+
- `html5parser`
|
|
12
|
+
- `happy-dom` (dev)
|
|
13
|
+
|
|
14
|
+
## Capabilities
|
|
15
|
+
|
|
16
|
+
- **Reactive interpolation**: Interpolate `Renderable` values—primitives, `Effect`, `Fx`/`Stream`—directly in `html` templates; updates stream through to the DOM.
|
|
17
|
+
- **DOM + SSR targets**: Same templates work in the browser (`DomRenderTemplate`) and on the server (`HtmlRenderTemplate`); choose the layer for your environment.
|
|
18
|
+
- **Hydration**: Use `makeHydrateContext` to attach to existing SSR DOM instead of creating new nodes; supports keyed lists (`many`).
|
|
19
|
+
- **Keyed lists**: `many(values, getKey, render)` renders reactive lists with efficient keyed diffing and per-item `RefSubject` state.
|
|
20
|
+
- **EventHandler with Effect**: `EventHandler.make` for type-safe event handlers that return `Effect`; supports `preventDefault`, `stopPropagation`, etc.
|
|
21
|
+
- **Batched render queue**: `RenderQueue` and `RenderPriority` (Sync, Raf, Idle) batch DOM updates for smoother rendering.
|
|
22
|
+
|
|
23
|
+
## When to use
|
|
24
|
+
|
|
25
|
+
Use `@typed/template` when building Effect-based web UIs, when you need SSR + hydration, or when you want type-safe templates and event handlers. For routing, combine with `@typed/router`. For Link and SSR helpers, use `@typed/ui` on top of template.
|
|
26
|
+
|
|
27
|
+
## API overview
|
|
28
|
+
|
|
29
|
+
- **Templates:** `html` tag; **Renderable**; **Template** module.
|
|
30
|
+
- **Rendering:** `render(template, container)` — renders an Fx of RenderEvent into a DOM node; **RenderTemplate** (service); **DomRenderTemplate**, **HtmlRenderTemplate** (layers); **RenderEvent**, **DomRenderEvent**, **HtmlRenderEvent**.
|
|
31
|
+
- **Services (Render):** **CurrentRenderDocument**, **CurrentRenderQueue**, **CurrentRenderPriority**.
|
|
32
|
+
- **Events:** **EventHandler**; **EventSource**; **RenderEvent**.
|
|
33
|
+
- **Hydration:** **HydrateContext**, **makeHydrateContext**.
|
|
34
|
+
- **Other:** **Parser**, **Wire**; **HtmlChunk**, **RenderQueue**; subpaths `@typed/template/Render`, `@typed/template/Html`, `@typed/template/HtmlChunk`, etc.
|
|
35
|
+
|
|
36
|
+
## Example
|
|
37
|
+
|
|
38
|
+
```ts
|
|
39
|
+
import { Layer } from "effect";
|
|
40
|
+
import { Fx, RefSubject } from "@typed/fx";
|
|
41
|
+
import { DomRenderTemplate, html, render } from "@typed/template";
|
|
42
|
+
|
|
43
|
+
const Counter = Fx.gen(function* () {
|
|
44
|
+
const count = yield* RefSubject.make(0);
|
|
45
|
+
return html`<div>
|
|
46
|
+
<button onclick=${RefSubject.increment(count)}>Increment</button>
|
|
47
|
+
<button onclick=${RefSubject.decrement(count)}>Decrement</button>
|
|
48
|
+
<p>Count: ${count}</p>
|
|
49
|
+
</div>`;
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
// Inside Effect.gen(function* () { ... })
|
|
53
|
+
yield *
|
|
54
|
+
render(Counter, document.body).pipe(
|
|
55
|
+
Fx.drainLayer,
|
|
56
|
+
Layer.provide(DomRenderTemplate),
|
|
57
|
+
Layer.launch,
|
|
58
|
+
);
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
See the [counter example](https://github.com/typed-smol/typed-smol/tree/main/examples/counter) for a full app.
|
|
62
|
+
|
|
63
|
+
## API Reference
|
|
64
|
+
|
|
65
|
+
### Main entry (`@typed/template`)
|
|
66
|
+
|
|
67
|
+
| Export | Description |
|
|
68
|
+
| ----------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
69
|
+
| **Templates** | |
|
|
70
|
+
| `html` | Tag function for HTML template literals; returns an `Fx<RenderEvent, E, R>`. Requires `RenderTemplate` in context. |
|
|
71
|
+
| `many(values, getKey, render)` | Renders a reactive list with keyed diffing; `values` is an `Fx<ReadonlyArray<A>>`, `getKey` maps items to keys, `render(ref, key)` returns an Fx of RenderEvents. |
|
|
72
|
+
| **RenderEvent** | |
|
|
73
|
+
| `RenderEvent` | Union of `DomRenderEvent` and `HtmlRenderEvent`. |
|
|
74
|
+
| `DomRenderEvent(content)` | Constructor for a DOM render result; `content` is `Rendered` (from `Wire`). |
|
|
75
|
+
| `HtmlRenderEvent(html, last)` | Constructor for an HTML-string render result; `last` indicates final chunk. |
|
|
76
|
+
| `isRenderEvent`, `isDomRenderEvent`, `isHtmlRenderEvent` | Type guards for `RenderEvent` variants. |
|
|
77
|
+
| **Renderable** | |
|
|
78
|
+
| `Renderable<A, E, R>` | Type of values that can be interpolated: primitives, arrays, `Effect`, `Fx`/`Stream`, objects. `Renderable.Any`, `Renderable.Services`, `Renderable.Error`, `Renderable.Success` for type-level helpers. |
|
|
79
|
+
| **EventHandler** (`EventHandler` namespace) | |
|
|
80
|
+
| `EventHandler.make(handler, options?)` | Creates an event handler; `handler` can return `void` or `Effect`; `options` can include `preventDefault`, `stopPropagation`, `once`, `passive`, etc. |
|
|
81
|
+
| `EventHandler.provide`, `EventHandler.catchCause` | Provide services or recover from errors. |
|
|
82
|
+
| `EventHandler.preventDefault`, `stopPropagation`, `stopImmediatePropagation`, `once`, `passive` | Combinators that add listener options. |
|
|
83
|
+
| `EventHandler.fromEffectOrEventHandler`, `EventHandler.isEventHandler` | Coerce from Effect or check type. |
|
|
84
|
+
| **EventSource** | |
|
|
85
|
+
| `makeEventSource()` | Creates an `EventSource` with `addEventListener` and `setup(rendered, scope)`. |
|
|
86
|
+
| **Hydration** | |
|
|
87
|
+
| `HydrateContext` | Service tag for hydration context (internal shape). |
|
|
88
|
+
| `makeHydrateContext(rootElement)` | Builds a service map with hydration context for the given root element. |
|
|
89
|
+
| **Parser** | |
|
|
90
|
+
| `parse(template)` | Parses a `TemplateStringsArray` (or readonly string array) into a `Template.Template`. |
|
|
91
|
+
| **RenderTemplate** | |
|
|
92
|
+
| `RenderTemplate` | Service that implements template rendering; callable as `(templateStrings, values) => Fx<RenderEvent, E, R>`. |
|
|
93
|
+
| **Template** | |
|
|
94
|
+
| `Template` (namespace) | `Template` class (nodes, hash, parts), part/element node types (`NodePart`, `AttrPartNode`, `EventPartNode`, etc.), and AST node types. |
|
|
95
|
+
| **HtmlChunk** | |
|
|
96
|
+
| `HtmlChunk`, `HtmlTextChunk`, `HtmlPartChunk`, `HtmlSparsePartChunk` | Types for pre-compiled HTML chunks. |
|
|
97
|
+
| `templateToHtmlChunks(template)`, `addTemplateHash(chunks, template)` | Build chunks from a parsed template; add hash comments for hydration. |
|
|
98
|
+
| **Wire** | |
|
|
99
|
+
| `Wire`, `Rendered` | Wire is a persistent fragment-like type; `Rendered` is the DOM output type. `persistent(document, templateHash, fragment)`, `toHtml(rendered)`, and internal helpers. |
|
|
100
|
+
| **RenderQueue** | |
|
|
101
|
+
| `RenderQueue` (abstract), `MixedRenderQueue`, `RenderPriority` | Queue for batched DOM updates; priorities like `RenderPriority.Sync`, `RenderPriority.Raf(n)`, `RenderPriority.Idle(n)`. |
|
|
102
|
+
|
|
103
|
+
### `@typed/template/Render`
|
|
104
|
+
|
|
105
|
+
| Export | Description |
|
|
106
|
+
| ----------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
|
|
107
|
+
| `render(fx, where)` / `render(where)(fx)` | Mounts an Fx of `RenderEvent`s into the DOM element `where`; provides `HydrateContext` from `where`. Returns Fx of rendered DOM. |
|
|
108
|
+
| `DomRenderTemplate` | Layer providing DOM-based `RenderTemplate`. `DomRenderTemplate.using(document)` for a custom document. |
|
|
109
|
+
| `CurrentRenderDocument` | Service reference for the `Document` used when rendering (default: global `document`). |
|
|
110
|
+
| `CurrentRenderQueue` | Service reference for the render queue (default: `MixedRenderQueue`). |
|
|
111
|
+
| `CurrentRenderPriority` | Service reference for default task priority (default: `RenderPriority.Raf(10)`). |
|
|
112
|
+
| `ToRendered<T>` | Type: rendered DOM for `RenderEvent` or `null`. |
|
|
113
|
+
| `attemptHydration(ctx, hash)` | Internal helper for hydration. |
|
|
114
|
+
| `TemplateContext` | Internal render context type. |
|
|
115
|
+
|
|
116
|
+
### `@typed/template/Html`
|
|
117
|
+
|
|
118
|
+
| Export | Description |
|
|
119
|
+
| -------------------------- | -------------------------------------------------------------------------- |
|
|
120
|
+
| `renderToHtml(fx)` | Converts an Fx of `RenderEvent`s into an Fx of HTML strings (for SSR). |
|
|
121
|
+
| `renderToHtmlString(fx)` | Effect that collects `renderToHtml` output and joins into a single string. |
|
|
122
|
+
| `HtmlRenderTemplate` | Layer providing HTML-string `RenderTemplate` (for SSR). |
|
|
123
|
+
| `StaticHtmlRenderTemplate` | Like `HtmlRenderTemplate` with static rendering optimizations. |
|
|
124
|
+
| `StaticRendering` | Service reference (boolean) for static rendering mode. |
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
import type * as Cause from "effect/Cause";
|
|
2
|
+
import * as Effect from "effect/Effect";
|
|
3
|
+
import { type Pipeable } from "effect/Pipeable";
|
|
4
|
+
import type * as ServiceMap from "effect/ServiceMap";
|
|
5
|
+
export declare const EventHandlerTypeId: unique symbol;
|
|
6
|
+
export type EventHandlerTypeId = typeof EventHandlerTypeId;
|
|
7
|
+
/**
|
|
8
|
+
* Represents a DOM event handler that returns an Effect.
|
|
9
|
+
*
|
|
10
|
+
* It encapsulates the event handler logic and any options (like `preventDefault`, `once`, etc.)
|
|
11
|
+
* that should be applied when the event is triggered.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* import { Effect } from "effect"
|
|
16
|
+
* import * as EventHandler from "@typed/template/EventHandler"
|
|
17
|
+
* import { html } from "@typed/template"
|
|
18
|
+
*
|
|
19
|
+
* // Simple event handler
|
|
20
|
+
* const handleClick = EventHandler.make((event: MouseEvent) => {
|
|
21
|
+
* console.log("Clicked!", event)
|
|
22
|
+
* })
|
|
23
|
+
*
|
|
24
|
+
* // Event handler with Effect
|
|
25
|
+
* const handleSubmit = EventHandler.make((event: SubmitEvent) =>
|
|
26
|
+
* Effect.gen(function* () {
|
|
27
|
+
* event.preventDefault()
|
|
28
|
+
* yield* Effect.sync(() => console.log("Form submitted"))
|
|
29
|
+
* })
|
|
30
|
+
* )
|
|
31
|
+
*
|
|
32
|
+
* // Use in template
|
|
33
|
+
* const template = html`<button onclick=${handleClick}>Click me</button>`
|
|
34
|
+
* ```
|
|
35
|
+
*
|
|
36
|
+
* @since 1.0.0
|
|
37
|
+
* @category models
|
|
38
|
+
*/
|
|
39
|
+
export interface EventHandler<Ev extends Event = Event, E = never, R = never> extends Pipeable {
|
|
40
|
+
readonly [EventHandlerTypeId]: EventHandlerTypeId;
|
|
41
|
+
readonly handler: (event: Ev) => Effect.Effect<unknown, E, R>;
|
|
42
|
+
readonly options: (AddEventListenerOptions & EventOptions) | undefined;
|
|
43
|
+
}
|
|
44
|
+
export type Context<T> = T extends EventHandler<infer _Ev, infer _E, infer R> ? R : never;
|
|
45
|
+
export type Error<T> = T extends EventHandler<infer _Ev, infer E, infer _R> ? E : never;
|
|
46
|
+
export type EventOf<T> = T extends EventHandler<infer Ev, infer _E, infer _R> ? Ev : never;
|
|
47
|
+
/**
|
|
48
|
+
* Options for configuring event handling behavior.
|
|
49
|
+
*/
|
|
50
|
+
export type EventOptions = {
|
|
51
|
+
readonly preventDefault?: boolean;
|
|
52
|
+
readonly stopPropagation?: boolean;
|
|
53
|
+
readonly stopImmediatePropagation?: boolean;
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Creates a new `EventHandler`.
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* ```ts
|
|
60
|
+
* import { Effect } from "effect"
|
|
61
|
+
* import * as EventHandler from "@typed/template/EventHandler"
|
|
62
|
+
* import { html } from "@typed/template"
|
|
63
|
+
*
|
|
64
|
+
* // Simple handler
|
|
65
|
+
* const clickHandler = EventHandler.make((event) => {
|
|
66
|
+
* console.log("Button clicked")
|
|
67
|
+
* })
|
|
68
|
+
*
|
|
69
|
+
* // Handler with Effect
|
|
70
|
+
* const submitHandler = EventHandler.make((event) =>
|
|
71
|
+
* Effect.gen(function* () {
|
|
72
|
+
* const form = event.target as HTMLFormElement
|
|
73
|
+
* const data = new FormData(form)
|
|
74
|
+
* yield* Effect.sync(() => console.log("Submitting:", data))
|
|
75
|
+
* })
|
|
76
|
+
* )
|
|
77
|
+
*
|
|
78
|
+
* // Handler with options
|
|
79
|
+
* const preventDefaultHandler = EventHandler.make(
|
|
80
|
+
* (event) => console.log("Prevented default"),
|
|
81
|
+
* { preventDefault: true }
|
|
82
|
+
* )
|
|
83
|
+
*
|
|
84
|
+
* const template = html`<button onclick=${clickHandler}>Click</button>`
|
|
85
|
+
* ```
|
|
86
|
+
*
|
|
87
|
+
* @param handler - The function to execute when the event occurs. Can return void or an Effect.
|
|
88
|
+
* @param options - Optional configuration for the event listener.
|
|
89
|
+
* @since 1.0.0
|
|
90
|
+
* @category constructors
|
|
91
|
+
*/
|
|
92
|
+
export declare function make<Ev extends Event, E = never, R = never>(handler: (event: Ev) => void | Effect.Effect<unknown, E, R>, options?: AddEventListenerOptions & EventOptions): EventHandler<Ev, E, R>;
|
|
93
|
+
/**
|
|
94
|
+
* Provides services to the `EventHandler`.
|
|
95
|
+
*
|
|
96
|
+
* This allows you to inject dependencies into the effect returned by the event handler.
|
|
97
|
+
*
|
|
98
|
+
* @example
|
|
99
|
+
* ```ts
|
|
100
|
+
* import { Effect, Context } from "effect"
|
|
101
|
+
* import * as EventHandler from "@typed/template/EventHandler"
|
|
102
|
+
*
|
|
103
|
+
* interface Database {
|
|
104
|
+
* readonly save: (data: string) => Effect.Effect<void>
|
|
105
|
+
* }
|
|
106
|
+
* const Database = Context.GenericTag<Database>("Database")
|
|
107
|
+
*
|
|
108
|
+
* const handler = EventHandler.make((event) =>
|
|
109
|
+
* Effect.flatMap(Database, (db) => db.save("data"))
|
|
110
|
+
* )
|
|
111
|
+
*
|
|
112
|
+
* // Provide services
|
|
113
|
+
* const provided = EventHandler.provide(handler, Database.of({ save: (d) => Effect.sync(() => console.log(d)) }))
|
|
114
|
+
* ```
|
|
115
|
+
*
|
|
116
|
+
* @since 1.0.0
|
|
117
|
+
* @category combinators
|
|
118
|
+
*/
|
|
119
|
+
export declare const provide: {
|
|
120
|
+
<R2 = never>(services: ServiceMap.ServiceMap<R2>): <Ev extends Event, E = never, R = never>(handler: EventHandler<Ev, E, R>) => EventHandler<Ev, E, Exclude<R, R2>>;
|
|
121
|
+
<Ev extends Event, E = never, R = never, R2 = never>(handler: EventHandler<Ev, E, R>, services: ServiceMap.ServiceMap<R2>): EventHandler<Ev, E, Exclude<R, R2>>;
|
|
122
|
+
};
|
|
123
|
+
/**
|
|
124
|
+
* Recovers from errors in the `EventHandler`.
|
|
125
|
+
*
|
|
126
|
+
* @example
|
|
127
|
+
* ```ts
|
|
128
|
+
* import { Effect } from "effect"
|
|
129
|
+
* import * as EventHandler from "@typed/template/EventHandler"
|
|
130
|
+
*
|
|
131
|
+
* const handler = EventHandler.make((event) =>
|
|
132
|
+
* Effect.fail("Something went wrong")
|
|
133
|
+
* )
|
|
134
|
+
*
|
|
135
|
+
* // Recover from errors
|
|
136
|
+
* const recovered = EventHandler.catchCause(handler, (cause) =>
|
|
137
|
+
* Effect.sync(() => console.error("Error:", cause))
|
|
138
|
+
* )
|
|
139
|
+
* ```
|
|
140
|
+
*
|
|
141
|
+
* @since 1.0.0
|
|
142
|
+
* @category combinators
|
|
143
|
+
*/
|
|
144
|
+
export declare const catchCause: {
|
|
145
|
+
<E, E2 = never, R2 = never>(f: (cause: Cause.Cause<E>) => Effect.Effect<unknown, E2, R2>): <Ev extends Event, R = never>(handler: EventHandler<Ev, E, R>) => EventHandler<Ev, E2, R | R2>;
|
|
146
|
+
<Ev extends Event, E = never, R = never, E2 = never, R2 = never>(handler: EventHandler<Ev, E, R>, f: (cause: Cause.Cause<E>) => Effect.Effect<unknown, E2, R2>): EventHandler<Ev, E2, R | R2>;
|
|
147
|
+
};
|
|
148
|
+
/**
|
|
149
|
+
* Helper to ensure a value is an `EventHandler`.
|
|
150
|
+
*
|
|
151
|
+
* If the input is already an `EventHandler`, it is returned as is.
|
|
152
|
+
* If it is an `Effect`, it is wrapped in an `EventHandler` that ignores the event argument.
|
|
153
|
+
*/
|
|
154
|
+
export declare function fromEffectOrEventHandler<Ev extends Event, E = never, R = never>(handler: Effect.Effect<unknown, E, R> | EventHandler<Ev, E, R>): EventHandler<Ev, E, R>;
|
|
155
|
+
/**
|
|
156
|
+
* Checks if a value is an `EventHandler`.
|
|
157
|
+
*
|
|
158
|
+
* @example
|
|
159
|
+
* ```ts
|
|
160
|
+
* import * as EventHandler from "@typed/template/EventHandler"
|
|
161
|
+
*
|
|
162
|
+
* const handler = EventHandler.make((event) => console.log("Click"))
|
|
163
|
+
* const isHandler = EventHandler.isEventHandler(handler)
|
|
164
|
+
* console.log(isHandler) // true
|
|
165
|
+
*
|
|
166
|
+
* const notHandler = (event: Event) => console.log("Click")
|
|
167
|
+
* const isNotHandler = EventHandler.isEventHandler(notHandler)
|
|
168
|
+
* console.log(isNotHandler) // false
|
|
169
|
+
* ```
|
|
170
|
+
*
|
|
171
|
+
* @since 1.0.0
|
|
172
|
+
* @category guards
|
|
173
|
+
*/
|
|
174
|
+
export declare function isEventHandler<Ev extends Event, E = never, R = never>(handler: unknown): handler is EventHandler<Ev, E, R>;
|
|
175
|
+
/**
|
|
176
|
+
* Applies event options to a native DOM event.
|
|
177
|
+
*/
|
|
178
|
+
export declare function handleEventOptions<Ev extends Event>(eventOptions: EventOptions, ev: Ev): boolean;
|
|
179
|
+
/**
|
|
180
|
+
* Modifies an `EventHandler` to call `preventDefault()` on the event.
|
|
181
|
+
*
|
|
182
|
+
* @example
|
|
183
|
+
* ```ts
|
|
184
|
+
* import * as EventHandler from "@typed/template/EventHandler"
|
|
185
|
+
* import { html } from "@typed/template"
|
|
186
|
+
*
|
|
187
|
+
* const handler = EventHandler.make((event) => {
|
|
188
|
+
* console.log("Form submit prevented")
|
|
189
|
+
* })
|
|
190
|
+
*
|
|
191
|
+
* const preventDefaultHandler = EventHandler.preventDefault(handler)
|
|
192
|
+
*
|
|
193
|
+
* const template = html`<form onsubmit=${preventDefaultHandler}>...</form>`
|
|
194
|
+
* ```
|
|
195
|
+
*
|
|
196
|
+
* @since 1.0.0
|
|
197
|
+
* @category combinators
|
|
198
|
+
*/
|
|
199
|
+
export declare function preventDefault<Ev extends Event, E = never, R = never>(handler: EventHandler<Ev, E, R>): EventHandler<Ev, E, R>;
|
|
200
|
+
/**
|
|
201
|
+
* Modifies an `EventHandler` to call `stopPropagation()` on the event.
|
|
202
|
+
*
|
|
203
|
+
* @example
|
|
204
|
+
* ```ts
|
|
205
|
+
* import * as EventHandler from "@typed/template/EventHandler"
|
|
206
|
+
*
|
|
207
|
+
* const handler = EventHandler.make((event) => {
|
|
208
|
+
* console.log("Event stopped")
|
|
209
|
+
* })
|
|
210
|
+
*
|
|
211
|
+
* const stopPropHandler = EventHandler.stopPropagation(handler)
|
|
212
|
+
* ```
|
|
213
|
+
*
|
|
214
|
+
* @since 1.0.0
|
|
215
|
+
* @category combinators
|
|
216
|
+
*/
|
|
217
|
+
export declare function stopPropagation<Ev extends Event, E = never, R = never>(handler: EventHandler<Ev, E, R>): EventHandler<Ev, E, R>;
|
|
218
|
+
/**
|
|
219
|
+
* Modifies an `EventHandler` to call `stopImmediatePropagation()` on the event.
|
|
220
|
+
*
|
|
221
|
+
* @example
|
|
222
|
+
* ```ts
|
|
223
|
+
* import * as EventHandler from "@typed/template/EventHandler"
|
|
224
|
+
*
|
|
225
|
+
* const handler = EventHandler.make((event) => {
|
|
226
|
+
* console.log("Immediate propagation stopped")
|
|
227
|
+
* })
|
|
228
|
+
*
|
|
229
|
+
* const stopImmediateHandler = EventHandler.stopImmediatePropagation(handler)
|
|
230
|
+
* ```
|
|
231
|
+
*
|
|
232
|
+
* @since 1.0.0
|
|
233
|
+
* @category combinators
|
|
234
|
+
*/
|
|
235
|
+
export declare function stopImmediatePropagation<Ev extends Event, E = never, R = never>(handler: EventHandler<Ev, E, R>): EventHandler<Ev, E, R>;
|
|
236
|
+
/**
|
|
237
|
+
* Modifies an `EventHandler` to run only once.
|
|
238
|
+
*
|
|
239
|
+
* @example
|
|
240
|
+
* ```ts
|
|
241
|
+
* import * as EventHandler from "@typed/template/EventHandler"
|
|
242
|
+
*
|
|
243
|
+
* const handler = EventHandler.make((event) => {
|
|
244
|
+
* console.log("This will only run once")
|
|
245
|
+
* })
|
|
246
|
+
*
|
|
247
|
+
* const onceHandler = EventHandler.once(handler)
|
|
248
|
+
* ```
|
|
249
|
+
*
|
|
250
|
+
* @since 1.0.0
|
|
251
|
+
* @category combinators
|
|
252
|
+
*/
|
|
253
|
+
export declare function once<Ev extends Event, E = never, R = never>(handler: EventHandler<Ev, E, R>): EventHandler<Ev, E, R>;
|
|
254
|
+
/**
|
|
255
|
+
* Modifies an `EventHandler` to be passive (improves scrolling performance).
|
|
256
|
+
*
|
|
257
|
+
* @example
|
|
258
|
+
* ```ts
|
|
259
|
+
* import * as EventHandler from "@typed/template/EventHandler"
|
|
260
|
+
*
|
|
261
|
+
* const handler = EventHandler.make((event) => {
|
|
262
|
+
* // Passive handlers can't call preventDefault
|
|
263
|
+
* console.log("Scroll event")
|
|
264
|
+
* })
|
|
265
|
+
*
|
|
266
|
+
* const passiveHandler = EventHandler.passive(handler)
|
|
267
|
+
* ```
|
|
268
|
+
*
|
|
269
|
+
* @since 1.0.0
|
|
270
|
+
* @category combinators
|
|
271
|
+
*/
|
|
272
|
+
export declare function passive<Ev extends Event, E = never, R = never>(handler: EventHandler<Ev, E, R>): EventHandler<Ev, E, R>;
|
|
273
|
+
//# sourceMappingURL=EventHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventHandler.d.ts","sourceRoot":"","sources":["../src/EventHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import { dual } from "effect/Function";
|
|
3
|
+
import { pipeArguments } from "effect/Pipeable";
|
|
4
|
+
import { hasProperty } from "effect/Predicate";
|
|
5
|
+
export const EventHandlerTypeId = Symbol.for("@typed/template/EventHandler");
|
|
6
|
+
/**
|
|
7
|
+
* Creates a new `EventHandler`.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* import { Effect } from "effect"
|
|
12
|
+
* import * as EventHandler from "@typed/template/EventHandler"
|
|
13
|
+
* import { html } from "@typed/template"
|
|
14
|
+
*
|
|
15
|
+
* // Simple handler
|
|
16
|
+
* const clickHandler = EventHandler.make((event) => {
|
|
17
|
+
* console.log("Button clicked")
|
|
18
|
+
* })
|
|
19
|
+
*
|
|
20
|
+
* // Handler with Effect
|
|
21
|
+
* const submitHandler = EventHandler.make((event) =>
|
|
22
|
+
* Effect.gen(function* () {
|
|
23
|
+
* const form = event.target as HTMLFormElement
|
|
24
|
+
* const data = new FormData(form)
|
|
25
|
+
* yield* Effect.sync(() => console.log("Submitting:", data))
|
|
26
|
+
* })
|
|
27
|
+
* )
|
|
28
|
+
*
|
|
29
|
+
* // Handler with options
|
|
30
|
+
* const preventDefaultHandler = EventHandler.make(
|
|
31
|
+
* (event) => console.log("Prevented default"),
|
|
32
|
+
* { preventDefault: true }
|
|
33
|
+
* )
|
|
34
|
+
*
|
|
35
|
+
* const template = html`<button onclick=${clickHandler}>Click</button>`
|
|
36
|
+
* ```
|
|
37
|
+
*
|
|
38
|
+
* @param handler - The function to execute when the event occurs. Can return void or an Effect.
|
|
39
|
+
* @param options - Optional configuration for the event listener.
|
|
40
|
+
* @since 1.0.0
|
|
41
|
+
* @category constructors
|
|
42
|
+
*/
|
|
43
|
+
export function make(handler, options) {
|
|
44
|
+
return {
|
|
45
|
+
[EventHandlerTypeId]: EventHandlerTypeId,
|
|
46
|
+
handler: (ev) => {
|
|
47
|
+
if (options)
|
|
48
|
+
handleEventOptions(options, ev);
|
|
49
|
+
const result = handler(ev);
|
|
50
|
+
if (Effect.isEffect(result))
|
|
51
|
+
return result;
|
|
52
|
+
return Effect.void;
|
|
53
|
+
},
|
|
54
|
+
options,
|
|
55
|
+
pipe() {
|
|
56
|
+
return pipeArguments(this, arguments);
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Provides services to the `EventHandler`.
|
|
62
|
+
*
|
|
63
|
+
* This allows you to inject dependencies into the effect returned by the event handler.
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```ts
|
|
67
|
+
* import { Effect, Context } from "effect"
|
|
68
|
+
* import * as EventHandler from "@typed/template/EventHandler"
|
|
69
|
+
*
|
|
70
|
+
* interface Database {
|
|
71
|
+
* readonly save: (data: string) => Effect.Effect<void>
|
|
72
|
+
* }
|
|
73
|
+
* const Database = Context.GenericTag<Database>("Database")
|
|
74
|
+
*
|
|
75
|
+
* const handler = EventHandler.make((event) =>
|
|
76
|
+
* Effect.flatMap(Database, (db) => db.save("data"))
|
|
77
|
+
* )
|
|
78
|
+
*
|
|
79
|
+
* // Provide services
|
|
80
|
+
* const provided = EventHandler.provide(handler, Database.of({ save: (d) => Effect.sync(() => console.log(d)) }))
|
|
81
|
+
* ```
|
|
82
|
+
*
|
|
83
|
+
* @since 1.0.0
|
|
84
|
+
* @category combinators
|
|
85
|
+
*/
|
|
86
|
+
export const provide = dual(2, (handler, services) => {
|
|
87
|
+
return make((ev) => handler.handler(ev).pipe(Effect.provideServices(services)), handler.options);
|
|
88
|
+
});
|
|
89
|
+
/**
|
|
90
|
+
* Recovers from errors in the `EventHandler`.
|
|
91
|
+
*
|
|
92
|
+
* @example
|
|
93
|
+
* ```ts
|
|
94
|
+
* import { Effect } from "effect"
|
|
95
|
+
* import * as EventHandler from "@typed/template/EventHandler"
|
|
96
|
+
*
|
|
97
|
+
* const handler = EventHandler.make((event) =>
|
|
98
|
+
* Effect.fail("Something went wrong")
|
|
99
|
+
* )
|
|
100
|
+
*
|
|
101
|
+
* // Recover from errors
|
|
102
|
+
* const recovered = EventHandler.catchCause(handler, (cause) =>
|
|
103
|
+
* Effect.sync(() => console.error("Error:", cause))
|
|
104
|
+
* )
|
|
105
|
+
* ```
|
|
106
|
+
*
|
|
107
|
+
* @since 1.0.0
|
|
108
|
+
* @category combinators
|
|
109
|
+
*/
|
|
110
|
+
export const catchCause = dual(2, (handler, f) => {
|
|
111
|
+
return make((ev) => handler.handler(ev).pipe(Effect.catchCause(f)), handler.options);
|
|
112
|
+
});
|
|
113
|
+
/**
|
|
114
|
+
* Helper to ensure a value is an `EventHandler`.
|
|
115
|
+
*
|
|
116
|
+
* If the input is already an `EventHandler`, it is returned as is.
|
|
117
|
+
* If it is an `Effect`, it is wrapped in an `EventHandler` that ignores the event argument.
|
|
118
|
+
*/
|
|
119
|
+
export function fromEffectOrEventHandler(handler) {
|
|
120
|
+
if (isEventHandler(handler))
|
|
121
|
+
return handler;
|
|
122
|
+
return make(() => handler);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Checks if a value is an `EventHandler`.
|
|
126
|
+
*
|
|
127
|
+
* @example
|
|
128
|
+
* ```ts
|
|
129
|
+
* import * as EventHandler from "@typed/template/EventHandler"
|
|
130
|
+
*
|
|
131
|
+
* const handler = EventHandler.make((event) => console.log("Click"))
|
|
132
|
+
* const isHandler = EventHandler.isEventHandler(handler)
|
|
133
|
+
* console.log(isHandler) // true
|
|
134
|
+
*
|
|
135
|
+
* const notHandler = (event: Event) => console.log("Click")
|
|
136
|
+
* const isNotHandler = EventHandler.isEventHandler(notHandler)
|
|
137
|
+
* console.log(isNotHandler) // false
|
|
138
|
+
* ```
|
|
139
|
+
*
|
|
140
|
+
* @since 1.0.0
|
|
141
|
+
* @category guards
|
|
142
|
+
*/
|
|
143
|
+
export function isEventHandler(handler) {
|
|
144
|
+
return hasProperty(handler, EventHandlerTypeId);
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Applies event options to a native DOM event.
|
|
148
|
+
*/
|
|
149
|
+
export function handleEventOptions(eventOptions, ev) {
|
|
150
|
+
if (eventOptions.preventDefault)
|
|
151
|
+
ev.preventDefault();
|
|
152
|
+
if (eventOptions.stopPropagation)
|
|
153
|
+
ev.stopPropagation();
|
|
154
|
+
if (eventOptions.stopImmediatePropagation)
|
|
155
|
+
ev.stopImmediatePropagation();
|
|
156
|
+
return true;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Modifies an `EventHandler` to call `preventDefault()` on the event.
|
|
160
|
+
*
|
|
161
|
+
* @example
|
|
162
|
+
* ```ts
|
|
163
|
+
* import * as EventHandler from "@typed/template/EventHandler"
|
|
164
|
+
* import { html } from "@typed/template"
|
|
165
|
+
*
|
|
166
|
+
* const handler = EventHandler.make((event) => {
|
|
167
|
+
* console.log("Form submit prevented")
|
|
168
|
+
* })
|
|
169
|
+
*
|
|
170
|
+
* const preventDefaultHandler = EventHandler.preventDefault(handler)
|
|
171
|
+
*
|
|
172
|
+
* const template = html`<form onsubmit=${preventDefaultHandler}>...</form>`
|
|
173
|
+
* ```
|
|
174
|
+
*
|
|
175
|
+
* @since 1.0.0
|
|
176
|
+
* @category combinators
|
|
177
|
+
*/
|
|
178
|
+
export function preventDefault(handler) {
|
|
179
|
+
return make(handler.handler, { ...handler.options, preventDefault: true });
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Modifies an `EventHandler` to call `stopPropagation()` on the event.
|
|
183
|
+
*
|
|
184
|
+
* @example
|
|
185
|
+
* ```ts
|
|
186
|
+
* import * as EventHandler from "@typed/template/EventHandler"
|
|
187
|
+
*
|
|
188
|
+
* const handler = EventHandler.make((event) => {
|
|
189
|
+
* console.log("Event stopped")
|
|
190
|
+
* })
|
|
191
|
+
*
|
|
192
|
+
* const stopPropHandler = EventHandler.stopPropagation(handler)
|
|
193
|
+
* ```
|
|
194
|
+
*
|
|
195
|
+
* @since 1.0.0
|
|
196
|
+
* @category combinators
|
|
197
|
+
*/
|
|
198
|
+
export function stopPropagation(handler) {
|
|
199
|
+
return make(handler.handler, { ...handler.options, stopPropagation: true });
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Modifies an `EventHandler` to call `stopImmediatePropagation()` on the event.
|
|
203
|
+
*
|
|
204
|
+
* @example
|
|
205
|
+
* ```ts
|
|
206
|
+
* import * as EventHandler from "@typed/template/EventHandler"
|
|
207
|
+
*
|
|
208
|
+
* const handler = EventHandler.make((event) => {
|
|
209
|
+
* console.log("Immediate propagation stopped")
|
|
210
|
+
* })
|
|
211
|
+
*
|
|
212
|
+
* const stopImmediateHandler = EventHandler.stopImmediatePropagation(handler)
|
|
213
|
+
* ```
|
|
214
|
+
*
|
|
215
|
+
* @since 1.0.0
|
|
216
|
+
* @category combinators
|
|
217
|
+
*/
|
|
218
|
+
export function stopImmediatePropagation(handler) {
|
|
219
|
+
return make(handler.handler, { ...handler.options, stopImmediatePropagation: true });
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Modifies an `EventHandler` to run only once.
|
|
223
|
+
*
|
|
224
|
+
* @example
|
|
225
|
+
* ```ts
|
|
226
|
+
* import * as EventHandler from "@typed/template/EventHandler"
|
|
227
|
+
*
|
|
228
|
+
* const handler = EventHandler.make((event) => {
|
|
229
|
+
* console.log("This will only run once")
|
|
230
|
+
* })
|
|
231
|
+
*
|
|
232
|
+
* const onceHandler = EventHandler.once(handler)
|
|
233
|
+
* ```
|
|
234
|
+
*
|
|
235
|
+
* @since 1.0.0
|
|
236
|
+
* @category combinators
|
|
237
|
+
*/
|
|
238
|
+
export function once(handler) {
|
|
239
|
+
return make(handler.handler, { ...handler.options, once: true, passive: false });
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Modifies an `EventHandler` to be passive (improves scrolling performance).
|
|
243
|
+
*
|
|
244
|
+
* @example
|
|
245
|
+
* ```ts
|
|
246
|
+
* import * as EventHandler from "@typed/template/EventHandler"
|
|
247
|
+
*
|
|
248
|
+
* const handler = EventHandler.make((event) => {
|
|
249
|
+
* // Passive handlers can't call preventDefault
|
|
250
|
+
* console.log("Scroll event")
|
|
251
|
+
* })
|
|
252
|
+
*
|
|
253
|
+
* const passiveHandler = EventHandler.passive(handler)
|
|
254
|
+
* ```
|
|
255
|
+
*
|
|
256
|
+
* @since 1.0.0
|
|
257
|
+
* @category combinators
|
|
258
|
+
*/
|
|
259
|
+
export function passive(handler) {
|
|
260
|
+
return make(handler.handler, { ...handler.options, passive: true, once: false });
|
|
261
|
+
}
|