@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
package/src/RenderQueue.ts
CHANGED
|
@@ -1,447 +1,352 @@
|
|
|
1
|
-
|
|
2
|
-
* The context in which templates are rendered within
|
|
3
|
-
* @since 1.0.0
|
|
4
|
-
*/
|
|
1
|
+
import { constVoid } from "effect/Function";
|
|
5
2
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
import * as Effect from "effect/Effect"
|
|
9
|
-
import * as FiberRef from "effect/FiberRef"
|
|
10
|
-
import { dual } from "effect/Function"
|
|
11
|
-
import type * as Layer from "effect/Layer"
|
|
12
|
-
import * as Scope from "effect/Scope"
|
|
3
|
+
export const RenderQueueTypeId = "@typed/template/RenderQueue";
|
|
4
|
+
export type RenderQueueTypeId = typeof RenderQueueTypeId;
|
|
13
5
|
|
|
14
|
-
|
|
15
|
-
* @since 1.0.0
|
|
16
|
-
*/
|
|
17
|
-
export const DEFAULT_PRIORITY = 10
|
|
6
|
+
type Entry = { task: () => void; dispose: () => void };
|
|
18
7
|
|
|
19
8
|
/**
|
|
20
|
-
*
|
|
9
|
+
* An abstract base class for managing the execution of rendering tasks.
|
|
10
|
+
* It allows prioritizing updates and scheduling them using different strategies
|
|
11
|
+
* (e.g., `requestAnimationFrame`, `requestIdleCallback`, `setTimeout`, or synchronous execution).
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* import { MixedRenderQueue, RenderPriority } from "@typed/template/RenderQueue"
|
|
16
|
+
*
|
|
17
|
+
* const queue = new MixedRenderQueue()
|
|
18
|
+
*
|
|
19
|
+
* // Add a high-priority synchronous task
|
|
20
|
+
* queue.add("task1", () => console.log("High priority"), () => {}, RenderPriority.Sync)
|
|
21
|
+
*
|
|
22
|
+
* // Add a medium-priority RAF task
|
|
23
|
+
* queue.add("task2", () => console.log("Medium priority"), () => {}, RenderPriority.Raf(5))
|
|
24
|
+
*
|
|
25
|
+
* // Add a low-priority idle task
|
|
26
|
+
* queue.add("task3", () => console.log("Low priority"), () => {}, RenderPriority.Idle(1))
|
|
27
|
+
* ```
|
|
28
|
+
*
|
|
21
29
|
* @since 1.0.0
|
|
30
|
+
* @category models
|
|
22
31
|
*/
|
|
23
|
-
export
|
|
24
|
-
|
|
25
|
-
|
|
32
|
+
export abstract class RenderQueue implements Disposable {
|
|
33
|
+
protected readonly buckets: Array<KeyedPriorityBucket<Entry>> = [];
|
|
34
|
+
protected scheduled: Disposable | undefined = undefined;
|
|
26
35
|
|
|
27
|
-
|
|
28
|
-
* @since 1.0.0
|
|
29
|
-
*/
|
|
30
|
-
export const currentPriority: FiberRef.FiberRef<number> = FiberRef.unsafeMake(DEFAULT_PRIORITY)
|
|
36
|
+
readonly [RenderQueueTypeId]: RenderQueueTypeId = RenderQueueTypeId;
|
|
31
37
|
|
|
32
|
-
/**
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
38
|
+
/**
|
|
39
|
+
* Adds a task to the render queue.
|
|
40
|
+
*
|
|
41
|
+
* @param key - A unique key to identify the task (used for deduplication/cancellation).
|
|
42
|
+
* @param task - The function to execute.
|
|
43
|
+
* @param dispose - A cleanup function to run after the task is executed.
|
|
44
|
+
* @param priority - The priority of the task. Higher priority tasks may run sooner depending on the implementation.
|
|
45
|
+
* @returns A Disposable that can be used to cancel the task.
|
|
46
|
+
*/
|
|
47
|
+
readonly add: (
|
|
48
|
+
key: unknown,
|
|
49
|
+
task: () => void,
|
|
50
|
+
dispose: () => void,
|
|
51
|
+
priority: number,
|
|
52
|
+
) => Disposable = (key, task, dispose, priority) => {
|
|
53
|
+
insert(this.buckets, priority, key, { task, dispose }, (entry) => entry.dispose());
|
|
54
|
+
this.scheduleNext();
|
|
55
|
+
return disposable(() => remove(this.buckets, priority, key));
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
readonly [Symbol.dispose]: () => void = () => {
|
|
59
|
+
if (this.scheduled) {
|
|
60
|
+
dispose(this.scheduled);
|
|
61
|
+
this.scheduled = undefined;
|
|
62
|
+
}
|
|
63
|
+
this.buckets.length = 0;
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
protected abstract schedule(task: (deadline: IdleDeadline) => void): Disposable;
|
|
67
|
+
|
|
68
|
+
protected runTasks(deadline: IdleDeadline): void {
|
|
69
|
+
this.scheduled = undefined;
|
|
70
|
+
|
|
71
|
+
while (shouldContinue(deadline) && this.buckets.length > 0) {
|
|
72
|
+
const [_priority, map] = this.buckets.shift()!;
|
|
73
|
+
for (const { dispose, task } of map.values()) {
|
|
74
|
+
task();
|
|
75
|
+
dispose();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
this.scheduleNext();
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
private scheduleNext(): void {
|
|
83
|
+
if (this.buckets.length === 0) {
|
|
84
|
+
dispose(this);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (!this.scheduled) {
|
|
89
|
+
this.scheduled = this.schedule((deadline) => this.runTasks(deadline));
|
|
90
|
+
}
|
|
91
|
+
}
|
|
37
92
|
}
|
|
38
93
|
|
|
94
|
+
// 16ms to match 60fps
|
|
95
|
+
const DEFAULT_DURATION_ALLOWED = 16;
|
|
96
|
+
const SYNC_DEADLINE: IdleDeadline = { timeRemaining: () => Infinity, didTimeout: false };
|
|
97
|
+
|
|
39
98
|
/**
|
|
99
|
+
* A RenderQueue that executes tasks synchronously and immediately.
|
|
100
|
+
*
|
|
101
|
+
* @example
|
|
102
|
+
* ```ts
|
|
103
|
+
* import { SyncRenderQueue, RenderPriority } from "@typed/template/RenderQueue"
|
|
104
|
+
*
|
|
105
|
+
* const queue = new SyncRenderQueue()
|
|
106
|
+
* queue.add("task", () => console.log("Immediate"), () => {}, RenderPriority.Sync)
|
|
107
|
+
* ```
|
|
108
|
+
*
|
|
40
109
|
* @since 1.0.0
|
|
110
|
+
* @category models
|
|
41
111
|
*/
|
|
42
|
-
export
|
|
43
|
-
|
|
112
|
+
export class SyncRenderQueue extends RenderQueue {
|
|
113
|
+
protected schedule(task: (deadline: IdleDeadline) => void): Disposable {
|
|
114
|
+
task(SYNC_DEADLINE);
|
|
115
|
+
return disposable(constVoid);
|
|
116
|
+
}
|
|
44
117
|
}
|
|
45
118
|
|
|
46
119
|
/**
|
|
47
|
-
*
|
|
120
|
+
* A RenderQueue that schedules tasks using `setTimeout(..., 0)`.
|
|
48
121
|
*/
|
|
49
|
-
export
|
|
50
|
-
|
|
122
|
+
export class SetTimeoutRenderQueue extends RenderQueue {
|
|
123
|
+
protected schedule(task: (deadline: IdleDeadline) => void): Disposable {
|
|
124
|
+
const id = setTimeout(
|
|
125
|
+
() => task(idleDealineFromTime(performance.now(), DEFAULT_DURATION_ALLOWED)),
|
|
126
|
+
0,
|
|
127
|
+
);
|
|
128
|
+
return disposable(() => clearTimeout(id));
|
|
129
|
+
}
|
|
130
|
+
}
|
|
51
131
|
|
|
52
132
|
/**
|
|
133
|
+
* A RenderQueue that schedules tasks using `requestAnimationFrame`.
|
|
134
|
+
* Good for visual updates that should happen before the next repaint.
|
|
135
|
+
*
|
|
136
|
+
* @example
|
|
137
|
+
* ```ts
|
|
138
|
+
* import { RequestAnimationFrameRenderQueue, RenderPriority } from "@typed/template/RenderQueue"
|
|
139
|
+
*
|
|
140
|
+
* const queue = new RequestAnimationFrameRenderQueue(16) // 16ms budget
|
|
141
|
+
* queue.add("update", () => updateDOM(), () => {}, RenderPriority.Raf(5))
|
|
142
|
+
* ```
|
|
143
|
+
*
|
|
53
144
|
* @since 1.0.0
|
|
145
|
+
* @category models
|
|
54
146
|
*/
|
|
55
|
-
export
|
|
147
|
+
export class RequestAnimationFrameRenderQueue extends RenderQueue {
|
|
148
|
+
readonly durationAllowed: number;
|
|
149
|
+
constructor(durationAllowed: number = DEFAULT_DURATION_ALLOWED) {
|
|
150
|
+
super();
|
|
151
|
+
this.durationAllowed = durationAllowed;
|
|
152
|
+
}
|
|
56
153
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
154
|
+
protected schedule(task: (deadline: IdleDeadline) => void): Disposable {
|
|
155
|
+
const id = requestAnimationFrame((time) =>
|
|
156
|
+
task(idleDealineFromTime(time, this.durationAllowed)),
|
|
157
|
+
);
|
|
158
|
+
return disposable(() => cancelAnimationFrame(id));
|
|
159
|
+
}
|
|
160
|
+
}
|
|
61
161
|
|
|
62
162
|
/**
|
|
63
|
-
*
|
|
163
|
+
* A RenderQueue that schedules tasks using `requestIdleCallback`.
|
|
164
|
+
* Good for low-priority background work.
|
|
64
165
|
*/
|
|
65
|
-
export
|
|
166
|
+
export class RequestIdleCallbackRenderQueue extends RenderQueue {
|
|
167
|
+
protected schedule(task: (deadline: IdleDeadline) => void): Disposable {
|
|
168
|
+
const id = requestIdleCallback(task);
|
|
169
|
+
return disposable(() => cancelIdleCallback(id));
|
|
170
|
+
}
|
|
171
|
+
}
|
|
66
172
|
|
|
67
|
-
|
|
68
|
-
* @since 1.0.0
|
|
69
|
-
*/
|
|
70
|
-
export const idle = (options?: IdleRequestOptions): Layer.Layer<RenderQueue> =>
|
|
71
|
-
RenderQueue.scoped(
|
|
72
|
-
Effect.scopeWith((scope) => Effect.succeed(unsafeMakeIdleRenderQueue({ scope, ...options })))
|
|
73
|
-
)
|
|
173
|
+
const NONE = disposable(constVoid);
|
|
74
174
|
|
|
75
175
|
/**
|
|
176
|
+
* A composite RenderQueue that directs tasks to different queues based on their priority.
|
|
177
|
+
* - High priority: Sync
|
|
178
|
+
* - Medium priority: RAF (or setTimeout fallback)
|
|
179
|
+
* - Low priority: IdleCallback (or setTimeout fallback)
|
|
180
|
+
*
|
|
181
|
+
* @example
|
|
182
|
+
* ```ts
|
|
183
|
+
* import { MixedRenderQueue, RenderPriority } from "@typed/template/RenderQueue"
|
|
184
|
+
*
|
|
185
|
+
* const queue = new MixedRenderQueue()
|
|
186
|
+
*
|
|
187
|
+
* // Tasks are automatically routed to the appropriate queue
|
|
188
|
+
* queue.add("sync", () => {}, () => {}, RenderPriority.Sync)
|
|
189
|
+
* queue.add("raf", () => {}, () => {}, RenderPriority.Raf(5))
|
|
190
|
+
* queue.add("idle", () => {}, () => {}, RenderPriority.Idle(1))
|
|
191
|
+
* ```
|
|
192
|
+
*
|
|
76
193
|
* @since 1.0.0
|
|
194
|
+
* @category models
|
|
77
195
|
*/
|
|
78
|
-
export
|
|
79
|
-
|
|
80
|
-
|
|
196
|
+
export class MixedRenderQueue extends RenderQueue {
|
|
197
|
+
private readonly high: RenderQueue;
|
|
198
|
+
private readonly mid: RenderQueue;
|
|
199
|
+
private readonly low: RenderQueue;
|
|
200
|
+
|
|
201
|
+
constructor(durationAllowed: number = DEFAULT_DURATION_ALLOWED) {
|
|
202
|
+
super();
|
|
203
|
+
this.high = new SyncRenderQueue();
|
|
204
|
+
this.mid =
|
|
205
|
+
typeof requestAnimationFrame === "function"
|
|
206
|
+
? new RequestAnimationFrameRenderQueue(durationAllowed)
|
|
207
|
+
: new SetTimeoutRenderQueue();
|
|
208
|
+
this.low =
|
|
209
|
+
typeof requestIdleCallback === "function"
|
|
210
|
+
? new RequestIdleCallbackRenderQueue()
|
|
211
|
+
: new SetTimeoutRenderQueue();
|
|
212
|
+
}
|
|
81
213
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
)
|
|
214
|
+
override readonly add = (
|
|
215
|
+
key: unknown,
|
|
216
|
+
task: () => void,
|
|
217
|
+
dispose: () => void,
|
|
218
|
+
priority: number,
|
|
219
|
+
): Disposable => {
|
|
220
|
+
if (priority === RenderPriority.Sync) {
|
|
221
|
+
return this.high.add(key, task, dispose, priority);
|
|
222
|
+
} else if (
|
|
223
|
+
priority > RenderPriority.Sync &&
|
|
224
|
+
priority <= RenderPriority.Raf(RAF_PRIORITY_RANGE)
|
|
225
|
+
) {
|
|
226
|
+
return this.mid.add(key, task, dispose, priority);
|
|
227
|
+
} else {
|
|
228
|
+
return this.low.add(key, task, dispose, priority);
|
|
229
|
+
}
|
|
230
|
+
};
|
|
88
231
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
232
|
+
// We let the other queues handle the actual scheduling
|
|
233
|
+
protected schedule(): Disposable {
|
|
234
|
+
return NONE;
|
|
235
|
+
}
|
|
93
236
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
237
|
+
override [Symbol.dispose]: () => void = () => {
|
|
238
|
+
dispose(this.high);
|
|
239
|
+
dispose(this.mid);
|
|
240
|
+
dispose(this.low);
|
|
241
|
+
};
|
|
242
|
+
}
|
|
97
243
|
|
|
98
|
-
|
|
99
|
-
* @since 1.0.0
|
|
100
|
-
*/
|
|
101
|
-
export const mixed = (options?: IdleRequestOptions): Layer.Layer<RenderQueue> =>
|
|
102
|
-
RenderQueue.scoped(Effect.gen(function*() {
|
|
103
|
-
const scope = yield* Effect.scope
|
|
104
|
-
const queues: Array<readonly [priorityRange: readonly [number, number], RenderQueue]> = [
|
|
105
|
-
[[-1, -1], new SyncImpl()],
|
|
106
|
-
[[0, MICRO_TASK_END], new MicroTaskImpl(scope)],
|
|
107
|
-
[[DEFAULT_PRIORITY, RAF_END], new RafImpl(scope)],
|
|
108
|
-
[[IDLE_START, Number.MAX_SAFE_INTEGER], new IdleImpl(scope, options)]
|
|
109
|
-
]
|
|
110
|
-
|
|
111
|
-
return new MixedImpl(queues)
|
|
112
|
-
}))
|
|
244
|
+
const RAF_PRIORITY_RANGE = 10;
|
|
113
245
|
|
|
114
246
|
/**
|
|
247
|
+
* Defines priority levels for rendering tasks.
|
|
248
|
+
*
|
|
249
|
+
* @example
|
|
250
|
+
* ```ts
|
|
251
|
+
* import { RenderPriority } from "@typed/template/RenderQueue"
|
|
252
|
+
*
|
|
253
|
+
* // Synchronous execution (highest priority)
|
|
254
|
+
* const syncPriority = RenderPriority.Sync
|
|
255
|
+
*
|
|
256
|
+
* // RequestAnimationFrame priority (0-10)
|
|
257
|
+
* const rafPriority = RenderPriority.Raf(5)
|
|
258
|
+
*
|
|
259
|
+
* // Idle callback priority (lowest priority)
|
|
260
|
+
* const idlePriority = RenderPriority.Idle(1)
|
|
261
|
+
* ```
|
|
262
|
+
*
|
|
115
263
|
* @since 1.0.0
|
|
264
|
+
* @category utilities
|
|
116
265
|
*/
|
|
117
|
-
export const
|
|
118
|
-
Sync: -1,
|
|
266
|
+
export const RenderPriority = {
|
|
119
267
|
/**
|
|
120
|
-
*
|
|
121
|
-
* RenderPriority.MicroTask(0-9)
|
|
268
|
+
* Immediate, synchronous execution.
|
|
122
269
|
*/
|
|
123
|
-
|
|
270
|
+
Sync: -1,
|
|
124
271
|
/**
|
|
125
|
-
*
|
|
126
|
-
*
|
|
272
|
+
* Scheduled via requestAnimationFrame.
|
|
273
|
+
* @param priority - A value between 0 and 10.
|
|
127
274
|
*/
|
|
128
|
-
Raf: (priority: number) => Math.
|
|
275
|
+
Raf: (priority: number) => Math.max(0, Math.min(priority, RAF_PRIORITY_RANGE)),
|
|
129
276
|
/**
|
|
130
|
-
*
|
|
131
|
-
* RenderPriority.Idle(0-9)
|
|
277
|
+
* Scheduled via requestIdleCallback.
|
|
132
278
|
*/
|
|
133
|
-
Idle: (priority: number) =>
|
|
134
|
-
} as const
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
get(part: unknown) {
|
|
147
|
-
return this.tasks.get(part)
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
delete(part: unknown) {
|
|
151
|
-
this.tasks.delete(part)
|
|
152
|
-
const priority = this.priority.get(part)
|
|
153
|
-
if (priority === undefined) {
|
|
154
|
-
return false
|
|
155
|
-
} else {
|
|
156
|
-
this.priorities.get(priority)?.delete(part)
|
|
157
|
-
this.priority.delete(part)
|
|
158
|
-
return true
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
get isEmpty() {
|
|
163
|
-
return this.priorities.size === 0
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
*entries() {
|
|
167
|
-
for (const priority of Array.from(this.priorities.keys()).sort((a, b) => a - b)) {
|
|
168
|
-
const parts = this.priorities.get(priority)!
|
|
169
|
-
this.priorities.delete(priority)
|
|
170
|
-
yield this.getTasks(parts)
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
private getTasks(parts: Set<unknown>) {
|
|
175
|
-
return Array.from(parts.values()).flatMap((part) => {
|
|
176
|
-
const task = this.tasks.get(part)
|
|
177
|
-
if (task === undefined) return []
|
|
178
|
-
this.tasks.delete(part)
|
|
179
|
-
this.priority.delete(part)
|
|
180
|
-
return [task]
|
|
181
|
-
})
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
private setPriority(task: unknown, priority: number) {
|
|
185
|
-
const current = this.priority.get(task)
|
|
186
|
-
if (current === undefined) {
|
|
187
|
-
this.priority.set(task, priority)
|
|
188
|
-
this.addTaskToPriority(task, priority)
|
|
189
|
-
return priority
|
|
190
|
-
} else if (priority < current) {
|
|
191
|
-
this.priorities.get(current)?.delete(task)
|
|
192
|
-
this.priority.set(task, priority)
|
|
193
|
-
this.addTaskToPriority(task, priority)
|
|
194
|
-
return priority
|
|
195
|
-
} else {
|
|
196
|
-
return current
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
private addTaskToPriority(task: unknown, priority: number) {
|
|
201
|
-
let set = this.priorities.get(priority)
|
|
202
|
-
if (set === undefined) {
|
|
203
|
-
set = new Set()
|
|
204
|
-
this.priorities.set(priority, set)
|
|
205
|
-
}
|
|
206
|
-
set.add(task)
|
|
207
|
-
}
|
|
279
|
+
Idle: (priority: number) => RAF_PRIORITY_RANGE + priority,
|
|
280
|
+
} as const;
|
|
281
|
+
|
|
282
|
+
function idleDealineFromTime(startTime: number, durationAllowed: number): IdleDeadline {
|
|
283
|
+
return {
|
|
284
|
+
timeRemaining: () => {
|
|
285
|
+
const elapsed = performance.now() - startTime;
|
|
286
|
+
return Math.max(0, durationAllowed - elapsed);
|
|
287
|
+
},
|
|
288
|
+
didTimeout: false,
|
|
289
|
+
};
|
|
208
290
|
}
|
|
209
291
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
constructor(readonly scope: Scope.Scope) {
|
|
215
|
-
this.add.bind(this)
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
add(part: unknown, task: () => void, priority: number) {
|
|
219
|
-
return Effect.suspend(() => {
|
|
220
|
-
this.queue.add(part, task, priority)
|
|
221
|
-
|
|
222
|
-
return Effect.zipRight(
|
|
223
|
-
Effect.addFinalizer(() =>
|
|
224
|
-
Effect.sync(() => {
|
|
225
|
-
const currentTask = this.queue.get(part)
|
|
226
|
-
// If the current task is still the same we'll delete it from the queue
|
|
227
|
-
if (currentTask === task) {
|
|
228
|
-
this.queue.delete(part)
|
|
229
|
-
}
|
|
230
|
-
})
|
|
231
|
-
),
|
|
232
|
-
this.scheduleNextRun
|
|
233
|
-
)
|
|
234
|
-
})
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
scheduleNextRun = Effect.suspend(() => {
|
|
238
|
-
if (this.queue.isEmpty || this.scheduled) return Effect.void
|
|
239
|
-
|
|
240
|
-
this.scheduled = true
|
|
241
|
-
|
|
242
|
-
return this.run.pipe(
|
|
243
|
-
Scope.extend(this.scope),
|
|
244
|
-
Effect.forkIn(this.scope)
|
|
245
|
-
)
|
|
246
|
-
})
|
|
247
|
-
|
|
248
|
-
abstract run: Effect.Effect<void, never, Scope.Scope>
|
|
249
|
-
|
|
250
|
-
protected runTasks = (iterator: Iterator<Array<() => void>>) => {
|
|
251
|
-
const result = iterator.next()
|
|
252
|
-
|
|
253
|
-
if (result.done) return false
|
|
254
|
-
else {
|
|
255
|
-
for (const task of result.value) {
|
|
256
|
-
this.tryRunTask(task)
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
return true
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
protected tryRunTask = (task: () => void) => {
|
|
264
|
-
try {
|
|
265
|
-
task()
|
|
266
|
-
} catch (error) {
|
|
267
|
-
// TODO: We should probably be able to report this back to a template
|
|
268
|
-
console.error(error)
|
|
269
|
-
}
|
|
270
|
-
}
|
|
292
|
+
function disposable(f: () => void): Disposable {
|
|
293
|
+
return {
|
|
294
|
+
[Symbol.dispose]: f,
|
|
295
|
+
};
|
|
271
296
|
}
|
|
272
297
|
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
readonly options?: IdleRequestOptions
|
|
277
|
-
) {
|
|
278
|
-
super(scope)
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
run: Effect.Effect<void, never, Scope.Scope> = Effect.suspend(() => {
|
|
282
|
-
return Effect.flatMap(
|
|
283
|
-
Idle.whenIdle(this.options),
|
|
284
|
-
(deadline) =>
|
|
285
|
-
Effect.suspend(() => {
|
|
286
|
-
const iterator = this.queue.entries()
|
|
287
|
-
|
|
288
|
-
while (Idle.shouldContinue(deadline) && this.runTasks(iterator)) {
|
|
289
|
-
// Continue
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
// If we have more work to do, schedule another run
|
|
293
|
-
if (!this.queue.isEmpty) {
|
|
294
|
-
return this.run
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
this.scheduled = false
|
|
298
|
-
|
|
299
|
-
return Effect.void
|
|
300
|
-
})
|
|
301
|
-
)
|
|
302
|
-
})
|
|
298
|
+
function dispose(self: Disposable): void {
|
|
299
|
+
if (self === NONE) return;
|
|
300
|
+
self[Symbol.dispose]();
|
|
303
301
|
}
|
|
304
302
|
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
private _clear: (handle: number) => void
|
|
308
|
-
|
|
309
|
-
constructor(
|
|
310
|
-
readonly scope: Scope.Scope
|
|
311
|
-
) {
|
|
312
|
-
super(scope)
|
|
313
|
-
|
|
314
|
-
const [set, clear] = typeof globalThis.requestAnimationFrame === "function"
|
|
315
|
-
? [requestAnimationFrame.bind(globalThis), cancelAnimationFrame.bind(globalThis)]
|
|
316
|
-
: [setTimeout, clearTimeout]
|
|
317
|
-
this._set = set
|
|
318
|
-
this._clear = clear
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
run: Effect.Effect<void> = Effect.async((cb) => {
|
|
322
|
-
const id = this._set(() => {
|
|
323
|
-
this.runAllTasks()
|
|
324
|
-
return cb(Effect.void)
|
|
325
|
-
})
|
|
326
|
-
return Effect.sync(() => {
|
|
327
|
-
this.scheduled = false
|
|
328
|
-
this._clear(id)
|
|
329
|
-
})
|
|
330
|
-
})
|
|
331
|
-
|
|
332
|
-
private runAllTasks = () => {
|
|
333
|
-
const iterator = this.queue.entries()
|
|
334
|
-
while (this.runTasks(iterator)) {
|
|
335
|
-
// Continue
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
this.scheduled = false
|
|
339
|
-
}
|
|
303
|
+
function shouldContinue(deadline: IdleDeadline): boolean {
|
|
304
|
+
return deadline.timeRemaining() > 0;
|
|
340
305
|
}
|
|
341
306
|
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
) {
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
const
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
this._clear = clear
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
run: Effect.Effect<void> = Effect.async((cb) => {
|
|
363
|
-
const id = this._set(() => {
|
|
364
|
-
this.runAllTasks()
|
|
365
|
-
return cb(Effect.void)
|
|
366
|
-
})
|
|
367
|
-
return Effect.sync(() => {
|
|
368
|
-
this.scheduled = false
|
|
369
|
-
if (id) {
|
|
370
|
-
this._clear(id)
|
|
371
|
-
}
|
|
372
|
-
})
|
|
373
|
-
})
|
|
374
|
-
|
|
375
|
-
private runAllTasks = () => {
|
|
376
|
-
const iterator = this.queue.entries()
|
|
377
|
-
while (this.runTasks(iterator)) {
|
|
378
|
-
// Continue
|
|
307
|
+
type KeyedPriorityBucket<A> = [priority: number, Map<unknown, A>];
|
|
308
|
+
|
|
309
|
+
function insert<A>(
|
|
310
|
+
buckets: Array<KeyedPriorityBucket<A>>,
|
|
311
|
+
priority: number,
|
|
312
|
+
key: unknown,
|
|
313
|
+
task: A,
|
|
314
|
+
onRemoved: (task: A) => void,
|
|
315
|
+
): void {
|
|
316
|
+
const index = binarySearch(buckets, priority);
|
|
317
|
+
if (index === buckets.length) {
|
|
318
|
+
buckets.push([priority, new Map([[key, task]])]);
|
|
319
|
+
} else {
|
|
320
|
+
const map = buckets[index][1];
|
|
321
|
+
const existing = map.get(key);
|
|
322
|
+
if (existing !== undefined) {
|
|
323
|
+
onRemoved(existing);
|
|
379
324
|
}
|
|
380
|
-
|
|
381
|
-
this.scheduled = false
|
|
325
|
+
map.set(key, task);
|
|
382
326
|
}
|
|
383
327
|
}
|
|
384
328
|
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
add(_: unknown, task: () => void) {
|
|
391
|
-
return Effect.sync(task)
|
|
329
|
+
function remove<A>(buckets: Array<KeyedPriorityBucket<A>>, priority: number, key: unknown): void {
|
|
330
|
+
const index = binarySearch(buckets, priority);
|
|
331
|
+
if (index === buckets.length) {
|
|
332
|
+
return;
|
|
392
333
|
}
|
|
334
|
+
buckets[index][1].delete(key);
|
|
393
335
|
}
|
|
394
336
|
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
let queue = this.getQueueForPriority(priority)
|
|
408
|
-
|
|
409
|
-
if (queue === undefined) {
|
|
410
|
-
queue = this.queues[this.queues.length - 1][1]
|
|
411
|
-
}
|
|
412
|
-
|
|
413
|
-
return queue.add(part, task, priority)
|
|
414
|
-
}
|
|
415
|
-
|
|
416
|
-
private getQueueForPriority(priority: number) {
|
|
417
|
-
if (this._priorityCache.has(priority)) {
|
|
418
|
-
return this._priorityCache.get(priority)!
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
const q = this.queues.find(([range]) => priority >= range[0] && priority <= range[1])
|
|
422
|
-
|
|
423
|
-
if (q) {
|
|
424
|
-
this._priorityCache.set(priority, q[1])
|
|
425
|
-
return q[1]
|
|
337
|
+
function binarySearch<A>(buckets: Array<KeyedPriorityBucket<A>>, priority: number): number {
|
|
338
|
+
let low = 0;
|
|
339
|
+
let high = buckets.length - 1;
|
|
340
|
+
while (low <= high) {
|
|
341
|
+
const mid = Math.floor((low + high) / 2);
|
|
342
|
+
const [bucketPriority] = buckets[mid];
|
|
343
|
+
if (bucketPriority === priority) {
|
|
344
|
+
return mid;
|
|
345
|
+
} else if (bucketPriority < priority) {
|
|
346
|
+
low = mid + 1;
|
|
347
|
+
} else {
|
|
348
|
+
high = mid - 1;
|
|
426
349
|
}
|
|
427
|
-
|
|
428
|
-
return q
|
|
429
350
|
}
|
|
351
|
+
return low;
|
|
430
352
|
}
|
|
431
|
-
|
|
432
|
-
/**
|
|
433
|
-
* @since 1.0.0
|
|
434
|
-
*/
|
|
435
|
-
export const withCurrentPriority = <A, E, R>(f: (priority: number) => Effect.Effect<A, E, R>) =>
|
|
436
|
-
Effect.flatMap(FiberRef.get(currentPriority), f)
|
|
437
|
-
|
|
438
|
-
/**
|
|
439
|
-
* @since 1.0.0
|
|
440
|
-
*/
|
|
441
|
-
export const usingCurrentPriority: {
|
|
442
|
-
(priority: number): <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>
|
|
443
|
-
<A, E, R>(effect: Effect.Effect<A, E, R>, priority: number): Effect.Effect<A, E, R>
|
|
444
|
-
} = dual(
|
|
445
|
-
2,
|
|
446
|
-
<A, E, R>(effect: Effect.Effect<A, E, R>, priority: number) => Effect.locally(effect, currentPriority, priority)
|
|
447
|
-
)
|