@torpor/view 0.0.13 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (279) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +5 -5
  3. package/dist/compile.cjs +83 -31
  4. package/dist/compile.cjs.map +1 -1
  5. package/dist/compile.js +83 -31
  6. package/dist/compile.js.map +1 -1
  7. package/dist/index.cjs +19 -12
  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 +19 -11
  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 +14 -8
  20. package/src/compile/build/client/buildFragment.ts +37 -1
  21. package/src/compile/build/client/buildFragmentText.ts +5 -0
  22. package/src/compile/build/client/buildHtmlNode.ts +1 -0
  23. package/src/compile/build/client/buildSlotNode.ts +4 -1
  24. package/src/compile/build/server/buildServerCode.ts +5 -0
  25. package/src/compile/build/server/buildServerComponentNode.ts +4 -1
  26. package/src/compile/build/server/buildServerElementNode.ts +11 -2
  27. package/src/compile/build/server/buildServerSlotNode.ts +4 -1
  28. package/src/compile/parse/parseCode.ts +20 -12
  29. package/src/index.ts +0 -2
  30. package/src/render/$unwrap.ts +1 -1
  31. package/src/render/addFragment.ts +7 -2
  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/class.test.ts +6 -1
  65. package/test/class/components/Class.torp +5 -1
  66. package/test/class/components/output/Class-client.ts +8 -7
  67. package/test/class/components/output/Class-server.ts +2 -1
  68. package/test/class/components/temp/{Class-client-8c3f9e0257cc2b687e9bb7106cccbab94a4b5adf.ts → Class-client-dc885e1e391f38973bd9ea25b7475b07f7c23960.ts} +8 -7
  69. package/test/class/components/temp/Class-server-d1a2463ba432e10c6f68bd59d1d31949c5a2044f.ts +18 -0
  70. package/test/component/components/output/Component-client.ts +3 -2
  71. package/test/component/components/output/Component-server.ts +1 -1
  72. package/test/component/components/output/Header-client.ts +2 -1
  73. package/test/component/components/output/Header-server.ts +1 -0
  74. package/test/component/components/temp/{Component-client-32cd481f03e25d10b8e93947a2ff8773135b4975.ts → Component-client-a2fb6f30fc340bac909b64cb4f5ac68cde376de3.ts} +3 -2
  75. package/test/component/components/temp/{Component-server-11542f55405218c0b471172cac1d6a1a4edb5c09.ts → Component-server-40be12cd528ccf768f1ad40ef2a435ad2b2a2d71.ts} +1 -1
  76. package/test/component/components/temp/{Header-client-ac151eea86e3f6b058fab101661e13ae73864968.ts → Header-client-75cb4aa868295ac168c16ba7b275fbb5ab9256f9.ts} +2 -1
  77. package/test/component/components/temp/{Header-server-4f10f2332f3ca7a097517cfb938ab1e6f31d68ac.ts → Header-server-f73307874bec34a95dcd152d7f83a3ad13a0f4ac.ts} +1 -0
  78. package/test/effects/components/output/For-client.ts +3 -2
  79. package/test/effects/components/output/For-server.ts +1 -0
  80. package/test/effects/components/output/If-client.ts +4 -3
  81. package/test/effects/components/output/If-server.ts +1 -0
  82. package/test/effects/components/output/NestedIf-client.ts +4 -3
  83. package/test/effects/components/output/NestedIf-server.ts +1 -0
  84. package/test/effects/components/temp/{For-client-887b1758cf5c80f64708a47369e0e6ce44ffa20f.ts → For-client-d8d4e4424ec3238fe9f79cc907d673612b63bcdf.ts} +3 -2
  85. package/test/effects/components/temp/{For-server-8e1c7393b102c870167dd086cbee45c47e614dfa.ts → For-server-1f853c161bea31a1a5b11b00d7a021b70c778066.ts} +1 -0
  86. package/test/effects/components/temp/{If-client-bfc548ef699b91f33e604f066211ce6269cc9506.ts → If-client-bb06988422395321bf298a75bf5563c6f750f776.ts} +4 -3
  87. package/test/effects/components/temp/{If-server-8c213b1a82cd0a5c2bccfeb90ba8bf01fa4672d2.ts → If-server-97e3cbe059306fc607985dcd1b187df3a278d979.ts} +1 -0
  88. package/test/effects/components/temp/{NestedIf-client-9e9155398f240345af392194063adc6e42dda80c.ts → NestedIf-client-dc880c1ec92e716ec730dfa0bac0e3d9265bdf27.ts} +4 -3
  89. package/test/effects/components/temp/{NestedIf-server-5f11d075c2ff224ee5feb7f61aa41aea8af44313.ts → NestedIf-server-9f199a33bae5d5fe34920d6a419937537a2b18dc.ts} +1 -0
  90. package/test/events/components/output/Increment-client.ts +2 -2
  91. package/test/events/components/temp/{Increment-client-35c275d15e94e4aa7625af12c45210521995ead5.ts → Increment-client-41bd7bc91aac8c7a9bf73527c8f7ba1794b09ab3.ts} +2 -2
  92. package/test/events/events.test.ts +2 -3
  93. package/test/for/components/ForEscape.torp +1 -1
  94. package/test/for/components/output/For-client.ts +1 -1
  95. package/test/for/components/output/ForEscape-client.ts +4 -4
  96. package/test/for/components/output/ForIn-client.ts +3 -2
  97. package/test/for/components/output/ForIn-server.ts +1 -0
  98. package/test/for/components/output/ForOf-client.ts +3 -2
  99. package/test/for/components/output/ForOf-server.ts +1 -0
  100. package/test/for/components/temp/{For-client-1f6e475347f0474375f12a7c24b0b293e3942aa7.ts → For-client-0be5994e98c07a3455cd8a18a2b1b8ef3605aba6.ts} +1 -1
  101. package/test/for/components/temp/{ForEscape-client-80d3078cf15001f2ab37b0ec63cfce7267a8a166.ts → ForEscape-client-a973a145e28b32ca55fe3dca53d885fcf5e11c37.ts} +4 -4
  102. package/test/for/components/temp/{ForIn-client-c8a1ec4473d05475e11928d06d081ab671fd9f28.ts → ForIn-client-5cc25a98e10826e8477fe6f931d5d2bbd0b13c9f.ts} +3 -2
  103. package/test/for/components/temp/{ForIn-server-d92cf8d3c3e300b562308607caca2c9cab3cb30b.ts → ForIn-server-d68e82c048f7e0f1525f74724b91e5cd01cdc6a6.ts} +1 -0
  104. package/test/for/components/temp/{ForOf-client-069881d4d9e52bc091e7213154924f3e1626174a.ts → ForOf-client-70b0d59ff72f1cffe2e0ac8523dd7ccdca4ffe39.ts} +3 -2
  105. package/test/for/components/temp/{ForOf-server-3bfbb33bd589890d272bbcbea53d9598f53bfd70.ts → ForOf-server-ac08d98dd249a3e64a366b8488450e6ce0d18def.ts} +1 -0
  106. package/test/for/for-escape.test.ts +2 -3
  107. package/test/function/components/output/Function-client.ts +1 -1
  108. package/test/function/components/temp/{Function-client-b8931e51769f3f1e84d1491c6474f8551acf9f8d.ts → Function-client-b3ff029a821d47e1a2249a52dfb681f4b2e96232.ts} +1 -1
  109. package/test/function/function.test.ts +1 -2
  110. package/test/html/components/output/Html-client.ts +3 -1
  111. package/test/html/components/output/Html-server.ts +1 -0
  112. package/test/html/components/temp/{Html-client-5fc745d9980a42a70dcb3473b0fd976e69882c9e.ts → Html-client-766ba4a63f28f929ca16cd7d1640fe92f9b30792.ts} +3 -1
  113. package/test/html/components/temp/{Html-server-437ea390e58947213ede74755a012cdacceeebe7.ts → Html-server-0a41da8b81bf833f331f3becdbac14be7ddc6c8c.ts} +1 -0
  114. package/test/if/components/output/IfAfterIf-client.ts +5 -4
  115. package/test/if/components/output/IfAfterIf-server.ts +1 -0
  116. package/test/if/components/output/IfElse-client.ts +4 -3
  117. package/test/if/components/output/IfElse-server.ts +1 -0
  118. package/test/if/components/output/IfElseIf-client.ts +5 -4
  119. package/test/if/components/output/IfElseIf-server.ts +1 -0
  120. package/test/if/components/output/IfNested-client.ts +5 -4
  121. package/test/if/components/output/IfNested-server.ts +1 -0
  122. package/test/if/components/temp/{IfAfterIf-client-a489daa5b961ed9da71418fdbb1665b6ba39f1b7.ts → IfAfterIf-client-49b6b8c42b0a351561f9f5f22c2ae2e844bf3b58.ts} +5 -4
  123. package/test/if/components/temp/{IfAfterIf-server-243736e666e7d77d3f8553a1682734555f5ffd22.ts → IfAfterIf-server-eb67cf1fcf6711882266219940a47bd4a66497f3.ts} +1 -0
  124. package/test/if/components/temp/{IfElse-client-4c71642f412d5dd2f45729eafb7e974781dbe011.ts → IfElse-client-e236d4a2e99262ff09675bc519c07e2826c0d70b.ts} +4 -3
  125. package/test/if/components/temp/{IfElse-server-64c055182b327504ee71d1f1d44cfccf48be350d.ts → IfElse-server-c077e0e30f4d2adec41ab779198362d21542d055.ts} +1 -0
  126. package/test/if/components/temp/{IfElseIf-client-98d50d6f40c2385c4ef4fc02329f9d2e182c76c4.ts → IfElseIf-client-b92106861f0c7ec3d09e3a42bb93d8f5bd4e3bdf.ts} +5 -4
  127. package/test/if/components/temp/{IfElseIf-server-79788b13af905175f50bfa8658f2ff2af73db232.ts → IfElseIf-server-67991eee3f56dc687cda600511c31396438e0a77.ts} +1 -0
  128. package/test/{build-server/components/temp/IfNested-client-979db97eea5b4595550b9b46f297f3fbc31796d2.ts → if/components/temp/IfNested-client-f563ac1b16a2280e457557281c4925ed447a9cd7.ts} +5 -4
  129. package/test/{build-server/components/temp/IfNested-server-3c4e4b6f2162c0906cef685830219b9ea9ee985c.ts → if/components/temp/IfNested-server-0a2a9643324ab73b02b310cad61ba87dab146ab2.ts} +1 -0
  130. package/test/mount/components/Mount.torp +1 -1
  131. package/test/mount/components/output/Mount-client.ts +0 -2
  132. package/test/mount/components/output/Mount-server.ts +1 -1
  133. package/test/mount/components/temp/{Mount-client-49d8d6475336b5749fe8a17be847fd2b6cda5ccc.ts → Mount-client-36dbc95a61345a1b7dcf07e6b0c998af2afca691.ts} +0 -2
  134. package/test/mount/components/temp/{Mount-server-e3d689cf52a4477da9aa00e2c7604110710db991.ts → Mount-server-8bef1924a731f3db63cb827be3938fec685e53af.ts} +1 -1
  135. package/test/on-mount/components/output/OnMount-client.ts +0 -2
  136. package/test/on-mount/components/temp/{OnMount-client-b2dfd41a0aaeafb3b7af14793a03e0fc3bc43aaa.ts → OnMount-client-21708a638d2939ee8b017f5dc819cee4748bde87.ts} +0 -2
  137. package/test/party/13-emit-to-parent.test.ts +2 -3
  138. package/test/party/16-context.test.ts +1 -2
  139. package/test/party/17-input-text.test.ts +2 -3
  140. package/test/party/18-input-checkbox.test.ts +1 -2
  141. package/test/party/19-input-radio.test.ts +2 -3
  142. package/test/party/20-input-select.test.ts +3 -4
  143. package/test/party/7-event-click.test.ts +1 -3
  144. package/test/party/9-conditional.test.ts +2 -4
  145. package/test/party/components/ColorSelect.torp +1 -1
  146. package/test/party/components/InputFocused.torp +1 -1
  147. package/test/party/components/InputHello.torp +1 -1
  148. package/test/party/components/IsAvailable.torp +1 -1
  149. package/test/party/components/PickPill.torp +2 -2
  150. package/test/party/components/output/AnswerButton-client.ts +3 -2
  151. package/test/party/components/output/AnswerButton-server.ts +1 -0
  152. package/test/party/components/output/AnswerButtonApp-client.ts +4 -4
  153. package/test/party/components/output/AnswerButtonApp-server.ts +1 -1
  154. package/test/party/components/output/ColorSelect-client.ts +1 -1
  155. package/test/party/components/output/Colors-client.ts +1 -1
  156. package/test/party/components/output/Counter-client.ts +1 -1
  157. package/test/party/components/output/FunnyButton-client.ts +1 -1
  158. package/test/party/components/output/FunnyButtonApp-client.ts +2 -2
  159. package/test/party/components/output/FunnyButtonApp-server.ts +1 -1
  160. package/test/party/components/output/InputFocused-client.ts +0 -2
  161. package/test/party/components/output/InputFocused-server.ts +1 -1
  162. package/test/party/components/output/InputHello-client.ts +1 -1
  163. package/test/party/components/output/IsAvailable-client.ts +1 -1
  164. package/test/party/components/output/PickPill-client.ts +2 -2
  165. package/test/party/components/output/TrafficLight-client.ts +6 -6
  166. package/test/party/components/output/UserProfile-client.ts +5 -4
  167. package/test/party/components/output/UserProfile-server.ts +1 -0
  168. package/test/party/components/output/UserProfileApp-client.ts +3 -2
  169. package/test/party/components/output/UserProfileApp-server.ts +1 -1
  170. package/test/party/components/output/UserProfileContext-client.ts +3 -3
  171. package/test/party/components/output/UserProfileContextApp-client.ts +2 -2
  172. package/test/party/components/output/UserProfileContextApp-server.ts +1 -1
  173. package/test/party/components/temp/{AnswerButton-client-243454cd7bf84c648f244b3587e60d01a0401039.ts → AnswerButton-client-c3dc7edbfff2db1ea111086002147d771ee12193.ts} +3 -2
  174. package/test/party/components/temp/{AnswerButton-server-938e46c1d2510ea37454854ef527e4aa64eb8e52.ts → AnswerButton-server-427442fa8cfc0a18817c2d37f9cb5cbcb3a88a05.ts} +1 -0
  175. package/test/party/components/temp/{AnswerButtonApp-client-34311c2e7412807867fb6267af31a341f092bf31.ts → AnswerButtonApp-client-3e0b63a6bbc1dee3e6cb715c0297cc2ce58d3e4e.ts} +4 -4
  176. package/test/party/components/temp/{AnswerButtonApp-server-3f5071775abea24ee8830830072c6fe465fc4e56.ts → AnswerButtonApp-server-bbc8bb739d2060ccda77ce406aa6b15d8f90b91c.ts} +1 -1
  177. package/test/party/components/temp/{ColorSelect-client-f9fb9fa09f4729da3226d5aaf30e84cd3cd705b5.ts → ColorSelect-client-5ffa6f9d77de967993088c9a01b9f976f3333176.ts} +1 -1
  178. package/test/party/components/temp/{Colors-client-f124162d1dd8f0c3d37bf96c8e5f18599ae3a682.ts → Colors-client-3dafffc5c2a72037f4419fc45d08963872a29958.ts} +1 -1
  179. package/test/party/components/temp/{Counter-client-c349710110b4afbf9593f20cfc40c162ed836079.ts → Counter-client-4d553521fcfc6c9a4e05dce89e70b2ecf8785c4e.ts} +1 -1
  180. package/test/party/components/temp/{FunnyButton-client-2e6bec8259065b5bc9ae16d1ca93dd1bd0c56b7c.ts → FunnyButton-client-45f2c5dd56f2cdb80102193a978df6b0cec822ab.ts} +1 -1
  181. package/test/party/components/temp/{FunnyButtonApp-client-4ed0ebf5be13ddb62d9942bac7f4b8a885ec6c50.ts → FunnyButtonApp-client-ac7101af922dc6ba472b75a428f340caca6be74a.ts} +2 -2
  182. package/test/party/components/temp/{FunnyButtonApp-server-9748c9096848e643c91237c46ea09d23f1b3fa7c.ts → FunnyButtonApp-server-f1a98a946e0bb9d1bb76b01e26d6ead8f55d32bb.ts} +1 -1
  183. package/test/party/components/temp/{InputFocused-client-a543f82c8db205fb3e33c62de699cff43c668a68.ts → InputFocused-client-11a9cb08909b26945bbc2451ab4c1dac09e6d113.ts} +0 -2
  184. package/test/party/components/temp/{InputFocused-server-222f2fa7029d1cd6941a3777293a9b2d37b7295e.ts → InputFocused-server-82be1a63c80d1dd3f06efaf0bef349d58cf1d9af.ts} +1 -1
  185. package/test/party/components/temp/{InputHello-client-9953499de5778bb1d8aac7691129210a6098db07.ts → InputHello-client-b0453caeae0d43dc1878039c6b49318d12624d48.ts} +1 -1
  186. package/test/party/components/temp/{IsAvailable-client-929ed6c872e72b6c5243b882c6a9a0d13f6a7c47.ts → IsAvailable-client-d789346a68b26fd3f5d9f7aebc4c7bd181c47cad.ts} +1 -1
  187. package/test/party/components/temp/{PickPill-client-f9a50a75ce63ec2ee3ac34e378e20602b93629f7.ts → PickPill-client-b47d371ae5f41d87c96b3cdeed0a8bc06fbfa9c7.ts} +2 -2
  188. package/test/party/components/temp/{TrafficLight-client-81dd9bd9f3332533e01f6c9b271c15e5f76e1fdb.ts → TrafficLight-client-549f9fe3418c113fb240cfa17e09c42e1e7f346a.ts} +6 -6
  189. package/test/party/components/temp/{UserProfile-client-938bcef20a2555de22aca939022a32742ac5e729.ts → UserProfile-client-2c13aac1ad915e51dc557f9af765669e636c0fea.ts} +5 -4
  190. package/test/party/components/temp/{UserProfile-server-9df5c59b8797fa67c479bc76450104d45e6076f9.ts → UserProfile-server-cc1162a4297f6163bfb86e7a8aeea08e8c0625c6.ts} +1 -0
  191. package/test/party/components/temp/{UserProfileApp-client-af27173415d65647cab0f30a9a4967cef0307e25.ts → UserProfileApp-client-2be7a11319cca4d7bfa0f3d2205c441d7e203780.ts} +3 -2
  192. package/test/party/components/temp/{UserProfileApp-server-6a7dbe68ee8041785cef50fb15a9e5ba475e120f.ts → UserProfileApp-server-ab9ff66f787f775aa8571314fee8bcbef85489ef.ts} +1 -1
  193. package/test/party/components/temp/{UserProfileContext-client-93211cdba795b8baf926f60f5b17da90701743b3.ts → UserProfileContext-client-2aa36f436a5f20614d77f48963ec5ca442eebd90.ts} +3 -3
  194. package/test/party/components/temp/{UserProfileContextApp-client-7ea7d90a35894408757aef3e935d3a8badf93aea.ts → UserProfileContextApp-client-5099052fdcd8fb4c368c45090390947424a4e9b0.ts} +2 -2
  195. package/test/party/components/temp/{UserProfileContextApp-server-90290c770529d7211eabf29e7d0fe868aa856b52.ts → UserProfileContextApp-server-6be8dab2ed4f8911f26bef137e7dea164f2b894d.ts} +1 -1
  196. package/test/props/components/Reactive.torp +18 -0
  197. package/test/props/components/output/Reactive-client.ts +70 -0
  198. package/test/props/components/output/Reactive-server.ts +40 -0
  199. package/test/props/components/temp/Reactive-client-e3e5f6ee2f22c46337c6ab1df2f241133c7e2646.ts +70 -0
  200. package/test/props/components/temp/Reactive-server-0914d91287a1bc6d32d7cc56d086624762dbfc04.ts +40 -0
  201. package/test/props/reactive.test.ts +51 -0
  202. package/test/replace/components/output/Replace-client.ts +3 -2
  203. package/test/replace/components/output/Replace-server.ts +1 -0
  204. package/test/replace/components/temp/{Replace-client-ea4ddc73c71181fb6ef3c6f5bf61b0b9e017f00a.ts → Replace-client-3fdab63871fa4bb792317caefd3539b1888325b1.ts} +3 -2
  205. package/test/replace/components/temp/{Replace-server-30eb1ad796516fa4d310798a9c8a6811ec13cbd9.ts → Replace-server-857aca7a58deffc3a1c95ab9d31628b4051ca203.ts} +1 -0
  206. package/test/slots/components/output/Article-client.ts +2 -2
  207. package/test/slots/components/output/Basic-client.ts +1 -1
  208. package/test/slots/components/output/Basic-server.ts +1 -1
  209. package/test/slots/components/output/Let-client.ts +4 -3
  210. package/test/slots/components/output/Let-server.ts +2 -1
  211. package/test/slots/components/output/List-client.ts +1 -1
  212. package/test/slots/components/output/List-server.ts +1 -0
  213. package/test/slots/components/output/Named-client.ts +2 -2
  214. package/test/slots/components/output/Named-server.ts +1 -1
  215. package/test/slots/components/output/Unused-client.ts +1 -1
  216. package/test/slots/components/output/Unused-server.ts +1 -1
  217. package/test/slots/components/temp/{Article-client-741f94eab2e96655f4c9d69ccd7d9c7cc998f4ce.ts → Article-client-80848d6cadd8abac61865d14ddd35685844797e0.ts} +2 -2
  218. package/test/slots/components/temp/{Basic-client-c82bc3c5e10f2f2c1869347435262c8f3039e32f.ts → Basic-client-97b18686412869e8c814fd4542dfe826b1f7669f.ts} +1 -1
  219. package/test/slots/components/temp/{Basic-server-21fb4f8caa3bbcae219aaef388af8c26c46fa5ce.ts → Basic-server-248392e2cd147b537cd44e9a5a71885ef20102e4.ts} +1 -1
  220. package/test/slots/components/temp/{Let-client-c54696fd1b5b859a693744722957fa960f72fad6.ts → Let-client-be69c1f5aa32faf16239050d7836db46cfdcba2f.ts} +4 -3
  221. package/test/slots/components/temp/{Let-server-4d78ffc8741fa737f2cd915b36c0e6ec88a9146f.ts → Let-server-c3293219ed27aec61a6af36d451ddf6609c40027.ts} +2 -1
  222. package/test/slots/components/temp/{List-client-0659d999cfb48b865fe5b8aaaf2a4ddac3a8a8b6.ts → List-client-a829b33214de829de689a72d2e8703b2266ad7a4.ts} +1 -1
  223. package/test/slots/components/temp/{List-server-4b76485a259d054187edad8aa691d80ac918ad86.ts → List-server-06503834c9bfae9b8c2b61742568b020a3de961c.ts} +1 -0
  224. package/test/slots/components/temp/{Named-client-0626b2f0911f77f5edcfda82f9751bcbc37b7641.ts → Named-client-2d9d88f5fdf74d81c3ed1d769a476f4ac36c8b99.ts} +2 -2
  225. package/test/slots/components/temp/{Named-server-e802f901223d697c7fd0a1a234ce1930af1b4b3f.ts → Named-server-65a7bbf038111475c8f07dccb34040ab8c1392c4.ts} +1 -1
  226. package/test/slots/components/temp/{Unused-client-aa05465731e0d00e18189498f49c94f991e76f10.ts → Unused-client-1b16491cb800bbbbd871d9fbf5966c7275244019.ts} +1 -1
  227. package/test/slots/components/temp/{Unused-server-00b92d14665a565f0042b1f56231f28bc38a1252.ts → Unused-server-e5d1e85116bebc7e1a2882cb8f2c9ae7975a1de7.ts} +1 -1
  228. package/test/special-component/components/output/Component-client.ts +5 -4
  229. package/test/special-component/components/output/Component-server.ts +3 -2
  230. package/test/special-component/components/temp/{Component-client-3cc84b23def8830b8ef441bde0f03b3e9718196a.ts → Component-client-22f7e1d0955fb3d90939e956a1f0f77118c259b6.ts} +5 -4
  231. package/test/special-component/components/temp/{Component-server-5dc597784ea1fe45ac2cfb21305cf2187a3868e8.ts → Component-server-ce596cd84dc11f67c9f0588060a5b672eddf9715.ts} +3 -2
  232. package/test/special-element/components/output/Element-client.ts +2 -1
  233. package/test/special-element/components/output/Element-server.ts +1 -0
  234. package/test/special-element/components/temp/{Element-client-0ab8992a8e914c7e190cddac790585fef9be1c9f.ts → Element-client-21c92c04579b1d29e8813265a10897d069aad5c5.ts} +2 -1
  235. package/test/special-element/components/temp/{Element-server-ddb0170df4a3f369577ca7e9768e5fe799f14dfb.ts → Element-server-4bed9653529f39e72754126147fe8618f328853a.ts} +1 -0
  236. package/test/special-self/components/output/Self-client.ts +3 -2
  237. package/test/special-self/components/output/Self-server.ts +1 -0
  238. package/test/special-self/components/temp/{Self-client-3982f174954034643c4d17cfc66d7f10bf1d4df6.ts → Self-client-911c67194be1fdd997537310bcafe712161e8251.ts} +3 -2
  239. package/test/special-self/components/temp/{Self-server-97ffbdaae47f4463034e1d318a8073d078ff138f.ts → Self-server-49ba9be1f6255dd4daf490c640f5222a85960218.ts} +1 -0
  240. package/test/style/components/output/Style-client.ts +2 -1
  241. package/test/style/components/output/Style-server.ts +1 -0
  242. package/test/style/components/temp/{Style-client-085517e82bdd015c86f4c2577447c6a2791cf656.ts → Style-client-cbfac1e255c33a867ccbd5f9d1484a855d91a2d7.ts} +2 -1
  243. package/test/style/components/temp/{Style-server-b2615163fbafdcb2a5d4155120edf2f66ef3bba6.ts → Style-server-763d82ee2296be3f7620814aed950b505329c04c.ts} +1 -0
  244. package/test/svg/components/output/Shape-client.ts +4 -3
  245. package/test/svg/components/output/Shape-server.ts +1 -0
  246. package/test/svg/components/temp/{Shape-client-ea698ed1b7d0c3615adff35fa4956f22840f5fda.ts → Shape-client-cb98b36ab2a0d9f06b484a3c988fb43c3a71a4a0.ts} +4 -3
  247. package/test/svg/components/temp/{Shape-server-eb32049cfb7c058b2c4079c5f86ef00651ff6d69.ts → Shape-server-500d7fe4556026234ce5379b8e90595ddd094edc.ts} +1 -0
  248. package/test/switch/components/output/Switch-client.ts +5 -4
  249. package/test/switch/components/output/Switch-server.ts +1 -0
  250. package/test/switch/components/temp/{Switch-client-4c4adac7308795807517e66bc268a38f87df6bda.ts → Switch-client-9980de45e3346b79525c445edec7cbc3b375e8a4.ts} +5 -4
  251. package/test/switch/components/temp/{Switch-server-21fcac2b02c6071136bb0dc394babd27e454d2c9.ts → Switch-server-1c5690726f28008bb565966af69b6e4e019dea82.ts} +1 -0
  252. package/test/text/components/output/Text-client.ts +3 -2
  253. package/test/text/components/output/Text-server.ts +1 -0
  254. package/test/text/components/temp/{Text-client-9840092be1b4552ddce6e5efc2f1b395637a0a3d.ts → Text-client-63f1d3bf9b3bd145c7ce7058716640e27144055e.ts} +3 -2
  255. package/test/text/components/temp/{Text-server-6774aa9d4ccce941224ba0a8fb1d3e42eb31807e.ts → Text-server-9d3dd6f51e893e63c1999ceafce19ca1697d76ea.ts} +1 -0
  256. package/test/watch-array/components/output/Array-client.ts +4 -3
  257. package/test/watch-array/components/output/Array-server.ts +1 -0
  258. package/test/watch-array/components/output/ArrayEntries-client.ts +4 -3
  259. package/test/watch-array/components/output/ArrayEntries-server.ts +1 -0
  260. package/test/watch-array/components/output/ArrayIndexes-client.ts +4 -3
  261. package/test/watch-array/components/output/ArrayIndexes-server.ts +1 -0
  262. package/test/watch-array/components/output/ArrayUnkeyed-client.ts +4 -3
  263. package/test/watch-array/components/output/ArrayUnkeyed-server.ts +1 -0
  264. package/test/watch-array/components/temp/{Array-client-b29a42f88c2a2f37b3a86bdb9535e20a487887e1.ts → Array-client-ffd82188a45877d74053c82fb3616e4aed0fc2ad.ts} +4 -3
  265. package/test/watch-array/components/temp/{Array-server-ced54fc7e63196f9c24c2e55b27bfe6cf7821dcb.ts → Array-server-3715e815af887e8487b214e7de324850fe99e312.ts} +1 -0
  266. package/test/watch-array/components/temp/{ArrayEntries-client-6289890758b1f6b462a74417e0b9e2e46d946ccd.ts → ArrayEntries-client-b6e982660628576061dbb44539e970b9549bdcfa.ts} +4 -3
  267. package/test/watch-array/components/temp/{ArrayEntries-server-0429a18ffbe39afe87612889a3010c3fcaa601dc.ts → ArrayEntries-server-85cbe80fbb7f6885287825e2cc0dfc1cb9835d79.ts} +1 -0
  268. package/test/watch-array/components/temp/{ArrayIndexes-client-fe4b1c49f442b3e5411f331c52ae6c5ab38f2b2d.ts → ArrayIndexes-client-39337aa43bd8c10a53db836c3be233d48dd39b91.ts} +4 -3
  269. package/test/watch-array/components/temp/{ArrayIndexes-server-20c01f10832f035b007f85a423778934d51a703a.ts → ArrayIndexes-server-ec623c724af0c7212675d61ea68e9dee87f96caa.ts} +1 -0
  270. package/test/watch-array/components/temp/{ArrayUnkeyed-client-3fffe2ce749ee84e0730130bfd730d432e3c4e12.ts → ArrayUnkeyed-client-7606f9a6a221c8cf6a8b51e4895d10a3d7bccc11.ts} +4 -3
  271. package/test/watch-array/components/temp/{ArrayUnkeyed-server-0ab804a5e7bf5b47594d85adab79735e89a3939d.ts → ArrayUnkeyed-server-db21cd576a4c70973abe10f6c8ef5cecb3ead86c.ts} +1 -0
  272. package/test/watch-object/components/output/Watched-client.ts +2 -1
  273. package/test/watch-object/components/output/Watched-server.ts +1 -0
  274. package/test/watch-object/components/temp/{Watched-client-cb293038cd0a39043d05639c624a17d512419c25.ts → Watched-client-bbffbf2cede1a5c071b770670eb39c0f0be725af.ts} +2 -1
  275. package/test/watch-object/components/temp/{Watched-server-4884585cf4f50493a70631909f2230153531208e.ts → Watched-server-0252addaf92fb0f0c1e2937f42918a1c9f31d196.ts} +1 -0
  276. package/src/render/flushMountEffects.ts +0 -8
  277. package/test/class/components/temp/Class-server-2218c3284845fdab80d1a41ebace9a9e2ddd6fc1.ts +0 -17
  278. package/test/if/components/temp/IfNested-client-979db97eea5b4595550b9b46f297f3fbc31796d2.ts +0 -90
  279. package/test/if/components/temp/IfNested-server-3c4e4b6f2162c0906cef685830219b9ea9ee985c.ts +0 -30
