@torpor/view 0.1.4 → 0.1.6

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.
Files changed (359) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/compile.cjs +324 -270
  3. package/dist/compile.cjs.map +1 -1
  4. package/dist/compile.js +324 -270
  5. package/dist/compile.js.map +1 -1
  6. package/dist/index.cjs +145 -97
  7. package/dist/index.cjs.map +1 -1
  8. package/dist/index.d.cts +72 -29
  9. package/dist/index.d.ts +72 -29
  10. package/dist/index.js +142 -97
  11. package/dist/index.js.map +1 -1
  12. package/dist/metafile-cjs.json +1 -1
  13. package/dist/metafile-esm.json +1 -1
  14. package/package.json +3 -3
  15. package/src/compile/build/client/buildAddFragment.ts +5 -1
  16. package/src/compile/build/client/buildCode.ts +2 -0
  17. package/src/compile/build/client/buildComponentNode.ts +1 -0
  18. package/src/compile/build/client/buildControlNode.ts +2 -1
  19. package/src/compile/build/client/buildFragment.ts +47 -21
  20. package/src/compile/build/client/buildRootNode.ts +5 -1
  21. package/src/compile/build/client/buildStyles.ts +18 -14
  22. package/src/compile/build/server/buildServerComponentNode.ts +2 -4
  23. package/src/compile/build/server/buildServerControlNode.ts +2 -1
  24. package/src/compile/build/server/buildServerForNode.ts +2 -2
  25. package/src/compile/build/server/buildServerIfNode.ts +4 -0
  26. package/src/compile/build/server/buildServerRootNode.ts +3 -1
  27. package/src/compile/build/server/buildServerSwitchNode.ts +4 -0
  28. package/src/compile/parse/ParseStatus.ts +2 -1
  29. package/src/compile/parse/parseCode.ts +5 -8
  30. package/src/compile/parse/parseControl.ts +19 -6
  31. package/src/compile/parse/parseMarkup.ts +15 -8
  32. package/src/compile/types/comments.ts +2 -2
  33. package/src/compile/types/nodes/OperationType.ts +2 -1
  34. package/src/debug/printNode.ts +54 -36
  35. package/src/index.ts +5 -1
  36. package/src/render/addFragment.ts +5 -4
  37. package/src/render/clearLayoutSlot.ts +6 -0
  38. package/src/render/clearRange.ts +1 -1
  39. package/src/render/hydrationMarkers.ts +2 -2
  40. package/src/render/isComment.ts +2 -2
  41. package/src/render/isText.ts +3 -0
  42. package/src/render/nodeAnchor.ts +62 -27
  43. package/src/render/nodeCheckHydrationBreak.ts +25 -0
  44. package/src/render/nodeChild.ts +12 -7
  45. package/src/render/nodeNext.ts +16 -25
  46. package/src/render/nodeRoot.ts +26 -9
  47. package/src/render/nodeSkip.ts +20 -0
  48. package/src/render/runLayoutSlot.ts +26 -0
  49. package/test/attributes/components/output/Attributes-client.ts +7 -4
  50. package/test/attributes/components/output/Attributes-server.ts +1 -1
  51. package/test/attributes/components/temp/{Attributes-client-7b8f7b9996208e8d2d0a12d4f4a40a73df63d9d8.ts → Attributes-client-4620a40099e57a7fdaab895b204d85881f6dbfb7.ts} +7 -4
  52. package/test/attributes/components/temp/{Attributes-server-a1289434a5a801be1d63bfc85b621579e06452f0.ts → Attributes-server-80f9f58fd6cb30df11867386d4f0b15b44401ebe.ts} +1 -1
  53. package/test/await/components/output/Await-client.ts +18 -15
  54. package/test/await/components/output/Await-server.ts +2 -2
  55. package/test/await/components/temp/{Await-client-a7bf000bf2b59a3d5251a0fa18ec79890a52a547.ts → Await-client-5d753441145fbac078393af24cccadb208453d69.ts} +18 -15
  56. package/test/await/components/temp/{Await-server-06cd2a3d8c7eb5bef026ffe2fb11793becf547c2.ts → Await-server-f02f39af3bb3344ca6b18a1d64d60b21913fba31.ts} +2 -2
  57. package/test/bind/components/output/BindComponent-client.ts +18 -12
  58. package/test/bind/components/output/BindComponent-server.ts +3 -3
  59. package/test/bind/components/output/BindText-client.ts +10 -8
  60. package/test/bind/components/output/BindText-server.ts +1 -1
  61. package/test/bind/components/temp/{BindComponent-client-a645474748485a878871c062ad69e6bcf35e6550.ts → BindComponent-client-aaeb489ce72b664c6372f8764f7e665994a751a7.ts} +18 -12
  62. package/test/bind/components/temp/{BindComponent-server-c557e7aa944517ab87415b8bb35b41b0034254e7.ts → BindComponent-server-c630dee0bee6cea49d5eb8bea04979a737bb8f5e.ts} +3 -3
  63. package/test/bind/components/temp/{BindText-client-d5f7d721df55020ef337f660e5d278eb80fcc330.ts → BindText-client-134676d616abbad6b8a7ec48df0a2e38cbfe3b87.ts} +10 -8
  64. package/test/bind/components/temp/{BindText-server-4b94cdf60d9c9a2088306c4407e2ae30785169b0.ts → BindText-server-807a1ddcb68410b30429cb088d2e204ed6f585b2.ts} +1 -1
  65. package/test/buildHtml.ts +1 -1
  66. package/test/buildOutputFiles.ts +8 -1
  67. package/test/child-component/components/output/ParentChild-client.ts +17 -11
  68. package/test/child-component/components/output/ParentChild-server.ts +3 -3
  69. package/test/child-component/components/temp/{ParentChild-client-eaefb0cbfd251badab3c57ae2037d973f785a1b8.ts → ParentChild-client-6cf4d156ea46338815270faf67f56472f1a4ccd4.ts} +17 -11
  70. package/test/child-component/components/temp/{ParentChild-server-8f2fc556f87867e6e3393e2e9e6d696cda107b69.ts → ParentChild-server-a34a8b5acf1c00d1990f8ab7433599506265a45a.ts} +3 -3
  71. package/test/class/class.test.ts +1 -1
  72. package/test/class/components/output/Class-client.ts +27 -20
  73. package/test/class/components/output/Class-server.ts +4 -4
  74. package/test/class/components/temp/{Class-client-12f09850a5f8c27de6cf94c23a2b17aadbf66f01.ts → Class-client-0405eff591f854c04e5728df0479014ef91efc61.ts} +27 -20
  75. package/test/class/components/temp/Class-server-daf30ffb1bacf9877e3385dc9a3eede61c972329.ts +40 -0
  76. package/test/component/components/output/Component-client.ts +9 -4
  77. package/test/component/components/output/Component-server.ts +2 -0
  78. package/test/component/components/output/Header-client.ts +7 -5
  79. package/test/component/components/output/Header-server.ts +1 -1
  80. package/test/component/components/temp/{Component-client-a2fb6f30fc340bac909b64cb4f5ac68cde376de3.ts → Component-client-355b42e5f7411c399e2f50fba3580f4f7c3fa943.ts} +9 -4
  81. package/test/component/components/temp/{Component-server-40be12cd528ccf768f1ad40ef2a435ad2b2a2d71.ts → Component-server-81012827b18e82d787d194a0a1a9d4e07311a336.ts} +2 -0
  82. package/test/component/components/temp/{Header-client-75cb4aa868295ac168c16ba7b275fbb5ab9256f9.ts → Header-client-903877003b220272b0cb5bfd62d7d748ad46c477.ts} +7 -5
  83. package/test/component/components/temp/{Header-server-f73307874bec34a95dcd152d7f83a3ad13a0f4ac.ts → Header-server-6969d20782edd8f99d4b5c5b7b5563ce26e6dc2d.ts} +1 -1
  84. package/test/console/components/output/Console-client.ts +6 -4
  85. package/test/console/components/output/Console-server.ts +1 -1
  86. package/test/console/components/temp/{Console-client-2f206752ce59e59fba9bb91263b4102fd515951e.ts → Console-client-4fa3b3679cee88bf6151185438e36d14010944b7.ts} +6 -4
  87. package/test/console/components/temp/{Console-server-b4b15f7a0d1d2b50d87bad4870e1b8d368707c04.ts → Console-server-cfb2208b130d5f15403df19ae8341aaa1c9ad33a.ts} +1 -1
  88. package/test/const/components/output/Const-client.ts +7 -5
  89. package/test/const/components/output/Const-server.ts +2 -2
  90. package/test/const/components/temp/{Const-client-536e8fdf18d6f4f7f23b2789de2330ecf62d7865.ts → Const-client-7dff2758c14bfbd208e301a702ae1781e6daba1b.ts} +7 -5
  91. package/test/const/components/temp/{Const-server-8f84096c03a19296425aee5d243af0734b70ca61.ts → Const-server-1cf6ed84f72d3b15b318b80937b8de1f2c0f188c.ts} +2 -2
  92. package/test/effects/components/output/For-client.ts +12 -9
  93. package/test/effects/components/output/For-server.ts +2 -2
  94. package/test/effects/components/output/If-client.ts +14 -11
  95. package/test/effects/components/output/If-server.ts +4 -4
  96. package/test/effects/components/output/NestedIf-client.ts +17 -14
  97. package/test/effects/components/output/NestedIf-server.ts +5 -5
  98. package/test/effects/components/temp/{For-client-d8d4e4424ec3238fe9f79cc907d673612b63bcdf.ts → For-client-fbe876286c0f99b8391ff0c06c92b58bf580218f.ts} +12 -9
  99. package/test/effects/components/temp/{For-server-1f853c161bea31a1a5b11b00d7a021b70c778066.ts → For-server-efe60939d185315f4c9b567b6867c6d5af14d9aa.ts} +2 -2
  100. package/test/effects/components/temp/{If-client-bb06988422395321bf298a75bf5563c6f750f776.ts → If-client-420a093f13de6ce07d2d4bc94705901809096cd9.ts} +14 -11
  101. package/test/effects/components/temp/{If-server-97e3cbe059306fc607985dcd1b187df3a278d979.ts → If-server-2424b7b812d350d7eb8ff9afb1146807217320cd.ts} +4 -4
  102. package/test/effects/components/temp/{NestedIf-client-dc880c1ec92e716ec730dfa0bac0e3d9265bdf27.ts → NestedIf-client-af88ec303b1a4184263bb370ef5b1f1e8aca8efc.ts} +17 -14
  103. package/test/effects/components/temp/{NestedIf-server-9f199a33bae5d5fe34920d6a419937537a2b18dc.ts → NestedIf-server-ab260586490cb5afed31377d2226bb5a1fc30e2d.ts} +5 -5
  104. package/test/events/components/output/Increment-client.ts +9 -7
  105. package/test/events/components/output/Increment-server.ts +1 -1
  106. package/test/events/components/temp/{Increment-client-41bd7bc91aac8c7a9bf73527c8f7ba1794b09ab3.ts → Increment-client-1b5f9e231c5c4fc059d77ca0da632719283e5ac4.ts} +9 -7
  107. package/test/events/components/temp/{Increment-server-bbf5ac93c4f73382c4262ae42f4cc836bcb8ac1b.ts → Increment-server-b084f43082e2ec31dbe5f9edc1cb6e37e4c8df9d.ts} +1 -1
  108. package/test/for/components/output/For-client.ts +12 -9
  109. package/test/for/components/output/For-server.ts +2 -2
  110. package/test/for/components/output/ForEscape-client.ts +16 -13
  111. package/test/for/components/output/ForEscape-server.ts +2 -2
  112. package/test/for/components/output/ForIn-client.ts +12 -9
  113. package/test/for/components/output/ForIn-server.ts +2 -2
  114. package/test/for/components/output/ForOf-client.ts +12 -9
  115. package/test/for/components/output/ForOf-server.ts +2 -2
  116. package/test/for/components/temp/{For-client-0be5994e98c07a3455cd8a18a2b1b8ef3605aba6.ts → For-client-421f2a6ca501d135c0aef9d1aaea25de0e1c00e4.ts} +12 -9
  117. package/test/for/components/temp/{For-server-8490f15d02ae76b218feb7fa266415f44b2a4ab9.ts → For-server-3b6ead39728c79206203c519a215390d07d80f7e.ts} +2 -2
  118. package/test/for/components/temp/{ForEscape-client-a973a145e28b32ca55fe3dca53d885fcf5e11c37.ts → ForEscape-client-72879c80f7544c2edfc224095740bdea20e1e12d.ts} +16 -13
  119. package/test/for/components/temp/{ForEscape-server-375744ca1e10e5c8ed7dd6420beef72107e55568.ts → ForEscape-server-ed906c8cd593a0b467073ada415734de31dc38d9.ts} +2 -2
  120. package/test/for/components/temp/{ForIn-client-5cc25a98e10826e8477fe6f931d5d2bbd0b13c9f.ts → ForIn-client-e12c45d7f53e50ea3ed456110138dfb95f6930e0.ts} +12 -9
  121. package/test/for/components/temp/{ForIn-server-d68e82c048f7e0f1525f74724b91e5cd01cdc6a6.ts → ForIn-server-c8f13304a2ba235e091685256909fbfa50bdd5fd.ts} +2 -2
  122. package/test/for/components/temp/{ForOf-client-70b0d59ff72f1cffe2e0ac8523dd7ccdca4ffe39.ts → ForOf-client-422d67d6c046f1d1de655719d061ea29f67d23f7.ts} +12 -9
  123. package/test/for/components/temp/{ForOf-server-ac08d98dd249a3e64a366b8488450e6ce0d18def.ts → ForOf-server-8c2c33ca6595bf0a5e952ca9971e595e18446623.ts} +2 -2
  124. package/test/function/components/output/Function-client.ts +8 -6
  125. package/test/function/components/output/Function-server.ts +2 -2
  126. package/test/function/components/temp/{Function-client-b3ff029a821d47e1a2249a52dfb681f4b2e96232.ts → Function-client-4e2168306756eb927d5ed4b673334b357eecaa74.ts} +8 -6
  127. package/test/function/components/temp/{Function-server-2d32fbe35260c0948a135f287f131c5520e8bce7.ts → Function-server-2b19d0cd881c31dc67132107c6e322a18701c318.ts} +2 -2
  128. package/test/html/components/output/Html-client.ts +9 -6
  129. package/test/html/components/output/Html-server.ts +1 -1
  130. package/test/html/components/temp/{Html-client-766ba4a63f28f929ca16cd7d1640fe92f9b30792.ts → Html-client-2f309b06c3304a952d249057dec058a514d52874.ts} +9 -6
  131. package/test/html/components/temp/{Html-server-0a41da8b81bf833f331f3becdbac14be7ddc6c8c.ts → Html-server-d159b0ef04b1f65ae4f9e05a7b44b21e7aa14cf9.ts} +1 -1
  132. package/test/hydrateComponent.ts +1 -0
  133. package/test/if/components/IfAfterIf.torp +10 -12
  134. package/test/if/components/IfElse.torp +12 -11
  135. package/test/if/components/IfElseIf.torp +13 -15
  136. package/test/if/components/IfFalse.torp +10 -0
  137. package/test/if/components/IfNested.torp +11 -13
  138. package/test/if/components/output/IfAfterIf-client.ts +14 -13
  139. package/test/if/components/output/IfAfterIf-server.ts +4 -4
  140. package/test/if/components/output/IfElse-client.ts +14 -13
  141. package/test/if/components/output/IfElse-server.ts +4 -4
  142. package/test/if/components/output/IfElseIf-client.ts +16 -15
  143. package/test/if/components/output/IfElseIf-server.ts +5 -5
  144. package/test/if/components/output/IfFalse-client.ts +56 -0
  145. package/test/if/components/output/IfFalse-server.ts +21 -0
  146. package/test/if/components/output/IfNested-client.ts +19 -18
  147. package/test/if/components/output/IfNested-server.ts +6 -6
  148. package/test/if/components/temp/{IfAfterIf-client-49b6b8c42b0a351561f9f5f22c2ae2e844bf3b58.ts → IfAfterIf-client-5ddfc6dc62ffbc9a518220458403008e88e69e6c.ts} +14 -13
  149. package/test/if/components/temp/{IfAfterIf-server-eb67cf1fcf6711882266219940a47bd4a66497f3.ts → IfAfterIf-server-a5005147e7902d1a5a048c9fe07feb9804eb6560.ts} +4 -4
  150. package/test/if/components/temp/{IfElse-client-e236d4a2e99262ff09675bc519c07e2826c0d70b.ts → IfElse-client-815057ffb2d9a1861bb316d445321947ddedbb65.ts} +14 -13
  151. package/test/if/components/temp/{IfElse-server-c077e0e30f4d2adec41ab779198362d21542d055.ts → IfElse-server-80d93e5fc4ceba7a645f7081fa11b177dbe730d0.ts} +4 -4
  152. package/test/if/components/temp/{IfElseIf-client-b92106861f0c7ec3d09e3a42bb93d8f5bd4e3bdf.ts → IfElseIf-client-a7b16a8af24fdd3caa7b9e8e56d4bdb6ad3ab855.ts} +16 -15
  153. package/test/if/components/temp/{IfElseIf-server-67991eee3f56dc687cda600511c31396438e0a77.ts → IfElseIf-server-ddc7348705d51b02538301e0aa704130748992cf.ts} +5 -5
  154. package/test/if/components/temp/IfFalse-client-6507ff8abd4842b78da27d8a9d4964abc1d9b727.ts +56 -0
  155. package/test/if/components/temp/IfFalse-server-e8385013cfdde584b43cc0d71311cbb417859116.ts +21 -0
  156. package/test/if/components/temp/{IfNested-client-f563ac1b16a2280e457557281c4925ed447a9cd7.ts → IfNested-client-e09f8af625b4e0b3e9eb210440f8edda720f0d53.ts} +19 -18
  157. package/test/if/components/temp/{IfNested-server-0a2a9643324ab73b02b310cad61ba87dab146ab2.ts → IfNested-server-285a5d8e0e0fcc8ccf421df152fdc00811782835.ts} +6 -6
  158. package/test/if/if-else-false.test.ts +54 -0
  159. package/test/if/{if-true.test.ts → if-else-true.test.ts} +5 -2
  160. package/test/if/if-false.test.ts +1 -4
  161. package/test/importComponent.ts +4 -0
  162. package/test/mount/components/output/Mount-client.ts +7 -4
  163. package/test/mount/components/output/Mount-server.ts +1 -1
  164. package/test/mount/components/temp/{Mount-client-36dbc95a61345a1b7dcf07e6b0c998af2afca691.ts → Mount-client-efa5c34fbfc7646e114a1a58f0814b6dff33e566.ts} +7 -4
  165. package/test/mount/components/temp/{Mount-server-8bef1924a731f3db63cb827be3938fec685e53af.ts → Mount-server-62f94f276c2d6c9048765a77b575cb21146917f1.ts} +1 -1
  166. package/test/on-mount/components/output/OnMount-client.ts +7 -4
  167. package/test/on-mount/components/output/OnMount-server.ts +1 -1
  168. package/test/on-mount/components/temp/{OnMount-client-21708a638d2939ee8b017f5dc819cee4748bde87.ts → OnMount-client-4bb62e8bf1fcd67798598fe03bf5455a57f0a6be.ts} +7 -4
  169. package/test/on-mount/components/temp/{OnMount-server-1758fe2b16972fca7d4b9bb49d9256fce99780eb.ts → OnMount-server-c531f718eb68754ea6c3001d5db9c07c511e434c.ts} +1 -1
  170. package/test/party/components/output/AnswerButton-client.ts +8 -6
  171. package/test/party/components/output/AnswerButton-server.ts +1 -1
  172. package/test/party/components/output/AnswerButtonApp-client.ts +11 -7
  173. package/test/party/components/output/AnswerButtonApp-server.ts +2 -2
  174. package/test/party/components/output/ColorSelect-client.ts +11 -9
  175. package/test/party/components/output/ColorSelect-server.ts +2 -2
  176. package/test/party/components/output/Colors-client.ts +12 -9
  177. package/test/party/components/output/Colors-server.ts +2 -2
  178. package/test/party/components/output/Counter-client.ts +8 -6
  179. package/test/party/components/output/Counter-server.ts +1 -1
  180. package/test/party/components/output/CssStyle-client.ts +6 -4
  181. package/test/party/components/output/CssStyle-server.ts +1 -1
  182. package/test/party/components/output/DoubleCount-client.ts +7 -5
  183. package/test/party/components/output/DoubleCount-server.ts +1 -1
  184. package/test/party/components/output/FunnyButton-client.ts +12 -9
  185. package/test/party/components/output/FunnyButton-server.ts +2 -2
  186. package/test/party/components/output/FunnyButtonApp-client.ts +15 -9
  187. package/test/party/components/output/FunnyButtonApp-server.ts +3 -3
  188. package/test/party/components/output/HelloWorld-client.ts +6 -4
  189. package/test/party/components/output/HelloWorld-server.ts +1 -1
  190. package/test/party/components/output/InputFocused-client.ts +7 -4
  191. package/test/party/components/output/InputFocused-server.ts +1 -1
  192. package/test/party/components/output/InputHello-client.ts +8 -6
  193. package/test/party/components/output/InputHello-server.ts +1 -1
  194. package/test/party/components/output/IsAvailable-client.ts +8 -6
  195. package/test/party/components/output/IsAvailable-server.ts +1 -1
  196. package/test/party/components/output/Name-client.ts +7 -5
  197. package/test/party/components/output/Name-server.ts +1 -1
  198. package/test/party/components/output/NameUpdate-client.ts +7 -5
  199. package/test/party/components/output/NameUpdate-server.ts +1 -1
  200. package/test/party/components/output/PageTitle-client.ts +7 -5
  201. package/test/party/components/output/PageTitle-server.ts +1 -1
  202. package/test/party/components/output/PickPill-client.ts +9 -7
  203. package/test/party/components/output/PickPill-server.ts +1 -1
  204. package/test/party/components/output/Time-client.ts +7 -5
  205. package/test/party/components/output/Time-server.ts +1 -1
  206. package/test/party/components/output/TrafficLight-client.ts +19 -17
  207. package/test/party/components/output/TrafficLight-server.ts +5 -5
  208. package/test/party/components/output/UserProfile-client.ts +10 -8
  209. package/test/party/components/output/UserProfile-server.ts +1 -1
  210. package/test/party/components/output/UserProfileApp-client.ts +9 -4
  211. package/test/party/components/output/UserProfileApp-server.ts +2 -0
  212. package/test/party/components/output/UserProfileContext-client.ts +9 -7
  213. package/test/party/components/output/UserProfileContext-server.ts +1 -1
  214. package/test/party/components/output/UserProfileContextApp-client.ts +11 -7
  215. package/test/party/components/output/UserProfileContextApp-server.ts +2 -2
  216. package/test/party/components/temp/{AnswerButton-client-c3dc7edbfff2db1ea111086002147d771ee12193.ts → AnswerButton-client-ad8f8db36b7aaa68d8de5898a324bacfbe9f20df.ts} +8 -6
  217. package/test/party/components/temp/{AnswerButton-server-427442fa8cfc0a18817c2d37f9cb5cbcb3a88a05.ts → AnswerButton-server-928b5d447afa865fa09e0142c79bb1f2c1b86875.ts} +1 -1
  218. package/test/party/components/temp/{AnswerButtonApp-client-3e0b63a6bbc1dee3e6cb715c0297cc2ce58d3e4e.ts → AnswerButtonApp-client-a2b16c738467742436b1a2ddaf2d767795a4d625.ts} +11 -7
  219. package/test/party/components/temp/{AnswerButtonApp-server-bbc8bb739d2060ccda77ce406aa6b15d8f90b91c.ts → AnswerButtonApp-server-16161f2c9062dd11b8b6b8c898f9f1249ae2400d.ts} +2 -2
  220. package/test/party/components/temp/{ColorSelect-client-5ffa6f9d77de967993088c9a01b9f976f3333176.ts → ColorSelect-client-4e848c296047911f4c0e3bc1447e5562ce06087c.ts} +11 -9
  221. package/test/party/components/temp/{ColorSelect-server-3ed19eff17bf10b31d03ec507974ff913932c97a.ts → ColorSelect-server-90f83722bd85155ebb2b8ccdaf053cd28d3152be.ts} +2 -2
  222. package/test/party/components/temp/{Colors-client-3dafffc5c2a72037f4419fc45d08963872a29958.ts → Colors-client-dde7bf60e2b16383ec981b08f8414b1ebeb349a5.ts} +12 -9
  223. package/test/party/components/temp/{Colors-server-f9b3037a5f25979f71b5f8f3e658140be7c27920.ts → Colors-server-e13d49ba57f7b0dc6fb10a333ec872f5207e1ff0.ts} +2 -2
  224. package/test/party/components/temp/{Counter-client-4d553521fcfc6c9a4e05dce89e70b2ecf8785c4e.ts → Counter-client-3b876c148f2b14da1766eff77eb6c494f7be6414.ts} +8 -6
  225. package/test/party/components/temp/{Counter-server-36d1137c519691f5b86a18a5c27b7cf615b7e37c.ts → Counter-server-7adf9376b38d97f1fd4b9c14108e6814e81f14ea.ts} +1 -1
  226. package/test/party/components/temp/{CssStyle-client-59c0f261f67bc04f2829a0371f655d146101cec6.ts → CssStyle-client-37465dd48d1479db1bae513eb0b92c4e9a15e9ea.ts} +6 -4
  227. package/test/party/components/temp/{CssStyle-server-3e58d7e2f5c381a251f593245d3d8bf4b50925ae.ts → CssStyle-server-90a950501a20bfa5feac84ca6d97898c25bce2ed.ts} +1 -1
  228. package/test/party/components/temp/{DoubleCount-client-0426f128507a8d4516ef7501cd180662112b6d1d.ts → DoubleCount-client-6d4cf1e54368e3c6082e37c1e04f9ecde90624f2.ts} +7 -5
  229. package/test/party/components/temp/{DoubleCount-server-40fc88156e52281b80fd6b12dd73d2469201fa29.ts → DoubleCount-server-62c94483ebe9661e5ecc4f489787e32448ddcafa.ts} +1 -1
  230. package/test/party/components/temp/{FunnyButton-client-45f2c5dd56f2cdb80102193a978df6b0cec822ab.ts → FunnyButton-client-61a1699da08e210375edff33f7b27d3cc0e99cc3.ts} +12 -9
  231. package/test/party/components/temp/{FunnyButton-server-e8ab55e47c735f7e42c55d2b7504dfa4190a1b40.ts → FunnyButton-server-e0adab2be2d283acb8a8b580479ade999dc918e9.ts} +2 -2
  232. package/test/party/components/temp/{FunnyButtonApp-client-ac7101af922dc6ba472b75a428f340caca6be74a.ts → FunnyButtonApp-client-cbce6a591bae38ab8b312551f8741d50ae6294bf.ts} +15 -9
  233. package/test/party/components/temp/{FunnyButtonApp-server-f1a98a946e0bb9d1bb76b01e26d6ead8f55d32bb.ts → FunnyButtonApp-server-48d37de0c755843a2be34d7c7cb5c730689dcc2f.ts} +3 -3
  234. package/test/party/components/temp/{HelloWorld-client-791e8b9a0bd4b01e87fbe70f2b28d4ac356e3624.ts → HelloWorld-client-7344e400b4adb975fa8263d3081a06de0a793e57.ts} +6 -4
  235. package/test/party/components/temp/{HelloWorld-server-3c4b9a995a78d652d9220a20124c9e0d18fc7101.ts → HelloWorld-server-e0ed80e7531f303952a4af30d646263ff2e4ead6.ts} +1 -1
  236. package/test/party/components/temp/{InputFocused-client-11a9cb08909b26945bbc2451ab4c1dac09e6d113.ts → InputFocused-client-20d755aea7dfaf1fd5e42dcade8fb7867f59ef28.ts} +7 -4
  237. package/test/party/components/temp/{InputFocused-server-82be1a63c80d1dd3f06efaf0bef349d58cf1d9af.ts → InputFocused-server-ee70758a515227c04788be0e298a79c277994ccd.ts} +1 -1
  238. package/test/party/components/temp/{InputHello-client-b0453caeae0d43dc1878039c6b49318d12624d48.ts → InputHello-client-2a4cbd980534fde14b9d3e8a2f8e4f59a4f15d64.ts} +8 -6
  239. package/test/party/components/temp/{InputHello-server-6c982438e58d3649ee3890efec636ca4590a5cdb.ts → InputHello-server-1b9dd5442ded022abe92a9075ca5a4bb90486cbe.ts} +1 -1
  240. package/test/party/components/temp/{IsAvailable-client-d789346a68b26fd3f5d9f7aebc4c7bd181c47cad.ts → IsAvailable-client-3949f85aea0e935c3b59ab1389baee836eff1866.ts} +8 -6
  241. package/test/party/components/temp/{IsAvailable-server-a35b7ec5f111472c76aa1b67c857b169fe363594.ts → IsAvailable-server-123daa1ae56b77defe6666faddb44ba4252dd0fb.ts} +1 -1
  242. package/test/party/components/temp/{Name-client-cb8bef7cfca1306386b65410a0bd7a8acfaed359.ts → Name-client-62f0dab96aff130e81882099d7c0a111ba99cebd.ts} +7 -5
  243. package/test/party/components/temp/{Name-server-9da0823f748e9751e017078f39717298be232636.ts → Name-server-a402418f1ca2d8a0e6403596ec03ec47b5ff40ec.ts} +1 -1
  244. package/test/party/components/temp/{NameUpdate-client-ebef69b0da12d640994099592ce06c7e4b5089d4.ts → NameUpdate-client-6ceb440637c99142bafcf8512eabf831c113b8c7.ts} +7 -5
  245. package/test/party/components/temp/{NameUpdate-server-1856bdb5e010f7d7e5e67f2a0d87ac3f92f4e0ee.ts → NameUpdate-server-b7dcc875e894a5606544fcd78bda575ea07632ca.ts} +1 -1
  246. package/test/party/components/temp/{PageTitle-client-403645e918294e5cdeea8cb3f602e0a2642b2650.ts → PageTitle-client-75fea3a37fb1213bc13f56160bb6779486b2e6e9.ts} +7 -5
  247. package/test/party/components/temp/{PageTitle-server-4d959183b7029b6817372abd1d60a7e996baeb15.ts → PageTitle-server-12dcb4e437aaef227c704a2ee8bbdee55ca323dc.ts} +1 -1
  248. package/test/party/components/temp/{PickPill-client-b47d371ae5f41d87c96b3cdeed0a8bc06fbfa9c7.ts → PickPill-client-0f13aa652cb1bd45f57d5a249f8364e80204441a.ts} +9 -7
  249. package/test/party/components/temp/{PickPill-server-49e033c5f97dd2f98e1498327e16eb9c8c9d2f66.ts → PickPill-server-f10dae4708e36775a5e1a5ad10c6c0c309335009.ts} +1 -1
  250. package/test/party/components/temp/{Time-client-7ba4ca9322af2cb88a873c812fc776760c337c64.ts → Time-client-2013f274e90b45be3138727f2298305e1951131f.ts} +7 -5
  251. package/test/party/components/temp/{Time-server-08f66c7f3f32b13de06d75fe679cf58b5727c473.ts → Time-server-8e0278a4b16925903f3c4ceedbf1332cde4921fa.ts} +1 -1
  252. package/test/party/components/temp/{TrafficLight-client-549f9fe3418c113fb240cfa17e09c42e1e7f346a.ts → TrafficLight-client-4010f51fde4c8c21e6c232eff974c86820dbad4f.ts} +19 -17
  253. package/test/party/components/temp/{TrafficLight-server-ed2a8640fd82cf381eee8f4fb83bb09d174a4557.ts → TrafficLight-server-04bb3b2f11322ccc97a9a8a8fbb26c3c99843042.ts} +5 -5
  254. package/test/party/components/temp/{UserProfile-client-2c13aac1ad915e51dc557f9af765669e636c0fea.ts → UserProfile-client-11c2a928de5a5ed4cab45186f08ca09f6161afb5.ts} +10 -8
  255. package/test/party/components/temp/{UserProfile-server-cc1162a4297f6163bfb86e7a8aeea08e8c0625c6.ts → UserProfile-server-a0576b8d9dd15b3fab6c11758984c686ddfe2f66.ts} +1 -1
  256. package/test/party/components/temp/{UserProfileApp-client-2be7a11319cca4d7bfa0f3d2205c441d7e203780.ts → UserProfileApp-client-32b5cc129b32af5cdd94f39c6fb09a2e4806b04e.ts} +9 -4
  257. package/test/party/components/temp/{UserProfileApp-server-ab9ff66f787f775aa8571314fee8bcbef85489ef.ts → UserProfileApp-server-97397c42aaac0ee3902218d02c0ce6884434cc5b.ts} +2 -0
  258. package/test/party/components/temp/{UserProfileContext-client-2aa36f436a5f20614d77f48963ec5ca442eebd90.ts → UserProfileContext-client-c97c077254210061b3c9ba561f681c0cf4f6167f.ts} +9 -7
  259. package/test/party/components/temp/{UserProfileContext-server-cf58767df1e2d1dde919f59de73cdd9764bbc006.ts → UserProfileContext-server-2d32476b00448bdec6c1c45aac5087a5152c2471.ts} +1 -1
  260. package/test/party/components/temp/{UserProfileContextApp-client-5099052fdcd8fb4c368c45090390947424a4e9b0.ts → UserProfileContextApp-client-c4b64ccf44069bcbf18acb585afa62ac9127aeb9.ts} +11 -7
  261. package/test/party/components/temp/{UserProfileContextApp-server-6be8dab2ed4f8911f26bef137e7dea164f2b894d.ts → UserProfileContextApp-server-95a4b12d30cef621db55d5de102a906ac7286fb2.ts} +2 -2
  262. package/test/props/components/output/Reactive-client.ts +18 -12
  263. package/test/props/components/output/Reactive-server.ts +3 -3
  264. package/test/props/components/temp/{Reactive-client-e3e5f6ee2f22c46337c6ab1df2f241133c7e2646.ts → Reactive-client-249382840865c9911857b89085bc85ff901b8e8f.ts} +18 -12
  265. package/test/props/components/temp/{Reactive-server-0914d91287a1bc6d32d7cc56d086624762dbfc04.ts → Reactive-server-770cd3df7c877c0c99e156b2ba6d1f8b35914027.ts} +3 -3
  266. package/test/replace/components/output/Replace-client.ts +11 -8
  267. package/test/replace/components/output/Replace-server.ts +2 -2
  268. package/test/replace/components/temp/{Replace-client-3fdab63871fa4bb792317caefd3539b1888325b1.ts → Replace-client-ef66f06bc0cfa91e800b185dbccbca6a98693c21.ts} +11 -8
  269. package/test/replace/components/temp/{Replace-server-857aca7a58deffc3a1c95ab9d31628b4051ca203.ts → Replace-server-9519943d193b681e1d7894a0d7952affdfb0660c.ts} +2 -2
  270. package/test/slots/components/output/Article-client.ts +13 -9
  271. package/test/slots/components/output/Article-server.ts +2 -2
  272. package/test/slots/components/output/Basic-client.ts +9 -5
  273. package/test/slots/components/output/Basic-server.ts +2 -0
  274. package/test/slots/components/output/Header-client.ts +10 -7
  275. package/test/slots/components/output/Header-server.ts +2 -2
  276. package/test/slots/components/output/Let-client.ts +9 -5
  277. package/test/slots/components/output/Let-server.ts +2 -0
  278. package/test/slots/components/output/List-client.ts +12 -9
  279. package/test/slots/components/output/List-server.ts +2 -2
  280. package/test/slots/components/output/Named-client.ts +12 -8
  281. package/test/slots/components/output/Named-server.ts +2 -0
  282. package/test/slots/components/output/Unused-client.ts +9 -4
  283. package/test/slots/components/output/Unused-server.ts +2 -0
  284. package/test/slots/components/temp/{Article-client-80848d6cadd8abac61865d14ddd35685844797e0.ts → Article-client-f7676836f5ded94222b11ef81e41dd675d1af04b.ts} +13 -9
  285. package/test/slots/components/temp/{Article-server-a6bd47a621cc213db4313eb775a52246541dd203.ts → Article-server-b84141b05064f5ea1e4b535faafe459df0d875fb.ts} +2 -2
  286. package/test/slots/components/temp/{Basic-client-97b18686412869e8c814fd4542dfe826b1f7669f.ts → Basic-client-e7650b8be5f6e50fa0f2f343a145f86edfe14ff4.ts} +9 -5
  287. package/test/slots/components/temp/{Basic-server-248392e2cd147b537cd44e9a5a71885ef20102e4.ts → Basic-server-aed46a5b459cce50e7ddb311c42a76b9e91c2dae.ts} +2 -0
  288. package/test/slots/components/temp/{Header-client-e2e1e7d60b48b0841cd0c20224f520330ca96458.ts → Header-client-127c27e6bfcd5b37cc871164cd665b740418dc82.ts} +10 -7
  289. package/test/slots/components/temp/{Header-server-1c195508a91c32822da22a08576c8a30c9070636.ts → Header-server-d8e8ccb129d84478f0c4f8dc8ad1d2091188cc7b.ts} +2 -2
  290. package/test/slots/components/temp/{Let-client-be69c1f5aa32faf16239050d7836db46cfdcba2f.ts → Let-client-c107eb0fe42f125996d2c9a83ab7b3c1916ca26d.ts} +9 -5
  291. package/test/slots/components/temp/{Let-server-c3293219ed27aec61a6af36d451ddf6609c40027.ts → Let-server-62727e5e2db3df405cdbe7a2d339a99113fc7f4a.ts} +2 -0
  292. package/test/slots/components/temp/{List-client-a829b33214de829de689a72d2e8703b2266ad7a4.ts → List-client-ca1d8f9a9cc8b513323de7c5531a4ec03898d920.ts} +12 -9
  293. package/test/slots/components/temp/{List-server-06503834c9bfae9b8c2b61742568b020a3de961c.ts → List-server-f4f63df4d19e15311da347284935a1bb530a8df4.ts} +2 -2
  294. package/test/slots/components/temp/{Named-client-2d9d88f5fdf74d81c3ed1d769a476f4ac36c8b99.ts → Named-client-636b6a18c25a27099f883cb9eeb04e182e248941.ts} +12 -8
  295. package/test/slots/components/temp/{Named-server-65a7bbf038111475c8f07dccb34040ab8c1392c4.ts → Named-server-829daa82c94fd7142a721cabac1b3402cca8fce6.ts} +2 -0
  296. package/test/slots/components/temp/{Unused-client-1b16491cb800bbbbd871d9fbf5966c7275244019.ts → Unused-client-0aefcc79e9ae050358fa049a35b7e8e0a6bc2d66.ts} +9 -4
  297. package/test/slots/components/temp/{Unused-server-e5d1e85116bebc7e1a2882cb8f2c9ae7975a1de7.ts → Unused-server-379b45ff313e82f8b2949385f50d8ea482094520.ts} +2 -0
  298. package/test/special-component/components/output/BigTitle-client.ts +9 -6
  299. package/test/special-component/components/output/BigTitle-server.ts +2 -2
  300. package/test/special-component/components/output/Component-client.ts +10 -4
  301. package/test/special-component/components/output/Component-server.ts +2 -2
  302. package/test/special-component/components/output/SmallTitle-client.ts +9 -6
  303. package/test/special-component/components/output/SmallTitle-server.ts +2 -2
  304. package/test/special-component/components/temp/{BigTitle-client-881a9f84876fb3f6d994736edb253b96e71de926.ts → BigTitle-client-04ca3c7b6aaf76b81baa5a3d3720fbd2a1760550.ts} +9 -6
  305. package/test/special-component/components/temp/{BigTitle-server-9efc738f5eb131a4b859c4a99a8e255d93834e9a.ts → BigTitle-server-d8919a4c975e022c936584bd668917cb89aa8e20.ts} +2 -2
  306. package/test/special-component/components/temp/{Component-client-22f7e1d0955fb3d90939e956a1f0f77118c259b6.ts → Component-client-24cd39596c4281ee2709e6aa482818d071825b4f.ts} +10 -4
  307. package/test/special-component/components/temp/{Component-server-ce596cd84dc11f67c9f0588060a5b672eddf9715.ts → Component-server-3564dfcef8d015cab4944a3c75cc6cf329f3fad6.ts} +2 -2
  308. package/test/special-component/components/temp/{SmallTitle-client-25b3097b7ae47848dd82967403faf7745fc43388.ts → SmallTitle-client-213b422377a30fe0b12f7256e654bf0313ac9cf9.ts} +9 -6
  309. package/test/special-component/components/temp/{SmallTitle-server-fc105db9a91b83644d67e049ce583a3d1a61f50c.ts → SmallTitle-server-0a9b5098e4dda96f8c1da30294d71b39997dd118.ts} +2 -2
  310. package/test/special-element/components/output/Element-client.ts +8 -6
  311. package/test/special-element/components/output/Element-server.ts +1 -1
  312. package/test/special-element/components/temp/{Element-client-21c92c04579b1d29e8813265a10897d069aad5c5.ts → Element-client-c5701ed44faa4ec8ae558505063684a84cada3f2.ts} +8 -6
  313. package/test/special-element/components/temp/{Element-server-4bed9653529f39e72754126147fe8618f328853a.ts → Element-server-166d672256ef4635168de0090e490e48b569c7d6.ts} +1 -1
  314. package/test/special-head/components/output/Head-client.ts +6 -4
  315. package/test/special-head/components/output/Head-server.ts +1 -1
  316. package/test/special-head/components/temp/{Head-client-07e8af6386d767a52667a4fdc978a335ec388302.ts → Head-client-18616689a7d6f83ca076c9d825606b049de9d3ef.ts} +6 -4
  317. package/test/special-head/components/temp/{Head-server-d80a0f1ee10e9942d9a631df35a24cb1cfb15555.ts → Head-server-c0956653b544ff632e36da15d5f7623fa285953a.ts} +1 -1
  318. package/test/special-self/components/output/Self-client.ts +12 -8
  319. package/test/special-self/components/output/Self-server.ts +4 -4
  320. package/test/special-self/components/temp/{Self-client-911c67194be1fdd997537310bcafe712161e8251.ts → Self-client-99b34229c85a477881299311f56f48686352c3b3.ts} +12 -8
  321. package/test/special-self/components/temp/{Self-server-49ba9be1f6255dd4daf490c640f5222a85960218.ts → Self-server-ee440757ca9772d7b4111451a9ee05a157302e7c.ts} +4 -4
  322. package/test/style/components/output/Style-client.ts +7 -4
  323. package/test/style/components/output/Style-server.ts +1 -1
  324. package/test/style/components/temp/{Style-client-cbfac1e255c33a867ccbd5f9d1484a855d91a2d7.ts → Style-client-bc13f8dbb5f754e4eebb2473fc63a139ebf1ba92.ts} +7 -4
  325. package/test/style/components/temp/{Style-server-763d82ee2296be3f7620814aed950b505329c04c.ts → Style-server-85720cb43e20ab000f98bc632c29454a51ae92d9.ts} +1 -1
  326. package/test/svg/components/output/Shape-client.ts +14 -11
  327. package/test/svg/components/output/Shape-server.ts +4 -4
  328. package/test/svg/components/temp/{Shape-client-cb98b36ab2a0d9f06b484a3c988fb43c3a71a4a0.ts → Shape-client-368789c592401c3e4c99ddcdb8fe6dded45eb34a.ts} +14 -11
  329. package/test/svg/components/temp/{Shape-server-500d7fe4556026234ce5379b8e90595ddd094edc.ts → Shape-server-9951ff1dcc7aa0827f28d3f8d970813767115ae3.ts} +4 -4
  330. package/test/switch/components/output/Switch-client.ts +17 -14
  331. package/test/switch/components/output/Switch-server.ts +5 -5
  332. package/test/switch/components/temp/{Switch-client-9980de45e3346b79525c445edec7cbc3b375e8a4.ts → Switch-client-5ef1937202adac7fd5aae866357d95beb4b5805f.ts} +17 -14
  333. package/test/switch/components/temp/{Switch-server-1c5690726f28008bb565966af69b6e4e019dea82.ts → Switch-server-c1b5e1c657438ee3d8afdbf2166c5295cafc5604.ts} +5 -5
  334. package/test/template/errors.test.ts +8 -6
  335. package/test/text/components/output/Text-client.ts +8 -6
  336. package/test/text/components/output/Text-server.ts +1 -1
  337. package/test/text/components/temp/{Text-client-63f1d3bf9b3bd145c7ce7058716640e27144055e.ts → Text-client-e335aae6d8aef389dfdbb5bee14e3dd3d41e86bd.ts} +8 -6
  338. package/test/text/components/temp/{Text-server-9d3dd6f51e893e63c1999ceafce19ca1697d76ea.ts → Text-server-e37d33aa182f36461927d8ce36040bfd05e2f227.ts} +1 -1
  339. package/test/watch-array/components/output/Array-client.ts +12 -9
  340. package/test/watch-array/components/output/Array-server.ts +2 -2
  341. package/test/watch-array/components/output/ArrayEntries-client.ts +12 -9
  342. package/test/watch-array/components/output/ArrayEntries-server.ts +2 -2
  343. package/test/watch-array/components/output/ArrayIndexes-client.ts +12 -9
  344. package/test/watch-array/components/output/ArrayIndexes-server.ts +2 -2
  345. package/test/watch-array/components/output/ArrayUnkeyed-client.ts +12 -9
  346. package/test/watch-array/components/output/ArrayUnkeyed-server.ts +2 -2
  347. package/test/watch-array/components/temp/{Array-client-ffd82188a45877d74053c82fb3616e4aed0fc2ad.ts → Array-client-24ccac431fa237432ec4875234773f36a9a5b120.ts} +12 -9
  348. package/test/watch-array/components/temp/{Array-server-3715e815af887e8487b214e7de324850fe99e312.ts → Array-server-c907209008ac6177f614b62931a2bb1f1c3a04e1.ts} +2 -2
  349. package/test/watch-array/components/temp/{ArrayEntries-client-b6e982660628576061dbb44539e970b9549bdcfa.ts → ArrayEntries-client-ebfb391a78325be4411f24a1ecfdc45ca3a6a621.ts} +12 -9
  350. package/test/watch-array/components/temp/{ArrayEntries-server-85cbe80fbb7f6885287825e2cc0dfc1cb9835d79.ts → ArrayEntries-server-57c1ab0045fa4a02de95f69a65de6f54efe9850c.ts} +2 -2
  351. package/test/watch-array/components/temp/{ArrayIndexes-client-39337aa43bd8c10a53db836c3be233d48dd39b91.ts → ArrayIndexes-client-0a4b3226862bb1de13fdbc7a14f689d9f7ade2a1.ts} +12 -9
  352. package/test/watch-array/components/temp/{ArrayIndexes-server-ec623c724af0c7212675d61ea68e9dee87f96caa.ts → ArrayIndexes-server-f093878b94a37617e2e697a786caa680f75630a7.ts} +2 -2
  353. package/test/watch-array/components/temp/{ArrayUnkeyed-client-7606f9a6a221c8cf6a8b51e4895d10a3d7bccc11.ts → ArrayUnkeyed-client-0966fa5ed460f4c627d8d619e493601098d6a33e.ts} +12 -9
  354. package/test/watch-array/components/temp/{ArrayUnkeyed-server-db21cd576a4c70973abe10f6c8ef5cecb3ead86c.ts → ArrayUnkeyed-server-c893fa024be07e5e7fce608c3ae456bdf2279dbe.ts} +2 -2
  355. package/test/watch-object/components/output/Watched-client.ts +7 -5
  356. package/test/watch-object/components/output/Watched-server.ts +1 -1
  357. package/test/watch-object/components/temp/{Watched-client-bbffbf2cede1a5c071b770670eb39c0f0be725af.ts → Watched-client-d26e846bbeb8271ec5dc2a1ceb75b362af44d3bd.ts} +7 -5
  358. package/test/watch-object/components/temp/{Watched-server-0252addaf92fb0f0c1e2937f42918a1c9f31d196.ts → Watched-server-312fca1e769d7594fc5bb6295ccf55b544dd2f4d.ts} +1 -1
  359. package/test/class/components/temp/Class-server-853a463d2ad1a1e3da4da5ad59ad1c75461d2431.ts +0 -40
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@torpor/view",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "description": "Torpor's view library, for writing and mounting components",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -35,7 +35,7 @@
35
35
  "@testing-library/user-event": "^14.6.1",
