@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.
Files changed (276) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +5 -5
  3. package/dist/compile.cjs +77 -32
  4. package/dist/compile.cjs.map +1 -1
  5. package/dist/compile.js +77 -32
  6. package/dist/compile.js.map +1 -1
  7. package/dist/index.cjs +31 -15
  8. package/dist/index.cjs.map +1 -1
  9. package/dist/index.d.cts +2 -4
  10. package/dist/index.d.ts +2 -4
  11. package/dist/index.js +31 -14
  12. package/dist/index.js.map +1 -1
  13. package/dist/metafile-cjs.json +1 -1
  14. package/dist/metafile-esm.json +1 -1
  15. package/package.json +4 -4
  16. package/scripts/copyToRepl.ts +1 -1
  17. package/src/compile/build/client/buildCode.ts +2 -11
  18. package/src/compile/build/client/buildComponentNode.ts +21 -5
  19. package/src/compile/build/client/buildElementNode.ts +27 -10
  20. package/src/compile/build/client/buildFragment.ts +37 -1
  21. package/src/compile/build/client/buildHtmlNode.ts +1 -0
  22. package/src/compile/build/client/buildSlotNode.ts +4 -1
  23. package/src/compile/build/server/buildServerComponentNode.ts +4 -1
  24. package/src/compile/build/server/buildServerElementNode.ts +5 -2
  25. package/src/compile/build/server/buildServerSlotNode.ts +4 -1
  26. package/src/compile/parse/parseCode.ts +20 -12
  27. package/src/index.ts +0 -2
  28. package/src/motion/animate.ts +10 -6
  29. package/src/render/$unwrap.ts +1 -1
  30. package/src/render/addFragment.ts +14 -4
  31. package/src/render/hydrate.ts +7 -0
  32. package/src/render/nodeNext.ts +14 -7
  33. package/src/render/runControlBranch.ts +11 -1
  34. package/src/render/runList.ts +8 -2
  35. package/test/attributes/attributes.test.ts +3 -0
  36. package/test/attributes/components/Attributes.torp +6 -1
  37. package/test/attributes/components/output/Attributes-client.ts +6 -2
  38. package/test/attributes/components/output/Attributes-server.ts +2 -1
  39. package/test/attributes/components/temp/{Attributes-client-c4812cb9307eac6ff44f90f3358a1811b52c7390.ts → Attributes-client-7b8f7b9996208e8d2d0a12d4f4a40a73df63d9d8.ts} +6 -2
  40. package/test/attributes/components/temp/{Attributes-server-a7ebed503f2169f7c900d4613531082f1023b086.ts → Attributes-server-a1289434a5a801be1d63bfc85b621579e06452f0.ts} +2 -1
  41. package/test/await/await.test.ts +2 -4
  42. package/test/await/components/output/Await-client.ts +4 -4
  43. package/test/await/components/temp/{Await-client-6ce3ac610ce79ae3b474c81964b715e6f3d966da.ts → Await-client-a7bf000bf2b59a3d5251a0fa18ec79890a52a547.ts} +4 -4
  44. package/test/bench/bench.bench.ts +5 -7
  45. package/test/bench/components/output/Bench-client.ts +208 -0
  46. package/test/bench/components/output/Bench-server.ts +130 -0
  47. package/test/bench/components/temp/{Bench-client-5fee290225ae4771aa847360006123671e8f17f1.ts → Bench-client-fca94b485c6263778751927240ab3ca4048d7a10.ts} +10 -10
  48. package/test/bind/bind.test.ts +3 -5
  49. package/test/bind/component.test.ts +45 -0
  50. package/test/bind/components/BindComponent.torp +29 -0
  51. package/test/bind/components/BindText.torp +2 -2
  52. package/test/bind/components/output/BindComponent-client.ts +87 -0
  53. package/test/bind/components/output/BindComponent-server.ts +52 -0
  54. package/test/bind/components/output/BindText-client.ts +3 -3
  55. package/test/bind/components/temp/BindComponent-client-a645474748485a878871c062ad69e6bcf35e6550.ts +87 -0
  56. package/test/bind/components/temp/BindComponent-server-c557e7aa944517ab87415b8bb35b41b0034254e7.ts +52 -0
  57. package/test/bind/components/temp/{BindText-client-9e2f542e13bcbf9a44eab2c5a79d67ddb128f928.ts → BindText-client-d5f7d721df55020ef337f660e5d278eb80fcc330.ts} +3 -3
  58. package/test/build-server/build-server-element-node.test.ts +1 -1
  59. package/test/buildOutputFiles.ts +6 -3
  60. package/test/child-component/components/output/ParentChild-client.ts +3 -2
  61. package/test/child-component/components/output/ParentChild-server.ts +1 -0
  62. package/test/child-component/components/temp/{ParentChild-client-8f00a3a31a7f666990765fc4755b62a39c855226.ts → ParentChild-client-eaefb0cbfd251badab3c57ae2037d973f785a1b8.ts} +3 -2
  63. package/test/child-component/components/temp/{ParentChild-server-9c791bdfa521c3f6549857a34a6cd414fa3c9e80.ts → ParentChild-server-8f2fc556f87867e6e3393e2e9e6d696cda107b69.ts} +1 -0
  64. package/test/class/components/output/Class-client.ts +7 -6
  65. package/test/class/components/output/Class-server.ts +1 -0
  66. package/test/class/components/temp/{Class-client-8bf02b6a0c85674d341617dfb755b285b1af89cf.ts → Class-client-dc885e1e391f38973bd9ea25b7475b07f7c23960.ts} +7 -6
  67. package/test/class/components/temp/{Class-server-dd71b6ec62f40231917a912819520fc614f017ae.ts → Class-server-d1a2463ba432e10c6f68bd59d1d31949c5a2044f.ts} +1 -0
  68. package/test/component/components/output/Component-client.ts +3 -2
  69. package/test/component/components/output/Component-server.ts +1 -1
  70. package/test/component/components/output/Header-client.ts +2 -1
  71. package/test/component/components/output/Header-server.ts +1 -0
  72. package/test/component/components/temp/{Component-client-32cd481f03e25d10b8e93947a2ff8773135b4975.ts → Component-client-a2fb6f30fc340bac909b64cb4f5ac68cde376de3.ts} +3 -2
  73. package/test/component/components/temp/{Component-server-11542f55405218c0b471172cac1d6a1a4edb5c09.ts → Component-server-40be12cd528ccf768f1ad40ef2a435ad2b2a2d71.ts} +1 -1
  74. package/test/component/components/temp/{Header-client-ac151eea86e3f6b058fab101661e13ae73864968.ts → Header-client-75cb4aa868295ac168c16ba7b275fbb5ab9256f9.ts} +2 -1
  75. package/test/component/components/temp/{Header-server-4f10f2332f3ca7a097517cfb938ab1e6f31d68ac.ts → Header-server-f73307874bec34a95dcd152d7f83a3ad13a0f4ac.ts} +1 -0
  76. package/test/effects/components/output/For-client.ts +3 -2
  77. package/test/effects/components/output/For-server.ts +1 -0
  78. package/test/effects/components/output/If-client.ts +4 -3
  79. package/test/effects/components/output/If-server.ts +1 -0
  80. package/test/effects/components/output/NestedIf-client.ts +4 -3
  81. package/test/effects/components/output/NestedIf-server.ts +1 -0
  82. package/test/effects/components/temp/{For-client-887b1758cf5c80f64708a47369e0e6ce44ffa20f.ts → For-client-d8d4e4424ec3238fe9f79cc907d673612b63bcdf.ts} +3 -2
  83. package/test/effects/components/temp/{For-server-8e1c7393b102c870167dd086cbee45c47e614dfa.ts → For-server-1f853c161bea31a1a5b11b00d7a021b70c778066.ts} +1 -0
  84. package/test/effects/components/temp/{If-client-bfc548ef699b91f33e604f066211ce6269cc9506.ts → If-client-bb06988422395321bf298a75bf5563c6f750f776.ts} +4 -3
  85. package/test/effects/components/temp/{If-server-8c213b1a82cd0a5c2bccfeb90ba8bf01fa4672d2.ts → If-server-97e3cbe059306fc607985dcd1b187df3a278d979.ts} +1 -0
  86. package/test/effects/components/temp/{NestedIf-client-9e9155398f240345af392194063adc6e42dda80c.ts → NestedIf-client-dc880c1ec92e716ec730dfa0bac0e3d9265bdf27.ts} +4 -3
  87. package/test/effects/components/temp/{NestedIf-server-5f11d075c2ff224ee5feb7f61aa41aea8af44313.ts → NestedIf-server-9f199a33bae5d5fe34920d6a419937537a2b18dc.ts} +1 -0
  88. package/test/events/components/output/Increment-client.ts +2 -2
  89. package/test/events/components/temp/{Increment-client-35c275d15e94e4aa7625af12c45210521995ead5.ts → Increment-client-41bd7bc91aac8c7a9bf73527c8f7ba1794b09ab3.ts} +2 -2
  90. package/test/events/events.test.ts +2 -3
  91. package/test/for/components/ForEscape.torp +1 -1
  92. package/test/for/components/output/For-client.ts +1 -1
  93. package/test/for/components/output/ForEscape-client.ts +4 -4
  94. package/test/for/components/output/ForIn-client.ts +3 -2
  95. package/test/for/components/output/ForIn-server.ts +1 -0
  96. package/test/for/components/output/ForOf-client.ts +3 -2
  97. package/test/for/components/output/ForOf-server.ts +1 -0
  98. package/test/for/components/temp/{For-client-1f6e475347f0474375f12a7c24b0b293e3942aa7.ts → For-client-0be5994e98c07a3455cd8a18a2b1b8ef3605aba6.ts} +1 -1
  99. package/test/for/components/temp/{ForEscape-client-80d3078cf15001f2ab37b0ec63cfce7267a8a166.ts → ForEscape-client-a973a145e28b32ca55fe3dca53d885fcf5e11c37.ts} +4 -4
  100. package/test/for/components/temp/{ForIn-client-c8a1ec4473d05475e11928d06d081ab671fd9f28.ts → ForIn-client-5cc25a98e10826e8477fe6f931d5d2bbd0b13c9f.ts} +3 -2
  101. package/test/for/components/temp/{ForIn-server-d92cf8d3c3e300b562308607caca2c9cab3cb30b.ts → ForIn-server-d68e82c048f7e0f1525f74724b91e5cd01cdc6a6.ts} +1 -0
  102. package/test/for/components/temp/{ForOf-client-069881d4d9e52bc091e7213154924f3e1626174a.ts → ForOf-client-70b0d59ff72f1cffe2e0ac8523dd7ccdca4ffe39.ts} +3 -2
  103. package/test/for/components/temp/{ForOf-server-3bfbb33bd589890d272bbcbea53d9598f53bfd70.ts → ForOf-server-ac08d98dd249a3e64a366b8488450e6ce0d18def.ts} +1 -0
  104. package/test/for/for-escape.test.ts +2 -3
  105. package/test/function/components/output/Function-client.ts +1 -1
  106. package/test/function/components/temp/{Function-client-b8931e51769f3f1e84d1491c6474f8551acf9f8d.ts → Function-client-b3ff029a821d47e1a2249a52dfb681f4b2e96232.ts} +1 -1
  107. package/test/function/function.test.ts +1 -2
  108. package/test/html/components/output/Html-client.ts +3 -1
  109. package/test/html/components/output/Html-server.ts +1 -0
  110. package/test/html/components/temp/{Html-client-5fc745d9980a42a70dcb3473b0fd976e69882c9e.ts → Html-client-766ba4a63f28f929ca16cd7d1640fe92f9b30792.ts} +3 -1
  111. package/test/html/components/temp/{Html-server-437ea390e58947213ede74755a012cdacceeebe7.ts → Html-server-0a41da8b81bf833f331f3becdbac14be7ddc6c8c.ts} +1 -0
  112. package/test/if/components/output/IfAfterIf-client.ts +5 -4
  113. package/test/if/components/output/IfAfterIf-server.ts +1 -0
  114. package/test/if/components/output/IfElse-client.ts +4 -3
  115. package/test/if/components/output/IfElse-server.ts +1 -0
  116. package/test/if/components/output/IfElseIf-client.ts +5 -4
  117. package/test/if/components/output/IfElseIf-server.ts +1 -0
  118. package/test/if/components/output/IfNested-client.ts +5 -4
  119. package/test/if/components/output/IfNested-server.ts +1 -0
  120. package/test/if/components/temp/{IfAfterIf-client-a489daa5b961ed9da71418fdbb1665b6ba39f1b7.ts → IfAfterIf-client-49b6b8c42b0a351561f9f5f22c2ae2e844bf3b58.ts} +5 -4
  121. package/test/if/components/temp/{IfAfterIf-server-243736e666e7d77d3f8553a1682734555f5ffd22.ts → IfAfterIf-server-eb67cf1fcf6711882266219940a47bd4a66497f3.ts} +1 -0
  122. package/test/if/components/temp/{IfElse-client-4c71642f412d5dd2f45729eafb7e974781dbe011.ts → IfElse-client-e236d4a2e99262ff09675bc519c07e2826c0d70b.ts} +4 -3
  123. package/test/if/components/temp/{IfElse-server-64c055182b327504ee71d1f1d44cfccf48be350d.ts → IfElse-server-c077e0e30f4d2adec41ab779198362d21542d055.ts} +1 -0
  124. package/test/if/components/temp/{IfElseIf-client-98d50d6f40c2385c4ef4fc02329f9d2e182c76c4.ts → IfElseIf-client-b92106861f0c7ec3d09e3a42bb93d8f5bd4e3bdf.ts} +5 -4
  125. package/test/if/components/temp/{IfElseIf-server-79788b13af905175f50bfa8658f2ff2af73db232.ts → IfElseIf-server-67991eee3f56dc687cda600511c31396438e0a77.ts} +1 -0
  126. package/test/{build-server/components/temp/IfNested-client-979db97eea5b4595550b9b46f297f3fbc31796d2.ts → if/components/temp/IfNested-client-f563ac1b16a2280e457557281c4925ed447a9cd7.ts} +5 -4
  127. package/test/{build-server/components/temp/IfNested-server-3c4e4b6f2162c0906cef685830219b9ea9ee985c.ts → if/components/temp/IfNested-server-0a2a9643324ab73b02b310cad61ba87dab146ab2.ts} +1 -0
  128. package/test/mount/components/Mount.torp +1 -1
  129. package/test/mount/components/output/Mount-client.ts +0 -2
  130. package/test/mount/components/output/Mount-server.ts +1 -1
  131. package/test/mount/components/temp/{Mount-client-49d8d6475336b5749fe8a17be847fd2b6cda5ccc.ts → Mount-client-36dbc95a61345a1b7dcf07e6b0c998af2afca691.ts} +0 -2
  132. package/test/mount/components/temp/{Mount-server-e3d689cf52a4477da9aa00e2c7604110710db991.ts → Mount-server-8bef1924a731f3db63cb827be3938fec685e53af.ts} +1 -1
  133. package/test/on-mount/components/output/OnMount-client.ts +0 -2
  134. package/test/on-mount/components/temp/{OnMount-client-b2dfd41a0aaeafb3b7af14793a03e0fc3bc43aaa.ts → OnMount-client-21708a638d2939ee8b017f5dc819cee4748bde87.ts} +0 -2
  135. package/test/party/13-emit-to-parent.test.ts +2 -3
  136. package/test/party/16-context.test.ts +1 -2
  137. package/test/party/17-input-text.test.ts +2 -3
  138. package/test/party/18-input-checkbox.test.ts +1 -2
  139. package/test/party/19-input-radio.test.ts +2 -3
  140. package/test/party/20-input-select.test.ts +3 -4
  141. package/test/party/7-event-click.test.ts +1 -3
  142. package/test/party/9-conditional.test.ts +2 -4
  143. package/test/party/components/ColorSelect.torp +1 -1
  144. package/test/party/components/InputFocused.torp +1 -1
  145. package/test/party/components/InputHello.torp +1 -1
  146. package/test/party/components/IsAvailable.torp +1 -1
  147. package/test/party/components/PickPill.torp +2 -2
  148. package/test/party/components/output/AnswerButton-client.ts +3 -2
  149. package/test/party/components/output/AnswerButton-server.ts +1 -0
  150. package/test/party/components/output/AnswerButtonApp-client.ts +4 -4
  151. package/test/party/components/output/AnswerButtonApp-server.ts +1 -1
  152. package/test/party/components/output/ColorSelect-client.ts +1 -1
  153. package/test/party/components/output/Colors-client.ts +1 -1
  154. package/test/party/components/output/Counter-client.ts +1 -1
  155. package/test/party/components/output/FunnyButton-client.ts +1 -1
  156. package/test/party/components/output/FunnyButtonApp-client.ts +2 -2
  157. package/test/party/components/output/FunnyButtonApp-server.ts +1 -1
  158. package/test/party/components/output/InputFocused-client.ts +0 -2
  159. package/test/party/components/output/InputFocused-server.ts +1 -1
  160. package/test/party/components/output/InputHello-client.ts +1 -1
  161. package/test/party/components/output/IsAvailable-client.ts +1 -1
  162. package/test/party/components/output/PickPill-client.ts +2 -2
  163. package/test/party/components/output/TrafficLight-client.ts +6 -6
  164. package/test/party/components/output/UserProfile-client.ts +5 -4
  165. package/test/party/components/output/UserProfile-server.ts +1 -0
  166. package/test/party/components/output/UserProfileApp-client.ts +3 -2
  167. package/test/party/components/output/UserProfileApp-server.ts +1 -1
  168. package/test/party/components/output/UserProfileContext-client.ts +3 -3
  169. package/test/party/components/output/UserProfileContextApp-client.ts +2 -2
  170. package/test/party/components/output/UserProfileContextApp-server.ts +1 -1
  171. package/test/party/components/temp/{AnswerButton-client-243454cd7bf84c648f244b3587e60d01a0401039.ts → AnswerButton-client-c3dc7edbfff2db1ea111086002147d771ee12193.ts} +3 -2
  172. package/test/party/components/temp/{AnswerButton-server-938e46c1d2510ea37454854ef527e4aa64eb8e52.ts → AnswerButton-server-427442fa8cfc0a18817c2d37f9cb5cbcb3a88a05.ts} +1 -0
  173. package/test/party/components/temp/{AnswerButtonApp-client-34311c2e7412807867fb6267af31a341f092bf31.ts → AnswerButtonApp-client-3e0b63a6bbc1dee3e6cb715c0297cc2ce58d3e4e.ts} +4 -4
  174. package/test/party/components/temp/{AnswerButtonApp-server-3f5071775abea24ee8830830072c6fe465fc4e56.ts → AnswerButtonApp-server-bbc8bb739d2060ccda77ce406aa6b15d8f90b91c.ts} +1 -1
  175. package/test/party/components/temp/{ColorSelect-client-f9fb9fa09f4729da3226d5aaf30e84cd3cd705b5.ts → ColorSelect-client-5ffa6f9d77de967993088c9a01b9f976f3333176.ts} +1 -1
  176. package/test/party/components/temp/{Colors-client-f124162d1dd8f0c3d37bf96c8e5f18599ae3a682.ts → Colors-client-3dafffc5c2a72037f4419fc45d08963872a29958.ts} +1 -1
  177. package/test/party/components/temp/{Counter-client-c349710110b4afbf9593f20cfc40c162ed836079.ts → Counter-client-4d553521fcfc6c9a4e05dce89e70b2ecf8785c4e.ts} +1 -1
  178. package/test/party/components/temp/{FunnyButton-client-2e6bec8259065b5bc9ae16d1ca93dd1bd0c56b7c.ts → FunnyButton-client-45f2c5dd56f2cdb80102193a978df6b0cec822ab.ts} +1 -1
  179. package/test/party/components/temp/{FunnyButtonApp-client-4ed0ebf5be13ddb62d9942bac7f4b8a885ec6c50.ts → FunnyButtonApp-client-ac7101af922dc6ba472b75a428f340caca6be74a.ts} +2 -2
  180. package/test/party/components/temp/{FunnyButtonApp-server-9748c9096848e643c91237c46ea09d23f1b3fa7c.ts → FunnyButtonApp-server-f1a98a946e0bb9d1bb76b01e26d6ead8f55d32bb.ts} +1 -1
  181. package/test/party/components/temp/{InputFocused-client-a543f82c8db205fb3e33c62de699cff43c668a68.ts → InputFocused-client-11a9cb08909b26945bbc2451ab4c1dac09e6d113.ts} +0 -2
  182. package/test/party/components/temp/{InputFocused-server-222f2fa7029d1cd6941a3777293a9b2d37b7295e.ts → InputFocused-server-82be1a63c80d1dd3f06efaf0bef349d58cf1d9af.ts} +1 -1
  183. package/test/party/components/temp/{InputHello-client-9953499de5778bb1d8aac7691129210a6098db07.ts → InputHello-client-b0453caeae0d43dc1878039c6b49318d12624d48.ts} +1 -1
  184. package/test/party/components/temp/{IsAvailable-client-929ed6c872e72b6c5243b882c6a9a0d13f6a7c47.ts → IsAvailable-client-d789346a68b26fd3f5d9f7aebc4c7bd181c47cad.ts} +1 -1
  185. package/test/party/components/temp/{PickPill-client-f9a50a75ce63ec2ee3ac34e378e20602b93629f7.ts → PickPill-client-b47d371ae5f41d87c96b3cdeed0a8bc06fbfa9c7.ts} +2 -2
  186. package/test/party/components/temp/{TrafficLight-client-81dd9bd9f3332533e01f6c9b271c15e5f76e1fdb.ts → TrafficLight-client-549f9fe3418c113fb240cfa17e09c42e1e7f346a.ts} +6 -6
  187. package/test/party/components/temp/{UserProfile-client-938bcef20a2555de22aca939022a32742ac5e729.ts → UserProfile-client-2c13aac1ad915e51dc557f9af765669e636c0fea.ts} +5 -4
  188. package/test/party/components/temp/{UserProfile-server-9df5c59b8797fa67c479bc76450104d45e6076f9.ts → UserProfile-server-cc1162a4297f6163bfb86e7a8aeea08e8c0625c6.ts} +1 -0
  189. package/test/party/components/temp/{UserProfileApp-client-af27173415d65647cab0f30a9a4967cef0307e25.ts → UserProfileApp-client-2be7a11319cca4d7bfa0f3d2205c441d7e203780.ts} +3 -2
  190. package/test/party/components/temp/{UserProfileApp-server-6a7dbe68ee8041785cef50fb15a9e5ba475e120f.ts → UserProfileApp-server-ab9ff66f787f775aa8571314fee8bcbef85489ef.ts} +1 -1
  191. package/test/party/components/temp/{UserProfileContext-client-93211cdba795b8baf926f60f5b17da90701743b3.ts → UserProfileContext-client-2aa36f436a5f20614d77f48963ec5ca442eebd90.ts} +3 -3
  192. package/test/party/components/temp/{UserProfileContextApp-client-7ea7d90a35894408757aef3e935d3a8badf93aea.ts → UserProfileContextApp-client-5099052fdcd8fb4c368c45090390947424a4e9b0.ts} +2 -2
  193. package/test/party/components/temp/{UserProfileContextApp-server-90290c770529d7211eabf29e7d0fe868aa856b52.ts → UserProfileContextApp-server-6be8dab2ed4f8911f26bef137e7dea164f2b894d.ts} +1 -1
  194. package/test/props/components/Reactive.torp +18 -0
  195. package/test/props/components/output/Reactive-client.ts +70 -0
  196. package/test/props/components/output/Reactive-server.ts +40 -0
  197. package/test/props/components/temp/Reactive-client-e3e5f6ee2f22c46337c6ab1df2f241133c7e2646.ts +70 -0
  198. package/test/props/components/temp/Reactive-server-0914d91287a1bc6d32d7cc56d086624762dbfc04.ts +40 -0
  199. package/test/props/reactive.test.ts +40 -0
  200. package/test/replace/components/output/Replace-client.ts +3 -2
  201. package/test/replace/components/output/Replace-server.ts +1 -0
  202. package/test/replace/components/temp/{Replace-client-ea4ddc73c71181fb6ef3c6f5bf61b0b9e017f00a.ts → Replace-client-3fdab63871fa4bb792317caefd3539b1888325b1.ts} +3 -2
  203. package/test/replace/components/temp/{Replace-server-30eb1ad796516fa4d310798a9c8a6811ec13cbd9.ts → Replace-server-857aca7a58deffc3a1c95ab9d31628b4051ca203.ts} +1 -0
  204. package/test/slots/components/output/Article-client.ts +2 -2
  205. package/test/slots/components/output/Basic-client.ts +1 -1
  206. package/test/slots/components/output/Basic-server.ts +1 -1
  207. package/test/slots/components/output/Let-client.ts +4 -3
  208. package/test/slots/components/output/Let-server.ts +2 -1
  209. package/test/slots/components/output/List-client.ts +1 -1
  210. package/test/slots/components/output/List-server.ts +1 -0
  211. package/test/slots/components/output/Named-client.ts +2 -2
  212. package/test/slots/components/output/Named-server.ts +1 -1
  213. package/test/slots/components/output/Unused-client.ts +1 -1
  214. package/test/slots/components/output/Unused-server.ts +1 -1
  215. package/test/slots/components/temp/{Article-client-741f94eab2e96655f4c9d69ccd7d9c7cc998f4ce.ts → Article-client-80848d6cadd8abac61865d14ddd35685844797e0.ts} +2 -2
  216. package/test/slots/components/temp/{Basic-client-c82bc3c5e10f2f2c1869347435262c8f3039e32f.ts → Basic-client-97b18686412869e8c814fd4542dfe826b1f7669f.ts} +1 -1
  217. package/test/slots/components/temp/{Basic-server-21fb4f8caa3bbcae219aaef388af8c26c46fa5ce.ts → Basic-server-248392e2cd147b537cd44e9a5a71885ef20102e4.ts} +1 -1
  218. package/test/slots/components/temp/{Let-client-c54696fd1b5b859a693744722957fa960f72fad6.ts → Let-client-be69c1f5aa32faf16239050d7836db46cfdcba2f.ts} +4 -3
  219. package/test/slots/components/temp/{Let-server-4d78ffc8741fa737f2cd915b36c0e6ec88a9146f.ts → Let-server-c3293219ed27aec61a6af36d451ddf6609c40027.ts} +2 -1
  220. package/test/slots/components/temp/{List-client-0659d999cfb48b865fe5b8aaaf2a4ddac3a8a8b6.ts → List-client-a829b33214de829de689a72d2e8703b2266ad7a4.ts} +1 -1
  221. package/test/slots/components/temp/{List-server-4b76485a259d054187edad8aa691d80ac918ad86.ts → List-server-06503834c9bfae9b8c2b61742568b020a3de961c.ts} +1 -0
  222. package/test/slots/components/temp/{Named-client-0626b2f0911f77f5edcfda82f9751bcbc37b7641.ts → Named-client-2d9d88f5fdf74d81c3ed1d769a476f4ac36c8b99.ts} +2 -2
  223. package/test/slots/components/temp/{Named-server-e802f901223d697c7fd0a1a234ce1930af1b4b3f.ts → Named-server-65a7bbf038111475c8f07dccb34040ab8c1392c4.ts} +1 -1
  224. package/test/slots/components/temp/{Unused-client-aa05465731e0d00e18189498f49c94f991e76f10.ts → Unused-client-1b16491cb800bbbbd871d9fbf5966c7275244019.ts} +1 -1
  225. package/test/slots/components/temp/{Unused-server-00b92d14665a565f0042b1f56231f28bc38a1252.ts → Unused-server-e5d1e85116bebc7e1a2882cb8f2c9ae7975a1de7.ts} +1 -1
  226. package/test/special-component/components/output/Component-client.ts +5 -4
  227. package/test/special-component/components/output/Component-server.ts +3 -2
  228. package/test/special-component/components/temp/{Component-client-3cc84b23def8830b8ef441bde0f03b3e9718196a.ts → Component-client-22f7e1d0955fb3d90939e956a1f0f77118c259b6.ts} +5 -4
  229. package/test/special-component/components/temp/{Component-server-5dc597784ea1fe45ac2cfb21305cf2187a3868e8.ts → Component-server-ce596cd84dc11f67c9f0588060a5b672eddf9715.ts} +3 -2
  230. package/test/special-element/components/output/Element-client.ts +2 -1
  231. package/test/special-element/components/output/Element-server.ts +1 -0
  232. package/test/special-element/components/temp/{Element-client-0ab8992a8e914c7e190cddac790585fef9be1c9f.ts → Element-client-21c92c04579b1d29e8813265a10897d069aad5c5.ts} +2 -1
  233. package/test/special-element/components/temp/{Element-server-ddb0170df4a3f369577ca7e9768e5fe799f14dfb.ts → Element-server-4bed9653529f39e72754126147fe8618f328853a.ts} +1 -0
  234. package/test/special-self/components/output/Self-client.ts +3 -2
  235. package/test/special-self/components/output/Self-server.ts +1 -0
  236. package/test/special-self/components/temp/{Self-client-3982f174954034643c4d17cfc66d7f10bf1d4df6.ts → Self-client-911c67194be1fdd997537310bcafe712161e8251.ts} +3 -2
  237. package/test/special-self/components/temp/{Self-server-97ffbdaae47f4463034e1d318a8073d078ff138f.ts → Self-server-49ba9be1f6255dd4daf490c640f5222a85960218.ts} +1 -0
  238. package/test/style/components/output/Style-client.ts +2 -1
  239. package/test/style/components/output/Style-server.ts +1 -0
  240. package/test/style/components/temp/{Style-client-085517e82bdd015c86f4c2577447c6a2791cf656.ts → Style-client-cbfac1e255c33a867ccbd5f9d1484a855d91a2d7.ts} +2 -1
  241. package/test/style/components/temp/{Style-server-b2615163fbafdcb2a5d4155120edf2f66ef3bba6.ts → Style-server-763d82ee2296be3f7620814aed950b505329c04c.ts} +1 -0
  242. package/test/svg/components/output/Shape-client.ts +4 -3
  243. package/test/svg/components/output/Shape-server.ts +1 -0
  244. package/test/svg/components/temp/{Shape-client-ea698ed1b7d0c3615adff35fa4956f22840f5fda.ts → Shape-client-cb98b36ab2a0d9f06b484a3c988fb43c3a71a4a0.ts} +4 -3
  245. package/test/svg/components/temp/{Shape-server-eb32049cfb7c058b2c4079c5f86ef00651ff6d69.ts → Shape-server-500d7fe4556026234ce5379b8e90595ddd094edc.ts} +1 -0
  246. package/test/switch/components/output/Switch-client.ts +5 -4
  247. package/test/switch/components/output/Switch-server.ts +1 -0
  248. package/test/switch/components/temp/{Switch-client-4c4adac7308795807517e66bc268a38f87df6bda.ts → Switch-client-9980de45e3346b79525c445edec7cbc3b375e8a4.ts} +5 -4
  249. package/test/switch/components/temp/{Switch-server-21fcac2b02c6071136bb0dc394babd27e454d2c9.ts → Switch-server-1c5690726f28008bb565966af69b6e4e019dea82.ts} +1 -0
  250. package/test/text/components/output/Text-client.ts +3 -2
  251. package/test/text/components/output/Text-server.ts +1 -0
  252. package/test/text/components/temp/{Text-client-9840092be1b4552ddce6e5efc2f1b395637a0a3d.ts → Text-client-63f1d3bf9b3bd145c7ce7058716640e27144055e.ts} +3 -2
  253. package/test/text/components/temp/{Text-server-6774aa9d4ccce941224ba0a8fb1d3e42eb31807e.ts → Text-server-9d3dd6f51e893e63c1999ceafce19ca1697d76ea.ts} +1 -0
  254. package/test/watch-array/components/output/Array-client.ts +4 -3
  255. package/test/watch-array/components/output/Array-server.ts +1 -0
  256. package/test/watch-array/components/output/ArrayEntries-client.ts +4 -3
  257. package/test/watch-array/components/output/ArrayEntries-server.ts +1 -0
  258. package/test/watch-array/components/output/ArrayIndexes-client.ts +4 -3
  259. package/test/watch-array/components/output/ArrayIndexes-server.ts +1 -0
  260. package/test/watch-array/components/output/ArrayUnkeyed-client.ts +4 -3
  261. package/test/watch-array/components/output/ArrayUnkeyed-server.ts +1 -0
  262. package/test/watch-array/components/temp/{Array-client-b29a42f88c2a2f37b3a86bdb9535e20a487887e1.ts → Array-client-ffd82188a45877d74053c82fb3616e4aed0fc2ad.ts} +4 -3
  263. package/test/watch-array/components/temp/{Array-server-ced54fc7e63196f9c24c2e55b27bfe6cf7821dcb.ts → Array-server-3715e815af887e8487b214e7de324850fe99e312.ts} +1 -0
  264. package/test/watch-array/components/temp/{ArrayEntries-client-6289890758b1f6b462a74417e0b9e2e46d946ccd.ts → ArrayEntries-client-b6e982660628576061dbb44539e970b9549bdcfa.ts} +4 -3
  265. package/test/watch-array/components/temp/{ArrayEntries-server-0429a18ffbe39afe87612889a3010c3fcaa601dc.ts → ArrayEntries-server-85cbe80fbb7f6885287825e2cc0dfc1cb9835d79.ts} +1 -0
  266. package/test/watch-array/components/temp/{ArrayIndexes-client-fe4b1c49f442b3e5411f331c52ae6c5ab38f2b2d.ts → ArrayIndexes-client-39337aa43bd8c10a53db836c3be233d48dd39b91.ts} +4 -3
  267. package/test/watch-array/components/temp/{ArrayIndexes-server-20c01f10832f035b007f85a423778934d51a703a.ts → ArrayIndexes-server-ec623c724af0c7212675d61ea68e9dee87f96caa.ts} +1 -0
  268. package/test/watch-array/components/temp/{ArrayUnkeyed-client-3fffe2ce749ee84e0730130bfd730d432e3c4e12.ts → ArrayUnkeyed-client-7606f9a6a221c8cf6a8b51e4895d10a3d7bccc11.ts} +4 -3
  269. package/test/watch-array/components/temp/{ArrayUnkeyed-server-0ab804a5e7bf5b47594d85adab79735e89a3939d.ts → ArrayUnkeyed-server-db21cd576a4c70973abe10f6c8ef5cecb3ead86c.ts} +1 -0
  270. package/test/watch-object/components/output/Watched-client.ts +2 -1
  271. package/test/watch-object/components/output/Watched-server.ts +1 -0
  272. package/test/watch-object/components/temp/{Watched-client-cb293038cd0a39043d05639c624a17d512419c25.ts → Watched-client-bbffbf2cede1a5c071b770670eb39c0f0be725af.ts} +2 -1
  273. package/test/watch-object/components/temp/{Watched-server-4884585cf4f50493a70631909f2230153531208e.ts → Watched-server-0252addaf92fb0f0c1e2937f42918a1c9f31d196.ts} +1 -0
  274. package/src/render/flushMountEffects.ts +0 -8
  275. package/test/if/components/temp/IfNested-client-979db97eea5b4595550b9b46f297f3fbc31796d2.ts +0 -90
  276. package/test/if/components/temp/IfNested-server-3c4e4b6f2162c0906cef685830219b9ea9ee985c.ts +0 -30
