@torpor/view 0.0.14 → 0.1.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/CHANGELOG.md +24 -0
- package/README.md +5 -5
- package/dist/compile.cjs +77 -32
- package/dist/compile.cjs.map +1 -1
- package/dist/compile.js +77 -32
- package/dist/compile.js.map +1 -1
- package/dist/index.cjs +31 -15
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -4
- package/dist/index.d.ts +2 -4
- package/dist/index.js +31 -14
- package/dist/index.js.map +1 -1
- package/dist/metafile-cjs.json +1 -1
- package/dist/metafile-esm.json +1 -1
- package/package.json +4 -4
- package/scripts/copyToRepl.ts +1 -1
- package/src/compile/build/client/buildCode.ts +2 -11
- package/src/compile/build/client/buildComponentNode.ts +21 -5
- package/src/compile/build/client/buildElementNode.ts +27 -10
- package/src/compile/build/client/buildFragment.ts +37 -1
- package/src/compile/build/client/buildHtmlNode.ts +1 -0
- package/src/compile/build/client/buildSlotNode.ts +4 -1
- package/src/compile/build/server/buildServerComponentNode.ts +4 -1
- package/src/compile/build/server/buildServerElementNode.ts +5 -2
- package/src/compile/build/server/buildServerSlotNode.ts +4 -1
- package/src/compile/parse/parseCode.ts +20 -12
- package/src/index.ts +0 -2
- package/src/motion/animate.ts +10 -6
- package/src/render/$unwrap.ts +1 -1
- package/src/render/addFragment.ts +14 -4
- package/src/render/hydrate.ts +7 -0
- package/src/render/nodeNext.ts +14 -7
- package/src/render/runControlBranch.ts +11 -1
- package/src/render/runList.ts +8 -2
- package/test/attributes/attributes.test.ts +3 -0
- package/test/attributes/components/Attributes.torp +6 -1
- package/test/attributes/components/output/Attributes-client.ts +6 -2
- package/test/attributes/components/output/Attributes-server.ts +2 -1
- package/test/attributes/components/temp/{Attributes-client-c4812cb9307eac6ff44f90f3358a1811b52c7390.ts → Attributes-client-7b8f7b9996208e8d2d0a12d4f4a40a73df63d9d8.ts} +6 -2
- package/test/attributes/components/temp/{Attributes-server-a7ebed503f2169f7c900d4613531082f1023b086.ts → Attributes-server-a1289434a5a801be1d63bfc85b621579e06452f0.ts} +2 -1
- package/test/await/await.test.ts +2 -4
- package/test/await/components/output/Await-client.ts +4 -4
- package/test/await/components/temp/{Await-client-6ce3ac610ce79ae3b474c81964b715e6f3d966da.ts → Await-client-a7bf000bf2b59a3d5251a0fa18ec79890a52a547.ts} +4 -4
- package/test/bench/bench.bench.ts +5 -7
- package/test/bench/components/output/Bench-client.ts +208 -0
- package/test/bench/components/output/Bench-server.ts +130 -0
- package/test/bench/components/temp/{Bench-client-5fee290225ae4771aa847360006123671e8f17f1.ts → Bench-client-fca94b485c6263778751927240ab3ca4048d7a10.ts} +10 -10
- package/test/bind/bind.test.ts +3 -5
- package/test/bind/component.test.ts +45 -0
- package/test/bind/components/BindComponent.torp +29 -0
- package/test/bind/components/BindText.torp +2 -2
- package/test/bind/components/output/BindComponent-client.ts +87 -0
- package/test/bind/components/output/BindComponent-server.ts +52 -0
- package/test/bind/components/output/BindText-client.ts +3 -3
- package/test/bind/components/temp/BindComponent-client-a645474748485a878871c062ad69e6bcf35e6550.ts +87 -0
- package/test/bind/components/temp/BindComponent-server-c557e7aa944517ab87415b8bb35b41b0034254e7.ts +52 -0
- package/test/bind/components/temp/{BindText-client-9e2f542e13bcbf9a44eab2c5a79d67ddb128f928.ts → BindText-client-d5f7d721df55020ef337f660e5d278eb80fcc330.ts} +3 -3
- package/test/build-server/build-server-element-node.test.ts +1 -1
- package/test/buildOutputFiles.ts +6 -3
- package/test/child-component/components/output/ParentChild-client.ts +3 -2
- package/test/child-component/components/output/ParentChild-server.ts +1 -0
- package/test/child-component/components/temp/{ParentChild-client-8f00a3a31a7f666990765fc4755b62a39c855226.ts → ParentChild-client-eaefb0cbfd251badab3c57ae2037d973f785a1b8.ts} +3 -2
- package/test/child-component/components/temp/{ParentChild-server-9c791bdfa521c3f6549857a34a6cd414fa3c9e80.ts → ParentChild-server-8f2fc556f87867e6e3393e2e9e6d696cda107b69.ts} +1 -0
- package/test/class/components/output/Class-client.ts +7 -6
- package/test/class/components/output/Class-server.ts +1 -0
- package/test/class/components/temp/{Class-client-8bf02b6a0c85674d341617dfb755b285b1af89cf.ts → Class-client-dc885e1e391f38973bd9ea25b7475b07f7c23960.ts} +7 -6
- package/test/class/components/temp/{Class-server-dd71b6ec62f40231917a912819520fc614f017ae.ts → Class-server-d1a2463ba432e10c6f68bd59d1d31949c5a2044f.ts} +1 -0
- package/test/component/components/output/Component-client.ts +3 -2
- package/test/component/components/output/Component-server.ts +1 -1
- package/test/component/components/output/Header-client.ts +2 -1
- package/test/component/components/output/Header-server.ts +1 -0
- package/test/component/components/temp/{Component-client-32cd481f03e25d10b8e93947a2ff8773135b4975.ts → Component-client-a2fb6f30fc340bac909b64cb4f5ac68cde376de3.ts} +3 -2
- package/test/component/components/temp/{Component-server-11542f55405218c0b471172cac1d6a1a4edb5c09.ts → Component-server-40be12cd528ccf768f1ad40ef2a435ad2b2a2d71.ts} +1 -1
- package/test/component/components/temp/{Header-client-ac151eea86e3f6b058fab101661e13ae73864968.ts → Header-client-75cb4aa868295ac168c16ba7b275fbb5ab9256f9.ts} +2 -1
- package/test/component/components/temp/{Header-server-4f10f2332f3ca7a097517cfb938ab1e6f31d68ac.ts → Header-server-f73307874bec34a95dcd152d7f83a3ad13a0f4ac.ts} +1 -0
- package/test/effects/components/output/For-client.ts +3 -2
- package/test/effects/components/output/For-server.ts +1 -0
- package/test/effects/components/output/If-client.ts +4 -3
- package/test/effects/components/output/If-server.ts +1 -0
- package/test/effects/components/output/NestedIf-client.ts +4 -3
- package/test/effects/components/output/NestedIf-server.ts +1 -0
- package/test/effects/components/temp/{For-client-887b1758cf5c80f64708a47369e0e6ce44ffa20f.ts → For-client-d8d4e4424ec3238fe9f79cc907d673612b63bcdf.ts} +3 -2
- package/test/effects/components/temp/{For-server-8e1c7393b102c870167dd086cbee45c47e614dfa.ts → For-server-1f853c161bea31a1a5b11b00d7a021b70c778066.ts} +1 -0
- package/test/effects/components/temp/{If-client-bfc548ef699b91f33e604f066211ce6269cc9506.ts → If-client-bb06988422395321bf298a75bf5563c6f750f776.ts} +4 -3
- package/test/effects/components/temp/{If-server-8c213b1a82cd0a5c2bccfeb90ba8bf01fa4672d2.ts → If-server-97e3cbe059306fc607985dcd1b187df3a278d979.ts} +1 -0
- package/test/effects/components/temp/{NestedIf-client-9e9155398f240345af392194063adc6e42dda80c.ts → NestedIf-client-dc880c1ec92e716ec730dfa0bac0e3d9265bdf27.ts} +4 -3
- package/test/effects/components/temp/{NestedIf-server-5f11d075c2ff224ee5feb7f61aa41aea8af44313.ts → NestedIf-server-9f199a33bae5d5fe34920d6a419937537a2b18dc.ts} +1 -0
- package/test/events/components/output/Increment-client.ts +2 -2
- package/test/events/components/temp/{Increment-client-35c275d15e94e4aa7625af12c45210521995ead5.ts → Increment-client-41bd7bc91aac8c7a9bf73527c8f7ba1794b09ab3.ts} +2 -2
- package/test/events/events.test.ts +2 -3
- package/test/for/components/ForEscape.torp +1 -1
- package/test/for/components/output/For-client.ts +1 -1
- package/test/for/components/output/ForEscape-client.ts +4 -4
- package/test/for/components/output/ForIn-client.ts +3 -2
- package/test/for/components/output/ForIn-server.ts +1 -0
- package/test/for/components/output/ForOf-client.ts +3 -2
- package/test/for/components/output/ForOf-server.ts +1 -0
- package/test/for/components/temp/{For-client-1f6e475347f0474375f12a7c24b0b293e3942aa7.ts → For-client-0be5994e98c07a3455cd8a18a2b1b8ef3605aba6.ts} +1 -1
- package/test/for/components/temp/{ForEscape-client-80d3078cf15001f2ab37b0ec63cfce7267a8a166.ts → ForEscape-client-a973a145e28b32ca55fe3dca53d885fcf5e11c37.ts} +4 -4
- package/test/for/components/temp/{ForIn-client-c8a1ec4473d05475e11928d06d081ab671fd9f28.ts → ForIn-client-5cc25a98e10826e8477fe6f931d5d2bbd0b13c9f.ts} +3 -2
- package/test/for/components/temp/{ForIn-server-d92cf8d3c3e300b562308607caca2c9cab3cb30b.ts → ForIn-server-d68e82c048f7e0f1525f74724b91e5cd01cdc6a6.ts} +1 -0
- package/test/for/components/temp/{ForOf-client-069881d4d9e52bc091e7213154924f3e1626174a.ts → ForOf-client-70b0d59ff72f1cffe2e0ac8523dd7ccdca4ffe39.ts} +3 -2
- package/test/for/components/temp/{ForOf-server-3bfbb33bd589890d272bbcbea53d9598f53bfd70.ts → ForOf-server-ac08d98dd249a3e64a366b8488450e6ce0d18def.ts} +1 -0
- package/test/for/for-escape.test.ts +2 -3
- package/test/function/components/output/Function-client.ts +1 -1
- package/test/function/components/temp/{Function-client-b8931e51769f3f1e84d1491c6474f8551acf9f8d.ts → Function-client-b3ff029a821d47e1a2249a52dfb681f4b2e96232.ts} +1 -1
- package/test/function/function.test.ts +1 -2
- package/test/html/components/output/Html-client.ts +3 -1
- package/test/html/components/output/Html-server.ts +1 -0
- package/test/html/components/temp/{Html-client-5fc745d9980a42a70dcb3473b0fd976e69882c9e.ts → Html-client-766ba4a63f28f929ca16cd7d1640fe92f9b30792.ts} +3 -1
- package/test/html/components/temp/{Html-server-437ea390e58947213ede74755a012cdacceeebe7.ts → Html-server-0a41da8b81bf833f331f3becdbac14be7ddc6c8c.ts} +1 -0
- package/test/if/components/output/IfAfterIf-client.ts +5 -4
- package/test/if/components/output/IfAfterIf-server.ts +1 -0
- package/test/if/components/output/IfElse-client.ts +4 -3
- package/test/if/components/output/IfElse-server.ts +1 -0
- package/test/if/components/output/IfElseIf-client.ts +5 -4
- package/test/if/components/output/IfElseIf-server.ts +1 -0
- package/test/if/components/output/IfNested-client.ts +5 -4
- package/test/if/components/output/IfNested-server.ts +1 -0
- package/test/if/components/temp/{IfAfterIf-client-a489daa5b961ed9da71418fdbb1665b6ba39f1b7.ts → IfAfterIf-client-49b6b8c42b0a351561f9f5f22c2ae2e844bf3b58.ts} +5 -4
- package/test/if/components/temp/{IfAfterIf-server-243736e666e7d77d3f8553a1682734555f5ffd22.ts → IfAfterIf-server-eb67cf1fcf6711882266219940a47bd4a66497f3.ts} +1 -0
- package/test/if/components/temp/{IfElse-client-4c71642f412d5dd2f45729eafb7e974781dbe011.ts → IfElse-client-e236d4a2e99262ff09675bc519c07e2826c0d70b.ts} +4 -3
- package/test/if/components/temp/{IfElse-server-64c055182b327504ee71d1f1d44cfccf48be350d.ts → IfElse-server-c077e0e30f4d2adec41ab779198362d21542d055.ts} +1 -0
- package/test/if/components/temp/{IfElseIf-client-98d50d6f40c2385c4ef4fc02329f9d2e182c76c4.ts → IfElseIf-client-b92106861f0c7ec3d09e3a42bb93d8f5bd4e3bdf.ts} +5 -4
- package/test/if/components/temp/{IfElseIf-server-79788b13af905175f50bfa8658f2ff2af73db232.ts → IfElseIf-server-67991eee3f56dc687cda600511c31396438e0a77.ts} +1 -0
- package/test/{build-server/components/temp/IfNested-client-979db97eea5b4595550b9b46f297f3fbc31796d2.ts → if/components/temp/IfNested-client-f563ac1b16a2280e457557281c4925ed447a9cd7.ts} +5 -4
- package/test/{build-server/components/temp/IfNested-server-3c4e4b6f2162c0906cef685830219b9ea9ee985c.ts → if/components/temp/IfNested-server-0a2a9643324ab73b02b310cad61ba87dab146ab2.ts} +1 -0
- package/test/mount/components/Mount.torp +1 -1
- package/test/mount/components/output/Mount-client.ts +0 -2
- package/test/mount/components/output/Mount-server.ts +1 -1
- package/test/mount/components/temp/{Mount-client-49d8d6475336b5749fe8a17be847fd2b6cda5ccc.ts → Mount-client-36dbc95a61345a1b7dcf07e6b0c998af2afca691.ts} +0 -2
- package/test/mount/components/temp/{Mount-server-e3d689cf52a4477da9aa00e2c7604110710db991.ts → Mount-server-8bef1924a731f3db63cb827be3938fec685e53af.ts} +1 -1
- package/test/on-mount/components/output/OnMount-client.ts +0 -2
- package/test/on-mount/components/temp/{OnMount-client-b2dfd41a0aaeafb3b7af14793a03e0fc3bc43aaa.ts → OnMount-client-21708a638d2939ee8b017f5dc819cee4748bde87.ts} +0 -2
- package/test/party/13-emit-to-parent.test.ts +2 -3
- package/test/party/16-context.test.ts +1 -2
- package/test/party/17-input-text.test.ts +2 -3
- package/test/party/18-input-checkbox.test.ts +1 -2
- package/test/party/19-input-radio.test.ts +2 -3
- package/test/party/20-input-select.test.ts +3 -4
- package/test/party/7-event-click.test.ts +1 -3
- package/test/party/9-conditional.test.ts +2 -4
- package/test/party/components/ColorSelect.torp +1 -1
- package/test/party/components/InputFocused.torp +1 -1
- package/test/party/components/InputHello.torp +1 -1
- package/test/party/components/IsAvailable.torp +1 -1
- package/test/party/components/PickPill.torp +2 -2
- package/test/party/components/output/AnswerButton-client.ts +3 -2
- package/test/party/components/output/AnswerButton-server.ts +1 -0
- package/test/party/components/output/AnswerButtonApp-client.ts +4 -4
- package/test/party/components/output/AnswerButtonApp-server.ts +1 -1
- package/test/party/components/output/ColorSelect-client.ts +1 -1
- package/test/party/components/output/Colors-client.ts +1 -1
- package/test/party/components/output/Counter-client.ts +1 -1
- package/test/party/components/output/FunnyButton-client.ts +1 -1
- package/test/party/components/output/FunnyButtonApp-client.ts +2 -2
- package/test/party/components/output/FunnyButtonApp-server.ts +1 -1
- package/test/party/components/output/InputFocused-client.ts +0 -2
- package/test/party/components/output/InputFocused-server.ts +1 -1
- package/test/party/components/output/InputHello-client.ts +1 -1
- package/test/party/components/output/IsAvailable-client.ts +1 -1
- package/test/party/components/output/PickPill-client.ts +2 -2
- package/test/party/components/output/TrafficLight-client.ts +6 -6
- package/test/party/components/output/UserProfile-client.ts +5 -4
- package/test/party/components/output/UserProfile-server.ts +1 -0
- package/test/party/components/output/UserProfileApp-client.ts +3 -2
- package/test/party/components/output/UserProfileApp-server.ts +1 -1
- package/test/party/components/output/UserProfileContext-client.ts +3 -3
- package/test/party/components/output/UserProfileContextApp-client.ts +2 -2
- package/test/party/components/output/UserProfileContextApp-server.ts +1 -1
- package/test/party/components/temp/{AnswerButton-client-243454cd7bf84c648f244b3587e60d01a0401039.ts → AnswerButton-client-c3dc7edbfff2db1ea111086002147d771ee12193.ts} +3 -2
- package/test/party/components/temp/{AnswerButton-server-938e46c1d2510ea37454854ef527e4aa64eb8e52.ts → AnswerButton-server-427442fa8cfc0a18817c2d37f9cb5cbcb3a88a05.ts} +1 -0
- package/test/party/components/temp/{AnswerButtonApp-client-34311c2e7412807867fb6267af31a341f092bf31.ts → AnswerButtonApp-client-3e0b63a6bbc1dee3e6cb715c0297cc2ce58d3e4e.ts} +4 -4
- package/test/party/components/temp/{AnswerButtonApp-server-3f5071775abea24ee8830830072c6fe465fc4e56.ts → AnswerButtonApp-server-bbc8bb739d2060ccda77ce406aa6b15d8f90b91c.ts} +1 -1
- package/test/party/components/temp/{ColorSelect-client-f9fb9fa09f4729da3226d5aaf30e84cd3cd705b5.ts → ColorSelect-client-5ffa6f9d77de967993088c9a01b9f976f3333176.ts} +1 -1
- package/test/party/components/temp/{Colors-client-f124162d1dd8f0c3d37bf96c8e5f18599ae3a682.ts → Colors-client-3dafffc5c2a72037f4419fc45d08963872a29958.ts} +1 -1
- package/test/party/components/temp/{Counter-client-c349710110b4afbf9593f20cfc40c162ed836079.ts → Counter-client-4d553521fcfc6c9a4e05dce89e70b2ecf8785c4e.ts} +1 -1
- package/test/party/components/temp/{FunnyButton-client-2e6bec8259065b5bc9ae16d1ca93dd1bd0c56b7c.ts → FunnyButton-client-45f2c5dd56f2cdb80102193a978df6b0cec822ab.ts} +1 -1
- package/test/party/components/temp/{FunnyButtonApp-client-4ed0ebf5be13ddb62d9942bac7f4b8a885ec6c50.ts → FunnyButtonApp-client-ac7101af922dc6ba472b75a428f340caca6be74a.ts} +2 -2
- package/test/party/components/temp/{FunnyButtonApp-server-9748c9096848e643c91237c46ea09d23f1b3fa7c.ts → FunnyButtonApp-server-f1a98a946e0bb9d1bb76b01e26d6ead8f55d32bb.ts} +1 -1
- package/test/party/components/temp/{InputFocused-client-a543f82c8db205fb3e33c62de699cff43c668a68.ts → InputFocused-client-11a9cb08909b26945bbc2451ab4c1dac09e6d113.ts} +0 -2
- package/test/party/components/temp/{InputFocused-server-222f2fa7029d1cd6941a3777293a9b2d37b7295e.ts → InputFocused-server-82be1a63c80d1dd3f06efaf0bef349d58cf1d9af.ts} +1 -1
- package/test/party/components/temp/{InputHello-client-9953499de5778bb1d8aac7691129210a6098db07.ts → InputHello-client-b0453caeae0d43dc1878039c6b49318d12624d48.ts} +1 -1
- package/test/party/components/temp/{IsAvailable-client-929ed6c872e72b6c5243b882c6a9a0d13f6a7c47.ts → IsAvailable-client-d789346a68b26fd3f5d9f7aebc4c7bd181c47cad.ts} +1 -1
- package/test/party/components/temp/{PickPill-client-f9a50a75ce63ec2ee3ac34e378e20602b93629f7.ts → PickPill-client-b47d371ae5f41d87c96b3cdeed0a8bc06fbfa9c7.ts} +2 -2
- package/test/party/components/temp/{TrafficLight-client-81dd9bd9f3332533e01f6c9b271c15e5f76e1fdb.ts → TrafficLight-client-549f9fe3418c113fb240cfa17e09c42e1e7f346a.ts} +6 -6
- package/test/party/components/temp/{UserProfile-client-938bcef20a2555de22aca939022a32742ac5e729.ts → UserProfile-client-2c13aac1ad915e51dc557f9af765669e636c0fea.ts} +5 -4
- package/test/party/components/temp/{UserProfile-server-9df5c59b8797fa67c479bc76450104d45e6076f9.ts → UserProfile-server-cc1162a4297f6163bfb86e7a8aeea08e8c0625c6.ts} +1 -0
- package/test/party/components/temp/{UserProfileApp-client-af27173415d65647cab0f30a9a4967cef0307e25.ts → UserProfileApp-client-2be7a11319cca4d7bfa0f3d2205c441d7e203780.ts} +3 -2
- package/test/party/components/temp/{UserProfileApp-server-6a7dbe68ee8041785cef50fb15a9e5ba475e120f.ts → UserProfileApp-server-ab9ff66f787f775aa8571314fee8bcbef85489ef.ts} +1 -1
- package/test/party/components/temp/{UserProfileContext-client-93211cdba795b8baf926f60f5b17da90701743b3.ts → UserProfileContext-client-2aa36f436a5f20614d77f48963ec5ca442eebd90.ts} +3 -3
- package/test/party/components/temp/{UserProfileContextApp-client-7ea7d90a35894408757aef3e935d3a8badf93aea.ts → UserProfileContextApp-client-5099052fdcd8fb4c368c45090390947424a4e9b0.ts} +2 -2
- package/test/party/components/temp/{UserProfileContextApp-server-90290c770529d7211eabf29e7d0fe868aa856b52.ts → UserProfileContextApp-server-6be8dab2ed4f8911f26bef137e7dea164f2b894d.ts} +1 -1
- package/test/props/components/Reactive.torp +18 -0
- package/test/props/components/output/Reactive-client.ts +70 -0
- package/test/props/components/output/Reactive-server.ts +40 -0
- package/test/props/components/temp/Reactive-client-e3e5f6ee2f22c46337c6ab1df2f241133c7e2646.ts +70 -0
- package/test/props/components/temp/Reactive-server-0914d91287a1bc6d32d7cc56d086624762dbfc04.ts +40 -0
- package/test/props/reactive.test.ts +40 -0
- package/test/replace/components/output/Replace-client.ts +3 -2
- package/test/replace/components/output/Replace-server.ts +1 -0
- package/test/replace/components/temp/{Replace-client-ea4ddc73c71181fb6ef3c6f5bf61b0b9e017f00a.ts → Replace-client-3fdab63871fa4bb792317caefd3539b1888325b1.ts} +3 -2
- package/test/replace/components/temp/{Replace-server-30eb1ad796516fa4d310798a9c8a6811ec13cbd9.ts → Replace-server-857aca7a58deffc3a1c95ab9d31628b4051ca203.ts} +1 -0
- package/test/slots/components/output/Article-client.ts +2 -2
- package/test/slots/components/output/Basic-client.ts +1 -1
- package/test/slots/components/output/Basic-server.ts +1 -1
- package/test/slots/components/output/Let-client.ts +4 -3
- package/test/slots/components/output/Let-server.ts +2 -1
- package/test/slots/components/output/List-client.ts +1 -1
- package/test/slots/components/output/List-server.ts +1 -0
- package/test/slots/components/output/Named-client.ts +2 -2
- package/test/slots/components/output/Named-server.ts +1 -1
- package/test/slots/components/output/Unused-client.ts +1 -1
- package/test/slots/components/output/Unused-server.ts +1 -1
- package/test/slots/components/temp/{Article-client-741f94eab2e96655f4c9d69ccd7d9c7cc998f4ce.ts → Article-client-80848d6cadd8abac61865d14ddd35685844797e0.ts} +2 -2
- package/test/slots/components/temp/{Basic-client-c82bc3c5e10f2f2c1869347435262c8f3039e32f.ts → Basic-client-97b18686412869e8c814fd4542dfe826b1f7669f.ts} +1 -1
- package/test/slots/components/temp/{Basic-server-21fb4f8caa3bbcae219aaef388af8c26c46fa5ce.ts → Basic-server-248392e2cd147b537cd44e9a5a71885ef20102e4.ts} +1 -1
- package/test/slots/components/temp/{Let-client-c54696fd1b5b859a693744722957fa960f72fad6.ts → Let-client-be69c1f5aa32faf16239050d7836db46cfdcba2f.ts} +4 -3
- package/test/slots/components/temp/{Let-server-4d78ffc8741fa737f2cd915b36c0e6ec88a9146f.ts → Let-server-c3293219ed27aec61a6af36d451ddf6609c40027.ts} +2 -1
- package/test/slots/components/temp/{List-client-0659d999cfb48b865fe5b8aaaf2a4ddac3a8a8b6.ts → List-client-a829b33214de829de689a72d2e8703b2266ad7a4.ts} +1 -1
- package/test/slots/components/temp/{List-server-4b76485a259d054187edad8aa691d80ac918ad86.ts → List-server-06503834c9bfae9b8c2b61742568b020a3de961c.ts} +1 -0
- package/test/slots/components/temp/{Named-client-0626b2f0911f77f5edcfda82f9751bcbc37b7641.ts → Named-client-2d9d88f5fdf74d81c3ed1d769a476f4ac36c8b99.ts} +2 -2
- package/test/slots/components/temp/{Named-server-e802f901223d697c7fd0a1a234ce1930af1b4b3f.ts → Named-server-65a7bbf038111475c8f07dccb34040ab8c1392c4.ts} +1 -1
- package/test/slots/components/temp/{Unused-client-aa05465731e0d00e18189498f49c94f991e76f10.ts → Unused-client-1b16491cb800bbbbd871d9fbf5966c7275244019.ts} +1 -1
- package/test/slots/components/temp/{Unused-server-00b92d14665a565f0042b1f56231f28bc38a1252.ts → Unused-server-e5d1e85116bebc7e1a2882cb8f2c9ae7975a1de7.ts} +1 -1
- package/test/special-component/components/output/Component-client.ts +5 -4
- package/test/special-component/components/output/Component-server.ts +3 -2
- package/test/special-component/components/temp/{Component-client-3cc84b23def8830b8ef441bde0f03b3e9718196a.ts → Component-client-22f7e1d0955fb3d90939e956a1f0f77118c259b6.ts} +5 -4
- package/test/special-component/components/temp/{Component-server-5dc597784ea1fe45ac2cfb21305cf2187a3868e8.ts → Component-server-ce596cd84dc11f67c9f0588060a5b672eddf9715.ts} +3 -2
- package/test/special-element/components/output/Element-client.ts +2 -1
- package/test/special-element/components/output/Element-server.ts +1 -0
- package/test/special-element/components/temp/{Element-client-0ab8992a8e914c7e190cddac790585fef9be1c9f.ts → Element-client-21c92c04579b1d29e8813265a10897d069aad5c5.ts} +2 -1
- package/test/special-element/components/temp/{Element-server-ddb0170df4a3f369577ca7e9768e5fe799f14dfb.ts → Element-server-4bed9653529f39e72754126147fe8618f328853a.ts} +1 -0
- package/test/special-self/components/output/Self-client.ts +3 -2
- package/test/special-self/components/output/Self-server.ts +1 -0
- package/test/special-self/components/temp/{Self-client-3982f174954034643c4d17cfc66d7f10bf1d4df6.ts → Self-client-911c67194be1fdd997537310bcafe712161e8251.ts} +3 -2
- package/test/special-self/components/temp/{Self-server-97ffbdaae47f4463034e1d318a8073d078ff138f.ts → Self-server-49ba9be1f6255dd4daf490c640f5222a85960218.ts} +1 -0
- package/test/style/components/output/Style-client.ts +2 -1
- package/test/style/components/output/Style-server.ts +1 -0
- package/test/style/components/temp/{Style-client-085517e82bdd015c86f4c2577447c6a2791cf656.ts → Style-client-cbfac1e255c33a867ccbd5f9d1484a855d91a2d7.ts} +2 -1
- package/test/style/components/temp/{Style-server-b2615163fbafdcb2a5d4155120edf2f66ef3bba6.ts → Style-server-763d82ee2296be3f7620814aed950b505329c04c.ts} +1 -0
- package/test/svg/components/output/Shape-client.ts +4 -3
- package/test/svg/components/output/Shape-server.ts +1 -0
- package/test/svg/components/temp/{Shape-client-ea698ed1b7d0c3615adff35fa4956f22840f5fda.ts → Shape-client-cb98b36ab2a0d9f06b484a3c988fb43c3a71a4a0.ts} +4 -3
- package/test/svg/components/temp/{Shape-server-eb32049cfb7c058b2c4079c5f86ef00651ff6d69.ts → Shape-server-500d7fe4556026234ce5379b8e90595ddd094edc.ts} +1 -0
- package/test/switch/components/output/Switch-client.ts +5 -4
- package/test/switch/components/output/Switch-server.ts +1 -0
- package/test/switch/components/temp/{Switch-client-4c4adac7308795807517e66bc268a38f87df6bda.ts → Switch-client-9980de45e3346b79525c445edec7cbc3b375e8a4.ts} +5 -4
- package/test/switch/components/temp/{Switch-server-21fcac2b02c6071136bb0dc394babd27e454d2c9.ts → Switch-server-1c5690726f28008bb565966af69b6e4e019dea82.ts} +1 -0
- package/test/text/components/output/Text-client.ts +3 -2
- package/test/text/components/output/Text-server.ts +1 -0
- package/test/text/components/temp/{Text-client-9840092be1b4552ddce6e5efc2f1b395637a0a3d.ts → Text-client-63f1d3bf9b3bd145c7ce7058716640e27144055e.ts} +3 -2
- package/test/text/components/temp/{Text-server-6774aa9d4ccce941224ba0a8fb1d3e42eb31807e.ts → Text-server-9d3dd6f51e893e63c1999ceafce19ca1697d76ea.ts} +1 -0
- package/test/watch-array/components/output/Array-client.ts +4 -3
- package/test/watch-array/components/output/Array-server.ts +1 -0
- package/test/watch-array/components/output/ArrayEntries-client.ts +4 -3
- package/test/watch-array/components/output/ArrayEntries-server.ts +1 -0
- package/test/watch-array/components/output/ArrayIndexes-client.ts +4 -3
- package/test/watch-array/components/output/ArrayIndexes-server.ts +1 -0
- package/test/watch-array/components/output/ArrayUnkeyed-client.ts +4 -3
- package/test/watch-array/components/output/ArrayUnkeyed-server.ts +1 -0
- package/test/watch-array/components/temp/{Array-client-b29a42f88c2a2f37b3a86bdb9535e20a487887e1.ts → Array-client-ffd82188a45877d74053c82fb3616e4aed0fc2ad.ts} +4 -3
- package/test/watch-array/components/temp/{Array-server-ced54fc7e63196f9c24c2e55b27bfe6cf7821dcb.ts → Array-server-3715e815af887e8487b214e7de324850fe99e312.ts} +1 -0
- package/test/watch-array/components/temp/{ArrayEntries-client-6289890758b1f6b462a74417e0b9e2e46d946ccd.ts → ArrayEntries-client-b6e982660628576061dbb44539e970b9549bdcfa.ts} +4 -3
- package/test/watch-array/components/temp/{ArrayEntries-server-0429a18ffbe39afe87612889a3010c3fcaa601dc.ts → ArrayEntries-server-85cbe80fbb7f6885287825e2cc0dfc1cb9835d79.ts} +1 -0
- package/test/watch-array/components/temp/{ArrayIndexes-client-fe4b1c49f442b3e5411f331c52ae6c5ab38f2b2d.ts → ArrayIndexes-client-39337aa43bd8c10a53db836c3be233d48dd39b91.ts} +4 -3
- package/test/watch-array/components/temp/{ArrayIndexes-server-20c01f10832f035b007f85a423778934d51a703a.ts → ArrayIndexes-server-ec623c724af0c7212675d61ea68e9dee87f96caa.ts} +1 -0
- package/test/watch-array/components/temp/{ArrayUnkeyed-client-3fffe2ce749ee84e0730130bfd730d432e3c4e12.ts → ArrayUnkeyed-client-7606f9a6a221c8cf6a8b51e4895d10a3d7bccc11.ts} +4 -3
- package/test/watch-array/components/temp/{ArrayUnkeyed-server-0ab804a5e7bf5b47594d85adab79735e89a3939d.ts → ArrayUnkeyed-server-db21cd576a4c70973abe10f6c8ef5cecb3ead86c.ts} +1 -0
- package/test/watch-object/components/output/Watched-client.ts +2 -1
- package/test/watch-object/components/output/Watched-server.ts +1 -0
- package/test/watch-object/components/temp/{Watched-client-cb293038cd0a39043d05639c624a17d512419c25.ts → Watched-client-bbffbf2cede1a5c071b770670eb39c0f0be725af.ts} +2 -1
- package/test/watch-object/components/temp/{Watched-server-4884585cf4f50493a70631909f2230153531208e.ts → Watched-server-0252addaf92fb0f0c1e2937f42918a1c9f31d196.ts} +1 -0
- package/src/render/flushMountEffects.ts +0 -8
- package/test/if/components/temp/IfNested-client-979db97eea5b4595550b9b46f297f3fbc31796d2.ts +0 -90
- package/test/if/components/temp/IfNested-server-3c4e4b6f2162c0906cef685830219b9ea9ee985c.ts +0 -30
package/dist/compile.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/compile/utils/Builder.ts","../src/compile/types/comments.ts","../src/compile/utils/trimQuotes.ts","../src/compile/build/utils/isReactive.ts","../src/compile/build/client/buildFragmentText.ts","../src/compile/types/nodes/isSpecialNode.ts","../src/compile/utils/trimMatched.ts","../src/compile/build/utils/isFullyReactive.ts","../src/compile/build/utils/nextVarName.ts","../src/compile/build/client/buildAddFragment.ts","../src/compile/parse/utils/isSpaceChar.ts","../src/compile/parse/utils/isSpace.ts","../src/compile/types/nodes/isControlNode.ts","../src/compile/types/nodes/isElementNode.ts","../src/compile/types/nodes/isTextNode.ts","../src/compile/build/utils/isReactiveAttribute.ts","../src/compile/build/client/buildFragment.ts","../src/compile/build/client/replaceForVarNames.ts","../src/compile/build/client/buildRun.ts","../src/compile/build/client/buildComponentNode.ts","../src/compile/build/client/buildAwaitNode.ts","../src/compile/utils/trimEnd.ts","../src/compile/build/client/buildForNode.ts","../src/compile/build/client/buildHtmlNode.ts","../src/compile/build/client/buildIfNode.ts","../src/compile/build/client/buildReplaceNode.ts","../src/compile/build/client/buildScriptNode.ts","../src/compile/build/client/buildSwitchNode.ts","../src/compile/build/client/buildControlNode.ts","../src/compile/build/client/buildMount.ts","../src/compile/build/client/buildElementNode.ts","../src/compile/build/client/buildRootNode.ts","../src/compile/build/client/buildHeadNode.ts","../src/compile/build/client/buildSlotNode.ts","../src/compile/build/client/buildSpecialNode.ts","../src/compile/build/client/buildTextNode.ts","../src/compile/build/client/buildNode.ts","../src/compile/build/client/buildCode.ts","../src/compile/build/client/buildStyles.ts","../src/compile/build/server/buildServerComponentNode.ts","../src/compile/build/server/buildServerAwaitNode.ts","../src/compile/build/server/buildServerForNode.ts","../src/compile/build/server/buildServerHtmlNode.ts","../src/compile/build/server/buildServerIfNode.ts","../src/compile/build/server/buildServerReplaceNode.ts","../src/compile/build/server/buildServerScriptNode.ts","../src/compile/build/server/buildServerSwitchNode.ts","../src/compile/build/server/buildServerControlNode.ts","../src/compile/utils/voidTags.ts","../src/compile/build/server/buildServerElementNode.ts","../src/compile/build/server/buildServerRootNode.ts","../src/compile/build/server/buildServerSlotNode.ts","../src/compile/build/server/buildServerSpecialNode.ts","../src/compile/build/server/buildServerTextNode.ts","../src/compile/build/server/buildServerNode.ts","../src/compile/build/server/buildServerCode.ts","../src/compile/build.ts","../src/compile/buildType.ts","../src/compile/types/nodes/isSpaceNode.ts","../src/compile/parse/utils/consumeSpace.ts","../src/compile/parse/addSpaceElement.ts","../src/compile/utils/trimStart.ts","../src/compile/parse/utils/accept.ts","../src/compile/parse/parseInlineScript.ts","../src/compile/parse/utils/addError.ts","../src/compile/parse/parseControl.ts","../src/compile/parse/utils/isAlphaNumericChar.ts","../src/compile/parse/utils/consumeAlphaNumeric.ts","../src/compile/parse/utils/consumeUntil.ts","../src/compile/parse/parseTag.ts","../src/compile/parse/slottifyChildNodes.ts","../src/compile/parse/parseElement.ts","../src/compile/parse/parseMarkup.ts","../src/compile/utils/hash.ts","../src/compile/parse/utils/expect.ts","../src/compile/parse/parseStyles.ts","../src/compile/types/nodes/isParentNode.ts","../src/compile/parse/scopeStyles.ts","../src/compile/parse/parseCode.ts","../src/compile/parse.ts"],"sourcesContent":["export default class Builder {\n\t#text = \"\";\n\t#space = 0;\n\n\tprepend(text: string): void {\n\t\tthis.#text = text + \"\\n\" + this.#text;\n\t}\n\n\tappend(text: string): void {\n\t\ttext = text.trim();\n\t\tlet i = 0;\n\t\t//let newline = !!text.length && !text.endsWith(\"\\n\");\n\n\t\twhile (i < text.length) {\n\t\t\t// Skip spaces\n\t\t\twhile (text[i] === \" \" || text[i] === \"\\t\") {\n\t\t\t\ti++;\n\t\t\t}\n\t\t\tif (text[i] === \";\") {\n\t\t\t\t// HACK: we just set ; to ignore the line\n\t\t\t\ti++;\n\t\t\t} else if (text[i] === \"\\n\") {\n\t\t\t\tthis.#text += \"\\n\";\n\t\t\t} else {\n\t\t\t\t// Maybe outdent\n\t\t\t\tif (text[i] === \"}\" || text[i] === \")\" || text[i] === \"]\") {\n\t\t\t\t\tthis.#space -= 1;\n\t\t\t\t}\n\n\t\t\t\t// Add indentation\n\t\t\t\tthis.#text += \"\\t\".repeat(Math.max(0, this.#space));\n\t\t\t\t// Add from text until the next newline or the end of text\n\t\t\t\tconst start = i;\n\t\t\t\twhile (i < text.length && text[i] !== \"\\n\") {\n\t\t\t\t\t// Just add backticked text as-is\n\t\t\t\t\tif (text[i] === \"`\") {\n\t\t\t\t\t\ti++;\n\t\t\t\t\t\tlet level = 0;\n\t\t\t\t\t\twhile (i < text.length && !(text[i] === \"`\" && text[i - 1] !== \"\\\\\" && level === 0)) {\n\t\t\t\t\t\t\t// TODO: Need to do this in more places when skipping strings\n\t\t\t\t\t\t\tif (text[i] === \"{\" && (level > 0 || text[i - 1] === \"$\")) {\n\t\t\t\t\t\t\t\tlevel += 1;\n\t\t\t\t\t\t\t} else if (text[i] === \"}\" && level > 0) {\n\t\t\t\t\t\t\t\tlevel -= 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ti++;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\ti++;\n\t\t\t\t}\n\t\t\t\tconst line = text.substring(start, i + 1);\n\n\t\t\t\tif (line.startsWith(\"*\")) {\n\t\t\t\t\t// JSDoc\n\t\t\t\t\tthis.#text += \" \";\n\t\t\t\t}\n\t\t\t\tthis.#text += line;\n\n\t\t\t\t// Maybe indent\n\t\t\t\tif (text[i - 1] === \"{\" || text[i - 1] === \"(\" || text[i - 1] === \"[\") {\n\t\t\t\t\tthis.#space += 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\ti++;\n\t\t}\n\n\t\tif (!this.#text.endsWith(\"\\n\\n\")) {\n\t\t\tthis.#text += \"\\n\";\n\t\t}\n\t}\n\n\ttoString(): string {\n\t\treturn this.#text;\n\t}\n}\n","const ANCHOR_COMMENT = \"<!>\";\nconst HYDRATION_START_COMMENT = \"<![>\";\nconst HYDRATION_END_COMMENT = \"<!]>\";\nconst HYDRATION_BRANCH_COMMENT = \"<!^>\";\n\nexport { ANCHOR_COMMENT, HYDRATION_START_COMMENT, HYDRATION_END_COMMENT, HYDRATION_BRANCH_COMMENT };\n","/**\n * Trims matching quotes from the start and end of the supplied text\n *\n * @param text The text to trim\n *\n * @returns The text without the quotes at the start or the end\n */\nexport default function trimQuotes(text: string): string {\n\tlet start = 0;\n\tlet end = text.length;\n\twhile (\n\t\t(text[start] === \"'\" && text[end - 1] === \"'\") ||\n\t\t(text[start] === '\"' && text[end - 1] === '\"') ||\n\t\t(text[start] === \"`\" && text[end - 1] === \"`\")\n\t) {\n\t\tstart += 1;\n\t\tend -= 1;\n\t}\n\treturn text.substring(start, end);\n}\n","/**\n * Checks whether the supplied string is fully or partially reactive (i.e. contains braces)\n *\n * @param text The string to check\n *\n * @returns True if the supplied string is fully or partially reactive\n */\nexport default function isReactive(text: string): boolean {\n\t// TODO: Need to be more fancy (check that braces match, ignore comments and strings etc)\n\treturn text.includes(\"{\") && text.includes(\"}\");\n}\n","import { ANCHOR_COMMENT } from \"../../types/comments\";\nimport { type ControlNode } from \"../../types/nodes/ControlNode\";\nimport { type ElementNode } from \"../../types/nodes/ElementNode\";\nimport { type Fragment } from \"../../types/nodes/Fragment\";\nimport { type RootNode } from \"../../types/nodes/RootNode\";\nimport { type TemplateNode } from \"../../types/nodes/TemplateNode\";\nimport { type TextNode } from \"../../types/nodes/TextNode\";\nimport Builder from \"../../utils/Builder\";\nimport trimQuotes from \"../../utils/trimQuotes\";\nimport isReactive from \"../utils/isReactive\";\nimport { type BuildStatus } from \"./BuildStatus\";\n\n/**\n * Builds the HTML template text for all of the fragments in a component\n */\nexport default function buildFragmentText(\n\tnode: RootNode | ControlNode,\n\tstatus: BuildStatus,\n\tb: Builder,\n): void {\n\tconst fragments: Fragment[] = [];\n\tbuildNodeFragmentText(node, status, fragments);\n\n\tif (fragments.length) {\n\t\tb.append(`const t_fragments: DocumentFragment[] = [];`);\n\t}\n}\n\nfunction buildNodeFragmentText(\n\tnode: TemplateNode,\n\tstatus: BuildStatus,\n\tfragments: Fragment[],\n\tcurrentFragment?: Fragment,\n) {\n\tswitch (node.type) {\n\t\tcase \"root\": {\n\t\t\tbuildRootFragmentText(node as RootNode, status, fragments);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"control\": {\n\t\t\tbuildControlFragmentText(node as ControlNode, status, fragments, currentFragment!);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"component\": {\n\t\t\tbuildComponentFragmentText(node as ElementNode, status, fragments, currentFragment!);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"element\": {\n\t\t\t// NOTE: We don't support nested SVG for now\n\t\t\tlet ns = (node as ElementNode).tagName === \"svg\";\n\t\t\tif (ns) status.ns = true;\n\t\t\tbuildElementFragmentText(node as ElementNode, status, fragments, currentFragment!);\n\t\t\tif (ns) status.ns = false;\n\t\t\tbreak;\n\t\t}\n\t\tcase \"text\": {\n\t\t\tconst content = (node as TextNode).content;\n\t\t\tif (currentFragment) {\n\t\t\t\tcurrentFragment.text += isReactive(content) ? \"#\" : content;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \"special\": {\n\t\t\tbuildSpecialFragmentText(node as ElementNode, status, fragments, currentFragment!);\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nfunction buildRootFragmentText(node: RootNode, status: BuildStatus, fragments: Fragment[]) {\n\tnode.fragment = { number: fragments.length, text: \"\", ns: status.ns, events: [], animations: [] };\n\tfragments.push(node.fragment);\n\tfor (let child of node.children) {\n\t\tbuildNodeFragmentText(child, status, fragments, node.fragment);\n\t}\n}\n\nfunction buildControlFragmentText(\n\tnode: ControlNode,\n\tstatus: BuildStatus,\n\tfragments: Fragment[],\n\tcurrentFragment: Fragment,\n) {\n\tswitch (node.operation) {\n\t\tcase \"@if group\":\n\t\tcase \"@switch group\":\n\t\tcase \"@for group\":\n\t\tcase \"@await group\":\n\t\tcase \"@replace group\":\n\t\tcase \"@html group\": {\n\t\t\t// Add a placeholder if it's a branching control node\n\t\t\t//if (!node.singleRooted) {\n\t\t\tcurrentFragment.text += ANCHOR_COMMENT;\n\t\t\t//}\n\t\t\tfor (let child of node.children) {\n\t\t\t\tbuildNodeFragmentText(child, status, fragments, currentFragment);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\t// Add a new fragment if it's a control branch and it has children\n\t\t\tnode.fragment = {\n\t\t\t\tnumber: fragments.length,\n\t\t\t\ttext: \"\",\n\t\t\t\tns: status.ns,\n\t\t\t\tevents: [],\n\t\t\t\tanimations: [],\n\t\t\t};\n\t\t\tfragments.push(node.fragment);\n\t\t\tfor (let child of node.children) {\n\t\t\t\tbuildNodeFragmentText(child, status, fragments, node.fragment);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nfunction buildComponentFragmentText(\n\tnode: ElementNode,\n\tstatus: BuildStatus,\n\tfragments: Fragment[],\n\tcurrentFragment: Fragment,\n) {\n\tcurrentFragment.text += ANCHOR_COMMENT;\n\n\t// Add fragments for slots if there are children\n\tif (node.children.length) {\n\t\tnode.fragment = {\n\t\t\tnumber: fragments.length,\n\t\t\ttext: \"\",\n\t\t\tns: status.ns,\n\t\t\tevents: [],\n\t\t\tanimations: [],\n\t\t};\n\t\tfragments.push(node.fragment);\n\t\tfor (let child of node.children) {\n\t\t\t// TODO: Make sure it's not a :fill node\n\t\t\tbuildNodeFragmentText(child, status, fragments, node.fragment);\n\t\t}\n\t}\n}\n\nfunction buildElementFragmentText(\n\tnode: ElementNode,\n\tstatus: BuildStatus,\n\tfragments: Fragment[],\n\tcurrentFragment: Fragment,\n) {\n\tlet needsClass = node.scopeStyles;\n\tcurrentFragment.text += `<${node.tagName}`;\n\tlet attributesText = node.attributes\n\t\t.filter((a) => !a.name.startsWith(\"on\") && !a.name.includes(\":\"))\n\t\t.map((a) => {\n\t\t\tif (a.value && isReactive(a.value) && !a.name.includes(\":\")) {\n\t\t\t\t// Adding a placeholder for reactive attributes seems to speed things\n\t\t\t\t// up, especially in the case of data attributes. Otherwise don't set it\n\t\t\t\tif (a.name.startsWith(\"data-\")) {\n\t\t\t\t\treturn `${a.name}=\"\"`;\n\t\t\t\t}\n\t\t\t} else if (a.name === \"class\" && node.scopeStyles) {\n\t\t\t\tneedsClass = false;\n\t\t\t\tlet value = a.value\n\t\t\t\t\t? `\"${trimQuotes(a.value)} torp-${status.styleHash}\"`\n\t\t\t\t\t: `\"torp-${status.styleHash}\"`;\n\t\t\t\treturn `${a.name}=${value}`;\n\t\t\t} else {\n\t\t\t\treturn `${a.name}${a.value != null ? `=${a.value}` : \"\"}`;\n\t\t\t}\n\t\t})\n\t\t.filter(Boolean)\n\t\t.join(\" \");\n\tif (attributesText) {\n\t\tcurrentFragment.text += \" \" + attributesText;\n\t}\n\tif (needsClass) {\n\t\tcurrentFragment.text += ` class=\"torp-${status.styleHash}\"`;\n\t}\n\tcurrentFragment.text += \">\";\n\tfor (let child of node.children) {\n\t\tbuildNodeFragmentText(child, status, fragments, currentFragment);\n\t}\n\tcurrentFragment.text += `</${node.tagName}>`;\n}\n\nfunction buildSpecialFragmentText(\n\tnode: ElementNode,\n\tstatus: BuildStatus,\n\tfragments: Fragment[],\n\tcurrentFragment: Fragment,\n) {\n\tswitch (node.tagName) {\n\t\tcase \":slot\": {\n\t\t\t// Add an anchor for the slot\n\t\t\tcurrentFragment.text += ANCHOR_COMMENT;\n\t\t\tfor (let child of node.children) {\n\t\t\t\tbuildNodeFragmentText(child, status, fragments, node.fragment);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \":fill\": {\n\t\t\t// Add a new fragment for filled slot content\n\t\t\tnode.fragment = {\n\t\t\t\tnumber: fragments.length,\n\t\t\t\ttext: \"\",\n\t\t\t\tns: status.ns,\n\t\t\t\tevents: [],\n\t\t\t\tanimations: [],\n\t\t\t};\n\t\t\tfragments.push(node.fragment);\n\t\t\tfor (let child of node.children) {\n\t\t\t\tbuildNodeFragmentText(child, status, fragments, node.fragment);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \":element\": {\n\t\t\t// HACK: Just treat it as a component node as that does what we need for now\n\t\t\tbuildComponentFragmentText(node, status, fragments, currentFragment);\n\t\t\tbreak;\n\t\t}\n\t\tcase \":component\": {\n\t\t\tbuildComponentFragmentText(node, status, fragments, currentFragment);\n\t\t\tbreak;\n\t\t}\n\t\tcase \":head\": {\n\t\t\t// Don't need to do anything here\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\tthrow new Error(`Invalid special node: ${node.tagName}`);\n\t\t}\n\t}\n}\n","import { type ElementNode } from \"./ElementNode\";\nimport { type TemplateNode } from \"./TemplateNode\";\n\nexport default function isSpecialNode(node: TemplateNode): node is ElementNode {\n\treturn node.type === \"special\";\n}\n","/**\n * Trims chars from the start and end of the supplied text when both the start and end match\n *\n * @param text The text to trim\n *\n * @returns The text without the chars at the start or the end\n */\nexport default function trimMatched(text: string, startChar: string, endChar: string): string {\n\tlet start = 0;\n\tlet end = text.length;\n\twhile (text[start] === startChar && text[end - 1] === endChar) {\n\t\tstart += 1;\n\t\tend -= 1;\n\t}\n\treturn text.substring(start, end);\n}\n","/**\n * Checks whether the supplied string is fully reactive (i.e. starts and ends with braces)\n *\n * @param text The string to check\n *\n * @returns True if the supplied string is fully reactive\n */\nexport default function isFullyReactive(text: string): boolean {\n\t// TODO: Need to be more fancy (check that braces match, ignore comments and strings etc)\n\treturn text.trim().startsWith(\"{\") && text.trim().endsWith(\"}\");\n}\n","import { type BuildStatus } from \"../client/BuildStatus\";\nimport { type BuildServerStatus } from \"../server/BuildServerStatus\";\n\n/**\n * Makes a supplied variable name (hopefully!) unique by prepending `t_` and\n * appending a sequence number\n *\n * @param name The variable name\n * @param status The build status\n *\n * @returns A unique variable name\n */\nexport default function nextVarName(name: string, status: BuildStatus | BuildServerStatus): string {\n\tif (!status.varNames[name]) {\n\t\tstatus.varNames[name] = 1;\n\t}\n\tlet varName = `t_${name}_${status.varNames[name]}`;\n\tstatus.varNames[name] += 1;\n\treturn varName;\n}\n","import { type ControlNode } from \"../../types/nodes/ControlNode\";\nimport { type ElementNode } from \"../../types/nodes/ElementNode\";\nimport { type RootNode } from \"../../types/nodes/RootNode\";\nimport Builder from \"../../utils/Builder\";\nimport { type BuildStatus } from \"./BuildStatus\";\n\nexport default function buildAddFragment(\n\tnode: RootNode | ControlNode | ElementNode,\n\tstatus: BuildStatus,\n\tb: Builder,\n\tparentName: string,\n\tanchorName: string,\n): void {\n\tif (node.fragment) {\n\t\tconst fragment = node.fragment;\n\t\tconst fragmentName = `t_fragment_${fragment.number}`;\n\t\tstatus.imports.add(\"t_add_fragment\");\n\t\tb.append(`t_add_fragment(${fragmentName}, ${parentName}, ${anchorName});`);\n\t\t// TODO: Don't need to do this if the last thing we hydrated was the end node\n\t\tif (fragment.endVarName) {\n\t\t\tstatus.imports.add(\"t_next\");\n\t\t\tb.append(`t_next(${fragment.endVarName});`);\n\t\t}\n\t}\n}\n","/**\n * Checks whether the supplied character is a space\n *\n * @param text The string to check\n * @param index The index of the character in the string\n *\n * @returns True if the supplied character is a space\n */\nexport default function isSpaceChar(text: string, index: number): boolean {\n\tlet code = text.charCodeAt(index);\n\treturn code === 32 || (code >= 9 && code <= 13);\n}\n","import isSpaceChar from \"./isSpaceChar\";\n\n/**\n * Checks whether the supplied string contains only space characters\n *\n * @param text The string to check\n *\n * @returns True if the supplied string contains only space characters\n */\nexport default function isSpace(text: string): boolean {\n\tfor (let i = 0; i < text.length; i++) {\n\t\tif (!isSpaceChar(text, i)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n","import { type ControlNode } from \"./ControlNode\";\nimport { type TemplateNode } from \"./TemplateNode\";\n\nexport default function isControlNode(node: TemplateNode): node is ControlNode {\n\treturn node.type === \"control\";\n}\n","import { type ElementNode } from \"./ElementNode\";\nimport { type TemplateNode } from \"./TemplateNode\";\n\nexport default function isElementNode(node: TemplateNode): node is ElementNode {\n\treturn node.type === \"element\";\n}\n","import { type TemplateNode } from \"./TemplateNode\";\nimport { type TextNode } from \"./TextNode\";\n\nexport default function isTextNode(node: TemplateNode): node is TextNode {\n\treturn node.type === \"text\";\n}\n","import isFullyReactive from \"./isFullyReactive\";\nimport isReactive from \"./isReactive\";\n\n/**\n * Checks whether the supplied attribute is reactive (i.e. its name starts and\n * ends with braces, its value contains braces, or it's an event)\n *\n * @param name The attribute's name\n * @param value The attribute's value\n *\n * @returns True if the supplied attribute is reactive\n */\nexport default function isReactiveAttribute(name: string, value: string): boolean {\n\t// TODO: Better checking of whether an attribute is reactive\n\treturn isFullyReactive(name) || isReactive(value) || name.startsWith(\"on\");\n}\n","import isSpace from \"../../parse/utils/isSpace\";\nimport { type ControlNode } from \"../../types/nodes/ControlNode\";\nimport { type ElementNode } from \"../../types/nodes/ElementNode\";\nimport { type Fragment } from \"../../types/nodes/Fragment\";\nimport { type RootNode } from \"../../types/nodes/RootNode\";\nimport { type TemplateNode } from \"../../types/nodes/TemplateNode\";\nimport { type TextNode } from \"../../types/nodes/TextNode\";\nimport isControlNode from \"../../types/nodes/isControlNode\";\nimport isElementNode from \"../../types/nodes/isElementNode\";\nimport isTextNode from \"../../types/nodes/isTextNode\";\nimport Builder from \"../../utils/Builder\";\nimport trimQuotes from \"../../utils/trimQuotes\";\nimport isReactive from \"../utils/isReactive\";\nimport isReactiveAttribute from \"../utils/isReactiveAttribute\";\nimport nextVarName from \"../utils/nextVarName\";\nimport { type BuildStatus } from \"./BuildStatus\";\nimport buildNode from \"./buildNode\";\n\ninterface VariablePath {\n\tparent: VariablePath | null;\n\ttype: string;\n\tchildren: VariablePath[];\n}\n\n/**\n * Builds the variables and code in a fragment\n */\nexport default function buildFragment(\n\tnode: RootNode | ControlNode | ElementNode,\n\tstatus: BuildStatus,\n\tb: Builder,\n\tparentName: string,\n\tanchorName: string,\n): void {\n\tif (node.fragment) {\n\t\tconst fragment = node.fragment;\n\t\tconst fragmentName = `t_fragment_${fragment.number}`;\n\t\tif (status.options?.useCreateElement) {\n\t\t\t// Declarations, then createXxx calls\n\t\t\tlet fragmentPath = { parent: null, type: \"fragment\", children: [] };\n\t\t\tlet varPaths = new Map<string, string>();\n\t\t\tdeclareFragmentVars(\n\t\t\t\tnode.fragment,\n\t\t\t\tnode,\n\t\t\t\tfragmentPath,\n\t\t\t\tstatus,\n\t\t\t\tb,\n\t\t\t\tparentName,\n\t\t\t\tanchorName,\n\t\t\t\tvarPaths,\n\t\t\t\tfalse,\n\t\t\t\ttrue,\n\t\t\t);\n\n\t\t\tfragmentPath.children.length = 0;\n\t\t\tvarPaths.clear();\n\t\t\tstatus.imports.add(\"t_frg\");\n\t\t\tb.append(`const ${fragmentName} = t_frg([`);\n\t\t\tdeclareFragmentVars(\n\t\t\t\tnode.fragment,\n\t\t\t\tnode,\n\t\t\t\tfragmentPath,\n\t\t\t\tstatus,\n\t\t\t\tb,\n\t\t\t\tparentName,\n\t\t\t\tanchorName,\n\t\t\t\tvarPaths,\n\t\t\t\tfalse,\n\t\t\t\tfalse,\n\t\t\t);\n\t\t\tb.append(`]);`);\n\t\t} else {\n\t\t\t// Text, then declarations\n\t\t\tstatus.imports.add(\"t_fragment\");\n\t\t\tconst fragmentText = fragment.text.replaceAll(\"`\", \"\\\\`\").replaceAll(/\\s+/g, \" \");\n\t\t\tb.append(\n\t\t\t\t`const ${fragmentName} = t_fragment($parent.ownerDocument!, t_fragments, ${fragment.number}, \\`${fragmentText}\\`${fragment.ns ? \", true\" : \"\"});`,\n\t\t\t);\n\t\t\tlet fragmentPath = { parent: null, type: \"fragment\", children: [] };\n\t\t\tlet varPaths = new Map<string, string>();\n\t\t\tmaybeAddRootNodeDeclaration(node, fragment, fragmentName, status, b, varPaths);\n\t\t\tdeclareFragmentVars(\n\t\t\t\tnode.fragment,\n\t\t\t\tnode,\n\t\t\t\tfragmentPath,\n\t\t\t\tstatus,\n\t\t\t\tb,\n\t\t\t\tparentName,\n\t\t\t\tanchorName,\n\t\t\t\tvarPaths,\n\t\t\t\tfalse,\n\t\t\t\ttrue,\n\t\t\t);\n\t\t}\n\t}\n}\n\nfunction maybeAddRootNodeDeclaration(\n\tnode: RootNode | ControlNode | ElementNode,\n\tfragment: Fragment,\n\tfragmentName: string,\n\tstatus: BuildStatus,\n\tb: Builder,\n\tvarPaths: Map<string, string>,\n) {\n\tif (!node.children.length) return;\n\n\t// We need to store the root node of the fragment for subsequent updates of the fragment\n\t// But not if the node would be declared anyway\n\tlet firstNode = node.children[0];\n\tlet firstNodeIsLastNode = node.children.length === 1;\n\tif (\n\t\t(isControlNode(firstNode) && firstNode.operation.endsWith(\" group\")) ||\n\t\t(isElementNode(firstNode) &&\n\t\t\telementNodeNeedsDeclaration(firstNode, true, firstNodeIsLastNode)) ||\n\t\t(isTextNode(firstNode) && textNodeNeedsDeclaration(firstNode, true, firstNodeIsLastNode))\n\t) {\n\t\t// It's going to be declared later on\n\t} else {\n\t\tstatus.imports.add(\"t_root\");\n\t\tconst rootName = `t_root_${fragment.number}`;\n\t\tconst rootPath = `t_root(${fragmentName})`;\n\t\t// HACK: We don't know whether this variable will be used by other child\n\t\t// nodes, so we have to create it regardless and ignore the error if\n\t\t// it's not used -- maybe we could be smarter about this\n\t\tb.append(\"// @ts-ignore\");\n\t\tb.append(`const ${rootName} = ${rootPath};`);\n\t\tvarPaths.set(rootPath, rootName);\n\t\t//b.append(`console.log(\"${rootName}\", ${rootName}, ${rootName}.textContent);`);\n\t}\n}\n\nfunction declareFragmentVars(\n\tfragment: Fragment,\n\tnode: TemplateNode,\n\tpath: VariablePath,\n\tstatus: BuildStatus,\n\tb: Builder,\n\tparentName: string,\n\tanchorName: string,\n\tvarPaths: Map<string, string>,\n\tlastChild: boolean,\n\tdeclare: boolean,\n) {\n\tswitch (node.type) {\n\t\tcase \"root\": {\n\t\t\tdeclareRootFragmentVars(\n\t\t\t\tfragment,\n\t\t\t\tnode as RootNode,\n\t\t\t\tpath,\n\t\t\t\tstatus,\n\t\t\t\tb,\n\t\t\t\tparentName,\n\t\t\t\tanchorName,\n\t\t\t\tvarPaths,\n\t\t\t\tdeclare,\n\t\t\t);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"control\": {\n\t\t\tdeclareControlFragmentVars(\n\t\t\t\tfragment,\n\t\t\t\tnode as ControlNode,\n\t\t\t\tpath,\n\t\t\t\tstatus,\n\t\t\t\tb,\n\t\t\t\tparentName,\n\t\t\t\tanchorName,\n\t\t\t\tvarPaths,\n\t\t\t\tdeclare,\n\t\t\t);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"component\": {\n\t\t\tdeclareComponentFragmentVars(\n\t\t\t\tfragment,\n\t\t\t\tnode as ElementNode,\n\t\t\t\tpath,\n\t\t\t\tstatus,\n\t\t\t\tb,\n\t\t\t\tparentName,\n\t\t\t\tanchorName,\n\t\t\t\tvarPaths,\n\t\t\t\tdeclare,\n\t\t\t);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"element\": {\n\t\t\tdeclareElementFragmentVars(\n\t\t\t\tfragment,\n\t\t\t\tnode as ElementNode,\n\t\t\t\tpath,\n\t\t\t\tstatus,\n\t\t\t\tb,\n\t\t\t\tparentName,\n\t\t\t\tanchorName,\n\t\t\t\tvarPaths,\n\t\t\t\tlastChild,\n\t\t\t\tdeclare,\n\t\t\t);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"text\": {\n\t\t\tdeclareTextFragmentVars(\n\t\t\t\tfragment,\n\t\t\t\tnode as TextNode,\n\t\t\t\tpath,\n\t\t\t\tstatus,\n\t\t\t\tb,\n\t\t\t\tvarPaths,\n\t\t\t\tlastChild,\n\t\t\t\tdeclare,\n\t\t\t);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"special\": {\n\t\t\tdeclareSpecialFragmentVars(\n\t\t\t\tfragment,\n\t\t\t\tnode as ElementNode,\n\t\t\t\tpath,\n\t\t\t\tstatus,\n\t\t\t\tb,\n\t\t\t\tparentName,\n\t\t\t\tanchorName,\n\t\t\t\tvarPaths,\n\t\t\t\tlastChild,\n\t\t\t\tdeclare,\n\t\t\t);\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\tthrow new Error(`Invalid node type: ${node.type}`);\n\t\t}\n\t}\n}\n\nfunction declareRootFragmentVars(\n\tfragment: Fragment,\n\tnode: RootNode,\n\tpath: VariablePath,\n\tstatus: BuildStatus,\n\tb: Builder,\n\tparentName: string,\n\tanchorName: string,\n\tvarPaths: Map<string, string>,\n\tdeclare: boolean,\n) {\n\tfor (let [i, child] of node.children.entries()) {\n\t\tdeclareFragmentVars(\n\t\t\tfragment,\n\t\t\tchild,\n\t\t\tpath,\n\t\t\tstatus,\n\t\t\tb,\n\t\t\tparentName,\n\t\t\tanchorName,\n\t\t\tvarPaths,\n\t\t\ti === node.children.length - 1,\n\t\t\tdeclare,\n\t\t);\n\t}\n}\n\nfunction declareControlFragmentVars(\n\tfragment: Fragment,\n\tnode: ControlNode,\n\tpath: VariablePath,\n\tstatus: BuildStatus,\n\tb: Builder,\n\tparentName: string,\n\tanchorName: string,\n\tvarPaths: Map<string, string>,\n\tdeclare: boolean,\n) {\n\tswitch (node.operation) {\n\t\tcase \"@if group\":\n\t\tcase \"@switch group\":\n\t\tcase \"@for group\":\n\t\tcase \"@await group\":\n\t\tcase \"@replace group\":\n\t\tcase \"@html group\": {\n\t\t\tconst operation = node.operation.substring(1).replace(\" group\", \"\");\n\t\t\tdeclareParentAndAnchorFragmentVars(\n\t\t\t\tfragment,\n\t\t\t\tnode,\n\t\t\t\tpath,\n\t\t\t\tstatus,\n\t\t\t\tb,\n\t\t\t\tparentName,\n\t\t\t\tanchorName,\n\t\t\t\tvarPaths,\n\t\t\t\toperation,\n\t\t\t\tdeclare,\n\t\t\t);\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\tfor (let [i, child] of node.children.entries()) {\n\t\t\t\tdeclareFragmentVars(\n\t\t\t\t\tfragment,\n\t\t\t\t\tchild,\n\t\t\t\t\tpath,\n\t\t\t\t\tstatus,\n\t\t\t\t\tb,\n\t\t\t\t\tparentName,\n\t\t\t\t\tanchorName,\n\t\t\t\t\tvarPaths,\n\t\t\t\t\ti === node.children.length - 1,\n\t\t\t\t\tdeclare,\n\t\t\t\t);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nfunction declareComponentFragmentVars(\n\tfragment: Fragment,\n\tnode: ElementNode,\n\tpath: VariablePath,\n\tstatus: BuildStatus,\n\tb: Builder,\n\tparentName: string,\n\tanchorName: string,\n\tvarPaths: Map<string, string>,\n\tdeclare: boolean,\n) {\n\tdeclareParentAndAnchorFragmentVars(\n\t\tfragment,\n\t\tnode,\n\t\tpath,\n\t\tstatus,\n\t\tb,\n\t\tparentName,\n\t\tanchorName,\n\t\tvarPaths,\n\t\t\"comp\",\n\t\tdeclare,\n\t);\n}\n\nfunction elementTypeName(node: ElementNode) {\n\t// TODO: Etc\n\tswitch (node.tagName.toLowerCase()) {\n\t\tcase \"div\":\n\t\tcase \"input\":\n\t\t\treturn `HTML${node.tagName.substring(0, 1).toUpperCase() + node.tagName.substring(1)}Element`;\n\t\tcase \"textarea\":\n\t\t\treturn \"HTMLTextAreaElement\";\n\t}\n\treturn \"HTMLElement\";\n}\n\nfunction declareElementFragmentVars(\n\tfragment: Fragment,\n\tnode: ElementNode,\n\tpath: VariablePath,\n\tstatus: BuildStatus,\n\tb: Builder,\n\tparentName: string,\n\tanchorName: string,\n\tvarPaths: Map<string, string>,\n\tlastChild: boolean,\n\tdeclare: boolean,\n) {\n\tconst tagName = node.tagName === \":element\" ? \"element\" : node.tagName;\n\n\tlet elementPath = { parent: path, type: tagName, children: [] };\n\tpath.children.push(elementPath);\n\n\tconst topLevel = !path.parent;\n\tconst declareVariable = elementNodeNeedsDeclaration(node, topLevel, lastChild);\n\n\tif (declare) {\n\t\tif (declareVariable) {\n\t\t\tnode.varName = nextVarName(tagName, status);\n\t\t\tif (topLevel) {\n\t\t\t\tfragment.endVarName = node.varName;\n\t\t\t}\n\t\t\tconst varPath = getFragmentVarPath(fragment, status, node.varName, elementPath, varPaths);\n\t\t\tif (status.options?.useCreateElement) {\n\t\t\t\tb.append(`let ${node.varName};`);\n\t\t\t} else {\n\t\t\t\tif (node.tagName === \":element\") {\n\t\t\t\t\tb.append(`let ${node.varName} = ${varPath} as ${elementTypeName(node)};`);\n\t\t\t\t} else {\n\t\t\t\t\t// HACK: Not great\n\t\t\t\t\tif (topLevel && lastChild) {\n\t\t\t\t\t\tb.append(\"// @ts-ignore\");\n\t\t\t\t\t}\n\t\t\t\t\tb.append(`const ${node.varName} = ${varPath} as ${elementTypeName(node)};`);\n\t\t\t\t}\n\t\t\t\t//b.append(`console.log(\"${node.varName}\", ${node.varName}, ${node.varName}.textContent);`);\n\t\t\t}\n\t\t}\n\t}\n\n\t// If there is an immediate child of this element that has this element as its parent,\n\t// we need to assign the element to the parent var\n\t// @ts-ignore\n\tlet childParentName = node.children.find((c) => !!c.parentName)?.parentName;\n\n\tif (!declare) {\n\t\tlet attributes = node.attributes\n\t\t\t.filter((a) => !a.name.startsWith(\"on\") && !a.name.includes(\":\"))\n\t\t\t.map((a) => {\n\t\t\t\tif (a.value && isReactive(a.value)) {\n\t\t\t\t\t// Adding a placeholder for reactive attributes seems to speed things\n\t\t\t\t\t// up, especially in the case of data attributes\n\t\t\t\t\treturn `\"${a.name}\": \"#\"`;\n\t\t\t\t} else if (a.value) {\n\t\t\t\t\treturn `\"${a.name}\": \"${trimQuotes(a.value) || a.name}\"`;\n\t\t\t\t} else {\n\t\t\t\t\treturn `\"${a.name}\": true\"`;\n\t\t\t\t}\n\t\t\t})\n\t\t\t.join(\", \");\n\n\t\tstatus.imports.add(\"t_elm\");\n\t\tif (declareVariable) {\n\t\t\tb.append(\n\t\t\t\t`(${childParentName ? `${childParentName} = ` : \"\"}${node.varName} = t_elm(\"${node.tagName}\", {${attributes}}, [`,\n\t\t\t);\n\t\t} else if (childParentName) {\n\t\t\tb.append(`(${childParentName} = t_elm(\"${node.tagName}\", {${attributes}}, [`);\n\t\t} else {\n\t\t\tb.append(`t_elm(\"${node.tagName}\", {${attributes}}, [`);\n\t\t}\n\t}\n\n\tfor (let [i, child] of node.children.entries()) {\n\t\tdeclareFragmentVars(\n\t\t\tfragment,\n\t\t\tchild,\n\t\t\telementPath,\n\t\t\tstatus,\n\t\t\tb,\n\t\t\tparentName,\n\t\t\tanchorName,\n\t\t\tvarPaths,\n\t\t\ti === node.children.length - 1,\n\t\t\tdeclare,\n\t\t);\n\t}\n\n\tif (!declare) {\n\t\tif (declareVariable || childParentName) {\n\t\t\tb.append(\"])),\");\n\t\t} else {\n\t\t\tb.append(\"]),\");\n\t\t}\n\t}\n}\n\nfunction elementNodeNeedsDeclaration(node: ElementNode, topLevel: boolean, lastChild: boolean) {\n\tconst hasReactiveAttribute = node.attributes.some(\n\t\t(a) => a.value && isReactiveAttribute(a.name, a.value),\n\t);\n\tconst isDynamicElement =\n\t\tnode.tagName === \":element\" && node.attributes.find((a) => a.name === \"self\");\n\treturn hasReactiveAttribute || isDynamicElement || (topLevel && lastChild);\n}\n\nfunction declareTextFragmentVars(\n\tfragment: Fragment,\n\tnode: TextNode,\n\tpath: VariablePath,\n\tstatus: BuildStatus,\n\tb: Builder,\n\tvarPaths: Map<string, string>,\n\tlastChild: boolean,\n\tdeclare: boolean,\n) {\n\t// HACK: Text nodes get merged together\n\t// Is this because of control nodes like @key and @const??\n\t// TODO: We should do this when building for the server too\n\tconst lastType = path.children[path.children.length - 1]?.type;\n\tif (lastType === \"text\" || lastType === \"space\") {\n\t\treturn;\n\t}\n\n\tlet textPath = { parent: path, type: isSpace(node.content) ? \"space\" : \"text\", children: [] };\n\tpath.children.push(textPath);\n\n\tconst topLevel = !path.parent;\n\tconst declareVariable = textNodeNeedsDeclaration(node, topLevel, lastChild);\n\n\tif (declare) {\n\t\tif (declareVariable) {\n\t\t\tnode.varName = nextVarName(\"text\", status);\n\t\t\tif (topLevel) {\n\t\t\t\tfragment.endVarName = node.varName;\n\t\t\t}\n\t\t\tconst varPath = getFragmentVarPath(fragment, status, node.varName, textPath, varPaths);\n\t\t\tif (status.options?.useCreateElement) {\n\t\t\t\tb.append(`let ${node.varName};`);\n\t\t\t} else {\n\t\t\t\t// HACK: Not great\n\t\t\t\tif (topLevel && lastChild) {\n\t\t\t\t\tb.append(\"// @ts-ignore\");\n\t\t\t\t}\n\t\t\t\tb.append(`const ${node.varName} = ${varPath};`);\n\t\t\t\t//b.append(`console.log(\"${node.varName}\", ${node.varName}, ${node.varName}.textContent);`);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tstatus.imports.add(\"t_txt\");\n\t\tif (declareVariable) {\n\t\t\tb.append(`(${node.varName} = t_txt(\" \")),`);\n\t\t} else {\n\t\t\tb.append(`t_txt(\"${node.content}\"),`);\n\t\t}\n\t}\n}\n\nfunction textNodeNeedsDeclaration(node: TextNode, topLevel: boolean, lastChild: boolean) {\n\treturn isReactive(node.content) || (topLevel && lastChild);\n}\n\nfunction declareSpecialFragmentVars(\n\tfragment: Fragment,\n\tnode: ElementNode,\n\tpath: VariablePath,\n\tstatus: BuildStatus,\n\tb: Builder,\n\tparentName: string,\n\tanchorName: string,\n\tvarPaths: Map<string, string>,\n\tlastChild: boolean,\n\tdeclare: boolean,\n) {\n\tif (node.tagName === \":slot\") {\n\t\tdeclareParentAndAnchorFragmentVars(\n\t\t\tfragment,\n\t\t\tnode,\n\t\t\tpath,\n\t\t\tstatus,\n\t\t\tb,\n\t\t\tparentName,\n\t\t\tanchorName,\n\t\t\tvarPaths,\n\t\t\t\"slot\",\n\t\t\tdeclare,\n\t\t);\n\t}\n\n\tswitch (node.tagName) {\n\t\tcase \":slot\":\n\t\tcase \":fill\": {\n\t\t\tfor (let [i, child] of node.children.entries()) {\n\t\t\t\tdeclareFragmentVars(\n\t\t\t\t\tfragment,\n\t\t\t\t\tchild,\n\t\t\t\t\tpath,\n\t\t\t\t\tstatus,\n\t\t\t\t\tb,\n\t\t\t\t\tparentName,\n\t\t\t\t\tanchorName,\n\t\t\t\t\tvarPaths,\n\t\t\t\t\ti === node.children.length - 1,\n\t\t\t\t\tdeclare,\n\t\t\t\t);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \":element\": {\n\t\t\tdeclareElementFragmentVars(\n\t\t\t\tfragment,\n\t\t\t\tnode,\n\t\t\t\tpath,\n\t\t\t\tstatus,\n\t\t\t\tb,\n\t\t\t\tparentName,\n\t\t\t\tanchorName,\n\t\t\t\tvarPaths,\n\t\t\t\tlastChild,\n\t\t\t\tdeclare,\n\t\t\t);\n\t\t\tbreak;\n\t\t}\n\t\tcase \":component\": {\n\t\t\tdeclareComponentFragmentVars(\n\t\t\t\tfragment,\n\t\t\t\tnode,\n\t\t\t\tpath,\n\t\t\t\tstatus,\n\t\t\t\tb,\n\t\t\t\tparentName,\n\t\t\t\tanchorName,\n\t\t\t\tvarPaths,\n\t\t\t\tdeclare,\n\t\t\t);\n\t\t\tbreak;\n\t\t}\n\t\tcase \":head\": {\n\t\t\t// Don't need to do anything here\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\tthrow new Error(`Invalid special node: ${node.tagName}`);\n\t\t}\n\t}\n}\n\nfunction declareParentAndAnchorFragmentVars(\n\tfragment: Fragment,\n\tnode: ControlNode | ElementNode,\n\tpath: VariablePath,\n\tstatus: BuildStatus,\n\tb: Builder,\n\tparentName: string,\n\tanchorName: string,\n\tvarPaths: Map<string, string>,\n\tname: string,\n\tdeclare: boolean,\n) {\n\tconst topLevel = !path.parent;\n\n\t// Declare the parent\n\tif (topLevel) {\n\t\t// If this is a top-level element, then the parent is the fragment\n\t\tnode.parentName = `t_fragment_${fragment.number}`;\n\t} else {\n\t\tconst parentPath = path;\n\t\tconst oldChildren = parentPath.children;\n\t\tparentPath.children = [];\n\t\tconst parentVarPath = getFragmentVarPath(fragment, status, \"?\", parentPath, varPaths);\n\t\tparentPath.children = oldChildren;\n\t\t// TODO: Should do this thing for the last child as well\n\t\tif (varPaths.has(parentVarPath)) {\n\t\t\tnode.parentName = varPaths.get(parentVarPath);\n\t\t} else {\n\t\t\tif (declare) {\n\t\t\t\tnode.parentName = nextVarName(`${name}_parent`, status);\n\t\t\t\tif (status.options?.useCreateElement) {\n\t\t\t\t\tb.append(`let ${node.parentName} as HTMLElement;`);\n\t\t\t\t} else {\n\t\t\t\t\tb.append(`const ${node.parentName} = ${parentVarPath} as HTMLElement;`);\n\t\t\t\t}\n\t\t\t\tvarPaths.set(parentVarPath, node.parentName);\n\t\t\t} else {\n\t\t\t\t// HACK: For the createElement option, this gets done in the parent\n\t\t\t}\n\t\t}\n\t}\n\n\t// Declare the anchor\n\tif (declare) {\n\t\tconst anchorPath = { parent: path, type: \"#\", children: [] };\n\t\tpath.children.push(anchorPath);\n\n\t\tnode.varName = nextVarName(`${name}_anchor`, status);\n\t\tconst anchorVarPath = getFragmentVarPath(fragment, status, node.varName, anchorPath, varPaths);\n\t\tif (status.options?.useCreateElement) {\n\t\t\tb.append(`let ${node.varName};`);\n\t\t} else {\n\t\t\tstatus.imports.add(\"t_anchor\");\n\t\t\tb.append(`const ${node.varName} = t_anchor(${anchorVarPath}) as HTMLElement;`);\n\t\t\t//b.append(`console.log(\"${node.varName}\", ${node.varName}, ${node.varName}.textContent);`);\n\t\t}\n\t} else {\n\t\tstatus.imports.add(\"t_cmt\");\n\t\tb.append(`(${node.varName} = t_cmt()),`);\n\t}\n\n\t// Build nodes with anchors immediately, while we have their anchor node,\n\t// rather than at the end of the fragment\n\tbuildNode(node, status, b, parentName, anchorName);\n\tnode.handled = true;\n}\n\nfunction getFragmentVarPath(\n\tfragment: Fragment,\n\tstatus: BuildStatus,\n\tname: string,\n\tpath: VariablePath,\n\tvarPaths: Map<string, string>,\n): string {\n\tlet node = path;\n\twhile (node.parent) {\n\t\tnode = node.parent;\n\t}\n\tlet varName = `t_fragment_${fragment.number}`;\n\tlet varPath = getFragmentVarPathPart(node, varName, status, true);\n\n\t// Check for parts of the path that have already been run to shorten our\n\t// traversal\n\tfor (let [existingPath, existingName] of varPaths) {\n\t\tif (varPath.includes(existingPath)) {\n\t\t\tvarPath = varPath.replace(existingPath, existingName);\n\t\t}\n\t}\n\n\t// HACK: allow passing in \"?\" to not add the parentVarPath to the existing\n\t// paths\n\tif (name !== \"?\") {\n\t\t// Add the path, so that we can shorten subsequent paths e.g.\n\t\t// const div = t_next(t_child(root));\n\t\t// const p = t_next(t_next(t_next(t_child(root)))) => t_next(t_next(div))\n\t\tvarPaths.set(varPath, name);\n\t\t// Add the name, so that we are always using the last declared name\n\t\tvarPaths.set(name, name);\n\t}\n\n\treturn varPath;\n}\n\nfunction getFragmentVarPathPart(\n\tpath: VariablePath,\n\tvarPath: string,\n\tstatus: BuildStatus,\n\troot = false,\n): string {\n\tif (root) {\n\t\tstatus.imports.add(\"t_root\");\n\t\tvarPath = `t_root(${varPath})`;\n\t} else {\n\t\tstatus.imports.add(\"t_child\");\n\t\tvarPath = `t_child(${varPath})`;\n\t}\n\tfor (let [i, child] of path.children.entries()) {\n\t\tif (i > 0) {\n\t\t\tstatus.imports.add(\"t_next\");\n\t\t\tvarPath = `t_next(${varPath})`;\n\t\t}\n\n\t\tif (i === path.children.length - 1 && child.children.length) {\n\t\t\tvarPath = getFragmentVarPathPart(child, varPath, status);\n\t\t}\n\t}\n\treturn varPath;\n}\n\n/*\nfunction printPath(path: VariablePath) {\n\tlet parent = path;\n\twhile (parent.parent) {\n\t\tparent = parent.parent;\n\t}\n\tprintPathPart(parent);\n}\n\nfunction printPathPart(path: VariablePath, indent = 0) {\n\tconsole.log(`${\" \".repeat(indent * 2)}${path.type}`);\n\tfor (let child of path.children) {\n\t\tprintPathPart(child, indent + 1);\n\t}\n}\n*/\n","import type { BuildStatus } from \"./BuildStatus\";\n\n/**\n * Variables used within a for loop need to be retrieved from the loop data.\n */\nexport default function replaceForVarNames(value: string, status: BuildStatus): string {\n\t// HACK: If a value from a for loop is used in the function body,\n\t// get it from the loop data to trigger an update when it is changed\n\tfor (let varName of status.forVarNames) {\n\t\tvalue = value.replaceAll(\n\t\t\tnew RegExp(`(^|\\\\s|\\\\(|\\\\[|\\\\{)${varName}($|\\\\s|\\\\.|\\\\(|\\\\)|\\\\[|\\\\]|\\\\}|;)`, \"g\"),\n\t\t\t`$1t_item.data.${varName}$2`,\n\t\t);\n\t}\n\treturn value;\n}\n","import Builder from \"../../utils/Builder\";\nimport { type BuildStatus } from \"./BuildStatus\";\nimport replaceForVarNames from \"./replaceForVarNames\";\n\nexport default function buildRun(\n\tfunctionName: string,\n\tfunctionBody: string,\n\tstatus: BuildStatus,\n\tb: Builder,\n): void {\n\tfunctionBody = replaceForVarNames(functionBody, status);\n\n\tstatus.imports.add(\"$run\");\n\tb.append(`$run(function ${functionName}() {`);\n\tb.append(functionBody);\n\tb.append(\"});\");\n}\n","import { type ElementNode } from \"../../types/nodes/ElementNode\";\nimport isSpecialNode from \"../../types/nodes/isSpecialNode\";\nimport Builder from \"../../utils/Builder\";\nimport trimMatched from \"../../utils/trimMatched\";\nimport trimQuotes from \"../../utils/trimQuotes\";\nimport isFullyReactive from \"../utils/isFullyReactive\";\nimport isReactive from \"../utils/isReactive\";\nimport nextVarName from \"../utils/nextVarName\";\nimport { type BuildStatus } from \"./BuildStatus\";\nimport buildAddFragment from \"./buildAddFragment\";\nimport buildFragment from \"./buildFragment\";\nimport buildNode from \"./buildNode\";\nimport buildRun from \"./buildRun\";\n\nexport default function buildComponentNode(\n\tnode: ElementNode,\n\tstatus: BuildStatus,\n\tb: Builder,\n\troot = false,\n): void {\n\tb.append(\"\");\n\tb.append(\"/* @component */\");\n\n\t// Props\n\tconst componentHasProps = node.attributes.length || root;\n\tconst propsName = componentHasProps ? nextVarName(\"props\", status) : \"undefined\";\n\tif (componentHasProps) {\n\t\t// TODO: defaults etc props\n\t\t//status.imports.add(\"$watch\");\n\t\t//b.append(`const ${propsName} = $watch({});`);\n\t\tb.append(`const ${propsName}: any = {};`);\n\t\tfor (let { name, value } of node.attributes) {\n\t\t\tif (name === \"self\" && node.tagName === \":component\") {\n\t\t\t\t// Ignore this special attribute\n\t\t\t} else if (name.startsWith(\"{\") && name.endsWith(\"}\")) {\n\t\t\t\t// It's a shortcut attribute\n\t\t\t\tname = name.substring(1, name.length - 1);\n\t\t\t\tbuildRun(\"setProp\", `${propsName}[\"${name}\"] = ${name};`, status, b);\n\t\t\t} else if (value != null) {\n\t\t\t\tlet fullyReactive = isFullyReactive(value);\n\t\t\t\tlet partlyReactive = isReactive(value);\n\t\t\t\tif (fullyReactive) {\n\t\t\t\t\tvalue = value.substring(1, value.length - 1);\n\t\t\t\t} else if (partlyReactive) {\n\t\t\t\t\tvalue = `\\`${trimQuotes(value).replaceAll(\"{\", \"${\")}\\``;\n\t\t\t\t}\n\t\t\t\tif (name === \"class\") {\n\t\t\t\t\t// TODO: How to handle dynamic classes etc\n\t\t\t\t\t// Probably just compile down to a string?\n\t\t\t\t\tvalue = `\"${trimQuotes(value)} torp-${status.styleHash}\"`;\n\t\t\t\t}\n\t\t\t\tconst setProp = `${propsName}[\"${name}\"] = ${value};`;\n\t\t\t\tif (fullyReactive || partlyReactive) {\n\t\t\t\t\tbuildRun(\"setProp\", setProp, status, b);\n\t\t\t\t} else {\n\t\t\t\t\tb.append(setProp);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tb.append(`${propsName}[\"${name}\"] = true;`);\n\t\t\t}\n\t\t}\n\t\t// PERF: Does this have much of an impact??\n\t\tif (root) {\n\t\t\tstatus.imports.add(\"$run\");\n\t\t\tb.append(`\n\t\t\tif ($props) {\n\t\t\t\tconst propNames = [${status.props.map((p) => `'${p}'`).join(\", \")}];\n\t\t\t\tfor (let name of Object.keys($props)) {\n\t\t\t\t\tif (!name.startsWith(\"$\") && !propNames.includes(name)) {\n\t\t\t\t\t\t$run(() => ${propsName}[name] = $props[name]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}`);\n\t\t}\n\t}\n\n\t// Slots\n\tconst componentHasSlots = node.children.length;\n\tconst slotsName = componentHasSlots ? nextVarName(\"slots\", status) : \"undefined\";\n\tif (componentHasSlots) {\n\t\tb.append(`const ${slotsName}: Record<string, SlotRender> = {};`);\n\t\tfor (let slot of node.children) {\n\t\t\tif (isSpecialNode(slot)) {\n\t\t\t\tconst nameAttribute = slot.attributes.find((a) => a.name === \"name\");\n\t\t\t\tconst slotName = nameAttribute?.value ? trimQuotes(nameAttribute.value) : \"_\";\n\t\t\t\tconst slotParams = [\n\t\t\t\t\t\"$sparent: ParentNode\",\n\t\t\t\t\t\"$sanchor: Node | null\",\n\t\t\t\t\t\"//@ts-ignore\\n$sprops?: Record<PropertyKey, any>\",\n\t\t\t\t\t\"//@ts-ignore\\n$context?: Record<PropertyKey, any>\",\n\t\t\t\t];\n\t\t\t\tb.append(`${slotsName}[\"${slotName}\"] = (\\n${slotParams.join(\",\\n\")}\\n) => {`);\n\n\t\t\t\tbuildFragment(slot, status, b, \"$sparent\", \"$sanchor\");\n\n\t\t\t\tstatus.fragmentStack.push({\n\t\t\t\t\tfragment: slot.fragment,\n\t\t\t\t\tpath: \"\",\n\t\t\t\t});\n\t\t\t\tfor (let child of slot.children) {\n\t\t\t\t\tbuildNode(child, status, b, \"$sparent\", \"$sanchor\");\n\t\t\t\t}\n\t\t\t\tstatus.fragmentStack.pop();\n\n\t\t\t\tbuildAddFragment(slot, status, b, \"$sparent\", \"$sanchor\");\n\n\t\t\t\tb.append(`}`);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Render the component\n\tconst compParentName = node.parentName;\n\tconst compAnchorName = node.varName;\n\tlet renderParams = `${compParentName}, ${compAnchorName}, ${propsName}, $context`;\n\tif (slotsName !== \"undefined\") {\n\t\trenderParams += `, ${slotsName}`;\n\t}\n\n\tlet componentName = node.tagName;\n\tif (componentName === \":component\") {\n\t\tlet selfAttribute = node.attributes.find((a) => a.name === \"self\");\n\t\tif (selfAttribute && selfAttribute.value) {\n\t\t\tcomponentName = trimMatched(selfAttribute.value, \"{\", \"}\");\n\t\t}\n\t}\n\n\tb.append(`${componentName}(${renderParams});`);\n}\n","import { type ControlNode } from \"../../types/nodes/ControlNode\";\nimport isControlNode from \"../../types/nodes/isControlNode\";\nimport Builder from \"../../utils/Builder\";\nimport trimMatched from \"../../utils/trimMatched\";\nimport nextVarName from \"../utils/nextVarName\";\nimport { type BuildStatus } from \"./BuildStatus\";\nimport buildAddFragment from \"./buildAddFragment\";\nimport buildFragment from \"./buildFragment\";\nimport buildNode from \"./buildNode\";\n\nexport default function buildAwaitNode(node: ControlNode, status: BuildStatus, b: Builder): void {\n\tconst awaitParentName = node.parentName!;\n\tconst awaitAnchorName = node.varName!;\n\tconst awaitRangeName = nextVarName(\"await_range\", status);\n\tconst awaitTokenName = nextVarName(\"await_token\", status);\n\tconst oldRangeName = nextVarName(\"old_range\", status);\n\n\t// Filter non-control branches (spaces)\n\tconst branches = node.children.filter((n) => isControlNode(n)) as ControlNode[];\n\n\t// Make sure all branches exist\n\tlet awaitBranch = branches.find((n) => n.operation === \"@await\")!;\n\tif (!awaitBranch) {\n\t\t// TODO: Error handling\n\t}\n\tlet thenBranch = branches.find((n) => n.operation === \"@then\");\n\tif (!thenBranch) {\n\t\tthenBranch = {\n\t\t\ttype: \"control\",\n\t\t\toperation: \"@then\",\n\t\t\tstatement: \"then\",\n\t\t\tchildren: [],\n\t\t};\n\t}\n\tlet catchBranch = branches.find((n) => n.operation === \"@catch\");\n\tif (!catchBranch) {\n\t\tcatchBranch = {\n\t\t\ttype: \"control\",\n\t\t\toperation: \"@catch\",\n\t\t\tstatement: \"catch\",\n\t\t\tchildren: [],\n\t\t};\n\t}\n\n\tconst awaiterName = trimMatched(awaitBranch.statement.substring(\"await\".length).trim(), \"(\", \")\");\n\tconst thenVar = trimMatched(thenBranch.statement.substring(\"then\".length).trim(), \"(\", \")\");\n\tconst catchVar = trimMatched(catchBranch.statement.substring(\"catch\".length).trim(), \"(\", \")\");\n\n\t// Use an incrementing token to make sure only the last request gets handled\n\t// TODO: This might have unforeseen consequences\n\tstatus.imports.add(\"t_range\");\n\tstatus.imports.add(\"t_run_control\");\n\tb.append(\"\");\n\tb.append(`\n\t/* @await */\n\tconst ${awaitRangeName} = t_range();\n\t${awaitRangeName}.index = -1;\n\tlet ${awaitTokenName} = 0;\n\tt_run_control(${awaitRangeName}, ${awaitAnchorName}, (t_before) => {\n\t\t${awaitTokenName}++;`);\n\n\tbuildAwaitBranch(awaitBranch, status, b, awaitParentName, awaitRangeName, 0);\n\n\tstatus.imports.add(\"t_push_range\");\n\tstatus.imports.add(\"t_pop_range\");\n\tb.append(`\n\t((token) => {\n\t\t${awaiterName}\n\t\t.then((${thenVar}) => {\n\t\tif (token === ${awaitTokenName}) {\n\t\t\tlet ${oldRangeName} = t_push_range(${awaitRangeName});`);\n\n\tbuildAwaitBranch(thenBranch, status, b, awaitParentName, awaitRangeName, 1);\n\n\tb.append(`t_pop_range(${oldRangeName});\n\t\t}\n\t})\n\t.catch((${catchVar}) => {\n\t\tif (token === ${awaitTokenName}) {\n\t\t\tlet ${oldRangeName} = t_push_range(${awaitRangeName});`);\n\n\tbuildAwaitBranch(catchBranch, status, b, awaitParentName, awaitRangeName, 2);\n\n\tb.append(`t_pop_range(${oldRangeName});\n\t\t\t\t}\n\t\t\t});\n\t\t})(${awaitTokenName});\n\t});`);\n\tb.append(\"\");\n}\n\nfunction buildAwaitBranch(\n\tnode: ControlNode,\n\tstatus: BuildStatus,\n\tb: Builder,\n\tparentName: string,\n\trangeName: string,\n\tindex: number,\n) {\n\tstatus.imports.add(\"t_run_branch\");\n\n\tb.append(`t_run_branch(${rangeName}, ${index}, () => {`);\n\n\tbuildFragment(node, status, b, parentName, \"t_before\");\n\n\tstatus.fragmentStack.push({\n\t\tfragment: node.fragment!,\n\t\tpath: \"\",\n\t});\n\tfor (let child of node.children) {\n\t\tbuildNode(child, status, b, parentName, \"t_before\");\n\t}\n\tstatus.fragmentStack.pop();\n\n\tbuildAddFragment(node, status, b, parentName, \"t_before\");\n\n\tb.append(`});`);\n}\n","/**\n * Trims a char from the end of the supplied text\n *\n * @param text The text to trim\n * @param char The char to remove from the end of the text\n *\n * @returns The text without the char on the end\n */\nexport default function trimEnd(text: string, char: string): string {\n\tlet end = text.length;\n\twhile (text[end - 1] === char) {\n\t\tend -= 1;\n\t}\n\treturn text.substring(0, end);\n}\n","import { type ControlNode } from \"../../types/nodes/ControlNode\";\nimport isControlNode from \"../../types/nodes/isControlNode\";\nimport Builder from \"../../utils/Builder\";\nimport trimEnd from \"../../utils/trimEnd\";\nimport trimMatched from \"../../utils/trimMatched\";\nimport nextVarName from \"../utils/nextVarName\";\nimport { type BuildStatus } from \"./BuildStatus\";\nimport buildAddFragment from \"./buildAddFragment\";\nimport buildFragment from \"./buildFragment\";\nimport buildNode from \"./buildNode\";\n\nconst forLoopRegex = /for\\s*\\((.+?);.*?;.*?\\)/;\nconst forLoopVarsRegex = /(?:let\\s+|var\\s+){0,1}([^\\s,;+=]+)(?:\\s*=\\s*[^,;]+){0,1}/g;\nconst forOfRegex = /for\\s*\\(\\s*(?:let\\s*|var\\s*){0,1}(.+?)\\s+(?:of|in).*?\\)/;\n\nexport default function buildForNode(node: ControlNode, status: BuildStatus, b: Builder): void {\n\tconst forParentName = node.parentName!;\n\tconst forAnchorName = node.varName!;\n\n\t// HACK:\n\tnode = node.children[0] as ControlNode;\n\n\t// HACK: Need to wrangle the declaration(s) out of the for loop and put them in data\n\t// TODO: Handle destructuring, quotes, comments etc\n\tconst forVarNames: string[] = [];\n\tconst forIndexMatch = node.statement.match(forLoopRegex);\n\tif (forIndexMatch) {\n\t\tconst forVarMatches = forIndexMatch[1].matchAll(forLoopVarsRegex);\n\t\tfor (let match of forVarMatches) {\n\t\t\tforVarNames.push(match[1]);\n\t\t}\n\t} else {\n\t\tconst forOfMatch = node.statement.match(forOfRegex);\n\t\tif (forOfMatch) {\n\t\t\tconst match = forOfMatch[1];\n\t\t\tif (\n\t\t\t\t(match.startsWith(\"{\") && match.endsWith(\"}\")) ||\n\t\t\t\t(match.startsWith(\"[\") && match.endsWith(\"]\"))\n\t\t\t) {\n\t\t\t\tforVarNames.push(\n\t\t\t\t\t...trimMatched(trimMatched(match, \"{\", \"}\"), \"[\", \"]\")\n\t\t\t\t\t\t.split(\",\")\n\t\t\t\t\t\t.map((m) => m.trim()),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tforVarNames.push(match);\n\t\t\t}\n\t\t}\n\t}\n\n\tconst forRangeName = nextVarName(\"for_range\", status);\n\n\t// Get the key node if it's been set\n\tconst key = node.children.find(\n\t\t(n) => n.type === \"control\" && (n as ControlNode).operation === \"@key\",\n\t);\n\tlet keyStatement = key ? (key as ControlNode).statement : \"\";\n\tif (keyStatement) {\n\t\tkeyStatement = trimEnd(keyStatement.substring(keyStatement.indexOf(\"=\") + 1).trim(), \";\");\n\t}\n\n\tstatus.imports.add(\"t_range\");\n\tstatus.imports.add(\"t_run_list\");\n\tstatus.imports.add(\"t_list_item\");\n\tstatus.imports.add(\"ListItem\");\n\n\tb.append(\"\");\n\tb.append(`\n\t/* @for */\n\tlet ${forRangeName} = t_range();\n\tt_run_list(\n\t${forRangeName},\n\t${forParentName},\n\t${forAnchorName},\n\tfunction createNewItems() {\n\t\tlet t_new_items: ListItem[] = [];\n\t\t${node.statement} {\n\t\t\tt_new_items.push(t_list_item({ ${forVarNames.join(\",\\n\")} }${keyStatement ? `, ${keyStatement}` : \"\"}));\n\t\t\t/*t_new_items.push({\n\t\t\t\t${keyStatement ? `key: ${keyStatement},` : \";\"}\n\t\t\t\tdata: { ${forVarNames.join(\",\\n\")} }\n\t\t\t});*/\n\t\t}\n\t\treturn t_new_items;\n\t},\n\tfunction createListItem(t_item, t_before) {`);\n\n\tstatus.forVarNames = forVarNames;\n\tbuildForItem(node, status, b, forParentName);\n\tstatus.forVarNames = [];\n\n\tb.append(`}`);\n\tb.append(`);`);\n\tb.append(\"\");\n}\n\nfunction buildForItem(node: ControlNode, status: BuildStatus, b: Builder, parentName: string) {\n\tconst oldRangeName = nextVarName(\"old_range\", status);\n\n\tstatus.imports.add(\"t_push_range\");\n\tb.append(`let ${oldRangeName} = t_push_range(t_item, true);`);\n\n\tbuildFragment(node, status, b, parentName, \"t_before\");\n\n\tstatus.fragmentStack.push({\n\t\tfragment: node.fragment!,\n\t\tpath: \"\",\n\t});\n\tfor (let child of node.children) {\n\t\tif (isControlNode(child) && child.operation === \"@key\") {\n\t\t\tcontinue;\n\t\t}\n\t\tbuildNode(child, status, b, parentName, \"t_before\");\n\t}\n\tstatus.fragmentStack.pop();\n\n\tbuildAddFragment(node, status, b, parentName, \"t_before\");\n\n\t// If we wanted to return the fragment instead:\n\t//b.append(`t_item.startNode = t_fragment_1.firstChild;`);\n\t//b.append(`t_item.endNode = t_fragment_1.lastChild;`);\n\t//for (let ev of node.fragment!.events) {\n\t// b.append(`${ev.varName}.addEventListener(\"${ev.eventName}\", ${ev.handler});`);\n\t//}\n\n\tstatus.imports.add(\"t_pop_range\");\n\tb.append(`t_pop_range(${oldRangeName});`);\n\n\t// If we wanted to return the fragment instead:\n\t//b.append(`return t_fragment_${node.fragment!.number};`);\n}\n","import { type ControlNode } from \"../../types/nodes/ControlNode\";\nimport Builder from \"../../utils/Builder\";\nimport nextVarName from \"../utils/nextVarName\";\nimport { type BuildStatus } from \"./BuildStatus\";\nimport buildAddFragment from \"./buildAddFragment\";\n\nexport default function buildHtmlNode(node: ControlNode, status: BuildStatus, b: Builder): void {\n\tconst htmlAnchorName = node.varName!;\n\tconst htmlParentName = node.parentName || htmlAnchorName + \".parentNode\";\n\tconst htmlRangeName = nextVarName(\"html_range\", status);\n\n\t// HACK: I'm not actually sure we need this here (or in @replace, where I copied it from)\n\tnode = node.children[0] as ControlNode;\n\n\tstatus.imports.add(\"t_range\");\n\tstatus.imports.add(\"t_run_control\");\n\n\tb.append(\"\");\n\tb.append(`\n\t/* @html */\n\tconst ${htmlRangeName} = t_range();\n\tt_run_control(${htmlRangeName}, ${htmlAnchorName}, (t_before) => {`);\n\n\tbuildHtmlBranch(node, status, b, htmlParentName, htmlRangeName);\n\n\tb.append(\"});\");\n\tb.append(\"\");\n}\n\nfunction buildHtmlBranch(\n\tnode: ControlNode,\n\tstatus: BuildStatus,\n\tb: Builder,\n\tparentName: string,\n\trangeName: string,\n) {\n\tstatus.imports.add(\"t_run_branch\");\n\n\tb.append(`t_run_branch(${rangeName}, -1, () => {`);\n\n\tconst templateName = nextVarName(\"template\", status);\n\tconst fragmentName = `t_fragment_${node.fragment!.number}`;\n\tb.append(`const ${templateName} = document.createElement(\"template\");`);\n\tb.append(`${templateName}.innerHTML = ${node.statement};`);\n\tb.append(`let ${fragmentName} = ${templateName}.content.cloneNode(true) as DocumentFragment;`);\n\n\tbuildAddFragment(node, status, b, parentName, \"t_before\");\n\n\tb.append(`});`);\n}\n","import { type ControlNode } from \"../../types/nodes/ControlNode\";\nimport isControlNode from \"../../types/nodes/isControlNode\";\nimport Builder from \"../../utils/Builder\";\nimport nextVarName from \"../utils/nextVarName\";\nimport { type BuildStatus } from \"./BuildStatus\";\nimport buildAddFragment from \"./buildAddFragment\";\nimport buildFragment from \"./buildFragment\";\nimport buildNode from \"./buildNode\";\n\n// TODO: Are there too many branches for ifs etc?\n\nexport default function buildIfNode(node: ControlNode, status: BuildStatus, b: Builder): void {\n\tconst ifAnchorName = node.varName!;\n\tconst ifParentName = node.parentName || ifAnchorName + \".parentNode\";\n\tconst ifRangeName = nextVarName(\"if_range\", status);\n\n\t// Filter non-control branches (spaces)\n\tconst branches = node.children.filter((n) => isControlNode(n)) as ControlNode[];\n\n\t// Add an else branch if there isn't one, so that the content will be cleared if no branches match\n\tif (branches.findIndex((n) => n.operation === \"@else\") === -1) {\n\t\tconst elseBranch: ControlNode = {\n\t\t\ttype: \"control\",\n\t\t\toperation: \"@else\",\n\t\t\tstatement: \"else\",\n\t\t\tchildren: [],\n\t\t};\n\t\tbranches.push(elseBranch);\n\t}\n\n\tstatus.imports.add(\"t_range\");\n\tstatus.imports.add(\"t_run_control\");\n\n\tb.append(\"\");\n\tb.append(`\n\t/* @if */\n\tconst ${ifRangeName} = t_range();\n\tt_run_control(${ifRangeName}, ${ifAnchorName}, (t_before) => {`);\n\n\tfor (let [i, branch] of branches.entries()) {\n\t\tbuildIfBranch(branch, status, b, ifParentName, ifRangeName, i);\n\t}\n\n\tb.append(\"});\");\n\tb.append(\"\");\n}\n\nfunction buildIfBranch(\n\tnode: ControlNode,\n\tstatus: BuildStatus,\n\tb: Builder,\n\tparentName: string,\n\trangeName: string,\n\tindex: number,\n) {\n\tstatus.imports.add(\"t_run_branch\");\n\n\tb.append(`${node.statement} {`);\n\tb.append(`t_run_branch(${rangeName}, ${index}, () => {`);\n\n\tbuildFragment(node, status, b, parentName, \"t_before\");\n\n\tstatus.fragmentStack.push({\n\t\tfragment: node.fragment,\n\t\tpath: \"\",\n\t});\n\tfor (let child of node.children) {\n\t\tbuildNode(child, status, b, parentName, \"t_before\");\n\t}\n\tstatus.fragmentStack.pop();\n\n\tbuildAddFragment(node, status, b, parentName, \"t_before\");\n\n\tb.append(`});`);\n\tb.append(`}`);\n}\n","import { type ControlNode } from \"../../types/nodes/ControlNode\";\nimport Builder from \"../../utils/Builder\";\nimport nextVarName from \"../utils/nextVarName\";\nimport { type BuildStatus } from \"./BuildStatus\";\nimport buildAddFragment from \"./buildAddFragment\";\nimport buildFragment from \"./buildFragment\";\nimport buildNode from \"./buildNode\";\n\nexport default function buildReplaceNode(node: ControlNode, status: BuildStatus, b: Builder): void {\n\tconst replaceAnchorName = node.varName!;\n\tconst replaceParentName = node.parentName || replaceAnchorName + \".parentNode\";\n\tconst replaceRangeName = nextVarName(\"replace_range\", status);\n\n\t// HACK:\n\tnode = node.children[0] as ControlNode;\n\n\tstatus.imports.add(\"t_range\");\n\tstatus.imports.add(\"t_run_control\");\n\n\tb.append(\"\");\n\tb.append(`\n\t/* @replace */\n\tconst ${replaceRangeName} = t_range();\n\tt_run_control(${replaceRangeName}, ${replaceAnchorName}, (t_before) => {`);\n\n\tbuildReplaceBranch(node, status, b, replaceParentName, replaceRangeName);\n\n\tb.append(\"});\");\n\tb.append(\"\");\n}\n\nfunction buildReplaceBranch(\n\tnode: ControlNode,\n\tstatus: BuildStatus,\n\tb: Builder,\n\tparentName: string,\n\trangeName: string,\n) {\n\tstatus.imports.add(\"t_run_branch\");\n\n\tb.append(`${node.statement};`);\n\tb.append(`t_run_branch(${rangeName}, -1, () => {`);\n\n\tbuildFragment(node, status, b, parentName, \"t_before\");\n\n\tstatus.fragmentStack.push({\n\t\tfragment: node.fragment,\n\t\tpath: \"\",\n\t});\n\tfor (let child of node.children) {\n\t\tbuildNode(child, status, b, parentName, \"t_before\");\n\t}\n\tstatus.fragmentStack.pop();\n\n\tbuildAddFragment(node, status, b, parentName, \"t_before\");\n\n\tb.append(`});`);\n}\n","import { type ControlNode } from \"../../types/nodes/ControlNode\";\nimport Builder from \"../../utils/Builder\";\n\nexport default function buildScriptNode(node: ControlNode, b: Builder): void {\n\tb.append(`/* ${node.operation} */`);\n\tb.append(`${maybeAppend(node.statement, \";\")}`);\n}\n\nfunction maybeAppend(text: string, end: string) {\n\tif (!text.endsWith(end)) {\n\t\ttext += end;\n\t}\n\treturn text;\n}\n","import { type ControlNode } from \"../../types/nodes/ControlNode\";\nimport isControlNode from \"../../types/nodes/isControlNode\";\nimport Builder from \"../../utils/Builder\";\nimport nextVarName from \"../utils/nextVarName\";\nimport { type BuildStatus } from \"./BuildStatus\";\nimport buildAddFragment from \"./buildAddFragment\";\nimport buildFragment from \"./buildFragment\";\nimport buildNode from \"./buildNode\";\n\nexport default function buildSwitchNode(node: ControlNode, status: BuildStatus, b: Builder): void {\n\tconst switchParentName = node.parentName!;\n\tconst switchAnchorName = node.varName!;\n\tconst switchRangeName = nextVarName(\"switch_range\", status);\n\n\t// Filter non-control branches (spaces)\n\tconst branches = node.children.filter((n) => isControlNode(n)) as ControlNode[];\n\n\t// Add a default branch if there isn't one, so that the content will be cleared if no branches match\n\tif (branches.findIndex((n) => n.operation === \"@default\") === -1) {\n\t\tconst defaultBranch: ControlNode = {\n\t\t\ttype: \"control\",\n\t\t\toperation: \"@default\",\n\t\t\tstatement: \"default\",\n\t\t\tchildren: [],\n\t\t};\n\t\tbranches.push(defaultBranch);\n\t}\n\n\tstatus.imports.add(\"t_range\");\n\tstatus.imports.add(\"t_run_control\");\n\n\tb.append(\"\");\n\tb.append(`\n\t/* @switch */\n\tconst ${switchRangeName} = t_range();\n\tt_run_control(${switchRangeName}, ${switchAnchorName}, (t_before) => {\n\t\t${node.statement} {`);\n\n\tfor (let [i, branch] of branches.entries()) {\n\t\tbuildSwitchBranch(branch as ControlNode, status, b, switchParentName, switchRangeName, i);\n\t}\n\n\tb.append(`}\n\t});`);\n\tb.append(\"\");\n}\n\nfunction buildSwitchBranch(\n\tnode: ControlNode,\n\tstatus: BuildStatus,\n\tb: Builder,\n\tparentName: string,\n\trangeName: string,\n\tindex: number,\n) {\n\tstatus.imports.add(\"t_run_branch\");\n\n\tb.append(`${node.statement} {`);\n\tb.append(`t_run_branch(${rangeName}, ${index}, () => {`);\n\n\tbuildFragment(node, status, b, parentName, \"t_before\");\n\n\tstatus.fragmentStack.push({\n\t\tfragment: node.fragment,\n\t\tpath: \"\",\n\t});\n\tfor (let child of node.children) {\n\t\tbuildNode(child, status, b, parentName, \"t_before\");\n\t}\n\tstatus.fragmentStack.pop();\n\n\tbuildAddFragment(node, status, b, parentName, \"t_before\");\n\n\tb.append(`});`);\n\tb.append(`break;`);\n\tb.append(`}`);\n}\n","import { type ControlNode } from \"../../types/nodes/ControlNode\";\nimport Builder from \"../../utils/Builder\";\nimport { type BuildStatus } from \"./BuildStatus\";\nimport buildAwaitNode from \"./buildAwaitNode\";\nimport buildForNode from \"./buildForNode\";\nimport buildHtmlNode from \"./buildHtmlNode\";\nimport buildIfNode from \"./buildIfNode\";\nimport buildReplaceNode from \"./buildReplaceNode\";\nimport buildScriptNode from \"./buildScriptNode\";\nimport buildSwitchNode from \"./buildSwitchNode\";\n\nexport default function buildControlNode(node: ControlNode, status: BuildStatus, b: Builder): void {\n\tswitch (node.operation) {\n\t\tcase \"@if group\": {\n\t\t\tbuildIfNode(node, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@if\":\n\t\tcase \"@else if\":\n\t\tcase \"@else\": {\n\t\t\t// These get handled with @if group, above\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@switch group\": {\n\t\t\tbuildSwitchNode(node, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@case\":\n\t\tcase \"@default\": {\n\t\t\t// These get handled with @switch, above\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@for group\": {\n\t\t\tbuildForNode(node, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@for\":\n\t\tcase \"@key\": {\n\t\t\t// These get handled with @for, above\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@await group\": {\n\t\t\tbuildAwaitNode(node, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@await\":\n\t\tcase \"@then\":\n\t\tcase \"@catch\": {\n\t\t\t// These get handled with @await group, above\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@replace group\": {\n\t\t\tbuildReplaceNode(node, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@replace\": {\n\t\t\t// This gets handled with @replace group, above\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@html group\": {\n\t\t\tbuildHtmlNode(node, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@html\": {\n\t\t\t// This gets handled with @html group, above\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@const\":\n\t\tcase \"@console\":\n\t\tcase \"@debugger\": {\n\t\t\tbuildScriptNode(node, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@function\": {\n\t\t\tb.append(\"\");\n\t\t\tbuildScriptNode(node, b);\n\t\t\tb.append(\"\");\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\tthrow new Error(`Invalid operation: ${node.operation}`);\n\t\t}\n\t}\n}\n","import Builder from \"../../utils/Builder\";\nimport { type BuildStatus } from \"./BuildStatus\";\nimport replaceForVarNames from \"./replaceForVarNames\";\n\nexport default function buildMount(\n\tfunctionName: string,\n\tfunctionBody: string,\n\tstatus: BuildStatus,\n\tb: Builder,\n): void {\n\tfunctionBody = replaceForVarNames(functionBody, status);\n\n\tstatus.imports.add(\"$mount\");\n\tb.append(`$mount(function ${functionName}() {`);\n\tb.append(functionBody);\n\tb.append(\"});\");\n}\n","import { type ElementNode } from \"../../types/nodes/ElementNode\";\nimport { type TextNode } from \"../../types/nodes/TextNode\";\nimport Builder from \"../../utils/Builder\";\nimport trimEnd from \"../../utils/trimEnd\";\nimport trimMatched from \"../../utils/trimMatched\";\nimport trimQuotes from \"../../utils/trimQuotes\";\nimport isFullyReactive from \"../utils/isFullyReactive\";\nimport isReactive from \"../utils/isReactive\";\nimport nextVarName from \"../utils/nextVarName\";\nimport { type BuildStatus } from \"./BuildStatus\";\nimport buildAddFragment from \"./buildAddFragment\";\nimport buildFragment from \"./buildFragment\";\nimport buildMount from \"./buildMount\";\nimport buildNode from \"./buildNode\";\nimport buildRun from \"./buildRun\";\nimport replaceForVarNames from \"./replaceForVarNames\";\n\nexport default function buildElementNode(\n\tnode: ElementNode,\n\tstatus: BuildStatus,\n\tb: Builder,\n\tparentName: string,\n\troot = false,\n): void {\n\tif (status.inHead) {\n\t\tif (node.tagName === \"title\") {\n\t\t\tbuildTitleNode(node, status, b);\n\t\t\treturn;\n\t\t} else {\n\t\t\tbuildHeadNode(node, status, b);\n\t\t\treturn;\n\t\t}\n\t}\n\n\tconst varName = node.varName;\n\tif (varName) {\n\t\tif (node.tagName === \":element\") {\n\t\t\tbuildDynamicElementNode(node, status, b);\n\t\t}\n\n\t\t// PERF: Does this have much of an impact??\n\t\tif (root) {\n\t\t\t//status.imports.add(\"t_apply_props\");\n\t\t\t//// TODO: I think we know what the props are at this stage, so we could be more direct?\n\t\t\t//b.append(\"\");\n\t\t\t//b.append(\n\t\t\t//\t`t_apply_props(${varName}, $props, [${status.props.map((p) => `'${p}'`).join(\", \")}]);`,\n\t\t\t//);\n\t\t}\n\n\t\tbuildElementAttributes(node, varName, status, b);\n\t}\n\n\tconst oldPreserveWhitespace = status.preserveWhitespace;\n\tstatus.preserveWhitespace = [\"code\", \"pre\"].includes(node.tagName);\n\tfor (let child of node.children) {\n\t\tbuildNode(child, status, b, parentName, \"null\");\n\t}\n\tstatus.preserveWhitespace = oldPreserveWhitespace;\n}\n\nfunction buildDynamicElementNode(node: ElementNode, status: BuildStatus, b: Builder) {\n\tlet selfAttribute = node.attributes.find((a) => a.name === \"self\");\n\tif (selfAttribute && selfAttribute.value) {\n\t\tstatus.imports.add(\"$run\");\n\t\tstatus.imports.add(\"t_dynamic\");\n\t\tlet selfValue = trimMatched(selfAttribute.value, \"{\", \"}\");\n\t\tb.append(`$run(function setDynamic() {`);\n\t\tb.append(`${node.varName} = t_dynamic(${node.varName}, ${selfValue});`);\n\n\t\tlet parentName = node.varName;\n\n\t\tbuildFragment(node, status, b, parentName!, \"null\");\n\n\t\tstatus.fragmentStack.push({\n\t\t\tfragment: node.fragment,\n\t\t\tpath: \"\",\n\t\t});\n\t\tfor (let child of node.children) {\n\t\t\tbuildNode(child, status, b, parentName!, \"null\");\n\t\t}\n\t\tstatus.fragmentStack.pop();\n\n\t\tbuildAddFragment(node, status, b, parentName!, \"null\");\n\n\t\tb.append(`});`);\n\t}\n}\n\nfunction buildTitleNode(node: ElementNode, status: BuildStatus, b: Builder) {\n\tlet content = (node.children[0] as TextNode).content || \"\";\n\n\t// Replace all spaces with a single space, both to save space and to remove\n\t// newlines from generated JS strings\n\tcontent = content.replace(/\\s+/g, \" \");\n\n\t// TODO: Should be fancier about this in parse -- e.g. ignore braces in\n\t// quotes, unclosed, etc\n\tlet reactiveStarted = false;\n\tlet reactiveCount = 0;\n\tfor (let i = 0; i < content.length; i++) {\n\t\tif (content[i] === \"{\") {\n\t\t\treactiveStarted = true;\n\t\t} else if (content[i] === \"}\") {\n\t\t\tif (reactiveStarted) {\n\t\t\t\treactiveCount += 1;\n\t\t\t\treactiveStarted = false;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (reactiveCount) {\n\t\tstatus.imports.add(\"t_fmt\");\n\t\tif (reactiveCount === 1 && content.startsWith(\"{\") && content.endsWith(\"}\")) {\n\t\t\tcontent = `t_fmt(${content.substring(1, content.length - 1)})`;\n\t\t} else {\n\t\t\tcontent = `\\`${content.replaceAll(\"{\", \"${t_fmt(\").replaceAll(\"}\", \")}\")}\\``;\n\t\t}\n\t} else {\n\t\tcontent = `\"${content}\"`;\n\t}\n\n\tstatus.imports.add(\"$run\");\n\tb.append(`\n\t\t$run(function runTitle() {\n\t\t\tconst t_old_title = document.title;\n\t\t\tdocument.title = ${content};\n\t\t\treturn () => document.title = t_old_title;\n\t\t});`);\n}\n\nfunction buildHeadNode(node: ElementNode, status: BuildStatus, b: Builder) {\n\tstatus.imports.add(\"$run\");\n\t// TODO: dedupe e.g. <meta name=\"x\"> or on special key\n\tb.append(`\n\t\t$run(function runHead() {\n\t\t\tconst t_head_el = document.createElement(\"${node.tagName}\");\n\t\t\tdocument.getElementsByTagName(\"head\")[0].appendChild(t_head_el);`);\n\tfor (let { name, value } of node.attributes) {\n\t\tif (name.startsWith(\"{\") && name.endsWith(\"}\")) {\n\t\t\t// It's a shortcut attribute\n\t\t\tname = name.substring(1, name.length - 1);\n\t\t\tbuildRun(\"setAttribute\", `t_head_el.setAttribute(\"${name}\", ${name});`, status, b);\n\t\t} else if (value != null && isReactive(value)) {\n\t\t\t// It's a reactive attribute\n\t\t\tif (isFullyReactive(value)) {\n\t\t\t\tvalue = value.substring(1, value.length - 1);\n\t\t\t} else {\n\t\t\t\tvalue = `\\`${trimQuotes(value).replaceAll(\"{\", \"${\")}\\``;\n\t\t\t}\n\n\t\t\tstatus.imports.add(\"t_attribute\");\n\t\t\tbuildRun(\"setAttribute\", `t_attribute(t_head_el, \"${name}\", ${value});`, status, b);\n\t\t} else if (value != null) {\n\t\t\tstatus.imports.add(\"t_attribute\");\n\t\t\tb.append(`t_attribute(t_head_el, \"${name}\", ${value});`);\n\t\t}\n\t}\n\tb.append(`\n\t\t\treturn () => alert(\"YO\");\n\t\t});`);\n}\n\nfunction buildElementAttributes(\n\tnode: ElementNode,\n\tvarName: string,\n\tstatus: BuildStatus,\n\tb: Builder,\n) {\n\t// TODO: Flatten this out\n\t// TODO: Add an error if any reactive attributes are used non-reactively\n\n\tfor (let { name, value } of node.attributes) {\n\t\tif (name === \"self\" && node.tagName === \":element\") {\n\t\t\t// Ignore this special attribute\n\t\t} else if (name.startsWith(\"{\") && name.endsWith(\"}\")) {\n\t\t\t// It's a shortcut attribute\n\t\t\tname = name.substring(1, name.length - 1);\n\t\t\tbuildRun(\"setAttribute\", `${varName}.setAttribute(\"${name}\", ${name});`, status, b);\n\t\t} else if (value != null && isReactive(value)) {\n\t\t\t// It's a reactive attribute\n\t\t\tif (isFullyReactive(value)) {\n\t\t\t\tvalue = value.substring(1, value.length - 1);\n\t\t\t} else {\n\t\t\t\tvalue = `\\`${trimQuotes(value).replaceAll(\"{\", \"${\")}\\``;\n\t\t\t}\n\n\t\t\tif (name === \":self\") {\n\t\t\t\t// Bind the DOM element to a user-defined variable\n\t\t\t\tb.append(`${value} = ${varName};`);\n\t\t\t} else if (name === \":group\") {\n\t\t\t\tbuildBindGroupAttribute(node, varName, value, status, b);\n\t\t\t} else if (name === \":value\" || name === \":checked\") {\n\t\t\t\tbuildBindAttribute(node, varName, name, value, status, b);\n\t\t\t} else if (name === \":onmount\") {\n\t\t\t\t// The :onmount event is faked by us by creating a $run. This also\n\t\t\t\t// means that you can have unmount functionality by returning a\n\t\t\t\t// cleanup function\n\t\t\t\tbuildMount(\"elMount\", `return (${trimEnd(value.trim(), \";\")})(${varName});`, status, b);\n\t\t\t} else if (name.startsWith(\"on\")) {\n\t\t\t\tbuildEventAttribute(varName, name, value, status, b);\n\t\t\t} else if (name.startsWith(\":transition\")) {\n\t\t\t\tbuildTransitionAttribute(node, varName, name, value, status, b);\n\t\t\t} else if (name === \"class\") {\n\t\t\t\tif (node.scopeStyles) {\n\t\t\t\t\tvalue += `+ \"torp-${status.styleHash}\"`;\n\t\t\t\t}\n\t\t\t\tbuildRun(\"setClassName\", `${varName}.className = ${value};`, status, b);\n\t\t\t} else if (name === \":class\") {\n\t\t\t\tstatus.imports.add(\"t_class\");\n\t\t\t\tif (node.scopeStyles) {\n\t\t\t\t\tvalue += `, \"torp-${status.styleHash}\"`;\n\t\t\t\t}\n\t\t\t\tbuildRun(\"setClasses\", `${varName}.className = t_class(${value});`, status, b);\n\t\t\t} else if (name === \":style\") {\n\t\t\t\tstatus.imports.add(\"t_style\");\n\t\t\t\tbuildRun(\"setStyles\", `${varName}.setAttribute(\"style\", t_style(${value}));`, status, b);\n\t\t\t} else if (name.includes(\"-\")) {\n\t\t\t\t// Handle data-, aria- etc\n\t\t\t\tstatus.imports.add(\"t_attribute\");\n\t\t\t\tbuildRun(\"setDataAttribute\", `t_attribute(${varName}, \"${name}\", ${value});`, status, b);\n\t\t\t\t// NOTE: dataset seems to be a tiny bit slower?\n\t\t\t\t//const propName = name.substring(name.indexOf(\"-\"));\n\t\t\t\t//buildRun(\"setDataAttribute\", `${varName}.dataset.${propName} = ${value};`, status, b);\n\t\t\t} else {\n\t\t\t\tstatus.imports.add(\"t_attribute\");\n\t\t\t\tbuildRun(\"setAttribute\", `t_attribute(${varName}, \"${name}\", ${value});`, status, b);\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction buildBindGroupAttribute(\n\tnode: ElementNode,\n\tvarName: string,\n\tvalue: string,\n\tstatus: BuildStatus,\n\tb: Builder,\n) {\n\tvalue = replaceForVarNames(value, status);\n\n\t// Automatically add an event to bind the value\n\t// TODO: Only tested this with radio buttons\n\tlet eventName = \"change\";\n\tlet inputValue = node.attributes.find((a) => a.name === \"value\")?.value;\n\tlet set = `${value} == ${inputValue}`;\n\tlet propName = \"checked\";\n\tconst setAttribute = `${varName}.${propName} = ${set}`;\n\tbuildRun(\"setBinding\", `${setAttribute};`, status, b);\n\t// TODO: Add a parseInput method that handles NaN etc\n\tstatus.imports.add(\"t_event\");\n\tb.append(`t_event(${varName}, \"${eventName}\", (e) => {\n\t\t\tif (e.target.${propName}) ${value} = ${inputValue};\n\t\t});`);\n}\n\nfunction buildBindAttribute(\n\tnode: ElementNode,\n\tvarName: string,\n\tname: string,\n\tvalue: string,\n\tstatus: BuildStatus,\n\tb: Builder,\n) {\n\tvalue = replaceForVarNames(value, status);\n\n\t// Automatically add an event to bind the value\n\t// TODO: Need to check the element to find out what type of event to add\n\tlet eventName = \"input\";\n\tlet defaultValue = '\"\"';\n\tlet inputValue = \"e.target.value\";\n\tif (node.tagName === \"input\") {\n\t\tlet typeAttribute = node.attributes.find((a) => a.name === \"type\");\n\t\tif (typeAttribute && typeAttribute.value) {\n\t\t\tswitch (trimQuotes(typeAttribute.value)) {\n\t\t\t\tcase \"number\": {\n\t\t\t\t\tdefaultValue = \"0\";\n\t\t\t\t\tinputValue = \"Number(e.target.value)\";\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"checkbox\": {\n\t\t\t\t\tdefaultValue = \"false\";\n\t\t\t\t\tinputValue = \"e.target.checked\";\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"radio\": {\n\t\t\t\t\teventName = \"change\";\n\t\t\t\t\tinputValue = \"e.target.value\";\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else if (node.tagName === \"select\") {\n\t\teventName = \"change\";\n\t}\n\tlet set = `${value} || ${defaultValue}`;\n\tconst propName = name.substring(1);\n\tconst setAttribute = `${varName}.${propName} = ${set}`;\n\tbuildRun(\"setBinding\", `${setAttribute};`, status, b);\n\t// TODO: Add a parseInput method that handles NaN etc\n\tstatus.imports.add(\"t_event\");\n\tb.append(`t_event(${varName}, \"${eventName}\", (e) => ${value} = ${inputValue});`);\n}\n\nfunction buildEventAttribute(\n\tvarName: string,\n\tname: string,\n\tvalue: string,\n\tstatus: BuildStatus,\n\tb: Builder,\n) {\n\tvalue = replaceForVarNames(value, status);\n\n\t// Add an event listener, after the fragment has been added\n\tconst eventName = name.substring(2);\n\tstatus.imports.add(\"t_event\");\n\tb.append(`t_event(${varName}, \"${eventName}\", ${value});`);\n}\n\nfunction buildTransitionAttribute(\n\tnode: ElementNode,\n\tvarName: string,\n\tname: string,\n\tvalue: string,\n\tstatus: BuildStatus,\n\tb: Builder,\n) {\n\tvalue = replaceForVarNames(value, status);\n\n\tstatus.imports.add(\"t_animate\");\n\n\t// Add an in and out transition, after the fragment has been added\n\t// TODO: Separate these -- you should be able to have multiple,\n\t// unrelated entry and exit transitions?\n\tlet entryVarName = nextVarName(\"trans_in\", status);\n\tlet exitVarName = nextVarName(\"trans_out\", status);\n\n\tif (name === \":transition\") {\n\t\tb.append(`const ${entryVarName} = ${getAnimationDetails(value)};`);\n\t\tb.append(`const ${exitVarName} = ${entryVarName};`);\n\t\tb.append(`t_animate(${varName}, ${entryVarName}, ${exitVarName});`);\n\t} else if (name === \":transition-in\") {\n\t\tlet outAttribute = node.attributes.find((a) => a.name === \":transition-out\");\n\t\tif (outAttribute && outAttribute.value) {\n\t\t\tlet outValue = trimMatched(outAttribute.value, \"{\", \"}\");\n\t\t\tb.append(`const ${entryVarName} = ${getAnimationDetails(value)};`);\n\t\t\tb.append(`const ${exitVarName} = ${getAnimationDetails(outValue)};`);\n\t\t\tb.append(`t_animate(${varName}, ${entryVarName}, ${exitVarName});`);\n\t\t} else {\n\t\t\tb.append(`const ${entryVarName} = ${getAnimationDetails(value)};`);\n\t\t\tb.append(`t_animate(${varName}, ${entryVarName});`);\n\t\t}\n\t} else if (name === \":transition-out\") {\n\t\tlet inAttribute = node.attributes.find((a) => a.name === \":transition-in\");\n\t\tif (inAttribute) {\n\t\t\t// This has already been handled with :transition-in, above\n\t\t\treturn;\n\t\t} else {\n\t\t\tb.append(`const ${exitVarName} = ${getAnimationDetails(value)};`);\n\t\t\tb.append(`t_animate(${varName}, null, ${entryVarName});`);\n\t\t}\n\t} else {\n\t\t// TODO: Add an error\n\t}\n}\n\nfunction getAnimationDetails(value: string) {\n\t// HACK: Split by commas, but not when in brackets\n\tlet parts: string[] = [];\n\tlet start = 0;\n\tlet squareCount = 0;\n\tlet curlyCount = 0;\n\tfor (let i = 0; i < value.length; i++) {\n\t\tlet char = value[i];\n\t\tswitch (char) {\n\t\t\tcase \",\":\n\t\t\t\tif (squareCount === 0 && curlyCount === 0) {\n\t\t\t\t\tparts.push(value.substring(start, i));\n\t\t\t\t\tstart = i + 1;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"[\":\n\t\t\t\tsquareCount += 1;\n\t\t\t\tbreak;\n\t\t\tcase \"]\":\n\t\t\t\tsquareCount -= 1;\n\t\t\t\tbreak;\n\t\t\tcase \"{\":\n\t\t\t\tcurlyCount += 1;\n\t\t\t\tbreak;\n\t\t\tcase \"}\":\n\t\t\t\tcurlyCount -= 1;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\tparts.push(value.substring(start));\n\n\t//let func = parts[0].trim();\n\t//let isAnimateFunction = func === \"animate\";\n\t//let options = isAnimateFunction ? parts[2]?.trim() : parts[1]?.trim();\n\t//let keyframes = isAnimateFunction ? parts[1]?.trim() : undefined;\n\t//if (isAnimateFunction) {\n\t//\tstatus.imports.add(\"t_animate\");\n\t//\tfunc = \"t_animate\";\n\t//}\n\n\tlet keyframes = parts[0]?.trim();\n\tlet options = parts[1]?.trim();\n\n\treturn `{ ${[`keyframes: ${keyframes}`, options ? `options: ${options}` : null].filter(Boolean).join(\", \")} }`;\n}\n","import { type RootNode } from \"../../types/nodes/RootNode\";\nimport Builder from \"../../utils/Builder\";\nimport { type BuildStatus } from \"./BuildStatus\";\nimport buildAddFragment from \"./buildAddFragment\";\nimport buildFragment from \"./buildFragment\";\nimport buildNode from \"./buildNode\";\n\nexport default function buildRootNode(\n\tnode: RootNode,\n\tstatus: BuildStatus,\n\tb: Builder,\n\tparentName: string,\n\tanchorName: string,\n): void {\n\tbuildFragment(node, status, b, parentName, anchorName);\n\n\tstatus.fragmentStack.push({\n\t\tfragment: node.fragment,\n\t\tpath: \"0:ch/\",\n\t});\n\tbuildNode(node.children[0], status, b, parentName, anchorName, true);\n\tstatus.fragmentStack.pop();\n\n\tbuildAddFragment(node, status, b, parentName, anchorName);\n}\n","import { type ElementNode } from \"../../types/nodes/ElementNode\";\nimport Builder from \"../../utils/Builder\";\nimport { type BuildStatus } from \"./BuildStatus\";\nimport buildNode from \"./buildNode\";\n\nexport default function buildHeadNode(node: ElementNode, status: BuildStatus, b: Builder): void {\n\tb.append(\"\");\n\tb.append(\"/* @head */\");\n\n\tstatus.inHead = true;\n\tfor (let child of node.children) {\n\t\tbuildNode(child, status, b, \"undefined\", \"undefined\");\n\t}\n\tstatus.inHead = false;\n\n\tb.append(\"\");\n}\n","import { type ElementNode } from \"../../types/nodes/ElementNode\";\nimport isSpecialNode from \"../../types/nodes/isSpecialNode\";\nimport Builder from \"../../utils/Builder\";\nimport trimQuotes from \"../../utils/trimQuotes\";\nimport isFullyReactive from \"../utils/isFullyReactive\";\nimport isReactive from \"../utils/isReactive\";\nimport nextVarName from \"../utils/nextVarName\";\nimport { type BuildStatus } from \"./BuildStatus\";\nimport buildAddFragment from \"./buildAddFragment\";\nimport buildFragment from \"./buildFragment\";\nimport buildNode from \"./buildNode\";\nimport buildRun from \"./buildRun\";\n\nexport default function buildSlotNode(node: ElementNode, status: BuildStatus, b: Builder): void {\n\t// If there's a slot, build that, otherwise build the default nodes\n\tlet slotName = node.attributes.find((a) => a.name === \"name\")?.value;\n\tslotName = slotName ? trimQuotes(slotName) : \"_\";\n\n\t// Slot props\n\tconst propsName = nextVarName(\"sprops\", status);\n\tconst slotAttributes = node.attributes.filter((a) => a.name !== \"name\");\n\tconst slotHasProps = slotAttributes.length;\n\tif (slotHasProps) {\n\t\t// TODO: defaults etc props\n\t\tstatus.imports.add(\"$watch\");\n\t\tb.append(`const ${propsName} = $watch({});`);\n\t\tfor (let { name, value } of slotAttributes) {\n\t\t\tif (name.startsWith(\"{\") && name.endsWith(\"}\")) {\n\t\t\t\t// It's a shortcut attribute\n\t\t\t\tname = name.substring(1, name.length - 1);\n\t\t\t\tbuildRun(\"setProp\", `${propsName}[\"${name}\"] = ${name};`, status, b);\n\t\t\t} else if (value != null) {\n\t\t\t\tlet fullyReactive = isFullyReactive(value);\n\t\t\t\tlet partlyReactive = isReactive(value);\n\t\t\t\tif (fullyReactive) {\n\t\t\t\t\tvalue = value.substring(1, value.length - 1);\n\t\t\t\t} else if (partlyReactive) {\n\t\t\t\t\tvalue = `\\`${trimQuotes(value).replaceAll(\"{\", \"${\")}\\``;\n\t\t\t\t}\n\t\t\t\tconst setProp = `${propsName}[\"${name}\"] = ${value}`;\n\t\t\t\tif (fullyReactive || partlyReactive) {\n\t\t\t\t\tbuildRun(\"setProp\", `${setProp};`, status, b);\n\t\t\t\t} else {\n\t\t\t\t\tb.append(`${setProp};`);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tb.append(`${propsName}[\"${name}\"] = true;`);\n\t\t\t}\n\t\t}\n\t}\n\n\tconst slotParentName = node.parentName!;\n\tconst slotAnchorName = node.varName!;\n\n\tb.append(`if ($slots && $slots[\"${slotName}\"]) {`);\n\tlet params = [slotParentName, slotAnchorName, slotHasProps ? propsName : \"undefined\", \"$context\"];\n\tb.append(`$slots[\"${slotName}\"](${params.join(\", \")})`);\n\n\t// TODO: Maybe not if there's only a single space node?\n\tconst fill = node.children.find((c) => isSpecialNode(c) && c.tagName === \":fill\");\n\tif (fill && isSpecialNode(fill) && fill.children.length) {\n\t\tb.append(`} else {`);\n\n\t\tbuildFragment(fill, status, b, slotParentName, slotAnchorName);\n\n\t\tstatus.fragmentStack.push({\n\t\t\tfragment: fill.fragment,\n\t\t\tpath: \"0:ch/\",\n\t\t});\n\t\tfor (let child of fill.children) {\n\t\t\tbuildNode(child, status, b, slotParentName, slotAnchorName);\n\t\t}\n\t\tstatus.fragmentStack.pop();\n\n\t\tbuildAddFragment(fill, status, b, slotParentName, slotAnchorName);\n\t}\n\n\tb.append(`}`);\n}\n","import { type ElementNode } from \"../../types/nodes/ElementNode\";\nimport Builder from \"../../utils/Builder\";\nimport { type BuildStatus } from \"./BuildStatus\";\nimport buildComponentNode from \"./buildComponentNode\";\nimport buildElementNode from \"./buildElementNode\";\nimport buildHeadNode from \"./buildHeadNode\";\nimport buildSlotNode from \"./buildSlotNode\";\n\nexport default function buildSpecialNode(\n\tnode: ElementNode,\n\tstatus: BuildStatus,\n\tb: Builder,\n\tparentName: string,\n\troot = false,\n) {\n\tswitch (node.tagName) {\n\t\tcase \":slot\": {\n\t\t\tbuildSlotNode(node, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \":element\": {\n\t\t\tbuildElementNode(node, status, b, parentName, root);\n\t\t\tbreak;\n\t\t}\n\t\tcase \":component\": {\n\t\t\tbuildComponentNode(node, status, b, root);\n\t\t\tbreak;\n\t\t}\n\t\tcase \":head\": {\n\t\t\tbuildHeadNode(node, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \":fill\": {\n\t\t\t// HACK:\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\tthrow new Error(`Invalid special node: ${node.tagName}`);\n\t\t}\n\t}\n\treturn \"\";\n}\n","import { type TextNode } from \"../../types/nodes/TextNode\";\nimport Builder from \"../../utils/Builder\";\nimport { type BuildStatus } from \"./BuildStatus\";\nimport buildRun from \"./buildRun\";\n\nexport default function buildTextNode(node: TextNode, status: BuildStatus, b: Builder): void {\n\tlet content = node.content || \"\";\n\n\tif (!status.preserveWhitespace) {\n\t\t// Replace all spaces with a single space, both to save space and to remove\n\t\t// newlines from generated JS strings\n\t\tcontent = content.replaceAll(/\\s+/g, \" \");\n\t}\n\n\t// TODO: Move all of this logic into parse, for text nodes and attribute values\n\tlet textContent = \"\";\n\tlet reactiveCount = 0;\n\tlet level = 0;\n\tlet maxLevel = 0;\n\tfor (let i = 0; i < content.length; i++) {\n\t\tconst char = content[i];\n\t\tconst nextChar = content[i + 1];\n\t\tif (char === \"{\") {\n\t\t\tlevel++;\n\t\t\tmaxLevel = Math.max(level, maxLevel);\n\t\t\tif (level === 1) {\n\t\t\t\treactiveCount += 1;\n\t\t\t\ttextContent += \"${t_fmt(\";\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t} else if (char === \"}\") {\n\t\t\tlevel--;\n\t\t\tif (level === 0) {\n\t\t\t\ttextContent += \")\";\n\t\t\t}\n\t\t} else if (char === \"`\" && level === 0) {\n\t\t\t// Escape backticks outside of braces, as they will be within a backtick string\n\t\t\ttextContent += \"\\\\\";\n\t\t} else if (level > 0) {\n\t\t\tif (char === \"/\" && nextChar === \"/\") {\n\t\t\t\t// Skip one-line comments\n\t\t\t\tlet start = i;\n\t\t\t\ti = content.indexOf(\"\\n\", i);\n\t\t\t\ttextContent += content.substring(start, i + 1);\n\t\t\t\tcontinue;\n\t\t\t} else if (char === \"/\" && nextChar === \"*\") {\n\t\t\t\t// Skip block comments\n\t\t\t\tlet start = i;\n\t\t\t\ti = content.indexOf(\"*/\", i) + 1;\n\t\t\t\ttextContent += content.substring(start, i + 1);\n\t\t\t\tcontinue;\n\t\t\t} else if (char === '\"' || char === \"'\") {\n\t\t\t\t// Skip string contents\n\t\t\t\tlet start = i;\n\t\t\t\tfor (let j = i + 1; j < content.length; j++) {\n\t\t\t\t\tif (content[j] === char && content[j - 1] !== \"\\\\\") {\n\t\t\t\t\t\ti = j;\n\t\t\t\t\t\ttextContent += content.substring(start, i + 1);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t} else if (char === \"`\") {\n\t\t\t\t// Skip possibly interpolated string contents\n\t\t\t\t// TODO: Recursively skip strings inside the interpolated JS\n\t\t\t\tlet start = i;\n\t\t\t\tlet level2 = 0;\n\t\t\t\tfor (let j = i + 1; j < content.length; j++) {\n\t\t\t\t\tif (content[j] === char && content[j - 1] !== \"\\\\\" && level2 === 0) {\n\t\t\t\t\t\ti = j;\n\t\t\t\t\t\ttextContent += content.substring(start, i + 1);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t} else if (content[j] === \"{\" && (level2 > 0 || content[j - 1] === \"$\")) {\n\t\t\t\t\t\tlevel2 += 1;\n\t\t\t\t\t} else if (content[j] === \"}\" && level2 > 0) {\n\t\t\t\t\t\tlevel2 -= 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\ttextContent += content[i];\n\t}\n\n\t// TODO: Only need to build if this is not 0\n\tif (maxLevel) {\n\t\tif (reactiveCount === 1 && content.startsWith(\"{\") && content.endsWith(\"}\")) {\n\t\t\ttextContent = textContent.substring(2, textContent.length - 1);\n\t\t} else {\n\t\t\ttextContent = `\\`${textContent}\\``;\n\t\t}\n\n\t\tstatus.imports.add(\"t_fmt\");\n\t\tbuildRun(\"setTextContent\", `${node.varName}.textContent = ${textContent};`, status, b);\n\t}\n}\n","import { type ControlNode } from \"../../types/nodes/ControlNode\";\nimport { type ElementNode } from \"../../types/nodes/ElementNode\";\nimport { type RootNode } from \"../../types/nodes/RootNode\";\nimport { type TemplateNode } from \"../../types/nodes/TemplateNode\";\nimport { type TextNode } from \"../../types/nodes/TextNode\";\nimport Builder from \"../../utils/Builder\";\nimport { type BuildStatus } from \"./BuildStatus\";\nimport buildComponentNode from \"./buildComponentNode\";\nimport buildControlNode from \"./buildControlNode\";\nimport buildElementNode from \"./buildElementNode\";\nimport buildRootNode from \"./buildRootNode\";\nimport buildSpecialNode from \"./buildSpecialNode\";\nimport buildTextNode from \"./buildTextNode\";\n\nexport default function buildNode(\n\tnode: TemplateNode,\n\tstatus: BuildStatus,\n\tb: Builder,\n\tparentName: string,\n\tanchorName: string,\n\troot = false,\n): void {\n\t// Nodes with anchors will have been handled when their containing fragment\n\t// was built so we want to skip them here\n\tif (node.handled) {\n\t\tnode.handled = false;\n\t\treturn;\n\t}\n\n\tswitch (node.type) {\n\t\tcase \"root\": {\n\t\t\tbuildRootNode(node as RootNode, status, b, parentName, anchorName);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"control\": {\n\t\t\tbuildControlNode(node as ControlNode, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"component\": {\n\t\t\tbuildComponentNode(node as ElementNode, status, b, root);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"element\": {\n\t\t\tbuildElementNode(node as ElementNode, status, b, parentName, root);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"text\": {\n\t\t\tbuildTextNode(node as TextNode, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"special\": {\n\t\t\tbuildSpecialNode(node as ElementNode, status, b, parentName, root);\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\tthrow new Error(`Invalid node type: ${node.type}`);\n\t\t}\n\t}\n}\n","import { type BuildOptions } from \"../../../types/BuildOptions\";\nimport { type Template } from \"../../../types/Template\";\nimport Builder from \"../../utils/Builder\";\nimport { type BuildStatus } from \"./BuildStatus\";\nimport buildFragmentText from \"./buildFragmentText\";\nimport buildNode from \"./buildNode\";\n\nconst importsMap: Record<string, string> = {\n\t$watch: 'import { $watch } from \"${folder}\";',\n\t$unwrap: 'import { $unwrap } from \"${folder}\";',\n\t$run: 'import { $run } from \"${folder}\";',\n\t$mount: 'import { $mount } from \"${folder}\";',\n\tt_flush: 'import { t_flush } from \"${folder}\";',\n\tt_range: 'import { t_range } from \"${folder}\";',\n\tt_push_range: 'import { t_push_range } from \"${folder}\";',\n\tt_pop_range: 'import { t_pop_range } from \"${folder}\";',\n\tt_run_control: 'import { t_run_control } from \"${folder}\";',\n\tt_run_branch: 'import { t_run_branch } from \"${folder}\";',\n\tt_list_item: 'import { t_list_item } from \"${folder}\";',\n\tt_run_list: 'import { t_run_list } from \"${folder}\";',\n\tt_add_fragment: 'import { t_add_fragment } from \"${folder}\";',\n\tt_apply_props: 'import { t_apply_props } from \"${folder}\";',\n\tt_class: 'import { t_class } from \"${folder}\";',\n\tt_style: 'import { t_style } from \"${folder}\";',\n\tt_attribute: 'import { t_attribute } from \"${folder}\";',\n\tt_dynamic: 'import { t_dynamic } from \"${folder}\";',\n\tt_fmt: 'import { t_fmt } from \"${folder}\";',\n\tt_fragment: 'import { t_fragment } from \"${folder}\";',\n\tt_event: 'import { t_event } from \"${folder}\";',\n\tt_animate: 'import { t_animate } from \"${folder}\";',\n\tt_root: 'import { t_root } from \"${folder}\";',\n\tt_anchor: 'import { t_anchor } from \"${folder}\";',\n\tt_child: 'import { t_child } from \"${folder}\";',\n\tt_next: 'import { t_next } from \"${folder}\";',\n\tt_frg: 'import { t_frg } from \"${folder}\";',\n\tt_elm: 'import { t_elm } from \"${folder}\";',\n\tt_txt: 'import { t_txt } from \"${folder}\";',\n\tt_cmt: 'import { t_cmt } from \"${folder}\";',\n\tListItem: 'import { type ListItem } from \"${folder}\";',\n\tSlotRender: 'import { type SlotRender } from \"${folder}\";',\n};\n\nexport default function buildCode(template: Template, options?: BuildOptions): string {\n\tlet b = new Builder();\n\n\t// Gather imports as we go so they can be placed at the top\n\tlet imports = new Set<string>();\n\timports.add(\"SlotRender\");\n\n\t// Build the component\n\tbuildTemplate(template, imports, b);\n\n\t// Add the gathered imports in alphabetical order\n\tif (imports.size) {\n\t\tb.prepend(\"\");\n\t\tfor (let imp of Array.from(imports).sort().reverse()) {\n\t\t\timp = importsMap[imp] || imp;\n\t\t\tb.prepend(imp.replace(\"${folder}\", options?.renderFolder || \"@torpor/view\"));\n\t\t}\n\t}\n\n\treturn b.toString();\n}\n\nfunction buildTemplate(template: Template, imports: Set<string>, b: Builder) {\n\tlet script = template.script || \"\";\n\n\t// Add default imports\n\tif (/\\$watch\\b/.test(script)) imports.add(\"$watch\");\n\tif (/\\$unwrap\\b/.test(script)) imports.add(\"$unwrap\");\n\tif (/\\$run\\b/.test(script)) imports.add(\"$run\");\n\tif (/\\$mount\\b/.test(script)) imports.add(\"$mount\");\n\n\tlet currentIndex = 0;\n\tlet current = template.components[0];\n\n\tlet marker = 0;\n\tfor (let i = 0; i < script.length; i++) {\n\t\tif (script.substring(i, i + \"/* @params */\".length) === \"/* @params */\") {\n\t\t\tb.append(script.substring(marker, i));\n\n\t\t\t// TODO: Support other params, like the user setting $context\n\t\t\tlet params = [\n\t\t\t\t\"$parent: ParentNode\",\n\t\t\t\t\"$anchor: Node | null\",\n\t\t\t\tcurrent.params ??\n\t\t\t\t\t`${current.props?.length ? \"$props\" : \"// @ts-ignore\\n$props?\"}: Record<PropertyKey, any>`,\n\t\t\t\t`${current.contextProps?.length ? \"\" : \"// @ts-ignore\\n\"}$context?: Record<PropertyKey, any>`,\n\t\t\t\t`${current.slotProps?.length ? \"\" : \"// @ts-ignore\\n\"}$slots?: Record<string, SlotRender>`,\n\t\t\t];\n\t\t\tb.append(params.join(\",\\n\"));\n\n\t\t\tmarker = i + \"/* @params */\".length;\n\t\t} else if (script.substring(i, i + \"/* @start */\".length) === \"/* @start */\") {\n\t\t\tb.append(script.substring(marker, i));\n\n\t\t\t// Make sure we've got $props if we're going to be using it\n\t\t\tif (current.props?.length) {\n\t\t\t\tb.append(`$props ??= {};`);\n\t\t\t}\n\n\t\t\t// Redefine $context so that any newly added properties will only be passed to children\n\t\t\tif (current.contextProps?.length) {\n\t\t\t\tb.append(`$context = Object.assign({}, $context);`);\n\t\t\t}\n\n\t\t\tb.append(\"\");\n\n\t\t\tmarker = i + \"/* @start */\".length;\n\t\t} else if (script.substring(i, i + \"/* @render */\".length) === \"/* @render */\") {\n\t\t\tb.append(script.substring(marker, i));\n\n\t\t\tif (current.markup) {\n\t\t\t\tconst status: BuildStatus = {\n\t\t\t\t\timports,\n\t\t\t\t\tprops: current.props || [],\n\t\t\t\t\tcontextProps: current.contextProps || [],\n\t\t\t\t\tslotProps: current.slotProps || [],\n\t\t\t\t\tstyleHash: current.style?.hash || \"\",\n\t\t\t\t\tvarNames: {},\n\t\t\t\t\tfragmentStack: [],\n\t\t\t\t\tforVarNames: [],\n\t\t\t\t\tns: false,\n\t\t\t\t\tpreserveWhitespace: false,\n\t\t\t\t};\n\n\t\t\t\t// Add the interface\n\t\t\t\tb.append(\"\");\n\t\t\t\tb.append(\"/* User interface */\");\n\t\t\t\tbuildFragmentText(current.markup, status, b);\n\t\t\t\tb.append(\"\");\n\t\t\t\tbuildNode(current.markup, status, b, \"$parent\", \"$anchor\", true);\n\t\t\t}\n\n\t\t\tmarker = i + \"/* @render */\".length;\n\t\t} else if (script.substring(i, i + \"/* @end */\".length) === \"/* @end */\") {\n\t\t\tb.append(script.substring(marker, i));\n\n\t\t\tcurrentIndex += 1;\n\t\t\tcurrent = template.components[currentIndex];\n\n\t\t\t// TODO: Only if the component has $mount\n\t\t\t// Flush any $mount calls that were encountered -- move this to\n\t\t\t// addFragment, because we also have to flush events and animations\n\t\t\tif (imports.has(\"$mount\")) {\n\t\t\t\timports.add(\"t_flush\");\n\t\t\t\tb.append(\"\");\n\t\t\t\tb.append(\"t_flush();\");\n\t\t\t}\n\n\t\t\tmarker = i + \"/* @end */\".length;\n\t\t}\n\t}\n\n\tb.append(script.substring(marker));\n}\n","import { type Attribute } from \"../../types/nodes/Attribute\";\nimport { type Style } from \"../../types/styles/Style\";\nimport { type StyleBlock } from \"../../types/styles/StyleBlock\";\nimport Builder from \"../../utils/Builder\";\n\nexport default function buildStyles(style: Style, styleHash: string): string {\n\tconst b = new Builder();\n\n\tfor (let block of style.blocks) {\n\t\tbuildStyleBlock(block, b, styleHash);\n\t}\n\n\treturn b.toString();\n}\n\nconst globalStyleRegex = /\\:global\\((.+)\\)/;\n\nfunction buildStyleBlock(block: StyleBlock, b: Builder, styleHash: string) {\n\t// TODO: This should probably be done while parsing\n\t// And handle attribute selectors\n\tconst selectors = block.selector\n\t\t.split(/([\\s*,>+~])/)\n\t\t.filter((s) => !!s.trim())\n\t\t.map((s) => {\n\t\t\tif (s.length === 1 && \"*,>+~\".includes(s)) {\n\t\t\t\treturn s;\n\t\t\t} else if (globalStyleRegex.test(s)) {\n\t\t\t\treturn s.match(globalStyleRegex)![1];\n\t\t\t} else {\n\t\t\t\treturn `${s}.torp-${styleHash}`;\n\t\t\t}\n\t\t});\n\n\tb.append(`${selectors.join(\" \")} {`);\n\tfor (let attribute of block.attributes) {\n\t\tbuildStyleAttribute(attribute, b);\n\t}\n\tfor (let child of block.children) {\n\t\tbuildStyleBlock(child, b, styleHash);\n\t}\n\tb.append(`}`);\n}\n\nfunction buildStyleAttribute(attribute: Attribute, b: Builder) {\n\tb.append(`${attribute.name}: ${attribute.value};`);\n}\n","import { ANCHOR_COMMENT } from \"../../types/comments\";\nimport { type ElementNode } from \"../../types/nodes/ElementNode\";\nimport isSpecialNode from \"../../types/nodes/isSpecialNode\";\nimport Builder from \"../../utils/Builder\";\nimport trimMatched from \"../../utils/trimMatched\";\nimport trimQuotes from \"../../utils/trimQuotes\";\nimport isFullyReactive from \"../utils/isFullyReactive\";\nimport isReactive from \"../utils/isReactive\";\nimport nextVarName from \"../utils/nextVarName\";\nimport { type BuildServerStatus } from \"./BuildServerStatus\";\nimport buildServerNode from \"./buildServerNode\";\n\nexport default function buildServerComponentNode(\n\tnode: ElementNode,\n\tstatus: BuildServerStatus,\n\tb: Builder,\n): void {\n\tif (status.output) {\n\t\tb.append(`$output += \\`${status.output}\\`;`);\n\t\tstatus.output = \"\";\n\t}\n\n\t// Props\n\tconst componentHasProps = node.attributes.length; // || root;\n\tconst propsName = componentHasProps ? nextVarName(\"props\", status) : \"undefined\";\n\tif (componentHasProps) {\n\t\t// TODO: defaults etc props\n\t\tb.append(`const ${propsName}: any = {};`);\n\t\tfor (let { name, value } of node.attributes) {\n\t\t\tif (name.startsWith(\"{\") && name.endsWith(\"}\")) {\n\t\t\t\t// It's a shortcut attribute\n\t\t\t\tname = name.substring(1, name.length - 1);\n\t\t\t\tb.append(`${propsName}[\"${name}\"] = ${name};`);\n\t\t\t} else if (value != null) {\n\t\t\t\tlet fullyReactive = isFullyReactive(value);\n\t\t\t\tlet partlyReactive = isReactive(value);\n\t\t\t\tif (fullyReactive) {\n\t\t\t\t\tvalue = value.substring(1, value.length - 1);\n\t\t\t\t} else if (partlyReactive) {\n\t\t\t\t\tvalue = `\\`${trimQuotes(value).replaceAll(\"{\", \"${\")}\\``;\n\t\t\t\t}\n\t\t\t\tif (name === \"class\") {\n\t\t\t\t\t// TODO: How to handle dynamic classes etc\n\t\t\t\t\t// Probably just compile down to a string?\n\t\t\t\t\tb.append(`\"${trimQuotes(value)} torp-${status.styleHash}\"`);\n\t\t\t\t}\n\t\t\t\tb.append(`${propsName}[\"${name}\"] = ${value};`);\n\t\t\t} else {\n\t\t\t\tb.append(`${propsName}[\"${name}\"] = true;`);\n\t\t\t}\n\t\t}\n\t\t// NOTE: Not sure if this is needed\n\t\t/*\n\t\tif (root) {\n\t\t\tb.append(`\n\t\t\tif ($props) {\n\t\t\t\tconst propNames = [${status.props.map((p) => `'${p}'`).join(\", \")}];\n\t\t\t\tfor (let name of Object.keys($props)) {\n\t\t\t\t\tif (!name.startsWith(\"$\") && !propNames.includes(name)) {\n\t\t\t\t\t\t${propsName}[name] = $props[name];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}`);\n\t\t}\n\t\t*/\n\t}\n\n\t// Slots\n\tconst componentHasSlots = node.children.length;\n\tconst slotsName = componentHasSlots ? nextVarName(\"slots\", status) : \"undefined\";\n\tif (componentHasSlots) {\n\t\tb.append(`const ${slotsName}: Record<string, ServerSlotRender> = {};`);\n\t\tfor (let slot of node.children) {\n\t\t\tif (isSpecialNode(slot)) {\n\t\t\t\tconst nameAttribute = slot.attributes.find((a) => a.name === \"name\");\n\t\t\t\tconst slotName = nameAttribute?.value ? trimQuotes(nameAttribute.value) : \"_\";\n\t\t\t\tconst slotParams = [\n\t\t\t\t\t\"// @ts-ignore\\n$sprops?: Record<PropertyKey, any>\",\n\t\t\t\t\t\"// @ts-ignore\\n$context?: Record<PropertyKey, any>\",\n\t\t\t\t];\n\t\t\t\tb.append(`${slotsName}[\"${slotName}\"] = (\\n${slotParams.join(\",\\n\")}\\n) => {`);\n\t\t\t\tb.append(`let $output = \"\";`);\n\n\t\t\t\tfor (let child of slot.children) {\n\t\t\t\t\tbuildServerNode(child, status, b);\n\t\t\t\t}\n\n\t\t\t\tif (status.output) {\n\t\t\t\t\tb.append(`$output += \\`${status.output}\\`;`);\n\t\t\t\t\tstatus.output = \"\";\n\t\t\t\t}\n\n\t\t\t\tb.append(\"return $output;\");\n\t\t\t\tb.append(`}`);\n\t\t\t}\n\t\t}\n\t}\n\n\tlet componentName = node.tagName;\n\tif (componentName === \":component\") {\n\t\tlet selfAttribute = node.attributes.find((a) => a.name === \"self\");\n\t\tif (selfAttribute && selfAttribute.value) {\n\t\t\tcomponentName = trimMatched(selfAttribute.value, \"{\", \"}\");\n\t\t}\n\t}\n\n\t// Render the component\n\tlet renderParams = `${propsName}, $context`;\n\tif (slotsName !== \"undefined\") {\n\t\trenderParams += `, ${slotsName}`;\n\t}\n\tb.append(\"\");\n\tb.append(`$output += ${componentName}(${renderParams})`);\n\n\t// If we're using a @replace to update a :component, we need another anchor comment\n\tif (node.tagName === \":component\") {\n\t\tstatus.output += ANCHOR_COMMENT;\n\t}\n}\n","import {\n\tANCHOR_COMMENT,\n\tHYDRATION_END_COMMENT,\n\tHYDRATION_START_COMMENT,\n} from \"../../types/comments\";\nimport { type ControlNode } from \"../../types/nodes/ControlNode\";\nimport isControlNode from \"../../types/nodes/isControlNode\";\nimport Builder from \"../../utils/Builder\";\nimport { type BuildServerStatus } from \"./BuildServerStatus\";\nimport buildServerNode from \"./buildServerNode\";\n\nexport default function buildServerAwaitNode(\n\tnode: ControlNode,\n\tstatus: BuildServerStatus,\n\tb: Builder,\n): void {\n\t// Surround the entire control statement with bracketed comments, so that we\n\t// can skip to the end to set the anchor node when hydrating\n\tstatus.output += HYDRATION_START_COMMENT;\n\n\tif (status.output) {\n\t\tb.append(`$output += \\`${status.output}\\`;`);\n\t\tstatus.output = \"\";\n\t}\n\n\t// Build the await statement\n\tfor (let branch of node.children) {\n\t\tif (isControlNode(branch) && branch.operation === \"@await\") {\n\t\t\tbuildServerAwaitBranch(branch, status, b);\n\t\t}\n\t}\n\n\t// End the control statement\n\tstatus.output += HYDRATION_END_COMMENT;\n\n\t// Add the anchor node\n\tstatus.output += ANCHOR_COMMENT;\n}\n\nfunction buildServerAwaitBranch(node: ControlNode, status: BuildServerStatus, b: Builder) {\n\tfor (let child of node.children) {\n\t\tbuildServerNode(child, status, b);\n\t}\n\n\tif (status.output) {\n\t\tb.append(`$output += \\`${status.output}\\`;`);\n\t\tstatus.output = \"\";\n\t}\n}\n","import {\n\tANCHOR_COMMENT,\n\tHYDRATION_BRANCH_COMMENT,\n\tHYDRATION_END_COMMENT,\n\tHYDRATION_START_COMMENT,\n} from \"../../types/comments\";\nimport { type ControlNode } from \"../../types/nodes/ControlNode\";\nimport isControlNode from \"../../types/nodes/isControlNode\";\nimport Builder from \"../../utils/Builder\";\nimport { type BuildServerStatus } from \"./BuildServerStatus\";\nimport buildServerNode from \"./buildServerNode\";\n\nexport default function buildServerForNode(\n\tnode: ControlNode,\n\tstatus: BuildServerStatus,\n\tb: Builder,\n): void {\n\t// Surround the entire control statement with bracketed comments, so that we\n\t// can skip to the end to set the anchor node when hydrating\n\tstatus.output += HYDRATION_START_COMMENT;\n\n\tif (status.output) {\n\t\tb.append(`$output += \\`${status.output}\\`;`);\n\t\tstatus.output = \"\";\n\t}\n\n\t// Build the for statement\n\tfor (let branch of node.children) {\n\t\tif (isControlNode(branch)) {\n\t\t\tbuildServerForBranch(branch, status, b);\n\t\t}\n\t}\n\n\t// End the control statement\n\tstatus.output += HYDRATION_END_COMMENT;\n\n\t// Add the anchor node\n\tstatus.output += ANCHOR_COMMENT;\n}\n\nfunction buildServerForBranch(node: ControlNode, status: BuildServerStatus, b: Builder) {\n\tb.append(`${node.statement} {`);\n\n\t// Separate spaces across boundaries with a careted comment\n\tstatus.output += HYDRATION_BRANCH_COMMENT;\n\n\tfor (let child of node.children) {\n\t\tbuildServerNode(child, status, b);\n\t}\n\n\tif (status.output) {\n\t\tb.append(`$output += \\`${status.output}\\`;`);\n\t\tstatus.output = \"\";\n\t}\n\n\tb.append(\"}\");\n}\n","import {\n\tANCHOR_COMMENT,\n\tHYDRATION_END_COMMENT,\n\tHYDRATION_START_COMMENT,\n} from \"../../types/comments\";\nimport { type ControlNode } from \"../../types/nodes/ControlNode\";\nimport isControlNode from \"../../types/nodes/isControlNode\";\nimport { type BuildServerStatus } from \"./BuildServerStatus\";\n\nexport default function buildServerHtmlNode(node: ControlNode, status: BuildServerStatus): void {\n\t// Surround the entire control statement with bracketed comments, so that we\n\t// can skip to the end to set the anchor node when hydrating\n\tstatus.output += HYDRATION_START_COMMENT;\n\n\t// Build the html statement\n\tfor (let branch of node.children) {\n\t\tif (isControlNode(branch)) {\n\t\t\tstatus.output += `\\${${branch.statement}}`;\n\t\t}\n\t}\n\n\t// End the control statement\n\tstatus.output += HYDRATION_END_COMMENT;\n\n\t// Add the anchor node\n\tstatus.output += ANCHOR_COMMENT;\n}\n","import {\n\tANCHOR_COMMENT,\n\tHYDRATION_END_COMMENT,\n\tHYDRATION_START_COMMENT,\n} from \"../../types/comments\";\nimport { type ControlNode } from \"../../types/nodes/ControlNode\";\nimport isControlNode from \"../../types/nodes/isControlNode\";\nimport Builder from \"../../utils/Builder\";\nimport { type BuildServerStatus } from \"./BuildServerStatus\";\nimport buildServerNode from \"./buildServerNode\";\n\nexport default function buildServerIfNode(\n\tnode: ControlNode,\n\tstatus: BuildServerStatus,\n\tb: Builder,\n): void {\n\t// Surround the entire control statement with bracketed comments, so that we\n\t// can skip to the end to set the anchor node when hydrating\n\tstatus.output += HYDRATION_START_COMMENT;\n\n\tif (status.output) {\n\t\tb.append(`$output += \\`${status.output}\\`;`);\n\t\tstatus.output = \"\";\n\t}\n\n\t// Build the if statement\n\tfor (let branch of node.children) {\n\t\tif (isControlNode(branch)) {\n\t\t\tbuildServerIfBranch(branch, status, b);\n\t\t}\n\t}\n\n\t// End the control statement\n\tstatus.output += HYDRATION_END_COMMENT;\n\n\t// Add the anchor node\n\tstatus.output += ANCHOR_COMMENT;\n}\n\nfunction buildServerIfBranch(node: ControlNode, status: BuildServerStatus, b: Builder) {\n\tb.append(`${node.statement} {`);\n\n\tfor (let child of node.children) {\n\t\tbuildServerNode(child, status, b);\n\t}\n\n\tif (status.output) {\n\t\tb.append(`$output += \\`${status.output}\\`;`);\n\t\tstatus.output = \"\";\n\t}\n\n\tb.append(\"}\");\n}\n","import {\n\tANCHOR_COMMENT,\n\tHYDRATION_END_COMMENT,\n\tHYDRATION_START_COMMENT,\n} from \"../../types/comments\";\nimport { type ControlNode } from \"../../types/nodes/ControlNode\";\nimport isControlNode from \"../../types/nodes/isControlNode\";\nimport Builder from \"../../utils/Builder\";\nimport { type BuildServerStatus } from \"./BuildServerStatus\";\nimport buildServerNode from \"./buildServerNode\";\n\nexport default function buildServerReplaceNode(\n\tnode: ControlNode,\n\tstatus: BuildServerStatus,\n\tb: Builder,\n): void {\n\t// Surround the entire control statement with bracketed comments, so that we\n\t// can skip to the end to set the anchor node when hydrating\n\tstatus.output += HYDRATION_START_COMMENT;\n\n\tif (status.output) {\n\t\tb.append(`$output += \\`${status.output}\\`;`);\n\t\tstatus.output = \"\";\n\t}\n\n\t// Build the replace statement\n\tfor (let branch of node.children) {\n\t\tif (isControlNode(branch)) {\n\t\t\tbuildServerReplaceBranch(branch, status, b);\n\t\t}\n\t}\n\n\t// End the control statement\n\tstatus.output += HYDRATION_END_COMMENT;\n\n\t// Add the anchor node\n\tstatus.output += ANCHOR_COMMENT;\n}\n\nfunction buildServerReplaceBranch(node: ControlNode, status: BuildServerStatus, b: Builder) {\n\tb.append(`${node.statement};`);\n\n\tfor (let child of node.children) {\n\t\tbuildServerNode(child, status, b);\n\t}\n\n\tif (status.output) {\n\t\tb.append(`$output += \\`${status.output}\\`;`);\n\t\tstatus.output = \"\";\n\t}\n}\n","import { type ControlNode } from \"../../types/nodes/ControlNode\";\nimport Builder from \"../../utils/Builder\";\n\nexport default function buildServerScriptNode(node: ControlNode, b: Builder): void {\n\tb.append(`${maybeAppend(node.statement, \";\")}`);\n}\n\nfunction maybeAppend(text: string, end: string) {\n\tif (!text.endsWith(end)) {\n\t\ttext += end;\n\t}\n\treturn text;\n}\n","import {\n\tANCHOR_COMMENT,\n\tHYDRATION_END_COMMENT,\n\tHYDRATION_START_COMMENT,\n} from \"../../types/comments\";\nimport { type ControlNode } from \"../../types/nodes/ControlNode\";\nimport isControlNode from \"../../types/nodes/isControlNode\";\nimport Builder from \"../../utils/Builder\";\nimport { type BuildServerStatus } from \"./BuildServerStatus\";\nimport buildServerNode from \"./buildServerNode\";\n\nexport default function buildServerSwitchNode(\n\tnode: ControlNode,\n\tstatus: BuildServerStatus,\n\tb: Builder,\n): void {\n\t// Surround the entire control statement with bracketed comments, so that we\n\t// can skip to the end to set the anchor node when hydrating\n\tstatus.output += HYDRATION_START_COMMENT;\n\n\tif (status.output) {\n\t\tb.append(`$output += \\`${status.output}\\`;`);\n\t\tstatus.output = \"\";\n\t}\n\n\t// Build the switch statement\n\tb.append(`${node.statement} {`);\n\tfor (let branch of node.children.filter((c) => isControlNode(c))) {\n\t\tif (isControlNode(branch)) {\n\t\t\tbuildServerSwitchBranch(branch, status, b);\n\t\t}\n\t}\n\tb.append(\"}\");\n\n\t// End the control statement\n\tstatus.output += HYDRATION_END_COMMENT;\n\n\t// Add the anchor node\n\tstatus.output += ANCHOR_COMMENT;\n}\n\nfunction buildServerSwitchBranch(node: ControlNode, status: BuildServerStatus, b: Builder) {\n\tb.append(`${node.statement} {`);\n\n\tfor (let child of node.children) {\n\t\tbuildServerNode(child, status, b);\n\t}\n\n\tif (status.output) {\n\t\tb.append(`$output += \\`${status.output}\\`;`);\n\t\tstatus.output = \"\";\n\t}\n\n\tb.append(\"break;\");\n\tb.append(\"}\");\n}\n","import { type ControlNode } from \"../../types/nodes/ControlNode\";\nimport Builder from \"../../utils/Builder\";\nimport { type BuildServerStatus } from \"./BuildServerStatus\";\nimport buildServerAwaitNode from \"./buildServerAwaitNode\";\nimport buildServerForNode from \"./buildServerForNode\";\nimport buildServerHtmlNode from \"./buildServerHtmlNode\";\nimport buildServerIfNode from \"./buildServerIfNode\";\nimport buildServerReplaceNode from \"./buildServerReplaceNode\";\nimport buildServerScriptNode from \"./buildServerScriptNode\";\nimport buildServerSwitchNode from \"./buildServerSwitchNode\";\n\nexport default function buildServerControlNode(\n\tnode: ControlNode,\n\tstatus: BuildServerStatus,\n\tb: Builder,\n): void {\n\tswitch (node.operation) {\n\t\tcase \"@if group\": {\n\t\t\tbuildServerIfNode(node, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@if\":\n\t\tcase \"@else if\":\n\t\tcase \"@else\": {\n\t\t\t// These get handled with @if group, above\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@switch group\": {\n\t\t\tbuildServerSwitchNode(node, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@case\":\n\t\tcase \"@default\": {\n\t\t\t// These get handled with @switch, above\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@for group\": {\n\t\t\tbuildServerForNode(node, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@for\":\n\t\tcase \"@key\": {\n\t\t\t// These get handled with @for, above\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@await group\": {\n\t\t\tbuildServerAwaitNode(node, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@await\":\n\t\tcase \"@then\":\n\t\tcase \"@catch\": {\n\t\t\t// These get handled with @await group, above\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@replace group\": {\n\t\t\tbuildServerReplaceNode(node, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@replace\": {\n\t\t\t// This gets handled with @replace group, above\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@html group\": {\n\t\t\tbuildServerHtmlNode(node, status);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@html\": {\n\t\t\t// This gets handled with @html group, above\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@const\": {\n\t\t\tif (status.output) {\n\t\t\t\tb.append(`$output += \\`${status.output}\\`;`);\n\t\t\t\tstatus.output = \"\";\n\t\t\t}\n\t\t\tbuildServerScriptNode(node, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@function\": {\n\t\t\tif (status.output) {\n\t\t\t\tb.append(`$output += \\`${status.output}\\`;`);\n\t\t\t\tstatus.output = \"\";\n\t\t\t}\n\t\t\tb.append(\"\");\n\t\t\tbuildServerScriptNode(node, b);\n\t\t\tb.append(\"\");\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@console\":\n\t\tcase \"@debugger\": {\n\t\t\t// These can't be used on the server\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\tthrow new Error(`Invalid operation: ${node.operation}`);\n\t\t}\n\t}\n}\n","// From https://developer.mozilla.org/en-US/docs/Glossary/Void_element\nconst voidTags: string[] = [\n\t\"area\",\n\t\"base\",\n\t\"br\",\n\t\"col\",\n\t\"embed\",\n\t\"hr\",\n\t\"img\",\n\t\"input\",\n\t\"link\",\n\t\"meta\",\n\t\"param\",\n\t\"source\",\n\t\"track\",\n\t\"wbr\",\n];\nexport default voidTags;\n","import { type ElementNode } from \"../../types/nodes/ElementNode\";\nimport Builder from \"../../utils/Builder\";\nimport trimQuotes from \"../../utils/trimQuotes\";\nimport voidTags from \"../../utils/voidTags\";\nimport isFullyReactive from \"../utils/isFullyReactive\";\nimport isReactive from \"../utils/isReactive\";\nimport { type BuildServerStatus } from \"./BuildServerStatus\";\nimport buildServerNode from \"./buildServerNode\";\n\nexport default function buildServerElementNode(\n\tnode: ElementNode,\n\tstatus: BuildServerStatus,\n\tb: Builder,\n): void {\n\tlet attributes = buildElementAttributes(node, status);\n\tif (attributes.length) {\n\t\tattributes = \" \" + attributes;\n\t}\n\n\tlet tagName = node.tagName;\n\tif (tagName === \":element\") {\n\t\tlet selfAttribute = node.attributes.find((a) => a.name === \"self\");\n\t\tif (selfAttribute) {\n\t\t\ttagName = `$${selfAttribute.value}`;\n\t\t}\n\t}\n\n\t// NOTE: Only void tags can be self-closed in HTML, although we allow it in\n\t// templates and auto-expand it here\n\tstatus.output += `<${tagName}${attributes}>`;\n\tif (!voidTags.includes(tagName)) {\n\t\tconst oldPreserveWhitespace = status.preserveWhitespace;\n\t\tstatus.preserveWhitespace = [\"pre\", \"code\"].includes(tagName);\n\t\tfor (let child of node.children) {\n\t\t\tbuildServerNode(child, status, b);\n\t\t}\n\t\tstatus.preserveWhitespace = oldPreserveWhitespace;\n\t\tstatus.output += `</${tagName}>`;\n\t}\n}\n\nfunction buildElementAttributes(node: ElementNode, status: BuildServerStatus) {\n\tlet needsClass = node.scopeStyles;\n\tlet attributes: string[] = [];\n\tfor (let { name, value } of node.attributes) {\n\t\tif (name === \"self\" && node.tagName === \":element\") {\n\t\t\t// Ignore this special attribute\n\t\t} else if (name.startsWith(\"on\") || name.startsWith(\":on\")) {\n\t\t\t// No events on the server\n\t\t} else if (name.startsWith(\":transition\") && value) {\n\t\t\t// No animation on the server, but we do need to set the attributes\n\t\t\t// from the first keyframe\n\t\t\t// HACK: use a regex instead maybe?\n\t\t\tvalue = value.substring(1, value.length - 1).trim();\n\t\t\tvalue = value.split(\",\")[0].trim();\n\t\t\tif (value.startsWith(\"[\")) {\n\t\t\t\tvalue = value.substring(1);\n\t\t\t} else {\n\t\t\t\tvalue = value + \"[0]\";\n\t\t\t}\n\t\t\tattributes.push(\n\t\t\t\t`style=\"\\${Object.entries(${value}).map(([k, v]) => \\`$\\{k}: $\\{v}\\`).join(\"; \")}\"`,\n\t\t\t);\n\t\t} else if (name.startsWith(\"{\") && name.endsWith(\"}\")) {\n\t\t\t// It's a shortcut attribute\n\t\t\tname = name.substring(1, name.length - 1);\n\t\t\tstatus.imports.add(\"t_attr\");\n\t\t\tattributes.push(`${name}=\"\\${t_attr(${name})}\"`);\n\t\t} else if (value != null && isFullyReactive(value)) {\n\t\t\t// It's a reactive attribute\n\t\t\tvalue = value.substring(1, value.length - 1);\n\n\t\t\tif (name === \":self\" || name === \":value\" || name === \":checked\" || name === \":group\") {\n\t\t\t\tlet defaultValue = \"\";\n\t\t\t\tlet typeAttribute = node.attributes.find((a) => a.name === \"type\");\n\t\t\t\tif (typeAttribute && typeAttribute.value) {\n\t\t\t\t\tswitch (trimQuotes(typeAttribute.value)) {\n\t\t\t\t\t\tcase \"number\": {\n\t\t\t\t\t\t\tdefaultValue = \"0\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase \"checkbox\": {\n\t\t\t\t\t\t\tdefaultValue = \"false\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!defaultValue) {\n\t\t\t\t\tstatus.imports.add(\"t_attr\");\n\t\t\t\t\tvalue = `t_attr(${value})`;\n\t\t\t\t\tdefaultValue = '\"\"';\n\t\t\t\t}\n\t\t\t\tlet valueOrDefault = `${value} || ${defaultValue}`;\n\t\t\t\tconst propName = name.substring(1);\n\t\t\t\tattributes.push(`${propName}=\"\\${${valueOrDefault}}\"`);\n\t\t\t} else if (name === \":class\") {\n\t\t\t\tstatus.imports.add(\"t_class\");\n\t\t\t\tif (node.scopeStyles) {\n\t\t\t\t\tvalue += `, \"torp-${status.styleHash}\"`;\n\t\t\t\t\tneedsClass = false;\n\t\t\t\t}\n\t\t\t\tattributes.push(`class=\"\\${t_class(${value})}\"`);\n\t\t\t} else if (name === \":style\") {\n\t\t\t\tstatus.imports.add(\"t_style\");\n\t\t\t\tattributes.push(`style=\"\\${t_style(${value})}\"`);\n\t\t\t} else {\n\t\t\t\t// Only set the attribute if the value is truthy\n\t\t\t\t// e.g. `... ${className ? `class=\"${className}\"` : ''} ...`\n\t\t\t\tstatus.imports.add(\"t_attr\");\n\t\t\t\tattributes.push(`\\${${value} ? \\`${name}=\"\\${t_attr(${value})}\"\\` : ''}`);\n\t\t\t}\n\t\t} else if (value != null && isReactive(value)) {\n\t\t\t// TODO: Match braces, don't replace braces inside code\n\t\t\tstatus.imports.add(\"t_attr\");\n\t\t\tattributes.push(\n\t\t\t\t`${name}=\"${trimQuotes(value).replaceAll(\"{\", \"${t_attr(\").replaceAll(\"}\", \")}\")}\"`,\n\t\t\t);\n\t\t} else if (name === \"class\" && node.scopeStyles) {\n\t\t\tvalue = value\n\t\t\t\t? `\"${trimQuotes(value)} torp-${status.styleHash}\"`\n\t\t\t\t: `\"torp-${status.styleHash}\"`;\n\t\t\tattributes.push(`${name}=\"${trimQuotes(value).replaceAll('\"', \""\")}\"`);\n\t\t\tneedsClass = false;\n\t\t} else if (value != null) {\n\t\t\t// Just set the attribute\n\t\t\t// TODO: Probably check if it's a boolean attribute e.g. disabled\n\t\t\tattributes.push(`${name}=\"${trimQuotes(value).replaceAll('\"', \""\")}\"`);\n\t\t} else {\n\t\t\tattributes.push(`${name}`);\n\t\t}\n\t}\n\tif (needsClass) {\n\t\tattributes.push(`class=\"torp-${status.styleHash}\"`);\n\t}\n\treturn attributes.join(\" \");\n}\n","import { type RootNode } from \"../../types/nodes/RootNode\";\nimport Builder from \"../../utils/Builder\";\nimport { type BuildServerStatus } from \"./BuildServerStatus\";\nimport buildServerNode from \"./buildServerNode\";\n\nexport default function buildServerRootNode(\n\tnode: RootNode,\n\tstatus: BuildServerStatus,\n\tb: Builder,\n): void {\n\tbuildServerNode(node.children[0], status, b);\n}\n","import {\n\tANCHOR_COMMENT,\n\tHYDRATION_END_COMMENT,\n\tHYDRATION_START_COMMENT,\n} from \"../../types/comments\";\nimport { type ElementNode } from \"../../types/nodes/ElementNode\";\nimport isSpecialNode from \"../../types/nodes/isSpecialNode\";\nimport Builder from \"../../utils/Builder\";\nimport trimQuotes from \"../../utils/trimQuotes\";\nimport isFullyReactive from \"../utils/isFullyReactive\";\nimport isReactive from \"../utils/isReactive\";\nimport nextVarName from \"../utils/nextVarName\";\nimport { type BuildServerStatus } from \"./BuildServerStatus\";\nimport buildServerNode from \"./buildServerNode\";\n\nexport default function buildServerSlotNode(\n\tnode: ElementNode,\n\tstatus: BuildServerStatus,\n\tb: Builder,\n): void {\n\t// Surround the entire control statement with bracketed comments, so that we\n\t// can skip to the end to set the anchor node when hydrating\n\tstatus.output += HYDRATION_START_COMMENT;\n\n\tif (status.output) {\n\t\tb.append(`$output += \\`${status.output}\\`;`);\n\t\tstatus.output = \"\";\n\t}\n\n\t// If there's a slot, build that, otherwise build the default nodes\n\tlet slotName = node.attributes.find((a) => a.name === \"name\")?.value;\n\tslotName = slotName ? trimQuotes(slotName) : \"_\";\n\n\t// Slot props\n\tconst propsName = nextVarName(\"sprops\", status);\n\tconst slotAttributes = node.attributes.filter((a) => a.name !== \"name\");\n\tconst slotHasProps = slotAttributes.length;\n\tif (slotHasProps) {\n\t\t// TODO: defaults etc props\n\t\tb.append(`const ${propsName}: any = {};`);\n\t\tfor (let { name, value } of slotAttributes) {\n\t\t\tif (name.startsWith(\"{\") && name.endsWith(\"}\")) {\n\t\t\t\t// It's a shortcut attribute\n\t\t\t\tname = name.substring(1, name.length - 1);\n\t\t\t\tb.append(`${propsName}[\"${name}\"] = ${name};`);\n\t\t\t} else if (value != null) {\n\t\t\t\tlet fullyReactive = isFullyReactive(value);\n\t\t\t\tlet partlyReactive = isReactive(value);\n\t\t\t\tif (fullyReactive) {\n\t\t\t\t\tvalue = value.substring(1, value.length - 1);\n\t\t\t\t} else if (partlyReactive) {\n\t\t\t\t\tvalue = `\\`${trimQuotes(value).replaceAll(\"{\", \"${\")}\\``;\n\t\t\t\t}\n\t\t\t\tb.append(`${propsName}[\"${name}\"] = ${value};`);\n\t\t\t} else {\n\t\t\t\tb.append(`${propsName}[\"${name}\"] = true;`);\n\t\t\t}\n\t\t}\n\t}\n\n\tb.append(`if ($slots && $slots[\"${slotName}\"]) {`);\n\tb.append(\n\t\t`$output += $slots[\"${slotName}\"](${slotHasProps ? propsName : \"undefined\"}, $context);`,\n\t);\n\n\t// TODO: Not if there's only a single space node -- maybe check in parse\n\tconst fill = node.children.find((c) => isSpecialNode(c) && c.tagName === \":fill\");\n\tif (fill && isSpecialNode(fill) && fill.children.length) {\n\t\tb.append(`} else {`);\n\n\t\tfor (let child of fill.children) {\n\t\t\tbuildServerNode(child, status, b);\n\t\t}\n\n\t\tif (status.output) {\n\t\t\tb.append(`$output += \\`${status.output}\\`;`);\n\t\t\tstatus.output = \"\";\n\t\t}\n\t}\n\n\tb.append(`}`);\n\n\t// End the control statement\n\tstatus.output += HYDRATION_END_COMMENT;\n\n\t// Add the anchor node\n\tstatus.output += ANCHOR_COMMENT;\n}\n","import { type ElementNode } from \"../../types/nodes/ElementNode\";\nimport Builder from \"../../utils/Builder\";\nimport { type BuildServerStatus } from \"./BuildServerStatus\";\nimport buildServerComponentNode from \"./buildServerComponentNode\";\nimport buildServerElementNode from \"./buildServerElementNode\";\nimport buildServerSlotNode from \"./buildServerSlotNode\";\n\nexport default function buildServerSpecialNode(\n\tnode: ElementNode,\n\tstatus: BuildServerStatus,\n\tb: Builder,\n): void {\n\tswitch (node.tagName) {\n\t\tcase \":slot\": {\n\t\t\tbuildServerSlotNode(node, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \":element\": {\n\t\t\tbuildServerElementNode(node, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \":component\": {\n\t\t\tbuildServerComponentNode(node, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \":head\": {\n\t\t\t// TODO: For now this is just being done in hydrate\n\t\t\tbreak;\n\t\t}\n\t\tcase \":fill\": {\n\t\t\t// HACK:\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\tthrow new Error(`Invalid special node: ${node.tagName}`);\n\t\t}\n\t}\n}\n","import { type TextNode } from \"../../types/nodes/TextNode\";\nimport { type BuildServerStatus } from \"./BuildServerStatus\";\n\nexport default function buildServerTextNode(node: TextNode, status: BuildServerStatus): void {\n\tlet content = node.content || \"\";\n\n\tif (!status.preserveWhitespace) {\n\t\t// Replace all spaces with a single space, both to save space and to remove\n\t\t// newlines from generated JS strings\n\t\tcontent = content.replaceAll(/\\s+/g, \" \");\n\t}\n\n\t// TODO: Move all of this logic into parse, for text nodes and attribute values\n\tlet level = 0;\n\tfor (let i = 0; i < content.length; i++) {\n\t\tconst char = content[i];\n\t\tconst nextChar = content[i + 1];\n\t\tif (char === \"{\") {\n\t\t\tlevel++;\n\t\t\tif (level === 1) {\n\t\t\t\tstatus.imports.add(\"t_fmt\");\n\t\t\t\tstatus.output += \"${t_fmt(\";\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t} else if (char === \"}\") {\n\t\t\tlevel--;\n\t\t\tif (level === 0) {\n\t\t\t\tstatus.output += \")\";\n\t\t\t}\n\t\t} else if (char === \"`\" && level === 0) {\n\t\t\t// Escape backticks outside of braces, as they will be within a backtick string\n\t\t\tstatus.output += \"\\\\\";\n\t\t} else if (level > 0) {\n\t\t\tif (char === \"/\" && nextChar === \"/\") {\n\t\t\t\t// Skip one-line comments\n\t\t\t\tlet start = i;\n\t\t\t\ti = content.indexOf(\"\\n\", i);\n\t\t\t\tstatus.output += escapeHtml(content.substring(start, i + 1));\n\t\t\t\tcontinue;\n\t\t\t} else if (char === \"/\" && nextChar === \"*\") {\n\t\t\t\t// Skip block comments\n\t\t\t\tlet start = i;\n\t\t\t\ti = content.indexOf(\"*/\", i) + 1;\n\t\t\t\tstatus.output += escapeHtml(content.substring(start, i + 1));\n\t\t\t\tcontinue;\n\t\t\t} else if (char === '\"' || char === \"'\") {\n\t\t\t\t// Skip string contents\n\t\t\t\tlet start = i;\n\t\t\t\tfor (let j = i + 1; j < content.length; j++) {\n\t\t\t\t\tif (content[j] === char && content[j - 1] !== \"\\\\\") {\n\t\t\t\t\t\ti = j;\n\t\t\t\t\t\tstatus.output += escapeHtml(content.substring(start, i + 1));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t} else if (char === \"`\") {\n\t\t\t\t// Skip possibly interpolated string contents\n\t\t\t\t// TODO: Recursively skip strings inside the interpolated JS\n\t\t\t\tlet start = i;\n\t\t\t\tlet level2 = 0;\n\t\t\t\tfor (let j = i + 1; j < content.length; j++) {\n\t\t\t\t\tif (content[j] === char && content[j - 1] !== \"\\\\\" && level2 === 0) {\n\t\t\t\t\t\ti = j;\n\t\t\t\t\t\tstatus.output += escapeHtml(content.substring(start, i + 1));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t} else if (content[j] === \"{\" && (level2 > 0 || content[j - 1] === \"$\")) {\n\t\t\t\t\t\tlevel2 += 1;\n\t\t\t\t\t} else if (content[j] === \"}\" && level2 > 0) {\n\t\t\t\t\t\tlevel2 -= 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\tstatus.output += char;\n\t}\n}\n\n// Escape HTML in comments and strings on the server, so that we don't output unintended tags etc\n// This doesn't need to be done on the client, where we will be setting textContent\nfunction escapeHtml(text: string) {\n\treturn text.replaceAll(\"&\", \"&\").replaceAll(\"<\", \"<\").replaceAll(\">\", \">\");\n}\n","import { type ControlNode } from \"../../types/nodes/ControlNode\";\nimport { type ElementNode } from \"../../types/nodes/ElementNode\";\nimport { type RootNode } from \"../../types/nodes/RootNode\";\nimport { type TemplateNode } from \"../../types/nodes/TemplateNode\";\nimport { type TextNode } from \"../../types/nodes/TextNode\";\nimport Builder from \"../../utils/Builder\";\nimport { type BuildServerStatus } from \"./BuildServerStatus\";\nimport buildServerComponentNode from \"./buildServerComponentNode\";\nimport buildServerControlNode from \"./buildServerControlNode\";\nimport buildServerElementNode from \"./buildServerElementNode\";\nimport buildServerRootNode from \"./buildServerRootNode\";\nimport buildServerSpecialNode from \"./buildServerSpecialNode\";\nimport buildServerTextNode from \"./buildServerTextNode\";\n\nexport default function buildServerNode(\n\tnode: TemplateNode,\n\tstatus: BuildServerStatus,\n\tb: Builder,\n): void {\n\tswitch (node.type) {\n\t\tcase \"root\": {\n\t\t\tbuildServerRootNode(node as RootNode, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"control\": {\n\t\t\tbuildServerControlNode(node as ControlNode, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"component\": {\n\t\t\tbuildServerComponentNode(node as ElementNode, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"element\": {\n\t\t\tbuildServerElementNode(node as ElementNode, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"text\": {\n\t\t\tbuildServerTextNode(node as TextNode, status);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"special\": {\n\t\t\tbuildServerSpecialNode(node as ElementNode, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\tthrow new Error(`Invalid node type: ${node.type}`);\n\t\t}\n\t}\n}\n","import { type BuildOptions } from \"../../../types/BuildOptions\";\nimport { type Template } from \"../../../types/Template\";\nimport Builder from \"../../utils/Builder\";\nimport { type BuildServerStatus } from \"./BuildServerStatus\";\nimport buildServerNode from \"./buildServerNode\";\n\nconst importsMap: Record<string, string> = {\n\t$watch: 'import { $watch } from \"${folder}\";',\n\t$unwrap: 'import { $unwrap } from \"${folder}\";',\n\t$run: 'import { $run } from \"${folder}\";',\n\t$mount: 'import { $mount } from \"${folder}\";',\n\tt_fmt: 'import { t_fmt } from \"${folder}\";',\n\tt_attr: 'import { t_attr } from \"${folder}\";',\n\tt_class: 'import { t_class } from \"${folder}\";',\n\tt_style: 'import { t_style } from \"${folder}\";',\n\tServerSlotRender: 'import { type ServerSlotRender } from \"${folder}\";',\n};\n\nexport default function buildServerCode(template: Template, options?: BuildOptions): string {\n\tlet b = new Builder();\n\n\t// Gather imports as we go so they can be placed at the top\n\tlet imports = new Set<string>();\n\timports.add(\"ServerSlotRender\");\n\n\t// Build the component and any child components\n\tbuildServerTemplate(template, imports, b, options);\n\n\t// Add the gathered imports in alphabetical order\n\tif (imports.size) {\n\t\tb.prepend(\"\");\n\t\tfor (let imp of Array.from(imports).sort().reverse()) {\n\t\t\timp = importsMap[imp] || imp;\n\t\t\tb.prepend(imp.replace(\"${folder}\", options?.renderFolder || \"@torpor/view/ssr\"));\n\t\t}\n\t}\n\n\treturn b.toString();\n}\n\nfunction buildServerTemplate(\n\ttemplate: Template,\n\timports: Set<string>,\n\tb: Builder,\n\toptions?: BuildOptions,\n) {\n\tlet script = template.script || \"\";\n\n\t// Add default imports\n\tif (/\\$watch\\b/.test(script)) imports.add(\"$watch\");\n\tif (/\\$unwrap\\b/.test(script)) imports.add(\"$unwrap\");\n\tif (/\\$run\\b/.test(script)) imports.add(\"$run\");\n\tif (/\\$mount\\b/.test(script)) imports.add(\"$mount\");\n\n\tlet currentIndex = 0;\n\tlet current = template.components[0];\n\n\tlet marker = 0;\n\tfor (let i = 0; i < script.length; i++) {\n\t\tif (script.substring(i, i + \"/* @params */\".length) === \"/* @params */\") {\n\t\t\tb.append(script.substring(marker, i));\n\n\t\t\t// TODO: Support other params, like the user setting $context\n\t\t\tlet params = [\n\t\t\t\tcurrent.params ??\n\t\t\t\t\t`${current.props?.length ? \"$props\" : \"// @ts-ignore\\n$props?\"}: Record<PropertyKey, any>`,\n\t\t\t\t`${current.contextProps?.length ? \"\" : \"// @ts-ignore\\n\"}$context?: Record<PropertyKey, any>`,\n\t\t\t\t`${current.slotProps?.length ? \"\" : \"// @ts-ignore\\n\"}$slots?: Record<string, ServerSlotRender>`,\n\t\t\t];\n\t\t\tb.append(params.join(\",\\n\"));\n\n\t\t\tmarker = i + \"/* @params */\".length;\n\t\t} else if (script.substring(i, i + \"/* @start */\".length) === \"/* @start */\") {\n\t\t\tb.append(script.substring(marker, i));\n\n\t\t\t// Make sure we've got $props if we're going to be using it\n\t\t\tif (current.props?.length) {\n\t\t\t\tb.append(`$props ??= {};`);\n\t\t\t}\n\n\t\t\t// Redefine $context so that any newly added properties will only be passed to children\n\t\t\tif (current.contextProps?.length) {\n\t\t\t\tb.append(`$context = Object.assign({}, $context);`);\n\t\t\t}\n\n\t\t\tmarker = i + \"/* @start */\".length;\n\t\t} else if (script.substring(i, i + \"/* @render */\".length) === \"/* @render */\") {\n\t\t\tb.append(script.substring(marker, i));\n\n\t\t\tif (current.markup) {\n\t\t\t\tconst status: BuildServerStatus = {\n\t\t\t\t\timports,\n\t\t\t\t\toutput: \"\",\n\t\t\t\t\tstyleHash: current.style?.hash || \"\",\n\t\t\t\t\tvarNames: {},\n\t\t\t\t\tpreserveWhitespace: false,\n\t\t\t\t\toptions,\n\t\t\t\t};\n\n\t\t\t\t// Add the interface\n\t\t\t\tb.append(\"\");\n\t\t\t\tb.append(\"/* User interface */\");\n\t\t\t\tb.append(`let $output = \"\";`);\n\n\t\t\t\t// Add the interface\n\t\t\t\tbuildServerNode(current.markup, status, b);\n\n\t\t\t\tif (status.output) {\n\t\t\t\t\tb.append(`$output += \\`${status.output}\\`;`);\n\t\t\t\t\tstatus.output = \"\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tmarker = i + \"/* @render */\".length;\n\t\t} else if (script.substring(i, i + \"/* @end */\".length) === \"/* @end */\") {\n\t\t\tb.append(script.substring(marker, i));\n\t\t\tb.append(\"return $output;\");\n\n\t\t\tcurrentIndex += 1;\n\t\t\tcurrent = template.components[currentIndex];\n\n\t\t\tmarker = i + \"/* @end */\".length;\n\t\t}\n\t}\n\n\tb.append(script.substring(marker));\n}\n","import { type BuildOptions } from \"../types/BuildOptions\";\nimport { type Template } from \"../types/Template\";\nimport buildCode from \"./build/client/buildCode\";\nimport buildStyles from \"./build/client/buildStyles\";\nimport buildServerCode from \"./build/server/buildServerCode\";\nimport { type BuildResult } from \"./types/BuildResult\";\n\n/**\n * Builds a component template into code and styles for rendering\n *\n * @param template The component template, possibly including script, markup and styles\n *\n * @returns The component's code and styles\n */\nexport default function build(template: Template, options?: BuildOptions): BuildResult {\n\tlet code = options?.server ? buildServerCode(template, options) : buildCode(template, options);\n\tlet styles = template.components\n\t\t.map((c) =>\n\t\t\tc.style ? { style: buildStyles(c.style, c.style.hash), hash: c.style.hash } : undefined,\n\t\t)\n\t\t.filter((c) => c !== undefined);\n\treturn {\n\t\tcode,\n\t\tstyles,\n\t};\n}\n","import { type BuildOptions } from \"../types/BuildOptions\";\nimport { type Template } from \"../types/Template\";\nimport Builder from \"./utils/Builder\";\n\n/**\n * Builds a component template into a d.ts file\n *\n * @param name The name of the component\n * @param template The component template, possibly including script, markup and styles\n *\n * @returns The d.ts file content\n */\nexport default function buildType(template: Template, options?: BuildOptions): string {\n\tlet b = new Builder();\n\n\tb.append(`import { type SlotRender } from \"${options?.renderFolder || \"@torpor/view\"}\";`);\n\n\tfor (let component of template.components) {\n\t\tb.append(\"\");\n\t\tb.append(`\n\t\t\t/**\n\t\t\t * Mounts or hydrates the component into the supplied parent node.\n\t\t\t * @param $parent -- The parent node.\n\t\t\t * @param $anchor -- The node to mount the component before.\n\t\t\t * @param $props -- The values that have been passed into the component as properties.\n\t\t\t * @param $context -- Values that have been passed into the component from its ancestors.\n\t\t\t * @param $slots -- Functions for rendering children into slot nodes within the component.\n\t\t\t */\n\t\t\t${component.default ? \"declare\" : \"export declare\"} function ${component.name}(\n\t\t\t\t$parent: ParentNode,\n\t\t\t\t$anchor: Node | null,\n\t\t\t\t${component.params || \"$props?: Record<PropertyKey, any>\"},\n\t\t\t\t$context?: Record<PropertyKey, any>,\n\t\t\t\t$slots?: Record<string, SlotRender>,\n\t\t\t): void;\n\t\t`);\n\t\tif (component.default) {\n\t\t\tb.append(`export default ${component.name};`);\n\t\t}\n\t}\n\n\treturn b.toString();\n}\n","import isSpace from \"../../parse/utils/isSpace\";\nimport { type TemplateNode } from \"./TemplateNode\";\nimport { type TextNode } from \"./TextNode\";\nimport isTextNode from \"./isTextNode\";\n\nexport default function isSpaceNode(node: TemplateNode): node is TextNode {\n\treturn isTextNode(node) && isSpace(node.content);\n}\n","import { type ParseStatus } from \"../ParseStatus\";\nimport isSpaceChar from \"./isSpaceChar\";\n\n/**\n * Consumes space characters and advances the current parse position to before\n * the next non-space character\n *\n * @param status The parse status\n *\n * @returns The string of space characters from the current parse position to\n * the next non-space character\n */\nexport default function consumeSpace(status: ParseStatus): string {\n\tconst start = status.i;\n\tfor (status.i; status.i < status.source.length; status.i++) {\n\t\tif (!isSpaceChar(status.source, status.i)) {\n\t\t\treturn status.source.substring(start, status.i);\n\t\t}\n\t}\n\treturn \"\";\n}\n","import { type ControlNode } from \"../types/nodes/ControlNode\";\nimport { type ElementNode } from \"../types/nodes/ElementNode\";\nimport { type TextNode } from \"../types/nodes/TextNode\";\nimport isTextNode from \"../types/nodes/isTextNode\";\nimport { type ParseStatus } from \"./ParseStatus\";\nimport consumeSpace from \"./utils/consumeSpace\";\n\nexport default function addSpaceElement(\n\tparent: ElementNode | ControlNode,\n\tstatus: ParseStatus,\n): void {\n\tconst content = consumeSpace(status);\n\tif (content) {\n\t\tconst previousNode = parent.children[parent.children.length - 1];\n\t\tif (previousNode && isTextNode(previousNode)) {\n\t\t\tpreviousNode.content += content;\n\t\t} else {\n\t\t\tconst space: TextNode = {\n\t\t\t\ttype: \"text\",\n\t\t\t\tcontent,\n\t\t\t};\n\t\t\tparent.children.push(space);\n\t\t}\n\t}\n}\n","/**\n * Trims a char from the start of the supplied text\n *\n * @param text The text to trim\n * @param char The char to remove from the start of the text\n *\n * @returns The text without the char on the start\n */\nexport default function trimStart(text: string, char: string): string {\n\tlet start = 0;\n\twhile (text[start] === char) {\n\t\tstart += 1;\n\t}\n\treturn text.substring(start);\n}\n","import { type ParseStatus } from \"../ParseStatus\";\n\n/**\n * Checks whether the source at the current parse position matches the supplied\n * string\n *\n * @param value The string to check\n * @param status The parse status\n * @param advance (Optional) If true, advances the parse position past the\n * checked string (defaults to true)\n *\n * @returns True if the supplied string was found at the current parse position\n */\nexport default function accept(value: string, status: ParseStatus, advance = true): boolean {\n\tconst check = status.source.substring(status.i, status.i + value.length);\n\tif (check == value) {\n\t\tstatus.i += advance ? value.length : 0;\n\t\treturn true;\n\t}\n\treturn false;\n}\n","import { type ParseStatus } from \"./ParseStatus\";\nimport accept from \"./utils/accept\";\n\nexport default function parseInlineScript(status: ParseStatus): string {\n\tconst start = status.i;\n\tlet braceCount = 0;\n\twhile (status.i < status.source.length) {\n\t\tif (accept(\"{\", status)) {\n\t\t\tbraceCount += 1;\n\t\t} else if (accept(\"}\", status)) {\n\t\t\tif (braceCount > 0) {\n\t\t\t\tbraceCount -= 1;\n\t\t\t} else {\n\t\t\t\treturn status.source.substring(start, status.i - 1);\n\t\t\t}\n\t\t} else if (accept('\"', status) || accept(\"'\", status)) {\n\t\t\t// Skip string contents\n\t\t\tconst char = status.source[status.i - 1];\n\t\t\tfor (let j = status.i; j < status.source.length; j++) {\n\t\t\t\tif (status.source[j] === char && status.source[j - 1] !== \"\\\\\") {\n\t\t\t\t\tstatus.i = j + 1;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (accept(\"`\", status)) {\n\t\t\t// Skip possibly interpolated string contents\n\t\t\tconst char = status.source[status.i - 1];\n\t\t\tlet level2 = 0;\n\t\t\tfor (let j = status.i; j < status.source.length; j++) {\n\t\t\t\tif (status.source[j] === char && status.source[j - 1] !== \"\\\\\" && level2 === 0) {\n\t\t\t\t\tstatus.i = j + 1;\n\t\t\t\t\tbreak;\n\t\t\t\t} else if (status.source[j] === \"{\" && (level2 > 0 || status.source[j - 1] === \"$\")) {\n\t\t\t\t\tlevel2 += 1;\n\t\t\t\t} else if (status.source[j] === \"}\" && level2 > 0) {\n\t\t\t\t\tlevel2 -= 1;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (accept(\"//\", status)) {\n\t\t\t// Ignore the content of one-line comments\n\t\t\tstatus.i = status.source.indexOf(\"\\n\", status.i) + 1;\n\t\t} else if (accept(\"/*\", status)) {\n\t\t\t// Ignore the content of block comments\n\t\t\tstatus.i = status.source.indexOf(\"*/\", status.i) + 2;\n\t\t} else {\n\t\t\tstatus.i += 1;\n\t\t}\n\t}\n\treturn \"\";\n}\n","import { type ParseStatus } from \"../ParseStatus\";\n\n/**\n * Adds an error to the parse status\n *\n * @param status The parse status\n * @param message The error message to add\n * @param start (Optional) The start position of the error (defaults to the\n * current parse position)\n */\nexport default function addError(\n\tstatus: ParseStatus,\n\tmessage: string,\n\tstart: number = status.i,\n): void {\n\tlet line = 1;\n\tlet lastLineStart = 0;\n\tfor (let i = 0; i < start; i++) {\n\t\tif (status.source[i] === \"\\n\") {\n\t\t\tline += 1;\n\t\t\tlastLineStart = i + 1;\n\t\t}\n\t}\n\tlet column = start - lastLineStart;\n\tstatus.errors.push({ message, start, line, column });\n}\n","import { type ControlNode } from \"../types/nodes/ControlNode\";\nimport { type ElementNode } from \"../types/nodes/ElementNode\";\nimport { type OperationType } from \"../types/nodes/OperationType\";\nimport isControlNode from \"../types/nodes/isControlNode\";\nimport trimMatched from \"../utils/trimMatched\";\nimport trimStart from \"../utils/trimStart\";\nimport { type ParseStatus } from \"./ParseStatus\";\nimport addSpaceElement from \"./addSpaceElement\";\nimport parseElement from \"./parseElement\";\nimport parseInlineScript from \"./parseInlineScript\";\nimport accept from \"./utils/accept\";\nimport addError from \"./utils/addError\";\nimport consumeSpace from \"./utils/consumeSpace\";\nimport isSpaceChar from \"./utils/isSpaceChar\";\n\nconst controlOperations = [\n\t\"@if\",\n\t\"@else\",\n\t\"@for\",\n\t\"@key\",\n\t\"@switch\",\n\t\"@case\",\n\t\"@default\",\n\t\"@await\",\n\t\"@then\",\n\t\"@catch\",\n\t\"@replace\",\n\t\"@html\",\n\t\"@const\",\n\t\"@console\",\n\t\"@debugger\",\n\t\"@function\",\n];\n\nconst standaloneOperations = [\"@key\", \"@html\", \"@const\", \"@console\", \"@debugger\", \"@function\"];\n\nexport default function parseControl(\n\tstatus: ParseStatus,\n\tparentNode: ElementNode | ControlNode,\n): void {\n\tconst node = parseControlOpen(status);\n\tif (!node) {\n\t\treturn;\n\t}\n\n\t// Some operations don't have children\n\tif (standaloneOperations.includes(node.operation)) {\n\t\twrangleControlNode(node, parentNode);\n\t\treturn;\n\t}\n\n\t// Get the children\n\twhile (status.i < status.source.length) {\n\t\taddSpaceElement(node, status);\n\t\tif (accept(\"}\", status)) {\n\t\t\t// It's the end of the control block, so we're done here\n\t\t\tbreak;\n\t\t} else if (accept(\"<\", status, false)) {\n\t\t\t// It's a child element\n\t\t\tconst child = parseElement(status);\n\t\t\tnode.children.push(child);\n\t\t} else if (accept(\"@//\", status)) {\n\t\t\t// Swallow one-line comments\n\t\t\tstatus.i = status.source.indexOf(\"\\n\", status.i) + 1;\n\t\t} else if (accept(\"@/*\", status)) {\n\t\t\t// Swallow block comments\n\t\t\tstatus.i = status.source.indexOf(\"*/\", status.i) + 2;\n\t\t} else if (accept(\"@\", status, false)) {\n\t\t\t// It's a nested control\n\t\t\tparseControl(status, node);\n\t\t} else if (accept(\"case\", status, false) || accept(\"key\", status, false)) {\n\t\t\t// `case` and `key` can be bare in a control block\n\t\t\tparseControl(status, node);\n\t\t} else {\n\t\t\t// Can't have text content in control blocks\n\t\t\tconst char = status.source[status.i];\n\t\t\taddError(status, `Unexpected token in control block: ${char}`, status.i);\n\t\t\tbreak;\n\t\t}\n\t}\n\n\twrangleControlNode(node, parentNode);\n\n\tparseControlBranches(status, parentNode);\n}\n\nfunction parseControlOpen(status: ParseStatus): ControlNode | null {\n\tconst start = status.i;\n\n\tlet operation = \"\";\n\tfor (status.i; status.i < status.source.length; status.i++) {\n\t\tconst char = status.source[status.i];\n\t\tif (\n\t\t\tisSpaceChar(status.source, status.i) ||\n\t\t\t(accept(\":\", status) && operation === \"default\") ||\n\t\t\t(accept(\".\", status) && operation === \"@console\") ||\n\t\t\t(accept(\"(\", status, false) && operation === \"@html\")\n\t\t) {\n\t\t\tbreak;\n\t\t}\n\t\toperation += char;\n\t}\n\n\t// Some operations (else etc) don't start with an @\n\tif (!operation.startsWith(\"@\")) {\n\t\toperation = \"@\" + operation;\n\t}\n\n\tlet statement = \"\";\n\tif (controlOperations.includes(operation)) {\n\t\tstatement = parseControlStatement(start, operation, status);\n\n\t\t// Special processing for functions -- read until the closing brace\n\t\tif (operation === \"@function\") {\n\t\t\tstatement += ` {${parseInlineScript(status)}}`;\n\t\t\taccept(\"}\", status);\n\t\t}\n\n\t\t// Special processing for replace and html\n\t\tif (operation === \"@replace\" || operation === \"@html\") {\n\t\t\tstatement = trimMatched(statement.substring(statement.indexOf(\"(\")).trim(), \"(\", \")\");\n\t\t}\n\t} else {\n\t\t// TODO: Should probably advance until a closing brace or a newline\n\t\taddError(status, `Unknown operation: ${operation}`, status.i);\n\t\treturn null;\n\t}\n\n\treturn {\n\t\ttype: \"control\",\n\t\toperation: operation as OperationType,\n\t\tstatement,\n\t\tchildren: [],\n\t};\n}\n\nfunction parseControlStatement(start: number, operation: string, status: ParseStatus) {\n\tlet parenCount = 0;\n\twhile (status.i < status.source.length) {\n\t\tif (accept(\"(\", status)) {\n\t\t\tparenCount += 1;\n\t\t} else if (accept(\")\", status)) {\n\t\t\tparenCount -= 1;\n\t\t} else if (\n\t\t\taccept(\"{\", status) ||\n\t\t\t(accept(\"\\n\", status) && standaloneOperations.includes(operation))\n\t\t) {\n\t\t\tif (parenCount === 0) {\n\t\t\t\treturn trimStart(status.source.substring(start, status.i - 1).trim(), \"@\");\n\t\t\t}\n\t\t} else if (accept('\"', status) || accept(\"'\", status)) {\n\t\t\t// Skip string contents\n\t\t\tconst char = status.source[status.i - 1];\n\t\t\tfor (let j = status.i + 1; j < status.source.length; j++) {\n\t\t\t\tif (status.source[j] === char && status.source[j - 1] !== \"\\\\\") {\n\t\t\t\t\tstatus.i = j + 1;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (accept(\"`\", status)) {\n\t\t\t// Skip possibly interpolated string contents\n\t\t\tlet level2 = 0;\n\t\t\tfor (let j = status.i + 1; j < status.source.length; j++) {\n\t\t\t\tif (status.source[j] === \"`\" && status.source[j - 1] !== \"\\\\\" && level2 === 0) {\n\t\t\t\t\tstatus.i = j + 1;\n\t\t\t\t\tbreak;\n\t\t\t\t} else if (status.source[j] === \"{\" && (level2 > 0 || status.source[j - 1] === \"$\")) {\n\t\t\t\t\tlevel2 += 1;\n\t\t\t\t} else if (status.source[j] === \"}\" && level2 > 0) {\n\t\t\t\t\tlevel2 -= 1;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (accept(\"//\", status)) {\n\t\t\t// Ignore the content of one-line comments\n\t\t\tstatus.i = status.source.indexOf(\"\\n\", status.i) + 1;\n\t\t} else if (accept(\"/*\", status)) {\n\t\t\t// Ignore the content of block comments\n\t\t\tstatus.i = status.source.indexOf(\"*/\", status.i) + 2;\n\t\t} else {\n\t\t\tstatus.i += 1;\n\t\t}\n\t}\n\treturn \"\";\n}\n\n/**\n * Groups the control node into the correct parent e.g. if/else into an if group\n * @param node The control node\n * @param parentNode The parent node\n */\nfunction wrangleControlNode(node: ControlNode, parentNode: ElementNode | ControlNode) {\n\t// Group\n\t// * if/else into an if group\n\t// * for into a for group\n\t// * switch into a switch group (cases will have the correct parent)\n\t// * await/then/catch into an await group\n\t// * replace into a replace group\n\t// * html into a html group\n\tif (node.operation === \"@if\") {\n\t\tconst ifGroup: ControlNode = {\n\t\t\ttype: \"control\",\n\t\t\toperation: \"@if group\",\n\t\t\tstatement: \"\",\n\t\t\tchildren: [node],\n\t\t};\n\t\tparentNode.children.push(ifGroup);\n\t} else if (node.operation === \"@else\") {\n\t\tif (/^else\\s+if/.test(node.statement)) {\n\t\t\tnode.operation = \"@else if\";\n\t\t}\n\t\tfor (let i = parentNode.children.length - 1; i >= 0; i--) {\n\t\t\tconst lastChild = parentNode.children[i];\n\t\t\t// TODO: Break if it's an element, do more checking\n\t\t\tif (isControlNode(lastChild) && lastChild.operation === \"@if group\") {\n\t\t\t\tlastChild.children.push(node);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\t// @ts-ignore\n\telse if (node.operation === \"@for\") {\n\t\tconst forGroup: ControlNode = {\n\t\t\ttype: \"control\",\n\t\t\toperation: \"@for group\",\n\t\t\tstatement: \"\",\n\t\t\tchildren: [node],\n\t\t};\n\t\tparentNode.children.push(forGroup);\n\t}\n\t// @ts-ignore\n\telse if (node.operation === \"@switch\") {\n\t\tnode.operation = \"@switch group\";\n\t\tparentNode.children.push(node);\n\t} else if (node.operation === \"@await\") {\n\t\tconst awaitGroup: ControlNode = {\n\t\t\ttype: \"control\",\n\t\t\toperation: \"@await group\",\n\t\t\tstatement: \"\",\n\t\t\tchildren: [node],\n\t\t};\n\t\tparentNode.children.push(awaitGroup);\n\t} else if (node.operation === \"@then\" || node.operation === \"@catch\") {\n\t\tfor (let i = parentNode.children.length - 1; i >= 0; i--) {\n\t\t\tconst lastChild = parentNode.children[i];\n\t\t\t// TODO: Break if it's an element, do more checking\n\t\t\tif (isControlNode(lastChild) && lastChild.operation === \"@await group\") {\n\t\t\t\tlastChild.children.push(node);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else if (node.operation === \"@replace\") {\n\t\tconst replaceGroup: ControlNode = {\n\t\t\ttype: \"control\",\n\t\t\toperation: \"@replace group\",\n\t\t\tstatement: \"\",\n\t\t\tchildren: [node],\n\t\t};\n\t\tparentNode.children.push(replaceGroup);\n\t} else if (node.operation === \"@html\") {\n\t\tconst htmlGroup: ControlNode = {\n\t\t\ttype: \"control\",\n\t\t\toperation: \"@html group\",\n\t\t\tstatement: \"\",\n\t\t\tchildren: [node],\n\t\t};\n\t\tparentNode.children.push(htmlGroup);\n\t} else {\n\t\tparentNode.children.push(node);\n\t}\n}\n\n/**\n * Parses control branches that don't start with an @ symbol e.g. else or case\n * @param status The parse status\n * @param parentNode The parent node\n */\nfunction parseControlBranches(status: ParseStatus, parentNode: ElementNode | ControlNode) {\n\t// Look ahead and see if we have another control statement\n\t// NOTE: We could be more strict here (e.g. we could check that an else is\n\t// after an if), but for now we are just leaving it to the JS parser\n\tlet gotAnotherBranch = true;\n\twhile (gotAnotherBranch) {\n\t\tlet start = status.i;\n\t\tstatus.i += 1;\n\t\tconsumeSpace(status);\n\t\tif (\n\t\t\taccept(\"else\", status, false) ||\n\t\t\taccept(\"case\", status, false) ||\n\t\t\taccept(\"default\", status, false) ||\n\t\t\taccept(\"then\", status, false) ||\n\t\t\taccept(\"catch\", status, false)\n\t\t) {\n\t\t\tparseControl(status, parentNode);\n\t\t} else {\n\t\t\tgotAnotherBranch = false;\n\t\t\tstatus.i = start;\n\t\t}\n\t}\n}\n","/**\n * Checks whether the supplied character is a alpha-numeric\n *\n * @param text The string to check\n * @param index The index of the character in the string\n *\n * @returns True if the supplied character is alpha-numeric\n */\nexport default function isAlphaNumericChar(text: string, index: number): boolean {\n\tlet code = text.charCodeAt(index);\n\treturn (\n\t\t// 0-9\n\t\t(code > 47 && code < 58) ||\n\t\t// A-Z\n\t\t(code > 64 && code < 91) ||\n\t\t// a-z\n\t\t(code > 96 && code < 123)\n\t);\n}\n","import { type ParseStatus } from \"../ParseStatus\";\nimport isAlphaNumericChar from \"./isAlphaNumericChar\";\n\n/**\n * Consumes alpha-numeric characters and advances the current parse position to\n * before the next non-alpha character\n *\n * @param status The parse status\n *\n * @returns The string of alpha-numeric characters from the current parse position\n * to the next non-alpha character\n */\nexport default function consumeAlphaNumeric(status: ParseStatus): string {\n\tconst start = status.i;\n\tfor (status.i; status.i < status.source.length; status.i++) {\n\t\tif (!isAlphaNumericChar(status.source, status.i)) {\n\t\t\treturn status.source.substring(start, status.i);\n\t\t}\n\t}\n\treturn \"\";\n}\n","import { type ParseStatus } from \"../ParseStatus\";\n\n/**\n * Consumes characters until one of the characters in the supplied string is\n * found. The parse position will be advanced to before the found character\n *\n * @param chars The characters to match\n * @param status The parse status\n *\n * @returns The string of characters from the current parse position to the\n * found character\n */\nexport default function consumeUntil(chars: string, status: ParseStatus): string {\n\tconst start = status.i;\n\tfor (status.i; status.i < status.source.length; status.i++) {\n\t\tif (chars.includes(status.source[status.i])) {\n\t\t\treturn status.source.substring(start, status.i);\n\t\t}\n\t}\n\treturn \"\";\n}\n","import { type Attribute } from \"../types/nodes/Attribute\";\nimport { type ElementNode } from \"../types/nodes/ElementNode\";\nimport { type ParseStatus } from \"./ParseStatus\";\nimport parseInlineScript from \"./parseInlineScript\";\nimport accept from \"./utils/accept\";\nimport consumeAlphaNumeric from \"./utils/consumeAlphaNumeric\";\nimport consumeSpace from \"./utils/consumeSpace\";\nimport consumeUntil from \"./utils/consumeUntil\";\n\nexport default function parseTag(status: ParseStatus): ElementNode {\n\taccept(\"<\", status);\n\n\tlet closeTag = accept(\"/\", status);\n\n\tconsumeSpace(status);\n\n\tlet special = accept(\":\", status);\n\tlet tagName = consumeAlphaNumeric(status);\n\tif (special) {\n\t\ttagName = \":\" + tagName;\n\t}\n\tif (closeTag) {\n\t\ttagName = \"/\" + tagName;\n\t}\n\n\tconsumeSpace(status);\n\n\tlet attributes = parseTagAttributes(status);\n\n\tlet selfClosed = false;\n\tif (accept(\"/>\", status)) {\n\t\tselfClosed = true;\n\t\t// Actually, it is kind of convenient to self-close things, and more consistent with\n\t\t// component tags...\n\t\t//if (!voidTags.includes(tagName)) {\n\t\t//\taddError(status, `Self-closed non-void element: ${tagName}`, start);\n\t\t//}\n\t} else {\n\t\taccept(\">\", status);\n\t}\n\n\tif (closeTag) {\n\t\tselfClosed = true;\n\t}\n\n\treturn {\n\t\ttype: special ? \"special\" : \"element\",\n\t\ttagName,\n\t\tselfClosed: selfClosed || undefined,\n\t\tclosed: selfClosed || undefined,\n\t\tattributes,\n\t\tchildren: [],\n\t};\n}\n\nfunction parseTagAttributes(status: ParseStatus): Attribute[] {\n\tlet attributes: Attribute[] = [];\n\twhile (status.i < status.source.length) {\n\t\tconsumeSpace(status);\n\t\tif (accept(\"@//\", status)) {\n\t\t\t// Swallow one-line comments\n\t\t\tstatus.i = status.source.indexOf(\"\\n\", status.i) + 1;\n\t\t} else if (accept(\"@/*\", status)) {\n\t\t\t// Swallow block comments\n\t\t\tstatus.i = status.source.indexOf(\"*/\", status.i) + 2;\n\t\t} else if (accept(\"/>\", status, false) || accept(\">\", status, false)) {\n\t\t\t// That's the end of the attributes\n\t\t\tbreak;\n\t\t} else {\n\t\t\tconst attribute = parseAttribute(status);\n\t\t\tattributes.push(attribute);\n\t\t}\n\t}\n\treturn attributes;\n}\n\nfunction parseAttribute(status: ParseStatus): Attribute {\n\tlet name = consumeUntil(\"= \\t\\r\\n/>\", status);\n\tlet value: string | undefined = undefined;\n\tconsumeSpace(status);\n\tif (accept(\"=\", status)) {\n\t\tconsumeSpace(status);\n\t\tvalue = parseAttributeValue(status);\n\t}\n\treturn { name, value };\n}\n\nfunction parseAttributeValue(status: ParseStatus): string {\n\tif (accept('\"', status)) {\n\t\tconst value = consumeUntil('\"', status);\n\t\taccept('\"', status);\n\t\treturn `\"${value}\"`;\n\t} else if (accept(\"'\", status)) {\n\t\tconst value = consumeUntil(\"'\", status);\n\t\taccept(\"'\", status);\n\t\treturn `'${value}'`;\n\t} else if (accept(\"{\", status)) {\n\t\tconst value = parseInlineScript(status);\n\t\treturn `{${value}}`;\n\t} else {\n\t\tlet value = consumeUntil(\" \\t\\r\\n>\", status);\n\t\t// Check whether we've landed at /> and if so, rewind\n\t\tif (status.source.substring(status.i - 1, status.i + 1) === \"/>\") {\n\t\t\tvalue = value.substring(0, value.length - 1);\n\t\t\tstatus.i -= 1;\n\t\t}\n\t\treturn value;\n\t}\n}\n","import { type ElementNode } from \"../types/nodes/ElementNode\";\nimport { type TemplateNode } from \"../types/nodes/TemplateNode\";\nimport isSpecialNode from \"../types/nodes/isSpecialNode\";\n\n/**\n * Moves any child nodes that aren't already in a <:fill> node into a default\n * <:fill> node\n */\nexport default function slottifyChildNodes(node: ElementNode): void {\n\tconst nonFillNodes = node.children.filter((c) => !isFillNode(c));\n\t// TODO: Not if it's only spaces??\n\tif (nonFillNodes.length) {\n\t\tlet defaultFillNode = node.children.find(\n\t\t\t(n) => isFillNode(n) && !n.attributes.find((a) => a.name === \"name\"),\n\t\t) as ElementNode | undefined;\n\t\tif (!defaultFillNode) {\n\t\t\tdefaultFillNode = {\n\t\t\t\ttype: \"special\",\n\t\t\t\ttagName: \":fill\",\n\t\t\t\tattributes: [],\n\t\t\t\tchildren: nonFillNodes,\n\t\t\t};\n\t\t\tnode.children.unshift(defaultFillNode);\n\t\t}\n\t}\n\tnode.children = node.children.filter((c) => isFillNode(c));\n}\n\nfunction isFillNode(n: TemplateNode): n is ElementNode {\n\treturn isSpecialNode(n) && n.tagName === \":fill\";\n}\n","import { type ControlNode } from \"../types/nodes/ControlNode\";\nimport { type ElementNode } from \"../types/nodes/ElementNode\";\nimport { type TextNode } from \"../types/nodes/TextNode\";\nimport isSpecialNode from \"../types/nodes/isSpecialNode\";\nimport isTextNode from \"../types/nodes/isTextNode\";\nimport trimMatched from \"../utils/trimMatched\";\nimport voidTags from \"../utils/voidTags\";\nimport { type ParseStatus } from \"./ParseStatus\";\nimport { type ParseComponentStatus } from \"./ParseStatus\";\nimport addSpaceElement from \"./addSpaceElement\";\nimport parseControl from \"./parseControl\";\nimport parseTag from \"./parseTag\";\nimport slottifyChildNodes from \"./slottifyChildNodes\";\nimport accept from \"./utils/accept\";\nimport addError from \"./utils/addError\";\nimport consumeAlphaNumeric from \"./utils/consumeAlphaNumeric\";\nimport consumeSpace from \"./utils/consumeSpace\";\nimport isSpaceChar from \"./utils/isSpaceChar\";\n\nexport default function parseElement(status: ParseStatus): ElementNode {\n\tconst start = status.i;\n\n\tconst element = parseTag(status);\n\n\tif (element.tagName.startsWith(\"/\")) {\n\t\taddError(status, `Non matching close tag: ${element.tagName.substring(1)}`, start);\n\t\treturn element;\n\t}\n\n\tif (voidTags.includes(element.tagName)) {\n\t\tcheckVoidElement(status, element);\n\t}\n\n\tif (!element.selfClosed && !voidTags.includes(element.tagName)) {\n\t\tconst current = status.components[status.components.length - 1];\n\t\tcurrent.stack ??= [];\n\t\tcurrent.stack.push(element);\n\n\t\t// Get the children\n\t\twhile (status.i < status.source.length) {\n\t\t\taddSpaceElement(element, status);\n\t\t\tif (accept(\"}\", status, false)) {\n\t\t\t\t// That's the rendering done\n\t\t\t\tbreak;\n\t\t\t} else if (accept(\"<!--\", status)) {\n\t\t\t\t// It's a comment, swallow it\n\t\t\t\tstatus.i = status.source.indexOf(\"-->\", status.i) + 3;\n\t\t\t} else if (accept(\"@//\", status)) {\n\t\t\t\t// Swallow one-line comments\n\t\t\t\tstatus.i = status.source.indexOf(\"\\n\", status.i) + 1;\n\t\t\t} else if (accept(\"@/*\", status)) {\n\t\t\t\t// Swallow block comments\n\t\t\t\tstatus.i = status.source.indexOf(\"*/\", status.i) + 2;\n\t\t\t} else if (accept(\"</\", status, false)) {\n\t\t\t\t// It's a close tag, so we're done here\n\t\t\t\tif (checkCloseTag(status, element, current)) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else if (accept(\"<\", status, false)) {\n\t\t\t\t// It's a child element\n\t\t\t\tconst child = parseElement(status);\n\t\t\t\telement.children.push(child);\n\t\t\t} else if (accept(\"@\", status, false)) {\n\t\t\t\t// It's a control statement\n\t\t\t\tparseControl(status, element);\n\t\t\t} else {\n\t\t\t\t// It's text content\n\t\t\t\tparseText(status, element);\n\t\t\t}\n\t\t}\n\n\t\tcurrent.stack.pop();\n\t}\n\n\t// If this is a component element, add a default <:fill> node\n\t// HACK: For now, we just treat all tags starting with a capital as components\n\tif (!element.tagName.startsWith(\":\") && /[A-Z]/.test(element.tagName[0])) {\n\t\telement.type = \"component\";\n\t\tslottifyChildNodes(element);\n\t}\n\n\tif (isSpecialNode(element)) {\n\t\tif (element.tagName === \":slot\") {\n\t\t\t// If this is a <:slot> element, add a <:fill> node for its fallback\n\t\t\t// content. Anchors will be created for <:slot> nodes and fragments will\n\t\t\t// be created for the <:fill> content\n\t\t\tslottifyChildNodes(element);\n\n\t\t\t// Add it to the component's slots collection\n\t\t\tconst current = status.components[status.components.length - 1];\n\t\t\tcurrent.slotProps ??= [];\n\t\t\tcurrent.slotProps.push(element.attributes.find((a) => a.name === \"name\")?.name ?? \"default\");\n\t\t} else if (element.tagName === \":component\") {\n\t\t\tconst selfAttribute = element.attributes.find((a) => a.name === \"self\");\n\t\t\tif (selfAttribute && selfAttribute.value) {\n\t\t\t\telement.type = \"component\";\n\t\t\t\tslottifyChildNodes(element);\n\n\t\t\t\tconst selfValue = trimMatched(selfAttribute.value, \"{\", \"}\");\n\t\t\t\tconst replace: ControlNode = {\n\t\t\t\t\ttype: \"control\",\n\t\t\t\t\toperation: \"@replace\",\n\t\t\t\t\tstatement: selfValue,\n\t\t\t\t\tchildren: [element],\n\t\t\t\t};\n\t\t\t\tconst replaceGroup: ControlNode = {\n\t\t\t\t\ttype: \"control\",\n\t\t\t\t\toperation: \"@replace group\",\n\t\t\t\t\tstatement: selfValue,\n\t\t\t\t\tchildren: [replace],\n\t\t\t\t};\n\n\t\t\t\treturn replaceGroup as any;\n\t\t\t} else {\n\t\t\t\taddError(status, \":component element must have a self attribute\", start);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!element.closed && !voidTags.includes(element.tagName)) {\n\t\taddError(status, `Unclosed non-void element: ${element.tagName}`, start);\n\t}\n\n\treturn element;\n}\n\nfunction parseText(status: ParseStatus, element: ElementNode) {\n\tconst start = status.i;\n\t// It ends at the next element, or at the next control statement, or at the end of\n\t// the render\n\t// But only if the control statement is after a newline, so we don't mess with\n\t// emails etc. This may need more finessing\n\tlet end = -1;\n\tfor (let j = status.i; j < status.source.length; j++) {\n\t\tif (status.source[j] === \"}\") {\n\t\t\t// That's the rendering done\n\t\t\tend = j;\n\t\t} else if (status.source[j] === \"{\") {\n\t\t\t// Skip reactive content\n\t\t\tlet level = 0;\n\t\t\tfor (let k = j; k < status.source.length; k++) {\n\t\t\t\tconst char = status.source[k];\n\t\t\t\tconst nextChar = status.source[k + 1];\n\t\t\t\tif (char === \"/\" && nextChar === \"/\") {\n\t\t\t\t\t// Skip one-line comments\n\t\t\t\t\tk = status.source.indexOf(\"\\n\", k);\n\t\t\t\t} else if (char === \"/\" && nextChar === \"*\") {\n\t\t\t\t\t// Skip block comments\n\t\t\t\t\tk = status.source.indexOf(\"*/\", k) + 1;\n\t\t\t\t} else if (char === '\"' || char === \"'\") {\n\t\t\t\t\t// Skip string contents\n\t\t\t\t\tfor (let l = k + 1; l < status.source.length; l++) {\n\t\t\t\t\t\tif (status.source[l] === char && status.source[l - 1] !== \"\\\\\") {\n\t\t\t\t\t\t\tk = l;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (char === \"`\") {\n\t\t\t\t\t// Skip possibly interpolated string contents\n\t\t\t\t\tlet level2 = 0;\n\t\t\t\t\tfor (let l = k + 1; l < status.source.length; l++) {\n\t\t\t\t\t\tif (status.source[l] === char && status.source[l - 1] !== \"\\\\\" && level2 === 0) {\n\t\t\t\t\t\t\tk = l;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t} else if (status.source[l] === \"{\" && (level2 > 0 || status.source[l - 1] === \"$\")) {\n\t\t\t\t\t\t\tlevel2 += 1;\n\t\t\t\t\t\t} else if (status.source[l] === \"}\" && level2 > 0) {\n\t\t\t\t\t\t\tlevel2 -= 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (char === \"{\") {\n\t\t\t\t\tlevel += 1;\n\t\t\t\t} else if (char === \"}\") {\n\t\t\t\t\tlevel -= 1;\n\t\t\t\t\tif (level === 0) {\n\t\t\t\t\t\tj = k;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (status.source[j] === \"<\") {\n\t\t\tend = j;\n\t\t} else if (status.source[j] === \"@\") {\n\t\t\t// Backtrack\n\t\t\tfor (let k = j - 1; k > status.i; k--) {\n\t\t\t\tif (status.source[k] === \"\\n\") {\n\t\t\t\t\tend = j;\n\t\t\t\t\tbreak;\n\t\t\t\t} else if (!isSpaceChar(status.source, k)) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (end !== -1) {\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (end !== -1) {\n\t\tconst content = status.source.substring(start, end).trimEnd();\n\t\tconst spaceContent = status.source.substring(start + content.length, end);\n\t\tif (content || spaceContent) {\n\t\t\tconst previousNode = element.children[element.children.length - 1];\n\t\t\tif (previousNode && isTextNode(previousNode)) {\n\t\t\t\tpreviousNode.content += content + spaceContent;\n\t\t\t} else {\n\t\t\t\tconst text: TextNode = {\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\tcontent: content + spaceContent,\n\t\t\t\t};\n\t\t\t\telement.children.push(text);\n\t\t\t}\n\t\t}\n\t\tstatus.i = end;\n\t} else {\n\t\tstatus.i += 1;\n\t}\n}\n\nfunction checkVoidElement(status: ParseStatus, element: ElementNode) {\n\tlet i = status.i;\n\n\tconsumeSpace(status);\n\tif (accept(\"</\", status)) {\n\t\tconsumeSpace(status);\n\t\tif (accept(element.tagName, status)) {\n\t\t\taddError(status, `Closed void element: ${element.tagName}`, i);\n\t\t\tconsumeSpace(status);\n\t\t\taccept(\">\", status);\n\t\t\treturn;\n\t\t}\n\t}\n\n\tstatus.i = i;\n}\n\nfunction checkCloseTag(status: ParseStatus, element: ElementNode, current: ParseComponentStatus) {\n\tconst start = status.i;\n\n\taccept(\"</\", status);\n\tconsumeSpace(status);\n\tlet special = accept(\":\", status);\n\tlet closingTagName = consumeAlphaNumeric(status);\n\tif (special) {\n\t\tclosingTagName = \":\" + closingTagName;\n\t}\n\tconsumeSpace(status);\n\taccept(\">\", status);\n\n\tlet found = false;\n\tif (current.stack) {\n\t\tfor (let i = current.stack.length - 1; i >= 0; i--) {\n\t\t\tif (closingTagName === current.stack[i].tagName) {\n\t\t\t\tcurrent.stack[i].closed = true;\n\t\t\t\tfound = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tif (!found) {\n\t\taddError(\n\t\t\tstatus,\n\t\t\t`Non matching close tag: ${closingTagName} (expected ${element.tagName})`,\n\t\t\tstart,\n\t\t);\n\t}\n\n\treturn found;\n}\n","import { type ParseStatus } from \"./ParseStatus\";\nimport parseElement from \"./parseElement\";\nimport accept from \"./utils/accept\";\nimport addError from \"./utils/addError\";\n\nexport default function parseMarkup(status: ParseStatus, source: string): void {\n\tconst current = status.components.at(-1);\n\tif (!current) return;\n\n\twhile (status.i < source.length) {\n\t\tif (accept(\"}\", status, false)) {\n\t\t\t// That's the rendering done\n\t\t\treturn;\n\t\t} else if (accept(\"<!--\", status)) {\n\t\t\t// It's a comment, swallow it\n\t\t\tstatus.i = status.source.indexOf(\"-->\", status.i) + 3;\n\t\t} else if (accept(\"@//\", status)) {\n\t\t\t// Swallow one-line comments\n\t\t\tstatus.i = status.source.indexOf(\"\\n\", status.i) + 1;\n\t\t} else if (accept(\"@/*\", status)) {\n\t\t\t// Swallow block comments\n\t\t\tstatus.i = status.source.indexOf(\"*/\", status.i) + 2;\n\t\t} else if (accept(\"<\", status, false)) {\n\t\t\t// Parse the element\n\t\t\tconst start = status.i;\n\t\t\tconst element = parseElement(status);\n\t\t\tif (current.markup === undefined) {\n\t\t\t\tcurrent.markup = element;\n\t\t\t} else if (!element.tagName.startsWith(\"/\")) {\n\t\t\t\taddError(status, `Multiple top-level elements: ${element.tagName}`, start);\n\t\t\t}\n\t\t} else {\n\t\t\tstatus.i += 1;\n\t\t}\n\t}\n}\n","// Adapted from https://github.com/sveltejs/svelte\n\nconst returnRegex = /\\r/g;\n\nexport default function hash(input: string): string {\n\tinput = input.replace(returnRegex, \"\");\n\tlet hash = 5381;\n\tlet i = input.length;\n\twhile (i--) {\n\t\thash = ((hash << 5) - hash) ^ input.charCodeAt(i);\n\t}\n\treturn (hash >>> 0).toString(36);\n}\n","import { type ParseStatus } from \"../ParseStatus\";\nimport addError from \"./addError\";\n\n/**\n * Checks whether the source at the current parse position matches the supplied\n * string and if not, adds an error to the parse status\n *\n * @param value The string to check\n * @param status The parse status\n * @param advance (Optional) If true, advances the parse position past the\n * checked string (defaults to true)\n *\n * @returns True if the supplied string was found at the current parse position\n */\nexport default function expect(value: string, status: ParseStatus, advance = true): boolean {\n\tif (status.i < status.source.length) {\n\t\tif (status.source.substring(status.i, status.i + value.length) == value) {\n\t\t\tstatus.i += advance ? value.length : 0;\n\t\t\treturn true;\n\t\t} else {\n\t\t\taddError(status, `Expected ${value}`);\n\t\t}\n\t} else {\n\t\taddError(status, \"Expected token\");\n\t}\n\treturn false;\n}\n","import { type Attribute } from \"../types/styles/Attribute\";\nimport { type StyleBlock } from \"../types/styles/StyleBlock\";\nimport hash from \"../utils/hash\";\nimport { type ParseStatus } from \"./ParseStatus\";\nimport accept from \"./utils/accept\";\nimport consumeSpace from \"./utils/consumeSpace\";\nimport consumeUntil from \"./utils/consumeUntil\";\nimport expect from \"./utils/expect\";\nimport isSpaceChar from \"./utils/isSpaceChar\";\n\nexport default function parseStyles(source: string, status: ParseStatus): void {\n\tconst current = status.components.at(-1);\n\tif (!current) return;\n\n\tcurrent.style = {\n\t\tglobal: false,\n\t\tblocks: [],\n\t\thash: hash(source),\n\t};\n\n\tconst styleStatus: ParseStatus = {\n\t\tsource,\n\t\ti: 0,\n\t\tmarker: 0,\n\t\tlevel: 0,\n\t\timports: [],\n\t\tscript: \"\",\n\t\tcomponents: [],\n\t\terrors: [],\n\t};\n\n\twhile (styleStatus.i < styleStatus.source.length) {\n\t\tif (isSpaceChar(styleStatus.source, styleStatus.i)) {\n\t\t\tconsumeSpace(styleStatus);\n\t\t} else {\n\t\t\tconst block = parseStyleBlock(styleStatus);\n\t\t\tif (block) {\n\t\t\t\tcurrent.style.blocks.push(block);\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tstatus.errors = status.errors.concat(styleStatus.errors);\n}\n\nfunction parseStyleBlock(status: ParseStatus): StyleBlock | undefined {\n\tconst selector = consumeUntil(\"{\", status).trim();\n\tif (expect(\"{\", status)) {\n\t\tconst block: StyleBlock = {\n\t\t\tselector,\n\t\t\tattributes: [],\n\t\t\tchildren: [],\n\t\t};\n\t\tconsumeSpace(status);\n\t\twhile (status.source[status.i] !== \"}\") {\n\t\t\t// HACK: Is it an attribute or a child block?\n\t\t\tlet nextColon = status.source.indexOf(\":\", status.i);\n\t\t\tif (nextColon === -1) nextColon = status.source.length;\n\t\t\tlet nextOpenBrace = status.source.indexOf(\"{\", status.i);\n\t\t\tif (nextOpenBrace === -1) nextOpenBrace = status.source.length;\n\t\t\tif (nextColon < nextOpenBrace) {\n\t\t\t\tconst attribute = parseStyleAttribute(status);\n\t\t\t\tblock.attributes.push(attribute);\n\t\t\t} else if (nextOpenBrace < nextColon) {\n\t\t\t\tconst child = parseStyleBlock(status);\n\t\t\t\tif (child) {\n\t\t\t\t\tblock.children.push(child);\n\t\t\t\t} else {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn block;\n\t\t\t}\n\t\t\tconsumeSpace(status);\n\t\t}\n\t\taccept(\"}\", status);\n\n\t\treturn block;\n\t}\n}\n\nfunction parseStyleAttribute(status: ParseStatus): Attribute {\n\tconst name = consumeUntil(\":\", status).trim();\n\taccept(\":\", status);\n\tconst value = consumeUntil(\";\", status).trim();\n\taccept(\";\", status);\n\treturn {\n\t\tname,\n\t\tvalue,\n\t};\n}\n","import { type ParentNode } from \"./ParentNode\";\nimport { type TemplateNode } from \"./TemplateNode\";\n\nexport default function isParentNode(node: TemplateNode): node is ParentNode {\n\treturn \"children\" in node;\n}\n","import { type TemplateNode } from \"../types/nodes/TemplateNode\";\nimport isElementNode from \"../types/nodes/isElementNode\";\nimport isParentNode from \"../types/nodes/isParentNode\";\nimport { type StyleBlock } from \"../types/styles/StyleBlock\";\nimport trimQuotes from \"../utils/trimQuotes\";\nimport { type ParseStatus } from \"./ParseStatus\";\n\nexport default function scopeStyles(status: ParseStatus): void {\n\tlet selectors: string[] = [];\n\tfor (let component of status.components) {\n\t\tif (component.style && component.markup) {\n\t\t\tfor (let block of component.style.blocks) {\n\t\t\t\tcollectStyleSelectors(block, selectors);\n\t\t\t}\n\t\t\tscopeStylesOnNode(component.markup, selectors);\n\t\t}\n\t}\n}\n\nfunction scopeStylesOnNode(node: TemplateNode, selectors: string[]) {\n\tif (isElementNode(node)) {\n\t\tlet scopeStyles = selectors.includes(node.tagName);\n\t\tif (!scopeStyles) {\n\t\t\tfor (let a of node.attributes) {\n\t\t\t\tif (a.name === \"class\" || a.name === \":class\") {\n\t\t\t\t\tscopeStyles = true;\n\t\t\t\t} else if (a.name === \"id\" && a.value) {\n\t\t\t\t\tscopeStyles = selectors.includes(`#${trimQuotes(a.value)}`);\n\t\t\t\t} else if (a.name === \"class\" && a.value) {\n\t\t\t\t\t// TODO: Never getting here?\n\t\t\t\t\tscopeStyles = selectors.includes(`.${trimQuotes(a.value)}`);\n\t\t\t\t}\n\t\t\t\tif (scopeStyles) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tnode.scopeStyles = scopeStyles;\n\t}\n\n\tif (isParentNode(node)) {\n\t\tfor (let child of node.children) {\n\t\t\tscopeStylesOnNode(child, selectors);\n\t\t}\n\t}\n}\n\nfunction collectStyleSelectors(block: StyleBlock, selectors: string[]) {\n\t// HACK: We should be collecting the actual selectors and then checking\n\t// attributes, parents, children, siblings etc\n\tfor (let s of block.selector.split(/[\\s*,>+~]/)) {\n\t\tselectors.push(s);\n\t}\n}\n","import { type TemplateComponent } from \"../../types/TemplateComponent\";\nimport { type ParseResult } from \"../types/ParseResult\";\nimport isSpaceNode from \"../types/nodes/isSpaceNode\";\nimport trimQuotes from \"../utils/trimQuotes\";\nimport { type ParseStatus } from \"./ParseStatus\";\nimport parseMarkup from \"./parseMarkup\";\nimport parseStyleElement from \"./parseStyles\";\nimport scopeStyles from \"./scopeStyles\";\nimport accept from \"./utils/accept\";\nimport addError from \"./utils/addError\";\nimport consumeAlphaNumeric from \"./utils/consumeAlphaNumeric\";\nimport consumeSpace from \"./utils/consumeSpace\";\n\nexport default function parseCode(source: string): ParseResult {\n\tconst status: ParseStatus = {\n\t\tsource,\n\t\ti: 0,\n\t\tmarker: 0,\n\t\tlevel: 0,\n\t\timports: [],\n\t\tscript: \"\",\n\t\tcomponents: [],\n\t\terrors: [],\n\t};\n\n\tfor (status.i; status.i < source.length; status.i++) {\n\t\tif (consumeScriptComments(status)) {\n\t\t\t// Keep going\n\t\t} else if (status.source[status.i] === \"{\") {\n\t\t\tstatus.level += 1;\n\t\t} else if (status.source[status.i] === \"}\") {\n\t\t\tstatus.level -= 1;\n\t\t\tif (status.level === 0) {\n\t\t\t\tparseComponentEnd(status);\n\t\t\t}\n\t\t} else if (accept(\"function\", status)) {\n\t\t\t// If the function name starts with a capital, parse it as a component\n\t\t\tconsumeSpace(status);\n\t\t\tif (/[A-Z]/.test(source[status.i])) {\n\t\t\t\tparseComponentStart(status);\n\t\t\t}\n\t\t} else if (accept(\"const\", status)) {\n\t\t\t// If it's a function and its name starts with a capital, parse it as a component\n\t\t\tconsumeSpace(status);\n\t\t\tif (/[A-Z]/.test(source[status.i])) {\n\t\t\t\tconst start = status.i;\n\t\t\t\tconsumeAlphaNumeric(status);\n\t\t\t\tconsumeSpace(status);\n\t\t\t\tif (accept(\"=\", status)) {\n\t\t\t\t\tconsumeSpace(status);\n\t\t\t\t\tif (accept(\"(\", status, false)) {\n\t\t\t\t\t\tstatus.i = start;\n\t\t\t\t\t\tparseComponentStart(status);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (accept(\"export\", status)) {\n\t\t\t// If it's an anonymous default export function, parse it as a component\n\t\t\tconst start = status.i;\n\t\t\tif (\n\t\t\t\tconsumeSpace(status) &&\n\t\t\t\taccept(\"default\", status) &&\n\t\t\t\tconsumeSpace(status) &&\n\t\t\t\taccept(\"(\", status, false)\n\t\t\t) {\n\t\t\t\tparseComponentStart(status);\n\t\t\t} else {\n\t\t\t\tstatus.i = start;\n\t\t\t}\n\t\t} else if (accept(\"@render\", status, false)) {\n\t\t\tparseComponentRender(status);\n\t\t} else if (accept(\"@style\", status, false)) {\n\t\t\tparseComponentStyle(status);\n\t\t}\n\t}\n\tstatus.script += source.substring(status.marker, source.length);\n\n\tscopeStyles(status);\n\n\tconst ok = !status.errors.length;\n\tif (!ok) {\n\t\tstatus.errors = status.errors.sort((a, b) => a.start - b.start);\n\t}\n\n\treturn {\n\t\tok,\n\t\terrors: status.errors,\n\t\ttemplate: ok\n\t\t\t? {\n\t\t\t\t\timports: status.imports,\n\t\t\t\t\tscript: status.script,\n\t\t\t\t\tcomponents: status.components.map((c) => {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tstart: c.start,\n\t\t\t\t\t\t\tname: c.name,\n\t\t\t\t\t\t\tdefault: c.default,\n\t\t\t\t\t\t\tparams: c.params,\n\t\t\t\t\t\t\tmarkup: c.markup\n\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\ttype: \"root\",\n\t\t\t\t\t\t\t\t\t\tchildren: [c.markup],\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\tstyle: c.style,\n\t\t\t\t\t\t\tprops: c.props,\n\t\t\t\t\t\t\tcontextProps: c.contextProps,\n\t\t\t\t\t\t\tslotProps: c.slotProps,\n\t\t\t\t\t\t} satisfies TemplateComponent;\n\t\t\t\t\t}),\n\t\t\t\t}\n\t\t\t: undefined,\n\t};\n}\n\nfunction parseComponentStart(status: ParseStatus) {\n\tlet source = status.source.substring(0, status.i);\n\tlet def = /export\\s+default\\s+(function\\s+|const\\s+)*$/.test(source);\n\tlet isConst = /const\\s+$/.test(source);\n\tlet isAnon = /export default\\s+$/.test(source);\n\n\tstatus.components.push({\n\t\tstart: status.i,\n\t\tname: consumeAlphaNumeric(status),\n\t\tdefault: def,\n\t});\n\tconst current = status.components.at(-1);\n\tif (!current) return;\n\n\tlet start = -1;\n\tlet end = -1;\n\tlet level = 0;\n\tfor (status.i; status.i < status.source.length; status.i++) {\n\t\tconst char = status.source[status.i];\n\t\tif (consumeScriptComments(status)) {\n\t\t\t// Keep going\n\t\t} else if (char === \"(\") {\n\t\t\tlevel += 1;\n\t\t\tif (start === -1) {\n\t\t\t\tstart = status.i + 1;\n\t\t\t}\n\t\t} else if (char === \")\") {\n\t\t\tlevel -= 1;\n\t\t\tif (level === 0) {\n\t\t\t\tend = status.i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tstatus.script += status.source.substring(status.marker, start) + \"/* @params */\";\n\n\tcurrent.params = status.source.substring(start, end).trim() || undefined;\n\n\tstatus.marker = end;\n\tstatus.i = status.marker;\n\n\taccept(\")\", status);\n\tconsumeSpace(status);\n\n\tif (isConst || isAnon) {\n\t\taccept(\"=>\", status);\n\t\tconsumeSpace(status);\n\t}\n\n\taccept(\"{\", status);\n\tstatus.level += 1;\n\n\tconst space = consumeSpace(status);\n\tstatus.script += status.source.substring(status.marker, status.i) + \"/* @start */\" + space;\n\n\tstatus.marker = status.i;\n\tstatus.i -= 1;\n}\n\nfunction parseComponentRender(status: ParseStatus) {\n\tconst current = status.components.at(-1);\n\tif (!current) return;\n\n\tif (current.markup) {\n\t\taddError(status, `Multiple @render sections`, status.i);\n\t}\n\n\tstatus.script += status.source.substring(status.marker, status.i) + \"/* @render */\";\n\n\taccept(\"@render\", status);\n\tconsumeSpace(status);\n\tif (accept(\"{\", status)) {\n\t\tparseMarkup(status, status.source);\n\t\taccept(\"}\", status);\n\t}\n\n\tstatus.marker = status.i;\n}\n\nfunction parseComponentStyle(status: ParseStatus) {\n\tconst current = status.components.at(-1);\n\tif (!current) return;\n\n\tif (current.style) {\n\t\taddError(status, `Multiple @style sections`, status.i);\n\t}\n\n\tstatus.script += status.source.substring(status.marker, status.i);\n\n\tlet start = -1;\n\tlet end = status.source.length;\n\tlet level = 0;\n\t// HACK: strip the comments out of styles only\n\tlet styleSource = \"\";\n\tfor (; status.i < status.source.length; status.i++) {\n\t\tconst char = status.source[status.i];\n\t\tconst nextChar = status.source[status.i + 1];\n\t\tif (char === \"/\" && nextChar === \"/\") {\n\t\t\t// Skip one-line comments\n\t\t\tstatus.i = status.source.indexOf(\"\\n\", status.i);\n\t\t} else if (char === \"/\" && nextChar === \"*\") {\n\t\t\t// Skip block comments\n\t\t\tstatus.i = status.source.indexOf(\"*/\", status.i) + 1;\n\t\t} else if (char === '\"' || char === \"'\") {\n\t\t\tstyleSource += char;\n\t\t\t// Skip string contents\n\t\t\tfor (let j = status.i + 1; j < status.source.length; j++) {\n\t\t\t\tstyleSource += status.source[j];\n\t\t\t\tif (status.source[j] === char && status.source[j - 1] !== \"\\\\\") {\n\t\t\t\t\tstatus.i = j;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (char === \"`\") {\n\t\t\tstyleSource += char;\n\t\t\t// Skip possibly interpolated string contents\n\t\t\tlet level2 = 0;\n\t\t\tfor (let j = status.i + 1; j < status.source.length; j++) {\n\t\t\t\tstyleSource += status.source[j];\n\t\t\t\tif (status.source[j] === char && status.source[j - 1] !== \"\\\\\" && level2 === 0) {\n\t\t\t\t\tstatus.i = j;\n\t\t\t\t\tbreak;\n\t\t\t\t} else if (status.source[j] === \"{\" && (level2 > 0 || status.source[j - 1] === \"$\")) {\n\t\t\t\t\tlevel2 += 1;\n\t\t\t\t} else if (status.source[j] === \"}\" && level2 > 0) {\n\t\t\t\t\tlevel2 -= 1;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (char === \"{\") {\n\t\t\tlevel += 1;\n\t\t\tif (start === -1) {\n\t\t\t\tstart = status.i + 1;\n\t\t\t} else {\n\t\t\t\tstyleSource += char;\n\t\t\t}\n\t\t} else if (char === \"}\") {\n\t\t\tlevel -= 1;\n\t\t\tif (level === 0) {\n\t\t\t\tend = status.i - 1;\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\tstyleSource += char;\n\t\t\t}\n\t\t} else {\n\t\t\tif (start !== -1) {\n\t\t\t\tstyleSource += char;\n\t\t\t}\n\t\t}\n\t}\n\n\tstatus.i = start;\n\tparseStyleElement(styleSource.trim(), status);\n\n\tstatus.i = end + 2;\n\tstatus.marker = status.i;\n}\n\nfunction parseComponentEnd(status: ParseStatus) {\n\tconst current = status.components.at(-1);\n\tif (!current) return;\n\n\tstatus.script += status.source.substring(status.marker, status.i);\n\tif (status.script.endsWith(\"\\n\")) {\n\t\tstatus.script += \"\\t/* @end */\\n\";\n\t} else {\n\t\tstatus.script += \"/* @end */\";\n\t}\n\n\t// Get all usages of $props.name and $props[\"name\"]\n\t// Get all usages of $context.name and $context[\"name\"]\n\tconst componentSource = status.source.substring(current.start || 0, status.i);\n\tcurrent.props = getPropsUsage(componentSource);\n\tcurrent.contextProps = getContextUsage(componentSource);\n\n\t// If the top-level element is <html> and there is whitespace after it,\n\t// delete the whitespace, as that's what browsers seem to do. It may be\n\t// better instead to create whitespace if we don't find it when hydrating...\n\tif (\n\t\tcurrent.markup &&\n\t\tcurrent.markup.tagName === \"html\" &&\n\t\tisSpaceNode(current.markup.children[0])\n\t) {\n\t\tcurrent.markup.children.splice(1, 1);\n\t}\n\n\tstatus.marker = status.i;\n}\n\nfunction getPropsUsage(source: string): string[] | undefined {\n\tconst propsMatches = source.matchAll(/\\$props\\s*(?:\\.([\\d\\w]+)|\\[([^\\]]+)\\])/g);\n\tconst props: string[] = [];\n\tfor (let match of propsMatches) {\n\t\tconst name = trimQuotes(match[1] || match[2]);\n\t\tif (!props.includes(name)) {\n\t\t\tprops.push(name);\n\t\t}\n\t}\n\treturn props.length ? props : undefined;\n}\n\nfunction getContextUsage(source: string): string[] | undefined {\n\tconst contextsMatches = source.matchAll(/\\$context\\s*(?:\\.([\\d\\w]+)|\\[([^\\]]+)\\])/g);\n\tconst contexts: string[] = [];\n\tfor (let match of contextsMatches) {\n\t\tconst name = trimQuotes(match[1] || match[2]);\n\t\tif (!contexts.includes(name)) {\n\t\t\tcontexts.push(name);\n\t\t}\n\t}\n\treturn contexts.length ? contexts : undefined;\n}\n\nfunction consumeScriptComments(status: ParseStatus): boolean {\n\tconst char = status.source[status.i];\n\tconst nextChar = status.source[status.i + 1];\n\tif (char === \"/\" && nextChar === \"/\") {\n\t\t// Skip one-line comments\n\t\tstatus.i = status.source.indexOf(\"\\n\", status.i);\n\t\treturn true;\n\t} else if (char === \"/\" && nextChar === \"*\") {\n\t\t// Skip block comments\n\t\tstatus.i = status.source.indexOf(\"*/\", status.i) + 1;\n\t\treturn true;\n\t} else if (char === '\"' || char === \"'\") {\n\t\t// Skip string contents\n\t\tfor (let j = status.i + 1; j < status.source.length; j++) {\n\t\t\tif (status.source[j] === char && status.source[j - 1] !== \"\\\\\") {\n\t\t\t\tstatus.i = j;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t} else if (char === \"`\") {\n\t\t// Skip possibly interpolated string contents\n\t\tlet level2 = 0;\n\t\tfor (let j = status.i + 1; j < status.source.length; j++) {\n\t\t\tif (status.source[j] === char && status.source[j - 1] !== \"\\\\\" && level2 === 0) {\n\t\t\t\tstatus.i = j;\n\t\t\t\tbreak;\n\t\t\t} else if (status.source[j] === \"{\" && (level2 > 0 || status.source[j - 1] === \"$\")) {\n\t\t\t\tlevel2 += 1;\n\t\t\t} else if (status.source[j] === \"}\" && level2 > 0) {\n\t\t\t\tlevel2 -= 1;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\treturn false;\n}\n","import parseCode from \"./parse/parseCode\";\nimport { type ParseResult } from \"./types/ParseResult\";\n\n/**\n * Parses source code into a component template\n *\n * @param source The source code\n *\n * @returns A result indicating whether parsing was ok, and if so, containing\n * the component template's parts such as script, markup and styles\n */\nexport default function parse(source: string): ParseResult {\n\treturn parseCode(source);\n}\n"],"mappings":"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","names":["buildHeadNode","buildHeadNode","maybeAppend","buildElementAttributes","importsMap","hash","scopeStyles"]}
|
|
1
|
+
{"version":3,"sources":["../src/compile/utils/Builder.ts","../src/compile/types/comments.ts","../src/compile/utils/trimQuotes.ts","../src/compile/build/utils/isReactive.ts","../src/compile/build/client/buildFragmentText.ts","../src/compile/types/nodes/isSpecialNode.ts","../src/compile/utils/trimMatched.ts","../src/compile/build/utils/isFullyReactive.ts","../src/compile/build/utils/nextVarName.ts","../src/compile/build/client/buildAddFragment.ts","../src/compile/parse/utils/isSpaceChar.ts","../src/compile/parse/utils/isSpace.ts","../src/compile/types/nodes/isControlNode.ts","../src/compile/types/nodes/isElementNode.ts","../src/compile/types/nodes/isTextNode.ts","../src/compile/build/utils/isReactiveAttribute.ts","../src/compile/build/client/buildFragment.ts","../src/compile/build/client/replaceForVarNames.ts","../src/compile/build/client/buildRun.ts","../src/compile/build/client/buildComponentNode.ts","../src/compile/build/client/buildAwaitNode.ts","../src/compile/utils/trimEnd.ts","../src/compile/build/client/buildForNode.ts","../src/compile/build/client/buildHtmlNode.ts","../src/compile/build/client/buildIfNode.ts","../src/compile/build/client/buildReplaceNode.ts","../src/compile/build/client/buildScriptNode.ts","../src/compile/build/client/buildSwitchNode.ts","../src/compile/build/client/buildControlNode.ts","../src/compile/build/client/buildMount.ts","../src/compile/build/client/buildElementNode.ts","../src/compile/build/client/buildRootNode.ts","../src/compile/build/client/buildHeadNode.ts","../src/compile/build/client/buildSlotNode.ts","../src/compile/build/client/buildSpecialNode.ts","../src/compile/build/client/buildTextNode.ts","../src/compile/build/client/buildNode.ts","../src/compile/build/client/buildCode.ts","../src/compile/build/client/buildStyles.ts","../src/compile/build/server/buildServerComponentNode.ts","../src/compile/build/server/buildServerAwaitNode.ts","../src/compile/build/server/buildServerForNode.ts","../src/compile/build/server/buildServerHtmlNode.ts","../src/compile/build/server/buildServerIfNode.ts","../src/compile/build/server/buildServerReplaceNode.ts","../src/compile/build/server/buildServerScriptNode.ts","../src/compile/build/server/buildServerSwitchNode.ts","../src/compile/build/server/buildServerControlNode.ts","../src/compile/utils/voidTags.ts","../src/compile/build/server/buildServerElementNode.ts","../src/compile/build/server/buildServerRootNode.ts","../src/compile/build/server/buildServerSlotNode.ts","../src/compile/build/server/buildServerSpecialNode.ts","../src/compile/build/server/buildServerTextNode.ts","../src/compile/build/server/buildServerNode.ts","../src/compile/build/server/buildServerCode.ts","../src/compile/build.ts","../src/compile/buildType.ts","../src/compile/types/nodes/isSpaceNode.ts","../src/compile/parse/utils/consumeSpace.ts","../src/compile/parse/addSpaceElement.ts","../src/compile/utils/trimStart.ts","../src/compile/parse/utils/accept.ts","../src/compile/parse/parseInlineScript.ts","../src/compile/parse/utils/addError.ts","../src/compile/parse/parseControl.ts","../src/compile/parse/utils/isAlphaNumericChar.ts","../src/compile/parse/utils/consumeAlphaNumeric.ts","../src/compile/parse/utils/consumeUntil.ts","../src/compile/parse/parseTag.ts","../src/compile/parse/slottifyChildNodes.ts","../src/compile/parse/parseElement.ts","../src/compile/parse/parseMarkup.ts","../src/compile/utils/hash.ts","../src/compile/parse/utils/expect.ts","../src/compile/parse/parseStyles.ts","../src/compile/types/nodes/isParentNode.ts","../src/compile/parse/scopeStyles.ts","../src/compile/parse/parseCode.ts","../src/compile/parse.ts"],"sourcesContent":["export default class Builder {\n\t#text = \"\";\n\t#space = 0;\n\n\tprepend(text: string): void {\n\t\tthis.#text = text + \"\\n\" + this.#text;\n\t}\n\n\tappend(text: string): void {\n\t\ttext = text.trim();\n\t\tlet i = 0;\n\t\t//let newline = !!text.length && !text.endsWith(\"\\n\");\n\n\t\twhile (i < text.length) {\n\t\t\t// Skip spaces\n\t\t\twhile (text[i] === \" \" || text[i] === \"\\t\") {\n\t\t\t\ti++;\n\t\t\t}\n\t\t\tif (text[i] === \";\") {\n\t\t\t\t// HACK: we just set ; to ignore the line\n\t\t\t\ti++;\n\t\t\t} else if (text[i] === \"\\n\") {\n\t\t\t\tthis.#text += \"\\n\";\n\t\t\t} else {\n\t\t\t\t// Maybe outdent\n\t\t\t\tif (text[i] === \"}\" || text[i] === \")\" || text[i] === \"]\") {\n\t\t\t\t\tthis.#space -= 1;\n\t\t\t\t}\n\n\t\t\t\t// Add indentation\n\t\t\t\tthis.#text += \"\\t\".repeat(Math.max(0, this.#space));\n\t\t\t\t// Add from text until the next newline or the end of text\n\t\t\t\tconst start = i;\n\t\t\t\twhile (i < text.length && text[i] !== \"\\n\") {\n\t\t\t\t\t// Just add backticked text as-is\n\t\t\t\t\tif (text[i] === \"`\") {\n\t\t\t\t\t\ti++;\n\t\t\t\t\t\tlet level = 0;\n\t\t\t\t\t\twhile (i < text.length && !(text[i] === \"`\" && text[i - 1] !== \"\\\\\" && level === 0)) {\n\t\t\t\t\t\t\t// TODO: Need to do this in more places when skipping strings\n\t\t\t\t\t\t\tif (text[i] === \"{\" && (level > 0 || text[i - 1] === \"$\")) {\n\t\t\t\t\t\t\t\tlevel += 1;\n\t\t\t\t\t\t\t} else if (text[i] === \"}\" && level > 0) {\n\t\t\t\t\t\t\t\tlevel -= 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ti++;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\ti++;\n\t\t\t\t}\n\t\t\t\tconst line = text.substring(start, i + 1);\n\n\t\t\t\tif (line.startsWith(\"*\")) {\n\t\t\t\t\t// JSDoc\n\t\t\t\t\tthis.#text += \" \";\n\t\t\t\t}\n\t\t\t\tthis.#text += line;\n\n\t\t\t\t// Maybe indent\n\t\t\t\tif (text[i - 1] === \"{\" || text[i - 1] === \"(\" || text[i - 1] === \"[\") {\n\t\t\t\t\tthis.#space += 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\ti++;\n\t\t}\n\n\t\tif (!this.#text.endsWith(\"\\n\\n\")) {\n\t\t\tthis.#text += \"\\n\";\n\t\t}\n\t}\n\n\ttoString(): string {\n\t\treturn this.#text;\n\t}\n}\n","const ANCHOR_COMMENT = \"<!>\";\nconst HYDRATION_START_COMMENT = \"<![>\";\nconst HYDRATION_END_COMMENT = \"<!]>\";\nconst HYDRATION_BRANCH_COMMENT = \"<!^>\";\n\nexport { ANCHOR_COMMENT, HYDRATION_START_COMMENT, HYDRATION_END_COMMENT, HYDRATION_BRANCH_COMMENT };\n","/**\n * Trims matching quotes from the start and end of the supplied text\n *\n * @param text The text to trim\n *\n * @returns The text without the quotes at the start or the end\n */\nexport default function trimQuotes(text: string): string {\n\tlet start = 0;\n\tlet end = text.length;\n\twhile (\n\t\t(text[start] === \"'\" && text[end - 1] === \"'\") ||\n\t\t(text[start] === '\"' && text[end - 1] === '\"') ||\n\t\t(text[start] === \"`\" && text[end - 1] === \"`\")\n\t) {\n\t\tstart += 1;\n\t\tend -= 1;\n\t}\n\treturn text.substring(start, end);\n}\n","/**\n * Checks whether the supplied string is fully or partially reactive (i.e. contains braces)\n *\n * @param text The string to check\n *\n * @returns True if the supplied string is fully or partially reactive\n */\nexport default function isReactive(text: string): boolean {\n\t// TODO: Need to be more fancy (check that braces match, ignore comments and strings etc)\n\treturn text.includes(\"{\") && text.includes(\"}\");\n}\n","import { ANCHOR_COMMENT } from \"../../types/comments\";\nimport { type ControlNode } from \"../../types/nodes/ControlNode\";\nimport { type ElementNode } from \"../../types/nodes/ElementNode\";\nimport { type Fragment } from \"../../types/nodes/Fragment\";\nimport { type RootNode } from \"../../types/nodes/RootNode\";\nimport { type TemplateNode } from \"../../types/nodes/TemplateNode\";\nimport { type TextNode } from \"../../types/nodes/TextNode\";\nimport Builder from \"../../utils/Builder\";\nimport trimQuotes from \"../../utils/trimQuotes\";\nimport isReactive from \"../utils/isReactive\";\nimport { type BuildStatus } from \"./BuildStatus\";\n\n/**\n * Builds the HTML template text for all of the fragments in a component\n */\nexport default function buildFragmentText(\n\tnode: RootNode | ControlNode,\n\tstatus: BuildStatus,\n\tb: Builder,\n): void {\n\tconst fragments: Fragment[] = [];\n\tbuildNodeFragmentText(node, status, fragments);\n\n\tif (fragments.length) {\n\t\tb.append(`const t_fragments: DocumentFragment[] = [];`);\n\t}\n}\n\nfunction buildNodeFragmentText(\n\tnode: TemplateNode,\n\tstatus: BuildStatus,\n\tfragments: Fragment[],\n\tcurrentFragment?: Fragment,\n) {\n\tswitch (node.type) {\n\t\tcase \"root\": {\n\t\t\tbuildRootFragmentText(node as RootNode, status, fragments);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"control\": {\n\t\t\tbuildControlFragmentText(node as ControlNode, status, fragments, currentFragment!);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"component\": {\n\t\t\tbuildComponentFragmentText(node as ElementNode, status, fragments, currentFragment!);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"element\": {\n\t\t\t// NOTE: We don't support nested SVG for now\n\t\t\tlet ns = (node as ElementNode).tagName === \"svg\";\n\t\t\tif (ns) status.ns = true;\n\t\t\tbuildElementFragmentText(node as ElementNode, status, fragments, currentFragment!);\n\t\t\tif (ns) status.ns = false;\n\t\t\tbreak;\n\t\t}\n\t\tcase \"text\": {\n\t\t\tconst content = (node as TextNode).content;\n\t\t\tif (currentFragment) {\n\t\t\t\tcurrentFragment.text += isReactive(content) ? \"#\" : content;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \"special\": {\n\t\t\tbuildSpecialFragmentText(node as ElementNode, status, fragments, currentFragment!);\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nfunction buildRootFragmentText(node: RootNode, status: BuildStatus, fragments: Fragment[]) {\n\tnode.fragment = { number: fragments.length, text: \"\", ns: status.ns, events: [], animations: [] };\n\tfragments.push(node.fragment);\n\tfor (let child of node.children) {\n\t\tbuildNodeFragmentText(child, status, fragments, node.fragment);\n\t}\n}\n\nfunction buildControlFragmentText(\n\tnode: ControlNode,\n\tstatus: BuildStatus,\n\tfragments: Fragment[],\n\tcurrentFragment: Fragment,\n) {\n\tswitch (node.operation) {\n\t\tcase \"@if group\":\n\t\tcase \"@switch group\":\n\t\tcase \"@for group\":\n\t\tcase \"@await group\":\n\t\tcase \"@replace group\":\n\t\tcase \"@html group\": {\n\t\t\t// Add a placeholder if it's a branching control node\n\t\t\t//if (!node.singleRooted) {\n\t\t\tcurrentFragment.text += ANCHOR_COMMENT;\n\t\t\t//}\n\t\t\tfor (let child of node.children) {\n\t\t\t\tbuildNodeFragmentText(child, status, fragments, currentFragment);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\t// Add a new fragment if it's a control branch and it has children\n\t\t\tnode.fragment = {\n\t\t\t\tnumber: fragments.length,\n\t\t\t\ttext: \"\",\n\t\t\t\tns: status.ns,\n\t\t\t\tevents: [],\n\t\t\t\tanimations: [],\n\t\t\t};\n\t\t\tfragments.push(node.fragment);\n\t\t\tfor (let child of node.children) {\n\t\t\t\tbuildNodeFragmentText(child, status, fragments, node.fragment);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nfunction buildComponentFragmentText(\n\tnode: ElementNode,\n\tstatus: BuildStatus,\n\tfragments: Fragment[],\n\tcurrentFragment: Fragment,\n) {\n\tcurrentFragment.text += ANCHOR_COMMENT;\n\n\t// Add fragments for slots if there are children\n\tif (node.children.length) {\n\t\tnode.fragment = {\n\t\t\tnumber: fragments.length,\n\t\t\ttext: \"\",\n\t\t\tns: status.ns,\n\t\t\tevents: [],\n\t\t\tanimations: [],\n\t\t};\n\t\tfragments.push(node.fragment);\n\t\tfor (let child of node.children) {\n\t\t\t// TODO: Make sure it's not a :fill node\n\t\t\tbuildNodeFragmentText(child, status, fragments, node.fragment);\n\t\t}\n\t}\n}\n\nfunction buildElementFragmentText(\n\tnode: ElementNode,\n\tstatus: BuildStatus,\n\tfragments: Fragment[],\n\tcurrentFragment: Fragment,\n) {\n\tlet needsClass = node.scopeStyles;\n\tcurrentFragment.text += `<${node.tagName}`;\n\tlet attributesText = node.attributes\n\t\t.filter((a) => !a.name.startsWith(\"on\") && !a.name.includes(\":\"))\n\t\t.map((a) => {\n\t\t\tif (a.value && isReactive(a.value) && !a.name.includes(\":\")) {\n\t\t\t\t// Adding a placeholder for reactive attributes seems to speed things\n\t\t\t\t// up, especially in the case of data attributes. Otherwise don't set it\n\t\t\t\tif (a.name.startsWith(\"data-\")) {\n\t\t\t\t\treturn `${a.name}=\"\"`;\n\t\t\t\t}\n\t\t\t} else if (a.name === \"class\" && node.scopeStyles) {\n\t\t\t\tneedsClass = false;\n\t\t\t\tlet value = a.value\n\t\t\t\t\t? `\"${trimQuotes(a.value)} torp-${status.styleHash}\"`\n\t\t\t\t\t: `\"torp-${status.styleHash}\"`;\n\t\t\t\treturn `${a.name}=${value}`;\n\t\t\t} else {\n\t\t\t\treturn `${a.name}${a.value != null ? `=${a.value}` : \"\"}`;\n\t\t\t}\n\t\t})\n\t\t.filter(Boolean)\n\t\t.join(\" \");\n\tif (attributesText) {\n\t\tcurrentFragment.text += \" \" + attributesText;\n\t}\n\tif (needsClass) {\n\t\tcurrentFragment.text += ` class=\"torp-${status.styleHash}\"`;\n\t}\n\tcurrentFragment.text += \">\";\n\tfor (let child of node.children) {\n\t\tbuildNodeFragmentText(child, status, fragments, currentFragment);\n\t}\n\tcurrentFragment.text += `</${node.tagName}>`;\n}\n\nfunction buildSpecialFragmentText(\n\tnode: ElementNode,\n\tstatus: BuildStatus,\n\tfragments: Fragment[],\n\tcurrentFragment: Fragment,\n) {\n\tswitch (node.tagName) {\n\t\tcase \":slot\": {\n\t\t\t// Add an anchor for the slot\n\t\t\tcurrentFragment.text += ANCHOR_COMMENT;\n\t\t\tfor (let child of node.children) {\n\t\t\t\tbuildNodeFragmentText(child, status, fragments, node.fragment);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \":fill\": {\n\t\t\t// Add a new fragment for filled slot content\n\t\t\tnode.fragment = {\n\t\t\t\tnumber: fragments.length,\n\t\t\t\ttext: \"\",\n\t\t\t\tns: status.ns,\n\t\t\t\tevents: [],\n\t\t\t\tanimations: [],\n\t\t\t};\n\t\t\tfragments.push(node.fragment);\n\t\t\tfor (let child of node.children) {\n\t\t\t\tbuildNodeFragmentText(child, status, fragments, node.fragment);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \":element\": {\n\t\t\t// HACK: Just treat it as a component node as that does what we need for now\n\t\t\tbuildComponentFragmentText(node, status, fragments, currentFragment);\n\t\t\tbreak;\n\t\t}\n\t\tcase \":component\": {\n\t\t\tbuildComponentFragmentText(node, status, fragments, currentFragment);\n\t\t\tbreak;\n\t\t}\n\t\tcase \":head\": {\n\t\t\t// Don't need to do anything here\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\tthrow new Error(`Invalid special node: ${node.tagName}`);\n\t\t}\n\t}\n}\n","import { type ElementNode } from \"./ElementNode\";\nimport { type TemplateNode } from \"./TemplateNode\";\n\nexport default function isSpecialNode(node: TemplateNode): node is ElementNode {\n\treturn node.type === \"special\";\n}\n","/**\n * Trims chars from the start and end of the supplied text when both the start and end match\n *\n * @param text The text to trim\n *\n * @returns The text without the chars at the start or the end\n */\nexport default function trimMatched(text: string, startChar: string, endChar: string): string {\n\tlet start = 0;\n\tlet end = text.length;\n\twhile (text[start] === startChar && text[end - 1] === endChar) {\n\t\tstart += 1;\n\t\tend -= 1;\n\t}\n\treturn text.substring(start, end);\n}\n","/**\n * Checks whether the supplied string is fully reactive (i.e. starts and ends with braces)\n *\n * @param text The string to check\n *\n * @returns True if the supplied string is fully reactive\n */\nexport default function isFullyReactive(text: string): boolean {\n\t// TODO: Need to be more fancy (check that braces match, ignore comments and strings etc)\n\treturn text.trim().startsWith(\"{\") && text.trim().endsWith(\"}\");\n}\n","import { type BuildStatus } from \"../client/BuildStatus\";\nimport { type BuildServerStatus } from \"../server/BuildServerStatus\";\n\n/**\n * Makes a supplied variable name (hopefully!) unique by prepending `t_` and\n * appending a sequence number\n *\n * @param name The variable name\n * @param status The build status\n *\n * @returns A unique variable name\n */\nexport default function nextVarName(name: string, status: BuildStatus | BuildServerStatus): string {\n\tif (!status.varNames[name]) {\n\t\tstatus.varNames[name] = 1;\n\t}\n\tlet varName = `t_${name}_${status.varNames[name]}`;\n\tstatus.varNames[name] += 1;\n\treturn varName;\n}\n","import { type ControlNode } from \"../../types/nodes/ControlNode\";\nimport { type ElementNode } from \"../../types/nodes/ElementNode\";\nimport { type RootNode } from \"../../types/nodes/RootNode\";\nimport Builder from \"../../utils/Builder\";\nimport { type BuildStatus } from \"./BuildStatus\";\n\nexport default function buildAddFragment(\n\tnode: RootNode | ControlNode | ElementNode,\n\tstatus: BuildStatus,\n\tb: Builder,\n\tparentName: string,\n\tanchorName: string,\n): void {\n\tif (node.fragment) {\n\t\tconst fragment = node.fragment;\n\t\tconst fragmentName = `t_fragment_${fragment.number}`;\n\t\tstatus.imports.add(\"t_add_fragment\");\n\t\tb.append(`t_add_fragment(${fragmentName}, ${parentName}, ${anchorName});`);\n\t\t// TODO: Don't need to do this if the last thing we hydrated was the end node\n\t\tif (fragment.endVarName) {\n\t\t\tstatus.imports.add(\"t_next\");\n\t\t\tb.append(`t_next(${fragment.endVarName});`);\n\t\t}\n\t}\n}\n","/**\n * Checks whether the supplied character is a space\n *\n * @param text The string to check\n * @param index The index of the character in the string\n *\n * @returns True if the supplied character is a space\n */\nexport default function isSpaceChar(text: string, index: number): boolean {\n\tlet code = text.charCodeAt(index);\n\treturn code === 32 || (code >= 9 && code <= 13);\n}\n","import isSpaceChar from \"./isSpaceChar\";\n\n/**\n * Checks whether the supplied string contains only space characters\n *\n * @param text The string to check\n *\n * @returns True if the supplied string contains only space characters\n */\nexport default function isSpace(text: string): boolean {\n\tfor (let i = 0; i < text.length; i++) {\n\t\tif (!isSpaceChar(text, i)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n","import { type ControlNode } from \"./ControlNode\";\nimport { type TemplateNode } from \"./TemplateNode\";\n\nexport default function isControlNode(node: TemplateNode): node is ControlNode {\n\treturn node.type === \"control\";\n}\n","import { type ElementNode } from \"./ElementNode\";\nimport { type TemplateNode } from \"./TemplateNode\";\n\nexport default function isElementNode(node: TemplateNode): node is ElementNode {\n\treturn node.type === \"element\";\n}\n","import { type TemplateNode } from \"./TemplateNode\";\nimport { type TextNode } from \"./TextNode\";\n\nexport default function isTextNode(node: TemplateNode): node is TextNode {\n\treturn node.type === \"text\";\n}\n","import isFullyReactive from \"./isFullyReactive\";\nimport isReactive from \"./isReactive\";\n\n/**\n * Checks whether the supplied attribute is reactive (i.e. its name starts and\n * ends with braces, its value contains braces, or it's an event)\n *\n * @param name The attribute's name\n * @param value The attribute's value\n *\n * @returns True if the supplied attribute is reactive\n */\nexport default function isReactiveAttribute(name: string, value: string): boolean {\n\t// TODO: Better checking of whether an attribute is reactive\n\treturn isFullyReactive(name) || isReactive(value) || name.startsWith(\"on\");\n}\n","import isSpace from \"../../parse/utils/isSpace\";\nimport { type ControlNode } from \"../../types/nodes/ControlNode\";\nimport { type ElementNode } from \"../../types/nodes/ElementNode\";\nimport { type Fragment } from \"../../types/nodes/Fragment\";\nimport { type RootNode } from \"../../types/nodes/RootNode\";\nimport { type TemplateNode } from \"../../types/nodes/TemplateNode\";\nimport { type TextNode } from \"../../types/nodes/TextNode\";\nimport isControlNode from \"../../types/nodes/isControlNode\";\nimport isElementNode from \"../../types/nodes/isElementNode\";\nimport isTextNode from \"../../types/nodes/isTextNode\";\nimport Builder from \"../../utils/Builder\";\nimport trimQuotes from \"../../utils/trimQuotes\";\nimport isReactive from \"../utils/isReactive\";\nimport isReactiveAttribute from \"../utils/isReactiveAttribute\";\nimport nextVarName from \"../utils/nextVarName\";\nimport { type BuildStatus } from \"./BuildStatus\";\nimport buildNode from \"./buildNode\";\n\ninterface VariablePath {\n\tparent: VariablePath | null;\n\ttype: string;\n\tchildren: VariablePath[];\n}\n\n/**\n * Builds the variables and code in a fragment\n */\nexport default function buildFragment(\n\tnode: RootNode | ControlNode | ElementNode,\n\tstatus: BuildStatus,\n\tb: Builder,\n\tparentName: string,\n\tanchorName: string,\n): void {\n\tif (node.fragment) {\n\t\tconst fragment = node.fragment;\n\t\tconst fragmentName = `t_fragment_${fragment.number}`;\n\t\tif (status.options?.useCreateElement) {\n\t\t\t// Declarations, then createXxx calls\n\t\t\tlet fragmentPath = { parent: null, type: \"fragment\", children: [] };\n\t\t\tlet varPaths = new Map<string, string>();\n\t\t\tdeclareFragmentVars(\n\t\t\t\tnode.fragment,\n\t\t\t\tnode,\n\t\t\t\tfragmentPath,\n\t\t\t\tstatus,\n\t\t\t\tb,\n\t\t\t\tparentName,\n\t\t\t\tanchorName,\n\t\t\t\tvarPaths,\n\t\t\t\tfalse,\n\t\t\t\ttrue,\n\t\t\t);\n\n\t\t\tfragmentPath.children.length = 0;\n\t\t\tvarPaths.clear();\n\t\t\tstatus.imports.add(\"t_frg\");\n\t\t\tb.append(`const ${fragmentName} = t_frg([`);\n\t\t\tdeclareFragmentVars(\n\t\t\t\tnode.fragment,\n\t\t\t\tnode,\n\t\t\t\tfragmentPath,\n\t\t\t\tstatus,\n\t\t\t\tb,\n\t\t\t\tparentName,\n\t\t\t\tanchorName,\n\t\t\t\tvarPaths,\n\t\t\t\tfalse,\n\t\t\t\tfalse,\n\t\t\t);\n\t\t\tb.append(`]);`);\n\t\t} else {\n\t\t\t// Text, then declarations\n\t\t\tstatus.imports.add(\"t_fragment\");\n\t\t\tconst fragmentText = fragment.text.replaceAll(\"`\", \"\\\\`\").replaceAll(/\\s+/g, \" \");\n\t\t\tb.append(\n\t\t\t\t`const ${fragmentName} = t_fragment($parent.ownerDocument!, t_fragments, ${fragment.number}, \\`${fragmentText}\\`${fragment.ns ? \", true\" : \"\"});`,\n\t\t\t);\n\t\t\tlet fragmentPath = { parent: null, type: \"fragment\", children: [] };\n\t\t\tlet varPaths = new Map<string, string>();\n\t\t\tmaybeAddRootNodeDeclaration(node, fragment, fragmentName, status, b, varPaths);\n\t\t\tdeclareFragmentVars(\n\t\t\t\tnode.fragment,\n\t\t\t\tnode,\n\t\t\t\tfragmentPath,\n\t\t\t\tstatus,\n\t\t\t\tb,\n\t\t\t\tparentName,\n\t\t\t\tanchorName,\n\t\t\t\tvarPaths,\n\t\t\t\tfalse,\n\t\t\t\ttrue,\n\t\t\t);\n\t\t}\n\t}\n}\n\nfunction maybeAddRootNodeDeclaration(\n\tnode: RootNode | ControlNode | ElementNode,\n\tfragment: Fragment,\n\tfragmentName: string,\n\tstatus: BuildStatus,\n\tb: Builder,\n\tvarPaths: Map<string, string>,\n) {\n\tif (!node.children.length) return;\n\n\t// We need to store the root node of the fragment for subsequent updates of the fragment\n\t// But not if the node would be declared anyway\n\tlet firstNode = node.children[0];\n\tlet firstNodeIsLastNode = node.children.length === 1;\n\tif (\n\t\t(isControlNode(firstNode) && firstNode.operation.endsWith(\" group\")) ||\n\t\t(isElementNode(firstNode) &&\n\t\t\telementNodeNeedsDeclaration(firstNode, true, firstNodeIsLastNode)) ||\n\t\t(isTextNode(firstNode) && textNodeNeedsDeclaration(firstNode, true, firstNodeIsLastNode))\n\t) {\n\t\t// It's going to be declared later on\n\t} else {\n\t\tstatus.imports.add(\"t_root\");\n\t\tconst rootName = `t_root_${fragment.number}`;\n\t\tconst rootPath = `t_root(${fragmentName})`;\n\t\t// HACK: We don't know whether this variable will be used by other child\n\t\t// nodes, so we have to create it regardless and ignore the error if\n\t\t// it's not used -- maybe we could be smarter about this\n\t\tb.append(\"// @ts-ignore\");\n\t\tb.append(`const ${rootName} = ${rootPath};`);\n\t\tvarPaths.set(rootPath, rootName);\n\t\t//b.append(`console.log(\"${rootName}\", ${rootName}, ${rootName}.textContent);`);\n\t}\n}\n\nfunction declareFragmentVars(\n\tfragment: Fragment,\n\tnode: TemplateNode,\n\tpath: VariablePath,\n\tstatus: BuildStatus,\n\tb: Builder,\n\tparentName: string,\n\tanchorName: string,\n\tvarPaths: Map<string, string>,\n\tlastChild: boolean,\n\tdeclare: boolean,\n) {\n\tswitch (node.type) {\n\t\tcase \"root\": {\n\t\t\tdeclareRootFragmentVars(\n\t\t\t\tfragment,\n\t\t\t\tnode as RootNode,\n\t\t\t\tpath,\n\t\t\t\tstatus,\n\t\t\t\tb,\n\t\t\t\tparentName,\n\t\t\t\tanchorName,\n\t\t\t\tvarPaths,\n\t\t\t\tdeclare,\n\t\t\t);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"control\": {\n\t\t\tdeclareControlFragmentVars(\n\t\t\t\tfragment,\n\t\t\t\tnode as ControlNode,\n\t\t\t\tpath,\n\t\t\t\tstatus,\n\t\t\t\tb,\n\t\t\t\tparentName,\n\t\t\t\tanchorName,\n\t\t\t\tvarPaths,\n\t\t\t\tdeclare,\n\t\t\t);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"component\": {\n\t\t\tdeclareComponentFragmentVars(\n\t\t\t\tfragment,\n\t\t\t\tnode as ElementNode,\n\t\t\t\tpath,\n\t\t\t\tstatus,\n\t\t\t\tb,\n\t\t\t\tparentName,\n\t\t\t\tanchorName,\n\t\t\t\tvarPaths,\n\t\t\t\tdeclare,\n\t\t\t);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"element\": {\n\t\t\tdeclareElementFragmentVars(\n\t\t\t\tfragment,\n\t\t\t\tnode as ElementNode,\n\t\t\t\tpath,\n\t\t\t\tstatus,\n\t\t\t\tb,\n\t\t\t\tparentName,\n\t\t\t\tanchorName,\n\t\t\t\tvarPaths,\n\t\t\t\tlastChild,\n\t\t\t\tdeclare,\n\t\t\t);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"text\": {\n\t\t\tdeclareTextFragmentVars(\n\t\t\t\tfragment,\n\t\t\t\tnode as TextNode,\n\t\t\t\tpath,\n\t\t\t\tstatus,\n\t\t\t\tb,\n\t\t\t\tvarPaths,\n\t\t\t\tlastChild,\n\t\t\t\tdeclare,\n\t\t\t);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"special\": {\n\t\t\tdeclareSpecialFragmentVars(\n\t\t\t\tfragment,\n\t\t\t\tnode as ElementNode,\n\t\t\t\tpath,\n\t\t\t\tstatus,\n\t\t\t\tb,\n\t\t\t\tparentName,\n\t\t\t\tanchorName,\n\t\t\t\tvarPaths,\n\t\t\t\tlastChild,\n\t\t\t\tdeclare,\n\t\t\t);\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\tthrow new Error(`Invalid node type: ${node.type}`);\n\t\t}\n\t}\n}\n\nfunction declareRootFragmentVars(\n\tfragment: Fragment,\n\tnode: RootNode,\n\tpath: VariablePath,\n\tstatus: BuildStatus,\n\tb: Builder,\n\tparentName: string,\n\tanchorName: string,\n\tvarPaths: Map<string, string>,\n\tdeclare: boolean,\n) {\n\tfor (let [i, child] of node.children.entries()) {\n\t\tdeclareFragmentVars(\n\t\t\tfragment,\n\t\t\tchild,\n\t\t\tpath,\n\t\t\tstatus,\n\t\t\tb,\n\t\t\tparentName,\n\t\t\tanchorName,\n\t\t\tvarPaths,\n\t\t\ti === node.children.length - 1,\n\t\t\tdeclare,\n\t\t);\n\t}\n}\n\nfunction declareControlFragmentVars(\n\tfragment: Fragment,\n\tnode: ControlNode,\n\tpath: VariablePath,\n\tstatus: BuildStatus,\n\tb: Builder,\n\tparentName: string,\n\tanchorName: string,\n\tvarPaths: Map<string, string>,\n\tdeclare: boolean,\n) {\n\tswitch (node.operation) {\n\t\tcase \"@if group\":\n\t\tcase \"@switch group\":\n\t\tcase \"@for group\":\n\t\tcase \"@await group\":\n\t\tcase \"@replace group\":\n\t\tcase \"@html group\": {\n\t\t\tconst operation = node.operation.substring(1).replace(\" group\", \"\");\n\t\t\tdeclareParentAndAnchorFragmentVars(\n\t\t\t\tfragment,\n\t\t\t\tnode,\n\t\t\t\tpath,\n\t\t\t\tstatus,\n\t\t\t\tb,\n\t\t\t\tparentName,\n\t\t\t\tanchorName,\n\t\t\t\tvarPaths,\n\t\t\t\toperation,\n\t\t\t\tdeclare,\n\t\t\t);\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\tfor (let [i, child] of node.children.entries()) {\n\t\t\t\tdeclareFragmentVars(\n\t\t\t\t\tfragment,\n\t\t\t\t\tchild,\n\t\t\t\t\tpath,\n\t\t\t\t\tstatus,\n\t\t\t\t\tb,\n\t\t\t\t\tparentName,\n\t\t\t\t\tanchorName,\n\t\t\t\t\tvarPaths,\n\t\t\t\t\ti === node.children.length - 1,\n\t\t\t\t\tdeclare,\n\t\t\t\t);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nfunction declareComponentFragmentVars(\n\tfragment: Fragment,\n\tnode: ElementNode,\n\tpath: VariablePath,\n\tstatus: BuildStatus,\n\tb: Builder,\n\tparentName: string,\n\tanchorName: string,\n\tvarPaths: Map<string, string>,\n\tdeclare: boolean,\n) {\n\tdeclareParentAndAnchorFragmentVars(\n\t\tfragment,\n\t\tnode,\n\t\tpath,\n\t\tstatus,\n\t\tb,\n\t\tparentName,\n\t\tanchorName,\n\t\tvarPaths,\n\t\t\"comp\",\n\t\tdeclare,\n\t);\n}\n\nfunction elementTypeName(node: ElementNode) {\n\t// TODO: Etc\n\tswitch (node.tagName.toLowerCase()) {\n\t\tcase \"div\":\n\t\tcase \"input\":\n\t\t\treturn `HTML${node.tagName.substring(0, 1).toUpperCase() + node.tagName.substring(1)}Element`;\n\t\tcase \"textarea\":\n\t\t\treturn \"HTMLTextAreaElement\";\n\t}\n\treturn \"HTMLElement\";\n}\n\nfunction declareElementFragmentVars(\n\tfragment: Fragment,\n\tnode: ElementNode,\n\tpath: VariablePath,\n\tstatus: BuildStatus,\n\tb: Builder,\n\tparentName: string,\n\tanchorName: string,\n\tvarPaths: Map<string, string>,\n\tlastChild: boolean,\n\tdeclare: boolean,\n) {\n\tconst tagName = node.tagName === \":element\" ? \"element\" : node.tagName;\n\n\tlet elementPath = { parent: path, type: tagName, children: [] };\n\tpath.children.push(elementPath);\n\n\tconst topLevel = !path.parent;\n\tconst declareVariable = elementNodeNeedsDeclaration(node, topLevel, lastChild);\n\n\tif (declare) {\n\t\tif (declareVariable) {\n\t\t\tnode.varName = nextVarName(tagName, status);\n\t\t\tif (topLevel) {\n\t\t\t\tfragment.endVarName = node.varName;\n\t\t\t}\n\t\t\tconst varPath = getFragmentVarPath(fragment, status, node.varName, elementPath, varPaths);\n\t\t\tif (status.options?.useCreateElement) {\n\t\t\t\tb.append(`let ${node.varName};`);\n\t\t\t} else {\n\t\t\t\tif (node.tagName === \":element\") {\n\t\t\t\t\tb.append(`let ${node.varName} = ${varPath} as ${elementTypeName(node)};`);\n\t\t\t\t} else {\n\t\t\t\t\t// HACK: Not great\n\t\t\t\t\tif (topLevel && lastChild) {\n\t\t\t\t\t\tb.append(\"// @ts-ignore\");\n\t\t\t\t\t}\n\t\t\t\t\tb.append(`const ${node.varName} = ${varPath} as ${elementTypeName(node)};`);\n\t\t\t\t}\n\t\t\t\t//b.append(`console.log(\"${node.varName}\", ${node.varName}, ${node.varName}.textContent);`);\n\t\t\t}\n\t\t}\n\t}\n\n\t// If there is an immediate child of this element that has this element as its parent,\n\t// we need to assign the element to the parent var\n\t// @ts-ignore\n\tlet childParentName = node.children.find((c) => !!c.parentName)?.parentName;\n\n\tif (!declare) {\n\t\tlet attributes = node.attributes\n\t\t\t.filter((a) => !a.name.startsWith(\"on\") && !a.name.includes(\":\"))\n\t\t\t.map((a) => {\n\t\t\t\tif (a.value && isReactive(a.value)) {\n\t\t\t\t\t// Adding a placeholder for reactive attributes seems to speed things\n\t\t\t\t\t// up, especially in the case of data attributes\n\t\t\t\t\treturn `\"${a.name}\": \"#\"`;\n\t\t\t\t} else if (a.value) {\n\t\t\t\t\treturn `\"${a.name}\": \"${trimQuotes(a.value) || a.name}\"`;\n\t\t\t\t} else {\n\t\t\t\t\treturn `\"${a.name}\": true\"`;\n\t\t\t\t}\n\t\t\t})\n\t\t\t.join(\", \");\n\n\t\tstatus.imports.add(\"t_elm\");\n\t\tif (declareVariable) {\n\t\t\tb.append(\n\t\t\t\t`(${childParentName ? `${childParentName} = ` : \"\"}${node.varName} = t_elm(\"${node.tagName}\", {${attributes}}, [`,\n\t\t\t);\n\t\t} else if (childParentName) {\n\t\t\tb.append(`(${childParentName} = t_elm(\"${node.tagName}\", {${attributes}}, [`);\n\t\t} else {\n\t\t\tb.append(`t_elm(\"${node.tagName}\", {${attributes}}, [`);\n\t\t}\n\t}\n\n\tfor (let [i, child] of node.children.entries()) {\n\t\tdeclareFragmentVars(\n\t\t\tfragment,\n\t\t\tchild,\n\t\t\telementPath,\n\t\t\tstatus,\n\t\t\tb,\n\t\t\tparentName,\n\t\t\tanchorName,\n\t\t\tvarPaths,\n\t\t\ti === node.children.length - 1,\n\t\t\tdeclare,\n\t\t);\n\t}\n\n\tif (!declare) {\n\t\tif (declareVariable || childParentName) {\n\t\t\tb.append(\"])),\");\n\t\t} else {\n\t\t\tb.append(\"]),\");\n\t\t}\n\t}\n}\n\nfunction elementNodeNeedsDeclaration(node: ElementNode, topLevel: boolean, lastChild: boolean) {\n\tconst hasReactiveAttribute = node.attributes.some(\n\t\t(a) => a.value && isReactiveAttribute(a.name, a.value),\n\t);\n\tconst isDynamicElement =\n\t\tnode.tagName === \":element\" && node.attributes.find((a) => a.name === \"self\");\n\treturn hasReactiveAttribute || isDynamicElement || (topLevel && lastChild);\n}\n\nfunction declareTextFragmentVars(\n\tfragment: Fragment,\n\tnode: TextNode,\n\tpath: VariablePath,\n\tstatus: BuildStatus,\n\tb: Builder,\n\tvarPaths: Map<string, string>,\n\tlastChild: boolean,\n\tdeclare: boolean,\n) {\n\t// HACK: Text nodes get merged together\n\t// Is this because of control nodes like @key and @const??\n\t// TODO: We should do this when building for the server too\n\tconst lastType = path.children[path.children.length - 1]?.type;\n\tif (lastType === \"text\" || lastType === \"space\") {\n\t\treturn;\n\t}\n\n\tlet textPath = { parent: path, type: isSpace(node.content) ? \"space\" : \"text\", children: [] };\n\tpath.children.push(textPath);\n\n\tconst topLevel = !path.parent;\n\tconst declareVariable = textNodeNeedsDeclaration(node, topLevel, lastChild);\n\n\tif (declare) {\n\t\tif (declareVariable) {\n\t\t\tnode.varName = nextVarName(\"text\", status);\n\t\t\tif (topLevel) {\n\t\t\t\tfragment.endVarName = node.varName;\n\t\t\t}\n\t\t\tconst varPath = getFragmentVarPath(fragment, status, node.varName, textPath, varPaths);\n\t\t\tif (status.options?.useCreateElement) {\n\t\t\t\tb.append(`let ${node.varName};`);\n\t\t\t} else {\n\t\t\t\t// HACK: Not great\n\t\t\t\tif (topLevel && lastChild) {\n\t\t\t\t\tb.append(\"// @ts-ignore\");\n\t\t\t\t}\n\t\t\t\tb.append(`const ${node.varName} = ${varPath};`);\n\t\t\t\t//b.append(`console.log(\"${node.varName}\", ${node.varName}, ${node.varName}.textContent);`);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tstatus.imports.add(\"t_txt\");\n\t\tif (declareVariable) {\n\t\t\tb.append(`(${node.varName} = t_txt(\" \")),`);\n\t\t} else {\n\t\t\tb.append(`t_txt(\"${node.content}\"),`);\n\t\t}\n\t}\n}\n\nfunction textNodeNeedsDeclaration(node: TextNode, topLevel: boolean, lastChild: boolean) {\n\treturn isReactive(node.content) || (topLevel && lastChild);\n}\n\nfunction declareSpecialFragmentVars(\n\tfragment: Fragment,\n\tnode: ElementNode,\n\tpath: VariablePath,\n\tstatus: BuildStatus,\n\tb: Builder,\n\tparentName: string,\n\tanchorName: string,\n\tvarPaths: Map<string, string>,\n\tlastChild: boolean,\n\tdeclare: boolean,\n) {\n\tif (node.tagName === \":slot\") {\n\t\tdeclareParentAndAnchorFragmentVars(\n\t\t\tfragment,\n\t\t\tnode,\n\t\t\tpath,\n\t\t\tstatus,\n\t\t\tb,\n\t\t\tparentName,\n\t\t\tanchorName,\n\t\t\tvarPaths,\n\t\t\t\"slot\",\n\t\t\tdeclare,\n\t\t);\n\t}\n\n\tswitch (node.tagName) {\n\t\tcase \":slot\":\n\t\tcase \":fill\": {\n\t\t\tfor (let [i, child] of node.children.entries()) {\n\t\t\t\tdeclareFragmentVars(\n\t\t\t\t\tfragment,\n\t\t\t\t\tchild,\n\t\t\t\t\tpath,\n\t\t\t\t\tstatus,\n\t\t\t\t\tb,\n\t\t\t\t\tparentName,\n\t\t\t\t\tanchorName,\n\t\t\t\t\tvarPaths,\n\t\t\t\t\ti === node.children.length - 1,\n\t\t\t\t\tdeclare,\n\t\t\t\t);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \":element\": {\n\t\t\tdeclareElementFragmentVars(\n\t\t\t\tfragment,\n\t\t\t\tnode,\n\t\t\t\tpath,\n\t\t\t\tstatus,\n\t\t\t\tb,\n\t\t\t\tparentName,\n\t\t\t\tanchorName,\n\t\t\t\tvarPaths,\n\t\t\t\tlastChild,\n\t\t\t\tdeclare,\n\t\t\t);\n\t\t\tbreak;\n\t\t}\n\t\tcase \":component\": {\n\t\t\tdeclareComponentFragmentVars(\n\t\t\t\tfragment,\n\t\t\t\tnode,\n\t\t\t\tpath,\n\t\t\t\tstatus,\n\t\t\t\tb,\n\t\t\t\tparentName,\n\t\t\t\tanchorName,\n\t\t\t\tvarPaths,\n\t\t\t\tdeclare,\n\t\t\t);\n\t\t\tbreak;\n\t\t}\n\t\tcase \":head\": {\n\t\t\t// Don't need to do anything here\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\tthrow new Error(`Invalid special node: ${node.tagName}`);\n\t\t}\n\t}\n}\n\nfunction declareParentAndAnchorFragmentVars(\n\tfragment: Fragment,\n\tnode: ControlNode | ElementNode,\n\tpath: VariablePath,\n\tstatus: BuildStatus,\n\tb: Builder,\n\tparentName: string,\n\tanchorName: string,\n\tvarPaths: Map<string, string>,\n\tname: string,\n\tdeclare: boolean,\n) {\n\tconst topLevel = !path.parent;\n\n\t// Declare the parent\n\tif (topLevel) {\n\t\t// If this is a top-level element, then the parent is the fragment\n\t\tnode.parentName = `t_fragment_${fragment.number}`;\n\t} else {\n\t\tconst parentPath = path;\n\t\tconst oldChildren = parentPath.children;\n\t\tparentPath.children = [];\n\t\tconst parentVarPath = getFragmentVarPath(fragment, status, \"?\", parentPath, varPaths);\n\t\tparentPath.children = oldChildren;\n\t\t// TODO: Should do this thing for the last child as well\n\t\tif (varPaths.has(parentVarPath)) {\n\t\t\tnode.parentName = varPaths.get(parentVarPath);\n\t\t} else {\n\t\t\tif (declare) {\n\t\t\t\tnode.parentName = nextVarName(`${name}_parent`, status);\n\t\t\t\tif (status.options?.useCreateElement) {\n\t\t\t\t\tb.append(`let ${node.parentName} as HTMLElement;`);\n\t\t\t\t} else {\n\t\t\t\t\tb.append(`const ${node.parentName} = ${parentVarPath} as HTMLElement;`);\n\t\t\t\t}\n\t\t\t\tvarPaths.set(parentVarPath, node.parentName);\n\t\t\t} else {\n\t\t\t\t// HACK: For the createElement option, this gets done in the parent\n\t\t\t}\n\t\t}\n\t}\n\n\t// Declare the anchor\n\tif (declare) {\n\t\tconst anchorPath = { parent: path, type: \"#\", children: [] };\n\t\tpath.children.push(anchorPath);\n\n\t\tnode.varName = nextVarName(`${name}_anchor`, status);\n\t\tconst anchorVarPath = getFragmentVarPath(fragment, status, node.varName, anchorPath, varPaths);\n\t\tif (status.options?.useCreateElement) {\n\t\t\tb.append(`let ${node.varName};`);\n\t\t} else {\n\t\t\tstatus.imports.add(\"t_anchor\");\n\t\t\tb.append(`const ${node.varName} = t_anchor(${anchorVarPath}) as HTMLElement;`);\n\t\t\t//b.append(`console.log(\"${node.varName}\", ${node.varName}, ${node.varName}.textContent);`);\n\t\t}\n\t} else {\n\t\tstatus.imports.add(\"t_cmt\");\n\t\tb.append(`(${node.varName} = t_cmt()),`);\n\t}\n\n\t// Build nodes with anchors immediately, while we have their anchor node,\n\t// rather than at the end of the fragment\n\tbuildNode(node, status, b, parentName, anchorName);\n\tnode.handled = true;\n}\n\nfunction getFragmentVarPath(\n\tfragment: Fragment,\n\tstatus: BuildStatus,\n\tname: string,\n\tpath: VariablePath,\n\tvarPaths: Map<string, string>,\n): string {\n\tlet node = path;\n\twhile (node.parent) {\n\t\tnode = node.parent;\n\t}\n\tlet varName = `t_fragment_${fragment.number}`;\n\tlet varPath = getFragmentVarPathPart(node, varName, status, true);\n\n\t// Check for parts of the path that have already been run to shorten our\n\t// traversal\n\tfor (let [existingPath, existingName] of varPaths) {\n\t\tif (varPath.includes(existingPath)) {\n\t\t\tvarPath = varPath.replace(existingPath, existingName);\n\t\t}\n\t}\n\n\t// HACK: allow passing in \"?\" to not add the parentVarPath to the existing\n\t// paths\n\tif (name !== \"?\") {\n\t\t// Add the path, so that we can shorten subsequent paths e.g.\n\t\t// const div = t_next(t_child(root));\n\t\t// const p = t_next(t_next(t_next(t_child(root))))\n\t\t// => const p = t_next(t_next(div))\n\t\tvarPaths.set(varPath, name);\n\t\t// Add the name, so that we are always using the last declared name\n\t\tvarPaths.set(name, name);\n\t}\n\n\t// Shorten `t_next(t_next(x))` to `t_next(x, 2)`\n\twhile (varPath.includes(\"t_next(t_next(\")) {\n\t\tconst match = varPath.match(/(t_next\\(){2,}/)![0];\n\t\tconst count = match.length / \"t_next(\".length;\n\t\tconst pos = varPath.indexOf(\"t_next(t_next(\");\n\t\tconst head = varPath.substring(0, pos);\n\t\tlet level = 0;\n\t\tlet end = 0;\n\t\tfor (let i = pos + match.length; i < varPath.length; i++) {\n\t\t\tif (varPath[i] === \"(\") {\n\t\t\t\tlevel++;\n\t\t\t} else if (varPath[i] === \")\") {\n\t\t\t\tif (level === 0) {\n\t\t\t\t\tend = i;\n\t\t\t\t\tbreak;\n\t\t\t\t} else {\n\t\t\t\t\tlevel--;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst tail = varPath.substring(end + count);\n\t\tconst param = varPath.substring(pos + match.length, end);\n\t\tvarPath = `${head}t_next(${param}, ${count})${tail}`;\n\t}\n\n\treturn varPath;\n}\n\nfunction getFragmentVarPathPart(\n\tpath: VariablePath,\n\tvarPath: string,\n\tstatus: BuildStatus,\n\troot = false,\n): string {\n\tif (root) {\n\t\tstatus.imports.add(\"t_root\");\n\t\tvarPath = `t_root(${varPath})`;\n\t} else {\n\t\tstatus.imports.add(\"t_child\");\n\t\tvarPath = `t_child(${varPath})`;\n\t}\n\tfor (let [i, child] of path.children.entries()) {\n\t\tif (i > 0) {\n\t\t\tstatus.imports.add(\"t_next\");\n\t\t\t//if (varPath.startsWith(\"t_next\")) {\n\t\t\t//\tconst match = varPath.match(/t_next\\(.+?, (\\d+)\\)/);\n\t\t\t//\tif (match) {\n\t\t\t//\t\tconst count = parseInt(match[1]) + 1;\n\t\t\t//\t\tvarPath = varPath.replace(/t_next\\((.+), \\d+\\)/, `t_next($1, ${count})`);\n\t\t\t//\t} else {\n\t\t\t//\t\tvarPath = varPath.replace(/t_next\\((.+)\\)/, `t_next($1, 2)`);\n\t\t\t//\t}\n\t\t\t//} else {\n\t\t\tvarPath = `t_next(${varPath})`;\n\t\t\t//}\n\t\t}\n\n\t\tif (i === path.children.length - 1 && child.children.length) {\n\t\t\tvarPath = getFragmentVarPathPart(child, varPath, status);\n\t\t}\n\t}\n\treturn varPath;\n}\n\n/*\nfunction printPath(path: VariablePath) {\n\tlet parent = path;\n\twhile (parent.parent) {\n\t\tparent = parent.parent;\n\t}\n\tprintPathPart(parent);\n}\n\nfunction printPathPart(path: VariablePath, indent = 0) {\n\tconsole.log(`${\" \".repeat(indent * 2)}${path.type}`);\n\tfor (let child of path.children) {\n\t\tprintPathPart(child, indent + 1);\n\t}\n}\n*/\n","import type { BuildStatus } from \"./BuildStatus\";\n\n/**\n * Variables used within a for loop need to be retrieved from the loop data.\n */\nexport default function replaceForVarNames(value: string, status: BuildStatus): string {\n\t// HACK: If a value from a for loop is used in the function body,\n\t// get it from the loop data to trigger an update when it is changed\n\tfor (let varName of status.forVarNames) {\n\t\tvalue = value.replaceAll(\n\t\t\tnew RegExp(`(^|\\\\s|\\\\(|\\\\[|\\\\{)${varName}($|\\\\s|\\\\.|\\\\(|\\\\)|\\\\[|\\\\]|\\\\}|;)`, \"g\"),\n\t\t\t`$1t_item.data.${varName}$2`,\n\t\t);\n\t}\n\treturn value;\n}\n","import Builder from \"../../utils/Builder\";\nimport { type BuildStatus } from \"./BuildStatus\";\nimport replaceForVarNames from \"./replaceForVarNames\";\n\nexport default function buildRun(\n\tfunctionName: string,\n\tfunctionBody: string,\n\tstatus: BuildStatus,\n\tb: Builder,\n): void {\n\tfunctionBody = replaceForVarNames(functionBody, status);\n\n\tstatus.imports.add(\"$run\");\n\tb.append(`$run(function ${functionName}() {`);\n\tb.append(functionBody);\n\tb.append(\"});\");\n}\n","import { type ElementNode } from \"../../types/nodes/ElementNode\";\nimport isSpecialNode from \"../../types/nodes/isSpecialNode\";\nimport Builder from \"../../utils/Builder\";\nimport trimMatched from \"../../utils/trimMatched\";\nimport trimQuotes from \"../../utils/trimQuotes\";\nimport isFullyReactive from \"../utils/isFullyReactive\";\nimport isReactive from \"../utils/isReactive\";\nimport nextVarName from \"../utils/nextVarName\";\nimport { type BuildStatus } from \"./BuildStatus\";\nimport buildAddFragment from \"./buildAddFragment\";\nimport buildFragment from \"./buildFragment\";\nimport buildNode from \"./buildNode\";\nimport buildRun from \"./buildRun\";\n\nexport default function buildComponentNode(\n\tnode: ElementNode,\n\tstatus: BuildStatus,\n\tb: Builder,\n\troot = false,\n): void {\n\tb.append(\"\");\n\tb.append(\"/* @component */\");\n\n\t// Props\n\tconst componentHasProps = node.attributes.length || root;\n\tconst propsName = componentHasProps ? nextVarName(\"props\", status) : \"undefined\";\n\tif (componentHasProps) {\n\t\t// NOTE: The $props object is wrapped in a proxy so that components can\n\t\t// be updated if they refer to a $props.property in e.g. an element's\n\t\t// attribute\n\t\t// TODO: default props etc\n\t\tstatus.imports.add(\"$watch\");\n\t\tb.append(`const ${propsName}: any = $watch({});`);\n\n\t\tfor (let { name, value } of node.attributes) {\n\t\t\tif (name === \"self\" && node.tagName === \":component\") {\n\t\t\t\t// Ignore this special attribute\n\t\t\t} else if (name.startsWith(\"{\") && name.endsWith(\"}\")) {\n\t\t\t\t// It's a shortcut attribute\n\t\t\t\t// It could be e.g. {width} or it could be {$state.width}, but\n\t\t\t\t// in either case we set the value of the width property\n\t\t\t\tname = name.substring(1, name.length - 1);\n\t\t\t\tconst propName = name.split(\".\").at(-1);\n\t\t\t\tbuildRun(\"setProp\", `${propsName}[\"${propName}\"] = ${name};`, status, b);\n\t\t\t} else if (name.startsWith(\"&\") && value != null && isFullyReactive(value)) {\n\t\t\t\t// It's a bound property\n\t\t\t\t// Add two $runs -- one to update the props, and one to update the value\n\t\t\t\t// The component author will need to make sure $props.x is updated\n\t\t\t\t// TODO: Maybe allow adding a Bindable<T> type to the $props interface??\n\t\t\t\t// e.g. Component($props: { text: Bindable<string> })\n\t\t\t\tname = name.substring(1);\n\t\t\t\tvalue = value.substring(1, value.length - 1);\n\t\t\t\tbuildRun(\"setProp\", `${propsName}[\"${name}\"] = ${value};`, status, b);\n\t\t\t\tbuildRun(\"setBinding\", `${value} = ${propsName}[\"${name}\"];`, status, b);\n\t\t\t} else if (value != null) {\n\t\t\t\tlet fullyReactive = isFullyReactive(value);\n\t\t\t\tlet partlyReactive = isReactive(value);\n\t\t\t\tif (fullyReactive) {\n\t\t\t\t\tvalue = value.substring(1, value.length - 1);\n\t\t\t\t} else if (partlyReactive) {\n\t\t\t\t\tvalue = `\\`${trimQuotes(value).replaceAll(\"{\", \"${\")}\\``;\n\t\t\t\t}\n\t\t\t\tif (name === \"class\") {\n\t\t\t\t\t// TODO: How to handle dynamic classes etc\n\t\t\t\t\t// Probably just compile down to a string?\n\t\t\t\t\tvalue = `\"${trimQuotes(value)} torp-${status.styleHash}\"`;\n\t\t\t\t}\n\t\t\t\tconst setProp = `${propsName}[\"${name}\"] = ${value};`;\n\t\t\t\tif (fullyReactive || partlyReactive) {\n\t\t\t\t\tbuildRun(\"setProp\", setProp, status, b);\n\t\t\t\t} else {\n\t\t\t\t\tb.append(setProp);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tb.append(`${propsName}[\"${name}\"] = true;`);\n\t\t\t}\n\t\t}\n\t\t// PERF: Does this have much of an impact??\n\t\tif (root) {\n\t\t\tstatus.imports.add(\"$run\");\n\t\t\tb.append(`\n\t\t\tif ($props) {\n\t\t\t\tconst propNames = [${status.props.map((p) => `'${p}'`).join(\", \")}];\n\t\t\t\tfor (let name of Object.keys($props)) {\n\t\t\t\t\tif (!name.startsWith(\"$\") && !propNames.includes(name)) {\n\t\t\t\t\t\t$run(() => ${propsName}[name] = $props[name]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}`);\n\t\t}\n\t}\n\n\t// Slots\n\tconst componentHasSlots = node.children.length;\n\tconst slotsName = componentHasSlots ? nextVarName(\"slots\", status) : \"undefined\";\n\tif (componentHasSlots) {\n\t\tb.append(`const ${slotsName}: Record<string, SlotRender> = {};`);\n\t\tfor (let slot of node.children) {\n\t\t\tif (isSpecialNode(slot)) {\n\t\t\t\tconst nameAttribute = slot.attributes.find((a) => a.name === \"name\");\n\t\t\t\tconst slotName = nameAttribute?.value ? trimQuotes(nameAttribute.value) : \"_\";\n\t\t\t\tconst slotParams = [\n\t\t\t\t\t\"$sparent: ParentNode\",\n\t\t\t\t\t\"$sanchor: Node | null\",\n\t\t\t\t\t\"//@ts-ignore\\n$sprops?: Record<PropertyKey, any>\",\n\t\t\t\t\t\"//@ts-ignore\\n$context?: Record<PropertyKey, any>\",\n\t\t\t\t];\n\t\t\t\tb.append(`${slotsName}[\"${slotName}\"] = (\\n${slotParams.join(\",\\n\")}\\n) => {`);\n\n\t\t\t\tbuildFragment(slot, status, b, \"$sparent\", \"$sanchor\");\n\n\t\t\t\tstatus.fragmentStack.push({\n\t\t\t\t\tfragment: slot.fragment,\n\t\t\t\t\tpath: \"\",\n\t\t\t\t});\n\t\t\t\tfor (let child of slot.children) {\n\t\t\t\t\tbuildNode(child, status, b, \"$sparent\", \"$sanchor\");\n\t\t\t\t}\n\t\t\t\tstatus.fragmentStack.pop();\n\n\t\t\t\tbuildAddFragment(slot, status, b, \"$sparent\", \"$sanchor\");\n\n\t\t\t\tb.append(`}`);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Render the component\n\tconst compParentName = node.parentName;\n\tconst compAnchorName = node.varName;\n\tlet renderParams = `${compParentName}, ${compAnchorName}, ${propsName}, $context`;\n\tif (slotsName !== \"undefined\") {\n\t\trenderParams += `, ${slotsName}`;\n\t}\n\n\tlet componentName = node.tagName;\n\tif (componentName === \":component\") {\n\t\tlet selfAttribute = node.attributes.find((a) => a.name === \"self\");\n\t\tif (selfAttribute && selfAttribute.value) {\n\t\t\tcomponentName = trimMatched(selfAttribute.value, \"{\", \"}\");\n\t\t}\n\t}\n\n\tb.append(`${componentName}(${renderParams});`);\n}\n","import { type ControlNode } from \"../../types/nodes/ControlNode\";\nimport isControlNode from \"../../types/nodes/isControlNode\";\nimport Builder from \"../../utils/Builder\";\nimport trimMatched from \"../../utils/trimMatched\";\nimport nextVarName from \"../utils/nextVarName\";\nimport { type BuildStatus } from \"./BuildStatus\";\nimport buildAddFragment from \"./buildAddFragment\";\nimport buildFragment from \"./buildFragment\";\nimport buildNode from \"./buildNode\";\n\nexport default function buildAwaitNode(node: ControlNode, status: BuildStatus, b: Builder): void {\n\tconst awaitParentName = node.parentName!;\n\tconst awaitAnchorName = node.varName!;\n\tconst awaitRangeName = nextVarName(\"await_range\", status);\n\tconst awaitTokenName = nextVarName(\"await_token\", status);\n\tconst oldRangeName = nextVarName(\"old_range\", status);\n\n\t// Filter non-control branches (spaces)\n\tconst branches = node.children.filter((n) => isControlNode(n)) as ControlNode[];\n\n\t// Make sure all branches exist\n\tlet awaitBranch = branches.find((n) => n.operation === \"@await\")!;\n\tif (!awaitBranch) {\n\t\t// TODO: Error handling\n\t}\n\tlet thenBranch = branches.find((n) => n.operation === \"@then\");\n\tif (!thenBranch) {\n\t\tthenBranch = {\n\t\t\ttype: \"control\",\n\t\t\toperation: \"@then\",\n\t\t\tstatement: \"then\",\n\t\t\tchildren: [],\n\t\t};\n\t}\n\tlet catchBranch = branches.find((n) => n.operation === \"@catch\");\n\tif (!catchBranch) {\n\t\tcatchBranch = {\n\t\t\ttype: \"control\",\n\t\t\toperation: \"@catch\",\n\t\t\tstatement: \"catch\",\n\t\t\tchildren: [],\n\t\t};\n\t}\n\n\tconst awaiterName = trimMatched(awaitBranch.statement.substring(\"await\".length).trim(), \"(\", \")\");\n\tconst thenVar = trimMatched(thenBranch.statement.substring(\"then\".length).trim(), \"(\", \")\");\n\tconst catchVar = trimMatched(catchBranch.statement.substring(\"catch\".length).trim(), \"(\", \")\");\n\n\t// Use an incrementing token to make sure only the last request gets handled\n\t// TODO: This might have unforeseen consequences\n\tstatus.imports.add(\"t_range\");\n\tstatus.imports.add(\"t_run_control\");\n\tb.append(\"\");\n\tb.append(`\n\t/* @await */\n\tconst ${awaitRangeName} = t_range();\n\t${awaitRangeName}.index = -1;\n\tlet ${awaitTokenName} = 0;\n\tt_run_control(${awaitRangeName}, ${awaitAnchorName}, (t_before) => {\n\t\t${awaitTokenName}++;`);\n\n\tbuildAwaitBranch(awaitBranch, status, b, awaitParentName, awaitRangeName, 0);\n\n\tstatus.imports.add(\"t_push_range\");\n\tstatus.imports.add(\"t_pop_range\");\n\tb.append(`\n\t((token) => {\n\t\t${awaiterName}\n\t\t.then((${thenVar}) => {\n\t\tif (token === ${awaitTokenName}) {\n\t\t\tlet ${oldRangeName} = t_push_range(${awaitRangeName});`);\n\n\tbuildAwaitBranch(thenBranch, status, b, awaitParentName, awaitRangeName, 1);\n\n\tb.append(`t_pop_range(${oldRangeName});\n\t\t}\n\t})\n\t.catch((${catchVar}) => {\n\t\tif (token === ${awaitTokenName}) {\n\t\t\tlet ${oldRangeName} = t_push_range(${awaitRangeName});`);\n\n\tbuildAwaitBranch(catchBranch, status, b, awaitParentName, awaitRangeName, 2);\n\n\tb.append(`t_pop_range(${oldRangeName});\n\t\t\t\t}\n\t\t\t});\n\t\t})(${awaitTokenName});\n\t});`);\n\tb.append(\"\");\n}\n\nfunction buildAwaitBranch(\n\tnode: ControlNode,\n\tstatus: BuildStatus,\n\tb: Builder,\n\tparentName: string,\n\trangeName: string,\n\tindex: number,\n) {\n\tstatus.imports.add(\"t_run_branch\");\n\n\tb.append(`t_run_branch(${rangeName}, ${index}, () => {`);\n\n\tbuildFragment(node, status, b, parentName, \"t_before\");\n\n\tstatus.fragmentStack.push({\n\t\tfragment: node.fragment!,\n\t\tpath: \"\",\n\t});\n\tfor (let child of node.children) {\n\t\tbuildNode(child, status, b, parentName, \"t_before\");\n\t}\n\tstatus.fragmentStack.pop();\n\n\tbuildAddFragment(node, status, b, parentName, \"t_before\");\n\n\tb.append(`});`);\n}\n","/**\n * Trims a char from the end of the supplied text\n *\n * @param text The text to trim\n * @param char The char to remove from the end of the text\n *\n * @returns The text without the char on the end\n */\nexport default function trimEnd(text: string, char: string): string {\n\tlet end = text.length;\n\twhile (text[end - 1] === char) {\n\t\tend -= 1;\n\t}\n\treturn text.substring(0, end);\n}\n","import { type ControlNode } from \"../../types/nodes/ControlNode\";\nimport isControlNode from \"../../types/nodes/isControlNode\";\nimport Builder from \"../../utils/Builder\";\nimport trimEnd from \"../../utils/trimEnd\";\nimport trimMatched from \"../../utils/trimMatched\";\nimport nextVarName from \"../utils/nextVarName\";\nimport { type BuildStatus } from \"./BuildStatus\";\nimport buildAddFragment from \"./buildAddFragment\";\nimport buildFragment from \"./buildFragment\";\nimport buildNode from \"./buildNode\";\n\nconst forLoopRegex = /for\\s*\\((.+?);.*?;.*?\\)/;\nconst forLoopVarsRegex = /(?:let\\s+|var\\s+){0,1}([^\\s,;+=]+)(?:\\s*=\\s*[^,;]+){0,1}/g;\nconst forOfRegex = /for\\s*\\(\\s*(?:let\\s*|var\\s*){0,1}(.+?)\\s+(?:of|in).*?\\)/;\n\nexport default function buildForNode(node: ControlNode, status: BuildStatus, b: Builder): void {\n\tconst forParentName = node.parentName!;\n\tconst forAnchorName = node.varName!;\n\n\t// HACK:\n\tnode = node.children[0] as ControlNode;\n\n\t// HACK: Need to wrangle the declaration(s) out of the for loop and put them in data\n\t// TODO: Handle destructuring, quotes, comments etc\n\tconst forVarNames: string[] = [];\n\tconst forIndexMatch = node.statement.match(forLoopRegex);\n\tif (forIndexMatch) {\n\t\tconst forVarMatches = forIndexMatch[1].matchAll(forLoopVarsRegex);\n\t\tfor (let match of forVarMatches) {\n\t\t\tforVarNames.push(match[1]);\n\t\t}\n\t} else {\n\t\tconst forOfMatch = node.statement.match(forOfRegex);\n\t\tif (forOfMatch) {\n\t\t\tconst match = forOfMatch[1];\n\t\t\tif (\n\t\t\t\t(match.startsWith(\"{\") && match.endsWith(\"}\")) ||\n\t\t\t\t(match.startsWith(\"[\") && match.endsWith(\"]\"))\n\t\t\t) {\n\t\t\t\tforVarNames.push(\n\t\t\t\t\t...trimMatched(trimMatched(match, \"{\", \"}\"), \"[\", \"]\")\n\t\t\t\t\t\t.split(\",\")\n\t\t\t\t\t\t.map((m) => m.trim()),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tforVarNames.push(match);\n\t\t\t}\n\t\t}\n\t}\n\n\tconst forRangeName = nextVarName(\"for_range\", status);\n\n\t// Get the key node if it's been set\n\tconst key = node.children.find(\n\t\t(n) => n.type === \"control\" && (n as ControlNode).operation === \"@key\",\n\t);\n\tlet keyStatement = key ? (key as ControlNode).statement : \"\";\n\tif (keyStatement) {\n\t\tkeyStatement = trimEnd(keyStatement.substring(keyStatement.indexOf(\"=\") + 1).trim(), \";\");\n\t}\n\n\tstatus.imports.add(\"t_range\");\n\tstatus.imports.add(\"t_run_list\");\n\tstatus.imports.add(\"t_list_item\");\n\tstatus.imports.add(\"ListItem\");\n\n\tb.append(\"\");\n\tb.append(`\n\t/* @for */\n\tlet ${forRangeName} = t_range();\n\tt_run_list(\n\t${forRangeName},\n\t${forParentName},\n\t${forAnchorName},\n\tfunction createNewItems() {\n\t\tlet t_new_items: ListItem[] = [];\n\t\t${node.statement} {\n\t\t\tt_new_items.push(t_list_item({ ${forVarNames.join(\",\\n\")} }${keyStatement ? `, ${keyStatement}` : \"\"}));\n\t\t\t/*t_new_items.push({\n\t\t\t\t${keyStatement ? `key: ${keyStatement},` : \";\"}\n\t\t\t\tdata: { ${forVarNames.join(\",\\n\")} }\n\t\t\t});*/\n\t\t}\n\t\treturn t_new_items;\n\t},\n\tfunction createListItem(t_item, t_before) {`);\n\n\tstatus.forVarNames = forVarNames;\n\tbuildForItem(node, status, b, forParentName);\n\tstatus.forVarNames = [];\n\n\tb.append(`}`);\n\tb.append(`);`);\n\tb.append(\"\");\n}\n\nfunction buildForItem(node: ControlNode, status: BuildStatus, b: Builder, parentName: string) {\n\tconst oldRangeName = nextVarName(\"old_range\", status);\n\n\tstatus.imports.add(\"t_push_range\");\n\tb.append(`let ${oldRangeName} = t_push_range(t_item, true);`);\n\n\tbuildFragment(node, status, b, parentName, \"t_before\");\n\n\tstatus.fragmentStack.push({\n\t\tfragment: node.fragment!,\n\t\tpath: \"\",\n\t});\n\tfor (let child of node.children) {\n\t\tif (isControlNode(child) && child.operation === \"@key\") {\n\t\t\tcontinue;\n\t\t}\n\t\tbuildNode(child, status, b, parentName, \"t_before\");\n\t}\n\tstatus.fragmentStack.pop();\n\n\tbuildAddFragment(node, status, b, parentName, \"t_before\");\n\n\t// If we wanted to return the fragment instead:\n\t//b.append(`t_item.startNode = t_fragment_1.firstChild;`);\n\t//b.append(`t_item.endNode = t_fragment_1.lastChild;`);\n\t//for (let ev of node.fragment!.events) {\n\t// b.append(`${ev.varName}.addEventListener(\"${ev.eventName}\", ${ev.handler});`);\n\t//}\n\n\tstatus.imports.add(\"t_pop_range\");\n\tb.append(`t_pop_range(${oldRangeName});`);\n\n\t// If we wanted to return the fragment instead:\n\t//b.append(`return t_fragment_${node.fragment!.number};`);\n}\n","import { type ControlNode } from \"../../types/nodes/ControlNode\";\nimport Builder from \"../../utils/Builder\";\nimport nextVarName from \"../utils/nextVarName\";\nimport { type BuildStatus } from \"./BuildStatus\";\nimport buildAddFragment from \"./buildAddFragment\";\n\nexport default function buildHtmlNode(node: ControlNode, status: BuildStatus, b: Builder): void {\n\tconst htmlAnchorName = node.varName!;\n\tconst htmlParentName = node.parentName || htmlAnchorName + \".parentNode\";\n\tconst htmlRangeName = nextVarName(\"html_range\", status);\n\n\t// HACK: I'm not actually sure we need this here (or in @replace, where I copied it from)\n\tnode = node.children[0] as ControlNode;\n\n\tstatus.imports.add(\"t_range\");\n\tstatus.imports.add(\"t_run_control\");\n\n\tb.append(\"\");\n\tb.append(`\n\t/* @html */\n\tconst ${htmlRangeName} = t_range();\n\tt_run_control(${htmlRangeName}, ${htmlAnchorName}, (t_before) => {`);\n\n\tbuildHtmlBranch(node, status, b, htmlParentName, htmlRangeName);\n\n\tb.append(\"});\");\n\tb.append(\"\");\n}\n\nfunction buildHtmlBranch(\n\tnode: ControlNode,\n\tstatus: BuildStatus,\n\tb: Builder,\n\tparentName: string,\n\trangeName: string,\n) {\n\tstatus.imports.add(\"t_run_branch\");\n\n\tb.append(`${node.statement};`);\n\tb.append(`t_run_branch(${rangeName}, -1, () => {`);\n\n\tconst templateName = nextVarName(\"template\", status);\n\tconst fragmentName = `t_fragment_${node.fragment!.number}`;\n\tb.append(`const ${templateName} = document.createElement(\"template\");`);\n\tb.append(`${templateName}.innerHTML = ${node.statement};`);\n\tb.append(`let ${fragmentName} = ${templateName}.content.cloneNode(true) as DocumentFragment;`);\n\n\tbuildAddFragment(node, status, b, parentName, \"t_before\");\n\n\tb.append(`});`);\n}\n","import { type ControlNode } from \"../../types/nodes/ControlNode\";\nimport isControlNode from \"../../types/nodes/isControlNode\";\nimport Builder from \"../../utils/Builder\";\nimport nextVarName from \"../utils/nextVarName\";\nimport { type BuildStatus } from \"./BuildStatus\";\nimport buildAddFragment from \"./buildAddFragment\";\nimport buildFragment from \"./buildFragment\";\nimport buildNode from \"./buildNode\";\n\n// TODO: Are there too many branches for ifs etc?\n\nexport default function buildIfNode(node: ControlNode, status: BuildStatus, b: Builder): void {\n\tconst ifAnchorName = node.varName!;\n\tconst ifParentName = node.parentName || ifAnchorName + \".parentNode\";\n\tconst ifRangeName = nextVarName(\"if_range\", status);\n\n\t// Filter non-control branches (spaces)\n\tconst branches = node.children.filter((n) => isControlNode(n)) as ControlNode[];\n\n\t// Add an else branch if there isn't one, so that the content will be cleared if no branches match\n\tif (branches.findIndex((n) => n.operation === \"@else\") === -1) {\n\t\tconst elseBranch: ControlNode = {\n\t\t\ttype: \"control\",\n\t\t\toperation: \"@else\",\n\t\t\tstatement: \"else\",\n\t\t\tchildren: [],\n\t\t};\n\t\tbranches.push(elseBranch);\n\t}\n\n\tstatus.imports.add(\"t_range\");\n\tstatus.imports.add(\"t_run_control\");\n\n\tb.append(\"\");\n\tb.append(`\n\t/* @if */\n\tconst ${ifRangeName} = t_range();\n\tt_run_control(${ifRangeName}, ${ifAnchorName}, (t_before) => {`);\n\n\tfor (let [i, branch] of branches.entries()) {\n\t\tbuildIfBranch(branch, status, b, ifParentName, ifRangeName, i);\n\t}\n\n\tb.append(\"});\");\n\tb.append(\"\");\n}\n\nfunction buildIfBranch(\n\tnode: ControlNode,\n\tstatus: BuildStatus,\n\tb: Builder,\n\tparentName: string,\n\trangeName: string,\n\tindex: number,\n) {\n\tstatus.imports.add(\"t_run_branch\");\n\n\tb.append(`${node.statement} {`);\n\tb.append(`t_run_branch(${rangeName}, ${index}, () => {`);\n\n\tbuildFragment(node, status, b, parentName, \"t_before\");\n\n\tstatus.fragmentStack.push({\n\t\tfragment: node.fragment,\n\t\tpath: \"\",\n\t});\n\tfor (let child of node.children) {\n\t\tbuildNode(child, status, b, parentName, \"t_before\");\n\t}\n\tstatus.fragmentStack.pop();\n\n\tbuildAddFragment(node, status, b, parentName, \"t_before\");\n\n\tb.append(`});`);\n\tb.append(`}`);\n}\n","import { type ControlNode } from \"../../types/nodes/ControlNode\";\nimport Builder from \"../../utils/Builder\";\nimport nextVarName from \"../utils/nextVarName\";\nimport { type BuildStatus } from \"./BuildStatus\";\nimport buildAddFragment from \"./buildAddFragment\";\nimport buildFragment from \"./buildFragment\";\nimport buildNode from \"./buildNode\";\n\nexport default function buildReplaceNode(node: ControlNode, status: BuildStatus, b: Builder): void {\n\tconst replaceAnchorName = node.varName!;\n\tconst replaceParentName = node.parentName || replaceAnchorName + \".parentNode\";\n\tconst replaceRangeName = nextVarName(\"replace_range\", status);\n\n\t// HACK:\n\tnode = node.children[0] as ControlNode;\n\n\tstatus.imports.add(\"t_range\");\n\tstatus.imports.add(\"t_run_control\");\n\n\tb.append(\"\");\n\tb.append(`\n\t/* @replace */\n\tconst ${replaceRangeName} = t_range();\n\tt_run_control(${replaceRangeName}, ${replaceAnchorName}, (t_before) => {`);\n\n\tbuildReplaceBranch(node, status, b, replaceParentName, replaceRangeName);\n\n\tb.append(\"});\");\n\tb.append(\"\");\n}\n\nfunction buildReplaceBranch(\n\tnode: ControlNode,\n\tstatus: BuildStatus,\n\tb: Builder,\n\tparentName: string,\n\trangeName: string,\n) {\n\tstatus.imports.add(\"t_run_branch\");\n\n\tb.append(`${node.statement};`);\n\tb.append(`t_run_branch(${rangeName}, -1, () => {`);\n\n\tbuildFragment(node, status, b, parentName, \"t_before\");\n\n\tstatus.fragmentStack.push({\n\t\tfragment: node.fragment,\n\t\tpath: \"\",\n\t});\n\tfor (let child of node.children) {\n\t\tbuildNode(child, status, b, parentName, \"t_before\");\n\t}\n\tstatus.fragmentStack.pop();\n\n\tbuildAddFragment(node, status, b, parentName, \"t_before\");\n\n\tb.append(`});`);\n}\n","import { type ControlNode } from \"../../types/nodes/ControlNode\";\nimport Builder from \"../../utils/Builder\";\n\nexport default function buildScriptNode(node: ControlNode, b: Builder): void {\n\tb.append(`/* ${node.operation} */`);\n\tb.append(`${maybeAppend(node.statement, \";\")}`);\n}\n\nfunction maybeAppend(text: string, end: string) {\n\tif (!text.endsWith(end)) {\n\t\ttext += end;\n\t}\n\treturn text;\n}\n","import { type ControlNode } from \"../../types/nodes/ControlNode\";\nimport isControlNode from \"../../types/nodes/isControlNode\";\nimport Builder from \"../../utils/Builder\";\nimport nextVarName from \"../utils/nextVarName\";\nimport { type BuildStatus } from \"./BuildStatus\";\nimport buildAddFragment from \"./buildAddFragment\";\nimport buildFragment from \"./buildFragment\";\nimport buildNode from \"./buildNode\";\n\nexport default function buildSwitchNode(node: ControlNode, status: BuildStatus, b: Builder): void {\n\tconst switchParentName = node.parentName!;\n\tconst switchAnchorName = node.varName!;\n\tconst switchRangeName = nextVarName(\"switch_range\", status);\n\n\t// Filter non-control branches (spaces)\n\tconst branches = node.children.filter((n) => isControlNode(n)) as ControlNode[];\n\n\t// Add a default branch if there isn't one, so that the content will be cleared if no branches match\n\tif (branches.findIndex((n) => n.operation === \"@default\") === -1) {\n\t\tconst defaultBranch: ControlNode = {\n\t\t\ttype: \"control\",\n\t\t\toperation: \"@default\",\n\t\t\tstatement: \"default\",\n\t\t\tchildren: [],\n\t\t};\n\t\tbranches.push(defaultBranch);\n\t}\n\n\tstatus.imports.add(\"t_range\");\n\tstatus.imports.add(\"t_run_control\");\n\n\tb.append(\"\");\n\tb.append(`\n\t/* @switch */\n\tconst ${switchRangeName} = t_range();\n\tt_run_control(${switchRangeName}, ${switchAnchorName}, (t_before) => {\n\t\t${node.statement} {`);\n\n\tfor (let [i, branch] of branches.entries()) {\n\t\tbuildSwitchBranch(branch as ControlNode, status, b, switchParentName, switchRangeName, i);\n\t}\n\n\tb.append(`}\n\t});`);\n\tb.append(\"\");\n}\n\nfunction buildSwitchBranch(\n\tnode: ControlNode,\n\tstatus: BuildStatus,\n\tb: Builder,\n\tparentName: string,\n\trangeName: string,\n\tindex: number,\n) {\n\tstatus.imports.add(\"t_run_branch\");\n\n\tb.append(`${node.statement} {`);\n\tb.append(`t_run_branch(${rangeName}, ${index}, () => {`);\n\n\tbuildFragment(node, status, b, parentName, \"t_before\");\n\n\tstatus.fragmentStack.push({\n\t\tfragment: node.fragment,\n\t\tpath: \"\",\n\t});\n\tfor (let child of node.children) {\n\t\tbuildNode(child, status, b, parentName, \"t_before\");\n\t}\n\tstatus.fragmentStack.pop();\n\n\tbuildAddFragment(node, status, b, parentName, \"t_before\");\n\n\tb.append(`});`);\n\tb.append(`break;`);\n\tb.append(`}`);\n}\n","import { type ControlNode } from \"../../types/nodes/ControlNode\";\nimport Builder from \"../../utils/Builder\";\nimport { type BuildStatus } from \"./BuildStatus\";\nimport buildAwaitNode from \"./buildAwaitNode\";\nimport buildForNode from \"./buildForNode\";\nimport buildHtmlNode from \"./buildHtmlNode\";\nimport buildIfNode from \"./buildIfNode\";\nimport buildReplaceNode from \"./buildReplaceNode\";\nimport buildScriptNode from \"./buildScriptNode\";\nimport buildSwitchNode from \"./buildSwitchNode\";\n\nexport default function buildControlNode(node: ControlNode, status: BuildStatus, b: Builder): void {\n\tswitch (node.operation) {\n\t\tcase \"@if group\": {\n\t\t\tbuildIfNode(node, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@if\":\n\t\tcase \"@else if\":\n\t\tcase \"@else\": {\n\t\t\t// These get handled with @if group, above\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@switch group\": {\n\t\t\tbuildSwitchNode(node, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@case\":\n\t\tcase \"@default\": {\n\t\t\t// These get handled with @switch, above\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@for group\": {\n\t\t\tbuildForNode(node, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@for\":\n\t\tcase \"@key\": {\n\t\t\t// These get handled with @for, above\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@await group\": {\n\t\t\tbuildAwaitNode(node, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@await\":\n\t\tcase \"@then\":\n\t\tcase \"@catch\": {\n\t\t\t// These get handled with @await group, above\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@replace group\": {\n\t\t\tbuildReplaceNode(node, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@replace\": {\n\t\t\t// This gets handled with @replace group, above\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@html group\": {\n\t\t\tbuildHtmlNode(node, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@html\": {\n\t\t\t// This gets handled with @html group, above\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@const\":\n\t\tcase \"@console\":\n\t\tcase \"@debugger\": {\n\t\t\tbuildScriptNode(node, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@function\": {\n\t\t\tb.append(\"\");\n\t\t\tbuildScriptNode(node, b);\n\t\t\tb.append(\"\");\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\tthrow new Error(`Invalid operation: ${node.operation}`);\n\t\t}\n\t}\n}\n","import Builder from \"../../utils/Builder\";\nimport { type BuildStatus } from \"./BuildStatus\";\nimport replaceForVarNames from \"./replaceForVarNames\";\n\nexport default function buildMount(\n\tfunctionName: string,\n\tfunctionBody: string,\n\tstatus: BuildStatus,\n\tb: Builder,\n): void {\n\tfunctionBody = replaceForVarNames(functionBody, status);\n\n\tstatus.imports.add(\"$mount\");\n\tb.append(`$mount(function ${functionName}() {`);\n\tb.append(functionBody);\n\tb.append(\"});\");\n}\n","import { type ElementNode } from \"../../types/nodes/ElementNode\";\nimport { type TextNode } from \"../../types/nodes/TextNode\";\nimport Builder from \"../../utils/Builder\";\nimport trimEnd from \"../../utils/trimEnd\";\nimport trimMatched from \"../../utils/trimMatched\";\nimport trimQuotes from \"../../utils/trimQuotes\";\nimport isFullyReactive from \"../utils/isFullyReactive\";\nimport isReactive from \"../utils/isReactive\";\nimport nextVarName from \"../utils/nextVarName\";\nimport { type BuildStatus } from \"./BuildStatus\";\nimport buildAddFragment from \"./buildAddFragment\";\nimport buildFragment from \"./buildFragment\";\nimport buildMount from \"./buildMount\";\nimport buildNode from \"./buildNode\";\nimport buildRun from \"./buildRun\";\nimport replaceForVarNames from \"./replaceForVarNames\";\n\nexport default function buildElementNode(\n\tnode: ElementNode,\n\tstatus: BuildStatus,\n\tb: Builder,\n\tparentName: string,\n\troot = false,\n): void {\n\tif (status.inHead) {\n\t\tif (node.tagName === \"title\") {\n\t\t\tbuildTitleNode(node, status, b);\n\t\t\treturn;\n\t\t} else {\n\t\t\tbuildHeadNode(node, status, b);\n\t\t\treturn;\n\t\t}\n\t}\n\n\tconst varName = node.varName;\n\tif (varName) {\n\t\tif (node.tagName === \":element\") {\n\t\t\tbuildDynamicElementNode(node, status, b);\n\t\t}\n\n\t\t// PERF: Does this have much of an impact??\n\t\tif (root) {\n\t\t\t//status.imports.add(\"t_apply_props\");\n\t\t\t//// TODO: I think we know what the props are at this stage, so we could be more direct?\n\t\t\t//b.append(\"\");\n\t\t\t//b.append(\n\t\t\t//\t`t_apply_props(${varName}, $props, [${status.props.map((p) => `'${p}'`).join(\", \")}]);`,\n\t\t\t//);\n\t\t}\n\n\t\tbuildElementAttributes(node, varName, status, b);\n\t}\n\n\tconst oldPreserveWhitespace = status.preserveWhitespace;\n\tstatus.preserveWhitespace = [\"code\", \"pre\"].includes(node.tagName);\n\tfor (let child of node.children) {\n\t\tbuildNode(child, status, b, parentName, \"null\");\n\t}\n\tstatus.preserveWhitespace = oldPreserveWhitespace;\n}\n\nfunction buildDynamicElementNode(node: ElementNode, status: BuildStatus, b: Builder) {\n\tlet selfAttribute = node.attributes.find((a) => a.name === \"self\");\n\tif (selfAttribute && selfAttribute.value) {\n\t\tstatus.imports.add(\"$run\");\n\t\tstatus.imports.add(\"t_dynamic\");\n\t\tlet selfValue = trimMatched(selfAttribute.value, \"{\", \"}\");\n\t\tb.append(`$run(function setDynamic() {`);\n\t\tb.append(`${node.varName} = t_dynamic(${node.varName}, ${selfValue});`);\n\n\t\tlet parentName = node.varName;\n\n\t\tbuildFragment(node, status, b, parentName!, \"null\");\n\n\t\tstatus.fragmentStack.push({\n\t\t\tfragment: node.fragment,\n\t\t\tpath: \"\",\n\t\t});\n\t\tfor (let child of node.children) {\n\t\t\tbuildNode(child, status, b, parentName!, \"null\");\n\t\t}\n\t\tstatus.fragmentStack.pop();\n\n\t\tbuildAddFragment(node, status, b, parentName!, \"null\");\n\n\t\tb.append(`});`);\n\t}\n}\n\nfunction buildTitleNode(node: ElementNode, status: BuildStatus, b: Builder) {\n\tlet content = (node.children[0] as TextNode).content || \"\";\n\n\t// Replace all spaces with a single space, both to save space and to remove\n\t// newlines from generated JS strings\n\tcontent = content.replace(/\\s+/g, \" \");\n\n\t// TODO: Should be fancier about this in parse -- e.g. ignore braces in\n\t// quotes, unclosed, etc\n\tlet reactiveStarted = false;\n\tlet reactiveCount = 0;\n\tfor (let i = 0; i < content.length; i++) {\n\t\tif (content[i] === \"{\") {\n\t\t\treactiveStarted = true;\n\t\t} else if (content[i] === \"}\") {\n\t\t\tif (reactiveStarted) {\n\t\t\t\treactiveCount += 1;\n\t\t\t\treactiveStarted = false;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (reactiveCount) {\n\t\tstatus.imports.add(\"t_fmt\");\n\t\tif (reactiveCount === 1 && content.startsWith(\"{\") && content.endsWith(\"}\")) {\n\t\t\tcontent = `t_fmt(${content.substring(1, content.length - 1)})`;\n\t\t} else {\n\t\t\tcontent = `\\`${content.replaceAll(\"{\", \"${t_fmt(\").replaceAll(\"}\", \")}\")}\\``;\n\t\t}\n\t} else {\n\t\tcontent = `\"${content}\"`;\n\t}\n\n\tstatus.imports.add(\"$run\");\n\tb.append(`\n\t\t$run(function runTitle() {\n\t\t\tconst t_old_title = document.title;\n\t\t\tdocument.title = ${content};\n\t\t\treturn () => document.title = t_old_title;\n\t\t});`);\n}\n\nfunction buildHeadNode(node: ElementNode, status: BuildStatus, b: Builder) {\n\tstatus.imports.add(\"$run\");\n\t// TODO: dedupe e.g. <meta name=\"x\"> or on special key\n\tb.append(`\n\t\t$run(function runHead() {\n\t\t\tconst t_head_el = document.createElement(\"${node.tagName}\");\n\t\t\tdocument.getElementsByTagName(\"head\")[0].appendChild(t_head_el);`);\n\tfor (let { name, value } of node.attributes) {\n\t\tif (name.startsWith(\"{\") && name.endsWith(\"}\")) {\n\t\t\t// It's a shortcut attribute\n\t\t\t// It could be e.g. {width} or it could be {$state.width}, but\n\t\t\t// in either case we set the value of the width property\n\t\t\tname = name.substring(1, name.length - 1);\n\t\t\tconst propName = name.split(\".\").at(-1);\n\t\t\tbuildRun(\"setAttribute\", `t_head_el.setAttribute(\"${propName}\", ${name});`, status, b);\n\t\t} else if (value != null && isReactive(value)) {\n\t\t\t// It's a reactive attribute\n\t\t\tif (isFullyReactive(value)) {\n\t\t\t\tvalue = value.substring(1, value.length - 1);\n\t\t\t} else {\n\t\t\t\tvalue = `\\`${trimQuotes(value).replaceAll(\"{\", \"${\")}\\``;\n\t\t\t}\n\n\t\t\tstatus.imports.add(\"t_attribute\");\n\t\t\tbuildRun(\"setAttribute\", `t_attribute(t_head_el, \"${name}\", ${value});`, status, b);\n\t\t} else if (value != null) {\n\t\t\tstatus.imports.add(\"t_attribute\");\n\t\t\tb.append(`t_attribute(t_head_el, \"${name}\", ${value});`);\n\t\t}\n\t}\n\tb.append(`\n\t\t\treturn () => alert(\"YO\");\n\t\t});`);\n}\n\nfunction buildElementAttributes(\n\tnode: ElementNode,\n\tvarName: string,\n\tstatus: BuildStatus,\n\tb: Builder,\n) {\n\t// TODO: Flatten this out\n\t// TODO: Add an error if any reactive attributes are used non-reactively\n\n\t// Do &ref first, just in case any other attributes depend on it being set\n\t// e.g. if you have a `style` attribute that depends on the element's size\n\tconst refAttribute = node.attributes.find((a) => a.name === \"&ref\");\n\tif (refAttribute) {\n\t\tlet value = refAttribute.value;\n\t\tif (value != null && isFullyReactive(value)) {\n\t\t\t// Bind the DOM element to a user-defined variable\n\t\t\tvalue = value.substring(1, value.length - 1);\n\t\t\tb.append(`${value} = ${varName};`);\n\t\t}\n\t}\n\n\tfor (let { name, value } of node.attributes) {\n\t\tif (name === \"self\" && node.tagName === \":element\") {\n\t\t\t// Ignore this special attribute\n\t\t} else if (name === \"&ref\") {\n\t\t\t// Ignore this one, it should have been done already, above\n\t\t} else if (name.startsWith(\"{\") && name.endsWith(\"}\")) {\n\t\t\t// It's a shortcut attribute\n\t\t\t// It could be e.g. {width} or it could be {$state.width}, but\n\t\t\t// in either case we set the value of the width property\n\t\t\tname = name.substring(1, name.length - 1);\n\t\t\tconst propName = name.split(\".\").at(-1);\n\t\t\tbuildRun(\"setAttribute\", `${varName}.setAttribute(\"${propName}\", ${name});`, status, b);\n\t\t} else if (value != null && isReactive(value)) {\n\t\t\t// It's a reactive attribute\n\t\t\tif (isFullyReactive(value)) {\n\t\t\t\tvalue = value.substring(1, value.length - 1);\n\t\t\t} else {\n\t\t\t\tvalue = `\\`${trimQuotes(value).replaceAll(\"{\", \"${\")}\\``;\n\t\t\t}\n\n\t\t\tif (name === \"&group\") {\n\t\t\t\tbuildBindGroupAttribute(node, varName, value, status, b);\n\t\t\t} else if (name === \"&value\" || name === \"&checked\") {\n\t\t\t\tbuildBindAttribute(node, varName, name, value, status, b);\n\t\t\t} else if (name === \":onmount\") {\n\t\t\t\t// The :onmount event is faked by us by creating a $mount. This\n\t\t\t\t// also means that you can have unmount functionality by\n\t\t\t\t// returning a cleanup function\n\t\t\t\tbuildMount(\"elMount\", `return (${trimEnd(value.trim(), \";\")})(${varName});`, status, b);\n\t\t\t} else if (name.startsWith(\"on\")) {\n\t\t\t\tbuildEventAttribute(varName, name, value, status, b);\n\t\t\t} else if (name.startsWith(\":transition\")) {\n\t\t\t\tbuildTransitionAttribute(node, varName, name, value, status, b);\n\t\t\t} else if (name === \"class\") {\n\t\t\t\tif (node.scopeStyles) {\n\t\t\t\t\tvalue += `+ \"torp-${status.styleHash}\"`;\n\t\t\t\t}\n\t\t\t\tbuildRun(\"setClassName\", `${varName}.className = ${value};`, status, b);\n\t\t\t} else if (name === \":class\") {\n\t\t\t\tstatus.imports.add(\"t_class\");\n\t\t\t\tif (node.scopeStyles) {\n\t\t\t\t\tvalue += `, \"torp-${status.styleHash}\"`;\n\t\t\t\t}\n\t\t\t\tbuildRun(\"setClasses\", `${varName}.className = t_class(${value});`, status, b);\n\t\t\t} else if (name === \":style\") {\n\t\t\t\tstatus.imports.add(\"t_style\");\n\t\t\t\tbuildRun(\"setStyles\", `${varName}.setAttribute(\"style\", t_style(${value}));`, status, b);\n\t\t\t} else if (name.includes(\"-\")) {\n\t\t\t\t// Handle data-, aria- etc\n\t\t\t\tstatus.imports.add(\"t_attribute\");\n\t\t\t\tbuildRun(\"setDataAttribute\", `t_attribute(${varName}, \"${name}\", ${value});`, status, b);\n\t\t\t\t// NOTE: dataset seems to be a tiny bit slower?\n\t\t\t\t//const propName = name.substring(name.indexOf(\"-\"));\n\t\t\t\t//buildRun(\"setDataAttribute\", `${varName}.dataset.${propName} = ${value};`, status, b);\n\t\t\t} else {\n\t\t\t\tstatus.imports.add(\"t_attribute\");\n\t\t\t\tbuildRun(\"setAttribute\", `t_attribute(${varName}, \"${name}\", ${value});`, status, b);\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction buildBindGroupAttribute(\n\tnode: ElementNode,\n\tvarName: string,\n\tvalue: string,\n\tstatus: BuildStatus,\n\tb: Builder,\n) {\n\tvalue = replaceForVarNames(value, status);\n\n\t// Automatically add an event to bind the value\n\t// TODO: Only tested this with radio buttons\n\tlet eventName = \"change\";\n\tlet inputValue = node.attributes.find((a) => a.name === \"value\")?.value;\n\tlet set = `${value} == ${inputValue}`;\n\tlet propName = \"checked\";\n\tconst setAttribute = `${varName}.${propName} = ${set}`;\n\tbuildRun(\"setBinding\", `${setAttribute};`, status, b);\n\t// TODO: Add a parseInput method that handles NaN etc\n\tstatus.imports.add(\"t_event\");\n\tb.append(`t_event(${varName}, \"${eventName}\", (e) => {\n\t\t\tif (e.target.${propName}) ${value} = ${inputValue};\n\t\t});`);\n}\n\nfunction buildBindAttribute(\n\tnode: ElementNode,\n\tvarName: string,\n\tname: string,\n\tvalue: string,\n\tstatus: BuildStatus,\n\tb: Builder,\n) {\n\tvalue = replaceForVarNames(value, status);\n\n\t// Automatically add an event to bind the value\n\t// TODO: Need to check the element to find out what type of event to add\n\tlet eventName = \"input\";\n\tlet defaultValue = '\"\"';\n\tlet inputValue = \"e.target.value\";\n\tif (node.tagName === \"input\") {\n\t\tlet typeAttribute = node.attributes.find((a) => a.name === \"type\");\n\t\tif (typeAttribute && typeAttribute.value) {\n\t\t\tswitch (trimQuotes(typeAttribute.value)) {\n\t\t\t\tcase \"number\": {\n\t\t\t\t\tdefaultValue = \"0\";\n\t\t\t\t\tinputValue = \"Number(e.target.value)\";\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"checkbox\": {\n\t\t\t\t\tdefaultValue = \"false\";\n\t\t\t\t\tinputValue = \"e.target.checked\";\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"radio\": {\n\t\t\t\t\teventName = \"change\";\n\t\t\t\t\tinputValue = \"e.target.value\";\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else if (node.tagName === \"select\") {\n\t\teventName = \"change\";\n\t}\n\tlet set = `${value} || ${defaultValue}`;\n\tconst propName = name.substring(1);\n\tconst setAttribute = `${varName}.${propName} = ${set}`;\n\tbuildRun(\"setBinding\", `${setAttribute};`, status, b);\n\t// TODO: Add a parseInput method that handles NaN etc\n\tstatus.imports.add(\"t_event\");\n\tb.append(`t_event(${varName}, \"${eventName}\", (e) => ${value} = ${inputValue});`);\n}\n\nfunction buildEventAttribute(\n\tvarName: string,\n\tname: string,\n\tvalue: string,\n\tstatus: BuildStatus,\n\tb: Builder,\n) {\n\tvalue = replaceForVarNames(value, status);\n\n\t// Add an event listener, after the fragment has been added\n\tconst eventName = name.substring(2);\n\tstatus.imports.add(\"t_event\");\n\tb.append(`t_event(${varName}, \"${eventName}\", ${value});`);\n}\n\nfunction buildTransitionAttribute(\n\tnode: ElementNode,\n\tvarName: string,\n\tname: string,\n\tvalue: string,\n\tstatus: BuildStatus,\n\tb: Builder,\n) {\n\tvalue = replaceForVarNames(value, status);\n\n\tstatus.imports.add(\"t_animate\");\n\n\t// Add an in and out transition, after the fragment has been added\n\t// TODO: Separate these -- you should be able to have multiple,\n\t// unrelated entry and exit transitions?\n\tlet entryVarName = nextVarName(\"trans_in\", status);\n\tlet exitVarName = nextVarName(\"trans_out\", status);\n\n\tif (name === \":transition\") {\n\t\tb.append(`const ${entryVarName} = ${getAnimationDetails(value)};`);\n\t\tb.append(`const ${exitVarName} = ${entryVarName};`);\n\t\tb.append(`t_animate(${varName}, ${entryVarName}, ${exitVarName});`);\n\t} else if (name === \":transition-in\") {\n\t\tlet outAttribute = node.attributes.find((a) => a.name === \":transition-out\");\n\t\tif (outAttribute && outAttribute.value) {\n\t\t\tlet outValue = trimMatched(outAttribute.value, \"{\", \"}\");\n\t\t\tb.append(`const ${entryVarName} = ${getAnimationDetails(value)};`);\n\t\t\tb.append(`const ${exitVarName} = ${getAnimationDetails(outValue)};`);\n\t\t\tb.append(`t_animate(${varName}, ${entryVarName}, ${exitVarName});`);\n\t\t} else {\n\t\t\tb.append(`const ${entryVarName} = ${getAnimationDetails(value)};`);\n\t\t\tb.append(`t_animate(${varName}, ${entryVarName});`);\n\t\t}\n\t} else if (name === \":transition-out\") {\n\t\tlet inAttribute = node.attributes.find((a) => a.name === \":transition-in\");\n\t\tif (inAttribute) {\n\t\t\t// This has already been handled with :transition-in, above\n\t\t\treturn;\n\t\t} else {\n\t\t\tb.append(`const ${exitVarName} = ${getAnimationDetails(value)};`);\n\t\t\tb.append(`t_animate(${varName}, null, ${entryVarName});`);\n\t\t}\n\t} else {\n\t\t// TODO: Add an error\n\t}\n}\n\nfunction getAnimationDetails(value: string) {\n\t// HACK: Split by commas, but not when in brackets\n\tlet parts: string[] = [];\n\tlet start = 0;\n\tlet squareCount = 0;\n\tlet curlyCount = 0;\n\tfor (let i = 0; i < value.length; i++) {\n\t\tlet char = value[i];\n\t\tswitch (char) {\n\t\t\tcase \",\":\n\t\t\t\tif (squareCount === 0 && curlyCount === 0) {\n\t\t\t\t\tparts.push(value.substring(start, i));\n\t\t\t\t\tstart = i + 1;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"[\":\n\t\t\t\tsquareCount += 1;\n\t\t\t\tbreak;\n\t\t\tcase \"]\":\n\t\t\t\tsquareCount -= 1;\n\t\t\t\tbreak;\n\t\t\tcase \"{\":\n\t\t\t\tcurlyCount += 1;\n\t\t\t\tbreak;\n\t\t\tcase \"}\":\n\t\t\t\tcurlyCount -= 1;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\tparts.push(value.substring(start));\n\n\t//let func = parts[0].trim();\n\t//let isAnimateFunction = func === \"animate\";\n\t//let options = isAnimateFunction ? parts[2]?.trim() : parts[1]?.trim();\n\t//let keyframes = isAnimateFunction ? parts[1]?.trim() : undefined;\n\t//if (isAnimateFunction) {\n\t//\tstatus.imports.add(\"t_animate\");\n\t//\tfunc = \"t_animate\";\n\t//}\n\n\tlet keyframes = parts[0]?.trim();\n\tlet options = parts[1]?.trim();\n\n\treturn `{ ${[`keyframes: ${keyframes}`, options ? `options: ${options}` : null].filter(Boolean).join(\", \")} }`;\n}\n","import { type RootNode } from \"../../types/nodes/RootNode\";\nimport Builder from \"../../utils/Builder\";\nimport { type BuildStatus } from \"./BuildStatus\";\nimport buildAddFragment from \"./buildAddFragment\";\nimport buildFragment from \"./buildFragment\";\nimport buildNode from \"./buildNode\";\n\nexport default function buildRootNode(\n\tnode: RootNode,\n\tstatus: BuildStatus,\n\tb: Builder,\n\tparentName: string,\n\tanchorName: string,\n): void {\n\tbuildFragment(node, status, b, parentName, anchorName);\n\n\tstatus.fragmentStack.push({\n\t\tfragment: node.fragment,\n\t\tpath: \"0:ch/\",\n\t});\n\tbuildNode(node.children[0], status, b, parentName, anchorName, true);\n\tstatus.fragmentStack.pop();\n\n\tbuildAddFragment(node, status, b, parentName, anchorName);\n}\n","import { type ElementNode } from \"../../types/nodes/ElementNode\";\nimport Builder from \"../../utils/Builder\";\nimport { type BuildStatus } from \"./BuildStatus\";\nimport buildNode from \"./buildNode\";\n\nexport default function buildHeadNode(node: ElementNode, status: BuildStatus, b: Builder): void {\n\tb.append(\"\");\n\tb.append(\"/* @head */\");\n\n\tstatus.inHead = true;\n\tfor (let child of node.children) {\n\t\tbuildNode(child, status, b, \"undefined\", \"undefined\");\n\t}\n\tstatus.inHead = false;\n\n\tb.append(\"\");\n}\n","import { type ElementNode } from \"../../types/nodes/ElementNode\";\nimport isSpecialNode from \"../../types/nodes/isSpecialNode\";\nimport Builder from \"../../utils/Builder\";\nimport trimQuotes from \"../../utils/trimQuotes\";\nimport isFullyReactive from \"../utils/isFullyReactive\";\nimport isReactive from \"../utils/isReactive\";\nimport nextVarName from \"../utils/nextVarName\";\nimport { type BuildStatus } from \"./BuildStatus\";\nimport buildAddFragment from \"./buildAddFragment\";\nimport buildFragment from \"./buildFragment\";\nimport buildNode from \"./buildNode\";\nimport buildRun from \"./buildRun\";\n\nexport default function buildSlotNode(node: ElementNode, status: BuildStatus, b: Builder): void {\n\t// If there's a slot, build that, otherwise build the default nodes\n\tlet slotName = node.attributes.find((a) => a.name === \"name\")?.value;\n\tslotName = slotName ? trimQuotes(slotName) : \"_\";\n\n\t// Slot props\n\tconst propsName = nextVarName(\"sprops\", status);\n\tconst slotAttributes = node.attributes.filter((a) => a.name !== \"name\");\n\tconst slotHasProps = slotAttributes.length;\n\tif (slotHasProps) {\n\t\t// TODO: defaults etc props\n\t\tstatus.imports.add(\"$watch\");\n\t\tb.append(`const ${propsName} = $watch({});`);\n\t\tfor (let { name, value } of slotAttributes) {\n\t\t\tif (name.startsWith(\"{\") && name.endsWith(\"}\")) {\n\t\t\t\t// It's a shortcut attribute\n\t\t\t\t// It could be e.g. {width} or it could be {$state.width}, but\n\t\t\t\t// in either case we set the value of the width property\n\t\t\t\tname = name.substring(1, name.length - 1);\n\t\t\t\tconst propName = name.split(\".\").at(-1);\n\t\t\t\tbuildRun(\"setProp\", `${propsName}[\"${propName}\"] = ${name};`, status, b);\n\t\t\t} else if (value != null) {\n\t\t\t\tlet fullyReactive = isFullyReactive(value);\n\t\t\t\tlet partlyReactive = isReactive(value);\n\t\t\t\tif (fullyReactive) {\n\t\t\t\t\tvalue = value.substring(1, value.length - 1);\n\t\t\t\t} else if (partlyReactive) {\n\t\t\t\t\tvalue = `\\`${trimQuotes(value).replaceAll(\"{\", \"${\")}\\``;\n\t\t\t\t}\n\t\t\t\tconst setProp = `${propsName}[\"${name}\"] = ${value}`;\n\t\t\t\tif (fullyReactive || partlyReactive) {\n\t\t\t\t\tbuildRun(\"setProp\", `${setProp};`, status, b);\n\t\t\t\t} else {\n\t\t\t\t\tb.append(`${setProp};`);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tb.append(`${propsName}[\"${name}\"] = true;`);\n\t\t\t}\n\t\t}\n\t}\n\n\tconst slotParentName = node.parentName!;\n\tconst slotAnchorName = node.varName!;\n\n\tb.append(`if ($slots && $slots[\"${slotName}\"]) {`);\n\tlet params = [slotParentName, slotAnchorName, slotHasProps ? propsName : \"undefined\", \"$context\"];\n\tb.append(`$slots[\"${slotName}\"](${params.join(\", \")})`);\n\n\t// TODO: Maybe not if there's only a single space node?\n\tconst fill = node.children.find((c) => isSpecialNode(c) && c.tagName === \":fill\");\n\tif (fill && isSpecialNode(fill) && fill.children.length) {\n\t\tb.append(`} else {`);\n\n\t\tbuildFragment(fill, status, b, slotParentName, slotAnchorName);\n\n\t\tstatus.fragmentStack.push({\n\t\t\tfragment: fill.fragment,\n\t\t\tpath: \"0:ch/\",\n\t\t});\n\t\tfor (let child of fill.children) {\n\t\t\tbuildNode(child, status, b, slotParentName, slotAnchorName);\n\t\t}\n\t\tstatus.fragmentStack.pop();\n\n\t\tbuildAddFragment(fill, status, b, slotParentName, slotAnchorName);\n\t}\n\n\tb.append(`}`);\n}\n","import { type ElementNode } from \"../../types/nodes/ElementNode\";\nimport Builder from \"../../utils/Builder\";\nimport { type BuildStatus } from \"./BuildStatus\";\nimport buildComponentNode from \"./buildComponentNode\";\nimport buildElementNode from \"./buildElementNode\";\nimport buildHeadNode from \"./buildHeadNode\";\nimport buildSlotNode from \"./buildSlotNode\";\n\nexport default function buildSpecialNode(\n\tnode: ElementNode,\n\tstatus: BuildStatus,\n\tb: Builder,\n\tparentName: string,\n\troot = false,\n) {\n\tswitch (node.tagName) {\n\t\tcase \":slot\": {\n\t\t\tbuildSlotNode(node, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \":element\": {\n\t\t\tbuildElementNode(node, status, b, parentName, root);\n\t\t\tbreak;\n\t\t}\n\t\tcase \":component\": {\n\t\t\tbuildComponentNode(node, status, b, root);\n\t\t\tbreak;\n\t\t}\n\t\tcase \":head\": {\n\t\t\tbuildHeadNode(node, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \":fill\": {\n\t\t\t// HACK:\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\tthrow new Error(`Invalid special node: ${node.tagName}`);\n\t\t}\n\t}\n\treturn \"\";\n}\n","import { type TextNode } from \"../../types/nodes/TextNode\";\nimport Builder from \"../../utils/Builder\";\nimport { type BuildStatus } from \"./BuildStatus\";\nimport buildRun from \"./buildRun\";\n\nexport default function buildTextNode(node: TextNode, status: BuildStatus, b: Builder): void {\n\tlet content = node.content || \"\";\n\n\tif (!status.preserveWhitespace) {\n\t\t// Replace all spaces with a single space, both to save space and to remove\n\t\t// newlines from generated JS strings\n\t\tcontent = content.replaceAll(/\\s+/g, \" \");\n\t}\n\n\t// TODO: Move all of this logic into parse, for text nodes and attribute values\n\tlet textContent = \"\";\n\tlet reactiveCount = 0;\n\tlet level = 0;\n\tlet maxLevel = 0;\n\tfor (let i = 0; i < content.length; i++) {\n\t\tconst char = content[i];\n\t\tconst nextChar = content[i + 1];\n\t\tif (char === \"{\") {\n\t\t\tlevel++;\n\t\t\tmaxLevel = Math.max(level, maxLevel);\n\t\t\tif (level === 1) {\n\t\t\t\treactiveCount += 1;\n\t\t\t\ttextContent += \"${t_fmt(\";\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t} else if (char === \"}\") {\n\t\t\tlevel--;\n\t\t\tif (level === 0) {\n\t\t\t\ttextContent += \")\";\n\t\t\t}\n\t\t} else if (char === \"`\" && level === 0) {\n\t\t\t// Escape backticks outside of braces, as they will be within a backtick string\n\t\t\ttextContent += \"\\\\\";\n\t\t} else if (level > 0) {\n\t\t\tif (char === \"/\" && nextChar === \"/\") {\n\t\t\t\t// Skip one-line comments\n\t\t\t\tlet start = i;\n\t\t\t\ti = content.indexOf(\"\\n\", i);\n\t\t\t\ttextContent += content.substring(start, i + 1);\n\t\t\t\tcontinue;\n\t\t\t} else if (char === \"/\" && nextChar === \"*\") {\n\t\t\t\t// Skip block comments\n\t\t\t\tlet start = i;\n\t\t\t\ti = content.indexOf(\"*/\", i) + 1;\n\t\t\t\ttextContent += content.substring(start, i + 1);\n\t\t\t\tcontinue;\n\t\t\t} else if (char === '\"' || char === \"'\") {\n\t\t\t\t// Skip string contents\n\t\t\t\tlet start = i;\n\t\t\t\tfor (let j = i + 1; j < content.length; j++) {\n\t\t\t\t\tif (content[j] === char && content[j - 1] !== \"\\\\\") {\n\t\t\t\t\t\ti = j;\n\t\t\t\t\t\ttextContent += content.substring(start, i + 1);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t} else if (char === \"`\") {\n\t\t\t\t// Skip possibly interpolated string contents\n\t\t\t\t// TODO: Recursively skip strings inside the interpolated JS\n\t\t\t\tlet start = i;\n\t\t\t\tlet level2 = 0;\n\t\t\t\tfor (let j = i + 1; j < content.length; j++) {\n\t\t\t\t\tif (content[j] === char && content[j - 1] !== \"\\\\\" && level2 === 0) {\n\t\t\t\t\t\ti = j;\n\t\t\t\t\t\ttextContent += content.substring(start, i + 1);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t} else if (content[j] === \"{\" && (level2 > 0 || content[j - 1] === \"$\")) {\n\t\t\t\t\t\tlevel2 += 1;\n\t\t\t\t\t} else if (content[j] === \"}\" && level2 > 0) {\n\t\t\t\t\t\tlevel2 -= 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\ttextContent += content[i];\n\t}\n\n\t// TODO: Only need to build if this is not 0\n\tif (maxLevel) {\n\t\tif (reactiveCount === 1 && content.startsWith(\"{\") && content.endsWith(\"}\")) {\n\t\t\ttextContent = textContent.substring(2, textContent.length - 1);\n\t\t} else {\n\t\t\ttextContent = `\\`${textContent}\\``;\n\t\t}\n\n\t\tstatus.imports.add(\"t_fmt\");\n\t\tbuildRun(\"setTextContent\", `${node.varName}.textContent = ${textContent};`, status, b);\n\t}\n}\n","import { type ControlNode } from \"../../types/nodes/ControlNode\";\nimport { type ElementNode } from \"../../types/nodes/ElementNode\";\nimport { type RootNode } from \"../../types/nodes/RootNode\";\nimport { type TemplateNode } from \"../../types/nodes/TemplateNode\";\nimport { type TextNode } from \"../../types/nodes/TextNode\";\nimport Builder from \"../../utils/Builder\";\nimport { type BuildStatus } from \"./BuildStatus\";\nimport buildComponentNode from \"./buildComponentNode\";\nimport buildControlNode from \"./buildControlNode\";\nimport buildElementNode from \"./buildElementNode\";\nimport buildRootNode from \"./buildRootNode\";\nimport buildSpecialNode from \"./buildSpecialNode\";\nimport buildTextNode from \"./buildTextNode\";\n\nexport default function buildNode(\n\tnode: TemplateNode,\n\tstatus: BuildStatus,\n\tb: Builder,\n\tparentName: string,\n\tanchorName: string,\n\troot = false,\n): void {\n\t// Nodes with anchors will have been handled when their containing fragment\n\t// was built so we want to skip them here\n\tif (node.handled) {\n\t\tnode.handled = false;\n\t\treturn;\n\t}\n\n\tswitch (node.type) {\n\t\tcase \"root\": {\n\t\t\tbuildRootNode(node as RootNode, status, b, parentName, anchorName);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"control\": {\n\t\t\tbuildControlNode(node as ControlNode, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"component\": {\n\t\t\tbuildComponentNode(node as ElementNode, status, b, root);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"element\": {\n\t\t\tbuildElementNode(node as ElementNode, status, b, parentName, root);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"text\": {\n\t\t\tbuildTextNode(node as TextNode, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"special\": {\n\t\t\tbuildSpecialNode(node as ElementNode, status, b, parentName, root);\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\tthrow new Error(`Invalid node type: ${node.type}`);\n\t\t}\n\t}\n}\n","import { type BuildOptions } from \"../../../types/BuildOptions\";\nimport { type Template } from \"../../../types/Template\";\nimport Builder from \"../../utils/Builder\";\nimport { type BuildStatus } from \"./BuildStatus\";\nimport buildFragmentText from \"./buildFragmentText\";\nimport buildNode from \"./buildNode\";\n\nconst importsMap: Record<string, string> = {\n\t$watch: 'import { $watch } from \"${folder}\";',\n\t$unwrap: 'import { $unwrap } from \"${folder}\";',\n\t$run: 'import { $run } from \"${folder}\";',\n\t$mount: 'import { $mount } from \"${folder}\";',\n\tt_range: 'import { t_range } from \"${folder}\";',\n\tt_push_range: 'import { t_push_range } from \"${folder}\";',\n\tt_pop_range: 'import { t_pop_range } from \"${folder}\";',\n\tt_run_control: 'import { t_run_control } from \"${folder}\";',\n\tt_run_branch: 'import { t_run_branch } from \"${folder}\";',\n\tt_list_item: 'import { t_list_item } from \"${folder}\";',\n\tt_run_list: 'import { t_run_list } from \"${folder}\";',\n\tt_add_fragment: 'import { t_add_fragment } from \"${folder}\";',\n\tt_apply_props: 'import { t_apply_props } from \"${folder}\";',\n\tt_class: 'import { t_class } from \"${folder}\";',\n\tt_style: 'import { t_style } from \"${folder}\";',\n\tt_attribute: 'import { t_attribute } from \"${folder}\";',\n\tt_dynamic: 'import { t_dynamic } from \"${folder}\";',\n\tt_fmt: 'import { t_fmt } from \"${folder}\";',\n\tt_fragment: 'import { t_fragment } from \"${folder}\";',\n\tt_event: 'import { t_event } from \"${folder}\";',\n\tt_animate: 'import { t_animate } from \"${folder}\";',\n\tt_root: 'import { t_root } from \"${folder}\";',\n\tt_anchor: 'import { t_anchor } from \"${folder}\";',\n\tt_child: 'import { t_child } from \"${folder}\";',\n\tt_next: 'import { t_next } from \"${folder}\";',\n\tt_frg: 'import { t_frg } from \"${folder}\";',\n\tt_elm: 'import { t_elm } from \"${folder}\";',\n\tt_txt: 'import { t_txt } from \"${folder}\";',\n\tt_cmt: 'import { t_cmt } from \"${folder}\";',\n\tListItem: 'import { type ListItem } from \"${folder}\";',\n\tSlotRender: 'import { type SlotRender } from \"${folder}\";',\n};\n\nexport default function buildCode(template: Template, options?: BuildOptions): string {\n\tlet b = new Builder();\n\n\t// Gather imports as we go so they can be placed at the top\n\tlet imports = new Set<string>();\n\timports.add(\"SlotRender\");\n\n\t// Build the component\n\tbuildTemplate(template, imports, b);\n\n\t// Add the gathered imports in alphabetical order\n\tif (imports.size) {\n\t\tb.prepend(\"\");\n\t\tfor (let imp of Array.from(imports).sort().reverse()) {\n\t\t\timp = importsMap[imp] || imp;\n\t\t\tb.prepend(imp.replace(\"${folder}\", options?.renderFolder || \"@torpor/view\"));\n\t\t}\n\t}\n\n\treturn b.toString();\n}\n\nfunction buildTemplate(template: Template, imports: Set<string>, b: Builder) {\n\tlet script = template.script || \"\";\n\n\t// Add default imports\n\tif (/\\$watch\\b/.test(script)) imports.add(\"$watch\");\n\tif (/\\$unwrap\\b/.test(script)) imports.add(\"$unwrap\");\n\tif (/\\$run\\b/.test(script)) imports.add(\"$run\");\n\tif (/\\$mount\\b/.test(script)) imports.add(\"$mount\");\n\n\tlet currentIndex = 0;\n\tlet current = template.components[0];\n\n\tlet marker = 0;\n\tfor (let i = 0; i < script.length; i++) {\n\t\tif (script.substring(i, i + \"/* @params */\".length) === \"/* @params */\") {\n\t\t\tb.append(script.substring(marker, i));\n\n\t\t\t// TODO: Support other params, like the user setting $context\n\t\t\tlet params = [\n\t\t\t\t\"$parent: ParentNode\",\n\t\t\t\t\"$anchor: Node | null\",\n\t\t\t\tcurrent.params ??\n\t\t\t\t\t`${current.props?.length ? \"$props\" : \"// @ts-ignore\\n$props?\"}: Record<PropertyKey, any>`,\n\t\t\t\t`${current.contextProps?.length ? \"\" : \"// @ts-ignore\\n\"}$context?: Record<PropertyKey, any>`,\n\t\t\t\t`${current.slotProps?.length ? \"\" : \"// @ts-ignore\\n\"}$slots?: Record<string, SlotRender>`,\n\t\t\t];\n\t\t\tb.append(params.join(\",\\n\"));\n\n\t\t\tmarker = i + \"/* @params */\".length;\n\t\t} else if (script.substring(i, i + \"/* @start */\".length) === \"/* @start */\") {\n\t\t\tb.append(script.substring(marker, i));\n\n\t\t\t// Make sure we've got $props if we're going to be using it\n\t\t\tif (current.props?.length) {\n\t\t\t\timports.add(\"$watch\");\n\t\t\t\tb.append(`$props ??= $watch({});`);\n\t\t\t}\n\n\t\t\t// Redefine $context so that any newly added properties will only be passed to children\n\t\t\tif (current.contextProps?.length) {\n\t\t\t\tb.append(`$context = Object.assign({}, $context);`);\n\t\t\t}\n\n\t\t\tb.append(\"\");\n\n\t\t\tmarker = i + \"/* @start */\".length;\n\t\t} else if (script.substring(i, i + \"/* @render */\".length) === \"/* @render */\") {\n\t\t\tb.append(script.substring(marker, i));\n\n\t\t\tif (current.markup) {\n\t\t\t\tconst status: BuildStatus = {\n\t\t\t\t\timports,\n\t\t\t\t\tprops: current.props || [],\n\t\t\t\t\tcontextProps: current.contextProps || [],\n\t\t\t\t\tslotProps: current.slotProps || [],\n\t\t\t\t\tstyleHash: current.style?.hash || \"\",\n\t\t\t\t\tvarNames: {},\n\t\t\t\t\tfragmentStack: [],\n\t\t\t\t\tforVarNames: [],\n\t\t\t\t\tns: false,\n\t\t\t\t\tpreserveWhitespace: false,\n\t\t\t\t};\n\n\t\t\t\t// Add the interface\n\t\t\t\tb.append(\"\");\n\t\t\t\tb.append(\"/* User interface */\");\n\t\t\t\tbuildFragmentText(current.markup, status, b);\n\t\t\t\tb.append(\"\");\n\t\t\t\tbuildNode(current.markup, status, b, \"$parent\", \"$anchor\", true);\n\t\t\t}\n\n\t\t\tmarker = i + \"/* @render */\".length;\n\t\t} else if (script.substring(i, i + \"/* @end */\".length) === \"/* @end */\") {\n\t\t\tb.append(script.substring(marker, i));\n\n\t\t\tcurrentIndex += 1;\n\t\t\tcurrent = template.components[currentIndex];\n\n\t\t\tmarker = i + \"/* @end */\".length;\n\t\t}\n\t}\n\n\tb.append(script.substring(marker));\n}\n","import { type Attribute } from \"../../types/nodes/Attribute\";\nimport { type Style } from \"../../types/styles/Style\";\nimport { type StyleBlock } from \"../../types/styles/StyleBlock\";\nimport Builder from \"../../utils/Builder\";\n\nexport default function buildStyles(style: Style, styleHash: string): string {\n\tconst b = new Builder();\n\n\tfor (let block of style.blocks) {\n\t\tbuildStyleBlock(block, b, styleHash);\n\t}\n\n\treturn b.toString();\n}\n\nconst globalStyleRegex = /\\:global\\((.+)\\)/;\n\nfunction buildStyleBlock(block: StyleBlock, b: Builder, styleHash: string) {\n\t// TODO: This should probably be done while parsing\n\t// And handle attribute selectors\n\tconst selectors = block.selector\n\t\t.split(/([\\s*,>+~])/)\n\t\t.filter((s) => !!s.trim())\n\t\t.map((s) => {\n\t\t\tif (s.length === 1 && \"*,>+~\".includes(s)) {\n\t\t\t\treturn s;\n\t\t\t} else if (globalStyleRegex.test(s)) {\n\t\t\t\treturn s.match(globalStyleRegex)![1];\n\t\t\t} else {\n\t\t\t\treturn `${s}.torp-${styleHash}`;\n\t\t\t}\n\t\t});\n\n\tb.append(`${selectors.join(\" \")} {`);\n\tfor (let attribute of block.attributes) {\n\t\tbuildStyleAttribute(attribute, b);\n\t}\n\tfor (let child of block.children) {\n\t\tbuildStyleBlock(child, b, styleHash);\n\t}\n\tb.append(`}`);\n}\n\nfunction buildStyleAttribute(attribute: Attribute, b: Builder) {\n\tb.append(`${attribute.name}: ${attribute.value};`);\n}\n","import { ANCHOR_COMMENT } from \"../../types/comments\";\nimport { type ElementNode } from \"../../types/nodes/ElementNode\";\nimport isSpecialNode from \"../../types/nodes/isSpecialNode\";\nimport Builder from \"../../utils/Builder\";\nimport trimMatched from \"../../utils/trimMatched\";\nimport trimQuotes from \"../../utils/trimQuotes\";\nimport isFullyReactive from \"../utils/isFullyReactive\";\nimport isReactive from \"../utils/isReactive\";\nimport nextVarName from \"../utils/nextVarName\";\nimport { type BuildServerStatus } from \"./BuildServerStatus\";\nimport buildServerNode from \"./buildServerNode\";\n\nexport default function buildServerComponentNode(\n\tnode: ElementNode,\n\tstatus: BuildServerStatus,\n\tb: Builder,\n): void {\n\tif (status.output) {\n\t\tb.append(`$output += \\`${status.output}\\`;`);\n\t\tstatus.output = \"\";\n\t}\n\n\t// Props\n\tconst componentHasProps = node.attributes.length; // || root;\n\tconst propsName = componentHasProps ? nextVarName(\"props\", status) : \"undefined\";\n\tif (componentHasProps) {\n\t\t// TODO: defaults etc props\n\t\tb.append(`const ${propsName}: any = {};`);\n\t\tfor (let { name, value } of node.attributes) {\n\t\t\tif (name.startsWith(\"{\") && name.endsWith(\"}\")) {\n\t\t\t\t// It's a shortcut attribute\n\t\t\t\t// It could be e.g. {width} or it could be {$state.width}, but\n\t\t\t\t// in either case we set the value of the width property\n\t\t\t\tname = name.substring(1, name.length - 1);\n\t\t\t\tconst propName = name.split(\".\").at(-1);\n\t\t\t\tb.append(`${propsName}[\"${propName}\"] = ${name};`);\n\t\t\t} else if (value != null) {\n\t\t\t\tlet fullyReactive = isFullyReactive(value);\n\t\t\t\tlet partlyReactive = isReactive(value);\n\t\t\t\tif (fullyReactive) {\n\t\t\t\t\tvalue = value.substring(1, value.length - 1);\n\t\t\t\t} else if (partlyReactive) {\n\t\t\t\t\tvalue = `\\`${trimQuotes(value).replaceAll(\"{\", \"${\")}\\``;\n\t\t\t\t}\n\t\t\t\tif (name === \"class\") {\n\t\t\t\t\t// TODO: How to handle dynamic classes etc\n\t\t\t\t\t// Probably just compile down to a string?\n\t\t\t\t\tb.append(`\"${trimQuotes(value)} torp-${status.styleHash}\"`);\n\t\t\t\t}\n\t\t\t\tb.append(`${propsName}[\"${name}\"] = ${value};`);\n\t\t\t} else {\n\t\t\t\tb.append(`${propsName}[\"${name}\"] = true;`);\n\t\t\t}\n\t\t}\n\t\t// NOTE: Not sure if this is needed\n\t\t/*\n\t\tif (root) {\n\t\t\tb.append(`\n\t\t\tif ($props) {\n\t\t\t\tconst propNames = [${status.props.map((p) => `'${p}'`).join(\", \")}];\n\t\t\t\tfor (let name of Object.keys($props)) {\n\t\t\t\t\tif (!name.startsWith(\"$\") && !propNames.includes(name)) {\n\t\t\t\t\t\t${propsName}[name] = $props[name];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}`);\n\t\t}\n\t\t*/\n\t}\n\n\t// Slots\n\tconst componentHasSlots = node.children.length;\n\tconst slotsName = componentHasSlots ? nextVarName(\"slots\", status) : \"undefined\";\n\tif (componentHasSlots) {\n\t\tb.append(`const ${slotsName}: Record<string, ServerSlotRender> = {};`);\n\t\tfor (let slot of node.children) {\n\t\t\tif (isSpecialNode(slot)) {\n\t\t\t\tconst nameAttribute = slot.attributes.find((a) => a.name === \"name\");\n\t\t\t\tconst slotName = nameAttribute?.value ? trimQuotes(nameAttribute.value) : \"_\";\n\t\t\t\tconst slotParams = [\n\t\t\t\t\t\"// @ts-ignore\\n$sprops?: Record<PropertyKey, any>\",\n\t\t\t\t\t\"// @ts-ignore\\n$context?: Record<PropertyKey, any>\",\n\t\t\t\t];\n\t\t\t\tb.append(`${slotsName}[\"${slotName}\"] = (\\n${slotParams.join(\",\\n\")}\\n) => {`);\n\t\t\t\tb.append(`let $output = \"\";`);\n\n\t\t\t\tfor (let child of slot.children) {\n\t\t\t\t\tbuildServerNode(child, status, b);\n\t\t\t\t}\n\n\t\t\t\tif (status.output) {\n\t\t\t\t\tb.append(`$output += \\`${status.output}\\`;`);\n\t\t\t\t\tstatus.output = \"\";\n\t\t\t\t}\n\n\t\t\t\tb.append(\"return $output;\");\n\t\t\t\tb.append(`}`);\n\t\t\t}\n\t\t}\n\t}\n\n\tlet componentName = node.tagName;\n\tif (componentName === \":component\") {\n\t\tlet selfAttribute = node.attributes.find((a) => a.name === \"self\");\n\t\tif (selfAttribute && selfAttribute.value) {\n\t\t\tcomponentName = trimMatched(selfAttribute.value, \"{\", \"}\");\n\t\t}\n\t}\n\n\t// Render the component\n\tlet renderParams = `${propsName}, $context`;\n\tif (slotsName !== \"undefined\") {\n\t\trenderParams += `, ${slotsName}`;\n\t}\n\tb.append(\"\");\n\tb.append(`$output += ${componentName}(${renderParams})`);\n\n\t// If we're using a @replace to update a :component, we need another anchor comment\n\tif (node.tagName === \":component\") {\n\t\tstatus.output += ANCHOR_COMMENT;\n\t}\n}\n","import {\n\tANCHOR_COMMENT,\n\tHYDRATION_END_COMMENT,\n\tHYDRATION_START_COMMENT,\n} from \"../../types/comments\";\nimport { type ControlNode } from \"../../types/nodes/ControlNode\";\nimport isControlNode from \"../../types/nodes/isControlNode\";\nimport Builder from \"../../utils/Builder\";\nimport { type BuildServerStatus } from \"./BuildServerStatus\";\nimport buildServerNode from \"./buildServerNode\";\n\nexport default function buildServerAwaitNode(\n\tnode: ControlNode,\n\tstatus: BuildServerStatus,\n\tb: Builder,\n): void {\n\t// Surround the entire control statement with bracketed comments, so that we\n\t// can skip to the end to set the anchor node when hydrating\n\tstatus.output += HYDRATION_START_COMMENT;\n\n\tif (status.output) {\n\t\tb.append(`$output += \\`${status.output}\\`;`);\n\t\tstatus.output = \"\";\n\t}\n\n\t// Build the await statement\n\tfor (let branch of node.children) {\n\t\tif (isControlNode(branch) && branch.operation === \"@await\") {\n\t\t\tbuildServerAwaitBranch(branch, status, b);\n\t\t}\n\t}\n\n\t// End the control statement\n\tstatus.output += HYDRATION_END_COMMENT;\n\n\t// Add the anchor node\n\tstatus.output += ANCHOR_COMMENT;\n}\n\nfunction buildServerAwaitBranch(node: ControlNode, status: BuildServerStatus, b: Builder) {\n\tfor (let child of node.children) {\n\t\tbuildServerNode(child, status, b);\n\t}\n\n\tif (status.output) {\n\t\tb.append(`$output += \\`${status.output}\\`;`);\n\t\tstatus.output = \"\";\n\t}\n}\n","import {\n\tANCHOR_COMMENT,\n\tHYDRATION_BRANCH_COMMENT,\n\tHYDRATION_END_COMMENT,\n\tHYDRATION_START_COMMENT,\n} from \"../../types/comments\";\nimport { type ControlNode } from \"../../types/nodes/ControlNode\";\nimport isControlNode from \"../../types/nodes/isControlNode\";\nimport Builder from \"../../utils/Builder\";\nimport { type BuildServerStatus } from \"./BuildServerStatus\";\nimport buildServerNode from \"./buildServerNode\";\n\nexport default function buildServerForNode(\n\tnode: ControlNode,\n\tstatus: BuildServerStatus,\n\tb: Builder,\n): void {\n\t// Surround the entire control statement with bracketed comments, so that we\n\t// can skip to the end to set the anchor node when hydrating\n\tstatus.output += HYDRATION_START_COMMENT;\n\n\tif (status.output) {\n\t\tb.append(`$output += \\`${status.output}\\`;`);\n\t\tstatus.output = \"\";\n\t}\n\n\t// Build the for statement\n\tfor (let branch of node.children) {\n\t\tif (isControlNode(branch)) {\n\t\t\tbuildServerForBranch(branch, status, b);\n\t\t}\n\t}\n\n\t// End the control statement\n\tstatus.output += HYDRATION_END_COMMENT;\n\n\t// Add the anchor node\n\tstatus.output += ANCHOR_COMMENT;\n}\n\nfunction buildServerForBranch(node: ControlNode, status: BuildServerStatus, b: Builder) {\n\tb.append(`${node.statement} {`);\n\n\t// Separate spaces across boundaries with a careted comment\n\tstatus.output += HYDRATION_BRANCH_COMMENT;\n\n\tfor (let child of node.children) {\n\t\tbuildServerNode(child, status, b);\n\t}\n\n\tif (status.output) {\n\t\tb.append(`$output += \\`${status.output}\\`;`);\n\t\tstatus.output = \"\";\n\t}\n\n\tb.append(\"}\");\n}\n","import {\n\tANCHOR_COMMENT,\n\tHYDRATION_END_COMMENT,\n\tHYDRATION_START_COMMENT,\n} from \"../../types/comments\";\nimport { type ControlNode } from \"../../types/nodes/ControlNode\";\nimport isControlNode from \"../../types/nodes/isControlNode\";\nimport { type BuildServerStatus } from \"./BuildServerStatus\";\n\nexport default function buildServerHtmlNode(node: ControlNode, status: BuildServerStatus): void {\n\t// Surround the entire control statement with bracketed comments, so that we\n\t// can skip to the end to set the anchor node when hydrating\n\tstatus.output += HYDRATION_START_COMMENT;\n\n\t// Build the html statement\n\tfor (let branch of node.children) {\n\t\tif (isControlNode(branch)) {\n\t\t\tstatus.output += `\\${${branch.statement}}`;\n\t\t}\n\t}\n\n\t// End the control statement\n\tstatus.output += HYDRATION_END_COMMENT;\n\n\t// Add the anchor node\n\tstatus.output += ANCHOR_COMMENT;\n}\n","import {\n\tANCHOR_COMMENT,\n\tHYDRATION_END_COMMENT,\n\tHYDRATION_START_COMMENT,\n} from \"../../types/comments\";\nimport { type ControlNode } from \"../../types/nodes/ControlNode\";\nimport isControlNode from \"../../types/nodes/isControlNode\";\nimport Builder from \"../../utils/Builder\";\nimport { type BuildServerStatus } from \"./BuildServerStatus\";\nimport buildServerNode from \"./buildServerNode\";\n\nexport default function buildServerIfNode(\n\tnode: ControlNode,\n\tstatus: BuildServerStatus,\n\tb: Builder,\n): void {\n\t// Surround the entire control statement with bracketed comments, so that we\n\t// can skip to the end to set the anchor node when hydrating\n\tstatus.output += HYDRATION_START_COMMENT;\n\n\tif (status.output) {\n\t\tb.append(`$output += \\`${status.output}\\`;`);\n\t\tstatus.output = \"\";\n\t}\n\n\t// Build the if statement\n\tfor (let branch of node.children) {\n\t\tif (isControlNode(branch)) {\n\t\t\tbuildServerIfBranch(branch, status, b);\n\t\t}\n\t}\n\n\t// End the control statement\n\tstatus.output += HYDRATION_END_COMMENT;\n\n\t// Add the anchor node\n\tstatus.output += ANCHOR_COMMENT;\n}\n\nfunction buildServerIfBranch(node: ControlNode, status: BuildServerStatus, b: Builder) {\n\tb.append(`${node.statement} {`);\n\n\tfor (let child of node.children) {\n\t\tbuildServerNode(child, status, b);\n\t}\n\n\tif (status.output) {\n\t\tb.append(`$output += \\`${status.output}\\`;`);\n\t\tstatus.output = \"\";\n\t}\n\n\tb.append(\"}\");\n}\n","import {\n\tANCHOR_COMMENT,\n\tHYDRATION_END_COMMENT,\n\tHYDRATION_START_COMMENT,\n} from \"../../types/comments\";\nimport { type ControlNode } from \"../../types/nodes/ControlNode\";\nimport isControlNode from \"../../types/nodes/isControlNode\";\nimport Builder from \"../../utils/Builder\";\nimport { type BuildServerStatus } from \"./BuildServerStatus\";\nimport buildServerNode from \"./buildServerNode\";\n\nexport default function buildServerReplaceNode(\n\tnode: ControlNode,\n\tstatus: BuildServerStatus,\n\tb: Builder,\n): void {\n\t// Surround the entire control statement with bracketed comments, so that we\n\t// can skip to the end to set the anchor node when hydrating\n\tstatus.output += HYDRATION_START_COMMENT;\n\n\tif (status.output) {\n\t\tb.append(`$output += \\`${status.output}\\`;`);\n\t\tstatus.output = \"\";\n\t}\n\n\t// Build the replace statement\n\tfor (let branch of node.children) {\n\t\tif (isControlNode(branch)) {\n\t\t\tbuildServerReplaceBranch(branch, status, b);\n\t\t}\n\t}\n\n\t// End the control statement\n\tstatus.output += HYDRATION_END_COMMENT;\n\n\t// Add the anchor node\n\tstatus.output += ANCHOR_COMMENT;\n}\n\nfunction buildServerReplaceBranch(node: ControlNode, status: BuildServerStatus, b: Builder) {\n\tb.append(`${node.statement};`);\n\n\tfor (let child of node.children) {\n\t\tbuildServerNode(child, status, b);\n\t}\n\n\tif (status.output) {\n\t\tb.append(`$output += \\`${status.output}\\`;`);\n\t\tstatus.output = \"\";\n\t}\n}\n","import { type ControlNode } from \"../../types/nodes/ControlNode\";\nimport Builder from \"../../utils/Builder\";\n\nexport default function buildServerScriptNode(node: ControlNode, b: Builder): void {\n\tb.append(`${maybeAppend(node.statement, \";\")}`);\n}\n\nfunction maybeAppend(text: string, end: string) {\n\tif (!text.endsWith(end)) {\n\t\ttext += end;\n\t}\n\treturn text;\n}\n","import {\n\tANCHOR_COMMENT,\n\tHYDRATION_END_COMMENT,\n\tHYDRATION_START_COMMENT,\n} from \"../../types/comments\";\nimport { type ControlNode } from \"../../types/nodes/ControlNode\";\nimport isControlNode from \"../../types/nodes/isControlNode\";\nimport Builder from \"../../utils/Builder\";\nimport { type BuildServerStatus } from \"./BuildServerStatus\";\nimport buildServerNode from \"./buildServerNode\";\n\nexport default function buildServerSwitchNode(\n\tnode: ControlNode,\n\tstatus: BuildServerStatus,\n\tb: Builder,\n): void {\n\t// Surround the entire control statement with bracketed comments, so that we\n\t// can skip to the end to set the anchor node when hydrating\n\tstatus.output += HYDRATION_START_COMMENT;\n\n\tif (status.output) {\n\t\tb.append(`$output += \\`${status.output}\\`;`);\n\t\tstatus.output = \"\";\n\t}\n\n\t// Build the switch statement\n\tb.append(`${node.statement} {`);\n\tfor (let branch of node.children.filter((c) => isControlNode(c))) {\n\t\tif (isControlNode(branch)) {\n\t\t\tbuildServerSwitchBranch(branch, status, b);\n\t\t}\n\t}\n\tb.append(\"}\");\n\n\t// End the control statement\n\tstatus.output += HYDRATION_END_COMMENT;\n\n\t// Add the anchor node\n\tstatus.output += ANCHOR_COMMENT;\n}\n\nfunction buildServerSwitchBranch(node: ControlNode, status: BuildServerStatus, b: Builder) {\n\tb.append(`${node.statement} {`);\n\n\tfor (let child of node.children) {\n\t\tbuildServerNode(child, status, b);\n\t}\n\n\tif (status.output) {\n\t\tb.append(`$output += \\`${status.output}\\`;`);\n\t\tstatus.output = \"\";\n\t}\n\n\tb.append(\"break;\");\n\tb.append(\"}\");\n}\n","import { type ControlNode } from \"../../types/nodes/ControlNode\";\nimport Builder from \"../../utils/Builder\";\nimport { type BuildServerStatus } from \"./BuildServerStatus\";\nimport buildServerAwaitNode from \"./buildServerAwaitNode\";\nimport buildServerForNode from \"./buildServerForNode\";\nimport buildServerHtmlNode from \"./buildServerHtmlNode\";\nimport buildServerIfNode from \"./buildServerIfNode\";\nimport buildServerReplaceNode from \"./buildServerReplaceNode\";\nimport buildServerScriptNode from \"./buildServerScriptNode\";\nimport buildServerSwitchNode from \"./buildServerSwitchNode\";\n\nexport default function buildServerControlNode(\n\tnode: ControlNode,\n\tstatus: BuildServerStatus,\n\tb: Builder,\n): void {\n\tswitch (node.operation) {\n\t\tcase \"@if group\": {\n\t\t\tbuildServerIfNode(node, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@if\":\n\t\tcase \"@else if\":\n\t\tcase \"@else\": {\n\t\t\t// These get handled with @if group, above\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@switch group\": {\n\t\t\tbuildServerSwitchNode(node, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@case\":\n\t\tcase \"@default\": {\n\t\t\t// These get handled with @switch, above\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@for group\": {\n\t\t\tbuildServerForNode(node, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@for\":\n\t\tcase \"@key\": {\n\t\t\t// These get handled with @for, above\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@await group\": {\n\t\t\tbuildServerAwaitNode(node, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@await\":\n\t\tcase \"@then\":\n\t\tcase \"@catch\": {\n\t\t\t// These get handled with @await group, above\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@replace group\": {\n\t\t\tbuildServerReplaceNode(node, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@replace\": {\n\t\t\t// This gets handled with @replace group, above\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@html group\": {\n\t\t\tbuildServerHtmlNode(node, status);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@html\": {\n\t\t\t// This gets handled with @html group, above\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@const\": {\n\t\t\tif (status.output) {\n\t\t\t\tb.append(`$output += \\`${status.output}\\`;`);\n\t\t\t\tstatus.output = \"\";\n\t\t\t}\n\t\t\tbuildServerScriptNode(node, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@function\": {\n\t\t\tif (status.output) {\n\t\t\t\tb.append(`$output += \\`${status.output}\\`;`);\n\t\t\t\tstatus.output = \"\";\n\t\t\t}\n\t\t\tb.append(\"\");\n\t\t\tbuildServerScriptNode(node, b);\n\t\t\tb.append(\"\");\n\t\t\tbreak;\n\t\t}\n\t\tcase \"@console\":\n\t\tcase \"@debugger\": {\n\t\t\t// These can't be used on the server\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\tthrow new Error(`Invalid operation: ${node.operation}`);\n\t\t}\n\t}\n}\n","// From https://developer.mozilla.org/en-US/docs/Glossary/Void_element\nconst voidTags: string[] = [\n\t\"area\",\n\t\"base\",\n\t\"br\",\n\t\"col\",\n\t\"embed\",\n\t\"hr\",\n\t\"img\",\n\t\"input\",\n\t\"link\",\n\t\"meta\",\n\t\"param\",\n\t\"source\",\n\t\"track\",\n\t\"wbr\",\n];\nexport default voidTags;\n","import { type ElementNode } from \"../../types/nodes/ElementNode\";\nimport Builder from \"../../utils/Builder\";\nimport trimQuotes from \"../../utils/trimQuotes\";\nimport voidTags from \"../../utils/voidTags\";\nimport isFullyReactive from \"../utils/isFullyReactive\";\nimport isReactive from \"../utils/isReactive\";\nimport { type BuildServerStatus } from \"./BuildServerStatus\";\nimport buildServerNode from \"./buildServerNode\";\n\nexport default function buildServerElementNode(\n\tnode: ElementNode,\n\tstatus: BuildServerStatus,\n\tb: Builder,\n): void {\n\tlet attributes = buildElementAttributes(node, status);\n\tif (attributes.length) {\n\t\tattributes = \" \" + attributes;\n\t}\n\n\tlet tagName = node.tagName;\n\tif (tagName === \":element\") {\n\t\tlet selfAttribute = node.attributes.find((a) => a.name === \"self\");\n\t\tif (selfAttribute) {\n\t\t\ttagName = `$${selfAttribute.value}`;\n\t\t}\n\t}\n\n\t// NOTE: Only void tags can be self-closed in HTML, although we allow it in\n\t// templates and auto-expand it here\n\tstatus.output += `<${tagName}${attributes}>`;\n\tif (!voidTags.includes(tagName)) {\n\t\tconst oldPreserveWhitespace = status.preserveWhitespace;\n\t\tstatus.preserveWhitespace = [\"pre\", \"code\"].includes(tagName);\n\t\tfor (let child of node.children) {\n\t\t\tbuildServerNode(child, status, b);\n\t\t}\n\t\tstatus.preserveWhitespace = oldPreserveWhitespace;\n\t\tstatus.output += `</${tagName}>`;\n\t}\n}\n\nfunction buildElementAttributes(node: ElementNode, status: BuildServerStatus) {\n\tlet needsClass = node.scopeStyles;\n\tlet attributes: string[] = [];\n\tfor (let { name, value } of node.attributes) {\n\t\tif (name === \"self\" && node.tagName === \":element\") {\n\t\t\t// Ignore this special attribute\n\t\t} else if (name.startsWith(\"on\") || name.startsWith(\":on\")) {\n\t\t\t// No events on the server\n\t\t} else if (name.startsWith(\":transition\") && value) {\n\t\t\t// No animation on the server, but we do need to set the attributes\n\t\t\t// from the first keyframe\n\t\t\t// HACK: use a regex instead maybe?\n\t\t\tvalue = value.substring(1, value.length - 1).trim();\n\t\t\tvalue = value.split(\",\")[0].trim();\n\t\t\tif (value.startsWith(\"[\")) {\n\t\t\t\tvalue = value.substring(1);\n\t\t\t} else {\n\t\t\t\tvalue = value + \"[0]\";\n\t\t\t}\n\t\t\tattributes.push(\n\t\t\t\t`style=\"\\${Object.entries(${value}).map(([k, v]) => \\`$\\{k}: $\\{v}\\`).join(\"; \")}\"`,\n\t\t\t);\n\t\t} else if (name.startsWith(\"{\") && name.endsWith(\"}\")) {\n\t\t\t// It's a shortcut attribute\n\t\t\t// It could be e.g. {width} or it could be {$state.width}, but\n\t\t\t// in either case we set the value of the width property\n\t\t\tname = name.substring(1, name.length - 1);\n\t\t\tconst propName = name.split(\".\").at(-1);\n\t\t\tstatus.imports.add(\"t_attr\");\n\t\t\tattributes.push(`${propName}=\"\\${t_attr(${name})}\"`);\n\t\t} else if (value != null && isFullyReactive(value)) {\n\t\t\t// It's a reactive attribute\n\t\t\tvalue = value.substring(1, value.length - 1);\n\n\t\t\tif (name === \"&ref\" || name === \"&value\" || name === \"&checked\" || name === \"&group\") {\n\t\t\t\tlet defaultValue = \"\";\n\t\t\t\tlet typeAttribute = node.attributes.find((a) => a.name === \"type\");\n\t\t\t\tif (typeAttribute && typeAttribute.value) {\n\t\t\t\t\tswitch (trimQuotes(typeAttribute.value)) {\n\t\t\t\t\t\tcase \"number\": {\n\t\t\t\t\t\t\tdefaultValue = \"0\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase \"checkbox\": {\n\t\t\t\t\t\t\tdefaultValue = \"false\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!defaultValue) {\n\t\t\t\t\tstatus.imports.add(\"t_attr\");\n\t\t\t\t\tvalue = `t_attr(${value})`;\n\t\t\t\t\tdefaultValue = '\"\"';\n\t\t\t\t}\n\t\t\t\tlet valueOrDefault = `${value} || ${defaultValue}`;\n\t\t\t\tconst propName = name.substring(1);\n\t\t\t\tattributes.push(`${propName}=\"\\${${valueOrDefault}}\"`);\n\t\t\t} else if (name === \":class\") {\n\t\t\t\tstatus.imports.add(\"t_class\");\n\t\t\t\tif (node.scopeStyles) {\n\t\t\t\t\tvalue += `, \"torp-${status.styleHash}\"`;\n\t\t\t\t\tneedsClass = false;\n\t\t\t\t}\n\t\t\t\tattributes.push(`class=\"\\${t_class(${value})}\"`);\n\t\t\t} else if (name === \":style\") {\n\t\t\t\tstatus.imports.add(\"t_style\");\n\t\t\t\tattributes.push(`style=\"\\${t_style(${value})}\"`);\n\t\t\t} else {\n\t\t\t\t// Only set the attribute if the value is truthy\n\t\t\t\t// e.g. `... ${className ? `class=\"${className}\"` : ''} ...`\n\t\t\t\tstatus.imports.add(\"t_attr\");\n\t\t\t\tattributes.push(`\\${${value} ? \\`${name}=\"\\${t_attr(${value})}\"\\` : ''}`);\n\t\t\t}\n\t\t} else if (value != null && isReactive(value)) {\n\t\t\t// TODO: Match braces, don't replace braces inside code\n\t\t\tstatus.imports.add(\"t_attr\");\n\t\t\tattributes.push(\n\t\t\t\t`${name}=\"${trimQuotes(value).replaceAll(\"{\", \"${t_attr(\").replaceAll(\"}\", \")}\")}\"`,\n\t\t\t);\n\t\t} else if (name === \"class\" && node.scopeStyles) {\n\t\t\tvalue = value\n\t\t\t\t? `\"${trimQuotes(value)} torp-${status.styleHash}\"`\n\t\t\t\t: `\"torp-${status.styleHash}\"`;\n\t\t\tattributes.push(`${name}=\"${trimQuotes(value).replaceAll('\"', \""\")}\"`);\n\t\t\tneedsClass = false;\n\t\t} else if (value != null) {\n\t\t\t// Just set the attribute\n\t\t\t// TODO: Probably check if it's a boolean attribute e.g. disabled\n\t\t\tattributes.push(`${name}=\"${trimQuotes(value).replaceAll('\"', \""\")}\"`);\n\t\t} else {\n\t\t\tattributes.push(`${name}`);\n\t\t}\n\t}\n\tif (needsClass) {\n\t\tattributes.push(`class=\"torp-${status.styleHash}\"`);\n\t}\n\treturn attributes.join(\" \");\n}\n","import { type RootNode } from \"../../types/nodes/RootNode\";\nimport Builder from \"../../utils/Builder\";\nimport { type BuildServerStatus } from \"./BuildServerStatus\";\nimport buildServerNode from \"./buildServerNode\";\n\nexport default function buildServerRootNode(\n\tnode: RootNode,\n\tstatus: BuildServerStatus,\n\tb: Builder,\n): void {\n\tbuildServerNode(node.children[0], status, b);\n}\n","import {\n\tANCHOR_COMMENT,\n\tHYDRATION_END_COMMENT,\n\tHYDRATION_START_COMMENT,\n} from \"../../types/comments\";\nimport { type ElementNode } from \"../../types/nodes/ElementNode\";\nimport isSpecialNode from \"../../types/nodes/isSpecialNode\";\nimport Builder from \"../../utils/Builder\";\nimport trimQuotes from \"../../utils/trimQuotes\";\nimport isFullyReactive from \"../utils/isFullyReactive\";\nimport isReactive from \"../utils/isReactive\";\nimport nextVarName from \"../utils/nextVarName\";\nimport { type BuildServerStatus } from \"./BuildServerStatus\";\nimport buildServerNode from \"./buildServerNode\";\n\nexport default function buildServerSlotNode(\n\tnode: ElementNode,\n\tstatus: BuildServerStatus,\n\tb: Builder,\n): void {\n\t// Surround the entire control statement with bracketed comments, so that we\n\t// can skip to the end to set the anchor node when hydrating\n\tstatus.output += HYDRATION_START_COMMENT;\n\n\tif (status.output) {\n\t\tb.append(`$output += \\`${status.output}\\`;`);\n\t\tstatus.output = \"\";\n\t}\n\n\t// If there's a slot, build that, otherwise build the default nodes\n\tlet slotName = node.attributes.find((a) => a.name === \"name\")?.value;\n\tslotName = slotName ? trimQuotes(slotName) : \"_\";\n\n\t// Slot props\n\tconst propsName = nextVarName(\"sprops\", status);\n\tconst slotAttributes = node.attributes.filter((a) => a.name !== \"name\");\n\tconst slotHasProps = slotAttributes.length;\n\tif (slotHasProps) {\n\t\t// TODO: defaults etc props\n\t\tb.append(`const ${propsName}: any = {};`);\n\t\tfor (let { name, value } of slotAttributes) {\n\t\t\tif (name.startsWith(\"{\") && name.endsWith(\"}\")) {\n\t\t\t\t// It's a shortcut attribute\n\t\t\t\t// It could be e.g. {width} or it could be {$state.width}, but\n\t\t\t\t// in either case we set the value of the width property\n\t\t\t\tname = name.substring(1, name.length - 1);\n\t\t\t\tconst propName = name.split(\".\").at(-1);\n\t\t\t\tb.append(`${propsName}[\"${propName}\"] = ${name};`);\n\t\t\t} else if (value != null) {\n\t\t\t\tlet fullyReactive = isFullyReactive(value);\n\t\t\t\tlet partlyReactive = isReactive(value);\n\t\t\t\tif (fullyReactive) {\n\t\t\t\t\tvalue = value.substring(1, value.length - 1);\n\t\t\t\t} else if (partlyReactive) {\n\t\t\t\t\tvalue = `\\`${trimQuotes(value).replaceAll(\"{\", \"${\")}\\``;\n\t\t\t\t}\n\t\t\t\tb.append(`${propsName}[\"${name}\"] = ${value};`);\n\t\t\t} else {\n\t\t\t\tb.append(`${propsName}[\"${name}\"] = true;`);\n\t\t\t}\n\t\t}\n\t}\n\n\tb.append(`if ($slots && $slots[\"${slotName}\"]) {`);\n\tb.append(\n\t\t`$output += $slots[\"${slotName}\"](${slotHasProps ? propsName : \"undefined\"}, $context);`,\n\t);\n\n\t// TODO: Not if there's only a single space node -- maybe check in parse\n\tconst fill = node.children.find((c) => isSpecialNode(c) && c.tagName === \":fill\");\n\tif (fill && isSpecialNode(fill) && fill.children.length) {\n\t\tb.append(`} else {`);\n\n\t\tfor (let child of fill.children) {\n\t\t\tbuildServerNode(child, status, b);\n\t\t}\n\n\t\tif (status.output) {\n\t\t\tb.append(`$output += \\`${status.output}\\`;`);\n\t\t\tstatus.output = \"\";\n\t\t}\n\t}\n\n\tb.append(`}`);\n\n\t// End the control statement\n\tstatus.output += HYDRATION_END_COMMENT;\n\n\t// Add the anchor node\n\tstatus.output += ANCHOR_COMMENT;\n}\n","import { type ElementNode } from \"../../types/nodes/ElementNode\";\nimport Builder from \"../../utils/Builder\";\nimport { type BuildServerStatus } from \"./BuildServerStatus\";\nimport buildServerComponentNode from \"./buildServerComponentNode\";\nimport buildServerElementNode from \"./buildServerElementNode\";\nimport buildServerSlotNode from \"./buildServerSlotNode\";\n\nexport default function buildServerSpecialNode(\n\tnode: ElementNode,\n\tstatus: BuildServerStatus,\n\tb: Builder,\n): void {\n\tswitch (node.tagName) {\n\t\tcase \":slot\": {\n\t\t\tbuildServerSlotNode(node, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \":element\": {\n\t\t\tbuildServerElementNode(node, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \":component\": {\n\t\t\tbuildServerComponentNode(node, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \":head\": {\n\t\t\t// TODO: For now this is just being done in hydrate\n\t\t\tbreak;\n\t\t}\n\t\tcase \":fill\": {\n\t\t\t// HACK:\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\tthrow new Error(`Invalid special node: ${node.tagName}`);\n\t\t}\n\t}\n}\n","import { type TextNode } from \"../../types/nodes/TextNode\";\nimport { type BuildServerStatus } from \"./BuildServerStatus\";\n\nexport default function buildServerTextNode(node: TextNode, status: BuildServerStatus): void {\n\tlet content = node.content || \"\";\n\n\tif (!status.preserveWhitespace) {\n\t\t// Replace all spaces with a single space, both to save space and to remove\n\t\t// newlines from generated JS strings\n\t\tcontent = content.replaceAll(/\\s+/g, \" \");\n\t}\n\n\t// TODO: Move all of this logic into parse, for text nodes and attribute values\n\tlet level = 0;\n\tfor (let i = 0; i < content.length; i++) {\n\t\tconst char = content[i];\n\t\tconst nextChar = content[i + 1];\n\t\tif (char === \"{\") {\n\t\t\tlevel++;\n\t\t\tif (level === 1) {\n\t\t\t\tstatus.imports.add(\"t_fmt\");\n\t\t\t\tstatus.output += \"${t_fmt(\";\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t} else if (char === \"}\") {\n\t\t\tlevel--;\n\t\t\tif (level === 0) {\n\t\t\t\tstatus.output += \")\";\n\t\t\t}\n\t\t} else if (char === \"`\" && level === 0) {\n\t\t\t// Escape backticks outside of braces, as they will be within a backtick string\n\t\t\tstatus.output += \"\\\\\";\n\t\t} else if (level > 0) {\n\t\t\tif (char === \"/\" && nextChar === \"/\") {\n\t\t\t\t// Skip one-line comments\n\t\t\t\tlet start = i;\n\t\t\t\ti = content.indexOf(\"\\n\", i);\n\t\t\t\tstatus.output += escapeHtml(content.substring(start, i + 1));\n\t\t\t\tcontinue;\n\t\t\t} else if (char === \"/\" && nextChar === \"*\") {\n\t\t\t\t// Skip block comments\n\t\t\t\tlet start = i;\n\t\t\t\ti = content.indexOf(\"*/\", i) + 1;\n\t\t\t\tstatus.output += escapeHtml(content.substring(start, i + 1));\n\t\t\t\tcontinue;\n\t\t\t} else if (char === '\"' || char === \"'\") {\n\t\t\t\t// Skip string contents\n\t\t\t\tlet start = i;\n\t\t\t\tfor (let j = i + 1; j < content.length; j++) {\n\t\t\t\t\tif (content[j] === char && content[j - 1] !== \"\\\\\") {\n\t\t\t\t\t\ti = j;\n\t\t\t\t\t\tstatus.output += escapeHtml(content.substring(start, i + 1));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t} else if (char === \"`\") {\n\t\t\t\t// Skip possibly interpolated string contents\n\t\t\t\t// TODO: Recursively skip strings inside the interpolated JS\n\t\t\t\tlet start = i;\n\t\t\t\tlet level2 = 0;\n\t\t\t\tfor (let j = i + 1; j < content.length; j++) {\n\t\t\t\t\tif (content[j] === char && content[j - 1] !== \"\\\\\" && level2 === 0) {\n\t\t\t\t\t\ti = j;\n\t\t\t\t\t\tstatus.output += escapeHtml(content.substring(start, i + 1));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t} else if (content[j] === \"{\" && (level2 > 0 || content[j - 1] === \"$\")) {\n\t\t\t\t\t\tlevel2 += 1;\n\t\t\t\t\t} else if (content[j] === \"}\" && level2 > 0) {\n\t\t\t\t\t\tlevel2 -= 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\tstatus.output += char;\n\t}\n}\n\n// Escape HTML in comments and strings on the server, so that we don't output unintended tags etc\n// This doesn't need to be done on the client, where we will be setting textContent\nfunction escapeHtml(text: string) {\n\treturn text.replaceAll(\"&\", \"&\").replaceAll(\"<\", \"<\").replaceAll(\">\", \">\");\n}\n","import { type ControlNode } from \"../../types/nodes/ControlNode\";\nimport { type ElementNode } from \"../../types/nodes/ElementNode\";\nimport { type RootNode } from \"../../types/nodes/RootNode\";\nimport { type TemplateNode } from \"../../types/nodes/TemplateNode\";\nimport { type TextNode } from \"../../types/nodes/TextNode\";\nimport Builder from \"../../utils/Builder\";\nimport { type BuildServerStatus } from \"./BuildServerStatus\";\nimport buildServerComponentNode from \"./buildServerComponentNode\";\nimport buildServerControlNode from \"./buildServerControlNode\";\nimport buildServerElementNode from \"./buildServerElementNode\";\nimport buildServerRootNode from \"./buildServerRootNode\";\nimport buildServerSpecialNode from \"./buildServerSpecialNode\";\nimport buildServerTextNode from \"./buildServerTextNode\";\n\nexport default function buildServerNode(\n\tnode: TemplateNode,\n\tstatus: BuildServerStatus,\n\tb: Builder,\n): void {\n\tswitch (node.type) {\n\t\tcase \"root\": {\n\t\t\tbuildServerRootNode(node as RootNode, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"control\": {\n\t\t\tbuildServerControlNode(node as ControlNode, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"component\": {\n\t\t\tbuildServerComponentNode(node as ElementNode, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"element\": {\n\t\t\tbuildServerElementNode(node as ElementNode, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"text\": {\n\t\t\tbuildServerTextNode(node as TextNode, status);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"special\": {\n\t\t\tbuildServerSpecialNode(node as ElementNode, status, b);\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\tthrow new Error(`Invalid node type: ${node.type}`);\n\t\t}\n\t}\n}\n","import { type BuildOptions } from \"../../../types/BuildOptions\";\nimport { type Template } from \"../../../types/Template\";\nimport Builder from \"../../utils/Builder\";\nimport { type BuildServerStatus } from \"./BuildServerStatus\";\nimport buildServerNode from \"./buildServerNode\";\n\nconst importsMap: Record<string, string> = {\n\t$watch: 'import { $watch } from \"${folder}\";',\n\t$unwrap: 'import { $unwrap } from \"${folder}\";',\n\t$run: 'import { $run } from \"${folder}\";',\n\t$mount: 'import { $mount } from \"${folder}\";',\n\tt_fmt: 'import { t_fmt } from \"${folder}\";',\n\tt_attr: 'import { t_attr } from \"${folder}\";',\n\tt_class: 'import { t_class } from \"${folder}\";',\n\tt_style: 'import { t_style } from \"${folder}\";',\n\tServerSlotRender: 'import { type ServerSlotRender } from \"${folder}\";',\n};\n\nexport default function buildServerCode(template: Template, options?: BuildOptions): string {\n\tlet b = new Builder();\n\n\t// Gather imports as we go so they can be placed at the top\n\tlet imports = new Set<string>();\n\timports.add(\"ServerSlotRender\");\n\n\t// Build the component and any child components\n\tbuildServerTemplate(template, imports, b, options);\n\n\t// Add the gathered imports in alphabetical order\n\tif (imports.size) {\n\t\tb.prepend(\"\");\n\t\tfor (let imp of Array.from(imports).sort().reverse()) {\n\t\t\timp = importsMap[imp] || imp;\n\t\t\tb.prepend(imp.replace(\"${folder}\", options?.renderFolder || \"@torpor/view/ssr\"));\n\t\t}\n\t}\n\n\treturn b.toString();\n}\n\nfunction buildServerTemplate(\n\ttemplate: Template,\n\timports: Set<string>,\n\tb: Builder,\n\toptions?: BuildOptions,\n) {\n\tlet script = template.script || \"\";\n\n\t// Add default imports\n\tif (/\\$watch\\b/.test(script)) imports.add(\"$watch\");\n\tif (/\\$unwrap\\b/.test(script)) imports.add(\"$unwrap\");\n\tif (/\\$run\\b/.test(script)) imports.add(\"$run\");\n\tif (/\\$mount\\b/.test(script)) imports.add(\"$mount\");\n\n\tlet currentIndex = 0;\n\tlet current = template.components[0];\n\n\tlet marker = 0;\n\tfor (let i = 0; i < script.length; i++) {\n\t\tif (script.substring(i, i + \"/* @params */\".length) === \"/* @params */\") {\n\t\t\tb.append(script.substring(marker, i));\n\n\t\t\t// TODO: Support other params, like the user setting $context\n\t\t\tlet params = [\n\t\t\t\tcurrent.params ??\n\t\t\t\t\t`${current.props?.length ? \"$props\" : \"// @ts-ignore\\n$props?\"}: Record<PropertyKey, any>`,\n\t\t\t\t`${current.contextProps?.length ? \"\" : \"// @ts-ignore\\n\"}$context?: Record<PropertyKey, any>`,\n\t\t\t\t`${current.slotProps?.length ? \"\" : \"// @ts-ignore\\n\"}$slots?: Record<string, ServerSlotRender>`,\n\t\t\t];\n\t\t\tb.append(params.join(\",\\n\"));\n\n\t\t\tmarker = i + \"/* @params */\".length;\n\t\t} else if (script.substring(i, i + \"/* @start */\".length) === \"/* @start */\") {\n\t\t\tb.append(script.substring(marker, i));\n\n\t\t\t// Make sure we've got $props if we're going to be using it\n\t\t\tif (current.props?.length) {\n\t\t\t\tb.append(`$props ??= {};`);\n\t\t\t}\n\n\t\t\t// Redefine $context so that any newly added properties will only be passed to children\n\t\t\tif (current.contextProps?.length) {\n\t\t\t\tb.append(`$context = Object.assign({}, $context);`);\n\t\t\t}\n\n\t\t\tmarker = i + \"/* @start */\".length;\n\t\t} else if (script.substring(i, i + \"/* @render */\".length) === \"/* @render */\") {\n\t\t\tb.append(script.substring(marker, i));\n\n\t\t\tif (current.markup) {\n\t\t\t\tconst status: BuildServerStatus = {\n\t\t\t\t\timports,\n\t\t\t\t\toutput: \"\",\n\t\t\t\t\tstyleHash: current.style?.hash || \"\",\n\t\t\t\t\tvarNames: {},\n\t\t\t\t\tpreserveWhitespace: false,\n\t\t\t\t\toptions,\n\t\t\t\t};\n\n\t\t\t\t// Add the interface\n\t\t\t\tb.append(\"\");\n\t\t\t\tb.append(\"/* User interface */\");\n\t\t\t\tb.append(`let $output = \"\";`);\n\n\t\t\t\t// Add the interface\n\t\t\t\tbuildServerNode(current.markup, status, b);\n\n\t\t\t\tif (status.output) {\n\t\t\t\t\tb.append(`$output += \\`${status.output}\\`;`);\n\t\t\t\t\tstatus.output = \"\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tmarker = i + \"/* @render */\".length;\n\t\t} else if (script.substring(i, i + \"/* @end */\".length) === \"/* @end */\") {\n\t\t\tb.append(script.substring(marker, i));\n\t\t\tb.append(\"return $output;\");\n\n\t\t\tcurrentIndex += 1;\n\t\t\tcurrent = template.components[currentIndex];\n\n\t\t\tmarker = i + \"/* @end */\".length;\n\t\t}\n\t}\n\n\tb.append(script.substring(marker));\n}\n","import { type BuildOptions } from \"../types/BuildOptions\";\nimport { type Template } from \"../types/Template\";\nimport buildCode from \"./build/client/buildCode\";\nimport buildStyles from \"./build/client/buildStyles\";\nimport buildServerCode from \"./build/server/buildServerCode\";\nimport { type BuildResult } from \"./types/BuildResult\";\n\n/**\n * Builds a component template into code and styles for rendering\n *\n * @param template The component template, possibly including script, markup and styles\n *\n * @returns The component's code and styles\n */\nexport default function build(template: Template, options?: BuildOptions): BuildResult {\n\tlet code = options?.server ? buildServerCode(template, options) : buildCode(template, options);\n\tlet styles = template.components\n\t\t.map((c) =>\n\t\t\tc.style ? { style: buildStyles(c.style, c.style.hash), hash: c.style.hash } : undefined,\n\t\t)\n\t\t.filter((c) => c !== undefined);\n\treturn {\n\t\tcode,\n\t\tstyles,\n\t};\n}\n","import { type BuildOptions } from \"../types/BuildOptions\";\nimport { type Template } from \"../types/Template\";\nimport Builder from \"./utils/Builder\";\n\n/**\n * Builds a component template into a d.ts file\n *\n * @param name The name of the component\n * @param template The component template, possibly including script, markup and styles\n *\n * @returns The d.ts file content\n */\nexport default function buildType(template: Template, options?: BuildOptions): string {\n\tlet b = new Builder();\n\n\tb.append(`import { type SlotRender } from \"${options?.renderFolder || \"@torpor/view\"}\";`);\n\n\tfor (let component of template.components) {\n\t\tb.append(\"\");\n\t\tb.append(`\n\t\t\t/**\n\t\t\t * Mounts or hydrates the component into the supplied parent node.\n\t\t\t * @param $parent -- The parent node.\n\t\t\t * @param $anchor -- The node to mount the component before.\n\t\t\t * @param $props -- The values that have been passed into the component as properties.\n\t\t\t * @param $context -- Values that have been passed into the component from its ancestors.\n\t\t\t * @param $slots -- Functions for rendering children into slot nodes within the component.\n\t\t\t */\n\t\t\t${component.default ? \"declare\" : \"export declare\"} function ${component.name}(\n\t\t\t\t$parent: ParentNode,\n\t\t\t\t$anchor: Node | null,\n\t\t\t\t${component.params || \"$props?: Record<PropertyKey, any>\"},\n\t\t\t\t$context?: Record<PropertyKey, any>,\n\t\t\t\t$slots?: Record<string, SlotRender>,\n\t\t\t): void;\n\t\t`);\n\t\tif (component.default) {\n\t\t\tb.append(`export default ${component.name};`);\n\t\t}\n\t}\n\n\treturn b.toString();\n}\n","import isSpace from \"../../parse/utils/isSpace\";\nimport { type TemplateNode } from \"./TemplateNode\";\nimport { type TextNode } from \"./TextNode\";\nimport isTextNode from \"./isTextNode\";\n\nexport default function isSpaceNode(node: TemplateNode): node is TextNode {\n\treturn isTextNode(node) && isSpace(node.content);\n}\n","import { type ParseStatus } from \"../ParseStatus\";\nimport isSpaceChar from \"./isSpaceChar\";\n\n/**\n * Consumes space characters and advances the current parse position to before\n * the next non-space character\n *\n * @param status The parse status\n *\n * @returns The string of space characters from the current parse position to\n * the next non-space character\n */\nexport default function consumeSpace(status: ParseStatus): string {\n\tconst start = status.i;\n\tfor (status.i; status.i < status.source.length; status.i++) {\n\t\tif (!isSpaceChar(status.source, status.i)) {\n\t\t\treturn status.source.substring(start, status.i);\n\t\t}\n\t}\n\treturn \"\";\n}\n","import { type ControlNode } from \"../types/nodes/ControlNode\";\nimport { type ElementNode } from \"../types/nodes/ElementNode\";\nimport { type TextNode } from \"../types/nodes/TextNode\";\nimport isTextNode from \"../types/nodes/isTextNode\";\nimport { type ParseStatus } from \"./ParseStatus\";\nimport consumeSpace from \"./utils/consumeSpace\";\n\nexport default function addSpaceElement(\n\tparent: ElementNode | ControlNode,\n\tstatus: ParseStatus,\n): void {\n\tconst content = consumeSpace(status);\n\tif (content) {\n\t\tconst previousNode = parent.children[parent.children.length - 1];\n\t\tif (previousNode && isTextNode(previousNode)) {\n\t\t\tpreviousNode.content += content;\n\t\t} else {\n\t\t\tconst space: TextNode = {\n\t\t\t\ttype: \"text\",\n\t\t\t\tcontent,\n\t\t\t};\n\t\t\tparent.children.push(space);\n\t\t}\n\t}\n}\n","/**\n * Trims a char from the start of the supplied text\n *\n * @param text The text to trim\n * @param char The char to remove from the start of the text\n *\n * @returns The text without the char on the start\n */\nexport default function trimStart(text: string, char: string): string {\n\tlet start = 0;\n\twhile (text[start] === char) {\n\t\tstart += 1;\n\t}\n\treturn text.substring(start);\n}\n","import { type ParseStatus } from \"../ParseStatus\";\n\n/**\n * Checks whether the source at the current parse position matches the supplied\n * string\n *\n * @param value The string to check\n * @param status The parse status\n * @param advance (Optional) If true, advances the parse position past the\n * checked string (defaults to true)\n *\n * @returns True if the supplied string was found at the current parse position\n */\nexport default function accept(value: string, status: ParseStatus, advance = true): boolean {\n\tconst check = status.source.substring(status.i, status.i + value.length);\n\tif (check == value) {\n\t\tstatus.i += advance ? value.length : 0;\n\t\treturn true;\n\t}\n\treturn false;\n}\n","import { type ParseStatus } from \"./ParseStatus\";\nimport accept from \"./utils/accept\";\n\nexport default function parseInlineScript(status: ParseStatus): string {\n\tconst start = status.i;\n\tlet braceCount = 0;\n\twhile (status.i < status.source.length) {\n\t\tif (accept(\"{\", status)) {\n\t\t\tbraceCount += 1;\n\t\t} else if (accept(\"}\", status)) {\n\t\t\tif (braceCount > 0) {\n\t\t\t\tbraceCount -= 1;\n\t\t\t} else {\n\t\t\t\treturn status.source.substring(start, status.i - 1);\n\t\t\t}\n\t\t} else if (accept('\"', status) || accept(\"'\", status)) {\n\t\t\t// Skip string contents\n\t\t\tconst char = status.source[status.i - 1];\n\t\t\tfor (let j = status.i; j < status.source.length; j++) {\n\t\t\t\tif (status.source[j] === char && status.source[j - 1] !== \"\\\\\") {\n\t\t\t\t\tstatus.i = j + 1;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (accept(\"`\", status)) {\n\t\t\t// Skip possibly interpolated string contents\n\t\t\tconst char = status.source[status.i - 1];\n\t\t\tlet level2 = 0;\n\t\t\tfor (let j = status.i; j < status.source.length; j++) {\n\t\t\t\tif (status.source[j] === char && status.source[j - 1] !== \"\\\\\" && level2 === 0) {\n\t\t\t\t\tstatus.i = j + 1;\n\t\t\t\t\tbreak;\n\t\t\t\t} else if (status.source[j] === \"{\" && (level2 > 0 || status.source[j - 1] === \"$\")) {\n\t\t\t\t\tlevel2 += 1;\n\t\t\t\t} else if (status.source[j] === \"}\" && level2 > 0) {\n\t\t\t\t\tlevel2 -= 1;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (accept(\"//\", status)) {\n\t\t\t// Ignore the content of one-line comments\n\t\t\tstatus.i = status.source.indexOf(\"\\n\", status.i) + 1;\n\t\t} else if (accept(\"/*\", status)) {\n\t\t\t// Ignore the content of block comments\n\t\t\tstatus.i = status.source.indexOf(\"*/\", status.i) + 2;\n\t\t} else {\n\t\t\tstatus.i += 1;\n\t\t}\n\t}\n\treturn \"\";\n}\n","import { type ParseStatus } from \"../ParseStatus\";\n\n/**\n * Adds an error to the parse status\n *\n * @param status The parse status\n * @param message The error message to add\n * @param start (Optional) The start position of the error (defaults to the\n * current parse position)\n */\nexport default function addError(\n\tstatus: ParseStatus,\n\tmessage: string,\n\tstart: number = status.i,\n): void {\n\tlet line = 1;\n\tlet lastLineStart = 0;\n\tfor (let i = 0; i < start; i++) {\n\t\tif (status.source[i] === \"\\n\") {\n\t\t\tline += 1;\n\t\t\tlastLineStart = i + 1;\n\t\t}\n\t}\n\tlet column = start - lastLineStart;\n\tstatus.errors.push({ message, start, line, column });\n}\n","import { type ControlNode } from \"../types/nodes/ControlNode\";\nimport { type ElementNode } from \"../types/nodes/ElementNode\";\nimport { type OperationType } from \"../types/nodes/OperationType\";\nimport isControlNode from \"../types/nodes/isControlNode\";\nimport trimMatched from \"../utils/trimMatched\";\nimport trimStart from \"../utils/trimStart\";\nimport { type ParseStatus } from \"./ParseStatus\";\nimport addSpaceElement from \"./addSpaceElement\";\nimport parseElement from \"./parseElement\";\nimport parseInlineScript from \"./parseInlineScript\";\nimport accept from \"./utils/accept\";\nimport addError from \"./utils/addError\";\nimport consumeSpace from \"./utils/consumeSpace\";\nimport isSpaceChar from \"./utils/isSpaceChar\";\n\nconst controlOperations = [\n\t\"@if\",\n\t\"@else\",\n\t\"@for\",\n\t\"@key\",\n\t\"@switch\",\n\t\"@case\",\n\t\"@default\",\n\t\"@await\",\n\t\"@then\",\n\t\"@catch\",\n\t\"@replace\",\n\t\"@html\",\n\t\"@const\",\n\t\"@console\",\n\t\"@debugger\",\n\t\"@function\",\n];\n\nconst standaloneOperations = [\"@key\", \"@html\", \"@const\", \"@console\", \"@debugger\", \"@function\"];\n\nexport default function parseControl(\n\tstatus: ParseStatus,\n\tparentNode: ElementNode | ControlNode,\n): void {\n\tconst node = parseControlOpen(status);\n\tif (!node) {\n\t\treturn;\n\t}\n\n\t// Some operations don't have children\n\tif (standaloneOperations.includes(node.operation)) {\n\t\twrangleControlNode(node, parentNode);\n\t\treturn;\n\t}\n\n\t// Get the children\n\twhile (status.i < status.source.length) {\n\t\taddSpaceElement(node, status);\n\t\tif (accept(\"}\", status)) {\n\t\t\t// It's the end of the control block, so we're done here\n\t\t\tbreak;\n\t\t} else if (accept(\"<\", status, false)) {\n\t\t\t// It's a child element\n\t\t\tconst child = parseElement(status);\n\t\t\tnode.children.push(child);\n\t\t} else if (accept(\"@//\", status)) {\n\t\t\t// Swallow one-line comments\n\t\t\tstatus.i = status.source.indexOf(\"\\n\", status.i) + 1;\n\t\t} else if (accept(\"@/*\", status)) {\n\t\t\t// Swallow block comments\n\t\t\tstatus.i = status.source.indexOf(\"*/\", status.i) + 2;\n\t\t} else if (accept(\"@\", status, false)) {\n\t\t\t// It's a nested control\n\t\t\tparseControl(status, node);\n\t\t} else if (accept(\"case\", status, false) || accept(\"key\", status, false)) {\n\t\t\t// `case` and `key` can be bare in a control block\n\t\t\tparseControl(status, node);\n\t\t} else {\n\t\t\t// Can't have text content in control blocks\n\t\t\tconst char = status.source[status.i];\n\t\t\taddError(status, `Unexpected token in control block: ${char}`, status.i);\n\t\t\tbreak;\n\t\t}\n\t}\n\n\twrangleControlNode(node, parentNode);\n\n\tparseControlBranches(status, parentNode);\n}\n\nfunction parseControlOpen(status: ParseStatus): ControlNode | null {\n\tconst start = status.i;\n\n\tlet operation = \"\";\n\tfor (status.i; status.i < status.source.length; status.i++) {\n\t\tconst char = status.source[status.i];\n\t\tif (\n\t\t\tisSpaceChar(status.source, status.i) ||\n\t\t\t(accept(\":\", status) && operation === \"default\") ||\n\t\t\t(accept(\".\", status) && operation === \"@console\") ||\n\t\t\t(accept(\"(\", status, false) && operation === \"@html\")\n\t\t) {\n\t\t\tbreak;\n\t\t}\n\t\toperation += char;\n\t}\n\n\t// Some operations (else etc) don't start with an @\n\tif (!operation.startsWith(\"@\")) {\n\t\toperation = \"@\" + operation;\n\t}\n\n\tlet statement = \"\";\n\tif (controlOperations.includes(operation)) {\n\t\tstatement = parseControlStatement(start, operation, status);\n\n\t\t// Special processing for functions -- read until the closing brace\n\t\tif (operation === \"@function\") {\n\t\t\tstatement += ` {${parseInlineScript(status)}}`;\n\t\t\taccept(\"}\", status);\n\t\t}\n\n\t\t// Special processing for replace and html\n\t\tif (operation === \"@replace\" || operation === \"@html\") {\n\t\t\tstatement = trimMatched(statement.substring(statement.indexOf(\"(\")).trim(), \"(\", \")\");\n\t\t}\n\t} else {\n\t\t// TODO: Should probably advance until a closing brace or a newline\n\t\taddError(status, `Unknown operation: ${operation}`, status.i);\n\t\treturn null;\n\t}\n\n\treturn {\n\t\ttype: \"control\",\n\t\toperation: operation as OperationType,\n\t\tstatement,\n\t\tchildren: [],\n\t};\n}\n\nfunction parseControlStatement(start: number, operation: string, status: ParseStatus) {\n\tlet parenCount = 0;\n\twhile (status.i < status.source.length) {\n\t\tif (accept(\"(\", status)) {\n\t\t\tparenCount += 1;\n\t\t} else if (accept(\")\", status)) {\n\t\t\tparenCount -= 1;\n\t\t} else if (\n\t\t\taccept(\"{\", status) ||\n\t\t\t(accept(\"\\n\", status) && standaloneOperations.includes(operation))\n\t\t) {\n\t\t\tif (parenCount === 0) {\n\t\t\t\treturn trimStart(status.source.substring(start, status.i - 1).trim(), \"@\");\n\t\t\t}\n\t\t} else if (accept('\"', status) || accept(\"'\", status)) {\n\t\t\t// Skip string contents\n\t\t\tconst char = status.source[status.i - 1];\n\t\t\tfor (let j = status.i + 1; j < status.source.length; j++) {\n\t\t\t\tif (status.source[j] === char && status.source[j - 1] !== \"\\\\\") {\n\t\t\t\t\tstatus.i = j + 1;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (accept(\"`\", status)) {\n\t\t\t// Skip possibly interpolated string contents\n\t\t\tlet level2 = 0;\n\t\t\tfor (let j = status.i + 1; j < status.source.length; j++) {\n\t\t\t\tif (status.source[j] === \"`\" && status.source[j - 1] !== \"\\\\\" && level2 === 0) {\n\t\t\t\t\tstatus.i = j + 1;\n\t\t\t\t\tbreak;\n\t\t\t\t} else if (status.source[j] === \"{\" && (level2 > 0 || status.source[j - 1] === \"$\")) {\n\t\t\t\t\tlevel2 += 1;\n\t\t\t\t} else if (status.source[j] === \"}\" && level2 > 0) {\n\t\t\t\t\tlevel2 -= 1;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (accept(\"//\", status)) {\n\t\t\t// Ignore the content of one-line comments\n\t\t\tstatus.i = status.source.indexOf(\"\\n\", status.i) + 1;\n\t\t} else if (accept(\"/*\", status)) {\n\t\t\t// Ignore the content of block comments\n\t\t\tstatus.i = status.source.indexOf(\"*/\", status.i) + 2;\n\t\t} else {\n\t\t\tstatus.i += 1;\n\t\t}\n\t}\n\treturn \"\";\n}\n\n/**\n * Groups the control node into the correct parent e.g. if/else into an if group\n * @param node The control node\n * @param parentNode The parent node\n */\nfunction wrangleControlNode(node: ControlNode, parentNode: ElementNode | ControlNode) {\n\t// Group\n\t// * if/else into an if group\n\t// * for into a for group\n\t// * switch into a switch group (cases will have the correct parent)\n\t// * await/then/catch into an await group\n\t// * replace into a replace group\n\t// * html into a html group\n\tif (node.operation === \"@if\") {\n\t\tconst ifGroup: ControlNode = {\n\t\t\ttype: \"control\",\n\t\t\toperation: \"@if group\",\n\t\t\tstatement: \"\",\n\t\t\tchildren: [node],\n\t\t};\n\t\tparentNode.children.push(ifGroup);\n\t} else if (node.operation === \"@else\") {\n\t\tif (/^else\\s+if/.test(node.statement)) {\n\t\t\tnode.operation = \"@else if\";\n\t\t}\n\t\tfor (let i = parentNode.children.length - 1; i >= 0; i--) {\n\t\t\tconst lastChild = parentNode.children[i];\n\t\t\t// TODO: Break if it's an element, do more checking\n\t\t\tif (isControlNode(lastChild) && lastChild.operation === \"@if group\") {\n\t\t\t\tlastChild.children.push(node);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\t// @ts-ignore\n\telse if (node.operation === \"@for\") {\n\t\tconst forGroup: ControlNode = {\n\t\t\ttype: \"control\",\n\t\t\toperation: \"@for group\",\n\t\t\tstatement: \"\",\n\t\t\tchildren: [node],\n\t\t};\n\t\tparentNode.children.push(forGroup);\n\t}\n\t// @ts-ignore\n\telse if (node.operation === \"@switch\") {\n\t\tnode.operation = \"@switch group\";\n\t\tparentNode.children.push(node);\n\t} else if (node.operation === \"@await\") {\n\t\tconst awaitGroup: ControlNode = {\n\t\t\ttype: \"control\",\n\t\t\toperation: \"@await group\",\n\t\t\tstatement: \"\",\n\t\t\tchildren: [node],\n\t\t};\n\t\tparentNode.children.push(awaitGroup);\n\t} else if (node.operation === \"@then\" || node.operation === \"@catch\") {\n\t\tfor (let i = parentNode.children.length - 1; i >= 0; i--) {\n\t\t\tconst lastChild = parentNode.children[i];\n\t\t\t// TODO: Break if it's an element, do more checking\n\t\t\tif (isControlNode(lastChild) && lastChild.operation === \"@await group\") {\n\t\t\t\tlastChild.children.push(node);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else if (node.operation === \"@replace\") {\n\t\tconst replaceGroup: ControlNode = {\n\t\t\ttype: \"control\",\n\t\t\toperation: \"@replace group\",\n\t\t\tstatement: \"\",\n\t\t\tchildren: [node],\n\t\t};\n\t\tparentNode.children.push(replaceGroup);\n\t} else if (node.operation === \"@html\") {\n\t\tconst htmlGroup: ControlNode = {\n\t\t\ttype: \"control\",\n\t\t\toperation: \"@html group\",\n\t\t\tstatement: \"\",\n\t\t\tchildren: [node],\n\t\t};\n\t\tparentNode.children.push(htmlGroup);\n\t} else {\n\t\tparentNode.children.push(node);\n\t}\n}\n\n/**\n * Parses control branches that don't start with an @ symbol e.g. else or case\n * @param status The parse status\n * @param parentNode The parent node\n */\nfunction parseControlBranches(status: ParseStatus, parentNode: ElementNode | ControlNode) {\n\t// Look ahead and see if we have another control statement\n\t// NOTE: We could be more strict here (e.g. we could check that an else is\n\t// after an if), but for now we are just leaving it to the JS parser\n\tlet gotAnotherBranch = true;\n\twhile (gotAnotherBranch) {\n\t\tlet start = status.i;\n\t\tstatus.i += 1;\n\t\tconsumeSpace(status);\n\t\tif (\n\t\t\taccept(\"else\", status, false) ||\n\t\t\taccept(\"case\", status, false) ||\n\t\t\taccept(\"default\", status, false) ||\n\t\t\taccept(\"then\", status, false) ||\n\t\t\taccept(\"catch\", status, false)\n\t\t) {\n\t\t\tparseControl(status, parentNode);\n\t\t} else {\n\t\t\tgotAnotherBranch = false;\n\t\t\tstatus.i = start;\n\t\t}\n\t}\n}\n","/**\n * Checks whether the supplied character is a alpha-numeric\n *\n * @param text The string to check\n * @param index The index of the character in the string\n *\n * @returns True if the supplied character is alpha-numeric\n */\nexport default function isAlphaNumericChar(text: string, index: number): boolean {\n\tlet code = text.charCodeAt(index);\n\treturn (\n\t\t// 0-9\n\t\t(code > 47 && code < 58) ||\n\t\t// A-Z\n\t\t(code > 64 && code < 91) ||\n\t\t// a-z\n\t\t(code > 96 && code < 123)\n\t);\n}\n","import { type ParseStatus } from \"../ParseStatus\";\nimport isAlphaNumericChar from \"./isAlphaNumericChar\";\n\n/**\n * Consumes alpha-numeric characters and advances the current parse position to\n * before the next non-alpha character\n *\n * @param status The parse status\n *\n * @returns The string of alpha-numeric characters from the current parse position\n * to the next non-alpha character\n */\nexport default function consumeAlphaNumeric(status: ParseStatus): string {\n\tconst start = status.i;\n\tfor (status.i; status.i < status.source.length; status.i++) {\n\t\tif (!isAlphaNumericChar(status.source, status.i)) {\n\t\t\treturn status.source.substring(start, status.i);\n\t\t}\n\t}\n\treturn \"\";\n}\n","import { type ParseStatus } from \"../ParseStatus\";\n\n/**\n * Consumes characters until one of the characters in the supplied string is\n * found. The parse position will be advanced to before the found character\n *\n * @param chars The characters to match\n * @param status The parse status\n *\n * @returns The string of characters from the current parse position to the\n * found character\n */\nexport default function consumeUntil(chars: string, status: ParseStatus): string {\n\tconst start = status.i;\n\tfor (status.i; status.i < status.source.length; status.i++) {\n\t\tif (chars.includes(status.source[status.i])) {\n\t\t\treturn status.source.substring(start, status.i);\n\t\t}\n\t}\n\treturn \"\";\n}\n","import { type Attribute } from \"../types/nodes/Attribute\";\nimport { type ElementNode } from \"../types/nodes/ElementNode\";\nimport { type ParseStatus } from \"./ParseStatus\";\nimport parseInlineScript from \"./parseInlineScript\";\nimport accept from \"./utils/accept\";\nimport consumeAlphaNumeric from \"./utils/consumeAlphaNumeric\";\nimport consumeSpace from \"./utils/consumeSpace\";\nimport consumeUntil from \"./utils/consumeUntil\";\n\nexport default function parseTag(status: ParseStatus): ElementNode {\n\taccept(\"<\", status);\n\n\tlet closeTag = accept(\"/\", status);\n\n\tconsumeSpace(status);\n\n\tlet special = accept(\":\", status);\n\tlet tagName = consumeAlphaNumeric(status);\n\tif (special) {\n\t\ttagName = \":\" + tagName;\n\t}\n\tif (closeTag) {\n\t\ttagName = \"/\" + tagName;\n\t}\n\n\tconsumeSpace(status);\n\n\tlet attributes = parseTagAttributes(status);\n\n\tlet selfClosed = false;\n\tif (accept(\"/>\", status)) {\n\t\tselfClosed = true;\n\t\t// Actually, it is kind of convenient to self-close things, and more consistent with\n\t\t// component tags...\n\t\t//if (!voidTags.includes(tagName)) {\n\t\t//\taddError(status, `Self-closed non-void element: ${tagName}`, start);\n\t\t//}\n\t} else {\n\t\taccept(\">\", status);\n\t}\n\n\tif (closeTag) {\n\t\tselfClosed = true;\n\t}\n\n\treturn {\n\t\ttype: special ? \"special\" : \"element\",\n\t\ttagName,\n\t\tselfClosed: selfClosed || undefined,\n\t\tclosed: selfClosed || undefined,\n\t\tattributes,\n\t\tchildren: [],\n\t};\n}\n\nfunction parseTagAttributes(status: ParseStatus): Attribute[] {\n\tlet attributes: Attribute[] = [];\n\twhile (status.i < status.source.length) {\n\t\tconsumeSpace(status);\n\t\tif (accept(\"@//\", status)) {\n\t\t\t// Swallow one-line comments\n\t\t\tstatus.i = status.source.indexOf(\"\\n\", status.i) + 1;\n\t\t} else if (accept(\"@/*\", status)) {\n\t\t\t// Swallow block comments\n\t\t\tstatus.i = status.source.indexOf(\"*/\", status.i) + 2;\n\t\t} else if (accept(\"/>\", status, false) || accept(\">\", status, false)) {\n\t\t\t// That's the end of the attributes\n\t\t\tbreak;\n\t\t} else {\n\t\t\tconst attribute = parseAttribute(status);\n\t\t\tattributes.push(attribute);\n\t\t}\n\t}\n\treturn attributes;\n}\n\nfunction parseAttribute(status: ParseStatus): Attribute {\n\tlet name = consumeUntil(\"= \\t\\r\\n/>\", status);\n\tlet value: string | undefined = undefined;\n\tconsumeSpace(status);\n\tif (accept(\"=\", status)) {\n\t\tconsumeSpace(status);\n\t\tvalue = parseAttributeValue(status);\n\t}\n\treturn { name, value };\n}\n\nfunction parseAttributeValue(status: ParseStatus): string {\n\tif (accept('\"', status)) {\n\t\tconst value = consumeUntil('\"', status);\n\t\taccept('\"', status);\n\t\treturn `\"${value}\"`;\n\t} else if (accept(\"'\", status)) {\n\t\tconst value = consumeUntil(\"'\", status);\n\t\taccept(\"'\", status);\n\t\treturn `'${value}'`;\n\t} else if (accept(\"{\", status)) {\n\t\tconst value = parseInlineScript(status);\n\t\treturn `{${value}}`;\n\t} else {\n\t\tlet value = consumeUntil(\" \\t\\r\\n>\", status);\n\t\t// Check whether we've landed at /> and if so, rewind\n\t\tif (status.source.substring(status.i - 1, status.i + 1) === \"/>\") {\n\t\t\tvalue = value.substring(0, value.length - 1);\n\t\t\tstatus.i -= 1;\n\t\t}\n\t\treturn value;\n\t}\n}\n","import { type ElementNode } from \"../types/nodes/ElementNode\";\nimport { type TemplateNode } from \"../types/nodes/TemplateNode\";\nimport isSpecialNode from \"../types/nodes/isSpecialNode\";\n\n/**\n * Moves any child nodes that aren't already in a <:fill> node into a default\n * <:fill> node\n */\nexport default function slottifyChildNodes(node: ElementNode): void {\n\tconst nonFillNodes = node.children.filter((c) => !isFillNode(c));\n\t// TODO: Not if it's only spaces??\n\tif (nonFillNodes.length) {\n\t\tlet defaultFillNode = node.children.find(\n\t\t\t(n) => isFillNode(n) && !n.attributes.find((a) => a.name === \"name\"),\n\t\t) as ElementNode | undefined;\n\t\tif (!defaultFillNode) {\n\t\t\tdefaultFillNode = {\n\t\t\t\ttype: \"special\",\n\t\t\t\ttagName: \":fill\",\n\t\t\t\tattributes: [],\n\t\t\t\tchildren: nonFillNodes,\n\t\t\t};\n\t\t\tnode.children.unshift(defaultFillNode);\n\t\t}\n\t}\n\tnode.children = node.children.filter((c) => isFillNode(c));\n}\n\nfunction isFillNode(n: TemplateNode): n is ElementNode {\n\treturn isSpecialNode(n) && n.tagName === \":fill\";\n}\n","import { type ControlNode } from \"../types/nodes/ControlNode\";\nimport { type ElementNode } from \"../types/nodes/ElementNode\";\nimport { type TextNode } from \"../types/nodes/TextNode\";\nimport isSpecialNode from \"../types/nodes/isSpecialNode\";\nimport isTextNode from \"../types/nodes/isTextNode\";\nimport trimMatched from \"../utils/trimMatched\";\nimport voidTags from \"../utils/voidTags\";\nimport { type ParseStatus } from \"./ParseStatus\";\nimport { type ParseComponentStatus } from \"./ParseStatus\";\nimport addSpaceElement from \"./addSpaceElement\";\nimport parseControl from \"./parseControl\";\nimport parseTag from \"./parseTag\";\nimport slottifyChildNodes from \"./slottifyChildNodes\";\nimport accept from \"./utils/accept\";\nimport addError from \"./utils/addError\";\nimport consumeAlphaNumeric from \"./utils/consumeAlphaNumeric\";\nimport consumeSpace from \"./utils/consumeSpace\";\nimport isSpaceChar from \"./utils/isSpaceChar\";\n\nexport default function parseElement(status: ParseStatus): ElementNode {\n\tconst start = status.i;\n\n\tconst element = parseTag(status);\n\n\tif (element.tagName.startsWith(\"/\")) {\n\t\taddError(status, `Non matching close tag: ${element.tagName.substring(1)}`, start);\n\t\treturn element;\n\t}\n\n\tif (voidTags.includes(element.tagName)) {\n\t\tcheckVoidElement(status, element);\n\t}\n\n\tif (!element.selfClosed && !voidTags.includes(element.tagName)) {\n\t\tconst current = status.components[status.components.length - 1];\n\t\tcurrent.stack ??= [];\n\t\tcurrent.stack.push(element);\n\n\t\t// Get the children\n\t\twhile (status.i < status.source.length) {\n\t\t\taddSpaceElement(element, status);\n\t\t\tif (accept(\"}\", status, false)) {\n\t\t\t\t// That's the rendering done\n\t\t\t\tbreak;\n\t\t\t} else if (accept(\"<!--\", status)) {\n\t\t\t\t// It's a comment, swallow it\n\t\t\t\tstatus.i = status.source.indexOf(\"-->\", status.i) + 3;\n\t\t\t} else if (accept(\"@//\", status)) {\n\t\t\t\t// Swallow one-line comments\n\t\t\t\tstatus.i = status.source.indexOf(\"\\n\", status.i) + 1;\n\t\t\t} else if (accept(\"@/*\", status)) {\n\t\t\t\t// Swallow block comments\n\t\t\t\tstatus.i = status.source.indexOf(\"*/\", status.i) + 2;\n\t\t\t} else if (accept(\"</\", status, false)) {\n\t\t\t\t// It's a close tag, so we're done here\n\t\t\t\tif (checkCloseTag(status, element, current)) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else if (accept(\"<\", status, false)) {\n\t\t\t\t// It's a child element\n\t\t\t\tconst child = parseElement(status);\n\t\t\t\telement.children.push(child);\n\t\t\t} else if (accept(\"@\", status, false)) {\n\t\t\t\t// It's a control statement\n\t\t\t\tparseControl(status, element);\n\t\t\t} else {\n\t\t\t\t// It's text content\n\t\t\t\tparseText(status, element);\n\t\t\t}\n\t\t}\n\n\t\tcurrent.stack.pop();\n\t}\n\n\t// If this is a component element, add a default <:fill> node\n\t// HACK: For now, we just treat all tags starting with a capital as components\n\tif (!element.tagName.startsWith(\":\") && /[A-Z]/.test(element.tagName[0])) {\n\t\telement.type = \"component\";\n\t\tslottifyChildNodes(element);\n\t}\n\n\tif (isSpecialNode(element)) {\n\t\tif (element.tagName === \":slot\") {\n\t\t\t// If this is a <:slot> element, add a <:fill> node for its fallback\n\t\t\t// content. Anchors will be created for <:slot> nodes and fragments will\n\t\t\t// be created for the <:fill> content\n\t\t\tslottifyChildNodes(element);\n\n\t\t\t// Add it to the component's slots collection\n\t\t\tconst current = status.components[status.components.length - 1];\n\t\t\tcurrent.slotProps ??= [];\n\t\t\tcurrent.slotProps.push(element.attributes.find((a) => a.name === \"name\")?.name ?? \"default\");\n\t\t} else if (element.tagName === \":component\") {\n\t\t\tconst selfAttribute = element.attributes.find((a) => a.name === \"self\");\n\t\t\tif (selfAttribute && selfAttribute.value) {\n\t\t\t\telement.type = \"component\";\n\t\t\t\tslottifyChildNodes(element);\n\n\t\t\t\tconst selfValue = trimMatched(selfAttribute.value, \"{\", \"}\");\n\t\t\t\tconst replace: ControlNode = {\n\t\t\t\t\ttype: \"control\",\n\t\t\t\t\toperation: \"@replace\",\n\t\t\t\t\tstatement: selfValue,\n\t\t\t\t\tchildren: [element],\n\t\t\t\t};\n\t\t\t\tconst replaceGroup: ControlNode = {\n\t\t\t\t\ttype: \"control\",\n\t\t\t\t\toperation: \"@replace group\",\n\t\t\t\t\tstatement: selfValue,\n\t\t\t\t\tchildren: [replace],\n\t\t\t\t};\n\n\t\t\t\treturn replaceGroup as any;\n\t\t\t} else {\n\t\t\t\taddError(status, \":component element must have a self attribute\", start);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!element.closed && !voidTags.includes(element.tagName)) {\n\t\taddError(status, `Unclosed non-void element: ${element.tagName}`, start);\n\t}\n\n\treturn element;\n}\n\nfunction parseText(status: ParseStatus, element: ElementNode) {\n\tconst start = status.i;\n\t// It ends at the next element, or at the next control statement, or at the end of\n\t// the render\n\t// But only if the control statement is after a newline, so we don't mess with\n\t// emails etc. This may need more finessing\n\tlet end = -1;\n\tfor (let j = status.i; j < status.source.length; j++) {\n\t\tif (status.source[j] === \"}\") {\n\t\t\t// That's the rendering done\n\t\t\tend = j;\n\t\t} else if (status.source[j] === \"{\") {\n\t\t\t// Skip reactive content\n\t\t\tlet level = 0;\n\t\t\tfor (let k = j; k < status.source.length; k++) {\n\t\t\t\tconst char = status.source[k];\n\t\t\t\tconst nextChar = status.source[k + 1];\n\t\t\t\tif (char === \"/\" && nextChar === \"/\") {\n\t\t\t\t\t// Skip one-line comments\n\t\t\t\t\tk = status.source.indexOf(\"\\n\", k);\n\t\t\t\t} else if (char === \"/\" && nextChar === \"*\") {\n\t\t\t\t\t// Skip block comments\n\t\t\t\t\tk = status.source.indexOf(\"*/\", k) + 1;\n\t\t\t\t} else if (char === '\"' || char === \"'\") {\n\t\t\t\t\t// Skip string contents\n\t\t\t\t\tfor (let l = k + 1; l < status.source.length; l++) {\n\t\t\t\t\t\tif (status.source[l] === char && status.source[l - 1] !== \"\\\\\") {\n\t\t\t\t\t\t\tk = l;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (char === \"`\") {\n\t\t\t\t\t// Skip possibly interpolated string contents\n\t\t\t\t\tlet level2 = 0;\n\t\t\t\t\tfor (let l = k + 1; l < status.source.length; l++) {\n\t\t\t\t\t\tif (status.source[l] === char && status.source[l - 1] !== \"\\\\\" && level2 === 0) {\n\t\t\t\t\t\t\tk = l;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t} else if (status.source[l] === \"{\" && (level2 > 0 || status.source[l - 1] === \"$\")) {\n\t\t\t\t\t\t\tlevel2 += 1;\n\t\t\t\t\t\t} else if (status.source[l] === \"}\" && level2 > 0) {\n\t\t\t\t\t\t\tlevel2 -= 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (char === \"{\") {\n\t\t\t\t\tlevel += 1;\n\t\t\t\t} else if (char === \"}\") {\n\t\t\t\t\tlevel -= 1;\n\t\t\t\t\tif (level === 0) {\n\t\t\t\t\t\tj = k;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (status.source[j] === \"<\") {\n\t\t\tend = j;\n\t\t} else if (status.source[j] === \"@\") {\n\t\t\t// Backtrack\n\t\t\tfor (let k = j - 1; k > status.i; k--) {\n\t\t\t\tif (status.source[k] === \"\\n\") {\n\t\t\t\t\tend = j;\n\t\t\t\t\tbreak;\n\t\t\t\t} else if (!isSpaceChar(status.source, k)) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (end !== -1) {\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (end !== -1) {\n\t\tconst content = status.source.substring(start, end).trimEnd();\n\t\tconst spaceContent = status.source.substring(start + content.length, end);\n\t\tif (content || spaceContent) {\n\t\t\tconst previousNode = element.children[element.children.length - 1];\n\t\t\tif (previousNode && isTextNode(previousNode)) {\n\t\t\t\tpreviousNode.content += content + spaceContent;\n\t\t\t} else {\n\t\t\t\tconst text: TextNode = {\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\tcontent: content + spaceContent,\n\t\t\t\t};\n\t\t\t\telement.children.push(text);\n\t\t\t}\n\t\t}\n\t\tstatus.i = end;\n\t} else {\n\t\tstatus.i += 1;\n\t}\n}\n\nfunction checkVoidElement(status: ParseStatus, element: ElementNode) {\n\tlet i = status.i;\n\n\tconsumeSpace(status);\n\tif (accept(\"</\", status)) {\n\t\tconsumeSpace(status);\n\t\tif (accept(element.tagName, status)) {\n\t\t\taddError(status, `Closed void element: ${element.tagName}`, i);\n\t\t\tconsumeSpace(status);\n\t\t\taccept(\">\", status);\n\t\t\treturn;\n\t\t}\n\t}\n\n\tstatus.i = i;\n}\n\nfunction checkCloseTag(status: ParseStatus, element: ElementNode, current: ParseComponentStatus) {\n\tconst start = status.i;\n\n\taccept(\"</\", status);\n\tconsumeSpace(status);\n\tlet special = accept(\":\", status);\n\tlet closingTagName = consumeAlphaNumeric(status);\n\tif (special) {\n\t\tclosingTagName = \":\" + closingTagName;\n\t}\n\tconsumeSpace(status);\n\taccept(\">\", status);\n\n\tlet found = false;\n\tif (current.stack) {\n\t\tfor (let i = current.stack.length - 1; i >= 0; i--) {\n\t\t\tif (closingTagName === current.stack[i].tagName) {\n\t\t\t\tcurrent.stack[i].closed = true;\n\t\t\t\tfound = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tif (!found) {\n\t\taddError(\n\t\t\tstatus,\n\t\t\t`Non matching close tag: ${closingTagName} (expected ${element.tagName})`,\n\t\t\tstart,\n\t\t);\n\t}\n\n\treturn found;\n}\n","import { type ParseStatus } from \"./ParseStatus\";\nimport parseElement from \"./parseElement\";\nimport accept from \"./utils/accept\";\nimport addError from \"./utils/addError\";\n\nexport default function parseMarkup(status: ParseStatus, source: string): void {\n\tconst current = status.components.at(-1);\n\tif (!current) return;\n\n\twhile (status.i < source.length) {\n\t\tif (accept(\"}\", status, false)) {\n\t\t\t// That's the rendering done\n\t\t\treturn;\n\t\t} else if (accept(\"<!--\", status)) {\n\t\t\t// It's a comment, swallow it\n\t\t\tstatus.i = status.source.indexOf(\"-->\", status.i) + 3;\n\t\t} else if (accept(\"@//\", status)) {\n\t\t\t// Swallow one-line comments\n\t\t\tstatus.i = status.source.indexOf(\"\\n\", status.i) + 1;\n\t\t} else if (accept(\"@/*\", status)) {\n\t\t\t// Swallow block comments\n\t\t\tstatus.i = status.source.indexOf(\"*/\", status.i) + 2;\n\t\t} else if (accept(\"<\", status, false)) {\n\t\t\t// Parse the element\n\t\t\tconst start = status.i;\n\t\t\tconst element = parseElement(status);\n\t\t\tif (current.markup === undefined) {\n\t\t\t\tcurrent.markup = element;\n\t\t\t} else if (!element.tagName.startsWith(\"/\")) {\n\t\t\t\taddError(status, `Multiple top-level elements: ${element.tagName}`, start);\n\t\t\t}\n\t\t} else {\n\t\t\tstatus.i += 1;\n\t\t}\n\t}\n}\n","// Adapted from https://github.com/sveltejs/svelte\n\nconst returnRegex = /\\r/g;\n\nexport default function hash(input: string): string {\n\tinput = input.replace(returnRegex, \"\");\n\tlet hash = 5381;\n\tlet i = input.length;\n\twhile (i--) {\n\t\thash = ((hash << 5) - hash) ^ input.charCodeAt(i);\n\t}\n\treturn (hash >>> 0).toString(36);\n}\n","import { type ParseStatus } from \"../ParseStatus\";\nimport addError from \"./addError\";\n\n/**\n * Checks whether the source at the current parse position matches the supplied\n * string and if not, adds an error to the parse status\n *\n * @param value The string to check\n * @param status The parse status\n * @param advance (Optional) If true, advances the parse position past the\n * checked string (defaults to true)\n *\n * @returns True if the supplied string was found at the current parse position\n */\nexport default function expect(value: string, status: ParseStatus, advance = true): boolean {\n\tif (status.i < status.source.length) {\n\t\tif (status.source.substring(status.i, status.i + value.length) == value) {\n\t\t\tstatus.i += advance ? value.length : 0;\n\t\t\treturn true;\n\t\t} else {\n\t\t\taddError(status, `Expected ${value}`);\n\t\t}\n\t} else {\n\t\taddError(status, \"Expected token\");\n\t}\n\treturn false;\n}\n","import { type Attribute } from \"../types/styles/Attribute\";\nimport { type StyleBlock } from \"../types/styles/StyleBlock\";\nimport hash from \"../utils/hash\";\nimport { type ParseStatus } from \"./ParseStatus\";\nimport accept from \"./utils/accept\";\nimport consumeSpace from \"./utils/consumeSpace\";\nimport consumeUntil from \"./utils/consumeUntil\";\nimport expect from \"./utils/expect\";\nimport isSpaceChar from \"./utils/isSpaceChar\";\n\nexport default function parseStyles(source: string, status: ParseStatus): void {\n\tconst current = status.components.at(-1);\n\tif (!current) return;\n\n\tcurrent.style = {\n\t\tglobal: false,\n\t\tblocks: [],\n\t\thash: hash(source),\n\t};\n\n\tconst styleStatus: ParseStatus = {\n\t\tsource,\n\t\ti: 0,\n\t\tmarker: 0,\n\t\tlevel: 0,\n\t\timports: [],\n\t\tscript: \"\",\n\t\tcomponents: [],\n\t\terrors: [],\n\t};\n\n\twhile (styleStatus.i < styleStatus.source.length) {\n\t\tif (isSpaceChar(styleStatus.source, styleStatus.i)) {\n\t\t\tconsumeSpace(styleStatus);\n\t\t} else {\n\t\t\tconst block = parseStyleBlock(styleStatus);\n\t\t\tif (block) {\n\t\t\t\tcurrent.style.blocks.push(block);\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tstatus.errors = status.errors.concat(styleStatus.errors);\n}\n\nfunction parseStyleBlock(status: ParseStatus): StyleBlock | undefined {\n\tconst selector = consumeUntil(\"{\", status).trim();\n\tif (expect(\"{\", status)) {\n\t\tconst block: StyleBlock = {\n\t\t\tselector,\n\t\t\tattributes: [],\n\t\t\tchildren: [],\n\t\t};\n\t\tconsumeSpace(status);\n\t\twhile (status.source[status.i] !== \"}\") {\n\t\t\t// HACK: Is it an attribute or a child block?\n\t\t\tlet nextColon = status.source.indexOf(\":\", status.i);\n\t\t\tif (nextColon === -1) nextColon = status.source.length;\n\t\t\tlet nextOpenBrace = status.source.indexOf(\"{\", status.i);\n\t\t\tif (nextOpenBrace === -1) nextOpenBrace = status.source.length;\n\t\t\tif (nextColon < nextOpenBrace) {\n\t\t\t\tconst attribute = parseStyleAttribute(status);\n\t\t\t\tblock.attributes.push(attribute);\n\t\t\t} else if (nextOpenBrace < nextColon) {\n\t\t\t\tconst child = parseStyleBlock(status);\n\t\t\t\tif (child) {\n\t\t\t\t\tblock.children.push(child);\n\t\t\t\t} else {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn block;\n\t\t\t}\n\t\t\tconsumeSpace(status);\n\t\t}\n\t\taccept(\"}\", status);\n\n\t\treturn block;\n\t}\n}\n\nfunction parseStyleAttribute(status: ParseStatus): Attribute {\n\tconst name = consumeUntil(\":\", status).trim();\n\taccept(\":\", status);\n\tconst value = consumeUntil(\";\", status).trim();\n\taccept(\";\", status);\n\treturn {\n\t\tname,\n\t\tvalue,\n\t};\n}\n","import { type ParentNode } from \"./ParentNode\";\nimport { type TemplateNode } from \"./TemplateNode\";\n\nexport default function isParentNode(node: TemplateNode): node is ParentNode {\n\treturn \"children\" in node;\n}\n","import { type TemplateNode } from \"../types/nodes/TemplateNode\";\nimport isElementNode from \"../types/nodes/isElementNode\";\nimport isParentNode from \"../types/nodes/isParentNode\";\nimport { type StyleBlock } from \"../types/styles/StyleBlock\";\nimport trimQuotes from \"../utils/trimQuotes\";\nimport { type ParseStatus } from \"./ParseStatus\";\n\nexport default function scopeStyles(status: ParseStatus): void {\n\tlet selectors: string[] = [];\n\tfor (let component of status.components) {\n\t\tif (component.style && component.markup) {\n\t\t\tfor (let block of component.style.blocks) {\n\t\t\t\tcollectStyleSelectors(block, selectors);\n\t\t\t}\n\t\t\tscopeStylesOnNode(component.markup, selectors);\n\t\t}\n\t}\n}\n\nfunction scopeStylesOnNode(node: TemplateNode, selectors: string[]) {\n\tif (isElementNode(node)) {\n\t\tlet scopeStyles = selectors.includes(node.tagName);\n\t\tif (!scopeStyles) {\n\t\t\tfor (let a of node.attributes) {\n\t\t\t\tif (a.name === \"class\" || a.name === \":class\") {\n\t\t\t\t\tscopeStyles = true;\n\t\t\t\t} else if (a.name === \"id\" && a.value) {\n\t\t\t\t\tscopeStyles = selectors.includes(`#${trimQuotes(a.value)}`);\n\t\t\t\t} else if (a.name === \"class\" && a.value) {\n\t\t\t\t\t// TODO: Never getting here?\n\t\t\t\t\tscopeStyles = selectors.includes(`.${trimQuotes(a.value)}`);\n\t\t\t\t}\n\t\t\t\tif (scopeStyles) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tnode.scopeStyles = scopeStyles;\n\t}\n\n\tif (isParentNode(node)) {\n\t\tfor (let child of node.children) {\n\t\t\tscopeStylesOnNode(child, selectors);\n\t\t}\n\t}\n}\n\nfunction collectStyleSelectors(block: StyleBlock, selectors: string[]) {\n\t// HACK: We should be collecting the actual selectors and then checking\n\t// attributes, parents, children, siblings etc\n\tfor (let s of block.selector.split(/[\\s*,>+~]/)) {\n\t\tselectors.push(s);\n\t}\n}\n","import { type TemplateComponent } from \"../../types/TemplateComponent\";\nimport { type ParseResult } from \"../types/ParseResult\";\nimport isSpaceNode from \"../types/nodes/isSpaceNode\";\nimport trimQuotes from \"../utils/trimQuotes\";\nimport { type ParseStatus } from \"./ParseStatus\";\nimport parseMarkup from \"./parseMarkup\";\nimport parseStyleElement from \"./parseStyles\";\nimport scopeStyles from \"./scopeStyles\";\nimport accept from \"./utils/accept\";\nimport addError from \"./utils/addError\";\nimport consumeAlphaNumeric from \"./utils/consumeAlphaNumeric\";\nimport consumeSpace from \"./utils/consumeSpace\";\n\nexport default function parseCode(source: string): ParseResult {\n\tconst status: ParseStatus = {\n\t\tsource,\n\t\ti: 0,\n\t\tmarker: 0,\n\t\tlevel: 0,\n\t\timports: [],\n\t\tscript: \"\",\n\t\tcomponents: [],\n\t\terrors: [],\n\t};\n\n\tfor (status.i; status.i < source.length; status.i++) {\n\t\tif (consumeScriptComments(status)) {\n\t\t\t// Keep going\n\t\t} else if (status.source[status.i] === \"{\") {\n\t\t\tstatus.level += 1;\n\t\t} else if (status.source[status.i] === \"}\") {\n\t\t\tstatus.level -= 1;\n\t\t\tif (status.level === 0) {\n\t\t\t\tparseComponentEnd(status);\n\t\t\t}\n\t\t} else if (accept(\"function\", status)) {\n\t\t\t// If the function name starts with a capital, parse it as a component\n\t\t\tif (consumeSpace(status)) {\n\t\t\t\tif (/[A-Z]/.test(source[status.i])) {\n\t\t\t\t\tparseComponentStart(status);\n\t\t\t\t} else {\n\t\t\t\t\t// Unconsume the last space\n\t\t\t\t\tstatus.i--;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (accept(\"const\", status)) {\n\t\t\t// If it's a function and its name starts with a capital, parse it as a component\n\t\t\tif (consumeSpace(status)) {\n\t\t\t\tif (/[A-Z]/.test(source[status.i])) {\n\t\t\t\t\tconst start = status.i;\n\t\t\t\t\tconsumeAlphaNumeric(status);\n\t\t\t\t\tconsumeSpace(status);\n\t\t\t\t\tif (accept(\"=\", status)) {\n\t\t\t\t\t\tconsumeSpace(status);\n\t\t\t\t\t\tif (accept(\"(\", status, false)) {\n\t\t\t\t\t\t\tstatus.i = start;\n\t\t\t\t\t\t\tparseComponentStart(status);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Unconsume the last space\n\t\t\t\t\tstatus.i--;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (accept(\"export\", status)) {\n\t\t\t// If it's an anonymous default export function, parse it as a component\n\t\t\tconst start = status.i;\n\t\t\tif (\n\t\t\t\tconsumeSpace(status) &&\n\t\t\t\taccept(\"default\", status) &&\n\t\t\t\tconsumeSpace(status) &&\n\t\t\t\taccept(\"(\", status, false)\n\t\t\t) {\n\t\t\t\tparseComponentStart(status);\n\t\t\t} else {\n\t\t\t\tstatus.i = start;\n\t\t\t}\n\t\t} else if (accept(\"@render\", status, false)) {\n\t\t\tparseComponentRender(status);\n\t\t} else if (accept(\"@style\", status, false)) {\n\t\t\tparseComponentStyle(status);\n\t\t}\n\t}\n\tstatus.script += source.substring(status.marker, source.length);\n\n\tscopeStyles(status);\n\n\tconst ok = !status.errors.length;\n\tif (!ok) {\n\t\tstatus.errors = status.errors.sort((a, b) => a.start - b.start);\n\t}\n\n\treturn {\n\t\tok,\n\t\terrors: status.errors,\n\t\ttemplate: ok\n\t\t\t? {\n\t\t\t\t\timports: status.imports,\n\t\t\t\t\tscript: status.script,\n\t\t\t\t\tcomponents: status.components.map((c) => {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tstart: c.start,\n\t\t\t\t\t\t\tname: c.name,\n\t\t\t\t\t\t\tdefault: c.default,\n\t\t\t\t\t\t\tparams: c.params,\n\t\t\t\t\t\t\tmarkup: c.markup\n\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\ttype: \"root\",\n\t\t\t\t\t\t\t\t\t\tchildren: [c.markup],\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\tstyle: c.style,\n\t\t\t\t\t\t\tprops: c.props,\n\t\t\t\t\t\t\tcontextProps: c.contextProps,\n\t\t\t\t\t\t\tslotProps: c.slotProps,\n\t\t\t\t\t\t} satisfies TemplateComponent;\n\t\t\t\t\t}),\n\t\t\t\t}\n\t\t\t: undefined,\n\t};\n}\n\nfunction parseComponentStart(status: ParseStatus) {\n\tlet source = status.source.substring(0, status.i);\n\tlet def = /export\\s+default\\s+(function\\s+|const\\s+)*$/.test(source);\n\tlet isConst = /const\\s+$/.test(source);\n\tlet isAnon = /export default\\s+$/.test(source);\n\n\tstatus.components.push({\n\t\tstart: status.i,\n\t\tname: consumeAlphaNumeric(status),\n\t\tdefault: def,\n\t});\n\tconst current = status.components.at(-1);\n\tif (!current) return;\n\n\tlet start = -1;\n\tlet end = -1;\n\tlet level = 0;\n\tfor (status.i; status.i < status.source.length; status.i++) {\n\t\tconst char = status.source[status.i];\n\t\tif (consumeScriptComments(status)) {\n\t\t\t// Keep going\n\t\t} else if (char === \"(\") {\n\t\t\tlevel += 1;\n\t\t\tif (start === -1) {\n\t\t\t\tstart = status.i + 1;\n\t\t\t}\n\t\t} else if (char === \")\") {\n\t\t\tlevel -= 1;\n\t\t\tif (level === 0) {\n\t\t\t\tend = status.i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tstatus.script += status.source.substring(status.marker, start) + \"/* @params */\";\n\n\tcurrent.params = status.source.substring(start, end).trim() || undefined;\n\n\tstatus.marker = end;\n\tstatus.i = status.marker;\n\n\taccept(\")\", status);\n\tconsumeSpace(status);\n\n\tif (isConst || isAnon) {\n\t\taccept(\"=>\", status);\n\t\tconsumeSpace(status);\n\t}\n\n\taccept(\"{\", status);\n\tstatus.level += 1;\n\n\tconst space = consumeSpace(status);\n\tstatus.script += status.source.substring(status.marker, status.i) + \"/* @start */\" + space;\n\n\tstatus.marker = status.i;\n\tstatus.i -= 1;\n}\n\nfunction parseComponentRender(status: ParseStatus) {\n\tconst current = status.components.at(-1);\n\tif (!current) return;\n\n\tif (current.markup) {\n\t\taddError(status, `Multiple @render sections`, status.i);\n\t}\n\n\tstatus.script += status.source.substring(status.marker, status.i) + \"/* @render */\";\n\n\taccept(\"@render\", status);\n\tconsumeSpace(status);\n\tif (accept(\"{\", status)) {\n\t\tparseMarkup(status, status.source);\n\t\taccept(\"}\", status);\n\t}\n\n\tstatus.marker = status.i;\n}\n\nfunction parseComponentStyle(status: ParseStatus) {\n\tconst current = status.components.at(-1);\n\tif (!current) return;\n\n\tif (current.style) {\n\t\taddError(status, `Multiple @style sections`, status.i);\n\t}\n\n\tstatus.script += status.source.substring(status.marker, status.i);\n\n\tlet start = -1;\n\tlet end = status.source.length;\n\tlet level = 0;\n\t// HACK: strip the comments out of styles only\n\tlet styleSource = \"\";\n\tfor (; status.i < status.source.length; status.i++) {\n\t\tconst char = status.source[status.i];\n\t\tconst nextChar = status.source[status.i + 1];\n\t\tif (char === \"/\" && nextChar === \"/\") {\n\t\t\t// Skip one-line comments\n\t\t\tstatus.i = status.source.indexOf(\"\\n\", status.i);\n\t\t} else if (char === \"/\" && nextChar === \"*\") {\n\t\t\t// Skip block comments\n\t\t\tstatus.i = status.source.indexOf(\"*/\", status.i) + 1;\n\t\t} else if (char === '\"' || char === \"'\") {\n\t\t\tstyleSource += char;\n\t\t\t// Skip string contents\n\t\t\tfor (let j = status.i + 1; j < status.source.length; j++) {\n\t\t\t\tstyleSource += status.source[j];\n\t\t\t\tif (status.source[j] === char && status.source[j - 1] !== \"\\\\\") {\n\t\t\t\t\tstatus.i = j;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (char === \"`\") {\n\t\t\tstyleSource += char;\n\t\t\t// Skip possibly interpolated string contents\n\t\t\tlet level2 = 0;\n\t\t\tfor (let j = status.i + 1; j < status.source.length; j++) {\n\t\t\t\tstyleSource += status.source[j];\n\t\t\t\tif (status.source[j] === char && status.source[j - 1] !== \"\\\\\" && level2 === 0) {\n\t\t\t\t\tstatus.i = j;\n\t\t\t\t\tbreak;\n\t\t\t\t} else if (status.source[j] === \"{\" && (level2 > 0 || status.source[j - 1] === \"$\")) {\n\t\t\t\t\tlevel2 += 1;\n\t\t\t\t} else if (status.source[j] === \"}\" && level2 > 0) {\n\t\t\t\t\tlevel2 -= 1;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (char === \"{\") {\n\t\t\tlevel += 1;\n\t\t\tif (start === -1) {\n\t\t\t\tstart = status.i + 1;\n\t\t\t} else {\n\t\t\t\tstyleSource += char;\n\t\t\t}\n\t\t} else if (char === \"}\") {\n\t\t\tlevel -= 1;\n\t\t\tif (level === 0) {\n\t\t\t\tend = status.i - 1;\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\tstyleSource += char;\n\t\t\t}\n\t\t} else {\n\t\t\tif (start !== -1) {\n\t\t\t\tstyleSource += char;\n\t\t\t}\n\t\t}\n\t}\n\n\tstatus.i = start;\n\tparseStyleElement(styleSource.trim(), status);\n\n\tstatus.i = end + 2;\n\tstatus.marker = status.i;\n}\n\nfunction parseComponentEnd(status: ParseStatus) {\n\tconst current = status.components.at(-1);\n\tif (!current) return;\n\n\tstatus.script += status.source.substring(status.marker, status.i);\n\tif (status.script.endsWith(\"\\n\")) {\n\t\tstatus.script += \"\\t/* @end */\\n\";\n\t} else {\n\t\tstatus.script += \"/* @end */\";\n\t}\n\n\t// Get all usages of $props.name and $props[\"name\"]\n\t// Get all usages of $context.name and $context[\"name\"]\n\tconst componentSource = status.source.substring(current.start || 0, status.i);\n\tcurrent.props = getPropsUsage(componentSource);\n\tcurrent.contextProps = getContextUsage(componentSource);\n\n\t// If the top-level element is <html> and there is whitespace after it,\n\t// delete the whitespace, as that's what browsers seem to do. It may be\n\t// better instead to create whitespace if we don't find it when hydrating...\n\tif (\n\t\tcurrent.markup &&\n\t\tcurrent.markup.tagName === \"html\" &&\n\t\tisSpaceNode(current.markup.children[0])\n\t) {\n\t\tcurrent.markup.children.splice(1, 1);\n\t}\n\n\tstatus.marker = status.i;\n}\n\nfunction getPropsUsage(source: string): string[] | undefined {\n\tconst propsMatches = source.matchAll(/\\$props\\s*(?:\\.([\\d\\w]+)|\\[([^\\]]+)\\])/g);\n\tconst props: string[] = [];\n\tfor (let match of propsMatches) {\n\t\tconst name = trimQuotes(match[1] || match[2]);\n\t\tif (!props.includes(name)) {\n\t\t\tprops.push(name);\n\t\t}\n\t}\n\treturn props.length ? props : undefined;\n}\n\nfunction getContextUsage(source: string): string[] | undefined {\n\tconst contextsMatches = source.matchAll(/\\$context\\s*(?:\\.([\\d\\w]+)|\\[([^\\]]+)\\])/g);\n\tconst contexts: string[] = [];\n\tfor (let match of contextsMatches) {\n\t\tconst name = trimQuotes(match[1] || match[2]);\n\t\tif (!contexts.includes(name)) {\n\t\t\tcontexts.push(name);\n\t\t}\n\t}\n\treturn contexts.length ? contexts : undefined;\n}\n\nfunction consumeScriptComments(status: ParseStatus): boolean {\n\tconst char = status.source[status.i];\n\tconst nextChar = status.source[status.i + 1];\n\tif (char === \"/\" && nextChar === \"/\") {\n\t\t// Skip one-line comments\n\t\tstatus.i = status.source.indexOf(\"\\n\", status.i);\n\t\treturn true;\n\t} else if (char === \"/\" && nextChar === \"*\") {\n\t\t// Skip block comments\n\t\tstatus.i = status.source.indexOf(\"*/\", status.i) + 1;\n\t\treturn true;\n\t} else if (char === '\"' || char === \"'\") {\n\t\t// Skip string contents\n\t\tfor (let j = status.i + 1; j < status.source.length; j++) {\n\t\t\tif (status.source[j] === char && status.source[j - 1] !== \"\\\\\") {\n\t\t\t\tstatus.i = j;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t} else if (char === \"`\") {\n\t\t// Skip possibly interpolated string contents\n\t\tlet level2 = 0;\n\t\tfor (let j = status.i + 1; j < status.source.length; j++) {\n\t\t\tif (status.source[j] === char && status.source[j - 1] !== \"\\\\\" && level2 === 0) {\n\t\t\t\tstatus.i = j;\n\t\t\t\tbreak;\n\t\t\t} else if (status.source[j] === \"{\" && (level2 > 0 || status.source[j - 1] === \"$\")) {\n\t\t\t\tlevel2 += 1;\n\t\t\t} else if (status.source[j] === \"}\" && level2 > 0) {\n\t\t\t\tlevel2 -= 1;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\treturn false;\n}\n","import parseCode from \"./parse/parseCode\";\nimport { type ParseResult } from \"./types/ParseResult\";\n\n/**\n * Parses source code into a component template\n *\n * @param source The source code\n *\n * @returns A result indicating whether parsing was ok, and if so, containing\n * the component template's parts such as script, markup and styles\n */\nexport default function parse(source: string): ParseResult {\n\treturn parseCode(source);\n}\n"],"mappings":"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","names":["buildHeadNode","buildHeadNode","maybeAppend","buildElementAttributes","importsMap","hash","scopeStyles"]}
|