36
36
  "@trivago/prettier-plugin-sort-imports": "^5.2.2",
37
37
  "@types/jsdom": "^21.1.7",
38
- "@types/node": "^24.0.3",
38
+ "@types/node": "^24.0.4",
39
39
  "fast-glob": "^3.3.3",
40
40
  "jsdom": "^26.1.0",
41
41
  "sucrase": "^3.35.0",
@@ -43,7 +43,7 @@
43
43
  "tsup": "^8.5.0",
44
44
  "tsx": "^4.20.3",
45
45
  "typescript": "^5.8.3",
46
- "vitest": "^3.2.3"
46
+ "vitest": "^3.2.4"
47
47
  },
48
48
  "scripts": {
49
49
  "build": "tsc --noEmit && tsup && tsx ./scripts/copyToRepl.ts",
@@ -15,7 +15,11 @@ export default function buildAddFragment(
15
15
  const fragment = node.fragment;
16
16
  const fragmentName = `t_fragment_${fragment.number}`;
17
17
  status.imports.add("t_add_fragment");
18
- b.append(`t_add_fragment(${fragmentName}, ${parentName}, ${anchorName});`);
18
+ let params = [fragmentName, parentName, anchorName];
19
+ if (fragment.endVarName) {
20
+ params.push(fragment.endVarName);
21
+ }
22
+ b.append(`t_add_fragment(${params.join(", ")});`);
19
23
  // TODO: Don't need to do this if the last thing we hydrated was the end node
20
24
  if (fragment.endVarName) {
21
25
  status.imports.add("t_next");
@@ -31,10 +31,12 @@ const importsMap: Record<string, string> = {
31
31
  t_anchor: 'import { t_anchor } from "${folder}";',
32
32
  t_child: 'import { t_child } from "${folder}";',
33
33
  t_next: 'import { t_next } from "${folder}";',
34
+ t_skip: 'import { t_skip } from "${folder}";',
34
35
  t_frg: 'import { t_frg } from "${folder}";',
35
36
  t_elm: 'import { t_elm } from "${folder}";',
36
37
  t_txt: 'import { t_txt } from "${folder}";',
37
38
  t_cmt: 'import { t_cmt } from "${folder}";',
39
+ t_print: 'import { t_print } from "${folder}";',
38
40
  ListItem: 'import { type ListItem } from "${folder}";',
39
41
  SlotRender: 'import { type SlotRender } from "${folder}";',
40
42
  };
@@ -153,4 +153,5 @@ export default function buildComponentNode(
153
153
  }
154
154
 
155
155
  b.append(`${componentName}(${renderParams});`);
156
+ b.append("");
156
157
  }
@@ -71,7 +71,8 @@ export default function buildControlNode(node: ControlNode, status: BuildStatus,
71
71
  buildScriptNode(node, b);
72
72
  break;
73
73
  }
74
- case "@function": {
74
+ case "@function":
75
+ case "@async function": {
75
76
  b.append("");
76
77
  buildScriptNode(node, b);
77
78
  b.append("");
@@ -119,14 +119,21 @@ function maybeAddRootNodeDeclaration(
119
119
  } else {
120
120
  status.imports.add("t_root");
121
121
  const rootName = `t_root_${fragment.number}`;
122
- const rootPath = `t_root(${fragmentName})`;
122
+ const params = [fragmentName];
123
+ if (firstNode.type === "text") {
124
+ params.push("true");
125
+ }
126
+ const rootPath = `t_root(${params.join(", ")})`;
123
127
  // HACK: We don't know whether this variable will be used by other child
124
128
  // nodes, so we have to create it regardless and ignore the error if
125
129
  // it's not used -- maybe we could be smarter about this
126
130
  b.append("// @ts-ignore");
127
131
  b.append(`const ${rootName} = ${rootPath};`);
128
- varPaths.set(rootPath, rootName);
129
- //b.append(`console.log("${rootName}", ${rootName}, ${rootName}.textContent);`);
132
+ // HACK: pretend we don't have the text param, so that subsequent t_root
133
+ // uses will be shortened, even if we don't know they are text nodes
134
+ varPaths.set(`t_root(${fragmentName})`, rootName);
135
+
136
+ printDebug(rootName, status, b);
130
137
  }
131
138
  }
132
139
 
@@ -389,8 +396,9 @@ function declareElementFragmentVars(
389
396
  b.append("// @ts-ignore");
390
397
  }
391
398
  b.append(`const ${node.varName} = ${varPath} as ${elementTypeName(node)};`);
399
+
400
+ printDebug(node.varName, status, b);
392
401
  }
393
- //b.append(`console.log("${node.varName}", ${node.varName}, ${node.varName}.textContent);`);
394
402
  }
395
403
  }