package/CHANGELOG.md CHANGED
@@ -1,5 +1,28 @@
1
1
  # @torpor/view
2
2
 
3
+ ## 0.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 995513a: Break: specify binding with `&` rather than `:`
8
+
9
+ ### Patch Changes
10
+
11
+ - 98602ec: Fix: don't re-run the entire loop/control statement
12
+ - a49d307: Fix: allow const destructuring in components
13
+ - c9a9cf8: Fix: flush :onmounts when adding a fragment
14
+ - cbd07ca: Feat: bind component props with `&name`
15
+ - f53b184: Feat: watch $props
16
+ - 215db17: Fix: allow $unwrapping a null object
17
+ - 95e866b: Feat: shortcut syntax for object properties
18
+
19
+ ## 0.0.14
20
+
21
+ ### Patch Changes
22
+
23
+ - fb896c6: Fix: make sure we've got $props on the server
24
+ - 85bccf6: Fix: apply scope to elements without a class
25
+
3
26
  ## 0.0.13
4
27
 
5
28
  ### Patch Changes
package/README.md CHANGED
@@ -38,8 +38,8 @@ npm install torpor
38
38
  - $mount to create an effect that runs after a component has been mounted
39
39
  - $unwrap to get the target object from the proxy
40
40
  - Automatic scoping of styles to component
