@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/src/internal/parser.ts
DELETED
|
@@ -1,757 +0,0 @@
|
|
|
1
|
-
import * as Chunk from "effect/Chunk"
|
|
2
|
-
import { globalValue } from "effect/GlobalValue"
|
|
3
|
-
import * as Option from "effect/Option"
|
|
4
|
-
import * as Template from "../Template.js"
|
|
5
|
-
import { convertCharacterEntities } from "./character-entities.js"
|
|
6
|
-
import type { TextChunk } from "./chunks.js"
|
|
7
|
-
import {
|
|
8
|
-
getClosingTagName,
|
|
9
|
-
getPart,
|
|
10
|
-
getStrictPart,
|
|
11
|
-
getTextUntilCloseBrace,
|
|
12
|
-
getTextUntilPart,
|
|
13
|
-
getWhitespace,
|
|
14
|
-
PART_REGEX,
|
|
15
|
-
PART_STRING
|
|
16
|
-
} from "./chunks.js"
|
|
17
|
-
|
|
18
|
-
// TODO: Consider ways to surface useful errors and warnings.
|
|
19
|
-
// TODO: Profile for performance optimization
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* @since 1.0.0
|
|
23
|
-
*/
|
|
24
|
-
export const TEXT_ONLY_NODES_REGEX = new Set([
|
|
25
|
-
"textarea",
|
|
26
|
-
"script",
|
|
27
|
-
"style",
|
|
28
|
-
"title",
|
|
29
|
-
"plaintext",
|
|
30
|
-
"xmp"
|
|
31
|
-
])
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* @since 1.0.0
|
|
35
|
-
*/
|
|
36
|
-
export const SELF_CLOSING_TAGS = new Set([
|
|
37
|
-
"area",
|
|
38
|
-
"base",
|
|
39
|
-
"br",
|
|
40
|
-
"col",
|
|
41
|
-
"command",
|
|
42
|
-
"embed",
|
|
43
|
-
"hr",
|
|
44
|
-
"img",
|
|
45
|
-
"input",
|
|
46
|
-
"keygen",
|
|
47
|
-
"link",
|
|
48
|
-
"meta",
|
|
49
|
-
"param",
|
|
50
|
-
"source",
|
|
51
|
-
"track",
|
|
52
|
-
"wbr"
|
|
53
|
-
])
|
|
54
|
-
|
|
55
|
-
const VALID_PROPS_NAMES = new Set([
|
|
56
|
-
"props",
|
|
57
|
-
"properties",
|
|
58
|
-
// First "." will already be matched
|
|
59
|
-
".."
|
|
60
|
-
])
|
|
61
|
-
|
|
62
|
-
export interface Parser {
|
|
63
|
-
parse(templateStrings: ReadonlyArray<string>): Template.Template
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
export function parse(templateStrings: ReadonlyArray<string>): Template.Template {
|
|
67
|
-
return parser.parse(templateStrings)
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
const SPACE_REGEX = /\s/
|
|
71
|
-
const PART_START = "{{__PART"
|
|
72
|
-
const PART_END = "__}}"
|
|
73
|
-
const chars = {
|
|
74
|
-
openBracket: "{",
|
|
75
|
-
closeBracket: "}",
|
|
76
|
-
underscore: "_",
|
|
77
|
-
equals: "=",
|
|
78
|
-
quote: `"`,
|
|
79
|
-
singleQuote: "'",
|
|
80
|
-
slash: "/",
|
|
81
|
-
greaterThan: ">",
|
|
82
|
-
lessThan: "<",
|
|
83
|
-
hypen: "-",
|
|
84
|
-
dot: "."
|
|
85
|
-
} as const
|
|
86
|
-
|
|
87
|
-
const isPartToken: TextPredicate = (input, pos) =>
|
|
88
|
-
input[pos] === chars.openBracket && input.slice(pos, pos + 8) === PART_START
|
|
89
|
-
const isPartEndToken: TextPredicate = (input, pos) =>
|
|
90
|
-
input[pos] === chars.underscore && input.slice(pos, pos + 4) === PART_END
|
|
91
|
-
const isElementOpenToken: TextPredicate = (input, pos) =>
|
|
92
|
-
input[pos] === chars.lessThan && input[pos + 1] !== chars.slash
|
|
93
|
-
const isElementCloseToken: TextPredicate = (input, pos) =>
|
|
94
|
-
input[pos] === chars.lessThan && input[pos + 1] === chars.slash
|
|
95
|
-
const isEqualsToken: TextPredicate = (input, pos) => input[pos] === chars.equals
|
|
96
|
-
const isQuoteToken: TextPredicate = (input, pos) => input[pos] === chars.quote
|
|
97
|
-
const isSingleQuoteToken: TextPredicate = (input, pos) => input[pos] === chars.singleQuote
|
|
98
|
-
const isWhitespaceToken: TextPredicate = (input, pos) => SPACE_REGEX.test(input[pos])
|
|
99
|
-
const isOpenTagEndToken: TextPredicate = (input, pos) => input[pos] === chars.greaterThan
|
|
100
|
-
const isSelfClosingTagEndToken: TextPredicate = (input, pos) =>
|
|
101
|
-
input[pos] === chars.slash && input[pos + 1] === chars.greaterThan
|
|
102
|
-
const isCommentEndToken: TextPredicate = (input, pos) =>
|
|
103
|
-
input[pos] === chars.hypen && input[pos + 1] === chars.hypen && input[pos + 2] === chars.greaterThan
|
|
104
|
-
const isGreaterThanToken: TextPredicate = (input, pos) => input[pos] === chars.greaterThan
|
|
105
|
-
|
|
106
|
-
type Context = "unknown" | "element"
|
|
107
|
-
|
|
108
|
-
type TextPredicate = (input: string, pos: number) => boolean
|
|
109
|
-
|
|
110
|
-
type LoopDecision<A> = Continue<A> | Break<A> | Skip
|
|
111
|
-
|
|
112
|
-
type Continue<A> = ["continue", A]
|
|
113
|
-
const Continue = <A>(a: A): Continue<A> => ["continue", a]
|
|
114
|
-
|
|
115
|
-
type Break<A> = ["break", Option.Option<A>]
|
|
116
|
-
const Break = <A>(a?: A): Break<A> => ["break", Option.fromNullable(a)]
|
|
117
|
-
|
|
118
|
-
type Skip = ["skip"]
|
|
119
|
-
const Skip: Skip = ["skip"]
|
|
120
|
-
|
|
121
|
-
type Predicates = {
|
|
122
|
-
[key: string]: (char: string, pos: number) => boolean
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
const BREAK_ATTR = Break<Array<Template.Attribute>>()
|
|
126
|
-
|
|
127
|
-
const tagNameMatches = {
|
|
128
|
-
whitespace: isWhitespaceToken,
|
|
129
|
-
openTagEnd: isOpenTagEndToken,
|
|
130
|
-
selfClosingTagEnd: isSelfClosingTagEndToken
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
const attributeMatches = {
|
|
134
|
-
whitespace: isWhitespaceToken,
|
|
135
|
-
equals: isEqualsToken,
|
|
136
|
-
openTagEnd: isOpenTagEndToken,
|
|
137
|
-
selfClosingTagEnd: isSelfClosingTagEndToken
|
|
138
|
-
} satisfies Predicates
|
|
139
|
-
|
|
140
|
-
const attributeValueMatches = {
|
|
141
|
-
base: isWhitespaceToken,
|
|
142
|
-
openTagEnd: isOpenTagEndToken,
|
|
143
|
-
selfClosingTagEnd: isSelfClosingTagEndToken
|
|
144
|
-
} satisfies Predicates
|
|
145
|
-
|
|
146
|
-
const textChildMatches = {
|
|
147
|
-
part: isPartToken,
|
|
148
|
-
elementOpen: isElementOpenToken,
|
|
149
|
-
elementClose: isElementCloseToken
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
export class PathStack {
|
|
153
|
-
chunk: Chunk.Chunk<number> = Chunk.empty()
|
|
154
|
-
count = 0
|
|
155
|
-
|
|
156
|
-
inc() {
|
|
157
|
-
this.count++
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
push(): void {
|
|
161
|
-
this.chunk = this.toChunk()
|
|
162
|
-
this.count = 0
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
pop(): void {
|
|
166
|
-
this.count = Chunk.unsafeLast(this.chunk)
|
|
167
|
-
this.chunk = Chunk.dropRight(this.chunk, 1)
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
toChunk(): Chunk.Chunk<number> {
|
|
171
|
-
if (Chunk.isEmpty(this.chunk)) {
|
|
172
|
-
return Chunk.of(this.count)
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
return Chunk.append(this.chunk, this.count)
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
previousChunk() {
|
|
179
|
-
return this.chunk
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
const predicatesCache = new WeakMap<Predicates, readonly [ReadonlyArray<string>, number]>()
|
|
184
|
-
|
|
185
|
-
function getPredicatesCache(predicates: Predicates) {
|
|
186
|
-
const cached = predicatesCache.get(predicates)
|
|
187
|
-
|
|
188
|
-
if (cached === undefined) {
|
|
189
|
-
const keys = Object.keys(predicates)
|
|
190
|
-
const length = keys.length
|
|
191
|
-
const toCache = [keys, length] as const
|
|
192
|
-
|
|
193
|
-
predicatesCache.set(predicates, toCache)
|
|
194
|
-
|
|
195
|
-
return toCache
|
|
196
|
-
} else {
|
|
197
|
-
return cached
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
class ParserImpl implements Parser {
|
|
202
|
-
context!: Context
|
|
203
|
-
input!: string
|
|
204
|
-
length!: number
|
|
205
|
-
parts!: Array<[Template.PartNode | Template.SparsePartNode, Chunk.Chunk<number>]>
|
|
206
|
-
pos!: number
|
|
207
|
-
path!: PathStack
|
|
208
|
-
_skipWhitespace!: boolean
|
|
209
|
-
|
|
210
|
-
parse(templateStrings: ReadonlyArray<string>): Template.Template {
|
|
211
|
-
this.init(templateStrings)
|
|
212
|
-
|
|
213
|
-
return this.parseTemplate(templateHash(templateStrings))
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
private parseTemplate(hash: string) {
|
|
217
|
-
return new Template.Template(this.parseTemplateChildren(), hash, this.parts)
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
private parseTemplateChildren() {
|
|
221
|
-
const nodes: Array<Template.Node> = []
|
|
222
|
-
|
|
223
|
-
while (this.pos < this.length) {
|
|
224
|
-
const node = this.parseNodeFromContext(this.context)
|
|
225
|
-
|
|
226
|
-
if (node === undefined) {
|
|
227
|
-
return nodes
|
|
228
|
-
} else {
|
|
229
|
-
nodes.push(...node)
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
return nodes
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
protected parseNodeFromContext(ctx: Context): Array<Template.Node> | undefined {
|
|
237
|
-
if (ctx === "element") {
|
|
238
|
-
return [this.parseElement()]
|
|
239
|
-
} else {
|
|
240
|
-
return this.parseUnknown()
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
private parseUnknown(): Array<Template.Node> | undefined {
|
|
245
|
-
if (this.nextChar() === "<") { // Open tag / comment / self-closing tag
|
|
246
|
-
return this.openBracket()
|
|
247
|
-
} else {
|
|
248
|
-
return this.unknownChunk()
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
private openBracket() {
|
|
253
|
-
this.consumeAmount(1)
|
|
254
|
-
this.skipWhitespace()
|
|
255
|
-
|
|
256
|
-
const nextChar = this.nextChar()
|
|
257
|
-
|
|
258
|
-
if (nextChar === "!") { // Comment
|
|
259
|
-
this.consumeAmount(1)
|
|
260
|
-
|
|
261
|
-
const nextChar = this.nextChar()
|
|
262
|
-
|
|
263
|
-
if (nextChar == "-") {
|
|
264
|
-
this.consumeAmount(2)
|
|
265
|
-
return [this.parseComment()]
|
|
266
|
-
} else if (nextChar.toLowerCase() === "d") {
|
|
267
|
-
return [this.parseDocType()]
|
|
268
|
-
} else {
|
|
269
|
-
throw new SyntaxError(`Unknown comment type ${nextChar}`)
|
|
270
|
-
}
|
|
271
|
-
} else if (nextChar === "/") { // Self-closing tag
|
|
272
|
-
return this.selfClosingTagEnd()
|
|
273
|
-
} else { // Elements
|
|
274
|
-
return [this.parseElement()]
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
private selfClosingTagEnd() {
|
|
279
|
-
this.consumeAmount(1)
|
|
280
|
-
this.parseTagName()
|
|
281
|
-
this.skipWhitespace()
|
|
282
|
-
this.consumeAmount(1)
|
|
283
|
-
this.context = "unknown"
|
|
284
|
-
return undefined
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
private unknownChunk() {
|
|
288
|
-
let next: TextChunk | undefined
|
|
289
|
-
|
|
290
|
-
if ((next = this.chunk(getPart))) { // Parts
|
|
291
|
-
this._skipWhitespace = false
|
|
292
|
-
return [this.addPartWithPrevious(new Template.NodePart(parseInt(next.match[2], 10)))]
|
|
293
|
-
} else if ((next = this.chunk(getWhitespace))) { // Whitespace
|
|
294
|
-
return this._skipWhitespace
|
|
295
|
-
? []
|
|
296
|
-
: (this.path.inc(), [new Template.TextNode(convertCharacterEntities(next.match[1]))])
|
|
297
|
-
} else if ((next = this.chunk(getTextUntilCloseBrace))) { // Text and parts
|
|
298
|
-
return parseTextAndParts(next.match[1], (i) => this.addPartWithPrevious(new Template.NodePart(i)))
|
|
299
|
-
} else {
|
|
300
|
-
this.path.inc()
|
|
301
|
-
return [new Template.TextNode(convertCharacterEntities(this.nextChar()))]
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
private parseElement(): Template.ParentNode {
|
|
306
|
-
const node = this.parseElementKind()
|
|
307
|
-
this.path.inc()
|
|
308
|
-
|
|
309
|
-
this.context = "unknown"
|
|
310
|
-
this._skipWhitespace = true
|
|
311
|
-
|
|
312
|
-
return node
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
private parseElementKind() {
|
|
316
|
-
this.context = "element"
|
|
317
|
-
|
|
318
|
-
const [tagName, matched] = this.parseTagName()
|
|
319
|
-
|
|
320
|
-
if (matched === "whitespace") {
|
|
321
|
-
this.skipWhitespace()
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
if (SELF_CLOSING_TAGS.has(tagName)) {
|
|
325
|
-
return this.parseSelfClosingElement(tagName)
|
|
326
|
-
} else if (TEXT_ONLY_NODES_REGEX.has(tagName)) {
|
|
327
|
-
return this.parseTextOnlyElement(tagName)
|
|
328
|
-
} else {
|
|
329
|
-
const attributes = this.parseAttributes()
|
|
330
|
-
this.path.push()
|
|
331
|
-
const children = this.parseTemplateChildren()
|
|
332
|
-
this.path.pop()
|
|
333
|
-
const element = new Template.ElementNode(tagName, attributes, children)
|
|
334
|
-
|
|
335
|
-
this.skipWhitespace()
|
|
336
|
-
this.consumeClosingTag(tagName)
|
|
337
|
-
|
|
338
|
-
return element
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
private consumeClosingTag(tagName: string) {
|
|
343
|
-
this.chunk(getClosingTagName(tagName))
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
private parseSelfClosingElement(tagName: string): Template.SelfClosingElementNode {
|
|
347
|
-
const attributes = this.parseAttributes()
|
|
348
|
-
|
|
349
|
-
return new Template.SelfClosingElementNode(tagName, attributes)
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
private parseTextOnlyElement(tagName: string): Template.TextOnlyElement {
|
|
353
|
-
const attributes = this.parseAttributes()
|
|
354
|
-
|
|
355
|
-
this.path.push()
|
|
356
|
-
const children = this.parseTextChildren(tagName)
|
|
357
|
-
this.path.pop()
|
|
358
|
-
|
|
359
|
-
return new Template.TextOnlyElement(tagName, attributes, children || [])
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
private parseComment(): Template.Comment {
|
|
363
|
-
const text = this.parseTextUntil(isCommentEndToken)
|
|
364
|
-
this.consumeAmount(3)
|
|
365
|
-
|
|
366
|
-
const textAndParts = parseTextAndParts(text, (i) => new Template.CommentPartNode(i))
|
|
367
|
-
|
|
368
|
-
if (textAndParts.length === 1) {
|
|
369
|
-
const part = textAndParts[0]
|
|
370
|
-
|
|
371
|
-
if (part._tag === "text") {
|
|
372
|
-
return new Template.CommentNode(part.value)
|
|
373
|
-
} else {
|
|
374
|
-
return this.addPart(new Template.CommentPartNode(part.index))
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
return this.addPart(new Template.SparseCommentNode(textAndParts))
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
private parseDocType(): Template.DocType {
|
|
382
|
-
this.parseTextUntil(isGreaterThanToken)
|
|
383
|
-
this.consumeAmount(1)
|
|
384
|
-
this.skipWhitespace()
|
|
385
|
-
|
|
386
|
-
return new Template.DocType("html")
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
private parseTagName() {
|
|
390
|
-
return this.parseTextUntilMany(tagNameMatches)
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
private parseAttributes(): Array<Template.Attribute> {
|
|
394
|
-
return this.parseArray<Template.Attribute>(() => this.parseAttribute()) || []
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
private parseAttribute(): LoopDecision<Array<Template.Attribute>> {
|
|
398
|
-
const [name, matched] = this.parseTextUntilMany(attributeMatches)
|
|
399
|
-
|
|
400
|
-
switch (matched) {
|
|
401
|
-
case null:
|
|
402
|
-
return Skip
|
|
403
|
-
case "whitespace":
|
|
404
|
-
this.skipWhitespace()
|
|
405
|
-
return Continue([this.parseBooleanNode(name)])
|
|
406
|
-
case "equals": {
|
|
407
|
-
this.consumeAmount(1)
|
|
408
|
-
return Continue([this.parseAttributeValue(name)])
|
|
409
|
-
}
|
|
410
|
-
case "openTagEnd": {
|
|
411
|
-
this.consumeAmount(1)
|
|
412
|
-
this.context = "unknown"
|
|
413
|
-
return Break<Array<Template.Attribute>>(name ? [this.parseBooleanNode(name)] : undefined)
|
|
414
|
-
}
|
|
415
|
-
case "selfClosingTagEnd": {
|
|
416
|
-
this.consumeAmount(2)
|
|
417
|
-
this.context = "unknown"
|
|
418
|
-
|
|
419
|
-
return BREAK_ATTR
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
private parseAttributeValue(name: string): Template.Attribute {
|
|
425
|
-
this.skipWhitespace()
|
|
426
|
-
|
|
427
|
-
const nextChar = this.nextChar()
|
|
428
|
-
|
|
429
|
-
const isDoubleQuoted = nextChar === `"`
|
|
430
|
-
const isSingleQuoted = nextChar === "'"
|
|
431
|
-
const isQuoted = isDoubleQuoted || isSingleQuoted
|
|
432
|
-
|
|
433
|
-
if (isQuoted) {
|
|
434
|
-
attributeValueMatches.base = isDoubleQuoted
|
|
435
|
-
? isQuoteToken
|
|
436
|
-
: isSingleQuoteToken
|
|
437
|
-
this.consumeAmount(1)
|
|
438
|
-
} else {
|
|
439
|
-
attributeValueMatches.base = isWhitespaceToken
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
const matched = this.parseTextUntilMany(attributeValueMatches)
|
|
443
|
-
const text = matched[0]
|
|
444
|
-
|
|
445
|
-
if (isQuoted) {
|
|
446
|
-
this.consumeAmount(1)
|
|
447
|
-
}
|
|
448
|
-
|
|
449
|
-
this.skipWhitespace()
|
|
450
|
-
|
|
451
|
-
if (text === "") {
|
|
452
|
-
return this.parseBooleanNode(name)
|
|
453
|
-
}
|
|
454
|
-
|
|
455
|
-
switch (name[0]) {
|
|
456
|
-
case "?":
|
|
457
|
-
return this.addPart(new Template.BooleanPartNode(name.slice(1), unsafeParsePartIndex(text)))
|
|
458
|
-
case ".": {
|
|
459
|
-
const property = name.slice(1)
|
|
460
|
-
|
|
461
|
-
if (property === "data") {
|
|
462
|
-
return this.addPart(new Template.DataPartNode(unsafeParsePartIndex(text)))
|
|
463
|
-
} else if (VALID_PROPS_NAMES.has(property)) {
|
|
464
|
-
return this.addPart(new Template.PropertiesPartNode(unsafeParsePartIndex(text)))
|
|
465
|
-
} else {
|
|
466
|
-
return this.addPart(new Template.PropertyPartNode(property, unsafeParsePartIndex(text)))
|
|
467
|
-
}
|
|
468
|
-
}
|
|
469
|
-
case "@":
|
|
470
|
-
return this.addPart(new Template.EventPartNode(name.slice(1), unsafeParsePartIndex(text)))
|
|
471
|
-
case "o": {
|
|
472
|
-
if (name[1] === "n") {
|
|
473
|
-
return this.addPart(new Template.EventPartNode(name.slice(2), unsafeParsePartIndex(text)))
|
|
474
|
-
}
|
|
475
|
-
}
|
|
476
|
-
}
|
|
477
|
-
|
|
478
|
-
const lowerCaseName = name.toLowerCase()
|
|
479
|
-
|
|
480
|
-
if (lowerCaseName === "ref") {
|
|
481
|
-
return this.addPart(new Template.RefPartNode(unsafeParsePartIndex(text)))
|
|
482
|
-
}
|
|
483
|
-
|
|
484
|
-
const isClass = lowerCaseName === "class" || lowerCaseName === "classname"
|
|
485
|
-
const textAndParts = parseTextAndParts(
|
|
486
|
-
text,
|
|
487
|
-
(i) => isClass ? new Template.ClassNamePartNode(i) : new Template.AttrPartNode(name, i)
|
|
488
|
-
)
|
|
489
|
-
|
|
490
|
-
if (textAndParts.length === 1) {
|
|
491
|
-
const part = textAndParts[0]
|
|
492
|
-
|
|
493
|
-
if (part._tag === "text") {
|
|
494
|
-
return new Template.AttributeNode(name, part.value)
|
|
495
|
-
} else {
|
|
496
|
-
return this.addPart(
|
|
497
|
-
isClass ? new Template.ClassNamePartNode(part.index) : new Template.AttrPartNode(name, part.index)
|
|
498
|
-
)
|
|
499
|
-
}
|
|
500
|
-
}
|
|
501
|
-
|
|
502
|
-
return this.addPart(
|
|
503
|
-
isClass
|
|
504
|
-
? new Template.SparseClassNameNode(
|
|
505
|
-
// We don't need empty text spaces to generate the correct class namesq
|
|
506
|
-
textAndParts.filter((t) => t._tag === "text" ? t.value.trim().length > 0 : true) as any
|
|
507
|
-
)
|
|
508
|
-
: new Template.SparseAttrNode(name, textAndParts as any)
|
|
509
|
-
)
|
|
510
|
-
}
|
|
511
|
-
|
|
512
|
-
private parseBooleanNode(name: string) {
|
|
513
|
-
if (isSpread(name)) {
|
|
514
|
-
return this.addPart(new Template.PropertiesPartNode(unsafeParsePartIndex(name.slice(3))))
|
|
515
|
-
} else {
|
|
516
|
-
return new Template.BooleanNode(name)
|
|
517
|
-
}
|
|
518
|
-
}
|
|
519
|
-
|
|
520
|
-
private parseTextChildren(tagName: string): Array<Template.Text> | null {
|
|
521
|
-
return this.parseArray(() => this.parseTextChild(tagName))
|
|
522
|
-
}
|
|
523
|
-
|
|
524
|
-
private parseTextChild(tagName: string): LoopDecision<Array<Template.Text>> {
|
|
525
|
-
const [parsed, matched] = this.parseTextUntilMany(textChildMatches)
|
|
526
|
-
const text = parsed.trim()
|
|
527
|
-
|
|
528
|
-
switch (matched) {
|
|
529
|
-
case null:
|
|
530
|
-
return Skip
|
|
531
|
-
case "part": {
|
|
532
|
-
this.consumeAmount(8)
|
|
533
|
-
const part = this.parsePartToken((i) => this.addPartWithPrevious(new Template.TextPartNode(i)))
|
|
534
|
-
|
|
535
|
-
return text === "" ? Continue([part]) : Continue([new Template.TextNode(convertCharacterEntities(text)), part])
|
|
536
|
-
}
|
|
537
|
-
case "elementClose": {
|
|
538
|
-
this.consumeClosingTag(tagName)
|
|
539
|
-
return Break(
|
|
540
|
-
text ? [new Template.TextNode(convertCharacterEntities(text))] : undefined
|
|
541
|
-
)
|
|
542
|
-
}
|
|
543
|
-
case "elementOpen": // In this case we make the assumption that you forgot to close this element
|
|
544
|
-
return Break(
|
|
545
|
-
text ? [new Template.TextNode(convertCharacterEntities(text))] : undefined
|
|
546
|
-
)
|
|
547
|
-
}
|
|
548
|
-
}
|
|
549
|
-
|
|
550
|
-
private parsePartToken<T extends Template.PartNode>(f: (index: number) => T): T {
|
|
551
|
-
const text = this.parseTextUntil(isPartEndToken)
|
|
552
|
-
const index = Number(text)
|
|
553
|
-
|
|
554
|
-
this.consumeAmount(4)
|
|
555
|
-
|
|
556
|
-
return f(index)
|
|
557
|
-
}
|
|
558
|
-
|
|
559
|
-
private parseTextUntil(predicate: (char: string, pos: number) => boolean) {
|
|
560
|
-
const start = this.pos
|
|
561
|
-
let i = 0
|
|
562
|
-
while (this.pos < this.length) {
|
|
563
|
-
if (predicate(this.input, this.pos)) {
|
|
564
|
-
break
|
|
565
|
-
}
|
|
566
|
-
|
|
567
|
-
i++
|
|
568
|
-
this.consumeAmount(1)
|
|
569
|
-
}
|
|
570
|
-
|
|
571
|
-
return this.input.slice(start, start + i)
|
|
572
|
-
}
|
|
573
|
-
|
|
574
|
-
private parseTextUntilMany<const T extends Predicates>(
|
|
575
|
-
predicates: T
|
|
576
|
-
): readonly [string, keyof T] | readonly [string, null] {
|
|
577
|
-
const [keys, length] = getPredicatesCache(predicates)
|
|
578
|
-
|
|
579
|
-
let text = ""
|
|
580
|
-
let i = 0
|
|
581
|
-
|
|
582
|
-
while (this.pos < this.length) {
|
|
583
|
-
const char = this.nextChar()
|
|
584
|
-
|
|
585
|
-
for (; i < length; i++) {
|
|
586
|
-
if (predicates[keys[i]](this.input, this.pos)) {
|
|
587
|
-
return [text, keys[i]] as const
|
|
588
|
-
}
|
|
589
|
-
}
|
|
590
|
-
i = 0
|
|
591
|
-
|
|
592
|
-
text += char
|
|
593
|
-
this.consumeAmount(1)
|
|
594
|
-
}
|
|
595
|
-
|
|
596
|
-
return [text, null] as const
|
|
597
|
-
}
|
|
598
|
-
|
|
599
|
-
private parseArray<T>(parser: () => LoopDecision<Array<T>>): Array<T> | null {
|
|
600
|
-
const children: Array<T> = []
|
|
601
|
-
|
|
602
|
-
while (this.pos < this.length) {
|
|
603
|
-
const [decision, value] = parser()
|
|
604
|
-
|
|
605
|
-
if (decision === "continue") {
|
|
606
|
-
children.push(...value)
|
|
607
|
-
} else if (decision === "break") {
|
|
608
|
-
if (Option.isSome(value)) {
|
|
609
|
-
children.push(...value.value)
|
|
610
|
-
}
|
|
611
|
-
|
|
612
|
-
return children
|
|
613
|
-
} else {
|
|
614
|
-
return null
|
|
615
|
-
}
|
|
616
|
-
}
|
|
617
|
-
|
|
618
|
-
return children
|
|
619
|
-
}
|
|
620
|
-
|
|
621
|
-
private skipWhitespace() {
|
|
622
|
-
while (this.pos < this.length) {
|
|
623
|
-
const char = this.nextChar()
|
|
624
|
-
|
|
625
|
-
if (SPACE_REGEX.test(char)) {
|
|
626
|
-
this.consumeAmount(1)
|
|
627
|
-
} else {
|
|
628
|
-
break
|
|
629
|
-
}
|
|
630
|
-
}
|
|
631
|
-
}
|
|
632
|
-
|
|
633
|
-
private nextChar() {
|
|
634
|
-
return this.input[this.pos]
|
|
635
|
-
}
|
|
636
|
-
|
|
637
|
-
private consumeAmount(amount: number) {
|
|
638
|
-
this.pos += amount
|
|
639
|
-
}
|
|
640
|
-
|
|
641
|
-
private chunk(f: (str: string, pos: number) => TextChunk | undefined): TextChunk | undefined {
|
|
642
|
-
const chunk = f(this.input, this.pos)
|
|
643
|
-
|
|
644
|
-
if (chunk) {
|
|
645
|
-
this.pos += chunk.length
|
|
646
|
-
}
|
|
647
|
-
|
|
648
|
-
return chunk
|
|
649
|
-
}
|
|
650
|
-
|
|
651
|
-
private addPart<T extends Template.PartNode | Template.SparsePartNode>(part: T): T {
|
|
652
|
-
this.parts.push([part, this.path.toChunk()])
|
|
653
|
-
return part
|
|
654
|
-
}
|
|
655
|
-
|
|
656
|
-
private addPartWithPrevious<T extends Template.PartNode | Template.SparsePartNode>(part: T): T {
|
|
657
|
-
this.parts.push([part, this.path.previousChunk()])
|
|
658
|
-
this.path.inc() // Nodes will be inserted as a comment
|
|
659
|
-
return part
|
|
660
|
-
}
|
|
661
|
-
|
|
662
|
-
private init(templateStrings: ReadonlyArray<string>): void {
|
|
663
|
-
this.context = "unknown"
|
|
664
|
-
this.input = templateWithParts(templateStrings)
|
|
665
|
-
this.length = this.input.length
|
|
666
|
-
this.parts = []
|
|
667
|
-
this.pos = 0
|
|
668
|
-
this.path = new PathStack()
|
|
669
|
-
this._skipWhitespace = true
|
|
670
|
-
}
|
|
671
|
-
}
|
|
672
|
-
|
|
673
|
-
export function templateWithParts(template: ReadonlyArray<string>): string {
|
|
674
|
-
const length = template.length
|
|
675
|
-
const lastIndex = length - 1
|
|
676
|
-
|
|
677
|
-
let output = ""
|
|
678
|
-
|
|
679
|
-
for (let i = 0; i < length; i++) {
|
|
680
|
-
const str = template[i]
|
|
681
|
-
|
|
682
|
-
if (i === lastIndex) {
|
|
683
|
-
output += str
|
|
684
|
-
} else {
|
|
685
|
-
output += str + PART_STRING(i)
|
|
686
|
-
}
|
|
687
|
-
}
|
|
688
|
-
|
|
689
|
-
return output
|
|
690
|
-
}
|
|
691
|
-
|
|
692
|
-
export function unsafeParsePartIndex(text: string): number {
|
|
693
|
-
const next = getStrictPart(text, 0)
|
|
694
|
-
|
|
695
|
-
if (!next) {
|
|
696
|
-
throw new SyntaxError(`Could not parse part index from ${text}`)
|
|
697
|
-
}
|
|
698
|
-
|
|
699
|
-
return parseInt(next.match[2], 10)
|
|
700
|
-
}
|
|
701
|
-
|
|
702
|
-
export function parseTextAndParts<T>(s: string, f: (index: number) => T): Array<Template.TextNode | T> {
|
|
703
|
-
let next: TextChunk | undefined
|
|
704
|
-
let pos: number = 0
|
|
705
|
-
const out: Array<Template.TextNode | T> = []
|
|
706
|
-
|
|
707
|
-
if (!PART_REGEX.test(s)) {
|
|
708
|
-
return [new Template.TextNode(convertCharacterEntities(s))]
|
|
709
|
-
}
|
|
710
|
-
|
|
711
|
-
while (pos < s.length) {
|
|
712
|
-
if ((next = getPart(s, pos))) {
|
|
713
|
-
out.push(f(parseInt(next.match[2], 10)))
|
|
714
|
-
pos += next.length
|
|
715
|
-
} else if ((next = getTextUntilPart(s, pos))) {
|
|
716
|
-
out.push(new Template.TextNode(convertCharacterEntities(next.match[1])))
|
|
717
|
-
|
|
718
|
-
pos += next.length
|
|
719
|
-
} else {
|
|
720
|
-
break
|
|
721
|
-
}
|
|
722
|
-
}
|
|
723
|
-
|
|
724
|
-
if (pos < s.length) {
|
|
725
|
-
out.push(new Template.TextNode(convertCharacterEntities(s.slice(pos))))
|
|
726
|
-
}
|
|
727
|
-
|
|
728
|
-
return out
|
|
729
|
-
}
|
|
730
|
-
|
|
731
|
-
export const parser: Parser = globalValue(Symbol.for("@typed/template/Parser"), () => new ParserImpl())
|
|
732
|
-
|
|
733
|
-
const digestSize = 2
|
|
734
|
-
const multiplier = 33
|
|
735
|
-
const fill = 5381
|
|
736
|
-
|
|
737
|
-
/**
|
|
738
|
-
* Generates a hash for an ordered list of strings. Intended for the purposes
|
|
739
|
-
* of server-side rendering with hydration.
|
|
740
|
-
*/
|
|
741
|
-
export function templateHash(strings: ReadonlyArray<string>) {
|
|
742
|
-
const hashes = new Uint32Array(digestSize).fill(fill)
|
|
743
|
-
|
|
744
|
-
for (let i = 0; i < strings.length; i++) {
|
|
745
|
-
const string = strings[i]
|
|
746
|
-
|
|
747
|
-
for (let j = 0; j < string.length; j++) {
|
|
748
|
-
const key = j % digestSize
|
|
749
|
-
hashes[key] = hashes[key] * multiplier + string.charCodeAt(j)
|
|
750
|
-
}
|
|
751
|
-
}
|
|
752
|
-
|
|
753
|
-
return btoa(String.fromCharCode(...new Uint8Array(hashes.buffer)))
|
|
754
|
-
}
|
|
755
|
-
function isSpread(str: string) {
|
|
756
|
-
return str[0] === chars.dot && str[1] === chars.dot && str[2] === chars.dot
|
|
757
|
-
}
|