@@ -1,4 +1,5 @@
1
1
  import $run from "../../../../src/render/$run";
2
+ import $watch from "../../../../src/render/$watch";
2
3
  import { type SlotRender } from "../../../../src/types/SlotRender";
3
4
  import t_add_fragment from "../../../../src/render/addFragment";
4
5
  import t_attribute from "../../../../src/render/setAttribute";
@@ -15,12 +16,12 @@ export default function Attributes(
15
16
  // @ts-ignore
16
17
  $slots?: Record<string, SlotRender>
17
18
  ) {
18
- $props ??= {};
19
+ $props ??= $watch({});
19
20
 
20
21
  /* User interface */
21
22
  const t_fragments: DocumentFragment[] = [];
22
23
 
23
- const t_fragment_0 = t_fragment($parent.ownerDocument!, t_fragments, 0, `<div data-thing=""> Hello! </div>`);
24
+ const t_fragment_0 = t_fragment($parent.ownerDocument!, t_fragments, 0, `<div data-thing="" {$props.attr}> Hello! </div>`);
24
25
  // @ts-ignore
25
26
  const t_div_1 = t_root(t_fragment_0) as HTMLDivElement;
26
27
  $run(function setAttribute() {
@@ -32,6 +33,9 @@ export default function Attributes(
32
33
  $run(function setAttribute() {
33
34
  t_attribute(t_div_1, "caption", `this attribute is for ${$props.description}`);
34
35
  });
36
+ $run(function setAttribute() {
37
+ t_div_1.setAttribute("attr", $props.attr);
38
+ });
35
39
  t_add_fragment(t_fragment_0, $parent, $anchor);
36
40
  t_next(t_div_1);
37
41
 
@@ -8,10 +8,11 @@ export default function Attributes(
8
8
  // @ts-ignore
9
9
  $slots?: Record<string, ServerSlotRender>
10
10
  ) {
11
+ $props ??= {};
11
12
 
12
13
  /* User interface */
13
14
  let $output = "";
14
- $output += `<div ${$props.thing ? `thing="${t_attr($props.thing)}"` : ''} ${$props.dataThing ? `data-thing="${t_attr($props.dataThing)}"` : ''} caption="this attribute is for ${t_attr($props.description)}"> Hello! </div>`;
15
+ $output += `<div ${$props.thing ? `thing="${t_attr($props.thing)}"` : ''} ${$props.dataThing ? `data-thing="${t_attr($props.dataThing)}"` : ''} caption="this attribute is for ${t_attr($props.description)}" attr="${t_attr($props.attr)}"> Hello! </div>`;
15
16
 
16
17
  return $output;
17
18
  }
@@ -31,8 +31,6 @@ test("await -- hydrated", async () => {
31
31
  });
32
32
 
33
33
  async function check(container: HTMLElement) {
34
- const user = userEvent.setup();
35
-
36
34
  expect(queryByText(container, "Hmm...")).not.toBeNull();
37
35
  expect(queryByText(container, "Is it a number?")).toBeNull();
38
36
 
@@ -40,7 +38,7 @@ async function check(container: HTMLElement) {
40
38
 
41
39
  expect(queryByText(container, "Is it a number?")).not.toBeNull();
42
40
 
43
- await user.click(getByText(container, "Guess again"));
41
+ await userEvent.click(getByText(container, "Guess again"));
44
42
 
45
43
  expect(queryByText(container, "Hmm...")).not.toBeNull();
46
44
  expect(queryByText(container, "Is it a number?")).toBeNull();
@@ -49,7 +47,7 @@ async function check(container: HTMLElement) {
49
47
 
50
48
  expect(queryByText(container, "Is it a number?")).not.toBeNull();
51
49
 
52
- await user.click(getByText(container, "Guess again"));
50
+ await userEvent.click(getByText(container, "Guess again"));
53
51
 
54
52
  expect(queryByText(container, "Hmm...")).not.toBeNull();
55
53
  expect(queryByText(container, "Is it a number?")).toBeNull();
@@ -62,7 +62,7 @@ export default function Await(
62
62
  // @ts-ignore
63
63
  const t_root_1 = t_root(t_fragment_1);
64
64
  // @ts-ignore
65
- const t_text_1 = t_next(t_next(t_root_1));
65
+ const t_text_1 = t_next(t_root_1, 2);
66
66
  t_add_fragment(t_fragment_1, t_div_1, t_before);
67
67
  t_next(t_text_1);
68
68
  });
@@ -76,7 +76,7 @@ export default function Await(
76
76
  // @ts-ignore
77
77
  const t_root_2 = t_root(t_fragment_2);
78
78
  // @ts-ignore
79
- const t_text_2 = t_next(t_next(t_root_2));
79
+ const t_text_2 = t_next(t_root_2, 2);
80
80
  t_add_fragment(t_fragment_2, t_div_1, t_before);
81
81
  t_next(t_text_2);
82
82
  });
@@ -92,7 +92,7 @@ export default function Await(
92
92
  const t_root_3 = t_root(t_fragment_3);
93
93
  const t_text_3 = t_child(t_next(t_root_3));
94
94
  // @ts-ignore
95
- const t_text_4 = t_next(t_next(t_root_3));
95
+ const t_text_4 = t_next(t_root_3, 2);
96
96
  $run(function setTextContent() {
97
97
  t_text_3.textContent = `Something went wrong: ${t_fmt(ex)}!`;
98
98
  });
@@ -105,7 +105,7 @@ export default function Await(
105
105
  })(t_await_token_1);
106
106
  });
107
107
 
108
- const t_button_1 = t_next(t_next(t_await_anchor_1)) as HTMLElement;
108
+ const t_button_1 = t_next(t_await_anchor_1, 2) as HTMLElement;
109
109
  t_event(t_button_1, "click", () => $state.guesser = guessNumber(100));
110
110
  t_add_fragment(t_fragment_0, $parent, $anchor);
111
111
  t_next(t_div_1);
@@ -62,7 +62,7 @@ export default function Await(
62
62
  // @ts-ignore
63
63
  const t_root_1 = t_root(t_fragment_1);
64
64
  // @ts-ignore
65
- const t_text_1 = t_next(t_next(t_root_1));
65
+ const t_text_1 = t_next(t_root_1, 2);
66
66
  t_add_fragment(t_fragment_1, t_div_1, t_before);
67
67
  t_next(t_text_1);
68
68
  });
@@ -76,7 +76,7 @@ export default function Await(
76
76
  // @ts-ignore
77
77
  const t_root_2 = t_root(t_fragment_2);
78
78
  // @ts-ignore
79
- const t_text_2 = t_next(t_next(t_root_2));
79
+ const t_text_2 = t_next(t_root_2, 2);
80
80
  t_add_fragment(t_fragment_2, t_div_1, t_before);
81
81
  t_next(t_text_2);
82
82
  });
@@ -92,7 +92,7 @@ export default function Await(
92
92
  const t_root_3 = t_root(t_fragment_3);
93
93
  const t_text_3 = t_child(t_next(t_root_3));
94
94
  // @ts-ignore
95
- const t_text_4 = t_next(t_next(t_root_3));
95
+ const t_text_4 = t_next(t_root_3, 2);
96
96
  $run(function setTextContent() {
97
97
  t_text_3.textContent = `Something went wrong: ${t_fmt(ex)}!`;
98
98
  });
@@ -105,7 +105,7 @@ export default function Await(
105
105
  })(t_await_token_1);
106
106
  });
