@typed/template 0.14.0 → 1.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +108 -2
- package/dist/EventHandler.d.ts +273 -0
- package/dist/EventHandler.d.ts.map +1 -0
- package/dist/EventHandler.js +261 -0
- package/dist/EventSource.d.ts +82 -0
- package/dist/EventSource.d.ts.map +1 -0
- package/dist/EventSource.js +127 -0
- package/dist/Html.d.ts +122 -0
- package/dist/Html.d.ts.map +1 -0
- package/dist/Html.js +250 -0
- package/dist/HtmlChunk.d.ts +118 -0
- package/dist/HtmlChunk.d.ts.map +1 -0
- package/dist/HtmlChunk.js +211 -0
- package/dist/HydrateContext.d.ts +28 -0
- package/dist/HydrateContext.d.ts.map +1 -0
- package/dist/HydrateContext.js +25 -0
- package/dist/Parser.d.ts +35 -0
- package/dist/Parser.d.ts.map +1 -0
- package/dist/Parser.js +437 -0
- package/dist/Render.d.ts +195 -0
- package/dist/Render.d.ts.map +1 -0
- package/dist/Render.js +609 -0
- package/dist/RenderEvent.d.ts +179 -0
- package/dist/RenderEvent.d.ts.map +1 -0
- package/dist/RenderEvent.js +102 -0
- package/dist/RenderQueue.d.ts +167 -0
- package/dist/RenderQueue.d.ts.map +1 -0
- package/dist/RenderQueue.js +297 -0
- package/dist/RenderTemplate.d.ts +90 -0
- package/dist/RenderTemplate.d.ts.map +1 -0
- package/dist/RenderTemplate.js +87 -0
- package/dist/Renderable.d.ts +88 -0
- package/dist/Renderable.d.ts.map +1 -0
- package/dist/Renderable.js +3 -0
- package/dist/{dts/Template.d.ts → Template.d.ts} +109 -74
- package/dist/Template.d.ts.map +1 -0
- package/dist/{esm/Template.js → Template.js} +96 -56
- package/dist/Wire.d.ts +169 -0
- package/dist/Wire.d.ts.map +1 -0
- package/dist/Wire.js +217 -0
- package/dist/errors.d.ts +145 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +159 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/internal/IndexRefCounter.d.ts +11 -0
- package/dist/internal/IndexRefCounter.d.ts.map +1 -0
- package/dist/internal/IndexRefCounter.js +42 -0
- package/dist/internal/ParentChildNodes.d.ts +6 -0
- package/dist/internal/ParentChildNodes.d.ts.map +1 -0
- package/dist/internal/ParentChildNodes.js +1 -0
- package/dist/internal/PathStack.d.ts +9 -0
- package/dist/internal/PathStack.d.ts.map +1 -0
- package/dist/internal/PathStack.js +18 -0
- package/dist/internal/buildTemplateFragement.d.ts +3 -0
- package/dist/internal/buildTemplateFragement.d.ts.map +1 -0
- package/dist/internal/buildTemplateFragement.js +61 -0
- package/dist/internal/diff.d.ts +2 -0
- package/dist/internal/diff.d.ts.map +1 -0
- package/dist/internal/diff.js +119 -0
- package/dist/internal/dom.d.ts +45 -0
- package/dist/internal/dom.d.ts.map +1 -0
- package/dist/internal/dom.js +304 -0
- package/dist/internal/encoding.d.ts +7 -0
- package/dist/internal/encoding.d.ts.map +1 -0
- package/dist/internal/encoding.js +134 -0
- package/dist/{dts/internal/v2/hydration-template.d.ts → internal/hydration.d.ts} +10 -7
- package/dist/internal/hydration.d.ts.map +1 -0
- package/dist/{esm/internal/v2/hydration-template.js → internal/hydration.js} +80 -26
- package/dist/internal/keyToPartType.d.ts +2 -0
- package/dist/internal/keyToPartType.d.ts.map +1 -0
- package/dist/internal/keyToPartType.js +110 -0
- package/dist/internal/meta.d.ts +17 -0
- package/dist/internal/meta.d.ts.map +1 -0
- package/dist/internal/meta.js +14 -0
- package/dist/internal/takeOneIfNotRenderEvent.d.ts +4 -0
- package/dist/internal/takeOneIfNotRenderEvent.d.ts.map +1 -0
- package/dist/internal/takeOneIfNotRenderEvent.js +10 -0
- package/dist/internal/templateHash.d.ts +2 -0
- package/dist/internal/templateHash.d.ts.map +1 -0
- package/dist/internal/templateHash.js +14 -0
- package/dist/many.d.ts +68 -0
- package/dist/many.d.ts.map +1 -0
- package/dist/many.js +107 -0
- package/package.json +22 -224
- package/src/EventHandler.ts +318 -86
- package/src/EventSource.ts +202 -0
- package/src/Html.test.ts +490 -0
- package/src/Html.ts +292 -333
- package/src/HtmlChunk.ts +290 -332
- package/src/HydrateContext.ts +40 -0
- package/src/Hydration.test.ts +409 -0
- package/src/Parser.test.ts +924 -0
- package/src/Parser.ts +598 -10
- package/src/Render.test.ts +338 -0
- package/src/Render.ts +878 -63
- package/src/RenderEvent.ts +169 -40
- package/src/RenderQueue.ts +290 -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/tsconfig.json +6 -0
- package/Directive/package.json +0 -6
- package/ElementRef/package.json +0 -6
- package/ElementSource/package.json +0 -6
- package/Entry/package.json +0 -6
- package/EventHandler/package.json +0 -6
- package/Html/package.json +0 -6
- package/HtmlChunk/package.json +0 -6
- package/Hydrate/package.json +0 -6
- package/LICENSE +0 -21
- package/Many/package.json +0 -6
- package/Meta/package.json +0 -6
- package/Parser/package.json +0 -6
- package/Part/package.json +0 -6
- package/Placeholder/package.json +0 -6
- package/Platform/package.json +0 -6
- package/Render/package.json +0 -6
- package/RenderContext/package.json +0 -6
- package/RenderEvent/package.json +0 -6
- package/RenderQueue/package.json +0 -6
- package/RenderTemplate/package.json +0 -6
- package/Renderable/package.json +0 -6
- package/Template/package.json +0 -6
- package/Test/package.json +0 -6
- package/Vitest/package.json +0 -6
- package/compiler-tools/package.json +0 -6
- package/dist/cjs/Directive.js +0 -76
- package/dist/cjs/Directive.js.map +0 -1
- package/dist/cjs/ElementRef.js +0 -92
- package/dist/cjs/ElementRef.js.map +0 -1
- package/dist/cjs/ElementSource.js +0 -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,297 @@
|
|
|
1
|
+
import { constVoid } from "effect/Function";
|
|
2
|
+
export const RenderQueueTypeId = "@typed/template/RenderQueue";
|
|
3
|
+
/**
|
|
4
|
+
* An abstract base class for managing the execution of rendering tasks.
|
|
5
|
+
* It allows prioritizing updates and scheduling them using different strategies
|
|
6
|
+
* (e.g., `requestAnimationFrame`, `requestIdleCallback`, `setTimeout`, or synchronous execution).
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* import { MixedRenderQueue, RenderPriority } from "@typed/template/RenderQueue"
|
|
11
|
+
*
|
|
12
|
+
* const queue = new MixedRenderQueue()
|
|
13
|
+
*
|
|
14
|
+
* // Add a high-priority synchronous task
|
|
15
|
+
* queue.add("task1", () => console.log("High priority"), () => {}, RenderPriority.Sync)
|
|
16
|
+
*
|
|
17
|
+
* // Add a medium-priority RAF task
|
|
18
|
+
* queue.add("task2", () => console.log("Medium priority"), () => {}, RenderPriority.Raf(5))
|
|
19
|
+
*
|
|
20
|
+
* // Add a low-priority idle task
|
|
21
|
+
* queue.add("task3", () => console.log("Low priority"), () => {}, RenderPriority.Idle(1))
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* @since 1.0.0
|
|
25
|
+
* @category models
|
|
26
|
+
*/
|
|
27
|
+
export class RenderQueue {
|
|
28
|
+
buckets = [];
|
|
29
|
+
scheduled = undefined;
|
|
30
|
+
[RenderQueueTypeId] = RenderQueueTypeId;
|
|
31
|
+
/**
|
|
32
|
+
* Adds a task to the render queue.
|
|
33
|
+
*
|
|
34
|
+
* @param key - A unique key to identify the task (used for deduplication/cancellation).
|
|
35
|
+
* @param task - The function to execute.
|
|
36
|
+
* @param dispose - A cleanup function to run after the task is executed.
|
|
37
|
+
* @param priority - The priority of the task. Higher priority tasks may run sooner depending on the implementation.
|
|
38
|
+
* @returns A Disposable that can be used to cancel the task.
|
|
39
|
+
*/
|
|
40
|
+
add = (key, task, dispose, priority) => {
|
|
41
|
+
insert(this.buckets, priority, key, { task, dispose }, (entry) => entry.dispose());
|
|
42
|
+
this.scheduleNext();
|
|
43
|
+
return disposable(() => remove(this.buckets, priority, key));
|
|
44
|
+
};
|
|
45
|
+
[Symbol.dispose] = () => {
|
|
46
|
+
if (this.scheduled) {
|
|
47
|
+
dispose(this.scheduled);
|
|
48
|
+
this.scheduled = undefined;
|
|
49
|
+
}
|
|
50
|
+
this.buckets.length = 0;
|
|
51
|
+
};
|
|
52
|
+
runTasks(deadline) {
|
|
53
|
+
this.scheduled = undefined;
|
|
54
|
+
while (shouldContinue(deadline) && this.buckets.length > 0) {
|
|
55
|
+
const [_priority, map] = this.buckets.shift();
|
|
56
|
+
for (const { dispose, task } of map.values()) {
|
|
57
|
+
task();
|
|
58
|
+
dispose();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
this.scheduleNext();
|
|
62
|
+
}
|
|
63
|
+
scheduleNext() {
|
|
64
|
+
if (this.buckets.length === 0) {
|
|
65
|
+
dispose(this);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
if (!this.scheduled) {
|
|
69
|
+
this.scheduled = this.schedule((deadline) => this.runTasks(deadline));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// 16ms to match 60fps
|
|
74
|
+
const DEFAULT_DURATION_ALLOWED = 16;
|
|
75
|
+
const SYNC_DEADLINE = { timeRemaining: () => Infinity, didTimeout: false };
|
|
76
|
+
/**
|
|
77
|
+
* A RenderQueue that executes tasks synchronously and immediately.
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* ```ts
|
|
81
|
+
* import { SyncRenderQueue, RenderPriority } from "@typed/template/RenderQueue"
|
|
82
|
+
*
|
|
83
|
+
* const queue = new SyncRenderQueue()
|
|
84
|
+
* queue.add("task", () => console.log("Immediate"), () => {}, RenderPriority.Sync)
|
|
85
|
+
* ```
|
|
86
|
+
*
|
|
87
|
+
* @since 1.0.0
|
|
88
|
+
* @category models
|
|
89
|
+
*/
|
|
90
|
+
export class SyncRenderQueue extends RenderQueue {
|
|
91
|
+
schedule(task) {
|
|
92
|
+
task(SYNC_DEADLINE);
|
|
93
|
+
return disposable(constVoid);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* A RenderQueue that schedules tasks using `setTimeout(..., 0)`.
|
|
98
|
+
*/
|
|
99
|
+
export class SetTimeoutRenderQueue extends RenderQueue {
|
|
100
|
+
schedule(task) {
|
|
101
|
+
const id = setTimeout(() => task(idleDealineFromTime(performance.now(), DEFAULT_DURATION_ALLOWED)), 0);
|
|
102
|
+
return disposable(() => clearTimeout(id));
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* A RenderQueue that schedules tasks using `requestAnimationFrame`.
|
|
107
|
+
* Good for visual updates that should happen before the next repaint.
|
|
108
|
+
*
|
|
109
|
+
* @example
|
|
110
|
+
* ```ts
|
|
111
|
+
* import { RequestAnimationFrameRenderQueue, RenderPriority } from "@typed/template/RenderQueue"
|
|
112
|
+
*
|
|
113
|
+
* const queue = new RequestAnimationFrameRenderQueue(16) // 16ms budget
|
|
114
|
+
* queue.add("update", () => updateDOM(), () => {}, RenderPriority.Raf(5))
|
|
115
|
+
* ```
|
|
116
|
+
*
|
|
117
|
+
* @since 1.0.0
|
|
118
|
+
* @category models
|
|
119
|
+
*/
|
|
120
|
+
export class RequestAnimationFrameRenderQueue extends RenderQueue {
|
|
121
|
+
durationAllowed;
|
|
122
|
+
constructor(durationAllowed = DEFAULT_DURATION_ALLOWED) {
|
|
123
|
+
super();
|
|
124
|
+
this.durationAllowed = durationAllowed;
|
|
125
|
+
}
|
|
126
|
+
schedule(task) {
|
|
127
|
+
const id = requestAnimationFrame((time) => task(idleDealineFromTime(time, this.durationAllowed)));
|
|
128
|
+
return disposable(() => cancelAnimationFrame(id));
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* A RenderQueue that schedules tasks using `requestIdleCallback`.
|
|
133
|
+
* Good for low-priority background work.
|
|
134
|
+
*/
|
|
135
|
+
export class RequestIdleCallbackRenderQueue extends RenderQueue {
|
|
136
|
+
schedule(task) {
|
|
137
|
+
const id = requestIdleCallback(task);
|
|
138
|
+
return disposable(() => cancelIdleCallback(id));
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
const NONE = disposable(constVoid);
|
|
142
|
+
/**
|
|
143
|
+
* A composite RenderQueue that directs tasks to different queues based on their priority.
|
|
144
|
+
* - High priority: Sync
|
|
145
|
+
* - Medium priority: RAF (or setTimeout fallback)
|
|
146
|
+
* - Low priority: IdleCallback (or setTimeout fallback)
|
|
147
|
+
*
|
|
148
|
+
* @example
|
|
149
|
+
* ```ts
|
|
150
|
+
* import { MixedRenderQueue, RenderPriority } from "@typed/template/RenderQueue"
|
|
151
|
+
*
|
|
152
|
+
* const queue = new MixedRenderQueue()
|
|
153
|
+
*
|
|
154
|
+
* // Tasks are automatically routed to the appropriate queue
|
|
155
|
+
* queue.add("sync", () => {}, () => {}, RenderPriority.Sync)
|
|
156
|
+
* queue.add("raf", () => {}, () => {}, RenderPriority.Raf(5))
|
|
157
|
+
* queue.add("idle", () => {}, () => {}, RenderPriority.Idle(1))
|
|
158
|
+
* ```
|
|
159
|
+
*
|
|
160
|
+
* @since 1.0.0
|
|
161
|
+
* @category models
|
|
162
|
+
*/
|
|
163
|
+
export class MixedRenderQueue extends RenderQueue {
|
|
164
|
+
high;
|
|
165
|
+
mid;
|
|
166
|
+
low;
|
|
167
|
+
constructor(durationAllowed = DEFAULT_DURATION_ALLOWED) {
|
|
168
|
+
super();
|
|
169
|
+
this.high = new SyncRenderQueue();
|
|
170
|
+
this.mid =
|
|
171
|
+
typeof requestAnimationFrame === "function"
|
|
172
|
+
? new RequestAnimationFrameRenderQueue(durationAllowed)
|
|
173
|
+
: new SetTimeoutRenderQueue();
|
|
174
|
+
this.low =
|
|
175
|
+
typeof requestIdleCallback === "function"
|
|
176
|
+
? new RequestIdleCallbackRenderQueue()
|
|
177
|
+
: new SetTimeoutRenderQueue();
|
|
178
|
+
}
|
|
179
|
+
add = (key, task, dispose, priority) => {
|
|
180
|
+
if (priority === RenderPriority.Sync) {
|
|
181
|
+
return this.high.add(key, task, dispose, priority);
|
|
182
|
+
}
|
|
183
|
+
else if (priority > RenderPriority.Sync &&
|
|
184
|
+
priority <= RenderPriority.Raf(RAF_PRIORITY_RANGE)) {
|
|
185
|
+
return this.mid.add(key, task, dispose, priority);
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
return this.low.add(key, task, dispose, priority);
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
// We let the other queues handle the actual scheduling
|
|
192
|
+
schedule() {
|
|
193
|
+
return NONE;
|
|
194
|
+
}
|
|
195
|
+
[Symbol.dispose] = () => {
|
|
196
|
+
dispose(this.high);
|
|
197
|
+
dispose(this.mid);
|
|
198
|
+
dispose(this.low);
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
const RAF_PRIORITY_RANGE = 10;
|
|
202
|
+
/**
|
|
203
|
+
* Defines priority levels for rendering tasks.
|
|
204
|
+
*
|
|
205
|
+
* @example
|
|
206
|
+
* ```ts
|
|
207
|
+
* import { RenderPriority } from "@typed/template/RenderQueue"
|
|
208
|
+
*
|
|
209
|
+
* // Synchronous execution (highest priority)
|
|
210
|
+
* const syncPriority = RenderPriority.Sync
|
|
211
|
+
*
|
|
212
|
+
* // RequestAnimationFrame priority (0-10)
|
|
213
|
+
* const rafPriority = RenderPriority.Raf(5)
|
|
214
|
+
*
|
|
215
|
+
* // Idle callback priority (lowest priority)
|
|
216
|
+
* const idlePriority = RenderPriority.Idle(1)
|
|
217
|
+
* ```
|
|
218
|
+
*
|
|
219
|
+
* @since 1.0.0
|
|
220
|
+
* @category utilities
|
|
221
|
+
*/
|
|
222
|
+
export const RenderPriority = {
|
|
223
|
+
/**
|
|
224
|
+
* Immediate, synchronous execution.
|
|
225
|
+
*/
|
|
226
|
+
Sync: -1,
|
|
227
|
+
/**
|
|
228
|
+
* Scheduled via requestAnimationFrame.
|
|
229
|
+
* @param priority - A value between 0 and 10.
|
|
230
|
+
*/
|
|
231
|
+
Raf: (priority) => Math.max(0, Math.min(priority, RAF_PRIORITY_RANGE)),
|
|
232
|
+
/**
|
|
233
|
+
* Scheduled via requestIdleCallback.
|
|
234
|
+
*/
|
|
235
|
+
Idle: (priority) => RAF_PRIORITY_RANGE + priority,
|
|
236
|
+
};
|
|
237
|
+
function idleDealineFromTime(startTime, durationAllowed) {
|
|
238
|
+
return {
|
|
239
|
+
timeRemaining: () => {
|
|
240
|
+
const elapsed = performance.now() - startTime;
|
|
241
|
+
return Math.max(0, durationAllowed - elapsed);
|
|
242
|
+
},
|
|
243
|
+
didTimeout: false,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
function disposable(f) {
|
|
247
|
+
return {
|
|
248
|
+
[Symbol.dispose]: f,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
function dispose(self) {
|
|
252
|
+
if (self === NONE)
|
|
253
|
+
return;
|
|
254
|
+
self[Symbol.dispose]();
|
|
255
|
+
}
|
|
256
|
+
function shouldContinue(deadline) {
|
|
257
|
+
return deadline.timeRemaining() > 0;
|
|
258
|
+
}
|
|
259
|
+
function insert(buckets, priority, key, task, onRemoved) {
|
|
260
|
+
const index = binarySearch(buckets, priority);
|
|
261
|
+
if (index === buckets.length) {
|
|
262
|
+
buckets.push([priority, new Map([[key, task]])]);
|
|
263
|
+
}
|
|
264
|
+
else {
|
|
265
|
+
const map = buckets[index][1];
|
|
266
|
+
const existing = map.get(key);
|
|
267
|
+
if (existing !== undefined) {
|
|
268
|
+
onRemoved(existing);
|
|
269
|
+
}
|
|
270
|
+
map.set(key, task);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
function remove(buckets, priority, key) {
|
|
274
|
+
const index = binarySearch(buckets, priority);
|
|
275
|
+
if (index === buckets.length) {
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
buckets[index][1].delete(key);
|
|
279
|
+
}
|
|
280
|
+
function binarySearch(buckets, priority) {
|
|
281
|
+
let low = 0;
|
|
282
|
+
let high = buckets.length - 1;
|
|
283
|
+
while (low <= high) {
|
|
284
|
+
const mid = Math.floor((low + high) / 2);
|
|
285
|
+
const [bucketPriority] = buckets[mid];
|
|
286
|
+
if (bucketPriority === priority) {
|
|
287
|
+
return mid;
|
|
288
|
+
}
|
|
289
|
+
else if (bucketPriority < priority) {
|
|
290
|
+
low = mid + 1;
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
high = mid - 1;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
return low;
|
|
297
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import type { Scope } from "effect/Scope";
|
|
2
|
+
import * as ServiceMap from "effect/ServiceMap";
|
|
3
|
+
import type { Fx } from "@typed/fx/Fx";
|
|
4
|
+
import type { Renderable } from "./Renderable.ts";
|
|
5
|
+
import type { RenderEvent } from "./RenderEvent.ts";
|
|
6
|
+
declare const RenderTemplate_base: ServiceMap.ServiceClass<RenderTemplate, "RenderTemplate", <const Values extends ArrayLike<Renderable.Any>>(template: TemplateStringsArray, values: Values) => Fx<RenderEvent, Renderable.Error<Values[number]>, Renderable.Services<Values[number]> | Scope>>;
|
|
7
|
+
/**
|
|
8
|
+
* A service that defines how templates are rendered.
|
|
9
|
+
*
|
|
10
|
+
* Different implementations can be provided for different environments (e.g., `DomRenderTemplate` for browsers,
|
|
11
|
+
* `HtmlRenderTemplate` for SSR).
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* import { Effect, Layer } from "effect"
|
|
16
|
+
* import { html } from "@typed/template"
|
|
17
|
+
* import { DomRenderTemplate } from "@typed/template/Render"
|
|
18
|
+
* import { HtmlRenderTemplate } from "@typed/template/Html"
|
|
19
|
+
* import { Fx } from "@typed/fx"
|
|
20
|
+
*
|
|
21
|
+
* // Use DOM rendering for browser
|
|
22
|
+
* const browserApp = Effect.gen(function* () {
|
|
23
|
+
* const template = html`<div>Hello</div>`
|
|
24
|
+
* yield* render(template, document.body).pipe(
|
|
25
|
+
* Fx.provide(DomRenderTemplate)
|
|
26
|
+
* )
|
|
27
|
+
* })
|
|
28
|
+
*
|
|
29
|
+
* // Use HTML rendering for SSR
|
|
30
|
+
* const serverApp = Effect.gen(function* () {
|
|
31
|
+
* const template = html`<div>Hello</div>`
|
|
32
|
+
* const htmlString = yield* renderToHtmlString(template).pipe(
|
|
33
|
+
* Fx.provide(HtmlRenderTemplate)
|
|
34
|
+
* )
|
|
35
|
+
* console.log(htmlString) // "<div>Hello</div>"
|
|
36
|
+
* })
|
|
37
|
+
* ```
|
|
38
|
+
*
|
|
39
|
+
* @since 1.0.0
|
|
40
|
+
* @category models
|
|
41
|
+
*/
|
|
42
|
+
export declare class RenderTemplate extends RenderTemplate_base {
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* The main template tag function.
|
|
46
|
+
*
|
|
47
|
+
* It creates a reactive `Fx` stream that renders the template. The actual rendering logic
|
|
48
|
+
* depends on the provided `RenderTemplate` service.
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```ts
|
|
52
|
+
* import { Effect } from "effect"
|
|
53
|
+
* import { html } from "@typed/template"
|
|
54
|
+
* import { DomRenderTemplate, render } from "@typed/template/Render"
|
|
55
|
+
* import { Fx } from "@typed/fx"
|
|
56
|
+
* import { Layer } from "effect"
|
|
57
|
+
*
|
|
58
|
+
* // Simple static template
|
|
59
|
+
* const staticTemplate = html`<div>Hello, world!</div>`
|
|
60
|
+
*
|
|
61
|
+
* // Template with dynamic values
|
|
62
|
+
* const name = "Alice"
|
|
63
|
+
* const dynamicTemplate = html`<div>Hello, ${name}!</div>`
|
|
64
|
+
*
|
|
65
|
+
* // Template with reactive values
|
|
66
|
+
* const program = Effect.gen(function* () {
|
|
67
|
+
* const count = yield* RefSubject.make(0)
|
|
68
|
+
*
|
|
69
|
+
* const template = html`<div>
|
|
70
|
+
* <p>Count: ${count}</p>
|
|
71
|
+
* <button onclick=${RefSubject.increment(count)}>Increment</button>
|
|
72
|
+
* </div>`
|
|
73
|
+
*
|
|
74
|
+
* yield* render(template, document.body).pipe(
|
|
75
|
+
* Fx.drainLayer,
|
|
76
|
+
* Layer.provide(DomRenderTemplate),
|
|
77
|
+
* Layer.launch
|
|
78
|
+
* )
|
|
79
|
+
* })
|
|
80
|
+
* ```
|
|
81
|
+
*
|
|
82
|
+
* @param template - The template strings.
|
|
83
|
+
* @param values - The interpolated values.
|
|
84
|
+
* @returns An `Fx` that emits `RenderEvent`s.
|
|
85
|
+
* @since 1.0.0
|
|
86
|
+
* @category constructors
|
|
87
|
+
*/
|
|
88
|
+
export declare function html<const Values extends ReadonlyArray<Renderable.Any> = readonly []>(template: TemplateStringsArray, ...values: Values): Fx<RenderEvent, Renderable.Error<Values[number]>, Renderable.Services<Values[number]> | Scope | RenderTemplate>;
|
|
89
|
+
export {};
|
|
90
|
+
//# sourceMappingURL=RenderTemplate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RenderTemplate.d.ts","sourceRoot":"","sources":["../src/RenderTemplate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;oGAwCzC,MAAM,SAAS,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,YACnC,oBAAoB,UACtB,MAAM,KACb,EAAE,CACH,WAAW,EACX,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAChC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAC5C;AA7CL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,qBAAa,cAAe,SAAQ,mBAYf;CAAG;AAExB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,wBAAgB,IAAI,CAAC,KAAK,CAAC,MAAM,SAAS,aAAa,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,EACnF,QAAQ,EAAE,oBAAoB,EAC9B,GAAG,MAAM,EAAE,MAAM,GAChB,EAAE,CACH,WAAW,EACX,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAChC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,cAAc,CAC7D,CAEA"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { map } from "effect/Effect";
|
|
2
|
+
import * as ServiceMap from "effect/ServiceMap";
|
|
3
|
+
import { unwrap } from "@typed/fx/Fx";
|
|
4
|
+
/**
|
|
5
|
+
* A service that defines how templates are rendered.
|
|
6
|
+
*
|
|
7
|
+
* Different implementations can be provided for different environments (e.g., `DomRenderTemplate` for browsers,
|
|
8
|
+
* `HtmlRenderTemplate` for SSR).
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* import { Effect, Layer } from "effect"
|
|
13
|
+
* import { html } from "@typed/template"
|
|
14
|
+
* import { DomRenderTemplate } from "@typed/template/Render"
|
|
15
|
+
* import { HtmlRenderTemplate } from "@typed/template/Html"
|
|
16
|
+
* import { Fx } from "@typed/fx"
|
|
17
|
+
*
|
|
18
|
+
* // Use DOM rendering for browser
|
|
19
|
+
* const browserApp = Effect.gen(function* () {
|
|
20
|
+
* const template = html`<div>Hello</div>`
|
|
21
|
+
* yield* render(template, document.body).pipe(
|
|
22
|
+
* Fx.provide(DomRenderTemplate)
|
|
23
|
+
* )
|
|
24
|
+
* })
|
|
25
|
+
*
|
|
26
|
+
* // Use HTML rendering for SSR
|
|
27
|
+
* const serverApp = Effect.gen(function* () {
|
|
28
|
+
* const template = html`<div>Hello</div>`
|
|
29
|
+
* const htmlString = yield* renderToHtmlString(template).pipe(
|
|
30
|
+
* Fx.provide(HtmlRenderTemplate)
|
|
31
|
+
* )
|
|
32
|
+
* console.log(htmlString) // "<div>Hello</div>"
|
|
33
|
+
* })
|
|
34
|
+
* ```
|
|
35
|
+
*
|
|
36
|
+
* @since 1.0.0
|
|
37
|
+
* @category models
|
|
38
|
+
*/
|
|
39
|
+
export class RenderTemplate extends ServiceMap.Service()("RenderTemplate") {
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* The main template tag function.
|
|
43
|
+
*
|
|
44
|
+
* It creates a reactive `Fx` stream that renders the template. The actual rendering logic
|
|
45
|
+
* depends on the provided `RenderTemplate` service.
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```ts
|
|
49
|
+
* import { Effect } from "effect"
|
|
50
|
+
* import { html } from "@typed/template"
|
|
51
|
+
* import { DomRenderTemplate, render } from "@typed/template/Render"
|
|
52
|
+
* import { Fx } from "@typed/fx"
|
|
53
|
+
* import { Layer } from "effect"
|
|
54
|
+
*
|
|
55
|
+
* // Simple static template
|
|
56
|
+
* const staticTemplate = html`<div>Hello, world!</div>`
|
|
57
|
+
*
|
|
58
|
+
* // Template with dynamic values
|
|
59
|
+
* const name = "Alice"
|
|
60
|
+
* const dynamicTemplate = html`<div>Hello, ${name}!</div>`
|
|
61
|
+
*
|
|
62
|
+
* // Template with reactive values
|
|
63
|
+
* const program = Effect.gen(function* () {
|
|
64
|
+
* const count = yield* RefSubject.make(0)
|
|
65
|
+
*
|
|
66
|
+
* const template = html`<div>
|
|
67
|
+
* <p>Count: ${count}</p>
|
|
68
|
+
* <button onclick=${RefSubject.increment(count)}>Increment</button>
|
|
69
|
+
* </div>`
|
|
70
|
+
*
|
|
71
|
+
* yield* render(template, document.body).pipe(
|
|
72
|
+
* Fx.drainLayer,
|
|
73
|
+
* Layer.provide(DomRenderTemplate),
|
|
74
|
+
* Layer.launch
|
|
75
|
+
* )
|
|
76
|
+
* })
|
|
77
|
+
* ```
|
|
78
|
+
*
|
|
79
|
+
* @param template - The template strings.
|
|
80
|
+
* @param values - The interpolated values.
|
|
81
|
+
* @returns An `Fx` that emits `RenderEvent`s.
|
|
82
|
+
* @since 1.0.0
|
|
83
|
+
* @category constructors
|
|
84
|
+
*/
|
|
85
|
+
export function html(template, ...values) {
|
|
86
|
+
return unwrap(map(RenderTemplate.asEffect(), (render) => render(template, values)));
|
|
87
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import type * as Effect from "effect/Effect";
|
|
2
|
+
import type * as Stream from "effect/Stream";
|
|
3
|
+
import type { Fx } from "@typed/fx";
|
|
4
|
+
import type { RenderEvent } from "./RenderEvent.js";
|
|
5
|
+
/**
|
|
6
|
+
* Represents any value that can be rendered into a template.
|
|
7
|
+
*
|
|
8
|
+
* This includes:
|
|
9
|
+
* - Primitives (string, number, boolean, null, undefined)
|
|
10
|
+
* - Arrays of Renderables
|
|
11
|
+
* - Effects that produce a Renderable
|
|
12
|
+
* - Streams (Fx or Stream) that emit Renderables
|
|
13
|
+
* - Objects (typically for setting properties or attributes)
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* import { Effect } from "effect"
|
|
18
|
+
* import { html } from "@typed/template"
|
|
19
|
+
* import { Fx } from "@typed/fx"
|
|
20
|
+
* import * as RefSubject from "@typed/fx/RefSubject"
|
|
21
|
+
*
|
|
22
|
+
* // Primitives
|
|
23
|
+
* const primitive = html`<div>${"Hello"}</div>`
|
|
24
|
+
* const number = html`<div>${42}</div>`
|
|
25
|
+
* const boolean = html`<div>${true}</div>`
|
|
26
|
+
*
|
|
27
|
+
* // Effects
|
|
28
|
+
* const effect = html`<div>${Effect.succeed("Async value")}</div>`
|
|
29
|
+
*
|
|
30
|
+
* // Fx streams (reactive)
|
|
31
|
+
* const count = yield* RefSubject.make(0)
|
|
32
|
+
* const reactive = html`<div>Count: ${count}</div>`
|
|
33
|
+
*
|
|
34
|
+
* // Arrays
|
|
35
|
+
* const items = [1, 2, 3]
|
|
36
|
+
* const list = html`<ul>${items.map((n) => html`<li>${n}</li>`)}</ul>`
|
|
37
|
+
*
|
|
38
|
+
* // Objects (for attributes)
|
|
39
|
+
* const withProps = html`<div .data=${{ foo: "bar" }}></div>`
|
|
40
|
+
* ```
|
|
41
|
+
*
|
|
42
|
+
* @since 1.0.0
|
|
43
|
+
* @category models
|
|
44
|
+
*/
|
|
45
|
+
export type Renderable<A, E = never, R = never> = A | {
|
|
46
|
+
readonly [key: string]: Renderable<unknown, E, R>;
|
|
47
|
+
} | ReadonlyArray<Renderable<A, E, R>> | Effect.Effect<A, E, R> | Stream.Stream<A, E, R> | Fx.Fx<A, E, R>;
|
|
48
|
+
export declare namespace Renderable {
|
|
49
|
+
/**
|
|
50
|
+
* A type alias for any Renderable value with any error/context.
|
|
51
|
+
*/
|
|
52
|
+
type Any = Renderable<any, any, any> | Renderable<any, never, never> | Renderable<never, any, any> | Renderable<never, never, any>;
|
|
53
|
+
/**
|
|
54
|
+
* The basic primitive types that can be rendered directly.
|
|
55
|
+
*/
|
|
56
|
+
type Primitive = string | number | boolean | bigint | null | undefined | void | RenderEvent;
|
|
57
|
+
/**
|
|
58
|
+
* Extracts the required services from a Renderable type.
|
|
59
|
+
*/
|
|
60
|
+
type Services<T> = Fx.Services<T> | (T extends Stream.Stream<any, any, any> ? Stream.Services<T> : never) | Effect.Services<T>;
|
|
61
|
+
/**
|
|
62
|
+
* Extracts the error type from a Renderable type.
|
|
63
|
+
*/
|
|
64
|
+
type Error<T> = Fx.Error<T> | (T extends Stream.Stream<any, any, any> ? Stream.Error<T> : never) | Effect.Error<T>;
|
|
65
|
+
/**
|
|
66
|
+
* Extracts the success type from a Renderable type.
|
|
67
|
+
*/
|
|
68
|
+
type Success<T> = Fx.Success<T> | (T extends Stream.Stream<any, any, any> ? Stream.Success<T> : never) | Effect.Success<T>;
|
|
69
|
+
/**
|
|
70
|
+
* Traverse all keys in an object and extract the services from each value. If
|
|
71
|
+
* the value is a function, extract the services from the return type of the function.
|
|
72
|
+
*/
|
|
73
|
+
type ServicesFromObject<T> = [
|
|
74
|
+
{
|
|
75
|
+
[K in keyof T]: T[K] extends (...args: Array<any>) => any ? Services<ReturnType<T[K]>> : Services<T[K]>;
|
|
76
|
+
}[keyof T]
|
|
77
|
+
] extends [infer U] ? U : never;
|
|
78
|
+
/**
|
|
79
|
+
* Traverse all keys in an object and extract the error from each value. If
|
|
80
|
+
* the value is a function, extract the error from the return type of the function.
|
|
81
|
+
*/
|
|
82
|
+
type ErrorFromObject<T> = [
|
|
83
|
+
{
|
|
84
|
+
[K in keyof T]: T[K] extends (...args: Array<any>) => any ? Error<ReturnType<T[K]>> : Error<T[K]>;
|
|
85
|
+
}[keyof T]
|
|
86
|
+
] extends [infer U] ? U : never;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=Renderable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Renderable.d.ts","sourceRoot":"","sources":["../src/Renderable.ts"],"names":[],"mappings":"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"}
|