41
- - Two-way binding with :value, :checked, etc
42
- - Element binding to a script variable with :self={...}
41
+ - Two-way binding with &value, &checked, etc
42
+ - Element binding to a script variable with &ref={...}
43
43
  - Element in and out transitions using the Web Animations API
44
44
  - Run an effect when an element is added to the DOM with :onmount={(el) => ...}
45
45
  - Special tags (mostly not yet implemented...)
@@ -162,10 +162,10 @@ export default function Component($props: { name: string }) {
162
162
  </div>
163
163
 
164
164
  <h2>Two way binding</h2>
165
- <p>Two way binding can be accomplished with :value (or :checked etc).</p>
165
+ <p>Two way binding can be accomplished with &value (or &checked etc).</p>
166
166
  <div class="demo">
167
167
  <p>
168
- Count: <input type="number" :value={$state.count} />
168
+ Count: <input type="number" &value={$state.count} />
169
169
  </p>
170
170
  </div>
171
171
 
@@ -211,7 +211,7 @@ export default function Component($props: { name: string }) {
211
211
  function TaskItem() {
212
212
  @render {
213
213
  <li :class={{ done: $props.task.done }}>
214
- <input type="checkbox" :checked={$props.task.done} />
214
+ <input type="checkbox" &checked={$props.task.done} />
215
215
  {$props.task.text}
216
216
  </li>
217
217
  }
package/dist/compile.cjs CHANGED
@@ -203,6 +203,7 @@ function buildComponentFragmentText(node, status, fragments, currentFragment) {
203
203
  }
204
204
  }
205
205
  function buildElementFragmentText(node, status, fragments, currentFragment) {
206
+ let needsClass = node.scopeStyles;
206
207
  currentFragment.text += `<${node.tagName}`;
207
208
  let attributesText = node.attributes.filter((a) => !a.name.startsWith("on") && !a.name.includes(":")).map((a) => {
208
209
  if (a.value && isReactive(a.value) && !a.name.includes(":")) {
@@ -210,6 +211,7 @@ function buildElementFragmentText(node, status, fragments, currentFragment) {
210
211
  return `${a.name}=""`;
211
212
  }
212
213
  } else if (a.name === "class" && node.scopeStyles) {
214
+ needsClass = false;
213
215
  let value = a.value ? `"${trimQuotes(a.value)} torp-${status.styleHash}"` : `"torp-${status.styleHash}"`;
214
216
  return `${a.name}=${value}`;
215
217
  } else {
@@ -219,6 +221,9 @@ function buildElementFragmentText(node, status, fragments, currentFragment) {
219
221
  if (attributesText) {
220
222
  currentFragment.text += " " + attributesText;
221
223
  }
224
+ if (needsClass) {
225
+ currentFragment.text += ` class="torp-${status.styleHash}"`;
226
+ }
222
227
  currentFragment.text += ">";
223
228
  for (let child of node.children) {
224
229
  buildNodeFragmentText(child, status, fragments, currentFragment);
@@ -840,6 +845,29 @@ function getFragmentVarPath(fragment, status, name, path, varPaths) {
840
845
  varPaths.set(varPath, name);
841
846
  varPaths.set(name, name);
842
847
  }
848
+ while (varPath.includes("t_next(t_next(")) {
849
+ const match = varPath.match(/(t_next\(){2,}/)[0];
850
+ const count = match.length / "t_next(".length;
851
+ const pos = varPath.indexOf("t_next(t_next(");
852
+ const head = varPath.substring(0, pos);
853
+ let level = 0;
854
+ let end = 0;
855
+ for (let i = pos + match.length; i < varPath.length; i++) {
856
+ if (varPath[i] === "(") {
857
+ level++;
858
+ } else if (varPath[i] === ")") {
859
+ if (level === 0) {
860
+ end = i;
861
+ break;
862
+ } else {
863
+ level--;
864
+ }
865
+ }
866
+ }
867
+ const tail = varPath.substring(end + count);
868
+ const param = varPath.substring(pos + match.length, end);
869
+ varPath = `${head}t_next(${param}, ${count})${tail}`;
870
+ }
843
871
  return varPath;
844
872
  }
845
873
  function getFragmentVarPathPart(path, varPath, status, root = false) {
@@ -889,12 +917,19 @@ function buildComponentNode(node, status, b, root = false) {
889
917
  const componentHasProps = node.attributes.length || root;
890
918
  const propsName = componentHasProps ? nextVarName("props", status) : "undefined";
891
919
  if (componentHasProps) {
892
- b.append(`const ${propsName}: any = {};`);
920
+ status.imports.add("$watch");
921
+ b.append(`const ${propsName}: any = $watch({});`);
893
922
  for (let { name, value } of node.attributes) {
894
923
  if (name === "self" && node.tagName === ":component") {
895
924
  } else if (name.startsWith("{") && name.endsWith("}")) {
896
925
  name = name.substring(1, name.length - 1);
897
- buildRun("setProp", `${propsName}["${name}"] = ${name};`, status, b);
926
+ const propName = name.split(".").at(-1);
927
+ buildRun("setProp", `${propsName}["${propName}"] = ${name};`, status, b);
928
+ } else if (name.startsWith("&") && value != null && isFullyReactive(value)) {
929
+ name = name.substring(1);
930
+ value = value.substring(1, value.length - 1);
931
+ buildRun("setProp", `${propsName}["${name}"] = ${value};`, status, b);
932
+ buildRun("setBinding", `${value} = ${propsName}["${name}"];`, status, b);
898
933
  } else if (value != null) {
899
934
  let fullyReactive = isFullyReactive(value);
900
935
  let partlyReactive = isReactive(value);
@@ -1174,6 +1209,7 @@ function buildHtmlNode(node, status, b) {
1174
1209
  }
1175
1210
  function buildHtmlBranch(node, status, b, parentName, rangeName) {
1176
1211
  status.imports.add("t_run_branch");
1212
+ b.append(`${node.statement};`);
1177
1213
  b.append(`t_run_branch(${rangeName}, -1, () => {`);
1178
1214
  const templateName = nextVarName("template", status);
1179
1215
  const fragmentName = `t_fragment_${node.fragment.number}`;
@@ -1494,7 +1530,8 @@ function buildHeadNode(node, status, b) {
1494
1530
  for (let { name, value } of node.attributes) {
1495
1531
  if (name.startsWith("{") && name.endsWith("}")) {
1496
1532
  name = name.substring(1, name.length - 1);
1497
- buildRun("setAttribute", `t_head_el.setAttribute("${name}", ${name});`, status, b);
1533
+ const propName = name.split(".").at(-1);
1534
+ buildRun("setAttribute", `t_head_el.setAttribute("${propName}", ${name});`, status, b);
1498
1535
  } else if (value != null && isReactive(value)) {
1499
1536
  if (isFullyReactive(value)) {
1500
1537
  value = value.substring(1, value.length - 1);
@@ -1517,18 +1554,19 @@ function buildElementAttributes(node, varName, status, b) {
1517
1554
  if (name === "self" && node.tagName === ":element") {
1518
1555
  } else if (name.startsWith("{") && name.endsWith("}")) {
1519
1556
  name = name.substring(1, name.length - 1);
1520
- buildRun("setAttribute", `${varName}.setAttribute("${name}", ${name});`, status, b);
1557
+ const propName = name.split(".").at(-1);
1558
+ buildRun("setAttribute", `${varName}.setAttribute("${propName}", ${name});`, status, b);
1521
1559
  } else if (value != null && isReactive(value)) {
1522
1560
  if (isFullyReactive(value)) {
1523
1561
  value = value.substring(1, value.length - 1);
1524
1562
  } else {
1525
1563
  value = `\`${trimQuotes(value).replaceAll("{", "${")}\``;
1526
1564
  }
1527
- if (name === ":self") {
1565
+ if (name === "&ref") {
1528
1566
  b.append(`${value} = ${varName};`);
1529
- } else if (name === ":group") {
1567
+ } else if (name === "&group") {
1530
1568
  buildBindGroupAttribute(node, varName, value, status, b);
1531
- } else if (name === ":value" || name === ":checked") {
1569
+ } else if (name === "&value" || name === "&checked") {
1532
1570
  buildBindAttribute(node, varName, name, value, status, b);
1533
1571
  } else if (name === ":onmount") {
1534
1572
  buildMount("elMount", `return (${trimEnd(value.trim(), ";")})(${varName});`, status, b);
@@ -1717,7 +1755,8 @@ function buildSlotNode(node, status, b) {
1717
1755
  for (let { name, value } of slotAttributes) {
1718
1756
  if (name.startsWith("{") && name.endsWith("}")) {
1719
1757
  name = name.substring(1, name.length - 1);
1720
- buildRun("setProp", `${propsName}["${name}"] = ${name};`, status, b);
1758
+ const propName = name.split(".").at(-1);
1759
+ buildRun("setProp", `${propsName}["${propName}"] = ${name};`, status, b);
1721
1760
  } else if (value != null) {
1722
1761
  let fullyReactive = isFullyReactive(value);
1723
1762
  let partlyReactive = isReactive(value);
@@ -1910,7 +1949,6 @@ var importsMap = {
1910
1949
  $unwrap: 'import { $unwrap } from "${folder}";',
1911
1950
  $run: 'import { $run } from "${folder}";',
1912
1951
  $mount: 'import { $mount } from "${folder}";',
1913
- t_flush: 'import { t_flush } from "${folder}";',
1914
1952
  t_range: 'import { t_range } from "${folder}";',
1915
1953
  t_push_range: 'import { t_push_range } from "${folder}";',
1916
1954
  t_pop_range: 'import { t_pop_range } from "${folder}";',
@@ -1977,7 +2015,8 @@ function buildTemplate(template, imports, b) {
1977
2015
  } else if (script.substring(i, i + "/* @start */".length) === "/* @start */") {
1978
2016
  b.append(script.substring(marker, i));
1979
2017
  if (current.props?.length) {
1980
- b.append(`$props ??= {};`);
2018
+ imports.add("$watch");
2019
+ b.append(`$props ??= $watch({});`);
1981
2020
  }
1982
2021
  if (current.contextProps?.length) {
1983
2022
  b.append(`$context = Object.assign({}, $context);`);
@@ -2010,11 +2049,6 @@ function buildTemplate(template, imports, b) {
2010
2049
  b.append(script.substring(marker, i));
2011
2050
  currentIndex += 1;
2012
2051
  current = template.components[currentIndex];
2013
- if (imports.has("$mount")) {
2014
- imports.add("t_flush");
2015
- b.append("");
2016
- b.append("t_flush();");
2017
- }
2018
2052
  marker = i + "/* @end */".length;
2019
2053
  }
2020
2054
  }
@@ -2066,7 +2100,8 @@ function buildServerComponentNode(node, status, b) {
2066
2100
  for (let { name, value } of node.attributes) {
2067
2101
  if (name.startsWith("{") && name.endsWith("}")) {
2068
2102
  name = name.substring(1, name.length - 1);
2069
- b.append(`${propsName}["${name}"] = ${name};`);
2103
+ const propName = name.split(".").at(-1);
2104
+ b.append(`${propsName}["${propName}"] = ${name};`);
2070
2105
  } else if (value != null) {
2071
2106
  let fullyReactive = isFullyReactive(value);
2072
2107
  let partlyReactive = isReactive(value);
@@ -2412,6 +2447,7 @@ function buildServerElementNode(node, status, b) {
2412
2447
  }
2413
2448
  }
2414
2449
  function buildElementAttributes2(node, status) {
2450
+ let needsClass = node.scopeStyles;
2415
2451
  let attributes = [];
2416
2452
  for (let { name, value } of node.attributes) {
2417
2453
  if (name === "self" && node.tagName === ":element") {
@@ -2429,11 +2465,12 @@ function buildElementAttributes2(node, status) {
2429
2465
  );
2430
2466
  } else if (name.startsWith("{") && name.endsWith("}")) {
2431
2467
  name = name.substring(1, name.length - 1);
2468
+ const propName = name.split(".").at(-1);
2432
2469
  status.imports.add("t_attr");
2433
- attributes.push(`${name}="\${t_attr(${name})}"`);
2470
+ attributes.push(`${propName}="\${t_attr(${name})}"`);
2434
2471
  } else if (value != null && isFullyReactive(value)) {
2435
2472
  value = value.substring(1, value.length - 1);
2436
- if (name === ":self" || name === ":value" || name === ":checked" || name === ":group") {
2473
+ if (name === "&ref" || name === "&value" || name === "&checked" || name === "&group") {
2437
2474
  let defaultValue = "";
2438
2475
  let typeAttribute = node.attributes.find((a) => a.name === "type");
2439
2476
  if (typeAttribute && typeAttribute.value) {
@@ -2460,6 +2497,7 @@ function buildElementAttributes2(node, status) {
2460
2497
  status.imports.add("t_class");
2461
2498
  if (node.scopeStyles) {
2462
2499
  value += `, "torp-${status.styleHash}"`;
2500
+ needsClass = false;
2463
2501
  }
2464
2502
  attributes.push(`class="\${t_class(${value})}"`);
2465
2503
  } else if (name === ":style") {
@@ -2477,12 +2515,16 @@ function buildElementAttributes2(node, status) {
2477
2515
  } else if (name === "class" && node.scopeStyles) {
2478
2516
  value = value ? `"${trimQuotes(value)} torp-${status.styleHash}"` : `"torp-${status.styleHash}"`;
2479
2517
  attributes.push(`${name}="${trimQuotes(value).replaceAll('"', "&quot;")}"`);
2518
+ needsClass = false;
2480
2519
  } else if (value != null) {
2481
2520
  attributes.push(`${name}="${trimQuotes(value).replaceAll('"', "&quot;")}"`);
2482
2521
  } else {
2483
2522
  attributes.push(`${name}`);
2484
2523
  }
2485
2524
  }
2525
+ if (needsClass) {
2526
+ attributes.push(`class="torp-${status.styleHash}"`);
2527
+ }
2486
2528
  return attributes.join(" ");
2487
2529
  }
2488
2530
 
@@ -2508,7 +2550,8 @@ function buildServerSlotNode(node, status, b) {
2508
2550
  for (let { name, value } of slotAttributes) {
2509
2551
  if (name.startsWith("{") && name.endsWith("}")) {
2510
2552
  name = name.substring(1, name.length - 1);
2511
- b.append(`${propsName}["${name}"] = ${name};`);
2553
+ const propName = name.split(".").at(-1);
2554
+ b.append(`${propsName}["${propName}"] = ${name};`);
2512
2555
  } else if (value != null) {
2513
2556
  let fullyReactive = isFullyReactive(value);
2514
2557
  let partlyReactive = isReactive(value);
@@ -2719,6 +2762,9 @@ function buildServerTemplate(template, imports, b, options) {
2719
2762
  marker = i + "/* @params */".length;
2720
2763
  } else if (script.substring(i, i + "/* @start */".length) === "/* @start */") {
2721
2764
  b.append(script.substring(marker, i));
2765
+ if (current.props?.length) {
2766
+ b.append(`$props ??= {};`);
2767
+ }
2722
2768
  if (current.contextProps?.length) {
2723
2769
  b.append(`$context = Object.assign({}, $context);`);
2724
2770
  }
@@ -3661,22 +3707,28 @@ function parseCode(source) {
3661
3707
  parseComponentEnd(status);
3662
3708
  }
3663
3709
  } else if (accept("function", status)) {
3664
- consumeSpace(status);
3665
- if (/[A-Z]/.test(source[status.i])) {
3666
- parseComponentStart(status);
3710
+ if (consumeSpace(status)) {
3711
+ if (/[A-Z]/.test(source[status.i])) {
3712
+ parseComponentStart(status);
3713
+ } else {
3714
+ status.i--;
3715
+ }
3667
3716
  }
3668
3717
  } else if (accept("const", status)) {
3669
- consumeSpace(status);
3670
- if (/[A-Z]/.test(source[status.i])) {
3671
- const start = status.i;
3672
- consumeAlphaNumeric(status);
3673
- consumeSpace(status);
3674
- if (accept("=", status)) {
3718
+ if (consumeSpace(status)) {
3719
+ if (/[A-Z]/.test(source[status.i])) {
3720
+ const start = status.i;
3721
+ consumeAlphaNumeric(status);
3675
3722
  consumeSpace(status);
3676
- if (accept("(", status, false)) {
3677
- status.i = start;
3678
- parseComponentStart(status);
3723
+ if (accept("=", status)) {
3724
+ consumeSpace(status);
3725
+ if (accept("(", status, false)) {
3726
+ status.i = start;
3727
+ parseComponentStart(status);
3728
+ }
3679
3729
  }
3730
+ } else {
3731
+ status.i--;
3680
3732
  }
3681
3733
  }
3682
3734
  } else if (accept("export", status)) {