107
107
 
108
- const t_button_1 = t_next(t_next(t_await_anchor_1)) as HTMLElement;
108
+ const t_button_1 = t_next(t_await_anchor_1, 2) as HTMLElement;
109
109
  t_event(t_button_1, "click", () => $state.guesser = guessNumber(100));
110
110
  t_add_fragment(t_fragment_0, $parent, $anchor);
111
111
  t_next(t_div_1);
@@ -6,8 +6,6 @@ import mountComponent from "../mountComponent";
6
6
 
7
7
  const componentPath = "./test/bench/components/Bench";
8
8
 
9
- const user = userEvent.setup();
10
-
11
9
  beforeAll(async () => {
12
10
  const container = document.createElement("div");
13
11
  const component = await importComponent(componentPath, "client");
@@ -24,11 +22,11 @@ bench("bench", async () => {
24
22
 
25
23
  try {
26
24
  // Press a bunch of buttons
27
- await user.click(createButton);
28
- await user.click(appendButton);
29
- await user.click(updateButton);
30
- await user.click(swapButton);
31
- await user.click(clearButton);
25
+ await userEvent.click(createButton);
26
+ await userEvent.click(appendButton);
27
+ await userEvent.click(updateButton);
28
+ await userEvent.click(swapButton);
29
+ await userEvent.click(clearButton);
32
30
  } catch {
33
31
  console.log("ERROR");
34
32
  }
@@ -0,0 +1,208 @@
1
+ import $run from "../../../../src/render/$run";
2
+ import $watch from "../../../../src/render/$watch";
3
+ import { type ListItem } from "../../../../src/types/ListItem";
4
+ import { type SlotRender } from "../../../../src/types/SlotRender";
5
+ import t_add_fragment from "../../../../src/render/addFragment";
6
+ import t_anchor from "../../../../src/render/nodeAnchor";
7
+ import t_child from "../../../../src/render/nodeChild";
8
+ import t_class from "../../../../src/render/getClasses";
9
+ import t_event from "../../../../src/render/addEvent";
10
+ import t_fmt from "../../../../src/render/formatText";
11
+ import t_fragment from "../../../../src/render/getFragment";
12
+ import t_list_item from "../../../../src/render/newListItem";
13
+ import t_next from "../../../../src/render/nodeNext";
14
+ import t_pop_range from "../../../../src/render/popRange";
15
+ import t_push_range from "../../../../src/render/pushRange";
16
+ import t_range from "../../../../src/render/newRange";
17
+ import t_root from "../../../../src/render/nodeRoot";
18
+ import t_run_list from "../../../../src/render/runList";
19
+
20
+ export default function Bench(
21
+ $parent: ParentNode,
22
+ $anchor: Node | null,
23
+ // @ts-ignore
24
+ $props?: Record<PropertyKey, any>,
25
+ // @ts-ignore
26
+ $context?: Record<PropertyKey, any>,
27
+ // @ts-ignore
28
+ $slots?: Record<string, SlotRender>
29
+ ) {
30
+
31
+ let rowId = 1;
32
+ let $state = $watch({
33
+ data: [],
34
+ selected: null,
35
+ });
36
+
37
+ const adjectives = [
38
+ "pretty",
39
+ "large",
40
+ "big",
41
+ "small",
42
+ "tall",
43
+ "short",
44
+ "long",
45
+ "handsome",
46
+ "plain",
47
+ "quaint",
48
+ "clean",
49
+ "elegant",
50
+ "easy",
51
+ "angry",
52
+ "crazy",
53
+ "helpful",
54
+ "mushy",
55
+ "odd",
56
+ "unsightly",
57
+ "adorable",
58
+ "important",
59
+ "inexpensive",
60
+ "cheap",
61
+ "expensive",
62
+ "fancy",
63
+ ];
64
+ const colours = ["red", "yellow", "blue", "green", "pink", "brown", "purple", "brown", "white", "black", "orange"];
65
+ const nouns = [
66
+ "table",
67
+ "chair",
68
+ "house",
69
+ "bbq",
70
+ "desk",
71
+ "car",
72
+ "pony",
73
+ "cookie",
74
+ "sandwich",
75
+ "burger",
76
+ "pizza",
77
+ "mouse",
78
+ "keyboard",
79
+ ];
80
+
81
+ function append() {
82
+ $state.data = [...$state.data, ...buildData(1000)];
83
+ }
84
+
85
+ function clear() {
86
+ $state.data = [];
87
+ }
88
+
89
+ function partialUpdate() {
90
+ for (let i = 0; i < $state.data.length; i += 10) {
91
+ const row = $state.data[i];
92
+ row.label = row.label + " !!!";
93
+ }
94
+ }
95
+
96
+ function remove(row) {
97
+ const clone = $state.data.slice();
98
+ clone.splice(clone.indexOf(row), 1);
99
+ $state.data = clone;
100
+ }
101
+
102
+ function create() {
103
+ // TODO: Build this up to 1000:
104
+ $state.data = buildData(10);
105
+ }
106
+
107
+ function createLots() {
108
+ $state.data = buildData(10000);
109
+ }
110
+
111
+ function swapRows() {
112
+ if ($state.data.length > 998) {
113
+ const clone = $state.data.slice();
114
+ const tmp = clone[1];
115
+ clone[1] = clone[998];
116
+ clone[998] = tmp;
117
+ $state.data = clone;
118
+ }
119
+ }
120
+
121
+ function _random(max) {
122
+ return Math.round(Math.random() * 1000) % max;
123
+ }
124
+
125
+ class Item {
126
+ id = rowId++;
127
+ label = `${adjectives[_random(adjectives.length)]} ${colours[_random(colours.length)]} ${nouns[_random(nouns.length)]}`;
128
+ }
129
+
130
+ function buildData(count = 1000) {
131
+ const data = new Array(count);
132
+ for (let i = 0; i < count; i++) {
133
+ data[i] = $watch(new Item());
134
+ }
135
+ return data;
136
+ }
137
+
138
+ /* User interface */
139
+ const t_fragments: DocumentFragment[] = [];
140
+
141
+ const t_fragment_0 = t_fragment($parent.ownerDocument!, t_fragments, 0, `<div id="main" class="container"> <div class="jumbotron"> <div class="row"> <div class="col-md-6"> <h1>Torpor (keyed)</h1> </div> <div class="col-md-6"> <div class="row"> <div class="col-sm-6 smallpad"> <button type="button" class="btn btn-primary btn-block" id="create">Create 1,000 rows</button> </div> <div class="col-sm-6 smallpad"> <button type="button" class="btn btn-primary btn-block" id="createlots"> Create 10,000 rows </button> </div> <div class="col-sm-6 smallpad"> <button type="button" class="btn btn-primary btn-block" id="append"> Append 1,000 rows </button> </div> <div class="col-sm-6 smallpad"> <button type="button" class="btn btn-primary btn-block" id="update"> Update every 10th row </button> </div> <div class="col-sm-6 smallpad"> <button type="button" class="btn btn-primary btn-block" id="clear">Clear</button> </div> <div class="col-sm-6 smallpad"> <button type="button" class="btn btn-primary btn-block" id="swaprows">Swap Rows</button> </div> </div> </div> </div> </div> <table class="table table-hover table-striped test-data"> <tbody> <!> </tbody> </table> <span class="preloadicon glyphicon glyphicon-remove" aria-hidden="true"></span> </div>`);
142
+ // @ts-ignore
143
+ const t_div_1 = t_root(t_fragment_0) as HTMLDivElement;
144
+ const t_button_1 = t_next(t_child(t_next(t_child(t_next(t_child(t_next(t_child(t_next(t_child(t_next(t_child(t_div_1))))), 3))))))) as HTMLElement;
145
+ const t_button_2 = t_next(t_child(t_next(t_child(t_next(t_child(t_next(t_child(t_next(t_child(t_next(t_child(t_div_1))))), 3)))), 3))) as HTMLElement;
146
+ const t_button_3 = t_next(t_child(t_next(t_child(t_next(t_child(t_next(t_child(t_next(t_child(t_next(t_child(t_div_1))))), 3)))), 5))) as HTMLElement;
147
+ const t_button_4 = t_next(t_child(t_next(t_child(t_next(t_child(t_next(t_child(t_next(t_child(t_next(t_child(t_div_1))))), 3)))), 7))) as HTMLElement;
148
+ const t_button_5 = t_next(t_child(t_next(t_child(t_next(t_child(t_next(t_child(t_next(t_child(t_next(t_child(t_div_1))))), 3)))), 9))) as HTMLElement;
149
+ const t_button_6 = t_next(t_child(t_next(t_child(t_next(t_child(t_next(t_child(t_next(t_child(t_next(t_child(t_div_1))))), 3)))), 11))) as HTMLElement;
150
+ const t_for_parent_1 = t_next(t_child(t_next(t_child(t_div_1), 3))) as HTMLElement;
151
+ const t_for_anchor_1 = t_anchor(t_next(t_child(t_next(t_child(t_next(t_child(t_div_1), 3)))))) as HTMLElement;
152
+
153
+ /* @for */
154
+ let t_for_range_1 = t_range();
155
+ t_run_list(
156
+ t_for_range_1,
157
+ t_for_parent_1,
158
+ t_for_anchor_1,
159
+ function createNewItems() {
160
+ let t_new_items: ListItem[] = [];
161
+ for (let row of $state.data) {
162
+ t_new_items.push(t_list_item({ row }, row.id));
163
+ /*t_new_items.push({
164
+ key: row.id,
165
+ data: { row }
166
+ });*/
167
+ }
168
+ return t_new_items;
169
+ },
170
+ function createListItem(t_item, t_before) {
171
+ let t_old_range_1 = t_push_range(t_item, true);
172
+ const t_fragment_1 = t_fragment($parent.ownerDocument!, t_fragments, 1, ` <tr> <td class="col-md-1">#</td> <td class="col-md-4"> <a>#</a> </td> <td class="col-md-1"> <a> <span class="glyphicon glyphicon-remove" aria-hidden="true"></span> </a> </td> <td class="col-md-6"></td> </tr> `);
173
+ // @ts-ignore
174
+ const t_root_1 = t_root(t_fragment_1);
175
+ const t_tr_1 = t_next(t_root_1) as HTMLElement;
176
+ const t_text_1 = t_child(t_next(t_child(t_tr_1)));
177
+ const t_a_1 = t_next(t_child(t_next(t_child(t_tr_1), 3))) as HTMLElement;
178
+ const t_text_2 = t_child(t_a_1);
179
+ const t_a_2 = t_next(t_child(t_next(t_child(t_tr_1), 5))) as HTMLElement;
180
+ // @ts-ignore
181
+ const t_text_3 = t_next(t_tr_1);
182
+ $run(function setClasses() {
183
+ t_tr_1.className = t_class({ danger: $state.selected === t_item.data.row.id });
184
+ });
185
+ $run(function setTextContent() {
186
+ t_text_1.textContent = t_fmt(t_item.data.row.id);
187
+ });
188
+ t_event(t_a_1, "click", () => $state.selected = t_item.data.row.id);
189
+ $run(function setTextContent() {
190
+ t_text_2.textContent = ` ${t_fmt(t_item.data.row.label)} `;
191
+ });
192
+ t_event(t_a_2, "click", () => remove(t_item.data.row));
193
+ t_add_fragment(t_fragment_1, t_for_parent_1, t_before);
194
+ t_next(t_text_3);
195
+ t_pop_range(t_old_range_1);
196
+ }
197
+ );
198
+
199
+ t_event(t_button_1, "click", create);
200
+ t_event(t_button_2, "click", createLots);
201
+ t_event(t_button_3, "click", append);
202
+ t_event(t_button_4, "click", partialUpdate);
203
+ t_event(t_button_5, "click", clear);
204
+ t_event(t_button_6, "click", swapRows);
205
+ t_add_fragment(t_fragment_0, $parent, $anchor);
206
+ t_next(t_div_1);
207
+
208
+ }
@@ -0,0 +1,130 @@
1
+ import $watch from "../../../../src/render/$serverWatch";
2
+ import { type ServerSlotRender } from "../../../../src/types/ServerSlotRender";
3
+ import t_class from "../../../../src/render/getClasses";
4
+ import t_fmt from "../../../../src/render/formatText";
5
+
6
+ export default function Bench(
7
+ // @ts-ignore
8
+ $props?: Record<PropertyKey, any>,
9
+ // @ts-ignore
10
+ $context?: Record<PropertyKey, any>,
11
+ // @ts-ignore
12
+ $slots?: Record<string, ServerSlotRender>
13
+ ) {
14
+ let rowId = 1;
15
+ let $state = $watch({
16
+ data: [],
17
+ selected: null,
18
+ });
19
+
20
+ const adjectives = [
21
+ "pretty",
22
+ "large",
23
+ "big",
24
+ "small",
25
+ "tall",
26
+ "short",
27
+ "long",
28
+ "handsome",
29
+ "plain",
30
+ "quaint",
31
+ "clean",
32
+ "elegant",
33
+ "easy",
34
+ "angry",
35
+ "crazy",
36
+ "helpful",
37
+ "mushy",
38
+ "odd",
39
+ "unsightly",
40
+ "adorable",
41
+ "important",
42
+ "inexpensive",
43
+ "cheap",
44
+ "expensive",
45
+ "fancy",
46
+ ];
47
+ const colours = ["red", "yellow", "blue", "green", "pink", "brown", "purple", "brown", "white", "black", "orange"];
48
+ const nouns = [
49
+ "table",
50
+ "chair",
51
+ "house",
52
+ "bbq",
53
+ "desk",
54
+ "car",
55
+ "pony",
56
+ "cookie",
57
+ "sandwich",
58
+ "burger",
59
+ "pizza",
60
+ "mouse",
61
+ "keyboard",
62
+ ];
63
+
64
+ function append() {
65
+ $state.data = [...$state.data, ...buildData(1000)];
66
+ }
67
+
68
+ function clear() {
69
+ $state.data = [];
70
+ }
71
+
72
+ function partialUpdate() {
73
+ for (let i = 0; i < $state.data.length; i += 10) {
74
+ const row = $state.data[i];
75
+ row.label = row.label + " !!!";
76
+ }
77
+ }
78
+
79
+ function remove(row) {
80
+ const clone = $state.data.slice();
81
+ clone.splice(clone.indexOf(row), 1);
82
+ $state.data = clone;
83
+ }
84
+
85
+ function create() {
86
+ // TODO: Build this up to 1000:
87
+ $state.data = buildData(10);
88
+ }
89
+
90
+ function createLots() {
91
+ $state.data = buildData(10000);
92
+ }
93
+
94
+ function swapRows() {
95
+ if ($state.data.length > 998) {
96
+ const clone = $state.data.slice();
97
+ const tmp = clone[1];
98
+ clone[1] = clone[998];
99
+ clone[998] = tmp;
100
+ $state.data = clone;
101
+ }
102
+ }
103
+
104
+ function _random(max) {
105
+ return Math.round(Math.random() * 1000) % max;
106
+ }
107
+
108
+ class Item {
109
+ id = rowId++;
110
+ label = `${adjectives[_random(adjectives.length)]} ${colours[_random(colours.length)]} ${nouns[_random(nouns.length)]}`;
111
+ }
112
+
113
+ function buildData(count = 1000) {
114
+ const data = new Array(count);
115
+ for (let i = 0; i < count; i++) {
116
+ data[i] = $watch(new Item());
117
+ }
118
+ return data;
119
+ }
120
+
121
+ /* User interface */
122
+ let $output = "";
123
+ $output += `<div id="main" class="container"> <div class="jumbotron"> <div class="row"> <div class="col-md-6"> <h1>Torpor (keyed)</h1> </div> <div class="col-md-6"> <div class="row"> <div class="col-sm-6 smallpad"> <button type="button" class="btn btn-primary btn-block" id="create">Create 1,000 rows</button> </div> <div class="col-sm-6 smallpad"> <button type="button" class="btn btn-primary btn-block" id="createlots"> Create 10,000 rows </button> </div> <div class="col-sm-6 smallpad"> <button type="button" class="btn btn-primary btn-block" id="append"> Append 1,000 rows </button> </div> <div class="col-sm-6 smallpad"> <button type="button" class="btn btn-primary btn-block" id="update"> Update every 10th row </button> </div> <div class="col-sm-6 smallpad"> <button type="button" class="btn btn-primary btn-block" id="clear">Clear</button> </div> <div class="col-sm-6 smallpad"> <button type="button" class="btn btn-primary btn-block" id="swaprows">Swap Rows</button> </div> </div> </div> </div> </div> <table class="table table-hover table-striped test-data"> <tbody> <![>`;
124
+ for (let row of $state.data) {
125
+ $output += `<!^> <tr class="${t_class({ danger: $state.selected === row.id })}"> <td class="col-md-1">${t_fmt(row.id)}</td> <td class="col-md-4"> <a> ${t_fmt(row.label)} </a> </td> <td class="col-md-1"> <a> <span class="glyphicon glyphicon-remove" aria-hidden="true"></span> </a> </td> <td class="col-md-6"></td> </tr> `;
126
+ }
127
+ $output += `<!]><!> </tbody> </table> <span class="preloadicon glyphicon glyphicon-remove" aria-hidden="true"></span> </div>`;
128
+
129
+ return $output;
130
+ }
@@ -141,14 +141,14 @@ export default function Bench(
141
141
  const t_fragment_0 = t_fragment($parent.ownerDocument!, t_fragments, 0, `<div id="main" class="container"> <div class="jumbotron"> <div class="row"> <div class="col-md-6"> <h1>Torpor (keyed)</h1> </div> <div class="col-md-6"> <div class="row"> <div class="col-sm-6 smallpad"> <button type="button" class="btn btn-primary btn-block" id="create">Create 1,000 rows</button> </div> <div class="col-sm-6 smallpad"> <button type="button" class="btn btn-primary btn-block" id="createlots"> Create 10,000 rows </button> </div> <div class="col-sm-6 smallpad"> <button type="button" class="btn btn-primary btn-block" id="append"> Append 1,000 rows </button> </div> <div class="col-sm-6 smallpad"> <button type="button" class="btn btn-primary btn-block" id="update"> Update every 10th row </button> </div> <div class="col-sm-6 smallpad"> <button type="button" class="btn btn-primary btn-block" id="clear">Clear</button> </div> <div class="col-sm-6 smallpad"> <button type="button" class="btn btn-primary btn-block" id="swaprows">Swap Rows</button> </div> </div> </div> </div> </div> <table class="table table-hover table-striped test-data"> <tbody> <!> </tbody> </table> <span class="preloadicon glyphicon glyphicon-remove" aria-hidden="true"></span> </div>`);
142
142
  // @ts-ignore
143
143
  const t_div_1 = t_root(t_fragment_0) as HTMLDivElement;
144
- const t_button_1 = t_next(t_child(t_next(t_child(t_next(t_child(t_next(t_next(t_next(t_child(t_next(t_child(t_next(t_child(t_div_1)))))))))))))) as HTMLElement;
145
- const t_button_2 = t_next(t_child(t_next(t_next(t_next(t_child(t_next(t_child(t_next(t_next(t_next(t_child(t_next(t_child(t_next(t_child(t_div_1)))))))))))))))) as HTMLElement;
146
- const t_button_3 = t_next(t_child(t_next(t_next(t_next(t_next(t_next(t_child(t_next(t_child(t_next(t_next(t_next(t_child(t_next(t_child(t_next(t_child(t_div_1)))))))))))))))))) as HTMLElement;
147
- const t_button_4 = t_next(t_child(t_next(t_next(t_next(t_next(t_next(t_next(t_next(t_child(t_next(t_child(t_next(t_next(t_next(t_child(t_next(t_child(t_next(t_child(t_div_1)))))))))))))))))))) as HTMLElement;
148
- const t_button_5 = t_next(t_child(t_next(t_next(t_next(t_next(t_next(t_next(t_next(t_next(t_next(t_child(t_next(t_child(t_next(t_next(t_next(t_child(t_next(t_child(t_next(t_child(t_div_1)))))))))))))))))))))) as HTMLElement;
149
- const t_button_6 = t_next(t_child(t_next(t_next(t_next(t_next(t_next(t_next(t_next(t_next(t_next(t_next(t_next(t_child(t_next(t_child(t_next(t_next(t_next(t_child(t_next(t_child(t_next(t_child(t_div_1)))))))))))))))))))))))) as HTMLElement;
150
- const t_for_parent_1 = t_next(t_child(t_next(t_next(t_next(t_child(t_div_1)))))) as HTMLElement;
151
- const t_for_anchor_1 = t_anchor(t_next(t_child(t_for_parent_1))) as HTMLElement;
144
+ const t_button_1 = t_next(t_child(t_next(t_child(t_next(t_child(t_next(t_child(t_next(t_child(t_next(t_child(t_div_1))))), 3))))))) as HTMLElement;
145
+ const t_button_2 = t_next(t_child(t_next(t_child(t_next(t_child(t_next(t_child(t_next(t_child(t_next(t_child(t_div_1))))), 3)))), 3))) as HTMLElement;
146
+ const t_button_3 = t_next(t_child(t_next(t_child(t_next(t_child(t_next(t_child(t_next(t_child(t_next(t_child(t_div_1))))), 3)))), 5))) as HTMLElement;
147
+ const t_button_4 = t_next(t_child(t_next(t_child(t_next(t_child(t_next(t_child(t_next(t_child(t_next(t_child(t_div_1))))), 3)))), 7))) as HTMLElement;
148
+ const t_button_5 = t_next(t_child(t_next(t_child(t_next(t_child(t_next(t_child(t_next(t_child(t_next(t_child(t_div_1))))), 3)))), 9))) as HTMLElement;
149
+ const t_button_6 = t_next(t_child(t_next(t_child(t_next(t_child(t_next(t_child(t_next(t_child(t_next(t_child(t_div_1))))), 3)))), 11))) as HTMLElement;
150
+ const t_for_parent_1 = t_next(t_child(t_next(t_child(t_div_1), 3))) as HTMLElement;
151
+ const t_for_anchor_1 = t_anchor(t_next(t_child(t_next(t_child(t_next(t_child(t_div_1), 3)))))) as HTMLElement;
152
152
 
153
153
  /* @for */
154
154
  let t_for_range_1 = t_range();
@@ -174,9 +174,9 @@ export default function Bench(
174
174
  const t_root_1 = t_root(t_fragment_1);
175
175
  const t_tr_1 = t_next(t_root_1) as HTMLElement;
176
176
  const t_text_1 = t_child(t_next(t_child(t_tr_1)));
177
- const t_a_1 = t_next(t_child(t_next(t_next(t_next(t_child(t_tr_1)))))) as HTMLElement;
177
+ const t_a_1 = t_next(t_child(t_next(t_child(t_tr_1), 3))) as HTMLElement;
178
178
  const t_text_2 = t_child(t_a_1);
179
- const t_a_2 = t_next(t_child(t_next(t_next(t_next(t_next(t_next(t_child(t_tr_1)))))))) as HTMLElement;
179
+ const t_a_2 = t_next(t_child(t_next(t_child(t_tr_1), 5))) as HTMLElement;
180
180
  // @ts-ignore
181
181
  const t_text_3 = t_next(t_tr_1);
182
182
  $run(function setClasses() {
@@ -30,8 +30,6 @@ test("bind text value -- hydrated", async () => {
30
30
  });
31
31
 
32
32
  async function check(container: HTMLElement) {
33
- const user = userEvent.setup();
34
-
35
33
  const input = container.getElementsByTagName("input")[0];
36
34
  const select = container.getElementsByTagName("select")[0];
37
35
  const para = container.getElementsByTagName("p")[0];
@@ -45,9 +43,9 @@ async function check(container: HTMLElement) {
45
43
  expect(para2).toHaveTextContent("You have selected, 1");
46
44
 
47
45
  // Update the input value
48
- await user.clear(input);
49
- await user.type(input, "Bob");
50
- await user.selectOptions(select, "2");
46
+ await userEvent.clear(input);
47
+ await userEvent.type(input, "Bob");
48
+ await userEvent.selectOptions(select, "2");
51
49
 
52
50
  expect(input).toHaveValue("Bob");
53
51
  expect(para).toHaveTextContent("Hello, Bob");
@@ -0,0 +1,45 @@
1
+ import "@testing-library/jest-dom/vitest";
2
+ import userEvent from "@testing-library/user-event";
3
+ import { beforeAll, expect, test } from "vitest";
4
+ import buildOutputFiles from "../buildOutputFiles";
5
+ import hydrateComponent from "../hydrateComponent";
6
+ import importComponent from "../importComponent";
7
+ import mountComponent from "../mountComponent";
8
+
9
+ const componentPath = "./test/bind/components/BindComponent";
10
+
11
+ beforeAll(() => {
12
+ buildOutputFiles(componentPath);
13
+ });
14
+
15
+ test("bind component value -- mounted", async () => {
16
+ const container = document.createElement("div");
17
+ const component = await importComponent(componentPath, "client");
18
+ mountComponent(container, component);
19
+
20
+ await check(container);
21
+ });
22
+
23
+ test("bind component value -- hydrated", async () => {
24
+ const container = document.createElement("div");
25
+ const clientComponent = await importComponent(componentPath, "client");
26
+ const serverComponent = await importComponent(componentPath, "server");
27
+ hydrateComponent(container, clientComponent, serverComponent);
28
+
29
+ await check(container);
30
+ });
31
+
32
+ async function check(container: HTMLElement) {
33
+ const input = container.getElementsByTagName("input")[0];
34
+ const para = container.getElementsByTagName("p")[0];
35
+
36
+ expect(input).toHaveValue("Alice");
37
+ expect(para).toHaveTextContent("Hello, Alice");
38
+
39
+ // Update the input value
40
+ await userEvent.clear(input);
41
+ await userEvent.type(input, "Bob");
42
+
43
+ expect(input).toHaveValue("Bob");
44
+ expect(para).toHaveTextContent("Hello, Bob");
45
+ }
@@ -0,0 +1,29 @@
1
+ export default function BindComponent() {
2
+ let $state = $watch({ name: "Alice", selected: 1 });
3
+
4
+ @render {
5
+ <div>
6
+ @// t_name_changed = (value) => $state.name = value;
7
+ <BindText &name={$state.name} />
8
+ <p>Hello, {$state.name}</p>
9
+ </div>
10
+ }
11
+ }
12
+
13
+ function BindText($props: any) {
14
+ //let $state = $watch({
15
+ // text: $props.name
16
+ //})
17
+
18
+ // $run(() => t_name_changed($props.name))
19
+
20
+ //$run(() => {
21
+ // $props.name = $state.text
22
+ //});
23
+
24
+ @render {
25
+ <div>
26
+ <input &value={$props.name} />
27
+ </div>
28
+ }
29
+ }
@@ -3,8 +3,8 @@ export default function BindText() {
3
3
 
4
4
  @render {
5
5
  <div>
6
- <input :value={$state.name} />
7
- <select :value={$state.selected}>
6
+ <input &value={$state.name} />
7
+ <select &value={$state.selected}>
8
8
  <option value=0>First</option>
9
9
  <option value=1>Second</option>
10
10
  <option value=2>Third</option>