@torpor/view 0.4.5 → 0.4.7

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 (145) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/compile.cjs +89 -56
  3. package/dist/compile.cjs.map +1 -1
  4. package/dist/compile.js +89 -56
  5. package/dist/compile.js.map +1 -1
  6. package/dist/index.cjs +2 -2
  7. package/dist/index.cjs.map +1 -1
  8. package/dist/index.d.cts +2 -2
  9. package/dist/index.d.cts.map +1 -1
  10. package/dist/index.d.ts +2 -2
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +2 -2
  13. package/dist/index.js.map +1 -1
  14. package/package.json +7 -7
  15. package/src/compile/build/client/buildAwaitNode.ts +3 -2
  16. package/src/compile/build/client/buildCode.ts +14 -11
  17. package/src/compile/build/client/buildComponentNode.ts +15 -13
  18. package/src/compile/build/client/buildElementNode.ts +5 -4
  19. package/src/compile/build/client/buildForNode.ts +22 -12
  20. package/src/compile/build/client/buildFragment.ts +9 -0
  21. package/src/compile/build/client/buildHtmlNode.ts +14 -2
  22. package/src/compile/build/client/buildIfNode.ts +3 -2
  23. package/src/compile/build/client/buildSwitchNode.ts +3 -2
  24. package/src/compile/parse/parseCode.ts +5 -2
  25. package/src/compile/parse/parseTag.ts +4 -0
  26. package/src/render/addEvent.ts +4 -2
  27. package/src/render/runControl.ts +1 -1
  28. package/test/await/components/output/Await-client.ts +1 -1
  29. package/test/await/components/temp/{Await-client-8ad3f252c4550020753eea3c04cde0da435c6aae.ts → Await-client-1587441666890e0beae15f28451bcd04b90cc597.ts} +1 -1
  30. package/test/bind/components/output/BindComponent-client.ts +3 -1
  31. package/test/bind/components/output/BindText-client.ts +1 -1
  32. package/test/bind/components/temp/{BindComponent-client-9da323149e29bbb0d7eaf5a86ed541357f1219f8.ts → BindComponent-client-59dbb5565268702ed2935e7e8cc7609b0f956bdc.ts} +3 -1
  33. package/test/bind/components/temp/{BindText-client-eebe53ed8c48b5bbd046621efa6d9b5d3d753f6f.ts → BindText-client-c56c86c514eed2bcbe3f9c1bf23507a98d7d14b1.ts} +1 -1
  34. package/test/child-component/components/output/ChildComponent-client.ts +3 -1
  35. package/test/child-component/components/temp/{ChildComponent-client-6033ce1f59fe1ce3f3dfb3d7845807e7f047b18d.ts → ChildComponent-client-a0ac41e8516d1584b2318770b6a5fc791e07b53b.ts} +3 -1
  36. package/test/class/components/output/Class-client.ts +4 -2
  37. package/test/class/components/temp/{Class-client-a5e3f4dd7b0272d69b856f3ef4aa43b83bc2d849.ts → Class-client-d0f120c1171030cbe2862a26bc11965cacdd2b18.ts} +4 -2
  38. package/test/component/components/output/Component-client.ts +3 -1
  39. package/test/component/components/temp/{Component-client-ff200ee2a7a5f08d0473fddffa1f3ba5eb641d2a.ts → Component-client-475c9724b22ebc18149075860326ffd395c4caa0.ts} +3 -1
  40. package/test/effects/components/output/ForEffect-client.ts +3 -1
  41. package/test/effects/components/temp/{ForEffect-client-b1cff64d6b44a881a4bcf4b1a3dee3fa64c9ec7b.ts → ForEffect-client-841255d13e0691d88345d9ea89c5fb021ca4db02.ts} +3 -1
  42. package/test/events/components/output/Events-client.ts +2 -2
  43. package/test/events/components/temp/{Events-client-af611081aa6cb1567461367daf3068df86c6ff23.ts → Events-client-8708dd031fb42b980e47799e6f6c0de7a35ef7ae.ts} +2 -2
  44. package/test/for/components/output/For-client.ts +3 -1
  45. package/test/for/components/output/ForAfterFor-client.ts +6 -2
  46. package/test/for/components/output/ForContainingFor-client.ts +6 -2
  47. package/test/for/components/output/ForContainingFunction-client.ts +4 -2
  48. package/test/for/components/output/ForContainingIf-client.ts +3 -1
  49. package/test/for/components/output/ForEscape-client.ts +3 -1
  50. package/test/for/components/output/ForIn-client.ts +3 -1
  51. package/test/for/components/output/ForOf-client.ts +3 -1
  52. package/test/for/components/temp/{For-client-8fd92bf0c26cb8e97006a302104ebb2fdcd2e818.ts → For-client-69c16449ab9b63fd8ace8cb1364105a80e6e1c40.ts} +3 -1
  53. package/test/for/components/temp/{ForAfterFor-client-509955ddc13396ede05c9986a6dcc8bbebd00cf3.ts → ForAfterFor-client-b57ee13c70d8504456dbb5f75efd9defecab8cd1.ts} +6 -2
  54. package/test/for/components/temp/{ForContainingFor-client-4f600c73a6583c84d981a82fae42332f983f0b36.ts → ForContainingFor-client-bc5cc8b51b248bebc28fdba5e69d56af4148a66a.ts} +6 -2
  55. package/test/for/components/temp/{ForContainingFunction-client-9bacc4a7214f2385d98b358d29443363f8b9e78d.ts → ForContainingFunction-client-77ccaeea93b0a489c97113bd6bc522e62b7c914a.ts} +4 -2
  56. package/test/for/components/temp/{ForContainingIf-client-92b3c13b0fbe3d7900c05dd2e833d8e51d1bc66c.ts → ForContainingIf-client-da96adc2e61301142e0728b55665ef241c19f9a4.ts} +3 -1
  57. package/test/for/components/temp/{ForEscape-client-29cdd1ae0528a32f5737295287489e9bbd42889d.ts → ForEscape-client-f2b7590f8e93981bc0cd0c0845ad22df1dc050b6.ts} +3 -1
  58. package/test/for/components/temp/{ForIn-client-fffaa596adb40e4067931af81cc13fc971dd1813.ts → ForIn-client-8754824447479fba5ba3676b5c1dcb1e3591575f.ts} +3 -1
  59. package/test/for/components/temp/{ForOf-client-e6d0948fbd00bfbcbc7099f84331bc3d493abc28.ts → ForOf-client-852d13b24329f89bd864313bc376f73174b9965e.ts} +3 -1
  60. package/test/function/components/output/Function-client.ts +1 -1
  61. package/test/function/components/temp/{Function-client-8ae7f26bcaee6b57251659efc2abcdfd9c0d30e1.ts → Function-client-5173bdb6a5e2eb86060579eb23f70fec20e9b612.ts} +1 -1
  62. package/test/html/components/output/Html-client.ts +1 -1
  63. package/test/html/components/temp/{Html-client-14bf031fae1c40ea86913ca71aee00b947d88b4d.ts → Html-client-2e1b6cfd24f6114f3e9b0fb0adc0022841c2196b.ts} +1 -1
  64. package/test/if/components/output/IfContainingFor-client.ts +3 -1
  65. package/test/if/components/output/IfContainingFunction-client.ts +1 -1
  66. package/test/if/components/temp/{IfContainingFor-client-a1246616d908018a77caa27aca6f9fa63e325960.ts → IfContainingFor-client-dc70bb4ae31c2320b4e22f4f26d87d5650667713.ts} +3 -1
  67. package/test/if/components/temp/{IfContainingFunction-client-1d8f1ce12f4098b425be18149d9c58ea9c4e8de6.ts → IfContainingFunction-client-56c90b091921645a91d5398739cec4e6d56aa0ed.ts} +1 -1
  68. package/test/party/components/output/Conditional-client.ts +1 -1
  69. package/test/party/components/output/Context-client.ts +1 -1
  70. package/test/party/components/output/EmitToParent-client.ts +6 -3
  71. package/test/party/components/output/EventClick-client.ts +1 -1
  72. package/test/party/components/output/InputSelect-client.ts +5 -3
  73. package/test/party/components/output/Loop-client.ts +4 -1
  74. package/test/party/components/output/Props-client.ts +6 -1
  75. package/test/party/components/temp/{Conditional-client-ed1ba6a97d722503560ffbb3dece1d9af5fbadd2.ts → Conditional-client-96ff11fe28ab46048761ff885b8224635244cd38.ts} +1 -1
  76. package/test/party/components/temp/{Context-client-fd121c4a2766ee5b41caf79f485f5f11142e43e0.ts → Context-client-73383a2149cb9198a5dfebf1e891987d261f399f.ts} +1 -1
  77. package/test/party/components/temp/{EmitToParent-client-02c78412e4cacc27cbc857d68d5a064474ccc882.ts → EmitToParent-client-1292c44777f86076cd7c4060deb2016b9fb7e4cd.ts} +6 -3
  78. package/test/party/components/temp/{EventClick-client-4344b8012e6f6310b25c6b43d9f5991dc93037e8.ts → EventClick-client-932a2a4a797aca3cb6b869daa0ba314b46505a73.ts} +1 -1
  79. package/test/party/components/temp/{InputSelect-client-49f9978ab5f32d13ada9d1c3d7522cbafa4c3cc7.ts → InputSelect-client-fa6d6680ce239722a0c29b754a2adc26dd2b4ab0.ts} +5 -3
  80. package/test/party/components/temp/{Loop-client-d8be7f7caf99d17b048d915d2dbe1db97c44aecf.ts → Loop-client-79bc3b13d7f6a733694cb5f3ee4b91667ea5c5b5.ts} +4 -1
  81. package/test/party/components/temp/{Props-client-c126fe2030c202b8371f72d8395d0a210a0d67c2.ts → Props-client-7dbf4a9aecc5b1890492db1d30904341bfd0e9eb.ts} +6 -1
  82. package/test/props/components/output/Reactive-client.ts +4 -2
  83. package/test/props/components/temp/{Reactive-client-626575b72eeb6e7eafe7352f0acda1502b0c3d37.ts → Reactive-client-8601769debe846fc809ca960f0ca4b71762912db.ts} +4 -2
  84. package/test/slots/components/output/LetSlot-client.ts +6 -2
  85. package/test/slots/components/temp/{LetSlot-client-2cd77fd4f84810a55926f0265a9b780516982d5b.ts → LetSlot-client-328fd8a9fcfc6b68c0380f99d3f09ede33babc2f.ts} +6 -2
  86. package/test/special-component/components/output/SpecialComponent-client.ts +2 -1
  87. package/test/special-component/components/temp/{SpecialComponent-client-1955ef6a59b67e29ea076ed28758625922ff7d7b.ts → SpecialComponent-client-4a9face6c61d943cd94c995b174877f08a6af9f4.ts} +2 -1
  88. package/test/special-self/components/output/SpecialSelf-client.ts +3 -1
  89. package/test/special-self/components/temp/{SpecialSelf-client-126d3318d9aee9b2e6309c0ae5b91b2e56e9e647.ts → SpecialSelf-client-baf46bd8104e26f37e699a1a0918ea2d8f1a8e8a.ts} +3 -1
  90. package/test/watch-array/components/output/ArrayAllFunctions-client.ts +4 -1
  91. package/test/watch-array/components/output/ArrayAllFunctionsUnkeyed-client.ts +3 -1
  92. package/test/watch-array/components/output/ArrayEmpty-client.ts +4 -1
  93. package/test/watch-array/components/output/ArrayEntries-client.ts +4 -2
  94. package/test/watch-array/components/output/ArrayIndexes-client.ts +4 -1
  95. package/test/watch-array/components/output/ArrayPop-client.ts +4 -1
  96. package/test/watch-array/components/output/ArrayPush-client.ts +4 -1
  97. package/test/watch-array/components/output/ArrayReassign-client.ts +4 -1
  98. package/test/watch-array/components/output/ArrayReverse-client.ts +4 -1
  99. package/test/watch-array/components/output/ArraySetObject-client.ts +4 -1
  100. package/test/watch-array/components/output/ArraySetProperty-client.ts +4 -1
  101. package/test/watch-array/components/output/ArrayShift-client.ts +4 -1
  102. package/test/watch-array/components/output/ArraySort-client.ts +4 -1
  103. package/test/watch-array/components/output/ArraySpliceAdd-client.ts +4 -1
  104. package/test/watch-array/components/output/ArraySpliceDelete-client.ts +4 -1
  105. package/test/watch-array/components/output/ArraySpliceDeleteAll-client.ts +4 -1
  106. package/test/watch-array/components/output/ArraySpliceDeleteAndAdd-client.ts +4 -1
  107. package/test/watch-array/components/output/ArraySpliceDeleteEnd-client.ts +4 -1
  108. package/test/watch-array/components/output/ArraySwap-client.ts +4 -1
  109. package/test/watch-array/components/output/ArrayUnshift-client.ts +4 -1
  110. package/test/watch-array/components/output/ArrayUpdateAssignment-client.ts +4 -1
  111. package/test/watch-array/components/temp/{ArrayPop-client-bf2caf578a29ef32ca77f51ec2402c6034c219db.ts → ArrayAllFunctions-client-fcd44b588ebc667ff1e645ac95ea9ce6511dde04.ts} +4 -1
  112. package/test/watch-array/components/temp/{ArrayAllFunctionsUnkeyed-client-9d10d33225715295edde4c036977dfbc57e3fda9.ts → ArrayAllFunctionsUnkeyed-client-f60e58a2cf8361b50f0598aa021576b320716897.ts} +3 -1
  113. package/test/watch-array/components/temp/{ArrayAllFunctions-client-bf2caf578a29ef32ca77f51ec2402c6034c219db.ts → ArrayEmpty-client-fcd44b588ebc667ff1e645ac95ea9ce6511dde04.ts} +4 -1
  114. package/test/watch-array/components/temp/{ArrayEntries-client-ef539f1f3238595af775cdcdf0fe43608e9e9162.ts → ArrayEntries-client-2d9b2fcda6b7706ef82b8d4bb590f5fab77fdcdd.ts} +4 -2
  115. package/test/watch-array/components/temp/{ArrayIndexes-client-e57339b7f87549f78154ccbaaf1a9b35d5844a5e.ts → ArrayIndexes-client-b30b5caaf0f9a559730dce0ab966da6de84abbc9.ts} +4 -1
  116. package/test/watch-array/components/temp/{ArrayEmpty-client-bf2caf578a29ef32ca77f51ec2402c6034c219db.ts → ArrayPop-client-fcd44b588ebc667ff1e645ac95ea9ce6511dde04.ts} +4 -1
  117. package/test/watch-array/components/temp/{ArrayPush-client-bf2caf578a29ef32ca77f51ec2402c6034c219db.ts → ArrayPush-client-fcd44b588ebc667ff1e645ac95ea9ce6511dde04.ts} +4 -1
  118. package/test/watch-array/components/temp/ArrayReassign-client-fcd44b588ebc667ff1e645ac95ea9ce6511dde04.ts +83 -0
  119. package/test/watch-array/components/temp/ArrayReverse-client-fcd44b588ebc667ff1e645ac95ea9ce6511dde04.ts +83 -0
  120. package/test/watch-array/components/temp/ArraySetObject-client-fcd44b588ebc667ff1e645ac95ea9ce6511dde04.ts +83 -0
  121. package/test/watch-array/components/temp/ArraySetProperty-client-fcd44b588ebc667ff1e645ac95ea9ce6511dde04.ts +83 -0
  122. package/test/watch-array/components/temp/ArrayShift-client-fcd44b588ebc667ff1e645ac95ea9ce6511dde04.ts +83 -0
  123. package/test/watch-array/components/temp/ArraySort-client-fcd44b588ebc667ff1e645ac95ea9ce6511dde04.ts +83 -0
  124. package/test/watch-array/components/temp/ArraySpliceAdd-client-fcd44b588ebc667ff1e645ac95ea9ce6511dde04.ts +83 -0
  125. package/test/watch-array/components/temp/ArraySpliceDelete-client-fcd44b588ebc667ff1e645ac95ea9ce6511dde04.ts +83 -0
  126. package/test/watch-array/components/temp/ArraySpliceDeleteAll-client-fcd44b588ebc667ff1e645ac95ea9ce6511dde04.ts +83 -0
  127. package/test/watch-array/components/temp/ArraySpliceDeleteAndAdd-client-fcd44b588ebc667ff1e645ac95ea9ce6511dde04.ts +83 -0
  128. package/test/watch-array/components/temp/ArraySpliceDeleteEnd-client-fcd44b588ebc667ff1e645ac95ea9ce6511dde04.ts +83 -0
  129. package/test/watch-array/components/temp/ArraySwap-client-fcd44b588ebc667ff1e645ac95ea9ce6511dde04.ts +83 -0
  130. package/test/watch-array/components/temp/ArrayUnshift-client-fcd44b588ebc667ff1e645ac95ea9ce6511dde04.ts +83 -0
  131. package/test/watch-array/components/temp/ArrayUpdateAssignment-client-fcd44b588ebc667ff1e645ac95ea9ce6511dde04.ts +83 -0
  132. package/test/watch-array/components/temp/ArrayReassign-client-bf2caf578a29ef32ca77f51ec2402c6034c219db.ts +0 -80
  133. package/test/watch-array/components/temp/ArrayReverse-client-bf2caf578a29ef32ca77f51ec2402c6034c219db.ts +0 -80
  134. package/test/watch-array/components/temp/ArraySetObject-client-bf2caf578a29ef32ca77f51ec2402c6034c219db.ts +0 -80
  135. package/test/watch-array/components/temp/ArraySetProperty-client-bf2caf578a29ef32ca77f51ec2402c6034c219db.ts +0 -80
  136. package/test/watch-array/components/temp/ArrayShift-client-bf2caf578a29ef32ca77f51ec2402c6034c219db.ts +0 -80
  137. package/test/watch-array/components/temp/ArraySort-client-bf2caf578a29ef32ca77f51ec2402c6034c219db.ts +0 -80
  138. package/test/watch-array/components/temp/ArraySpliceAdd-client-bf2caf578a29ef32ca77f51ec2402c6034c219db.ts +0 -80
  139. package/test/watch-array/components/temp/ArraySpliceDelete-client-bf2caf578a29ef32ca77f51ec2402c6034c219db.ts +0 -80
  140. package/test/watch-array/components/temp/ArraySpliceDeleteAll-client-bf2caf578a29ef32ca77f51ec2402c6034c219db.ts +0 -80
  141. package/test/watch-array/components/temp/ArraySpliceDeleteAndAdd-client-bf2caf578a29ef32ca77f51ec2402c6034c219db.ts +0 -80
  142. package/test/watch-array/components/temp/ArraySpliceDeleteEnd-client-bf2caf578a29ef32ca77f51ec2402c6034c219db.ts +0 -80
  143. package/test/watch-array/components/temp/ArraySwap-client-bf2caf578a29ef32ca77f51ec2402c6034c219db.ts +0 -80
  144. package/test/watch-array/components/temp/ArrayUnshift-client-bf2caf578a29ef32ca77f51ec2402c6034c219db.ts +0 -80
  145. package/test/watch-array/components/temp/ArrayUpdateAssignment-client-bf2caf578a29ef32ca77f51ec2402c6034c219db.ts +0 -80
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # @torpor/view
2
2
 