396
404
  }
@@ -500,7 +508,8 @@ function declareTextFragmentVars(
500
508
  b.append("// @ts-ignore");
501
509
  }
502
510
  b.append(`const ${node.varName} = ${varPath};`);
503
- //b.append(`console.log("${node.varName}", ${node.varName}, ${node.varName}.textContent);`);
511
+
512
+ printDebug(node.varName, status, b);
504
513
  }
505
514
  }
506
515
  } else {
@@ -636,6 +645,8 @@ function declareParentAndAnchorFragmentVars(
636
645
  b.append(`let ${node.parentName} as HTMLElement;`);
637
646
  } else {
638
647
  b.append(`const ${node.parentName} = ${parentVarPath} as HTMLElement;`);
648
+
649
+ printDebug(node.parentName, status, b);
639
650
  }
640
651
  varPaths.set(parentVarPath, node.parentName);
641
652
  } else {
@@ -650,13 +661,20 @@ function declareParentAndAnchorFragmentVars(
650
661
  path.children.push(anchorPath);
651
662
 
652
663
  node.varName = nextVarName(`${name}_anchor`, status);
653
- const anchorVarPath = getFragmentVarPath(fragment, status, node.varName, anchorPath, varPaths);
664
+ const anchorVarPath = getFragmentVarPath(
665
+ fragment,
666
+ status,
667
+ `t_anchor(${node.varName}, true)`,
668
+ anchorPath,
669
+ varPaths,
670
+ );
654
671
  if (status.options?.useCreateElement) {
655
672
  b.append(`let ${node.varName};`);
656
673
  } else {
657
674
  status.imports.add("t_anchor");
658
675
  b.append(`const ${node.varName} = t_anchor(${anchorVarPath}) as HTMLElement;`);
659
- //b.append(`console.log("${node.varName}", ${node.varName}, ${node.varName}.textContent);`);
676
+
677
+ printDebug(node.varName, status, b);
660
678
  }
661
679
  } else {
662
680
  status.imports.add("t_cmt");
@@ -703,8 +721,9 @@ function getFragmentVarPath(
703
721
  varPaths.set(name, name);
704
722
  }
705
723
 
706
- // Shorten `t_next(t_next(x))` to `t_next(x, 2)`
724
+ // Shorten `t_next(t_next(x))` to `t_skip(x, 2)`
707
725
  while (varPath.includes("t_next(t_next(")) {
726
+ status.imports.add("t_skip");
708
727
  const match = varPath.match(/(t_next\(){2,}/)![0];
709
728
  const count = match.length / "t_next(".length;
710
729
  const pos = varPath.indexOf("t_next(t_next(");
@@ -725,9 +744,12 @@ function getFragmentVarPath(
725
744
  }
726
745
  const tail = varPath.substring(end + count);
727
746
  const param = varPath.substring(pos + match.length, end);
728
- varPath = `${head}t_next(${param}, ${count})${tail}`;
747
+ varPath = `${head}t_skip(${param}, ${count})${tail}`;
729
748
  }
730
749
 
750
+ // Set t_next_text back to t_next
751
+ varPath = varPath.replaceAll("t_next_text", "t_next");
752
+
731
753
  return varPath;
732
754
  }
733
755
 
@@ -746,18 +768,14 @@ function getFragmentVarPathPart(
746
768
  }
747
769
  for (let [i, child] of path.children.entries()) {
748
770
  if (i > 0) {
749
- status.imports.add("t_next");
750
- //if (varPath.startsWith("t_next")) {
751
- // const match = varPath.match(/t_next\(.+?, (\d+)\)/);
752
- // if (match) {
753
- // const count = parseInt(match[1]) + 1;
754
- // varPath = varPath.replace(/t_next\((.+), \d+\)/, `t_next($1, ${count})`);
755
- // } else {
756
- // varPath = varPath.replace(/t_next\((.+)\)/, `t_next($1, 2)`);
757
- // }
758
- //} else {
759
- varPath = `t_next(${varPath})`;
760
- //}
771
+ if (child.type === "text" || child.type === "space") {
772
+ // HACK: Using t_next_text just stops t_next(node, true) from
773
+ // being converted into t_skip
774
+ varPath = `t_next_text(${varPath}, true)`;
775
+ } else {
776
+ status.imports.add("t_next");
777
+ varPath = `t_next(${varPath})`;
778
+ }
761
779
  }
762
780
 
763
781
  if (i === path.children.length - 1 && child.children.length) {
@@ -767,6 +785,14 @@ function getFragmentVarPathPart(
767
785
  return varPath;
768
786
  }
769
787
 
788
+ const debug = false;
789
+ function printDebug(varName: string, status: BuildStatus, b: Builder) {
790
+ if (debug) {
791
+ status.imports.add("t_print");
792
+ b.append(`console.log("${varName}:", t_print(${varName}));`);
793
+ }
794
+ }
795
+
770
796
  /*
771
797
  function printPath(path: VariablePath) {
772
798
  let parent = path;
@@ -18,7 +18,11 @@ export default function buildRootNode(
18
18
  fragment: node.fragment,
19
19
  path: "0:ch/",
20
20
  });
21
- buildNode(node.children[0], status, b, parentName, anchorName, true);
21
+
22
+ for (let child of node.children) {
23
+ buildNode(child, status, b, parentName, anchorName, true);
24
+ }
25
+
22
26
  status.fragmentStack.pop();
23
27
 
24
28
  buildAddFragment(node, status, b, parentName, anchorName);
@@ -18,20 +18,24 @@ const globalStyleRegex = /\:global\((.+)\)/;
18
18
  function buildStyleBlock(block: StyleBlock, b: Builder, styleHash: string) {
19
19
  // TODO: This should probably be done while parsing
20
20
  // And handle attribute selectors
21
- const selectors = block.selector
22
- .split(/([\s*,>+~])/)
23
- .filter((s) => !!s.trim())
24
- .map((s) => {
25
- if (s.length === 1 && "*,>+~".includes(s)) {
26
- return s;
27
- } else if (globalStyleRegex.test(s)) {
28
- return s.match(globalStyleRegex)![1];
29
- } else {
30
- return `${s}.torp-${styleHash}`;
31
- }
32
- });
33
-
34
- b.append(`${selectors.join(" ")} {`);
21
+ if (block.selector.startsWith("@")) {
22
+ // Just output media queries and properties as-is
23
+ b.append(`${block.selector} {`);
24
+ } else {
25
+ const selectors = block.selector
26
+ .split(/([\s*,>+~])/)
27
+ .filter((s) => !!s.trim())
28
+ .map((s) => {
29
+ if (s.length === 1 && "*,>+~".includes(s)) {
30
+ return s;
31
+ } else if (globalStyleRegex.test(s)) {
32
+ return s.match(globalStyleRegex)![1];
33
+ } else {
34
+ return `${s}.torp-${styleHash}`;
35
+ }
36
+ });
37
+ b.append(`${selectors.join(" ")} {`);
38
+ }
35
39
  for (let attribute of block.attributes) {
36
40
  buildStyleAttribute(attribute, b);
37
41
  }
@@ -126,8 +126,6 @@ export default function buildServerComponentNode(
126
126
  b.append("");
127
127
  b.append(`$output += ${componentName}(${renderParams})`);
128
128
 
129
- // If we're using a @replace to update a :component, we need another anchor comment
130
- if (node.tagName === ":component") {
131
- status.output += ANCHOR_COMMENT;
132
- }
129
+ // Add the anchor node
130
+ status.output += ANCHOR_COMMENT;
133
131
  }
@@ -77,7 +77,8 @@ export default function buildServerControlNode(
77
77
  buildServerScriptNode(node, b);
78
78
  break;
79
79
  }
80
- case "@function": {
80
+ case "@function":
81
+ case "@async function": {
81
82
  if (status.output) {
82
83
  b.append(`$output += \`${status.output}\`;`);
83
84
  status.output = "";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  ANCHOR_COMMENT,
3
- HYDRATION_BRANCH_COMMENT,
3
+ HYDRATION_BREAK_COMMENT,
4
4
  HYDRATION_END_COMMENT,
5
5
  HYDRATION_START_COMMENT,
6
6
  } from "../../types/comments";
@@ -42,7 +42,7 @@ function buildServerForBranch(node: ControlNode, status: BuildServerStatus, b: B
42
42
  b.append(`${node.statement} {`);
43
43
 
44
44
  // Separate spaces across boundaries with a careted comment
45
- status.output += HYDRATION_BRANCH_COMMENT;
45
+ status.output += HYDRATION_BREAK_COMMENT;
46
46
 
47
47
  for (let child of node.children) {
48
48
  buildServerNode(child, status, b);
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  ANCHOR_COMMENT,
3
+ HYDRATION_BREAK_COMMENT,
3
4
  HYDRATION_END_COMMENT,
4
5
  HYDRATION_START_COMMENT,
5
6
  } from "../../types/comments";
@@ -40,6 +41,9 @@ export default function buildServerIfNode(
40
41
  function buildServerIfBranch(node: ControlNode, status: BuildServerStatus, b: Builder) {
41
42
  b.append(`${node.statement} {`);
42
43
 
44
+ // Separate spaces across boundaries with a careted comment
45
+ status.output += HYDRATION_BREAK_COMMENT;
46
+
43
47
  for (let child of node.children) {
44
48
  buildServerNode(child, status, b);
45
49
  }
@@ -8,5 +8,7 @@ export default function buildServerRootNode(
8
8
  status: BuildServerStatus,
9
9
  b: Builder,
10
10
  ): void {
11
- buildServerNode(node.children[0], status, b);
11
+ for (let child of node.children) {
12
+ buildServerNode(child, status, b);
13
+ }
12
14
  }
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  ANCHOR_COMMENT,
3
+ HYDRATION_BREAK_COMMENT,
3
4
  HYDRATION_END_COMMENT,
4
5
  HYDRATION_START_COMMENT,
5
6
  } from "../../types/comments";
@@ -42,6 +43,9 @@ export default function buildServerSwitchNode(
42
43
  function buildServerSwitchBranch(node: ControlNode, status: BuildServerStatus, b: Builder) {
43
44
  b.append(`${node.statement} {`);
44
45
 
46
+ // Separate spaces across boundaries with a careted comment
47
+ status.output += HYDRATION_BREAK_COMMENT;
48
+
45
49
  for (let child of node.children) {
46
50
  buildServerNode(child, status, b);
47
51
  }
@@ -1,6 +1,7 @@
1
1
  import { type CompileError } from "../types/CompileError";
2
2
  import { type Import } from "../types/Import";
3
3
  import { type ElementNode } from "../types/nodes/ElementNode";
4
+ import { type RootNode } from "../types/nodes/RootNode";
4
5
  import { type Style } from "../types/styles/Style";
5
6
 
6
7
  export type ParseStatus = {
@@ -25,7 +26,7 @@ export interface ParseComponentStatus {
25
26
  default?: boolean;
26
27
  /** Params declared by the user in the component's function */
27
28
  params?: string;
28
- markup?: ElementNode;
29
+ markup?: RootNode;
29
30
  stack?: ElementNode[];
30
31
  style?: Style;
31
32
  /** $props that are used in the component's function */
@@ -1,5 +1,6 @@
1
1
  import { type TemplateComponent } from "../../types/TemplateComponent";
2
2
  import { type ParseResult } from "../types/ParseResult";
3
+ import isElementNode from "../types/nodes/isElementNode";
3
4
  import isSpaceNode from "../types/nodes/isSpaceNode";
4
5
  import trimQuotes from "../utils/trimQuotes";
5
6
  import { type ParseStatus } from "./ParseStatus";
@@ -103,12 +104,7 @@ export default function parseCode(source: string): ParseResult {
103
104
  name: c.name,
104
105
  default: c.default,
105
106
  params: c.params,
106
- markup: c.markup
107
- ? {
108
- type: "root",
109
- children: [c.markup],
110
- }
111
- : undefined,
107
+ markup: c.markup,
112
108
  style: c.style,
113
109
  props: c.props,
114
110
  contextProps: c.contextProps,
@@ -300,8 +296,9 @@ function parseComponentEnd(status: ParseStatus) {
300
296
  // better instead to create whitespace if we don't find it when hydrating...
301
297
  if (
302
298
  current.markup &&
303
- current.markup.tagName === "html" &&
304
- isSpaceNode(current.markup.children[0])
299
+ isElementNode(current.markup.children[0]) &&
300
+ current.markup.children[0].tagName === "html" &&
301
+ isSpaceNode(current.markup.children[0].children[0])
305
302
  ) {
306
303
  current.markup.children.splice(1, 1);
307
304
  }
@@ -1,6 +1,7 @@
1
1
  import { type ControlNode } from "../types/nodes/ControlNode";
2
2
  import { type ElementNode } from "../types/nodes/ElementNode";
3
3
  import { type OperationType } from "../types/nodes/OperationType";
4
+ import { type RootNode } from "../types/nodes/RootNode";
4
5
  import isControlNode from "../types/nodes/isControlNode";
5
6
  import trimMatched from "../utils/trimMatched";
6
7
  import trimStart from "../utils/trimStart";
@@ -30,13 +31,22 @@ const controlOperations = [
30
31
  "@console",
31
32
  "@debugger",
32
33
  "@function",
34
+ "@async function",
33
35
  ];
34
36
 
35
- const standaloneOperations = ["@key", "@html", "@const", "@console", "@debugger", "@function"];
37
+ const standaloneOperations = [
38
+ "@key",
39
+ "@html",
40
+ "@const",
41
+ "@console",
42
+ "@debugger",
43
+ "@function",
44
+ "@async function",
45
+ ];
36
46
 
37
47
  export default function parseControl(
38
48
  status: ParseStatus,
39
- parentNode: ElementNode | ControlNode,
49
+ parentNode: RootNode | ElementNode | ControlNode,
40
50
  ): void {
41
51
  const node = parseControlOpen(status);
42
52
  if (!node) {
@@ -91,7 +101,7 @@ function parseControlOpen(status: ParseStatus): ControlNode | null {
91
101
  for (status.i; status.i < status.source.length; status.i++) {
92
102
  const char = status.source[status.i];
93
103
  if (
94
- isSpaceChar(status.source, status.i) ||
104
+ (isSpaceChar(status.source, status.i) && operation !== "@async") ||
95
105
  (accept(":", status) && operation === "default") ||
96
106
  (accept(".", status) && operation === "@console") ||
97
107
  (accept("(", status, false) && operation === "@html")
@@ -111,7 +121,7 @@ function parseControlOpen(status: ParseStatus): ControlNode | null {
111
121
  statement = parseControlStatement(start, operation, status);
112
122
 
113
123
  // Special processing for functions -- read until the closing brace
114
- if (operation === "@function") {
124
+ if (operation === "@function" || operation === "@async function") {
115
125
  statement += ` {${parseInlineScript(status)}}`;
116
126
  accept("}", status);
117
127
  }
@@ -188,7 +198,7 @@ function parseControlStatement(start: number, operation: string, status: ParseSt
188
198
  * @param node The control node
189
199
  * @param parentNode The parent node
190
200
  */
191
- function wrangleControlNode(node: ControlNode, parentNode: ElementNode | ControlNode) {
201
+ function wrangleControlNode(node: ControlNode, parentNode: RootNode | ElementNode | ControlNode) {
192
202
  // Group
193
203
  // * if/else into an if group
194
204
  // * for into a for group
@@ -274,7 +284,10 @@ function wrangleControlNode(node: ControlNode, parentNode: ElementNode | Control
274
284
  * @param status The parse status
275
285
  * @param parentNode The parent node
276
286
  */
277
- function parseControlBranches(status: ParseStatus, parentNode: ElementNode | ControlNode) {
287
+ function parseControlBranches(
288
+ status: ParseStatus,
289
+ parentNode: RootNode | ElementNode | ControlNode,
290
+ ) {
278
291
  // Look ahead and see if we have another control statement
279
292
  // NOTE: We could be more strict here (e.g. we could check that an else is
280
293
  // after an if), but for now we are just leaving it to the JS parser
@@ -1,7 +1,10 @@
1
- import { type ParseStatus } from "./ParseStatus";
1
+ import type { TextNode } from "../types/nodes/TextNode";
2
+ import type { ParseStatus } from "./ParseStatus";
3
+ import parseControl from "./parseControl";
2
4
  import parseElement from "./parseElement";
3
5
  import accept from "./utils/accept";
4
- import addError from "./utils/addError";
6
+ import consumeSpace from "./utils/consumeSpace";
7
+ import isSpaceChar from "./utils/isSpaceChar";
5
8
 
6
9
  export default function parseMarkup(status: ParseStatus, source: string): void {
7
10
  const current = status.components.at(-1);
@@ -20,15 +23,19 @@ export default function parseMarkup(status: ParseStatus, source: string): void {
20
23
  } else if (accept("@/*", status)) {
21
24
  // Swallow block comments
22
25
  status.i = status.source.indexOf("*/", status.i) + 2;
26
+ } else if (isSpaceChar(status.source, status.i)) {
27
+ current.markup ??= { type: "root", children: [] };
28
+ const text: TextNode = { type: "text", content: consumeSpace(status) };
29
+ current.markup.children.push(text);
23
30
  } else if (accept("<", status, false)) {
24
31
  // Parse the element
25
- const start = status.i;
32
+ current.markup ??= { type: "root", children: [] };
26
33
  const element = parseElement(status);
27
- if (current.markup === undefined) {
28
- current.markup = element;
29
- } else if (!element.tagName.startsWith("/")) {
30
- addError(status, `Multiple top-level elements: ${element.tagName}`, start);
31
- }
34
+ current.markup.children.push(element);
35
+ } else if (accept("@", status, false)) {
36
+ // Parse the control
37
+ current.markup ??= { type: "root", children: [] };
38
+ parseControl(status, current.markup);
32
39
  } else {
33
40
  status.i += 1;
34
41
  }
@@ -1,6 +1,6 @@
1
1
  const ANCHOR_COMMENT = "<!>";
2
2
  const HYDRATION_START_COMMENT = "<![>";
3
3
  const HYDRATION_END_COMMENT = "<!]>";
4
- const HYDRATION_BRANCH_COMMENT = "<!^>";
4
+ const HYDRATION_BREAK_COMMENT = "<!^>";
5
5
 
6
- export { ANCHOR_COMMENT, HYDRATION_START_COMMENT, HYDRATION_END_COMMENT, HYDRATION_BRANCH_COMMENT };
6
+ export { ANCHOR_COMMENT, HYDRATION_START_COMMENT, HYDRATION_END_COMMENT, HYDRATION_BREAK_COMMENT };
@@ -20,4 +20,5 @@ export type OperationType =
20
20
  | "@const"
21
21
  | "@console"
22
22
  | "@debugger"
23
- | "@function";
23
+ | "@function"
24
+ | "@async function";
@@ -1,43 +1,61 @@
1
- export default function printNode(node: Node | null | undefined) {
2
- let textContent = node?.textContent;
3
- let paths: string[] = [];
1
+ export default function printNode(node: Node | null | undefined): string {
2
+ if (!node) {
3
+ return `\x1b[41m[null]\x1b[0m`;
4
+ }
4
5
 
5
- while (node != null) {
6
- if (node.nodeType === 1) {
7
- // Element
8
- let el = node as Element;
9
- let p = el.tagName.toLowerCase();
10
- if (el.id) p += "#" + el.id;
11
- if (el.classList.length) p += "." + Array.from(el.classList).join(".");
12
- if (node.parentNode) p += `[${Array.from(node.parentNode.childNodes).indexOf(el)}]`;
13
- paths.push(p);
14
- } else if (node.nodeType === 3) {
15
- // Text
16
- let txt = node as Text;
17
- let p = "txt";
18
- if (node.parentNode) p += `[${Array.from(node.parentNode.childNodes).indexOf(txt)}]`;
19
- paths.push(p);
20
- } else if (node.nodeType === 8) {
21
- // Comment
22
- let com = node as Comment;
23
- let p = "cmt";
24
- if (node.parentNode) p += `[${Array.from(node.parentNode.childNodes).indexOf(com)}]`;
25
- paths.push(p);
26
- } else if (node.nodeType === 9) {
27
- // Document
28
- paths.push("#doc");
29
- } else if (node.nodeType === 11) {
30
- // Document fragment
31
- paths.push("#frag");
32
- } else {
33
- paths.push(node.nodeType + "?");
6
+ let parent = node;
7
+ while (parent?.parentNode) {
8
+ if (parent.parentNode?.nodeType === 1 && parent.parentElement?.tagName === "BODY") {
9
+ break;
34
10
  }
35
- node = node.parentNode;
11
+ parent = parent.parentNode;
36
12
  }
37
13
 
38
- return `[ ${paths.reverse().join(" > ") || "null"} -- '${truncate(textContent || "", 40)}' ]`;
14
+ let status = { p: "" };
15
+ printChildNode(parent!, node!, status);
16
+
17
+ return status.p;
39
18
  }
40
19
 
41
- function truncate(input: string, length: number) {
42
- return input.length > length ? `${input.substring(0, length)}…` : input;
20
+ function printChildNode(node: Node, target: Node, status: { p: string }) {
21
+ if (node.nodeType === 1) {
22
+ // Element
23
+ let el = node as Element;
24
+ let p = `<${el.tagName.toLowerCase()}>`;
25
+ if (node === target) {
26
+ p = `\x1b[44m${p}\x1b[0m`;
27
+ }
28
+ status.p += p;
29
+ } else if (node.nodeType === 3) {
30
+ // Text
31
+ let p = "…";
32
+ if (node === target) {
33
+ p = `\x1b[44m${p}\x1b[0m`;
34
+ }
35
+ status.p += p;
36
+ } else if (node.nodeType === 8) {
37
+ // Comment
38
+ let com = node as Comment;
39
+ let p = `<!${com.data}>`;
40
+ if (node === target) {
41
+ p = `\x1b[44m${p}\x1b[0m`;
42
+ }
43
+ status.p += p;
44
+ } else if (node.nodeType === 9) {
45
+ // Document
46
+ } else if (node.nodeType === 11) {
47
+ // Document fragment
48
+ } else {
49
+ }
50
+
51
+ for (let child of node.childNodes) {
52
+ printChildNode(child, target, status);
53
+ }
54
+
55
+ if (node.nodeType === 1) {
56
+ // Element
57
+ let el = node as Element;
58
+ let p = `</${el.tagName.toLowerCase()}>`;
59
+ status.p += p;
60
+ }
43
61
  }