3
+ ## 0.4.7
4
+
5
+ ### Patch Changes
6
+
7
+ - 3cc2168: Fix: ignore null event attributes
8
+ - 13f2afb: Fix: more HTML variable types
9
+
10
+ ## 0.4.6
11
+
12
+ ### Patch Changes
13
+
14
+ - ebef5ae: Fix: map head element attributes
15
+ - f4a85c3: Fix: type errors in control statements
16
+ - 986ea9e: Fix: map @html params
17
+ - b2ae05b: Fix: map component attributes => props
18
+ - b8c8122: Fix: assignment assertions in shortcut attributes
19
+ - 4c80139: Fix: map user-supplied $props
20
+
3
21
  ## 0.4.5
4
22
 
5
23
  ### Patch Changes
package/dist/compile.cjs CHANGED
@@ -487,7 +487,14 @@ function declareComponentFragmentVars(fragment, node, path, status, b, parentNam
487
487
  function elementTypeName(node) {
488
488
  switch (node.tagName.toLowerCase()) {
489
489
  case "div":
490
- case "input": return `HTML${node.tagName.substring(0, 1).toUpperCase() + node.tagName.substring(1)}Element`;
490
+ case "span":
491
+ case "input":
492
+ case "select":
493
+ case "option":
494
+ case "button":
495
+ case "form": return `HTML${node.tagName.substring(0, 1).toUpperCase() + node.tagName.substring(1)}Element`;
496
+ case "a": return "HTMLAnchorElement";
497
+ case "img": return "HTMLImageElement";
491
498
  case "textarea": return "HTMLTextAreaElement";
492
499
  }
493
500
  return "HTMLElement";
@@ -710,11 +717,12 @@ function buildComponentNode(node, status, b, root = false) {
710
717
  let props = [];
711
718
  let runs = [];
712
719
  let bindingRuns = [];
713
- for (let { name, value, reactive, fullyReactive } of node.attributes) if (name === "self" && node.tagName === "@component") {} else if (name.startsWith("&") && value != null && fullyReactive) {
720
+ for (let { name, value, reactive, fullyReactive, span } of node.attributes) if (name === "self" && node.tagName === "@component") {} else if (name.startsWith("&") && value != null && fullyReactive) {
714
721
  name = name.substring(1);
715
722
  props.push({
716
723
  name,
717
- value
724
+ value,
725
+ span
718
726
  });
719
727
  runs.push(`${propsName}["${name}"] = ${value};`);
720
728
  bindingRuns.push(`${value} = ${propsName}["${name}"];`);
@@ -725,7 +733,8 @@ function buildComponentNode(node, status, b, root = false) {
725
733
  value = `t_class(${params.join(", ")})`;
726
734
  props.push({
727
735
  name,
728
- value
736
+ value,
737
+ span
729
738
  });
730
739
  runs.push(`${propsName}["${name}"] = ${value};`);
731
740
  } else if (name === "style" && value != null) {
@@ -733,20 +742,28 @@ function buildComponentNode(node, status, b, root = false) {
733
742
  value = `t_style(${value})`;
734
743
  props.push({
735
744
  name,
736
- value
745
+ value,
746
+ span
737
747
  });
738
748
  runs.push(`${propsName}["${name}"] = ${value};`);
739
749
  } else if (value != null) {
740
750
  props.push({
741
751
  name,
742
- value
752
+ value,
753
+ span
743
754
  });
744
755
  if (reactive) runs.push(`${propsName}["${name}"] = ${value};`);
745
756
  } else props.push({
746
757
  name,
747
- value: "true"
758
+ value: "true",
759
+ span
748
760
  });
749
- b.append(`const ${propsName} = $watch({ ${replaceForVarNames(props.map((p) => `${p.name}: ${p.value}`).join(", "), status)} });`);
761
+ b.append(`const ${propsName} = $watch({`);
762
+ for (let p of props) {
763
+ let value = replaceForVarNames(p.value, status);
764
+ addMappedText(`${p.name}: `, value, ",", p.span, status, b);
765
+ }
766
+ b.append("});");
750
767
  if (runs.length) buildRun("setProps", replaceForVarNames(runs.join("\n"), status), status, b);
751
768
  if (bindingRuns.length) buildRun("setBindings", replaceForVarNames(bindingRuns.join("\n"), status), status, b);
752
769
  if (root) {
@@ -820,7 +837,7 @@ function trimMatched(text, startChar, endChar) {
820
837
  //#endregion
821
838
  //#region src/compile/build/client/buildAwaitNode.ts
822
839
  function buildAwaitNode(node, status, b) {
823
- const anchorName = node.varName;
840
+ const anchorName = node.varName ?? "null";
824
841
  const parentName = node.parentName;
825
842
  const regionName = nextVarName("await_region", status);
826
843
  const stateName = "$" + nextVarName("await_state", status);
@@ -900,7 +917,8 @@ function buildAwaitNode(node, status, b) {
900
917
  }
901
918
  function buildAwaitBranch(node, status, b, parentName, stateName, creatorsName, index) {
902
919
  if (node.children.length > 0) {
903
- b.append(`${creatorsName}[${index}] = (t_before) => {`);
920
+ let beforeParam = node.fragment !== void 0 ? "t_before" : "_";
921
+ b.append(`${creatorsName}[${index}] = (${beforeParam}) => {`);
904
922
  buildFragment(node, status, b, parentName, "t_before");
905
923
  status.fragmentStack.push({
906
924
  fragment: node.fragment,
@@ -914,22 +932,6 @@ function buildAwaitBranch(node, status, b, parentName, stateName, creatorsName,
914
932
  b.append(`${stateName}.index = ${index};`);
915
933
  }
916
934
 
917
- //#endregion
918
- //#region src/compile/utils/trimEnd.ts
919
- /**
920
- * Trims a char from the end of the supplied text
921
- *
922
- * @param text The text to trim
923
- * @param char The char to remove from the end of the text
924
- *
925
- * @returns The text without the char on the end
926
- */
927
- function trimEnd(text, char) {
928
- let end = text.length;
929
- while (text[end - 1] === char) end -= 1;
930
- return text.substring(0, end);
931
- }
932
-
933
935
  //#endregion
934
936
  //#region src/compile/build/client/buildForNode.ts
935
937
  const forLoopRegex = /for\s*\((.+?);.*?;.*?\)/;
@@ -937,12 +939,12 @@ const forLoopVarsRegex = /(?:let\s+|var\s+){0,1}([^\s,;+=]+)(?:\s*=\s*[^,;]+){0,
937
939
  const forOfRegex = /for\s*\(\s*(?:let\s*|var\s*){0,1}(.+?)\s+(?:of|in).*?\)/;
938
940
  function buildForNode(node, status, b) {
939
941
  const parentName = node.parentName;
940
- const anchorName = node.varName;
942
+ const anchorName = node.varName ?? "null";
941
943
  node = node.children[0];
942
944
  const forVarNames = [];
943
- const forIndexMatch = node.statement.match(forLoopRegex);
944
- if (forIndexMatch) {
945
- const forVarMatches = forIndexMatch[1].matchAll(forLoopVarsRegex);
945
+ const forLoopMatch = node.statement.match(forLoopRegex);
946
+ if (forLoopMatch) {
947
+ const forVarMatches = forLoopMatch[1].matchAll(forLoopVarsRegex);
946
948
  for (let match of forVarMatches) forVarNames.push(match[1]);
947
949
  } else {
948
950
  const forOfMatch = node.statement.match(forOfRegex);
@@ -959,9 +961,15 @@ function buildForNode(node, status, b) {
959
961
  const newItemName = nextVarName("new_item", status);
960
962
  const itemName = nextVarName("item", status);
961
963
  const beforeName = nextVarName("before", status);
964
+ let keyStatement = "";
962
965
  const key = node.children.find((n) => n.type === "control" && n.operation === "@key");
963
- let keyStatement = key ? key.statement : "";
964
- if (keyStatement) keyStatement = trimEnd(keyStatement.substring(keyStatement.indexOf("=") + 1).trim(), ";");
966
+ if (key !== void 0) {
967
+ let matches = key.statement.match(/^(\s*@*key\s*=\s*)(.+?)\s*;*\s*$/);
968
+ if (matches) {
969
+ key.span.start += matches[1].length;
970
+ keyStatement = matches[2];
971
+ }
972
+ }
965
973
  status.imports.add("t_region");
966
974
  status.imports.add("t_run_list");
967
975
  status.imports.add("t_list_item");
@@ -980,10 +988,12 @@ function buildForNode(node, status, b) {
980
988
  let ${previousItemName} = ${regionName};
981
989
  let ${nextItemName} = ${regionName}.nextRegion;`);
982
990
  addMappedText("", `${replaceForVarNames(node.statement, status)}`, " {", node.span, status, b);
983
- let params = [`{ ${forVarNames.join(",\n")} }`, keyStatement || "undefined"];
984
- if (status.options.dev === true) params.push(`"for item"`);
991
+ b.append(`let ${newItemName} = t_list_item(`);
992
+ b.append(`{ ${forVarNames.join(", ")} },`);
993
+ if (key !== void 0) addMappedText("", `${keyStatement || "undefined"}`, ",", key.span, status, b);
994
+ if (status.options.dev === true) b.append(`"for item"`);
995
+ b.append(");");
985
996
  b.append(`
986
- let ${newItemName} = t_list_item(${params.join(", ")});
987
997
  ${newItemName}.previousRegion = ${previousItemName};
988
998
  ${previousItemName}.nextRegion = ${newItemName};
989
999
  ${previousItemName} = ${newItemName};
@@ -1048,8 +1058,10 @@ function buildHtmlBranch(node, status, b, parentName, regionName) {
1048
1058
  b.append(`t_run_branch(${regionName}, () => {`);
1049
1059
  const templateName = nextVarName("template", status);
1050
1060
  const fragmentName = `t_fragment_${node.fragment.number}`;
1051
- b.append(`const ${templateName} = document.createElement("template");`);
1052
- b.append(`${templateName}.innerHTML = ${node.statement};`);
1061
+ b.append(`let ${templateName} = document.createElement("template");`);
1062
+ node.span.start += 5;
1063
+ node.span.end -= 2;
1064
+ addMappedText("", `${templateName}.innerHTML = ${replaceForVarNames(node.statement, status)};`, "", node.span, status, b);
1053
1065
  b.append(`let ${fragmentName} = ${templateName}.content.cloneNode(true) as DocumentFragment;`);
1054
1066
  buildAddFragment(node, status, b, parentName, "t_before");
1055
1067
  b.append(`}${status.options.dev === true ? ", \"html\"" : ""});`);
@@ -1058,7 +1070,7 @@ function buildHtmlBranch(node, status, b, parentName, regionName) {
1058
1070
  //#endregion
1059
1071
  //#region src/compile/build/client/buildIfNode.ts
1060
1072
  function buildIfNode(node, status, b) {
1061
- const anchorName = node.varName;
1073
+ const anchorName = node.varName ?? "null";
1062
1074
  const parentName = node.parentName || anchorName + ".parentNode";
1063
1075
  const regionName = nextVarName("if_region", status);
1064
1076
  const stateName = "$" + nextVarName("if_state", status);
@@ -1102,7 +1114,8 @@ function buildIfNode(node, status, b) {
1102
1114
  function buildIfBranch(node, status, b, parentName, stateName, creatorsName, index) {
1103
1115
  addMappedText("", `${replaceForVarNames(node.statement, status)}`, " {", node.span, status, b);
1104
1116
  if (node.children.length > 0) {
1105
- b.append(`${creatorsName}[${index}] = (t_before) => {`);
1117
+ let beforeParam = node.fragment !== void 0 ? "t_before" : "_";
1118
+ b.append(`${creatorsName}[${index}] = (${beforeParam}) => {`);
1106
1119
  buildFragment(node, status, b, parentName, "t_before");
1107
1120
  status.fragmentStack.push({
1108
1121
  fragment: node.fragment,
@@ -1164,7 +1177,7 @@ function maybeAppend$1(text, end) {
1164
1177
  //#endregion
1165
1178
  //#region src/compile/build/client/buildSwitchNode.ts
1166
1179
  function buildSwitchNode(node, status, b) {
1167
- const anchorName = node.varName;
1180
+ const anchorName = node.varName ?? "null";
1168
1181
  const parentName = node.parentName;
1169
1182
  const regionName = nextVarName("switch_region", status);
1170
1183
  const stateName = "$" + nextVarName("switch_state", status);
@@ -1211,7 +1224,8 @@ function buildSwitchNode(node, status, b) {
1211
1224
  function buildSwitchBranch(node, status, b, parentName, stateName, creatorsName, index) {
1212
1225
  addMappedText("", `${replaceForVarNames(node.statement, status)}`, " {", node.span, status, b);
1213
1226
  if (node.children.length > 0) {
1214
- b.append(`${creatorsName}[${index}] = (t_before) => {`);
1227
+ let beforeParam = node.fragment !== void 0 ? "t_before" : "_";
1228
+ b.append(`${creatorsName}[${index}] = (${beforeParam}) => {`);
1215
1229
  buildFragment(node, status, b, parentName, "t_before");
1216
1230
  status.fragmentStack.push({
1217
1231
  fragment: node.fragment,
@@ -1277,6 +1291,22 @@ function buildControlNode(node, status, b) {
1277
1291
  }
1278
1292
  }
1279
1293
 
1294
+ //#endregion
1295
+ //#region src/compile/utils/trimEnd.ts
1296
+ /**
1297
+ * Trims a char from the end of the supplied text
1298
+ *
1299
+ * @param text The text to trim
1300
+ * @param char The char to remove from the end of the text
1301
+ *
1302
+ * @returns The text without the char on the end
1303
+ */
1304
+ function trimEnd(text, char) {
1305
+ let end = text.length;
1306
+ while (text[end - 1] === char) end -= 1;
1307
+ return text.substring(0, end);
1308
+ }
1309
+
1280
1310
  //#endregion
1281
1311
  //#region src/compile/build/client/buildMount.ts
1282
1312
  function buildMount(functionName, functionBody, status, b) {
@@ -1372,11 +1402,12 @@ function buildHeadNode(node, status, b) {
1372
1402
  status.imports.add("$run");
1373
1403
  b.append("$run(() => {");
1374
1404
  b.append(`
1375
- const t_headel = document.createElement("${node.tagName}");
1376
- document.getElementsByTagName("head")[0].appendChild(t_headel);`);
1377
- for (let { name, value } of node.attributes) if (value != null) {
1405
+ const t_head_el = document.createElement("${node.tagName}");
1406
+ document.getElementsByTagName("head")[0].appendChild(t_head_el);`);
1407
+ for (let { name, value, span } of node.attributes) if (value != null) {
1378
1408
  status.imports.add("t_attribute");
1379
- b.append(`t_attribute(t_headel, "${name}", ${value});`);
1409
+ value = replaceForVarNames(value, status);
1410
+ addMappedText(`t_attribute(t_head_el, "${name}", `, value, ");", span, status, b);
1380
1411
  }
1381
1412
  b.append(`}${status.options.dev === true ? `, "runHead"` : ""});`);
1382
1413
  }
@@ -1770,14 +1801,14 @@ function buildTemplate(template, map, imports, b, options) {
1770
1801
  for (let chunk of template.script) if (chunk.script === "/* @params */") {
1771
1802
  if (!first) status = makeStatus(imports, map, current, options);
1772
1803
  first = false;
1773
- let params = [
1774
- `${current.markup ? "$parent" : "_$parent"}: ParentNode`,
1775
- `${current.markup ? "$anchor" : "_$anchor"}: Node | null`,
1776
- current.params ?? `${current.props?.length ? "$props: Record<PropertyKey, any>" : "// @ts-ignore\n$props: Record<PropertyKey, any> | undefined"}`,
1777
- `${current.contextProps?.length ? "$context" : "// @ts-ignore\n$context"}: Record<PropertyKey, any>`,
1778
- `${current.slotProps?.length ? "$slots" : "// @ts-ignore\n$slots"}?: Record<string, SlotRender>`
1779
- ];
1780
- b.append(params.join(",\n"));
1804
+ b.append(`
1805
+ ${current.markup ? "$parent" : "_$parent"}: ParentNode,
1806
+ ${current.markup ? "$anchor" : "_$anchor"}: Node | null,`);
1807
+ if (current.params !== void 0) addMappedText("", current.params, ",", chunk.span, status, b);
1808
+ else b.append(`${current.props?.length ? "$props: Record<PropertyKey, any>" : "// @ts-ignore\n$props: Record<PropertyKey, any> | undefined"},`);
1809
+ b.append(`
1810
+ ${current.contextProps?.length ? "$context" : "// @ts-ignore\n$context"}: Record<PropertyKey, any>,
1811
+ ${current.slotProps?.length ? "$slots" : "// @ts-ignore\n$slots"}?: Record<string, SlotRender>`);
1781
1812
  } else if (chunk.script === ") /* @return_type */ {") b.append("): void {");
1782
1813
  else if (chunk.script === "/* @start */") {
1783
1814
  addPushDevBoundary("component", current.name || "Anon Component", status, b);
@@ -2727,6 +2758,7 @@ function parseAttribute(status) {
2727
2758
  valueStart++;
2728
2759
  valueEnd = valueStart + name.length;
2729
2760
  name = value.split(".").at(-1);
2761
+ if (name.endsWith("!")) name = name.substring(0, name.length - 1);
2730
2762
  reactive = fullyReactive = true;
2731
2763
  }
2732
2764
  return {
@@ -3488,11 +3520,12 @@ function parseComponentStart(status) {
3488
3520
  status.script.push({
3489
3521
  script: "/* @params */",
3490
3522
  span: {
3491
- start: 0,
3492
- end: 0
3523
+ start,
3524
+ end
3493
3525
  }
3494
3526
  });
3495
- current.params = status.source.substring(start, end).trim() || void 0;
3527
+ current.params = status.source.substring(start, end);
3528
+ if (current.params.trim().length === 0) current.params = void 0;
3496
3529
  const paramsMatch = current.params?.match(/\$props:\s*([$A-Za-z0-9]+)/);
3497
3530
  if (paramsMatch) {
3498
3531
  let propsTypeName = paramsMatch[1];