peryl 1.5.2 → 1.5.4

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 (187) hide show
  1. package/README.md +31 -17
  2. package/demo/hsml-app-form-validation_demo.html +1 -0
  3. package/demo/hsml-app-form-validation_demo.ts +22 -23
  4. package/demo/hsml-app-form_demo.html +1 -0
  5. package/demo/hsml-app-form_demo.ts +24 -20
  6. package/demo/hsml-app-test_demo.ts +36 -41
  7. package/demo/hsml-app-tictactoe_demo.ts +17 -16
  8. package/demo/hsml-app_demo.html +1 -0
  9. package/demo/hsml-app_demo.ts +16 -16
  10. package/demo/hsml-appel_demo.html +7 -0
  11. package/demo/hsml-appel_demo.ts +47 -27
  12. package/demo/hsml-appi_demo.ts +15 -22
  13. package/demo/hsml_demo.ts +27 -22
  14. package/demo/js/hsml-app-js-happi_demo.html +28 -21
  15. package/demo/js/hsml-app-js_demo.html +15 -17
  16. package/dist/browser-esmodule/encode.js.map +1 -1
  17. package/dist/browser-esmodule/hsml-app.js +114 -123
  18. package/dist/browser-esmodule/hsml-app.js.map +1 -1
  19. package/dist/browser-esmodule/hsml-convert.js.map +1 -1
  20. package/dist/browser-esmodule/hsml-dom.js +3 -3
  21. package/dist/browser-esmodule/hsml-dom.js.map +1 -1
  22. package/dist/browser-esmodule/hsml-h.js.map +1 -1
  23. package/dist/browser-esmodule/hsml-html.js +2 -2
  24. package/dist/browser-esmodule/hsml-html.js.map +1 -1
  25. package/dist/browser-esmodule/hsml-idom.js +5 -5
  26. package/dist/browser-esmodule/hsml-idom.js.map +1 -1
  27. package/dist/browser-esmodule/hsml.js.map +1 -1
  28. package/dist/browser-esmodule/http.js.map +1 -1
  29. package/dist/browser-esmodule/index.js +118 -127
  30. package/dist/browser-esmodule/index.js.map +1 -1
  31. package/dist/browser-esmodule/router.js.map +1 -1
  32. package/dist/browser-umd/encode.js +1 -1
  33. package/dist/browser-umd/encode.js.map +1 -1
  34. package/dist/browser-umd/hsml-app.js +1 -1
  35. package/dist/browser-umd/hsml-app.js.map +1 -1
  36. package/dist/browser-umd/hsml-convert.js.map +1 -1
  37. package/dist/browser-umd/hsml-dom.js +1 -1
  38. package/dist/browser-umd/hsml-dom.js.map +1 -1
  39. package/dist/browser-umd/hsml-h.js.map +1 -1
  40. package/dist/browser-umd/hsml-html.js +1 -1
  41. package/dist/browser-umd/hsml-html.js.map +1 -1
  42. package/dist/browser-umd/hsml-idom.js +1 -1
  43. package/dist/browser-umd/hsml-idom.js.map +1 -1
  44. package/dist/browser-umd/hsml.js.map +1 -1
  45. package/dist/browser-umd/http.js +1 -1
  46. package/dist/browser-umd/http.js.map +1 -1
  47. package/dist/browser-umd/index.js +1 -1
  48. package/dist/browser-umd/index.js.map +1 -1
  49. package/dist/browser-umd/router.js +1 -1
  50. package/dist/browser-umd/router.js.map +1 -1
  51. package/dist/browser-umd/validators-moment.js +1 -1
  52. package/dist/browser-umd/validators-moment.js.map +1 -1
  53. package/dist/browser-umd/validators-numeral.js.map +1 -1
  54. package/dist/demo/encode_demo.ce182166.js.map +1 -1
  55. package/dist/demo/encode_demo.f40a44eb.js.map +1 -1
  56. package/dist/demo/hsml-app-form-validation_demo.8e406f15.js +2 -0
  57. package/dist/demo/hsml-app-form-validation_demo.8e406f15.js.map +1 -0
  58. package/dist/demo/hsml-app-form-validation_demo.9a95cff3.js +2 -0
  59. package/dist/demo/hsml-app-form-validation_demo.9a95cff3.js.map +1 -0
  60. package/dist/demo/hsml-app-form-validation_demo.c6856b02.js +2 -0
  61. package/dist/demo/hsml-app-form-validation_demo.c6856b02.js.map +1 -0
  62. package/dist/demo/hsml-app-form-validation_demo.fdcc0b2d.js +2 -0
  63. package/dist/demo/hsml-app-form-validation_demo.fdcc0b2d.js.map +1 -0
  64. package/dist/demo/hsml-app-form-validation_demo.html +1 -1
  65. package/dist/demo/hsml-app-form_demo.950b2a09.js +2 -0
  66. package/dist/demo/hsml-app-form_demo.950b2a09.js.map +1 -0
  67. package/dist/demo/hsml-app-form_demo.ea3af725.js +2 -0
  68. package/dist/demo/hsml-app-form_demo.ea3af725.js.map +1 -0
  69. package/dist/demo/hsml-app-form_demo.html +1 -1
  70. package/dist/demo/hsml-app-test_demo.36a210b8.js +2 -0
  71. package/dist/demo/hsml-app-test_demo.36a210b8.js.map +1 -0
  72. package/dist/demo/hsml-app-test_demo.6ab4ea94.js +2 -0
  73. package/dist/demo/hsml-app-test_demo.6ab4ea94.js.map +1 -0
  74. package/dist/demo/hsml-app-test_demo.html +1 -1
  75. package/dist/demo/hsml-app-tictactoe_demo.7a91c368.js +2 -0
  76. package/dist/demo/hsml-app-tictactoe_demo.7a91c368.js.map +1 -0
  77. package/dist/demo/hsml-app-tictactoe_demo.97905c2f.js +2 -0
  78. package/dist/demo/hsml-app-tictactoe_demo.97905c2f.js.map +1 -0
  79. package/dist/demo/hsml-app-tictactoe_demo.html +1 -1
  80. package/dist/demo/hsml-app_demo.b5c1d27d.js +2 -0
  81. package/dist/demo/hsml-app_demo.b5c1d27d.js.map +1 -0
  82. package/dist/demo/hsml-app_demo.bbebbbcf.js +2 -0
  83. package/dist/demo/hsml-app_demo.bbebbbcf.js.map +1 -0
  84. package/dist/demo/hsml-app_demo.html +1 -1
  85. package/dist/demo/hsml-appel_demo.4d9e135c.js +2 -0
  86. package/dist/demo/hsml-appel_demo.4d9e135c.js.map +1 -0
  87. package/dist/demo/hsml-appel_demo.7ddb6fb3.js +2 -0
  88. package/dist/demo/hsml-appel_demo.7ddb6fb3.js.map +1 -0
  89. package/dist/demo/hsml-appel_demo.html +1 -1
  90. package/dist/demo/hsml-appi_demo.e5e28a65.js +2 -0
  91. package/dist/demo/hsml-appi_demo.e5e28a65.js.map +1 -0
  92. package/dist/demo/hsml-appi_demo.fef950c1.js +2 -0
  93. package/dist/demo/hsml-appi_demo.fef950c1.js.map +1 -0
  94. package/dist/demo/hsml-appi_demo.html +1 -1
  95. package/dist/demo/hsml-convert_demo.0ea1fa3b.js.map +1 -1
  96. package/dist/demo/hsml-convert_demo.63e3e7b5.js.map +1 -1
  97. package/dist/demo/{hsml_demo.ff950ba1.js → hsml_demo.a248689a.js} +2 -2
  98. package/dist/demo/hsml_demo.a248689a.js.map +1 -0
  99. package/dist/demo/hsml_demo.eb3b08be.js +2 -0
  100. package/dist/demo/hsml_demo.eb3b08be.js.map +1 -0
  101. package/dist/demo/hsml_demo.html +1 -1
  102. package/dist/demo/http_demo.3e7da3d8.js.map +1 -1
  103. package/dist/demo/http_demo.8e435f23.js.map +1 -1
  104. package/dist/demo/i18n_demo.html +1 -1
  105. package/dist/demo/router_demo.3cfa03aa.js.map +1 -1
  106. package/dist/demo/router_demo.89ab1681.js.map +1 -1
  107. package/dist/demo/{validators_demo.252e13a6.js → validators_demo.90ff6001.js} +2 -2
  108. package/dist/demo/validators_demo.90ff6001.js.map +1 -0
  109. package/dist/demo/{validators_demo.66893723.js → validators_demo.ef5b2dea.js} +2 -2
  110. package/dist/demo/validators_demo.ef5b2dea.js.map +1 -0
  111. package/dist/demo/validators_demo.html +1 -1
  112. package/dist/encode.js +1 -1
  113. package/dist/encode.js.map +1 -1
  114. package/dist/hsml-app.d.ts +63 -42
  115. package/dist/hsml-app.js +110 -117
  116. package/dist/hsml-app.js.map +1 -1
  117. package/dist/hsml-convert.d.ts +3 -3
  118. package/dist/hsml-convert.js.map +1 -1
  119. package/dist/hsml-dom.d.ts +2 -2
  120. package/dist/hsml-dom.js +3 -3
  121. package/dist/hsml-dom.js.map +1 -1
  122. package/dist/hsml-h.d.ts +8 -8
  123. package/dist/hsml-h.js.map +1 -1
  124. package/dist/hsml-html.d.ts +4 -4
  125. package/dist/hsml-html.js +2 -2
  126. package/dist/hsml-html.js.map +1 -1
  127. package/dist/hsml-idom.d.ts +2 -2
  128. package/dist/hsml-idom.js +5 -5
  129. package/dist/hsml-idom.js.map +1 -1
  130. package/dist/hsml.d.ts +26 -27
  131. package/dist/hsml.js.map +1 -1
  132. package/dist/http.js +1 -1
  133. package/dist/http.js.map +1 -1
  134. package/dist/router.js +1 -1
  135. package/dist/router.js.map +1 -1
  136. package/package.json +8 -8
  137. package/src/hsml-app.ts +305 -197
  138. package/src/hsml-convert.ts +8 -8
  139. package/src/hsml-dom.ts +18 -18
  140. package/src/hsml-h.ts +10 -10
  141. package/src/hsml-html.ts +19 -19
  142. package/src/hsml-idom.ts +25 -25
  143. package/src/hsml.ts +46 -143
  144. package/demo/hsml-appc_demo.html +0 -16
  145. package/demo/hsml-appc_demo.ts +0 -49
  146. package/dist/demo/hsml-app-form-validation_demo.0b03b743.js +0 -2
  147. package/dist/demo/hsml-app-form-validation_demo.0b03b743.js.map +0 -1
  148. package/dist/demo/hsml-app-form-validation_demo.b3a5c810.js +0 -2
  149. package/dist/demo/hsml-app-form-validation_demo.b3a5c810.js.map +0 -1
  150. package/dist/demo/hsml-app-form-validation_demo.d3925067.js +0 -2
  151. package/dist/demo/hsml-app-form-validation_demo.d3925067.js.map +0 -1
  152. package/dist/demo/hsml-app-form-validation_demo.f757d763.js +0 -2
  153. package/dist/demo/hsml-app-form-validation_demo.f757d763.js.map +0 -1
  154. package/dist/demo/hsml-app-form_demo.007ffcaa.js +0 -2
  155. package/dist/demo/hsml-app-form_demo.007ffcaa.js.map +0 -1
  156. package/dist/demo/hsml-app-form_demo.a034239d.js +0 -2
  157. package/dist/demo/hsml-app-form_demo.a034239d.js.map +0 -1
  158. package/dist/demo/hsml-app-test_demo.35c14dc9.js +0 -2
  159. package/dist/demo/hsml-app-test_demo.35c14dc9.js.map +0 -1
  160. package/dist/demo/hsml-app-test_demo.3c7e16ae.js +0 -2
  161. package/dist/demo/hsml-app-test_demo.3c7e16ae.js.map +0 -1
  162. package/dist/demo/hsml-app-tictactoe_demo.5f4861c1.js +0 -2
  163. package/dist/demo/hsml-app-tictactoe_demo.5f4861c1.js.map +0 -1
  164. package/dist/demo/hsml-app-tictactoe_demo.7deeabad.js +0 -2
  165. package/dist/demo/hsml-app-tictactoe_demo.7deeabad.js.map +0 -1
  166. package/dist/demo/hsml-app_demo.87d83c29.js +0 -2
  167. package/dist/demo/hsml-app_demo.87d83c29.js.map +0 -1
  168. package/dist/demo/hsml-app_demo.941a13a6.js +0 -2
  169. package/dist/demo/hsml-app_demo.941a13a6.js.map +0 -1
  170. package/dist/demo/hsml-appc_demo.0234ff15.js +0 -2
  171. package/dist/demo/hsml-appc_demo.0234ff15.js.map +0 -1
  172. package/dist/demo/hsml-appc_demo.f5783031.js +0 -2
  173. package/dist/demo/hsml-appc_demo.f5783031.js.map +0 -1
  174. package/dist/demo/hsml-appc_demo.html +0 -1
  175. package/dist/demo/hsml-appel_demo.0e8a4d4c.js +0 -2
  176. package/dist/demo/hsml-appel_demo.0e8a4d4c.js.map +0 -1
  177. package/dist/demo/hsml-appel_demo.1a5c2c26.js +0 -2
  178. package/dist/demo/hsml-appel_demo.1a5c2c26.js.map +0 -1
  179. package/dist/demo/hsml-appi_demo.2c3fb511.js +0 -2
  180. package/dist/demo/hsml-appi_demo.2c3fb511.js.map +0 -1
  181. package/dist/demo/hsml-appi_demo.427fdebd.js +0 -2
  182. package/dist/demo/hsml-appi_demo.427fdebd.js.map +0 -1
  183. package/dist/demo/hsml_demo.33f28c29.js +0 -2
  184. package/dist/demo/hsml_demo.33f28c29.js.map +0 -1
  185. package/dist/demo/hsml_demo.ff950ba1.js.map +0 -1
  186. package/dist/demo/validators_demo.252e13a6.js.map +0 -1
  187. package/dist/demo/validators_demo.66893723.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"mappings":"osCAGA,MAAMA,EAAMC,QAAQC,IACdC,EAAQF,QAAQG,MAChBC,EAAOJ,QAAQK,KAoBrB,IAAYC,EAAAC,EAmBAC,EAAAC,GAnBAF,EAAAD,MAAW,KACnB,iBACAC,EAAA,mBACAA,EAAA,qBACAA,EAAA,qBACAA,EAAA,qBACAA,EAAA,4BAaQE,EAAAD,MAAe,KACvB,kBACAC,EAAA,gBAgBJ,MAAMC,EAAWC,OAAOC,uBAKpB,SAAUC,GAAsBF,OAAOG,WAAWD,EAAU,IAAO,GAAK,EAEtEE,EAAaJ,OAAOK,sBAKtB,SAAUC,GAAkBN,OAAOO,aAAaD,EAAS,EAEvDE,EAAY,UACZC,EAAc,YACdC,EAAY,UAGZC,EAAO,OAkBP,SAAUC,EAAwCC,GASpD,OAAO,IAAIC,EACPD,EAAME,MACNF,EAAMG,KACNH,EAAMI,WACNJ,EAAMK,QACNL,EAAMM,MACNN,EAAMO,KAGd,CA4BM,SAAUC,EAA0CR,GAUtDS,eAAeC,OACX,GAAGZ,KAAQE,EAAMO,OACjB,cAA0BI,YACXC,gCACP,OAAOZ,EAAMa,UACjB,CAkBAC,oBAEIC,KAAKC,aAAa,CAAEC,KAAM,SAC1BF,KAAKG,QAAQC,MAAMJ,KAAKK,WAC5B,CAEAC,uBACIN,KAAKG,QAAQI,QACjB,CAEAC,kBACIR,KAAKG,QAAQM,QACjB,CAEAC,yBACIC,EACAC,EACAC,GAEAb,KAAKG,QAAQW,SAAS/C,EAAYgD,UAAW,C,SACzCJ,E,OACAC,E,OACAC,GAER,CAtCAG,cACIC,QACAjB,KAAKG,QAAU,IAAIjB,EACfD,EAAME,MACNF,EAAMG,KACNH,EAAMI,gBACN6B,EACAjC,EAAMM,MACNN,EAAMO,KACNP,EAAMa,YAETE,KAAKG,QAAgBgB,cAAgBnB,IAC1C,GA6BZ,CAKM,MAAOd,EAqDKkC,gBACVC,EACAC,EACAC,EACAC,G,yCAEA,GAAIxB,KAAKT,MAAO,CACZ/B,EAAIwC,KAAKR,KAAMZ,EAAW,C,KAAEyC,E,KAAMC,E,MAAMC,IACxC,MAAME,EAAKC,YAAYC,YACjB3B,KAAK4B,UAAUP,EAAMC,EAAMC,EAAOC,GACxC,MAAMK,EAAKH,YAAYC,MACvBnE,EAAIwC,KAAKR,KAAMX,EAAgBgD,EAAKJ,EAAR,MAAiBzB,KAAKb,MACrD,YACSa,KAAK4B,UAAUP,EAAMC,EAAMC,EAAOC,EAEhD,GAAC,CAEaI,UACVP,EACAC,EACAC,EACAC,G,yCAEA,UACUxB,KAAKX,WACP,CAAEgC,KAAMA,E,KAAqBC,E,MAAMC,GACnCvB,KAAKb,MACLa,KAAKc,UAETd,KAAKS,SACK,YAAVe,GAAuBxB,KAAK8B,iBAAiBT,EAAMC,GACzC,WAAVE,GAAsBxB,KAAK+B,gBAAgBV,EAAMC,EACpD,CAAC,MAAOU,GACLrE,EAAMqC,KAAKR,KAAMX,EAAamD,EACjC,CACL,GAAC,CAmBDC,mBACSjC,KAAKkC,qBAONrE,EAAK,uCANLmC,KAAKkC,qBAAwBX,IACzB,MAAMY,EAAUZ,EAAsBa,OACtCpC,KAAKoB,gBAAgBe,EAAOd,KAAMc,EAAOb,KAAI,EAEjDlD,OAAOiE,iBAAiBtE,EAAYoE,OAAQnC,KAAKkC,sBAIzD,CAEAI,oBACQtC,KAAKkC,sBACL9D,OAAOmE,oBAAoBxE,EAAYoE,OAAQnC,KAAKkC,qBAE5D,CAuCQM,WACJC,EACAC,EACAC,GAEA,GAAI3C,KAAKT,MAAO,CACZ,MAAMkC,EAAKC,YAAYC,OACvB,EAAAiB,EAAAC,iBAAgBJ,EAAIC,EAAMC,GAC1B,MAAMd,EAAKH,YAAYC,MACvBnE,EAAIwC,KAAKR,KA9SH,UA8SuBqC,EAAKJ,EAAR,MAAiBgB,EAC9C,MACG,EAAAG,EAAAC,iBAAgBJ,EAAIC,EAAMC,EAElC,CAzJA3B,YACI7B,EACAC,EACAC,EACAC,EACAC,EACAC,EACAM,GAjBKE,KAAA8C,KAAuC,GA4BhD9C,KAAAc,SAAoC,CAChCO,EACAC,EACAE,IAHJuB,EAAA/C,UAAA,sBAKI,OAAOA,KAAKoB,gBAAgBC,EAAMC,OAAMJ,EAAWM,EACvD,IA4CQxB,KAAA8B,iBAA4C,CAChDT,EACAC,IAFIyB,EAAA/C,UAAA,sBAIJA,KAAKmB,eAAiB6B,EAA2BhD,KAAKmB,cAAepD,EAAYoE,OAAQ,C,KAAEd,E,KAAMC,KAChGtB,KAAKmB,eAAiBnB,KAAKV,SAAW0D,EAA2BhD,KAAKV,QAASvB,EAAYoE,OAAQ,C,KAAEd,E,KAAMC,GAIhH,IAEQtB,KAAA+B,gBAA2C,CAC/CV,EACAC,IAFIyB,EAAA/C,UAAA,sBAGJ5B,OAAO6E,cAAc,IAAIC,YAAYnF,EAAYoE,OAAQ,CAAEC,OAAQ,C,KAAEf,E,KAAMC,KAC/E,IAoBAtB,KAAAmD,OAAS,KACL,GAAInD,KAAKT,MAAO,CACZ,MAAMkC,EAAKC,YAAYC,MACvB,IAAIyB,EACJ,IACIA,EAAQpD,KAAKZ,KAAKY,KAAKb,MAC1B,CAAC,MAAO6C,GACLrE,EAAMqC,KAAKR,KAAMV,EAAWkD,EAC/B,CACD,MAAMH,EAAKH,YAAYC,MAEvB,OADAnE,EAAIwC,KAAKR,KAAMV,EAAc+C,EAAKJ,EAAR,MAAiB2B,GACpCA,UAAS,EACnB,CAAM,CACH,IAAIA,EACJ,IACIA,EAAQpD,KAAKZ,KAAKY,KAAKb,MAC1B,CAAC,MAAO6C,GACLrE,EAAMqC,KAAKR,KAAMV,EAAWkD,EAC/B,CACD,OAAOoB,UAAS,EACnB,GAGLpD,KAAAqD,SAAW,CAACC,EAAyBhC,EAAmBC,UAIvCL,KAHbI,GAAQA,aAAI,EAAJA,EAAMN,eAAgBuC,SACvBjC,EAAwBC,GACzBD,IACoBC,IAElBD,EADAC,aAAiB2B,YACV3B,EAAMa,OA4G7B,SAAkBJ,GACd,MAAMS,EAAKT,EAAEwB,OACb,GACS,SADDf,EAAGgB,SACP,CACKzB,EAAY0B,iBACb,MAAMC,EAAOlB,EAAuBmB,SAC9BtC,EAAO,GACb,IAAK,IAAIuC,EAAI,EAAGA,EAAIF,EAAIG,OAAQD,IAAK,CACjC,MAAME,EAAIC,EAAcL,EAAIE,IAC5B,GAAiB,iBAANE,EAAgB,CACvB,MAAME,EAAQC,OAAOC,KAAKJ,GAC1B,GAAIE,EAAMH,OAAQ,CACd,MAAMtE,EAAOyE,EAAM,GACbG,EAASL,EAAUvE,QACN0B,IAAfI,EAAK9B,GACL8B,EAAK9B,GAAQ4E,EACgB,iBAAf9C,EAAK9B,IAAsB8B,EAAK9B,aAAiB6E,OAE3D/C,EAAK9B,GADL4E,aAAiBE,MACJ,CAAChD,EAAK9B,MAAoB4E,GAE1B,CAAC9C,EAAK9B,GAAiB4E,GAEjC9C,EAAK9B,aAAiB8E,MACzBF,aAAiBE,MACjBhD,EAAK9B,GAAS8B,EAAK9B,GAA+B+E,OAAOH,GAExD9C,EAAK9B,GAA+BgF,KAAKJ,GAI1C9C,EAAK9B,GADL4E,aAAiBE,MACJ,CAAChD,EAAK9B,MAAoB4E,GAE1B,CAAC9C,EAAK9B,GAAiB4E,GAGxC9C,EAAK9B,aAAiB8E,QACtBhD,EAAK9B,GAAS8B,EAAK9B,GACdiF,QAAOV,GAAW,OAANA,IACyB,UAArCJ,EAAIE,GAAwBxC,OAC7BC,EAAK9B,GAAS8B,EAAK9B,GAA+BsE,OAC3CxC,EAAK9B,GAA+B,GACrC,MAGjB,CACJ,CACJ,CACD,OAAO8B,CAAA,CAEP,OAAO0C,EAAcvB,EAEjC,CA7JuBiC,CAASnD,IAGxBvB,KAAKoB,gBAAgBkC,EAAYhC,EAAMC,EAAA,EAkB3CvB,KAAAI,MAAS4B,IACL,MAAMS,EAAmB,iBAANT,EAAkB2C,SAASC,eAAe5C,GAAKA,EAClE,GAAIS,GAAOA,EAAW1D,GAAO,CACd0D,EAAW1D,GACpBwB,QACL,CACD,GAAIkC,IAAOzC,KAAKV,QAAS,CACpBU,KAAaV,QAAUmD,EACvBA,EAAW1D,GAAQiB,KACpB,MAAMoD,EAASpD,KAAamD,SAC5BnD,KAAKwC,WAAwBC,EAAIW,EAAOpD,MACxCA,KAAKoB,gBAAgBrD,EAAYqC,MAAOJ,KAAKV,QAChD,CACD,OAAOU,IAAI,EAGfA,KAAAO,OAAS,KACL,GAAIP,KAAKV,QAAS,CACdU,KAAKoB,gBAAgBrD,EAAYwC,OAAQP,KAAKV,SAC1CU,KAAKV,QAAQuF,aAAa9F,IAC1BiB,KAAKV,QAAQwF,gBAAgB/F,GAEjC,MAAMgG,EAAS/E,KAAKV,QAAQ0F,iBAAiB,IAAIjG,MACjD,IAAK,IAAI8E,EAAI,EAAGA,EAAIkB,EAAOjB,OAAQD,IAAK,CACpC,MAAMoB,EAAKF,EAAOlB,GAAWqB,KAC7BD,WAAG1E,QACN,CACD,KAAOP,KAAKV,QAAQ6F,YAChBnF,KAAKV,QAAQ8F,YAAYpF,KAAKV,QAAQ6F,mBAElCnF,KAAKV,QAAgB4F,KAC5BlF,KAAaV,aAAU4B,CAC3B,CACD,OAAOlB,IAAI,EAGfA,KAAAS,OAAS,KACDT,KAAKV,UAAYU,KAAKqF,eACtBrF,KAAKqF,aAAelH,GAAS,KACzB,GAAI6B,KAAKV,QAAS,CACd,MAAM8D,EAAQpD,KAAKmD,SACnBnD,KAAKwC,WAAwBxC,KAAKV,QAAS8D,EAAOpD,KACrD,CACDA,KAAKqF,kBAAenE,CAAA,KAGrBlB,MAGXA,KAAAsF,OAAS,KACL,GAAItF,KAAKV,QAAS,CACd,IAAIU,KAAKqF,aAIL,MAAO,CAAC,MAAO,CAAEE,MAAM,IAHvB/G,EAAWwB,KAAKqF,cAChBrF,KAAKqF,kBAAenE,CAI3B,CACD,MAAMkC,EAAQpD,KAAKmD,SASnB,OARAC,EAAMoB,MACDxC,IACQhC,KAAKV,UACLU,KAAaV,QAAU0C,EACvBA,EAAUkD,KAAOlF,KAClBA,KAAKoB,gBAAgBrD,EAAYqC,MAAOJ,KAAKV,SAChD,IAEF,CAAC,MAAO8D,EAAM,EAGzBpD,KAAAwF,OAAS,IACExF,KAAKV,QAAUU,KAAKV,QAAQmG,UAAY,GAzN/CzF,KAAKT,MAAQA,WACbS,KAAKR,KAAOA,UAAQT,EACpBiB,KAAKF,WAAaA,UAAc,GAChCE,KAAKb,MAAQA,IACba,KAAKZ,KAAOA,EACZY,KAAKX,WAAaA,UAAsB4F,GAAKlC,EAAA/C,UAAA,sBAAC,OAAAxC,EAAIwC,KAAKR,KAAMZ,EAAWqG,EAAE5D,KAAM4D,EAAE3D,KAAK,IACvFtB,KAAKoB,gBAAgBrD,EAAY2H,KAAM1F,MAAM2F,MAAK,IAAMrG,GAAWU,KAAKI,MAAMd,IAClF,EAuNJ,SAAS0D,EACLP,EACApB,EACAC,G,QAEAmB,WAAIQ,cAAc,IAAIC,YAAY7B,EAAM,CAAEe,OAAQd,KAC1B,QAAxBsE,GAAAC,EAACpD,GAAW,KAAKpB,YAAO,IAAAuE,KAAAE,KAAAD,EAAG,IAAI3C,YAAY7B,EAAM,CAAEe,OAAQd,IAC/D,CAuDA,SAAS0C,EAAcvB,GACnB,IAAInB,EAA2I,KAC/I,OAAQmB,EAAGgB,UACP,IAAK,QACD,MAAMsC,EAAMtD,EACZ,OAAQsD,EAAI1E,MACR,IAAK,OACL,IAAK,SACL,IAAK,WACL,IAAK,QACL,IAAK,SACL,IAAK,SACL,IAAK,MACL,IAAK,MACL,IAAK,QACL,IAAK,OACL,IAAK,iBACL,IAAK,QACL,IAAK,QACL,IAAK,OACL,IAAK,OACL,IAAK,SACL,IAAK,SAEGC,EADAyE,EAAIvG,KACG,CAAE,CAACuG,EAAIvG,MAAOuG,EAAI3B,OAElB2B,EAAI3B,MAEf,MACJ,IAAK,QAEG9C,EADAyE,EAAIvG,KACG,CAAE,CAACuG,EAAIvG,MAAOuG,EAAIC,QAAUD,EAAI3B,MAAQ,MAExC2B,EAAIC,QAAUD,EAAI3B,MAAQ,KAErC,MACJ,IAAK,WAGO9C,EAFU,OAAdyE,EAAI3B,MACA2B,EAAIvG,KACG,CAAE,CAACuG,EAAIvG,MAAOuG,EAAIC,SAElBD,EAAIC,QAGXD,EAAIvG,KACG,CAAE,CAACuG,EAAIvG,MAAOuG,EAAIC,QACnB3B,OAAO0B,EAAI3B,OACX,MAEC2B,EAAIC,QACL3B,OAAO0B,EAAI3B,OACX,KAKtB,MACJ,IAAK,SACD,MAAM6B,EAAMxD,EACZ,GAAIwD,EAAIC,SAAU,CACd,MAAMC,EAAS7B,MAAM8B,KAAKH,EAAII,iBAAiBC,KAAIC,GAAKA,EAAEnC,QAEtD9C,EADA2E,EAAIzG,KACG,CAAE,CAACyG,EAAIzG,MAAO2G,GAEdA,CAEd,MAEO7E,EADA2E,EAAIzG,KACG,CAAE,CAACyG,EAAIzG,MAAOyG,EAAI7B,OAElB6B,EAAI7B,MAGnB,MACJ,IAAK,WACD,MAAMoC,EAAM/D,EAERnB,EADAkF,EAAIhH,KACG,CAAE,CAACgH,EAAIhH,MAAOgH,EAAIpC,OAElBoC,EAAIpC,MAEf,MACJ,IAAK,SACD,MAAMqC,EAAMhE,EAERnB,EADAmF,EAAIjH,KACG,CAAE,CAACiH,EAAIjH,MAAOiH,EAAIrC,OAElBqC,EAAIrC,MAIvB,OAAO9C,CACX,C,ICtmBKoF,E,uSAAAA,MAAO,KACR,YAOHtI,OAAeuI,KAAM,EAAAC,EAAA1B,MAAqB,CAEvC/F,MAAO,WACH,MAAO,CAAEK,KAAM,GACnB,EAEAJ,KAAM,SAAUD,GACZ,MAAO,CACH,CAAC,KAAM,SACP,CAAC,cAAe,CACZkC,KAAM,OACNwF,YAAa,OACbC,GAAI,CAAC,QAASJ,EAAQlH,QAE1B,CAAC,IACGL,EAAMK,KACA,CAAC,SAAU,CAAC,IAAKL,EAAMK,MAAO,KAC9B,YAGlB,EAEAH,WAAY,SAA4C8C,EAA0BhD,EAAc2B,G,yCAG5F,OAFArD,QAAQC,IAAIyE,GAEJA,EAAOd,MAEX,KAAKuF,EAAA5I,YAAYoC,MACbJ,KAAK8C,KAAK,MAASiE,QACnB,MAEJ,KAAKL,EAAQlH,KACTL,EAAMK,KAAO2C,EAAOb,KAGhC,GAAC,EAEDhC,QAAS,MACTC,OAAO","sources":["src/hsml-app.ts","demo/hsml-appi_demo.ts"],"sourcesContent":["import { HAttrOnData, HAttrOnDataFnc, HElement, HElements, HHandlerCtx } from \"./hsml\";\nimport { hsmls2idomPatch } from \"./hsml-idom\";\n\nconst log = console.log;\nconst error = console.error;\nconst warn = console.warn;\n\nexport type HState<State> = () => State;\n\nexport type HView<State, HActionType extends string> = (\n state: State\n) => HElements<HActionType>;\n\nexport type HView1<State, HActionType extends string> = (\n state: State\n) => HElement<HActionType>;\n\nexport type HAppActionType =\n | \"happ-init\"\n | \"happ-mount\"\n | \"happ-umount\"\n | \"happ-update\"\n | \"happ-action\"\n | \"happ-attribute\";\n\nexport enum HAppActions {\n init = \"happ-init\",\n mount = \"happ-mount\",\n umount = \"happ-umount\",\n update = \"happ-update\",\n action = \"happ-action\",\n attribute = \"happ-attribute\"\n}\n\nexport interface HAction<HActionType extends string> {\n type: HActionType | HAppActionType | HAppActions;\n data?: any;\n event?: Event;\n}\n\nexport type HDispatchScope =\n | \"element\"\n | \"window\";\n\nexport enum HDispatchScopes {\n element = \"element\",\n window = \"window\"\n}\n\nexport type HDispatch<HActionType extends string> = (\n type: HAction<HActionType>[\"type\"],\n data?: HAction<HActionType>[\"data\"],\n scope?: HDispatchScope | HDispatchScopes\n) => Promise<void>;\n\nexport type HDispatcher<State, HActionType extends string> = (\n // this: HApp<State, HActionType>,\n action: HAction<HActionType>,\n state: State,\n dispatch: HDispatch<HActionType>\n) => Promise<void>;\n\nconst schedule = window.requestAnimationFrame ||\n // window.webkitRequestAnimationFrame ||\n // (window as any).mozRequestAnimationFrame ||\n // (window as any).oRequestAnimationFrame ||\n // (window as any).msRequestAnimationFrame ||\n function (callback: Function) { window.setTimeout(callback, 1000 / 60); };\n\nconst unschedule = window.cancelAnimationFrame ||\n // window.webkitCancelAnimationFrame ||\n // (window as any).mozCancelAnimationFrame ||\n // (window as any).oCancelAnimationFrame ||\n // (window as any).msCancelAnimationFrame ||\n function (handle: number) { window.clearTimeout(handle); };\n\nconst msgAction = \"action:\";\nconst msgDispatch = \"dispatch:\";\nconst msgRender = \"render:\";\nconst msgUpdate = \"update:\";\n\nconst HAPP = \"happ\";\n\nexport interface HAppI<State, HActionType extends string> {\n state: HState<State>;\n view: HView<State, HActionType>;\n dispatcher: HDispatcher<State, HActionType>;\n element?: Element | string | null;\n debug?: boolean;\n name?: string;\n attributes?: string[];\n}\n\n/**\n * HApp definition\n *\n * @param hAppI HApp definition\n * @returns HApp instance\n */\nexport function happ<State, HActionType extends string>(hAppI: {\n state: HState<State>;\n view: HView<State, HActionType>;\n dispatcher: HDispatcher<State, HActionType>;\n element: Element | string | null;\n debug?: boolean;\n name?: string;\n // attributes?: string[];\n}) {\n return new HApp<State, HActionType>(\n hAppI.state,\n hAppI.view,\n hAppI.dispatcher,\n hAppI.element,\n hAppI.debug,\n hAppI.name\n // hAppI!.attributes\n );\n}\n\n// export type Class<T = object> = new (...args: any[]) => T;\n\n// export function happi<State, HActionType extends string>(\n// hAppI: Class<HAppI<State, HActionType>>,\n// element?: Element | string | null,\n// debug? boolean,\n// name?: string,\n// attributes: string[]\n// ) {\n// const hapi = new hAppI();\n// return new HApp<State, HActionType>(\n// hapi.state,\n// hapi.view,\n// hapi.dispatcher,\n// element,\n// debug\n// );\n// }\n\n// HAppEl\n\n/**\n * HApp custom HTML element definition.\n *\n * @param hAppI HApp definition\n */\nexport function happel<State, HActionType extends string>(hAppI: {\n state: HState<State>;\n view: HView<State, HActionType>;\n dispatcher: HDispatcher<State, HActionType>;\n /** Element suffix name, element name patern is `happ-${name}` */\n name: string;\n /** Element attribute list */\n attributes: string[];\n debug?: boolean;\n}): void {\n customElements.define(\n `${HAPP}-${hAppI.name}`,\n class HAppElement extends HTMLElement {\n static get observedAttributes() {\n return hAppI.attributes;\n }\n\n private _happel: HApp<State, HActionType>;\n\n constructor() {\n super();\n this._happel = new HApp<State, HActionType>(\n hAppI.state,\n hAppI.view,\n hAppI.dispatcher,\n undefined,\n hAppI.debug,\n hAppI.name,\n hAppI.attributes\n );\n (this._happel as any).customElement = this;\n }\n\n connectedCallback() {\n // this._happel.mount(this);\n this.attachShadow({ mode: \"open\" });\n this._happel.mount(this.shadowRoot as any);\n }\n\n disconnectedCallback() {\n this._happel.umount();\n }\n\n adoptedCallback() {\n this._happel.update();\n }\n\n attributeChangedCallback(\n attrName: string,\n oldVal: string | null,\n newVal: string | null\n ) {\n this._happel.dispatch(HAppActions.attribute, {\n attrName,\n oldVal,\n newVal,\n });\n }\n }\n );\n}\n\n/**\n * HSML App\n */\nexport class HApp<State, HActionType extends string> implements HHandlerCtx<HActionType> {\n\n readonly state: State;\n readonly view: HView<State, HActionType>;\n readonly dispatcher: HDispatcher<State, HActionType>;\n\n debug: boolean;\n\n readonly name: string;\n readonly attributes: string[];\n\n readonly element?: HTMLElement;\n readonly refs: { [key: string]: HTMLElement } = {};\n\n readonly customElement?: HTMLElement; // happ custom html element\n\n private _updateSched?: number;\n\n // private _onDispatch?: HDispatcher<State>;\n\n private _windowEventListener?: (event: Event) => void;\n\n constructor(\n state: HState<State>,\n view: HView<State, HActionType>,\n dispatcher?: HDispatcher<State, HActionType>,\n element?: Element | string | null,\n debug?: boolean ,\n name?: string,\n attributes?: string[]\n ) {\n this.debug = debug ?? false;\n this.name = name ?? HAPP;\n this.attributes = attributes ?? [];\n this.state = state();\n this.view = view;\n this.dispatcher = dispatcher ?? (async (a) => log(this.name, msgAction, a.type, a.data));\n this._dispatchAction(HAppActions.init, this).then(() => element && this.mount(element));\n }\n\n dispatch: HDispatch<HActionType> = async (\n type: HActionType | HAppActionType,\n data?: any,\n scope?: HDispatchScope\n ): Promise<void> => {\n return this._dispatchAction(type, data, undefined, scope);\n }\n\n // onDispatch = (dispatcher: HDispatcher<State>): this => {\n // this._onDispatch = dispatcher;\n // return this;\n // }\n\n private async _dispatchAction(\n type: HActionType | HAppActionType,\n data?: any,\n event?: Event,\n scope?: HDispatchScope\n ): Promise<void> {\n if (this.debug) {\n log(this.name, msgAction, { type, data, event });\n const t0 = performance.now();\n await this._dispatch(type, data, event, scope);\n const t1 = performance.now();\n log(this.name, msgDispatch, `${t1 - t0} ms`, this.state);\n } else {\n await this._dispatch(type, data, event, scope);\n }\n }\n\n private async _dispatch(\n type: HActionType | HAppActionType,\n data: any,\n event?: Event,\n scope?: HDispatchScope\n ) {\n try {\n await this.dispatcher(\n { type: type as HActionType, data, event },\n this.state,\n this.dispatch\n );\n this.update();\n scope === \"element\" && this._dispatchElement(type, data);\n scope === \"window\" && this._dispatchWindow(type, data);\n } catch (e) {\n error(this.name, msgDispatch, e);\n }\n }\n\n private _dispatchElement: HDispatch<HActionType> = async (\n type: HActionType | HAppActionType,\n data?: any\n ): Promise<void> => {\n this.customElement && elementDispatchCustomEvent(this.customElement, HAppActions.action, { type, data });\n !this.customElement && this.element && elementDispatchCustomEvent(this.element, HAppActions.action, { type, data });\n // this.customElement && elementDispatchCustomEvent(this.customElement, type, data);\n // !this.customElement && this.element && elementDispatchCustomEvent(this.element, type, data);\n // this._onDispatch?.({ type, data, event }, this.state, this.dispatch);\n }\n\n private _dispatchWindow: HDispatch<HActionType> = async (\n type: HActionType | HAppActionType,\n data?: any): Promise<void> => {\n window.dispatchEvent(new CustomEvent(HAppActions.action, { detail: { type, data } }));\n }\n\n windowDispatchOn() {\n if (!this._windowEventListener) {\n this._windowEventListener = (event: Event) => {\n const action = (event as CustomEvent).detail as HAction<HActionType>;\n this._dispatchAction(action.type, action.data);\n };\n window.addEventListener(HAppActions.action, this._windowEventListener);\n } else {\n warn(\"windowEventListener olready setted\");\n }\n }\n\n windowDispatchOff() {\n if (this._windowEventListener) {\n window.removeEventListener(HAppActions.action, this._windowEventListener);\n }\n }\n\n render = (): HElements<HActionType> => {\n if (this.debug) {\n const t0 = performance.now();\n let hsmls;\n try {\n hsmls = this.view(this.state);\n } catch (e) {\n error(this.name, msgRender, e);\n }\n const t1 = performance.now();\n log(this.name, msgRender, `${t1 - t0} ms`, hsmls);\n return hsmls ?? [];\n } else {\n let hsmls;\n try {\n hsmls = this.view(this.state);\n } catch (e) {\n error(this.name, msgRender, e);\n }\n return hsmls ?? [];\n }\n }\n\n actionCb = (actionType: HActionType, data: HAttrOnData, event: Event): void => {\n data = (data?.constructor === Function)\n ? (data as HAttrOnDataFnc)(event)\n : data;\n if (data === undefined && event) {\n if (event instanceof CustomEvent) {\n data = event.detail;\n } else {\n data = formData(event);\n }\n }\n this._dispatchAction(actionType, data, event);\n }\n\n private _updateDom<HActionType extends string>(\n el: Element,\n hsml: HElements<HActionType>,\n ctx: HHandlerCtx<HActionType>\n ): void {\n if (this.debug) {\n const t0 = performance.now();\n hsmls2idomPatch(el, hsml, ctx);\n const t1 = performance.now();\n log(this.name, msgUpdate, `${t1 - t0} ms`, el);\n } else {\n hsmls2idomPatch(el, hsml, ctx);\n }\n }\n\n mount = (e: Element | string | null): this => {\n const el = (typeof e === \"string\") ? document.getElementById(e) : e;\n if (el && (el as any)[HAPP]) {\n const a = (el as any)[HAPP] as HApp<State, HActionType>;\n a.umount();\n }\n if (el && !this.element) {\n (this as any).element = el;\n (el as any)[HAPP] = this;\n const hsmls = (this as any).render();\n this._updateDom<HActionType>(el, hsmls, this);\n this._dispatchAction(HAppActions.mount, this.element);\n }\n return this;\n }\n\n umount = (): this => {\n if (this.element) {\n this._dispatchAction(HAppActions.umount, this.element);\n if (this.element.hasAttribute(HAPP)) {\n this.element.removeAttribute(HAPP);\n }\n const aNodes = this.element.querySelectorAll(`[${HAPP}]`);\n for (let i = 0; i < aNodes.length; i++) {\n const a = (aNodes[i] as any).happ as HApp<State, HActionType>;\n a?.umount();\n }\n while (this.element.firstChild /*.hasChildNodes()*/) {\n this.element.removeChild(this.element.firstChild);\n }\n delete (this.element as any).happ;\n (this as any).element = undefined;\n }\n return this;\n }\n\n update = (): this => {\n if (this.element && !this._updateSched) {\n this._updateSched = schedule(() => {\n if (this.element) {\n const hsmls = this.render();\n this._updateDom<HActionType>(this.element, hsmls, this);\n }\n this._updateSched = undefined;\n });\n }\n return this;\n }\n\n toHsml = (): HElement<HActionType> => {\n if (this.element) {\n if (this._updateSched) {\n unschedule(this._updateSched);\n this._updateSched = undefined;\n } else {\n return [\"div\", { skip: true }];\n }\n }\n const hsmls = this.render();\n hsmls.push(\n (e: Element) => {\n if (!this.element) {\n (this as any).element = e;\n (e as any).happ = this;\n this._dispatchAction(HAppActions.mount, this.element);\n }\n });\n return [\"div\", hsmls];\n }\n\n toHtml = (): string => {\n return this.element ? this.element.outerHTML : \"\";\n }\n\n}\n\nfunction elementDispatchCustomEvent<HActionType extends string>(\n el: HTMLElement,\n type: HActionType,\n data: any\n) {\n el?.dispatchEvent(new CustomEvent(type, { detail: data }));\n (el as any)[`on${type}`]?.(new CustomEvent(type, { detail: data }));\n}\n\nfunction formData(e: Event): { [k: string]: string | number | boolean | null | Array<string | null> } | string | number | boolean | null | Array<string | null> {\n const el = e.target as HTMLElement;\n switch (el.nodeName) {\n case \"FORM\":\n (e as Event).preventDefault();\n const els = (el as HTMLFormElement).elements;\n const data = {} as { [k: string]: string | null | Array<string | null> };\n for (let i = 0; i < els.length; i++) {\n const d = formInputData(els[i]);\n if (typeof d === \"object\") {\n const names = Object.keys(d as object);\n if (names.length) {\n const name = names[0];\n const value = (d as any)[name];\n if (data[name] === undefined) {\n data[name] = value;\n } else if (typeof data[name] === \"string\" || data[name] instanceof String) {\n if (value instanceof Array) {\n data[name] = [data[name] as string, ...value];\n } else {\n data[name] = [data[name] as string, value as string];\n }\n } else if (data[name] instanceof Array) {\n if (value instanceof Array) {\n data[name] = (data[name] as Array<string | null>).concat(value);\n } else {\n (data[name] as Array<string | null>).push(value);\n }\n } else {\n if (value instanceof Array) {\n data[name] = [data[name] as string, ...value];\n } else {\n data[name] = [data[name] as string, value];\n }\n }\n if (data[name] instanceof Array) {\n data[name] = (data[name] as Array<string | null>)\n .filter(d => d !== null);\n if ((els[i] as HTMLInputElement).type === \"radio\") {\n data[name] = (data[name] as Array<string | null>).length\n ? (data[name] as Array<string | null>)[0]\n : null;\n }\n }\n }\n }\n }\n return data;\n default:\n return formInputData(el);\n }\n}\n\nfunction formInputData(el: Element): { [k: string]: string | number | boolean | null | Array<string | null> } | string | number | boolean | null | Array<string | null> {\n let data: { [k: string]: string | number | boolean | null | Array<string | null> } | string | number | boolean | null | Array<string | null> = null;\n switch (el.nodeName) {\n case \"INPUT\":\n const iel = el as HTMLInputElement;\n switch (iel.type) {\n case \"text\":\n case \"hidden\":\n case \"password\":\n case \"email\":\n case \"number\":\n case \"search\":\n case \"url\":\n case \"tel\":\n case \"color\":\n case \"date\":\n case \"datetime-local\":\n case \"month\":\n case \"range\":\n case \"time\":\n case \"week\":\n case \"submit\":\n case \"button\":\n if (iel.name) {\n data = { [iel.name]: iel.value };\n } else {\n data = iel.value;\n }\n break;\n case \"radio\":\n if (iel.name) {\n data = { [iel.name]: iel.checked ? iel.value : null };\n } else {\n data = iel.checked ? iel.value : null;\n }\n break;\n case \"checkbox\":\n if (iel.value === \"on\") { // value not set in element\n if (iel.name) {\n data = { [iel.name]: iel.checked };\n } else {\n data = iel.checked;\n }\n } else {\n if (iel.name) {\n data = { [iel.name]: iel.checked\n ? String(iel.value)\n : null };\n } else {\n data = iel.checked\n ? String(iel.value)\n : null;\n }\n }\n break;\n }\n break;\n case \"SELECT\":\n const sel = el as HTMLSelectElement;\n if (sel.multiple) {\n const values = Array.from(sel.selectedOptions).map(o => o.value);\n if (sel.name) {\n data = { [sel.name]: values };\n } else {\n data = values;\n }\n } else {\n if (sel.name) {\n data = { [sel.name]: sel.value };\n } else {\n data = sel.value;\n }\n }\n break;\n case \"TEXTAREA\":\n const tel = el as HTMLTextAreaElement;\n if (tel.name) {\n data = { [tel.name]: tel.value };\n } else {\n data = tel.value;\n }\n break;\n case \"BUTTON\":\n const bel = el as HTMLButtonElement;\n if (bel.name) {\n data = { [bel.name]: bel.value };\n } else {\n data = bel.value;\n }\n break;\n }\n return data;\n}\n","import { HElements } from \"../src/hsml\";\nimport { HAction, HApp, HAppActions, HDispatch, happ } from \"../src/hsml-app\";\n\nenum Actions {\n name = \"name\"\n}\n\ninterface State {\n name: string;\n}\n\n(window as any).app = happ<State, Actions>({\n\n state: function (): State {\n return { name: \"\" };\n },\n\n view: function (state: State): HElements<Actions> {\n return [\n [\"h1\", \"Hello\"],\n [\"input~focus\", {\n type: \"text\",\n placeholder: \"name\",\n on: [\"input\", Actions.name]\n }],\n [\"p\",\n state.name\n ? [\"Hello \", [\"b\", state.name], \"!\"]\n : \"Greeting\"\n ]\n ];\n },\n\n dispatcher: async function (this: HApp<State, Actions>, action: HAction<Actions>, state: State, dispatch: HDispatch<Actions>): Promise<void> {\n console.log(action);\n // console.log(this);\n switch (action.type) {\n\n case HAppActions.mount:\n this.refs[\"focus\"].focus();\n break;\n\n case Actions.name:\n state.name = action.data;\n break;\n }\n },\n\n element: \"app\",\n debug: false\n});\n"],"names":["$fe5fa9c04fc86188$var$log","console","log","$fe5fa9c04fc86188$var$error","error","$fe5fa9c04fc86188$var$warn","warn","$fe5fa9c04fc86188$export$3dcd9fad60135c2c","HAppActions","$fe5fa9c04fc86188$export$3d736e925369e0e4","HDispatchScopes","$fe5fa9c04fc86188$var$schedule","window","requestAnimationFrame","callback","setTimeout","$fe5fa9c04fc86188$var$unschedule","cancelAnimationFrame","handle","clearTimeout","$fe5fa9c04fc86188$var$msgAction","$fe5fa9c04fc86188$var$msgDispatch","$fe5fa9c04fc86188$var$msgRender","$fe5fa9c04fc86188$var$HAPP","$fe5fa9c04fc86188$export$eb8950696418f795","hAppI","$fe5fa9c04fc86188$export$8cfef5dc37c46888","state","view","dispatcher","element","debug","name","$fe5fa9c04fc86188$export$1cfc54b3834d3c50","customElements","define","HTMLElement","observedAttributes","attributes","connectedCallback","this","attachShadow","mode","_happel","mount","shadowRoot","disconnectedCallback","umount","adoptedCallback","update","attributeChangedCallback","attrName","oldVal","newVal","dispatch","attribute","constructor","super","undefined","customElement","_dispatchAction","type","data","event","scope","t0","performance","now","_dispatch","t1","_dispatchElement","_dispatchWindow","e","windowDispatchOn","_windowEventListener","action","detail","addEventListener","windowDispatchOff","removeEventListener","_updateDom","el","hsml","ctx","$hrCkK","hsmls2idomPatch","refs","$fe5fa9c04fc86188$var$__awaiter","$fe5fa9c04fc86188$var$elementDispatchCustomEvent","dispatchEvent","CustomEvent","render","hsmls","actionCb","actionType","Function","target","nodeName","preventDefault","els","elements","i","length","d","$fe5fa9c04fc86188$var$formInputData","names","Object","keys","value","String","Array","concat","push","filter","$fe5fa9c04fc86188$var$formData","document","getElementById","hasAttribute","removeAttribute","aNodes","querySelectorAll","a","happ","firstChild","removeChild","_updateSched","toHsml","skip","toHtml","outerHTML","init","then","_b","_a","call","iel","checked","sel","multiple","values","from","selectedOptions","map","o","tel","bel","$f9292f9b073d7581$var$Actions","app","$fe5fa9c04fc86188$exports","placeholder","on","focus"],"version":3,"file":"hsml-appi_demo.fef950c1.js.map"}
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="en"><head><script nomodule defer src="hsml-app-form-validation_demo.d3925067.js"></script><script type="module" src="hsml-app-form-validation_demo.b3a5c810.js"></script><meta charset="utf-8"><title>PeRyL hsml app demo</title></head><body> <h1>PeRyL hsml app demo</h1> <div id="app"></div> <script type="module" src="hsml-appi_demo.427fdebd.js"></script><script src="hsml-appi_demo.2c3fb511.js" nomodule defer></script> </body></html>
1
+ <!DOCTYPE html><html lang="en"><head><script nomodule defer src="hsml-app-form-validation_demo.fdcc0b2d.js"></script><script type="module" src="hsml-app-form-validation_demo.c6856b02.js"></script><meta charset="utf-8"><title>PeRyL hsml app demo</title></head><body> <h1>PeRyL hsml app demo</h1> <div id="app"></div> <script type="module" src="hsml-appi_demo.fef950c1.js"></script><script src="hsml-appi_demo.e5e28a65.js" nomodule defer></script> </body></html>
@@ -1 +1 @@
1
- {"mappings":"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","sources":["src/hsml-convert.ts","demo/hsml-convert_demo.ts"],"sourcesContent":["import { HElement, HElements } from \"./hsml\";\n\nconst dataRegex = /data-(.+)/;\n\nexport function dom2hsmlStr(node: Node, depth = 0): string {\n let out = \"\";\n if (node.nodeType === Node.TEXT_NODE) {\n const t = node?.textContent?.trim();\n out += `${indent(depth)}${JSON.stringify(t)}`;\n return out;\n }\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as HTMLElement;\n const attributes = Array.from(element.attributes)\n .reduce((a, v, i) => (a[v.nodeName] = v.nodeValue, a), {} as any);\n const attrKeys = Object.keys(attributes);\n let id;\n let classes = [] as string[];\n const attrs = {} as {[key: string]: any};\n const attrData = {} as {[key: string]: any};\n if (attrKeys.length) {\n attrKeys.forEach(key => {\n const value = attributes[key] as string;\n if (key.toLowerCase() === \"id\") {\n id = value;\n } else if (key.toLowerCase() === \"class\") {\n const clss = value.split(\" \");\n classes = classes.concat(clss);\n } else if (dataRegex.test(key.toLowerCase())) {\n const g = dataRegex.exec(key);\n attrData[g![1].toLowerCase()] = value;\n } else {\n attrs[key.toLowerCase()] = value;\n }\n });\n }\n let name = element.tagName.toLowerCase();\n if (id) {\n name += \"#\" + id;\n }\n if (classes.length) {\n name += \".\" + classes.join(\".\");\n }\n if (Object.keys(attrData).length) {\n attrs[\"data\"] = attrData;\n }\n out += `${indent(depth)}[\"${name.toLowerCase()}\"`;\n if (Object.keys(attrs).length) {\n out += `,\\n${indent(depth + 1)}${attrsFormat(attrs)}`;\n }\n if (element.hasChildNodes()) {\n out += `,\\n${indent(depth + 1)}[`;\n }\n }\n let i = 0;\n if (node.hasChildNodes()) {\n let child = node.firstChild;\n while (child) {\n out += `${i ? \",\" : \"\"}\\n${dom2hsmlStr(child, depth + 2)}`;\n child = child.nextSibling;\n i++;\n }\n }\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as HTMLElement;\n if (element.hasChildNodes()) {\n out += `\\n${indent(depth + 1)}]`;\n }\n out += `\\n${indent(depth)}]`;\n }\n if (!depth) {\n // condense\n out = out.replace(/\\[\\s+\\\"\\\"\\s+\\]$/mg, \"[]\");\n out = out.replace(/\\[\\s+\\\"\\\",?$/mg, \"[\");\n out = out.replace(/,\\s+\\\"\\\"(,?)$/mg, \"$1\");\n out = out.replace(/,\\s+\\[\\](\\s+],?)$/mg, \"$1\");\n out = out.replace(/(},\\s+)\\[\\s+(\\\".+\\\")\\s+\\](,?)$/mg, \"$1$2$3\");\n out = out.replace(/(\\[\\\"[a-zA-Z0-9_\\#\\.-]+\\\",)\\s+\\[\\s+(\\\".+\\\")\\s+\\]\\s+(\\],?)$/mg, \"$1 $2$3\");\n out = out.replace(/(\\[\\\"[a-zA-Z0-9_\\#\\.-]+\\\")\\s+(\\],?)$/mg, \"$1$2\");\n }\n return out;\n}\n\nfunction indent(count: number): string {\n let indent = \"\";\n for (let i = 0; i < count; i++) {\n indent += \" \";\n }\n return indent;\n}\n\nfunction attrsFormat(o: any): string {\n if (typeof o !== \"object\" || Array.isArray(o)) {\n return JSON.stringify(o);\n }\n let props = Object\n .keys(o)\n .map(k => `${k}: ${attrsFormat(o[k])}`)\n .join(\", \");\n return `{ ${props} }`;\n}\n\nexport function html2hsmlStr(html: string): string {\n const node = new DOMParser()\n .parseFromString(html, \"text/html\")\n .getElementsByTagName(\"body\")[0]\n .firstChild;\n return node ? dom2hsmlStr(node) : \"\";\n}\n\ninterface Handler {\n text(text: string): void;\n open(node: { name: string; attributes: any }): void;\n close(tag: string): void;\n}\n\nclass HsmlHandler implements Handler {\n\n private _root = [[]] as HElements[];\n private _nodePath = [] as any; // path that consist of previous hsml nodes\n private _pointer = this._root;\n private _dataRegex = /data-(.+)/;\n\n root(): HElement {\n return this._root[0][0];\n }\n\n text(text: string): void {\n // console.log(\"text:\\t\", JSON.stringify(text));\n // console.log(hsml, hsmlNode, hsmlPath);\n const textTrimmed = text.trim().replace(/\\s+/mg, \" \");\n // console.log(\"text:\\t\", JSON.stringify(textTrimmed));\n if (textTrimmed) {\n this._pointer[this._pointer.length - 1].push(textTrimmed);\n }\n }\n\n open(node: { name: string; attributes: any }): void {\n // console.log(\"open:\\t\", JSON.stringify(node));\n const attrKeys = Object.keys(node.attributes);\n let id;\n let classes = [] as string[];\n const attrs = {} as {[key: string]: any};\n const attrData = {} as {[key: string]: any};\n if (attrKeys.length) {\n attrKeys.forEach(key => {\n const value = node.attributes[key] as string;\n if (key === \"id\") {\n id = value;\n } else if (key === \"class\") {\n const clss = value.split(\" \");\n classes = classes.concat(clss);\n } else if (this._dataRegex.test(key)) {\n const g = this._dataRegex.exec(key);\n attrData[g![1]] = value;\n } else {\n attrs[key] = value;\n }\n });\n }\n let name = node.name;\n if (id) {\n name += \"#\" + id;\n }\n if (classes.length) {\n name += \".\" + classes.join(\".\");\n }\n if (Object.keys(attrData).length) {\n attrs[\"data\"] = attrData;\n }\n const hsmlNode = [name] as any[];\n if (Object.keys(attrs).length) {\n hsmlNode.push(attrs);\n }\n const children: any[] = [];\n hsmlNode.push(children);\n\n this._pointer[this._pointer.length - 1].push(hsmlNode as HElement);\n this._nodePath.push(hsmlNode);\n this._pointer = hsmlNode;\n // console.log(\">>>\", hsmlPath.map(x => x[0]));\n }\n\n close(tag: string): void {\n // console.log(\"close:\\t\", JSON.stringify(tag));\n const currentNode = this._nodePath.pop();\n\n let children = currentNode[currentNode.length - 1];\n if (children.length === 0) {\n currentNode.pop(); // remove children\n // } else if (children.length === 1) {\n // if (typeof children[0] === \"string\") {\n // currentNode[currentNode.length - 1] = children[0];\n // }\n }\n this._pointer = this._nodePath[this._nodePath.length - 1];\n // console.log(\">>>\", hsmlPath.map(x => x[0]));\n }\n}\n\nfunction domTraverse(node: Node, handler: Handler ): void {\n if (node.nodeType === Node.TEXT_NODE) {\n const t = node?.textContent?.trim();\n t && handler.text(t);\n }\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as HTMLElement;\n const attributes = Array.from(element.attributes)\n .reduce((a, v, i) => (a[v.nodeName] = v.nodeValue, a), {} as any);\n handler.open({ name: element.tagName.toLowerCase(), attributes });\n }\n if (node.hasChildNodes()) {\n let child = node.firstChild;\n while (child) {\n domTraverse(child, handler);\n child = child.nextSibling;\n }\n }\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as HTMLElement;\n handler.close(element.tagName);\n }\n}\n\nexport function dom2hsml(node: Node): HElement {\n const h = new HsmlHandler();\n node && domTraverse(node, h);\n return h.root();\n}\n\nexport function html2hsml(html: string): HElement {\n const node = new DOMParser()\n .parseFromString(html, \"text/html\")\n .getElementsByTagName(\"body\")[0]\n .firstChild;\n return node && dom2hsml(node);\n}\n\nexport function hsml2str(hsml: HElement, condense = true): HElement {\n let str = JSON.stringify(hsml, undefined, 4);\n if (condense) {\n str = str.replace(/(\\[)\\s+(\\\"[a-zA-Z0-9_\\#\\.-]+\\\")\\s+(\\],?)$/mg, \"$1$2$3\");\n str = str.replace(/(\\[)\\s+(\\\"[a-zA-Z0-9_\\#\\.-]+\\\",\\s+(\\[|{),?)$/mg, \"$1$2\");\n str = str.replace(/(\\[)\\s+(\\\"[a-zA-Z0-9_\\#\\.-]+\\\",)\\s+(\\[\\s*\\\".+\\\"\\s*\\])\\s+(\\],?)$/mg, \"$1$2 $3$4\");\n str = str.replace(/(\\[\\\"[a-zA-Z0-9_\\#\\.-]+\\\",\\s+)({\\s+(.*)\\s+})(,?)$/mg,\n (a, b, c, d, e) => b + attrsFormat(JSON.parse(c)) + e);\n str = str.replace(/(},\\s+)\\[\\s+(\\\".+\\\")\\s+\\](,?)$/mg, \"$1$2$3\");\n }\n return str;\n}\n","import { html2hsmlStr, html2hsml, hsml2str } from \"../src/hsml-convert\";\n\nconst html = `<div>\n Hello\n <p>\n <em> </em>\n text\n <b>\n text\n </b>\n </p>\n <hr/>\n <span\n id=\"id1\"\n class=\"c1 c2\"\n data-x=\"dx\"\n data-y=\"dy\">\n </span>,\n <button\n name=\"myButton\">\n Click me\n </button>\n !\n</div>`;\n\nconst formEl = document.getElementById(\"form\")! as HTMLFormElement;\nconst htmlEl = document.getElementById(\"html\")! as HTMLTextAreaElement;\nconst hsmlEl = document.getElementById(\"hsml\")! as HTMLTextAreaElement;\n\nhtmlEl.value = html;\nhsmlEl.value = html2hsmlStr(html);\n\nhtmlEl.addEventListener(\"keyup\", () => {\n const htmlIn = htmlEl.value;\n hsmlEl.value = html2hsmlStr(htmlIn);\n});\n\nformEl.addEventListener(\"submit\", e => {\n e.preventDefault();\n const htmlIn = htmlEl.value;\n hsmlEl.value = html2hsmlStr(htmlIn);\n});\n\nhtmlEl.focus();\n\nconst hsml = html2hsml(html);\n// console.log(JSON.stringify(hsml, undefined, 4));\nconsole.log(hsml2str(hsml, true));\n"],"names":["$28b907453eb679df$var$dataRegex","$28b907453eb679df$export$cf8f1c3408f22f1e","node","depth","out","nodeType","Node","TEXT_NODE","t","_a","textContent","trim","$28b907453eb679df$var$indent","JSON","stringify","ELEMENT_NODE","element","attributes","Array","from","reduce","a","v","i","nodeName","nodeValue","attrKeys","Object","keys","id","classes","attrs","attrData","length","forEach","key","value","toLowerCase","clss","split","concat","test","g","exec","name","tagName","join","$28b907453eb679df$var$attrsFormat","hasChildNodes","child","firstChild","nextSibling","replace","count","indent","o","isArray","map","k","$28b907453eb679df$export$4a5aa4e54c25d84c","html","DOMParser","parseFromString","getElementsByTagName","$28b907453eb679df$var$HsmlHandler","root","this","_root","text","textTrimmed","_pointer","push","open","_dataRegex","hsmlNode","_nodePath","close","tag","currentNode","pop","constructor","$28b907453eb679df$var$domTraverse","handler","$28b907453eb679df$export$3f5c7fedc8b1f572","h","$9a322ec42f854dc4$var$html","$9a322ec42f854dc4$var$formEl","document","getElementById","$9a322ec42f854dc4$var$htmlEl","$9a322ec42f854dc4$var$hsmlEl","addEventListener","htmlIn","e","preventDefault","focus","$9a322ec42f854dc4$var$hsml","console","log","hsml","condense","str","undefined","b","c","d","parse"],"version":3,"file":"hsml-convert_demo.0ea1fa3b.js.map"}
1
+ {"mappings":"AAEA,MAAMA,EAAY,YAEZ,SAAUC,EAAYC,EAAYC,EAAQ,G,MAC5C,IAAIC,EAAM,GACV,GAAIF,EAAKG,WAAaC,KAAKC,UAAW,CAClC,MAAMC,EAAqB,QAAjBC,EAAAP,aAAI,EAAJA,EAAMQ,mBAAW,IAAAD,OAAA,EAAAA,EAAEE,OAE7B,OADAP,GAAO,GAAGQ,EAAOT,KAASU,KAAKC,UAAUN,KAClCJ,CACV,CACD,GAAIF,EAAKG,WAAaC,KAAKS,aAAc,CACrC,MAAMC,EAAUd,EACVe,EAAaC,MAAMC,KAAKH,EAAQC,YACjCG,QAAO,CAACC,EAAGC,EAAGC,KAAOF,EAAEC,EAAEE,UAAYF,EAAEG,UAAWJ,IAAI,IACrDK,EAAWC,OAAOC,KAAKX,GAC7B,IAAIY,EACAC,EAAU,GACd,MAAMC,EAAQ,GACRC,EAAW,GACbN,EAASO,QACTP,EAASQ,SAAQC,IACb,MAAMC,EAAQnB,EAAWkB,GACzB,GAA0B,OAAtBA,EAAIE,cACJR,EAAKO,OACF,GAA0B,UAAtBD,EAAIE,cAA2B,CACtC,MAAMC,EAAOF,EAAMG,MAAM,KACzBT,EAAUA,EAAQU,OAAOF,EAC5B,MAAM,GAAItC,EAAUyC,KAAKN,EAAIE,eAAgB,CAC1C,MAAMK,EAAI1C,EAAU2C,KAAKR,GACzBH,EAASU,EAAG,GAAGL,eAAiBD,CACnC,MACGL,EAAMI,EAAIE,eAAiBD,CAAA,IAIvC,IAAIQ,EAAO5B,EAAQ6B,QAAQR,cACvBR,IACAe,GAAQ,IAAMf,GAEdC,EAAQG,SACRW,GAAQ,IAAMd,EAAQgB,KAAK,MAE3BnB,OAAOC,KAAKI,GAAUC,SACtBF,EAAM,KAAUC,GAEpB5B,GAAO,GAAGQ,EAAOT,OAAWyC,EAAKP,iBAC7BV,OAAOC,KAAKG,GAAOE,SACnB7B,GAAO,MAAMQ,EAAOT,EAAQ,KAAK4C,EAAYhB,MAE7Cf,EAAQgC,kBACR5C,GAAO,MAAMQ,EAAOT,EAAQ,MAEnC,CACD,IAAIoB,EAAI,EACR,GAAIrB,EAAK8C,gBAAiB,CACtB,IAAIC,EAAQ/C,EAAKgD,WACjB,KAAOD,GACH7C,GAAO,GAAGmB,EAAI,IAAM,OAAOtB,EAAYgD,EAAO9C,EAAQ,KACtD8C,EAAQA,EAAME,YACd5B,GAEP,CACD,GAAIrB,EAAKG,WAAaC,KAAKS,aAAc,CACrBb,EACJ8C,kBACR5C,GAAO,KAAKQ,EAAOT,EAAQ,OAE/BC,GAAO,KAAKQ,EAAOT,KACtB,CAWD,OAVKA,IAEDC,EAAMA,EAAIgD,QAAQ,oBAAqB,MACvChD,EAAMA,EAAIgD,QAAQ,iBAAkB,KACpChD,EAAMA,EAAIgD,QAAQ,kBAAmB,MACrChD,EAAMA,EAAIgD,QAAQ,sBAAuB,MACzChD,EAAMA,EAAIgD,QAAQ,mCAAoC,UACtDhD,EAAMA,EAAIgD,QAAQ,+DAAgE,WAClFhD,EAAMA,EAAIgD,QAAQ,yCAA0C,SAEzDhD,CACX,CAEA,SAASQ,EAAOyC,GACZ,IAAIC,EAAS,GACb,IAAK,IAAI/B,EAAI,EAAGA,EAAI8B,EAAO9B,IACvB+B,GAAU,OAEd,OAAOA,CACX,CAEA,SAASP,EAAYQ,GACjB,GAAiB,iBAANA,GAAkBrC,MAAMsC,QAAQD,GACvC,OAAO1C,KAAKC,UAAUyC,GAM1B,MAAO,KAJK5B,OACPC,KAAK2B,GACLE,KAAIC,GAAK,GAAGA,MAAMX,EAAYQ,EAAEG,QAChCZ,KAAK,SAEd,CAEM,SAAUa,EAAaC,GACzB,MAAM1D,GAAO,IAAI2D,WACZC,gBAAgBF,EAAM,aACtBG,qBAAqB,QAAQ,GAC7Bb,WACL,OAAOhD,EAAOD,EAAYC,GAAQ,EACtC,CAQA,MAAM8D,EAOFC,OACI,OAAOC,KAAKC,MAAM,GAAG,EACzB,CAEAC,KAAKA,GAGD,MAAMC,EAAcD,EAAKzD,OAAOyC,QAAQ,QAAS,KAE7CiB,GACAH,KAAKI,SAASJ,KAAKI,SAASrC,OAAS,GAAGsC,KAAKF,EAErD,CAEAG,KAAKtE,GAED,MAAMwB,EAAWC,OAAOC,KAAK1B,EAAKe,YAClC,IAAIY,EACAC,EAAU,GACd,MAAMC,EAAQ,GACRC,EAAW,GACbN,EAASO,QACTP,EAASQ,SAAQC,IACb,MAAMC,EAAQlC,EAAKe,WAAWkB,GAC9B,GAAY,OAARA,EACAN,EAAKO,OACF,GAAY,UAARD,EAAiB,CACxB,MAAMG,EAAOF,EAAMG,MAAM,KACzBT,EAAUA,EAAQU,OAAOF,EAC5B,MAAM,GAAI4B,KAAKO,WAAWhC,KAAKN,GAAM,CAClC,MAAMO,EAAIwB,KAAKO,WAAW9B,KAAKR,GAC/BH,EAASU,EAAG,IAAMN,CACrB,MACGL,EAAMI,GAAOC,CAAA,IAIzB,IAAIQ,EAAO1C,EAAK0C,KACZf,IACAe,GAAQ,IAAMf,GAEdC,EAAQG,SACRW,GAAQ,IAAMd,EAAQgB,KAAK,MAE3BnB,OAAOC,KAAKI,GAAUC,SACtBF,EAAM,KAAUC,GAEpB,MAAM0C,EAAW,CAAC9B,GACdjB,OAAOC,KAAKG,GAAOE,QACnByC,EAASH,KAAKxC,GAGlB2C,EAASH,KADe,IAGxBL,KAAKI,SAASJ,KAAKI,SAASrC,OAAS,GAAGsC,KAAKG,GAC7CR,KAAKS,UAAUJ,KAAKG,GACpBR,KAAKI,SAAWI,CAEpB,CAEAE,MAAMC,GAEF,MAAMC,EAAcZ,KAAKS,UAAUI,MAGX,IADTD,EAAYA,EAAY7C,OAAS,GACnCA,QACT6C,EAAYC,MAMhBb,KAAKI,SAAWJ,KAAKS,UAAUT,KAAKS,UAAU1C,OAAS,EAE3D,CAjFJ+C,cAEYd,KAAAC,MAAQ,CAAC,IACTD,KAAAS,UAAY,GACZT,KAAAI,SAAWJ,KAAKC,MAChBD,KAAAO,WAAa,WA6EzB,EAEA,SAASQ,EAAY/E,EAAYgF,G,MAC7B,GAAIhF,EAAKG,WAAaC,KAAKC,UAAW,CAClC,MAAMC,EAAqB,QAAjBC,EAAAP,aAAI,EAAJA,EAAMQ,mBAAW,IAAAD,OAAA,EAAAA,EAAEE,OAC7BH,GAAK0E,EAAQd,KAAK5D,EACrB,CACD,GAAIN,EAAKG,WAAaC,KAAKS,aAAc,CACrC,MAAMC,EAAUd,EACVe,EAAaC,MAAMC,KAAKH,EAAQC,YACjCG,QAAO,CAACC,EAAGC,EAAGC,KAAOF,EAAEC,EAAEE,UAAYF,EAAEG,UAAWJ,IAAI,IAC3D6D,EAAQV,KAAK,CAAE5B,KAAM5B,EAAQ6B,QAAQR,c,WAAepB,GACvD,CACD,GAAIf,EAAK8C,gBAAiB,CACtB,IAAIC,EAAQ/C,EAAKgD,WACjB,KAAOD,GACHgC,EAAYhC,EAAOiC,GACnBjC,EAAQA,EAAME,WAErB,CACD,GAAIjD,EAAKG,WAAaC,KAAKS,aAAc,CACrC,MAAMC,EAAUd,EAChBgF,EAAQN,MAAM5D,EAAQ6B,QACzB,CACL,CAEM,SAAUsC,EAAqCjF,GACjD,MAAMkF,EAAI,IAAIpB,EAEd,OADA9D,GAAQ+E,EAAY/E,EAAMkF,GACnBA,EAAEnB,MACb,CClOA,MAAMoB,EAAO,oUAuBPC,EAASC,SAASC,eAAe,QACjCC,EAASF,SAASC,eAAe,QACjCE,EAASH,SAASC,eAAe,QAEvCC,EAAOrD,MAAQiD,EACfK,EAAOtD,MAAQuB,EAAa0B,GAE5BI,EAAOE,iBAAiB,SAAS,KAC7B,MAAMC,EAASH,EAAOrD,MACtBsD,EAAOtD,MAAQuB,EAAaiC,EAAA,IAGhCN,EAAOK,iBAAiB,UAAUE,IAC9BA,EAAEC,iBACF,MAAMF,EAASH,EAAOrD,MACtBsD,EAAOtD,MAAQuB,EAAaiC,EAAA,IAGhCH,EAAOM,QAEP,MAAMC,EDyLA,SAAgDpC,GAClD,MAAM1D,GAAO,IAAI2D,WACZC,gBAAgBF,EAAM,aACtBG,qBAAqB,QAAQ,GAC7Bb,WACL,OAAOhD,GAAQiF,EAASjF,EAC5B,CC/La,CAAUmF,GAEvBY,QAAQC,ID+LF,SAA+CC,EAA6BC,GAAW,GACzF,IAAIC,EAAMxF,KAAKC,UAAUqF,OAAMG,EAAW,GAS1C,OARIF,IACAC,EAAMA,EAAIjD,QAAQ,8CAA+C,UACjEiD,EAAMA,EAAIjD,QAAQ,iDAAkD,QACpEiD,EAAMA,EAAIjD,QAAQ,oEAAqE,aACvFiD,EAAMA,EAAIjD,QAAQ,uDACd,CAAC/B,EAAGkF,EAAGC,EAAGC,EAAGZ,IAAMU,EAAIxD,EAAYlC,KAAK6F,MAAMF,IAAMX,IACxDQ,EAAMA,EAAIjD,QAAQ,mCAAoC,WAEnDiD,CACX,CC1MY,CAASL,GAAM","sources":["src/hsml-convert.ts","demo/hsml-convert_demo.ts"],"sourcesContent":["import { HElement, HElements } from \"./hsml\";\n\nconst dataRegex = /data-(.+)/;\n\nexport function dom2hsmlStr(node: Node, depth = 0): string {\n let out = \"\";\n if (node.nodeType === Node.TEXT_NODE) {\n const t = node?.textContent?.trim();\n out += `${indent(depth)}${JSON.stringify(t)}`;\n return out;\n }\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as HTMLElement;\n const attributes = Array.from(element.attributes)\n .reduce((a, v, i) => (a[v.nodeName] = v.nodeValue, a), {} as any);\n const attrKeys = Object.keys(attributes);\n let id;\n let classes = [] as string[];\n const attrs = {} as {[key: string]: any};\n const attrData = {} as {[key: string]: any};\n if (attrKeys.length) {\n attrKeys.forEach(key => {\n const value = attributes[key] as string;\n if (key.toLowerCase() === \"id\") {\n id = value;\n } else if (key.toLowerCase() === \"class\") {\n const clss = value.split(\" \");\n classes = classes.concat(clss);\n } else if (dataRegex.test(key.toLowerCase())) {\n const g = dataRegex.exec(key);\n attrData[g![1].toLowerCase()] = value;\n } else {\n attrs[key.toLowerCase()] = value;\n }\n });\n }\n let name = element.tagName.toLowerCase();\n if (id) {\n name += \"#\" + id;\n }\n if (classes.length) {\n name += \".\" + classes.join(\".\");\n }\n if (Object.keys(attrData).length) {\n attrs[\"data\"] = attrData;\n }\n out += `${indent(depth)}[\"${name.toLowerCase()}\"`;\n if (Object.keys(attrs).length) {\n out += `,\\n${indent(depth + 1)}${attrsFormat(attrs)}`;\n }\n if (element.hasChildNodes()) {\n out += `,\\n${indent(depth + 1)}[`;\n }\n }\n let i = 0;\n if (node.hasChildNodes()) {\n let child = node.firstChild;\n while (child) {\n out += `${i ? \",\" : \"\"}\\n${dom2hsmlStr(child, depth + 2)}`;\n child = child.nextSibling;\n i++;\n }\n }\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as HTMLElement;\n if (element.hasChildNodes()) {\n out += `\\n${indent(depth + 1)}]`;\n }\n out += `\\n${indent(depth)}]`;\n }\n if (!depth) {\n // condense\n out = out.replace(/\\[\\s+\\\"\\\"\\s+\\]$/mg, \"[]\");\n out = out.replace(/\\[\\s+\\\"\\\",?$/mg, \"[\");\n out = out.replace(/,\\s+\\\"\\\"(,?)$/mg, \"$1\");\n out = out.replace(/,\\s+\\[\\](\\s+],?)$/mg, \"$1\");\n out = out.replace(/(},\\s+)\\[\\s+(\\\".+\\\")\\s+\\](,?)$/mg, \"$1$2$3\");\n out = out.replace(/(\\[\\\"[a-zA-Z0-9_\\#\\.-]+\\\",)\\s+\\[\\s+(\\\".+\\\")\\s+\\]\\s+(\\],?)$/mg, \"$1 $2$3\");\n out = out.replace(/(\\[\\\"[a-zA-Z0-9_\\#\\.-]+\\\")\\s+(\\],?)$/mg, \"$1$2\");\n }\n return out;\n}\n\nfunction indent(count: number): string {\n let indent = \"\";\n for (let i = 0; i < count; i++) {\n indent += \" \";\n }\n return indent;\n}\n\nfunction attrsFormat(o: any): string {\n if (typeof o !== \"object\" || Array.isArray(o)) {\n return JSON.stringify(o);\n }\n let props = Object\n .keys(o)\n .map(k => `${k}: ${attrsFormat(o[k])}`)\n .join(\", \");\n return `{ ${props} }`;\n}\n\nexport function html2hsmlStr(html: string): string {\n const node = new DOMParser()\n .parseFromString(html, \"text/html\")\n .getElementsByTagName(\"body\")[0]\n .firstChild;\n return node ? dom2hsmlStr(node) : \"\";\n}\n\ninterface Handler {\n text(text: string): void;\n open(node: { name: string; attributes: any }): void;\n close(tag: string): void;\n}\n\nclass HsmlHandler<HActionType extends string> implements Handler {\n\n private _root = [[]] as HElements<HActionType>[];\n private _nodePath = [] as any; // path that consist of previous hsml nodes\n private _pointer = this._root;\n private _dataRegex = /data-(.+)/;\n\n root(): HElement<HActionType> {\n return this._root[0][0];\n }\n\n text(text: string): void {\n // console.log(\"text:\\t\", JSON.stringify(text));\n // console.log(hsml, hsmlNode, hsmlPath);\n const textTrimmed = text.trim().replace(/\\s+/mg, \" \");\n // console.log(\"text:\\t\", JSON.stringify(textTrimmed));\n if (textTrimmed) {\n this._pointer[this._pointer.length - 1].push(textTrimmed);\n }\n }\n\n open(node: { name: string; attributes: any }): void {\n // console.log(\"open:\\t\", JSON.stringify(node));\n const attrKeys = Object.keys(node.attributes);\n let id;\n let classes = [] as string[];\n const attrs = {} as {[key: string]: any};\n const attrData = {} as {[key: string]: any};\n if (attrKeys.length) {\n attrKeys.forEach(key => {\n const value = node.attributes[key] as string;\n if (key === \"id\") {\n id = value;\n } else if (key === \"class\") {\n const clss = value.split(\" \");\n classes = classes.concat(clss);\n } else if (this._dataRegex.test(key)) {\n const g = this._dataRegex.exec(key);\n attrData[g![1]] = value;\n } else {\n attrs[key] = value;\n }\n });\n }\n let name = node.name;\n if (id) {\n name += \"#\" + id;\n }\n if (classes.length) {\n name += \".\" + classes.join(\".\");\n }\n if (Object.keys(attrData).length) {\n attrs[\"data\"] = attrData;\n }\n const hsmlNode = [name] as any[];\n if (Object.keys(attrs).length) {\n hsmlNode.push(attrs);\n }\n const children: any[] = [];\n hsmlNode.push(children);\n\n this._pointer[this._pointer.length - 1].push(hsmlNode as HElement<HActionType>);\n this._nodePath.push(hsmlNode);\n this._pointer = hsmlNode;\n // console.log(\">>>\", hsmlPath.map(x => x[0]));\n }\n\n close(tag: string): void {\n // console.log(\"close:\\t\", JSON.stringify(tag));\n const currentNode = this._nodePath.pop();\n\n let children = currentNode[currentNode.length - 1];\n if (children.length === 0) {\n currentNode.pop(); // remove children\n // } else if (children.length === 1) {\n // if (typeof children[0] === \"string\") {\n // currentNode[currentNode.length - 1] = children[0];\n // }\n }\n this._pointer = this._nodePath[this._nodePath.length - 1];\n // console.log(\">>>\", hsmlPath.map(x => x[0]));\n }\n}\n\nfunction domTraverse(node: Node, handler: Handler ): void {\n if (node.nodeType === Node.TEXT_NODE) {\n const t = node?.textContent?.trim();\n t && handler.text(t);\n }\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as HTMLElement;\n const attributes = Array.from(element.attributes)\n .reduce((a, v, i) => (a[v.nodeName] = v.nodeValue, a), {} as any);\n handler.open({ name: element.tagName.toLowerCase(), attributes });\n }\n if (node.hasChildNodes()) {\n let child = node.firstChild;\n while (child) {\n domTraverse(child, handler);\n child = child.nextSibling;\n }\n }\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as HTMLElement;\n handler.close(element.tagName);\n }\n}\n\nexport function dom2hsml<HActionType extends string>(node: Node): HElement<HActionType> {\n const h = new HsmlHandler<HActionType>();\n node && domTraverse(node, h);\n return h.root();\n}\n\nexport function html2hsml<HActionType extends string>(html: string): HElement<HActionType> {\n const node = new DOMParser()\n .parseFromString(html, \"text/html\")\n .getElementsByTagName(\"body\")[0]\n .firstChild;\n return node && dom2hsml(node);\n}\n\nexport function hsml2str<HActionType extends string>(hsml: HElement<HActionType>, condense = true): HElement<HActionType> {\n let str = JSON.stringify(hsml, undefined, 4);\n if (condense) {\n str = str.replace(/(\\[)\\s+(\\\"[a-zA-Z0-9_\\#\\.-]+\\\")\\s+(\\],?)$/mg, \"$1$2$3\");\n str = str.replace(/(\\[)\\s+(\\\"[a-zA-Z0-9_\\#\\.-]+\\\",\\s+(\\[|{),?)$/mg, \"$1$2\");\n str = str.replace(/(\\[)\\s+(\\\"[a-zA-Z0-9_\\#\\.-]+\\\",)\\s+(\\[\\s*\\\".+\\\"\\s*\\])\\s+(\\],?)$/mg, \"$1$2 $3$4\");\n str = str.replace(/(\\[\\\"[a-zA-Z0-9_\\#\\.-]+\\\",\\s+)({\\s+(.*)\\s+})(,?)$/mg,\n (a, b, c, d, e) => b + attrsFormat(JSON.parse(c)) + e);\n str = str.replace(/(},\\s+)\\[\\s+(\\\".+\\\")\\s+\\](,?)$/mg, \"$1$2$3\");\n }\n return str;\n}\n","import { html2hsmlStr, html2hsml, hsml2str } from \"../src/hsml-convert\";\n\nconst html = `<div>\n Hello\n <p>\n <em> </em>\n text\n <b>\n text\n </b>\n </p>\n <hr/>\n <span\n id=\"id1\"\n class=\"c1 c2\"\n data-x=\"dx\"\n data-y=\"dy\">\n </span>,\n <button\n name=\"myButton\">\n Click me\n </button>\n !\n</div>`;\n\nconst formEl = document.getElementById(\"form\")! as HTMLFormElement;\nconst htmlEl = document.getElementById(\"html\")! as HTMLTextAreaElement;\nconst hsmlEl = document.getElementById(\"hsml\")! as HTMLTextAreaElement;\n\nhtmlEl.value = html;\nhsmlEl.value = html2hsmlStr(html);\n\nhtmlEl.addEventListener(\"keyup\", () => {\n const htmlIn = htmlEl.value;\n hsmlEl.value = html2hsmlStr(htmlIn);\n});\n\nformEl.addEventListener(\"submit\", e => {\n e.preventDefault();\n const htmlIn = htmlEl.value;\n hsmlEl.value = html2hsmlStr(htmlIn);\n});\n\nhtmlEl.focus();\n\nconst hsml = html2hsml(html);\n// console.log(JSON.stringify(hsml, undefined, 4));\nconsole.log(hsml2str(hsml, true));\n"],"names":["$28b907453eb679df$var$dataRegex","$28b907453eb679df$export$cf8f1c3408f22f1e","node","depth","out","nodeType","Node","TEXT_NODE","t","_a","textContent","trim","$28b907453eb679df$var$indent","JSON","stringify","ELEMENT_NODE","element","attributes","Array","from","reduce","a","v","i","nodeName","nodeValue","attrKeys","Object","keys","id","classes","attrs","attrData","length","forEach","key","value","toLowerCase","clss","split","concat","test","g","exec","name","tagName","join","$28b907453eb679df$var$attrsFormat","hasChildNodes","child","firstChild","nextSibling","replace","count","indent","o","isArray","map","k","$28b907453eb679df$export$4a5aa4e54c25d84c","html","DOMParser","parseFromString","getElementsByTagName","$28b907453eb679df$var$HsmlHandler","root","this","_root","text","textTrimmed","_pointer","push","open","_dataRegex","hsmlNode","_nodePath","close","tag","currentNode","pop","constructor","$28b907453eb679df$var$domTraverse","handler","$28b907453eb679df$export$3f5c7fedc8b1f572","h","$9a322ec42f854dc4$var$html","$9a322ec42f854dc4$var$formEl","document","getElementById","$9a322ec42f854dc4$var$htmlEl","$9a322ec42f854dc4$var$hsmlEl","addEventListener","htmlIn","e","preventDefault","focus","$9a322ec42f854dc4$var$hsml","console","log","hsml","condense","str","undefined","b","c","d","parse"],"version":3,"file":"hsml-convert_demo.0ea1fa3b.js.map"}
@@ -1 +1 @@
1
- {"mappings":"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","sources":["src/hsml-convert.ts","demo/hsml-convert_demo.ts"],"sourcesContent":["import { HElement, HElements } from \"./hsml\";\n\nconst dataRegex = /data-(.+)/;\n\nexport function dom2hsmlStr(node: Node, depth = 0): string {\n let out = \"\";\n if (node.nodeType === Node.TEXT_NODE) {\n const t = node?.textContent?.trim();\n out += `${indent(depth)}${JSON.stringify(t)}`;\n return out;\n }\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as HTMLElement;\n const attributes = Array.from(element.attributes)\n .reduce((a, v, i) => (a[v.nodeName] = v.nodeValue, a), {} as any);\n const attrKeys = Object.keys(attributes);\n let id;\n let classes = [] as string[];\n const attrs = {} as {[key: string]: any};\n const attrData = {} as {[key: string]: any};\n if (attrKeys.length) {\n attrKeys.forEach(key => {\n const value = attributes[key] as string;\n if (key.toLowerCase() === \"id\") {\n id = value;\n } else if (key.toLowerCase() === \"class\") {\n const clss = value.split(\" \");\n classes = classes.concat(clss);\n } else if (dataRegex.test(key.toLowerCase())) {\n const g = dataRegex.exec(key);\n attrData[g![1].toLowerCase()] = value;\n } else {\n attrs[key.toLowerCase()] = value;\n }\n });\n }\n let name = element.tagName.toLowerCase();\n if (id) {\n name += \"#\" + id;\n }\n if (classes.length) {\n name += \".\" + classes.join(\".\");\n }\n if (Object.keys(attrData).length) {\n attrs[\"data\"] = attrData;\n }\n out += `${indent(depth)}[\"${name.toLowerCase()}\"`;\n if (Object.keys(attrs).length) {\n out += `,\\n${indent(depth + 1)}${attrsFormat(attrs)}`;\n }\n if (element.hasChildNodes()) {\n out += `,\\n${indent(depth + 1)}[`;\n }\n }\n let i = 0;\n if (node.hasChildNodes()) {\n let child = node.firstChild;\n while (child) {\n out += `${i ? \",\" : \"\"}\\n${dom2hsmlStr(child, depth + 2)}`;\n child = child.nextSibling;\n i++;\n }\n }\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as HTMLElement;\n if (element.hasChildNodes()) {\n out += `\\n${indent(depth + 1)}]`;\n }\n out += `\\n${indent(depth)}]`;\n }\n if (!depth) {\n // condense\n out = out.replace(/\\[\\s+\\\"\\\"\\s+\\]$/mg, \"[]\");\n out = out.replace(/\\[\\s+\\\"\\\",?$/mg, \"[\");\n out = out.replace(/,\\s+\\\"\\\"(,?)$/mg, \"$1\");\n out = out.replace(/,\\s+\\[\\](\\s+],?)$/mg, \"$1\");\n out = out.replace(/(},\\s+)\\[\\s+(\\\".+\\\")\\s+\\](,?)$/mg, \"$1$2$3\");\n out = out.replace(/(\\[\\\"[a-zA-Z0-9_\\#\\.-]+\\\",)\\s+\\[\\s+(\\\".+\\\")\\s+\\]\\s+(\\],?)$/mg, \"$1 $2$3\");\n out = out.replace(/(\\[\\\"[a-zA-Z0-9_\\#\\.-]+\\\")\\s+(\\],?)$/mg, \"$1$2\");\n }\n return out;\n}\n\nfunction indent(count: number): string {\n let indent = \"\";\n for (let i = 0; i < count; i++) {\n indent += \" \";\n }\n return indent;\n}\n\nfunction attrsFormat(o: any): string {\n if (typeof o !== \"object\" || Array.isArray(o)) {\n return JSON.stringify(o);\n }\n let props = Object\n .keys(o)\n .map(k => `${k}: ${attrsFormat(o[k])}`)\n .join(\", \");\n return `{ ${props} }`;\n}\n\nexport function html2hsmlStr(html: string): string {\n const node = new DOMParser()\n .parseFromString(html, \"text/html\")\n .getElementsByTagName(\"body\")[0]\n .firstChild;\n return node ? dom2hsmlStr(node) : \"\";\n}\n\ninterface Handler {\n text(text: string): void;\n open(node: { name: string; attributes: any }): void;\n close(tag: string): void;\n}\n\nclass HsmlHandler implements Handler {\n\n private _root = [[]] as HElements[];\n private _nodePath = [] as any; // path that consist of previous hsml nodes\n private _pointer = this._root;\n private _dataRegex = /data-(.+)/;\n\n root(): HElement {\n return this._root[0][0];\n }\n\n text(text: string): void {\n // console.log(\"text:\\t\", JSON.stringify(text));\n // console.log(hsml, hsmlNode, hsmlPath);\n const textTrimmed = text.trim().replace(/\\s+/mg, \" \");\n // console.log(\"text:\\t\", JSON.stringify(textTrimmed));\n if (textTrimmed) {\n this._pointer[this._pointer.length - 1].push(textTrimmed);\n }\n }\n\n open(node: { name: string; attributes: any }): void {\n // console.log(\"open:\\t\", JSON.stringify(node));\n const attrKeys = Object.keys(node.attributes);\n let id;\n let classes = [] as string[];\n const attrs = {} as {[key: string]: any};\n const attrData = {} as {[key: string]: any};\n if (attrKeys.length) {\n attrKeys.forEach(key => {\n const value = node.attributes[key] as string;\n if (key === \"id\") {\n id = value;\n } else if (key === \"class\") {\n const clss = value.split(\" \");\n classes = classes.concat(clss);\n } else if (this._dataRegex.test(key)) {\n const g = this._dataRegex.exec(key);\n attrData[g![1]] = value;\n } else {\n attrs[key] = value;\n }\n });\n }\n let name = node.name;\n if (id) {\n name += \"#\" + id;\n }\n if (classes.length) {\n name += \".\" + classes.join(\".\");\n }\n if (Object.keys(attrData).length) {\n attrs[\"data\"] = attrData;\n }\n const hsmlNode = [name] as any[];\n if (Object.keys(attrs).length) {\n hsmlNode.push(attrs);\n }\n const children: any[] = [];\n hsmlNode.push(children);\n\n this._pointer[this._pointer.length - 1].push(hsmlNode as HElement);\n this._nodePath.push(hsmlNode);\n this._pointer = hsmlNode;\n // console.log(\">>>\", hsmlPath.map(x => x[0]));\n }\n\n close(tag: string): void {\n // console.log(\"close:\\t\", JSON.stringify(tag));\n const currentNode = this._nodePath.pop();\n\n let children = currentNode[currentNode.length - 1];\n if (children.length === 0) {\n currentNode.pop(); // remove children\n // } else if (children.length === 1) {\n // if (typeof children[0] === \"string\") {\n // currentNode[currentNode.length - 1] = children[0];\n // }\n }\n this._pointer = this._nodePath[this._nodePath.length - 1];\n // console.log(\">>>\", hsmlPath.map(x => x[0]));\n }\n}\n\nfunction domTraverse(node: Node, handler: Handler ): void {\n if (node.nodeType === Node.TEXT_NODE) {\n const t = node?.textContent?.trim();\n t && handler.text(t);\n }\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as HTMLElement;\n const attributes = Array.from(element.attributes)\n .reduce((a, v, i) => (a[v.nodeName] = v.nodeValue, a), {} as any);\n handler.open({ name: element.tagName.toLowerCase(), attributes });\n }\n if (node.hasChildNodes()) {\n let child = node.firstChild;\n while (child) {\n domTraverse(child, handler);\n child = child.nextSibling;\n }\n }\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as HTMLElement;\n handler.close(element.tagName);\n }\n}\n\nexport function dom2hsml(node: Node): HElement {\n const h = new HsmlHandler();\n node && domTraverse(node, h);\n return h.root();\n}\n\nexport function html2hsml(html: string): HElement {\n const node = new DOMParser()\n .parseFromString(html, \"text/html\")\n .getElementsByTagName(\"body\")[0]\n .firstChild;\n return node && dom2hsml(node);\n}\n\nexport function hsml2str(hsml: HElement, condense = true): HElement {\n let str = JSON.stringify(hsml, undefined, 4);\n if (condense) {\n str = str.replace(/(\\[)\\s+(\\\"[a-zA-Z0-9_\\#\\.-]+\\\")\\s+(\\],?)$/mg, \"$1$2$3\");\n str = str.replace(/(\\[)\\s+(\\\"[a-zA-Z0-9_\\#\\.-]+\\\",\\s+(\\[|{),?)$/mg, \"$1$2\");\n str = str.replace(/(\\[)\\s+(\\\"[a-zA-Z0-9_\\#\\.-]+\\\",)\\s+(\\[\\s*\\\".+\\\"\\s*\\])\\s+(\\],?)$/mg, \"$1$2 $3$4\");\n str = str.replace(/(\\[\\\"[a-zA-Z0-9_\\#\\.-]+\\\",\\s+)({\\s+(.*)\\s+})(,?)$/mg,\n (a, b, c, d, e) => b + attrsFormat(JSON.parse(c)) + e);\n str = str.replace(/(},\\s+)\\[\\s+(\\\".+\\\")\\s+\\](,?)$/mg, \"$1$2$3\");\n }\n return str;\n}\n","import { html2hsmlStr, html2hsml, hsml2str } from \"../src/hsml-convert\";\n\nconst html = `<div>\n Hello\n <p>\n <em> </em>\n text\n <b>\n text\n </b>\n </p>\n <hr/>\n <span\n id=\"id1\"\n class=\"c1 c2\"\n data-x=\"dx\"\n data-y=\"dy\">\n </span>,\n <button\n name=\"myButton\">\n Click me\n </button>\n !\n</div>`;\n\nconst formEl = document.getElementById(\"form\")! as HTMLFormElement;\nconst htmlEl = document.getElementById(\"html\")! as HTMLTextAreaElement;\nconst hsmlEl = document.getElementById(\"hsml\")! as HTMLTextAreaElement;\n\nhtmlEl.value = html;\nhsmlEl.value = html2hsmlStr(html);\n\nhtmlEl.addEventListener(\"keyup\", () => {\n const htmlIn = htmlEl.value;\n hsmlEl.value = html2hsmlStr(htmlIn);\n});\n\nformEl.addEventListener(\"submit\", e => {\n e.preventDefault();\n const htmlIn = htmlEl.value;\n hsmlEl.value = html2hsmlStr(htmlIn);\n});\n\nhtmlEl.focus();\n\nconst hsml = html2hsml(html);\n// console.log(JSON.stringify(hsml, undefined, 4));\nconsole.log(hsml2str(hsml, true));\n"],"names":["$e1bf11d40596489e$var$dataRegex","$e1bf11d40596489e$export$cf8f1c3408f22f1e","node","depth","out","nodeType","Node","TEXT_NODE","t","_a","textContent","trim","$e1bf11d40596489e$var$indent","JSON","stringify","ELEMENT_NODE","element","attributes","Array","from","reduce","a","v","i","nodeName","nodeValue","attrKeys","Object","keys","id","classes","attrs","attrData","length","forEach","key","value","toLowerCase","clss","split","concat","test","g","exec","name","tagName","join","$e1bf11d40596489e$var$attrsFormat","hasChildNodes","child","firstChild","nextSibling","replace","count","indent","o","isArray","map","k","$e1bf11d40596489e$export$4a5aa4e54c25d84c","html","DOMParser","parseFromString","getElementsByTagName","$e1bf11d40596489e$var$HsmlHandler","root","this","_root","text","textTrimmed","_pointer","push","open","_dataRegex","hsmlNode","_nodePath","close","tag","currentNode","pop","constructor","$e1bf11d40596489e$var$domTraverse","handler","$e1bf11d40596489e$export$3f5c7fedc8b1f572","h","$d7e92b7ea72ac4a5$var$html","$d7e92b7ea72ac4a5$var$formEl","document","getElementById","$d7e92b7ea72ac4a5$var$htmlEl","$d7e92b7ea72ac4a5$var$hsmlEl","addEventListener","htmlIn","e","preventDefault","focus","$d7e92b7ea72ac4a5$var$hsml","console","log","hsml","condense","str","undefined","b","c","d","parse"],"version":3,"file":"hsml-convert_demo.63e3e7b5.js.map"}
1
+ {"mappings":"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","sources":["src/hsml-convert.ts","demo/hsml-convert_demo.ts"],"sourcesContent":["import { HElement, HElements } from \"./hsml\";\n\nconst dataRegex = /data-(.+)/;\n\nexport function dom2hsmlStr(node: Node, depth = 0): string {\n let out = \"\";\n if (node.nodeType === Node.TEXT_NODE) {\n const t = node?.textContent?.trim();\n out += `${indent(depth)}${JSON.stringify(t)}`;\n return out;\n }\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as HTMLElement;\n const attributes = Array.from(element.attributes)\n .reduce((a, v, i) => (a[v.nodeName] = v.nodeValue, a), {} as any);\n const attrKeys = Object.keys(attributes);\n let id;\n let classes = [] as string[];\n const attrs = {} as {[key: string]: any};\n const attrData = {} as {[key: string]: any};\n if (attrKeys.length) {\n attrKeys.forEach(key => {\n const value = attributes[key] as string;\n if (key.toLowerCase() === \"id\") {\n id = value;\n } else if (key.toLowerCase() === \"class\") {\n const clss = value.split(\" \");\n classes = classes.concat(clss);\n } else if (dataRegex.test(key.toLowerCase())) {\n const g = dataRegex.exec(key);\n attrData[g![1].toLowerCase()] = value;\n } else {\n attrs[key.toLowerCase()] = value;\n }\n });\n }\n let name = element.tagName.toLowerCase();\n if (id) {\n name += \"#\" + id;\n }\n if (classes.length) {\n name += \".\" + classes.join(\".\");\n }\n if (Object.keys(attrData).length) {\n attrs[\"data\"] = attrData;\n }\n out += `${indent(depth)}[\"${name.toLowerCase()}\"`;\n if (Object.keys(attrs).length) {\n out += `,\\n${indent(depth + 1)}${attrsFormat(attrs)}`;\n }\n if (element.hasChildNodes()) {\n out += `,\\n${indent(depth + 1)}[`;\n }\n }\n let i = 0;\n if (node.hasChildNodes()) {\n let child = node.firstChild;\n while (child) {\n out += `${i ? \",\" : \"\"}\\n${dom2hsmlStr(child, depth + 2)}`;\n child = child.nextSibling;\n i++;\n }\n }\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as HTMLElement;\n if (element.hasChildNodes()) {\n out += `\\n${indent(depth + 1)}]`;\n }\n out += `\\n${indent(depth)}]`;\n }\n if (!depth) {\n // condense\n out = out.replace(/\\[\\s+\\\"\\\"\\s+\\]$/mg, \"[]\");\n out = out.replace(/\\[\\s+\\\"\\\",?$/mg, \"[\");\n out = out.replace(/,\\s+\\\"\\\"(,?)$/mg, \"$1\");\n out = out.replace(/,\\s+\\[\\](\\s+],?)$/mg, \"$1\");\n out = out.replace(/(},\\s+)\\[\\s+(\\\".+\\\")\\s+\\](,?)$/mg, \"$1$2$3\");\n out = out.replace(/(\\[\\\"[a-zA-Z0-9_\\#\\.-]+\\\",)\\s+\\[\\s+(\\\".+\\\")\\s+\\]\\s+(\\],?)$/mg, \"$1 $2$3\");\n out = out.replace(/(\\[\\\"[a-zA-Z0-9_\\#\\.-]+\\\")\\s+(\\],?)$/mg, \"$1$2\");\n }\n return out;\n}\n\nfunction indent(count: number): string {\n let indent = \"\";\n for (let i = 0; i < count; i++) {\n indent += \" \";\n }\n return indent;\n}\n\nfunction attrsFormat(o: any): string {\n if (typeof o !== \"object\" || Array.isArray(o)) {\n return JSON.stringify(o);\n }\n let props = Object\n .keys(o)\n .map(k => `${k}: ${attrsFormat(o[k])}`)\n .join(\", \");\n return `{ ${props} }`;\n}\n\nexport function html2hsmlStr(html: string): string {\n const node = new DOMParser()\n .parseFromString(html, \"text/html\")\n .getElementsByTagName(\"body\")[0]\n .firstChild;\n return node ? dom2hsmlStr(node) : \"\";\n}\n\ninterface Handler {\n text(text: string): void;\n open(node: { name: string; attributes: any }): void;\n close(tag: string): void;\n}\n\nclass HsmlHandler<HActionType extends string> implements Handler {\n\n private _root = [[]] as HElements<HActionType>[];\n private _nodePath = [] as any; // path that consist of previous hsml nodes\n private _pointer = this._root;\n private _dataRegex = /data-(.+)/;\n\n root(): HElement<HActionType> {\n return this._root[0][0];\n }\n\n text(text: string): void {\n // console.log(\"text:\\t\", JSON.stringify(text));\n // console.log(hsml, hsmlNode, hsmlPath);\n const textTrimmed = text.trim().replace(/\\s+/mg, \" \");\n // console.log(\"text:\\t\", JSON.stringify(textTrimmed));\n if (textTrimmed) {\n this._pointer[this._pointer.length - 1].push(textTrimmed);\n }\n }\n\n open(node: { name: string; attributes: any }): void {\n // console.log(\"open:\\t\", JSON.stringify(node));\n const attrKeys = Object.keys(node.attributes);\n let id;\n let classes = [] as string[];\n const attrs = {} as {[key: string]: any};\n const attrData = {} as {[key: string]: any};\n if (attrKeys.length) {\n attrKeys.forEach(key => {\n const value = node.attributes[key] as string;\n if (key === \"id\") {\n id = value;\n } else if (key === \"class\") {\n const clss = value.split(\" \");\n classes = classes.concat(clss);\n } else if (this._dataRegex.test(key)) {\n const g = this._dataRegex.exec(key);\n attrData[g![1]] = value;\n } else {\n attrs[key] = value;\n }\n });\n }\n let name = node.name;\n if (id) {\n name += \"#\" + id;\n }\n if (classes.length) {\n name += \".\" + classes.join(\".\");\n }\n if (Object.keys(attrData).length) {\n attrs[\"data\"] = attrData;\n }\n const hsmlNode = [name] as any[];\n if (Object.keys(attrs).length) {\n hsmlNode.push(attrs);\n }\n const children: any[] = [];\n hsmlNode.push(children);\n\n this._pointer[this._pointer.length - 1].push(hsmlNode as HElement<HActionType>);\n this._nodePath.push(hsmlNode);\n this._pointer = hsmlNode;\n // console.log(\">>>\", hsmlPath.map(x => x[0]));\n }\n\n close(tag: string): void {\n // console.log(\"close:\\t\", JSON.stringify(tag));\n const currentNode = this._nodePath.pop();\n\n let children = currentNode[currentNode.length - 1];\n if (children.length === 0) {\n currentNode.pop(); // remove children\n // } else if (children.length === 1) {\n // if (typeof children[0] === \"string\") {\n // currentNode[currentNode.length - 1] = children[0];\n // }\n }\n this._pointer = this._nodePath[this._nodePath.length - 1];\n // console.log(\">>>\", hsmlPath.map(x => x[0]));\n }\n}\n\nfunction domTraverse(node: Node, handler: Handler ): void {\n if (node.nodeType === Node.TEXT_NODE) {\n const t = node?.textContent?.trim();\n t && handler.text(t);\n }\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as HTMLElement;\n const attributes = Array.from(element.attributes)\n .reduce((a, v, i) => (a[v.nodeName] = v.nodeValue, a), {} as any);\n handler.open({ name: element.tagName.toLowerCase(), attributes });\n }\n if (node.hasChildNodes()) {\n let child = node.firstChild;\n while (child) {\n domTraverse(child, handler);\n child = child.nextSibling;\n }\n }\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as HTMLElement;\n handler.close(element.tagName);\n }\n}\n\nexport function dom2hsml<HActionType extends string>(node: Node): HElement<HActionType> {\n const h = new HsmlHandler<HActionType>();\n node && domTraverse(node, h);\n return h.root();\n}\n\nexport function html2hsml<HActionType extends string>(html: string): HElement<HActionType> {\n const node = new DOMParser()\n .parseFromString(html, \"text/html\")\n .getElementsByTagName(\"body\")[0]\n .firstChild;\n return node && dom2hsml(node);\n}\n\nexport function hsml2str<HActionType extends string>(hsml: HElement<HActionType>, condense = true): HElement<HActionType> {\n let str = JSON.stringify(hsml, undefined, 4);\n if (condense) {\n str = str.replace(/(\\[)\\s+(\\\"[a-zA-Z0-9_\\#\\.-]+\\\")\\s+(\\],?)$/mg, \"$1$2$3\");\n str = str.replace(/(\\[)\\s+(\\\"[a-zA-Z0-9_\\#\\.-]+\\\",\\s+(\\[|{),?)$/mg, \"$1$2\");\n str = str.replace(/(\\[)\\s+(\\\"[a-zA-Z0-9_\\#\\.-]+\\\",)\\s+(\\[\\s*\\\".+\\\"\\s*\\])\\s+(\\],?)$/mg, \"$1$2 $3$4\");\n str = str.replace(/(\\[\\\"[a-zA-Z0-9_\\#\\.-]+\\\",\\s+)({\\s+(.*)\\s+})(,?)$/mg,\n (a, b, c, d, e) => b + attrsFormat(JSON.parse(c)) + e);\n str = str.replace(/(},\\s+)\\[\\s+(\\\".+\\\")\\s+\\](,?)$/mg, \"$1$2$3\");\n }\n return str;\n}\n","import { html2hsmlStr, html2hsml, hsml2str } from \"../src/hsml-convert\";\n\nconst html = `<div>\n Hello\n <p>\n <em> </em>\n text\n <b>\n text\n </b>\n </p>\n <hr/>\n <span\n id=\"id1\"\n class=\"c1 c2\"\n data-x=\"dx\"\n data-y=\"dy\">\n </span>,\n <button\n name=\"myButton\">\n Click me\n </button>\n !\n</div>`;\n\nconst formEl = document.getElementById(\"form\")! as HTMLFormElement;\nconst htmlEl = document.getElementById(\"html\")! as HTMLTextAreaElement;\nconst hsmlEl = document.getElementById(\"hsml\")! as HTMLTextAreaElement;\n\nhtmlEl.value = html;\nhsmlEl.value = html2hsmlStr(html);\n\nhtmlEl.addEventListener(\"keyup\", () => {\n const htmlIn = htmlEl.value;\n hsmlEl.value = html2hsmlStr(htmlIn);\n});\n\nformEl.addEventListener(\"submit\", e => {\n e.preventDefault();\n const htmlIn = htmlEl.value;\n hsmlEl.value = html2hsmlStr(htmlIn);\n});\n\nhtmlEl.focus();\n\nconst hsml = html2hsml(html);\n// console.log(JSON.stringify(hsml, undefined, 4));\nconsole.log(hsml2str(hsml, true));\n"],"names":["$e1bf11d40596489e$var$dataRegex","$e1bf11d40596489e$export$cf8f1c3408f22f1e","node","depth","out","nodeType","Node","TEXT_NODE","t","_a","textContent","trim","$e1bf11d40596489e$var$indent","JSON","stringify","ELEMENT_NODE","element","attributes","Array","from","reduce","a","v","i","nodeName","nodeValue","attrKeys","Object","keys","id","classes","attrs","attrData","length","forEach","key","value","toLowerCase","clss","split","concat","test","g","exec","name","tagName","join","$e1bf11d40596489e$var$attrsFormat","hasChildNodes","child","firstChild","nextSibling","replace","count","indent","o","isArray","map","k","$e1bf11d40596489e$export$4a5aa4e54c25d84c","html","DOMParser","parseFromString","getElementsByTagName","$e1bf11d40596489e$var$HsmlHandler","root","this","_root","text","textTrimmed","_pointer","push","open","_dataRegex","hsmlNode","_nodePath","close","tag","currentNode","pop","constructor","$e1bf11d40596489e$var$domTraverse","handler","$e1bf11d40596489e$export$3f5c7fedc8b1f572","h","$d7e92b7ea72ac4a5$var$html","$d7e92b7ea72ac4a5$var$formEl","document","getElementById","$d7e92b7ea72ac4a5$var$htmlEl","$d7e92b7ea72ac4a5$var$hsmlEl","addEventListener","htmlIn","e","preventDefault","focus","$d7e92b7ea72ac4a5$var$hsml","console","log","hsml","condense","str","undefined","b","c","d","parse"],"version":3,"file":"hsml-convert_demo.63e3e7b5.js.map"}
@@ -1,2 +1,2 @@
1
- var e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{},n={},t={},o=e.parcelRequirede31;null==o&&((o=function(e){if(e in n)return n[e].exports;if(e in t){var o=t[e];delete t[e];var c={id:e,exports:{}};return n[e]=c,o.call(c.exports,c,c.exports),c.exports}var d=new Error("Cannot find module '"+e+"'");throw d.code="MODULE_NOT_FOUND",d}).register=function(e,n){t[e]=n},e.parcelRequirede31=o);var c=o("hrCkK");function d(e,n,t,o){d.scheduled||(d.scheduled=null),t&&(d.scheduled||(d.scheduled=setTimeout((()=>{const u=n(t,o);(0,c.hsmls2idomPatch)(e,u),d.scheduled=null}),0)))}const u=(e,n)=>{const t=s(e,n,l,u);d(a,r,t,u)},l={title:"Counter",count:0},r=(e,n)=>[["h2",[e.title]],["p",[["em",["Count"]],": ",e.count.toString()," ",i("-",(()=>n("dec",1))),i("+",(()=>n("inc",2)))," ",i("xxx",(()=>n("xxx")))]]];function i(e,n){return["button",{click:n},[e]]}const s=(e,n,t,o)=>{switch(e){case"inc":t.count+=n;break;case"dec":t.count-=n,setTimeout(o,1e3,"dec_async",1);break;case"dec_async":t.count-=n;break;default:console.warn("unhandled event",e,n)}return t},a=document.getElementById("app");d(a,r,l,u),u("event",{});
2
- //# sourceMappingURL=hsml_demo.ff950ba1.js.map
1
+ var e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{},n={},t={},o=e.parcelRequirede31;null==o&&((o=function(e){if(e in n)return n[e].exports;if(e in t){var o=t[e];delete t[e];var c={id:e,exports:{}};return n[e]=c,o.call(c.exports,c,c.exports),c.exports}var d=new Error("Cannot find module '"+e+"'");throw d.code="MODULE_NOT_FOUND",d}).register=function(e,n){t[e]=n},e.parcelRequirede31=o);var c=o("hrCkK");function d(e,n,t,o){d.scheduled||(d.scheduled=null),t&&(d.scheduled||(d.scheduled=setTimeout((()=>{const l=n(t,o);(0,c.hsmls2idomPatch)(e,l),d.scheduled=null}),0)))}const l=(e,n)=>{const t=s(e,n,u,l);d(a,r,t,l)},u={title:"Counter",count:0},r=(e,n)=>[["h2",[e.title]],["p",[["em",["Count"]],": ",e.count.toString()," ",i("-",(()=>n("dec",1))),i("+",(()=>n("inc",2)))," ",i("xxx",(()=>n("xxx")))]]];function i(e,n){return["button",{click:n},[e]]}const s=(e,n,t,o)=>{switch(console.log("action:",e,n),e){case"inc":t.count+=n;break;case"dec":t.count-=n,setTimeout(o,1e3,"dec_async",1);break;case"dec_async":t.count-=n;break;default:console.warn("unhandled action:",e,n)}return t},a=document.getElementById("app");d(a,r,u,l),l("action",{});
2
+ //# sourceMappingURL=hsml_demo.a248689a.js.map
@@ -0,0 +1 @@
1
+ {"mappings":"oeAAA,IAAAA,EAAAC,EAAA,SASA,SAASC,EAAsCC,EACxBC,EACAC,EACAC,GAClBJ,EAAeK,YAAeL,EAAeK,UAAY,MACrDF,IAGCH,EAAeK,YAChBL,EAAeK,UAAYC,YAAW,KACnC,MAAMC,EAAOL,EAAKC,EAAOC,IAEzB,EAAAN,EAAAU,iBAAyBP,EAASM,GACjCP,EAAeK,UAAY,IAAI,GACjC,IAEX,CAEA,MAAMI,EAA8B,CAACC,EAAQC,KAEzC,MAAMR,EAAQS,EAAWF,EAAQC,EAAME,EAAUJ,GAEjDT,EAAOc,EAAaC,EAAMZ,EAAOM,EAAA,EAG/BI,EAAW,CACbG,MAAO,UACPC,MAAO,GAYLF,EAA6B,CAACZ,EAAOC,IAChC,CACH,CAAC,KAAM,CAACD,EAAMa,QACd,CAAC,IAAK,CACF,CAAC,KAAM,CAAC,UAAW,KAAMb,EAAMc,MAAMC,WACrC,IACAC,EAAO,KAAK,IAAOf,EAAS,MAAO,KACnCe,EAAO,KAAK,IAAMf,EAAS,MAAO,KAClC,IACAe,EAAO,OAAO,IAAMf,EAAS,YAKzC,SAASe,EAAOC,EAAeC,GAC3B,MAAO,CAAC,SAAU,CAAEC,MAAOD,GAAM,CAACD,GACtC,CAEA,MAAMR,EAAyC,CAACF,EAAQC,EAAMR,EAAOC,KAEjE,OADAmB,QAAQC,IAAI,UAAWd,EAAQC,GACvBD,GACJ,IAAK,MACDP,EAAMc,OAASN,EACf,MACJ,IAAK,MACDR,EAAMc,OAASN,EACfL,WAAWF,EAAU,IAAK,YAAa,GACvC,MACJ,IAAK,YACDD,EAAMc,OAASN,EACf,MACJ,QACIY,QAAQE,KAAK,oBAAqBf,EAAQC,GAElD,OAAOR,CAAA,EAGLW,EAAaY,SAASC,eAAe,OAE3C3B,EAAOc,EAAaC,EAAMF,EAAUJ,GAEpCA,EAAS,SAAU","sources":["demo/hsml_demo.ts"],"sourcesContent":["import { hsmls2idomPatch } from \"../src/hsml-idom\";\nimport { HElements, HElement } from \"../src/hsml\";\n\ntype View<State, Actions extends string> = (state: State, dispatch: Dispatch<Actions>) => HElements<Actions>;\n\ntype Dispatch<Actions extends string> = (action: Actions, data?: any) => void;\n\ntype Dispatcher<State, Actions extends string> = (action: Actions, data: any, state: State, dispatch: Dispatch<Actions>) => State;\n\nfunction render<State, Actions extends string>(element: HTMLElement,\n view: View<State, Actions>,\n state: State,\n dispatch: Dispatch<Actions>): void {\n (render as any).scheduled || ((render as any).scheduled = null);\n if (!state) {\n return;\n }\n if (!(render as any).scheduled) {\n (render as any).scheduled = setTimeout(() => {\n const hsml = view(state, dispatch);\n // console.log(\"render\", hsml);\n hsmls2idomPatch<Actions>(element, hsml);\n (render as any).scheduled = null;\n }, 0);\n }\n}\n\nconst dispatch: Dispatch<Actions> = (action, data): void => {\n // console.log(\"dispatch\", action, data);\n const state = dispatcher(action, data, appState, dispatch);\n // console.log(\"state\", state);\n render(appElement!, view, state, dispatch);\n};\n\nconst appState = {\n title: \"Counter\",\n count: 0\n};\n\ntype State = typeof appState;\n\ntype Actions =\n | \"inc\"\n | \"dec\"\n | \"dec_async\"\n | \"action\"\n | \"xxx\";\n\nconst view: View<State, Actions> = (state, dispatch): HElements<Actions> => {\n return [\n [\"h2\", [state.title]],\n [\"p\", [\n [\"em\", [\"Count\"]], \": \", state.count.toString(),\n \" \",\n button(\"-\", () => dispatch(\"dec\", 1)),\n button(\"+\", () => dispatch(\"inc\", 2)),\n \" \",\n button(\"xxx\", () => dispatch(\"xxx\"))\n ]],\n ];\n}\n\nfunction button(label: string, cb: (e: Event) => void): HElement<Actions> {\n return [\"button\", { click: cb }, [label]];\n}\n\nconst dispatcher: Dispatcher<State, Actions> = (action, data, state, dispatch) => {\n console.log(\"action:\", action, data);\n switch (action) {\n case \"inc\":\n state.count += data;\n break;\n case \"dec\":\n state.count -= data;\n setTimeout(dispatch, 1e3, \"dec_async\", 1);\n break;\n case \"dec_async\":\n state.count -= data;\n break;\n default:\n console.warn(\"unhandled action:\", action, data);\n }\n return state;\n}\n\nconst appElement = document.getElementById(\"app\");\n\nrender(appElement!, view, appState, dispatch);\n\ndispatch(\"action\", {});\n"],"names":["$hrCkK","parcelRequire","$b59fb94a7d064643$var$render","element","view","state","dispatch","scheduled","setTimeout","hsml","hsmls2idomPatch","$b59fb94a7d064643$var$dispatch","action","data","$b59fb94a7d064643$var$dispatcher","$b59fb94a7d064643$var$appState","$b59fb94a7d064643$var$appElement","$b59fb94a7d064643$var$view","title","count","toString","$b59fb94a7d064643$var$button","label","cb","click","console","log","warn","document","getElementById"],"version":3,"file":"hsml_demo.a248689a.js.map"}
@@ -0,0 +1,2 @@
1
+ !function(){var e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{},n={},t={},o=e.parcelRequirede31;null==o&&((o=function(e){if(e in n)return n[e].exports;if(e in t){var o=t[e];delete t[e];var c={id:e,exports:{}};return n[e]=c,o.call(c.exports,c,c.exports),c.exports}var d=new Error("Cannot find module '"+e+"'");throw d.code="MODULE_NOT_FOUND",d}).register=function(e,n){t[e]=n},e.parcelRequirede31=o);var c=o("8IJ2T");function d(e,n,t,o){d.scheduled||(d.scheduled=null),t&&(d.scheduled||(d.scheduled=setTimeout((()=>{const l=n(t,o);(0,c.hsmls2idomPatch)(e,l),d.scheduled=null}),0)))}const l=(e,n)=>{const t=s(e,n,u,l);d(a,i,t,l)},u={title:"Counter",count:0},i=(e,n)=>[["h2",[e.title]],["p",[["em",["Count"]],": ",e.count.toString()," ",r("-",(()=>n("dec",1))),r("+",(()=>n("inc",2)))," ",r("xxx",(()=>n("xxx")))]]];function r(e,n){return["button",{click:n},[e]]}const s=(e,n,t,o)=>{switch(console.log("action:",e,n),e){case"inc":t.count+=n;break;case"dec":t.count-=n,setTimeout(o,1e3,"dec_async",1);break;case"dec_async":t.count-=n;break;default:console.warn("unhandled action:",e,n)}return t},a=document.getElementById("app");d(a,i,u,l),l("action",{})}();
2
+ //# sourceMappingURL=hsml_demo.eb3b08be.js.map
@@ -0,0 +1 @@
1
+ {"mappings":"gfAAA,IAAAA,EAAAC,EAAA,SASA,SAASC,EAAsCC,EACxBC,EACAC,EACAC,GAClBJ,EAAeK,YAAeL,EAAeK,UAAY,MACrDF,IAGCH,EAAeK,YAChBL,EAAeK,UAAYC,YAAW,KACnC,MAAMC,EAAOL,EAAKC,EAAOC,IAEzB,EAAAN,EAAAU,iBAAyBP,EAASM,GACjCP,EAAeK,UAAY,IAAI,GACjC,IAEX,CAEA,MAAMI,EAA8B,CAACC,EAAQC,KAEzC,MAAMR,EAAQS,EAAWF,EAAQC,EAAME,EAAUJ,GAEjDT,EAAOc,EAAaC,EAAMZ,EAAOM,EAAA,EAG/BI,EAAW,CACbG,MAAO,UACPC,MAAO,GAYLF,EAA6B,CAACZ,EAAOC,IAChC,CACH,CAAC,KAAM,CAACD,EAAMa,QACd,CAAC,IAAK,CACF,CAAC,KAAM,CAAC,UAAW,KAAMb,EAAMc,MAAMC,WACrC,IACAC,EAAO,KAAK,IAAOf,EAAS,MAAO,KACnCe,EAAO,KAAK,IAAMf,EAAS,MAAO,KAClC,IACAe,EAAO,OAAO,IAAMf,EAAS,YAKzC,SAASe,EAAOC,EAAeC,GAC3B,MAAO,CAAC,SAAU,CAAEC,MAAOD,GAAM,CAACD,GACtC,CAEA,MAAMR,EAAyC,CAACF,EAAQC,EAAMR,EAAOC,KAEjE,OADAmB,QAAQC,IAAI,UAAWd,EAAQC,GACvBD,GACJ,IAAK,MACDP,EAAMc,OAASN,EACf,MACJ,IAAK,MACDR,EAAMc,OAASN,EACfL,WAAWF,EAAU,IAAK,YAAa,GACvC,MACJ,IAAK,YACDD,EAAMc,OAASN,EACf,MACJ,QACIY,QAAQE,KAAK,oBAAqBf,EAAQC,GAElD,OAAOR,CAAA,EAGLW,EAAaY,SAASC,eAAe,OAE3C3B,EAAOc,EAAaC,EAAMF,EAAUJ,GAEpCA,EAAS,SAAU,G","sources":["demo/hsml_demo.ts"],"sourcesContent":["import { hsmls2idomPatch } from \"../src/hsml-idom\";\nimport { HElements, HElement } from \"../src/hsml\";\n\ntype View<State, Actions extends string> = (state: State, dispatch: Dispatch<Actions>) => HElements<Actions>;\n\ntype Dispatch<Actions extends string> = (action: Actions, data?: any) => void;\n\ntype Dispatcher<State, Actions extends string> = (action: Actions, data: any, state: State, dispatch: Dispatch<Actions>) => State;\n\nfunction render<State, Actions extends string>(element: HTMLElement,\n view: View<State, Actions>,\n state: State,\n dispatch: Dispatch<Actions>): void {\n (render as any).scheduled || ((render as any).scheduled = null);\n if (!state) {\n return;\n }\n if (!(render as any).scheduled) {\n (render as any).scheduled = setTimeout(() => {\n const hsml = view(state, dispatch);\n // console.log(\"render\", hsml);\n hsmls2idomPatch<Actions>(element, hsml);\n (render as any).scheduled = null;\n }, 0);\n }\n}\n\nconst dispatch: Dispatch<Actions> = (action, data): void => {\n // console.log(\"dispatch\", action, data);\n const state = dispatcher(action, data, appState, dispatch);\n // console.log(\"state\", state);\n render(appElement!, view, state, dispatch);\n};\n\nconst appState = {\n title: \"Counter\",\n count: 0\n};\n\ntype State = typeof appState;\n\ntype Actions =\n | \"inc\"\n | \"dec\"\n | \"dec_async\"\n | \"action\"\n | \"xxx\";\n\nconst view: View<State, Actions> = (state, dispatch): HElements<Actions> => {\n return [\n [\"h2\", [state.title]],\n [\"p\", [\n [\"em\", [\"Count\"]], \": \", state.count.toString(),\n \" \",\n button(\"-\", () => dispatch(\"dec\", 1)),\n button(\"+\", () => dispatch(\"inc\", 2)),\n \" \",\n button(\"xxx\", () => dispatch(\"xxx\"))\n ]],\n ];\n}\n\nfunction button(label: string, cb: (e: Event) => void): HElement<Actions> {\n return [\"button\", { click: cb }, [label]];\n}\n\nconst dispatcher: Dispatcher<State, Actions> = (action, data, state, dispatch) => {\n console.log(\"action:\", action, data);\n switch (action) {\n case \"inc\":\n state.count += data;\n break;\n case \"dec\":\n state.count -= data;\n setTimeout(dispatch, 1e3, \"dec_async\", 1);\n break;\n case \"dec_async\":\n state.count -= data;\n break;\n default:\n console.warn(\"unhandled action:\", action, data);\n }\n return state;\n}\n\nconst appElement = document.getElementById(\"app\");\n\nrender(appElement!, view, appState, dispatch);\n\ndispatch(\"action\", {});\n"],"names":["$8IJ2T","parcelRequire","$97e4fd6c0f860426$var$render","element","view","state","dispatch","scheduled","setTimeout","hsml","hsmls2idomPatch","$97e4fd6c0f860426$var$dispatch","action","data","$97e4fd6c0f860426$var$dispatcher","$97e4fd6c0f860426$var$appState","$97e4fd6c0f860426$var$appElement","$97e4fd6c0f860426$var$view","title","count","toString","$97e4fd6c0f860426$var$button","label","cb","click","console","log","warn","document","getElementById"],"version":3,"file":"hsml_demo.eb3b08be.js.map"}
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="en"><head><script nomodule defer src="hsml-app-form-validation_demo.d3925067.js"></script><script type="module" src="hsml-app-form-validation_demo.b3a5c810.js"></script><meta charset="utf-8"><title>PeRyL hsml incremental dom demo</title><style>.label{font-weight:700}.count{color:#a9a9a9}</style></head><body> <h1>PeRyL hsml (flux) app demo</h1> <div id="app"></div> <script type="module" src="hsml_demo.ff950ba1.js"></script><script src="hsml_demo.33f28c29.js" nomodule defer></script> </body></html>
1
+ <!DOCTYPE html><html lang="en"><head><script nomodule defer src="hsml-app-form-validation_demo.fdcc0b2d.js"></script><script type="module" src="hsml-app-form-validation_demo.c6856b02.js"></script><meta charset="utf-8"><title>PeRyL hsml incremental dom demo</title><style>.label{font-weight:700}.count{color:#a9a9a9}</style></head><body> <h1>PeRyL hsml (flux) app demo</h1> <div id="app"></div> <script type="module" src="hsml_demo.a248689a.js"></script><script src="hsml_demo.eb3b08be.js" nomodule defer></script> </body></html>
@@ -1 +1 @@
1
- {"mappings":"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","sources":["src/http.ts","demo/http_demo.ts"],"sourcesContent":["\nfunction isArray(obj: any) {\n return Array.isArray ?\n Array.isArray(obj) :\n (obj == null || obj === undefined || \"boolean|number|string|function|xml\".indexOf(typeof obj) !== -1) ?\n false :\n (typeof obj.length === \"number\" && !(obj.propertyIsEnumerable(\"length\")));\n}\n\nexport function decodeUrlQuery(queryStr: string): { [key: string]: string } {\n const query: { [key: string]: string } = {};\n if (queryStr) {\n const a = queryStr.substr(1).split(\"&\");\n for (const item of a) {\n const b = item.split(\"=\");\n query[decodeURIComponent(b[0])] = decodeURIComponent(b[1] ?? \"\");\n }\n }\n return query;\n}\n\nexport function encodeUrlQuery(query: any): string {\n const key_value_pairs: any[] = [];\n for (const key in query) {\n if (query.hasOwnProperty(key)) {\n const value = query[key];\n if (typeof value === \"object\") {\n if (isArray(value)) {\n for (const item of value) {\n key_value_pairs.push(\n [key, typeof item === \"object\" ?\n JSON.stringify(item) : item]);\n }\n } else {\n key_value_pairs.push([key, JSON.stringify(value)]);\n }\n } else {\n key_value_pairs.push([key, value]);\n }\n }\n }\n for (let j = 0, pair: any; pair = key_value_pairs[j++];) {\n key_value_pairs[j - 1] = `${encodeURIComponent(pair[0])}=${encodeURIComponent(pair[1])}`;\n }\n return key_value_pairs.join(\"&\");\n}\n\n\nexport class HttpResponse {\n\n private _xhr: XMLHttpRequest;\n\n constructor(xhr: XMLHttpRequest) {\n this._xhr = xhr;\n }\n\n getHeaders(): string {\n return this._xhr.getAllResponseHeaders();\n }\n\n getHeader(header: string): string | null {\n return this._xhr.getResponseHeader(header);\n }\n\n getBody(): any {\n return this._xhr.response;\n }\n\n getType(): string {\n return this._xhr.responseType;\n }\n\n getContentType(): string | null {\n return this.getHeader(\"Content-Type\");\n }\n\n getText(): string {\n return this._xhr.responseText;\n }\n\n getJson(): any {\n return JSON.parse(this._xhr.responseText);\n }\n\n getXml(): Document | null {\n return this._xhr.responseXML;\n }\n\n}\n\n\nexport interface HttpProgress {\n loaded: number;\n total?: number;\n}\n\nexport type HttpMethod =\n | \"GET\"\n | \"POST\"\n | \"PUT\"\n | \"DELETE\"\n | \"PATCH\"\n | \"HEAD\"\n | \"CONNECT\"\n | \"OPTIONS\"\n | \"TRACE\";\n\nexport type HttpResponseType =\n | \"arraybuffer\"\n | \"blob\"\n | \"document\"\n | \"json\"\n | \"text\";\n\nexport const authBasic = (login: string, password: string) => (req: HttpRequest) => {\n req.headers({ \"Authorization\": \"Basic \" + btoa(login + \":\" + password) });\n};\n\nexport const authJwt = (jwt: string) => (req: HttpRequest) => {\n req.headers({ \"Authorization\": \"Bearer \" + jwt });\n};\n\nexport class HttpRequest {\n\n static readonly xhrs: HttpRequest[] = [];\n\n static onRequest?: (request: HttpRequest) => void;\n static onResponse?: (response: HttpResponse) => void;\n static onError?: (e: Event) => void;\n\n static abortAll() {\n HttpRequest.xhrs.forEach(x => x.abort());\n HttpRequest.xhrs.length = 0;\n }\n\n private _url?: string;\n private _query?: Object;\n private _method: HttpMethod = \"GET\";\n private _headers: { [key: string]: string } = {};\n private _timeout?: number;\n private _responseType?: HttpResponseType;\n\n private _onProgress?: (progress: HttpProgress) => void;\n private _onResponse?: (response: HttpResponse) => void;\n private _onError?: (e?: Event) => void;\n\n private _xhr?: XMLHttpRequest;\n private _async: boolean = true;\n private _noCache: boolean = false;\n\n get(url: string, query?: Object): this {\n this.method(\"GET\");\n this.url(url, query);\n return this;\n }\n\n post(url: string, query?: Object): this {\n this.method(\"POST\");\n this.url(url, query);\n return this;\n }\n\n put(url: string, query?: Object): this {\n this.method(\"PUT\");\n this.url(url, query);\n return this;\n }\n\n patch(url: string, query?: Object): this {\n this.method(\"PATCH\");\n this.url(url, query);\n return this;\n }\n\n del(url: string, query?: Object): this {\n this.method(\"DELETE\");\n this.url(url, query);\n return this;\n }\n\n url(url: string, query?: Object): this {\n this._url = url;\n this._query = query;\n return this;\n }\n\n method(method: HttpMethod): this {\n this._method = method;\n return this;\n }\n\n headers(headers: { [key: string]: string }): this {\n for (const key in headers) {\n if (headers.hasOwnProperty(key)) {\n this._headers[key] = headers[key];\n }\n }\n return this;\n }\n\n use(middleware: (req: HttpRequest) => void): this {\n middleware(this);\n return this;\n }\n\n timeout(timeout: number): this {\n this._timeout = timeout;\n return this;\n }\n\n responseType(type: HttpResponseType): this {\n this._responseType = type;\n return this;\n }\n\n onProgress(onProgress: (progress: HttpProgress) => void): this {\n this._onProgress = onProgress;\n return this;\n }\n\n onResponse(onResponse: (response: HttpResponse) => void): this {\n this._onResponse = onResponse;\n return this;\n }\n\n onError(onError: (e?: Event) => void): this {\n this._onError = onError;\n return this;\n }\n\n async(async: boolean = true): this {\n this._async = async;\n return this;\n }\n\n noCache(noCache: boolean = true): this {\n this._noCache = noCache;\n return this;\n }\n\n abort(): this {\n if (this._xhr) {\n this._xhr.abort();\n }\n return this;\n }\n\n send(data?: any, contentType?: string): void {\n if (contentType) {\n this._headers[\"Content-Type\"] = contentType;\n }\n // this._headers[\"X-Requested-With\"] = \"XMLHttpRequest\";\n this._send(data, this._headers);\n }\n\n sendPromise(data?: any, contentType?: string): Promise<HttpResponse> {\n return new Promise<HttpResponse>((res, rej) => {\n this._onResponse = res;\n this._onError = rej;\n if (contentType) {\n this._headers[\"Content-Type\"] = contentType;\n }\n this._send(data, this._headers);\n });\n }\n\n private _send(data?: any, headers?: { [key: string]: string }): void {\n const xhr = new XMLHttpRequest();\n this._xhr = xhr;\n\n let url = this._url ?? \"\";\n if (this._query) {\n const query = encodeUrlQuery(this._query);\n url = query ? `${url}?${query}` : url;\n }\n if (this._noCache) {\n url += (/\\?/.test(url) ? \"&\" : \"?\") + new Date().getTime();\n }\n // console.debug(\"HttpRequest: \" + this._method + \" \" + url, data);\n\n if (this._responseType) {\n this._xhr.responseType = this._responseType;\n }\n\n if (\"onprogress\" in xhr) {\n if (this._onProgress) {\n const onprogress = (e: ProgressEvent) => {\n this._onProgress!({\n loaded: e.loaded,\n total: e.lengthComputable ? e.total : undefined\n });\n };\n xhr.upload.onprogress = onprogress;\n xhr.onprogress = onprogress;\n }\n }\n\n HttpRequest.xhrs.push(this);\n\n xhr.open(this._method, url, this._async);\n\n for (const header in headers) {\n if (headers.hasOwnProperty(header)) {\n xhr.setRequestHeader(header, headers[header]);\n }\n }\n\n if (this._timeout) {\n xhr.timeout = this._timeout;\n }\n\n if (\"ontimeout\" in xhr) {\n if (this._onError || HttpRequest.onError) {\n xhr.ontimeout = (e: ProgressEvent) => {\n HttpRequest.onError && HttpRequest.onError(e);\n this._onError && this._onError(e);\n };\n }\n }\n\n if (\"onabort\" in xhr) {\n if (this._onError || HttpRequest.onError) {\n xhr.onabort = (e: ProgressEvent) => {\n HttpRequest.onError && HttpRequest.onError(e);\n this._onError && this._onError(e);\n };\n }\n }\n\n if (this._onError || HttpRequest.onError) {\n xhr.onerror = (e: ProgressEvent) => {\n HttpRequest.onError && HttpRequest.onError(e);\n this._onError && this._onError(e);\n };\n }\n\n if (this._async) {\n if (\"onload\" in xhr) {\n xhr.onload = (e: ProgressEvent) => {\n (HttpRequest as any).xhrs = HttpRequest.xhrs.filter(x => this !== x);\n if (xhr.status >= 200 && xhr.status < 300) {\n const respone = new HttpResponse(xhr);\n if (HttpRequest.onResponse) {\n HttpRequest.onResponse(respone);\n }\n if (this._onResponse) {\n this._onResponse(respone);\n }\n } else {\n if (HttpRequest.onError) {\n HttpRequest.onError(e);\n }\n if (this._onError) {\n this._onError(e);\n }\n }\n };\n } else {\n // legacy\n (xhr as any).onreadystatechange = (e: Event) => {\n switch ((xhr as any).readyState) {\n // 0 UNSENT Client has been created. open() not called yet.\n // 1 OPENED open() has been called.\n // 2 HEADERS_RECEIVED send() has been called, and headers and status are available.\n // 3 LOADING Downloading; responseText holds partial data.\n // 4 DONE The operation is complete.\n // case 3: // loading\n // if (this._onProgress) {\n // this._onProgress(new HttpResponse(httpRequest));\n // }\n // break;\n case 4: // done\n (HttpRequest as any).xhrs = HttpRequest.xhrs.filter(x => this !== x);\n // const httpStatusOk = xhr.status >= 200 && xhr.status < 300;\n // schemes other than http/https (file, ftp)\n // const fileFtpStatusOk = xhr.status === 0 && !this._url.match(/^https?:\\/\\//);\n // const fileFtpStatusOk = xhr.status === 0 && !xhr.responseURL.match(/^https?:\\/\\//);\n // if (httpStatusOk || fileFtpStatusOk) {\n if ((xhr as any).status >= 200 && (xhr as any).status < 300) {\n const respone = new HttpResponse(xhr);\n if (HttpRequest.onResponse) {\n HttpRequest.onResponse(respone);\n }\n if (this._onResponse) {\n this._onResponse(respone);\n }\n } else {\n if (HttpRequest.onError) {\n HttpRequest.onError(e);\n }\n if (this._onError) {\n this._onError(e);\n }\n }\n break;\n default:\n }\n };\n }\n\n if (data !== undefined) {\n if (\n typeof data === \"string\" ||\n data instanceof FormData ||\n data instanceof Blob\n ) {\n xhr.send(data);\n } else {\n if (!this._headers[\"Content-Type\"]) {\n xhr.setRequestHeader(\"Content-Type\", \"application/json\");\n }\n xhr.send(JSON.stringify(data));\n }\n } else {\n xhr.send();\n }\n } else {\n if (data) {\n const payload = (typeof data === \"string\") ? data : JSON.stringify(data);\n xhr.send(payload);\n } else {\n xhr.send();\n }\n return JSON.parse(xhr.responseText);\n }\n }\n\n}\n\n\nexport function httpGet(url: string, query?: Object): HttpRequest {\n return new HttpRequest().method(\"GET\").url(url, query);\n}\n\nexport function httpPost(url: string, query?: Object): HttpRequest {\n return new HttpRequest().method(\"POST\").url(url, query);\n}\n\nexport function httpPut(url: string, query?: Object): HttpRequest {\n return new HttpRequest().method(\"PUT\").url(url, query);\n}\n\nexport function httpPatch(url: string, query?: Object): HttpRequest {\n return new HttpRequest().method(\"PATCH\").url(url, query);\n}\n\nexport function httpDelete(url: string, query?: Object): HttpRequest {\n return new HttpRequest().method(\"DELETE\").url(url, query);\n}\n\nexport function httpOnRequest(onRequest: (req: HttpRequest) => void): void {\n HttpRequest.onRequest = onRequest;\n}\n\nexport function httpOnResponse(onResponse: (req: HttpResponse) => void): void {\n HttpRequest.onResponse = onResponse;\n}\n\nexport function httpOnError(onError: (req: Event) => void): void {\n HttpRequest.onError = onError;\n}\n\nexport const http = {\n get: httpGet,\n post: httpPost,\n put: httpPut,\n patch: httpPatch,\n delete: httpDelete,\n onRequest: httpOnRequest,\n onResponse: httpOnResponse,\n onError: httpOnError\n};\n","import { authBasic, authJwt, http } from \"../src/http\";\n\nhttp.onRequest(req => {\n req.headers({ \"X-Requested-With\": \"XMLHttpRequest\" });\n console.log(req);\n});\n\nhttp.onResponse(res => {\n console.log(res);\n});\n\nhttp.onError(e => {\n console.log(e);\n});\n\nhttp.get(\"http://date.jsontest.com\")\n // .use(authBasic(\"login\", \"passwd\"))\n // .use(authJwt(\"JWT-auth-tocken\"))\n .onProgress(progress => {\n console.log(\"progress: \", progress);\n })\n .onResponse(response => {\n console.log(\"response: \" + response.getContentType(), response.getBody());\n })\n .onError(error => {\n console.log(\"response error: \", error);\n })\n .noCache()\n .send();\n\nhttp.get(\"http://date.jsontest.com\")\n .onProgress(progress => {\n console.log(\"progress: \", progress);\n })\n .noCache()\n .sendPromise()\n .then(response => {\n console.log(\"response: \" + response.getContentType(), response.getBody());\n })\n .catch(error => {\n console.log(\"response error: \", error);\n });\n\n// get(\"https://maps.googleapis.com/maps/api/geocode/json\", {\n// sensor: false,\n// address: \"Bratislava I\",\n// xxx: [\"yyy\", \"zzz\"]\n// })\n// // .timeout(10)\n// .onProgress(progress => {\n// console.log(\"response progress: \", progress);\n// })\n// .onResponse(response => {\n// console.log(\"response: \" + response.getContentType(), response.getJson());\n// })\n// .onError(error => {\n// console.log(\"response error: \", error);\n// })\n// .noCache()\n// // .headers({\"Content-Type\": \"application/json\"})\n// // .send(data, \"application/json\");\n// .send();\n\n// dd if=/dev/urandom of=http_demp.bigfile bs=1M count=100\n// get(\"http_demp.bigfile\")\n// .onProgress(progress => {\n// console.log(\"progress: \", progress);\n// })\n// .onResponse(response => {\n// console.log(\"response: \" + response.getContentType(), response);\n// })\n// .onError(error => {\n// console.log(\"response error: \", error);\n// })\n// .noCache()\n// .send();\n\n\n// HttpRequest.abortAll();\n"],"names":["$e95a60c4f3631aa0$export$1d94dfe0d9d1f1e7","getHeaders","this","_xhr","getAllResponseHeaders","getHeader","header","getResponseHeader","getBody","response","getType","responseType","getContentType","getText","responseText","getJson","JSON","parse","getXml","responseXML","constructor","xhr","$e95a60c4f3631aa0$export$7587955500404ec3","static","xhrs","forEach","x","abort","length","get","url","query","method","post","put","patch","del","_url","_query","_method","headers","key","hasOwnProperty","_headers","use","middleware","timeout","_timeout","type","_responseType","onProgress","_onProgress","onResponse","_onResponse","onError","_onError","async","_async","noCache","_noCache","send","data","contentType","_send","sendPromise","Promise","res","rej","XMLHttpRequest","_a","key_value_pairs","value","obj","Array","isArray","undefined","indexOf","propertyIsEnumerable","item","push","stringify","pair","j","encodeURIComponent","join","$e95a60c4f3631aa0$export$6c9b9e72a9438aa2","test","Date","getTime","onprogress","e","loaded","total","lengthComputable","upload","open","setRequestHeader","ontimeout","onabort","onerror","payload","onload","filter","status","respone","onreadystatechange","readyState","FormData","Blob","$e95a60c4f3631aa0$export$7d6f1c8842f9f527","delete","onRequest","req","console","log","progress","error","then","catch"],"version":3,"file":"http_demo.3e7da3d8.js.map"}
1
+ {"mappings":"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","sources":["src/http.ts","demo/http_demo.ts"],"sourcesContent":["\nfunction isArray(obj: any) {\n return Array.isArray ?\n Array.isArray(obj) :\n (obj == null || obj === undefined || \"boolean|number|string|function|xml\".indexOf(typeof obj) !== -1) ?\n false :\n (typeof obj.length === \"number\" && !(obj.propertyIsEnumerable(\"length\")));\n}\n\nexport function decodeUrlQuery(queryStr: string): { [key: string]: string } {\n const query: { [key: string]: string } = {};\n if (queryStr) {\n const a = queryStr.substr(1).split(\"&\");\n for (const item of a) {\n const b = item.split(\"=\");\n query[decodeURIComponent(b[0])] = decodeURIComponent(b[1] ?? \"\");\n }\n }\n return query;\n}\n\nexport function encodeUrlQuery(query: any): string {\n const key_value_pairs: any[] = [];\n for (const key in query) {\n if (query.hasOwnProperty(key)) {\n const value = query[key];\n if (typeof value === \"object\") {\n if (isArray(value)) {\n for (const item of value) {\n key_value_pairs.push(\n [key, typeof item === \"object\" ?\n JSON.stringify(item) : item]);\n }\n } else {\n key_value_pairs.push([key, JSON.stringify(value)]);\n }\n } else {\n key_value_pairs.push([key, value]);\n }\n }\n }\n for (let j = 0, pair: any; pair = key_value_pairs[j++];) {\n key_value_pairs[j - 1] = `${encodeURIComponent(pair[0])}=${encodeURIComponent(pair[1])}`;\n }\n return key_value_pairs.join(\"&\");\n}\n\n\nexport class HttpResponse {\n\n private _xhr: XMLHttpRequest;\n\n constructor(xhr: XMLHttpRequest) {\n this._xhr = xhr;\n }\n\n getHeaders(): string {\n return this._xhr.getAllResponseHeaders();\n }\n\n getHeader(header: string): string | null {\n return this._xhr.getResponseHeader(header);\n }\n\n getBody(): any {\n return this._xhr.response;\n }\n\n getType(): string {\n return this._xhr.responseType;\n }\n\n getContentType(): string | null {\n return this.getHeader(\"Content-Type\");\n }\n\n getText(): string {\n return this._xhr.responseText;\n }\n\n getJson(): any {\n return JSON.parse(this._xhr.responseText);\n }\n\n getXml(): Document | null {\n return this._xhr.responseXML;\n }\n\n}\n\n\nexport interface HttpProgress {\n loaded: number;\n total?: number;\n}\n\nexport type HttpMethod =\n | \"GET\"\n | \"POST\"\n | \"PUT\"\n | \"DELETE\"\n | \"PATCH\"\n | \"HEAD\"\n | \"CONNECT\"\n | \"OPTIONS\"\n | \"TRACE\";\n\nexport type HttpResponseType =\n | \"arraybuffer\"\n | \"blob\"\n | \"document\"\n | \"json\"\n | \"text\";\n\nexport const authBasic = (login: string, password: string) => (req: HttpRequest) => {\n req.headers({ \"Authorization\": \"Basic \" + btoa(login + \":\" + password) });\n};\n\nexport const authJwt = (jwt: string) => (req: HttpRequest) => {\n req.headers({ \"Authorization\": \"Bearer \" + jwt });\n};\n\nexport class HttpRequest {\n\n static readonly xhrs: HttpRequest[] = [];\n\n static onRequest?: (request: HttpRequest) => void;\n static onResponse?: (response: HttpResponse) => void;\n static onError?: (e: Event) => void;\n\n static abortAll() {\n HttpRequest.xhrs.forEach(x => x.abort());\n HttpRequest.xhrs.length = 0;\n }\n\n private _url?: string;\n private _query?: Object;\n private _method: HttpMethod = \"GET\";\n private _headers: { [key: string]: string } = {};\n private _timeout?: number;\n private _responseType?: HttpResponseType;\n\n private _onProgress?: (progress: HttpProgress) => void;\n private _onResponse?: (response: HttpResponse) => void;\n private _onError?: (e?: Event) => void;\n\n private _xhr?: XMLHttpRequest;\n private _async: boolean = true;\n private _noCache: boolean = false;\n\n get(url: string, query?: Object): this {\n this.method(\"GET\");\n this.url(url, query);\n return this;\n }\n\n post(url: string, query?: Object): this {\n this.method(\"POST\");\n this.url(url, query);\n return this;\n }\n\n put(url: string, query?: Object): this {\n this.method(\"PUT\");\n this.url(url, query);\n return this;\n }\n\n patch(url: string, query?: Object): this {\n this.method(\"PATCH\");\n this.url(url, query);\n return this;\n }\n\n del(url: string, query?: Object): this {\n this.method(\"DELETE\");\n this.url(url, query);\n return this;\n }\n\n url(url: string, query?: Object): this {\n this._url = url;\n this._query = query;\n return this;\n }\n\n method(method: HttpMethod): this {\n this._method = method;\n return this;\n }\n\n headers(headers: { [key: string]: string }): this {\n for (const key in headers) {\n if (headers.hasOwnProperty(key)) {\n this._headers[key] = headers[key];\n }\n }\n return this;\n }\n\n use(middleware: (req: HttpRequest) => void): this {\n middleware(this);\n return this;\n }\n\n timeout(timeout: number): this {\n this._timeout = timeout;\n return this;\n }\n\n responseType(type: HttpResponseType): this {\n this._responseType = type;\n return this;\n }\n\n onProgress(onProgress: (progress: HttpProgress) => void): this {\n this._onProgress = onProgress;\n return this;\n }\n\n onResponse(onResponse: (response: HttpResponse) => void): this {\n this._onResponse = onResponse;\n return this;\n }\n\n onError(onError: (e?: Event) => void): this {\n this._onError = onError;\n return this;\n }\n\n async(async: boolean = true): this {\n this._async = async;\n return this;\n }\n\n noCache(noCache: boolean = true): this {\n this._noCache = noCache;\n return this;\n }\n\n abort(): this {\n if (this._xhr) {\n this._xhr.abort();\n }\n return this;\n }\n\n send(data?: any, contentType?: string): void {\n if (contentType) {\n this._headers[\"Content-Type\"] = contentType;\n }\n // this._headers[\"X-Requested-With\"] = \"XMLHttpRequest\";\n this._send(data, this._headers);\n }\n\n sendPromise(data?: any, contentType?: string): Promise<HttpResponse> {\n return new Promise<HttpResponse>((res, rej) => {\n this._onResponse = res;\n this._onError = rej;\n if (contentType) {\n this._headers[\"Content-Type\"] = contentType;\n }\n this._send(data, this._headers);\n });\n }\n\n private _send(data?: any, headers?: { [key: string]: string }): void {\n const xhr = new XMLHttpRequest();\n this._xhr = xhr;\n\n let url = this._url ?? \"\";\n if (this._query) {\n const query = encodeUrlQuery(this._query);\n url = query ? `${url}?${query}` : url;\n }\n if (this._noCache) {\n url += (/\\?/.test(url) ? \"&\" : \"?\") + new Date().getTime();\n }\n // console.debug(\"HttpRequest: \" + this._method + \" \" + url, data);\n\n if (this._responseType) {\n this._xhr.responseType = this._responseType;\n }\n\n if (\"onprogress\" in xhr) {\n if (this._onProgress) {\n const onprogress = (e: ProgressEvent) => {\n this._onProgress!({\n loaded: e.loaded,\n total: e.lengthComputable ? e.total : undefined\n });\n };\n xhr.upload.onprogress = onprogress;\n xhr.onprogress = onprogress;\n }\n }\n\n HttpRequest.xhrs.push(this);\n\n xhr.open(this._method, url, this._async);\n\n for (const header in headers) {\n if (headers.hasOwnProperty(header)) {\n xhr.setRequestHeader(header, headers[header]);\n }\n }\n\n if (this._timeout) {\n xhr.timeout = this._timeout;\n }\n\n if (\"ontimeout\" in xhr) {\n if (this._onError || HttpRequest.onError) {\n xhr.ontimeout = (e: ProgressEvent) => {\n HttpRequest.onError && HttpRequest.onError(e);\n this._onError && this._onError(e);\n };\n }\n }\n\n if (\"onabort\" in xhr) {\n if (this._onError || HttpRequest.onError) {\n xhr.onabort = (e: ProgressEvent) => {\n HttpRequest.onError && HttpRequest.onError(e);\n this._onError && this._onError(e);\n };\n }\n }\n\n if (this._onError || HttpRequest.onError) {\n xhr.onerror = (e: ProgressEvent) => {\n HttpRequest.onError && HttpRequest.onError(e);\n this._onError && this._onError(e);\n };\n }\n\n if (this._async) {\n if (\"onload\" in xhr) {\n xhr.onload = (e: ProgressEvent) => {\n (HttpRequest as any).xhrs = HttpRequest.xhrs.filter(x => this !== x);\n if (xhr.status >= 200 && xhr.status < 300) {\n const respone = new HttpResponse(xhr);\n if (HttpRequest.onResponse) {\n HttpRequest.onResponse(respone);\n }\n if (this._onResponse) {\n this._onResponse(respone);\n }\n } else {\n if (HttpRequest.onError) {\n HttpRequest.onError(e);\n }\n if (this._onError) {\n this._onError(e);\n }\n }\n };\n } else {\n // legacy\n (xhr as any).onreadystatechange = (e: Event) => {\n switch ((xhr as any).readyState) {\n // 0 UNSENT Client has been created. open() not called yet.\n // 1 OPENED open() has been called.\n // 2 HEADERS_RECEIVED send() has been called, and headers and status are available.\n // 3 LOADING Downloading; responseText holds partial data.\n // 4 DONE The operation is complete.\n // case 3: // loading\n // if (this._onProgress) {\n // this._onProgress(new HttpResponse(httpRequest));\n // }\n // break;\n case 4: // done\n (HttpRequest as any).xhrs = HttpRequest.xhrs.filter(x => this !== x);\n // const httpStatusOk = xhr.status >= 200 && xhr.status < 300;\n // schemes other than http/https (file, ftp)\n // const fileFtpStatusOk = xhr.status === 0 && !this._url.match(/^https?:\\/\\//);\n // const fileFtpStatusOk = xhr.status === 0 && !xhr.responseURL.match(/^https?:\\/\\//);\n // if (httpStatusOk || fileFtpStatusOk) {\n if ((xhr as any).status >= 200 && (xhr as any).status < 300) {\n const respone = new HttpResponse(xhr);\n if (HttpRequest.onResponse) {\n HttpRequest.onResponse(respone);\n }\n if (this._onResponse) {\n this._onResponse(respone);\n }\n } else {\n if (HttpRequest.onError) {\n HttpRequest.onError(e);\n }\n if (this._onError) {\n this._onError(e);\n }\n }\n break;\n default:\n }\n };\n }\n\n if (data !== undefined) {\n if (\n typeof data === \"string\" ||\n data instanceof FormData ||\n data instanceof Blob\n ) {\n xhr.send(data);\n } else {\n if (!this._headers[\"Content-Type\"]) {\n xhr.setRequestHeader(\"Content-Type\", \"application/json\");\n }\n xhr.send(JSON.stringify(data));\n }\n } else {\n xhr.send();\n }\n } else {\n if (data) {\n const payload = (typeof data === \"string\") ? data : JSON.stringify(data);\n xhr.send(payload);\n } else {\n xhr.send();\n }\n return JSON.parse(xhr.responseText);\n }\n }\n\n}\n\n\nexport function httpGet(url: string, query?: Object): HttpRequest {\n return new HttpRequest().method(\"GET\").url(url, query);\n}\n\nexport function httpPost(url: string, query?: Object): HttpRequest {\n return new HttpRequest().method(\"POST\").url(url, query);\n}\n\nexport function httpPut(url: string, query?: Object): HttpRequest {\n return new HttpRequest().method(\"PUT\").url(url, query);\n}\n\nexport function httpPatch(url: string, query?: Object): HttpRequest {\n return new HttpRequest().method(\"PATCH\").url(url, query);\n}\n\nexport function httpDelete(url: string, query?: Object): HttpRequest {\n return new HttpRequest().method(\"DELETE\").url(url, query);\n}\n\nexport function httpOnRequest(onRequest: (req: HttpRequest) => void): void {\n HttpRequest.onRequest = onRequest;\n}\n\nexport function httpOnResponse(onResponse: (req: HttpResponse) => void): void {\n HttpRequest.onResponse = onResponse;\n}\n\nexport function httpOnError(onError: (req: Event) => void): void {\n HttpRequest.onError = onError;\n}\n\nexport const http = {\n get: httpGet,\n post: httpPost,\n put: httpPut,\n patch: httpPatch,\n delete: httpDelete,\n onRequest: httpOnRequest,\n onResponse: httpOnResponse,\n onError: httpOnError\n};\n","import { authBasic, authJwt, http } from \"../src/http\";\n\nhttp.onRequest(req => {\n req.headers({ \"X-Requested-With\": \"XMLHttpRequest\" });\n console.log(req);\n});\n\nhttp.onResponse(res => {\n console.log(res);\n});\n\nhttp.onError(e => {\n console.log(e);\n});\n\nhttp.get(\"http://date.jsontest.com\")\n // .use(authBasic(\"login\", \"passwd\"))\n // .use(authJwt(\"JWT-auth-tocken\"))\n .onProgress(progress => {\n console.log(\"progress: \", progress);\n })\n .onResponse(response => {\n console.log(\"response: \" + response.getContentType(), response.getBody());\n })\n .onError(error => {\n console.log(\"response error: \", error);\n })\n .noCache()\n .send();\n\nhttp.get(\"http://date.jsontest.com\")\n .onProgress(progress => {\n console.log(\"progress: \", progress);\n })\n .noCache()\n .sendPromise()\n .then(response => {\n console.log(\"response: \" + response.getContentType(), response.getBody());\n })\n .catch(error => {\n console.log(\"response error: \", error);\n });\n\n// get(\"https://maps.googleapis.com/maps/api/geocode/json\", {\n// sensor: false,\n// address: \"Bratislava I\",\n// xxx: [\"yyy\", \"zzz\"]\n// })\n// // .timeout(10)\n// .onProgress(progress => {\n// console.log(\"response progress: \", progress);\n// })\n// .onResponse(response => {\n// console.log(\"response: \" + response.getContentType(), response.getJson());\n// })\n// .onError(error => {\n// console.log(\"response error: \", error);\n// })\n// .noCache()\n// // .headers({\"Content-Type\": \"application/json\"})\n// // .send(data, \"application/json\");\n// .send();\n\n// dd if=/dev/urandom of=http_demp.bigfile bs=1M count=100\n// get(\"http_demp.bigfile\")\n// .onProgress(progress => {\n// console.log(\"progress: \", progress);\n// })\n// .onResponse(response => {\n// console.log(\"response: \" + response.getContentType(), response);\n// })\n// .onError(error => {\n// console.log(\"response error: \", error);\n// })\n// .noCache()\n// .send();\n\n\n// HttpRequest.abortAll();\n"],"names":["$e95a60c4f3631aa0$export$1d94dfe0d9d1f1e7","getHeaders","this","_xhr","getAllResponseHeaders","getHeader","header","getResponseHeader","getBody","response","getType","responseType","getContentType","getText","responseText","getJson","JSON","parse","getXml","responseXML","constructor","xhr","$e95a60c4f3631aa0$export$7587955500404ec3","static","xhrs","forEach","x","abort","length","get","url","query","method","post","put","patch","del","_url","_query","_method","headers","key","hasOwnProperty","_headers","use","middleware","timeout","_timeout","type","_responseType","onProgress","_onProgress","onResponse","_onResponse","onError","_onError","async","_async","noCache","_noCache","send","data","contentType","_send","sendPromise","Promise","res","rej","XMLHttpRequest","_a","key_value_pairs","value","obj","Array","isArray","undefined","indexOf","propertyIsEnumerable","item","push","stringify","pair","j","encodeURIComponent","join","$e95a60c4f3631aa0$export$6c9b9e72a9438aa2","test","Date","getTime","onprogress","e","loaded","total","lengthComputable","upload","open","setRequestHeader","ontimeout","onabort","onerror","payload","onload","filter","status","respone","onreadystatechange","readyState","FormData","Blob","$e95a60c4f3631aa0$export$7d6f1c8842f9f527","delete","onRequest","req","console","log","progress","error","then","catch"],"version":3,"file":"http_demo.3e7da3d8.js.map"}
@@ -1 +1 @@
1
- {"mappings":"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","sources":["src/http.ts","demo/http_demo.ts"],"sourcesContent":["\nfunction isArray(obj: any) {\n return Array.isArray ?\n Array.isArray(obj) :\n (obj == null || obj === undefined || \"boolean|number|string|function|xml\".indexOf(typeof obj) !== -1) ?\n false :\n (typeof obj.length === \"number\" && !(obj.propertyIsEnumerable(\"length\")));\n}\n\nexport function decodeUrlQuery(queryStr: string): { [key: string]: string } {\n const query: { [key: string]: string } = {};\n if (queryStr) {\n const a = queryStr.substr(1).split(\"&\");\n for (const item of a) {\n const b = item.split(\"=\");\n query[decodeURIComponent(b[0])] = decodeURIComponent(b[1] ?? \"\");\n }\n }\n return query;\n}\n\nexport function encodeUrlQuery(query: any): string {\n const key_value_pairs: any[] = [];\n for (const key in query) {\n if (query.hasOwnProperty(key)) {\n const value = query[key];\n if (typeof value === \"object\") {\n if (isArray(value)) {\n for (const item of value) {\n key_value_pairs.push(\n [key, typeof item === \"object\" ?\n JSON.stringify(item) : item]);\n }\n } else {\n key_value_pairs.push([key, JSON.stringify(value)]);\n }\n } else {\n key_value_pairs.push([key, value]);\n }\n }\n }\n for (let j = 0, pair: any; pair = key_value_pairs[j++];) {\n key_value_pairs[j - 1] = `${encodeURIComponent(pair[0])}=${encodeURIComponent(pair[1])}`;\n }\n return key_value_pairs.join(\"&\");\n}\n\n\nexport class HttpResponse {\n\n private _xhr: XMLHttpRequest;\n\n constructor(xhr: XMLHttpRequest) {\n this._xhr = xhr;\n }\n\n getHeaders(): string {\n return this._xhr.getAllResponseHeaders();\n }\n\n getHeader(header: string): string | null {\n return this._xhr.getResponseHeader(header);\n }\n\n getBody(): any {\n return this._xhr.response;\n }\n\n getType(): string {\n return this._xhr.responseType;\n }\n\n getContentType(): string | null {\n return this.getHeader(\"Content-Type\");\n }\n\n getText(): string {\n return this._xhr.responseText;\n }\n\n getJson(): any {\n return JSON.parse(this._xhr.responseText);\n }\n\n getXml(): Document | null {\n return this._xhr.responseXML;\n }\n\n}\n\n\nexport interface HttpProgress {\n loaded: number;\n total?: number;\n}\n\nexport type HttpMethod =\n | \"GET\"\n | \"POST\"\n | \"PUT\"\n | \"DELETE\"\n | \"PATCH\"\n | \"HEAD\"\n | \"CONNECT\"\n | \"OPTIONS\"\n | \"TRACE\";\n\nexport type HttpResponseType =\n | \"arraybuffer\"\n | \"blob\"\n | \"document\"\n | \"json\"\n | \"text\";\n\nexport const authBasic = (login: string, password: string) => (req: HttpRequest) => {\n req.headers({ \"Authorization\": \"Basic \" + btoa(login + \":\" + password) });\n};\n\nexport const authJwt = (jwt: string) => (req: HttpRequest) => {\n req.headers({ \"Authorization\": \"Bearer \" + jwt });\n};\n\nexport class HttpRequest {\n\n static readonly xhrs: HttpRequest[] = [];\n\n static onRequest?: (request: HttpRequest) => void;\n static onResponse?: (response: HttpResponse) => void;\n static onError?: (e: Event) => void;\n\n static abortAll() {\n HttpRequest.xhrs.forEach(x => x.abort());\n HttpRequest.xhrs.length = 0;\n }\n\n private _url?: string;\n private _query?: Object;\n private _method: HttpMethod = \"GET\";\n private _headers: { [key: string]: string } = {};\n private _timeout?: number;\n private _responseType?: HttpResponseType;\n\n private _onProgress?: (progress: HttpProgress) => void;\n private _onResponse?: (response: HttpResponse) => void;\n private _onError?: (e?: Event) => void;\n\n private _xhr?: XMLHttpRequest;\n private _async: boolean = true;\n private _noCache: boolean = false;\n\n get(url: string, query?: Object): this {\n this.method(\"GET\");\n this.url(url, query);\n return this;\n }\n\n post(url: string, query?: Object): this {\n this.method(\"POST\");\n this.url(url, query);\n return this;\n }\n\n put(url: string, query?: Object): this {\n this.method(\"PUT\");\n this.url(url, query);\n return this;\n }\n\n patch(url: string, query?: Object): this {\n this.method(\"PATCH\");\n this.url(url, query);\n return this;\n }\n\n del(url: string, query?: Object): this {\n this.method(\"DELETE\");\n this.url(url, query);\n return this;\n }\n\n url(url: string, query?: Object): this {\n this._url = url;\n this._query = query;\n return this;\n }\n\n method(method: HttpMethod): this {\n this._method = method;\n return this;\n }\n\n headers(headers: { [key: string]: string }): this {\n for (const key in headers) {\n if (headers.hasOwnProperty(key)) {\n this._headers[key] = headers[key];\n }\n }\n return this;\n }\n\n use(middleware: (req: HttpRequest) => void): this {\n middleware(this);\n return this;\n }\n\n timeout(timeout: number): this {\n this._timeout = timeout;\n return this;\n }\n\n responseType(type: HttpResponseType): this {\n this._responseType = type;\n return this;\n }\n\n onProgress(onProgress: (progress: HttpProgress) => void): this {\n this._onProgress = onProgress;\n return this;\n }\n\n onResponse(onResponse: (response: HttpResponse) => void): this {\n this._onResponse = onResponse;\n return this;\n }\n\n onError(onError: (e?: Event) => void): this {\n this._onError = onError;\n return this;\n }\n\n async(async: boolean = true): this {\n this._async = async;\n return this;\n }\n\n noCache(noCache: boolean = true): this {\n this._noCache = noCache;\n return this;\n }\n\n abort(): this {\n if (this._xhr) {\n this._xhr.abort();\n }\n return this;\n }\n\n send(data?: any, contentType?: string): void {\n if (contentType) {\n this._headers[\"Content-Type\"] = contentType;\n }\n // this._headers[\"X-Requested-With\"] = \"XMLHttpRequest\";\n this._send(data, this._headers);\n }\n\n sendPromise(data?: any, contentType?: string): Promise<HttpResponse> {\n return new Promise<HttpResponse>((res, rej) => {\n this._onResponse = res;\n this._onError = rej;\n if (contentType) {\n this._headers[\"Content-Type\"] = contentType;\n }\n this._send(data, this._headers);\n });\n }\n\n private _send(data?: any, headers?: { [key: string]: string }): void {\n const xhr = new XMLHttpRequest();\n this._xhr = xhr;\n\n let url = this._url ?? \"\";\n if (this._query) {\n const query = encodeUrlQuery(this._query);\n url = query ? `${url}?${query}` : url;\n }\n if (this._noCache) {\n url += (/\\?/.test(url) ? \"&\" : \"?\") + new Date().getTime();\n }\n // console.debug(\"HttpRequest: \" + this._method + \" \" + url, data);\n\n if (this._responseType) {\n this._xhr.responseType = this._responseType;\n }\n\n if (\"onprogress\" in xhr) {\n if (this._onProgress) {\n const onprogress = (e: ProgressEvent) => {\n this._onProgress!({\n loaded: e.loaded,\n total: e.lengthComputable ? e.total : undefined\n });\n };\n xhr.upload.onprogress = onprogress;\n xhr.onprogress = onprogress;\n }\n }\n\n HttpRequest.xhrs.push(this);\n\n xhr.open(this._method, url, this._async);\n\n for (const header in headers) {\n if (headers.hasOwnProperty(header)) {\n xhr.setRequestHeader(header, headers[header]);\n }\n }\n\n if (this._timeout) {\n xhr.timeout = this._timeout;\n }\n\n if (\"ontimeout\" in xhr) {\n if (this._onError || HttpRequest.onError) {\n xhr.ontimeout = (e: ProgressEvent) => {\n HttpRequest.onError && HttpRequest.onError(e);\n this._onError && this._onError(e);\n };\n }\n }\n\n if (\"onabort\" in xhr) {\n if (this._onError || HttpRequest.onError) {\n xhr.onabort = (e: ProgressEvent) => {\n HttpRequest.onError && HttpRequest.onError(e);\n this._onError && this._onError(e);\n };\n }\n }\n\n if (this._onError || HttpRequest.onError) {\n xhr.onerror = (e: ProgressEvent) => {\n HttpRequest.onError && HttpRequest.onError(e);\n this._onError && this._onError(e);\n };\n }\n\n if (this._async) {\n if (\"onload\" in xhr) {\n xhr.onload = (e: ProgressEvent) => {\n (HttpRequest as any).xhrs = HttpRequest.xhrs.filter(x => this !== x);\n if (xhr.status >= 200 && xhr.status < 300) {\n const respone = new HttpResponse(xhr);\n if (HttpRequest.onResponse) {\n HttpRequest.onResponse(respone);\n }\n if (this._onResponse) {\n this._onResponse(respone);\n }\n } else {\n if (HttpRequest.onError) {\n HttpRequest.onError(e);\n }\n if (this._onError) {\n this._onError(e);\n }\n }\n };\n } else {\n // legacy\n (xhr as any).onreadystatechange = (e: Event) => {\n switch ((xhr as any).readyState) {\n // 0 UNSENT Client has been created. open() not called yet.\n // 1 OPENED open() has been called.\n // 2 HEADERS_RECEIVED send() has been called, and headers and status are available.\n // 3 LOADING Downloading; responseText holds partial data.\n // 4 DONE The operation is complete.\n // case 3: // loading\n // if (this._onProgress) {\n // this._onProgress(new HttpResponse(httpRequest));\n // }\n // break;\n case 4: // done\n (HttpRequest as any).xhrs = HttpRequest.xhrs.filter(x => this !== x);\n // const httpStatusOk = xhr.status >= 200 && xhr.status < 300;\n // schemes other than http/https (file, ftp)\n // const fileFtpStatusOk = xhr.status === 0 && !this._url.match(/^https?:\\/\\//);\n // const fileFtpStatusOk = xhr.status === 0 && !xhr.responseURL.match(/^https?:\\/\\//);\n // if (httpStatusOk || fileFtpStatusOk) {\n if ((xhr as any).status >= 200 && (xhr as any).status < 300) {\n const respone = new HttpResponse(xhr);\n if (HttpRequest.onResponse) {\n HttpRequest.onResponse(respone);\n }\n if (this._onResponse) {\n this._onResponse(respone);\n }\n } else {\n if (HttpRequest.onError) {\n HttpRequest.onError(e);\n }\n if (this._onError) {\n this._onError(e);\n }\n }\n break;\n default:\n }\n };\n }\n\n if (data !== undefined) {\n if (\n typeof data === \"string\" ||\n data instanceof FormData ||\n data instanceof Blob\n ) {\n xhr.send(data);\n } else {\n if (!this._headers[\"Content-Type\"]) {\n xhr.setRequestHeader(\"Content-Type\", \"application/json\");\n }\n xhr.send(JSON.stringify(data));\n }\n } else {\n xhr.send();\n }\n } else {\n if (data) {\n const payload = (typeof data === \"string\") ? data : JSON.stringify(data);\n xhr.send(payload);\n } else {\n xhr.send();\n }\n return JSON.parse(xhr.responseText);\n }\n }\n\n}\n\n\nexport function httpGet(url: string, query?: Object): HttpRequest {\n return new HttpRequest().method(\"GET\").url(url, query);\n}\n\nexport function httpPost(url: string, query?: Object): HttpRequest {\n return new HttpRequest().method(\"POST\").url(url, query);\n}\n\nexport function httpPut(url: string, query?: Object): HttpRequest {\n return new HttpRequest().method(\"PUT\").url(url, query);\n}\n\nexport function httpPatch(url: string, query?: Object): HttpRequest {\n return new HttpRequest().method(\"PATCH\").url(url, query);\n}\n\nexport function httpDelete(url: string, query?: Object): HttpRequest {\n return new HttpRequest().method(\"DELETE\").url(url, query);\n}\n\nexport function httpOnRequest(onRequest: (req: HttpRequest) => void): void {\n HttpRequest.onRequest = onRequest;\n}\n\nexport function httpOnResponse(onResponse: (req: HttpResponse) => void): void {\n HttpRequest.onResponse = onResponse;\n}\n\nexport function httpOnError(onError: (req: Event) => void): void {\n HttpRequest.onError = onError;\n}\n\nexport const http = {\n get: httpGet,\n post: httpPost,\n put: httpPut,\n patch: httpPatch,\n delete: httpDelete,\n onRequest: httpOnRequest,\n onResponse: httpOnResponse,\n onError: httpOnError\n};\n","import { authBasic, authJwt, http } from \"../src/http\";\n\nhttp.onRequest(req => {\n req.headers({ \"X-Requested-With\": \"XMLHttpRequest\" });\n console.log(req);\n});\n\nhttp.onResponse(res => {\n console.log(res);\n});\n\nhttp.onError(e => {\n console.log(e);\n});\n\nhttp.get(\"http://date.jsontest.com\")\n // .use(authBasic(\"login\", \"passwd\"))\n // .use(authJwt(\"JWT-auth-tocken\"))\n .onProgress(progress => {\n console.log(\"progress: \", progress);\n })\n .onResponse(response => {\n console.log(\"response: \" + response.getContentType(), response.getBody());\n })\n .onError(error => {\n console.log(\"response error: \", error);\n })\n .noCache()\n .send();\n\nhttp.get(\"http://date.jsontest.com\")\n .onProgress(progress => {\n console.log(\"progress: \", progress);\n })\n .noCache()\n .sendPromise()\n .then(response => {\n console.log(\"response: \" + response.getContentType(), response.getBody());\n })\n .catch(error => {\n console.log(\"response error: \", error);\n });\n\n// get(\"https://maps.googleapis.com/maps/api/geocode/json\", {\n// sensor: false,\n// address: \"Bratislava I\",\n// xxx: [\"yyy\", \"zzz\"]\n// })\n// // .timeout(10)\n// .onProgress(progress => {\n// console.log(\"response progress: \", progress);\n// })\n// .onResponse(response => {\n// console.log(\"response: \" + response.getContentType(), response.getJson());\n// })\n// .onError(error => {\n// console.log(\"response error: \", error);\n// })\n// .noCache()\n// // .headers({\"Content-Type\": \"application/json\"})\n// // .send(data, \"application/json\");\n// .send();\n\n// dd if=/dev/urandom of=http_demp.bigfile bs=1M count=100\n// get(\"http_demp.bigfile\")\n// .onProgress(progress => {\n// console.log(\"progress: \", progress);\n// })\n// .onResponse(response => {\n// console.log(\"response: \" + response.getContentType(), response);\n// })\n// .onError(error => {\n// console.log(\"response error: \", error);\n// })\n// .noCache()\n// .send();\n\n\n// HttpRequest.abortAll();\n"],"names":["$b0a183df1ec8d297$export$1d94dfe0d9d1f1e7","getHeaders","this","_xhr","getAllResponseHeaders","getHeader","header","getResponseHeader","getBody","response","getType","responseType","getContentType","getText","responseText","getJson","JSON","parse","getXml","responseXML","constructor","xhr","$b0a183df1ec8d297$export$7587955500404ec3","static","xhrs","forEach","x","abort","length","get","url","query","method","post","put","patch","del","_url","_query","_method","headers","key","hasOwnProperty","_headers","use","middleware","timeout","_timeout","type","_responseType","onProgress","_onProgress","onResponse","_onResponse","onError","_onError","async","_async","noCache","_noCache","send","data","contentType","_send","sendPromise","Promise","res","rej","XMLHttpRequest","_a","key_value_pairs","value","obj","Array","isArray","undefined","indexOf","propertyIsEnumerable","item","push","stringify","pair","j","encodeURIComponent","join","$b0a183df1ec8d297$export$6c9b9e72a9438aa2","test","Date","getTime","onprogress","e","loaded","total","lengthComputable","upload","open","setRequestHeader","ontimeout","onabort","onerror","payload","onload","filter","status","respone","onreadystatechange","readyState","FormData","Blob","$b0a183df1ec8d297$export$7d6f1c8842f9f527","delete","onRequest","req","console","log","progress","error","then","catch"],"version":3,"file":"http_demo.8e435f23.js.map"}
1
+ {"mappings":"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","sources":["src/http.ts","demo/http_demo.ts"],"sourcesContent":["\nfunction isArray(obj: any) {\n return Array.isArray ?\n Array.isArray(obj) :\n (obj == null || obj === undefined || \"boolean|number|string|function|xml\".indexOf(typeof obj) !== -1) ?\n false :\n (typeof obj.length === \"number\" && !(obj.propertyIsEnumerable(\"length\")));\n}\n\nexport function decodeUrlQuery(queryStr: string): { [key: string]: string } {\n const query: { [key: string]: string } = {};\n if (queryStr) {\n const a = queryStr.substr(1).split(\"&\");\n for (const item of a) {\n const b = item.split(\"=\");\n query[decodeURIComponent(b[0])] = decodeURIComponent(b[1] ?? \"\");\n }\n }\n return query;\n}\n\nexport function encodeUrlQuery(query: any): string {\n const key_value_pairs: any[] = [];\n for (const key in query) {\n if (query.hasOwnProperty(key)) {\n const value = query[key];\n if (typeof value === \"object\") {\n if (isArray(value)) {\n for (const item of value) {\n key_value_pairs.push(\n [key, typeof item === \"object\" ?\n JSON.stringify(item) : item]);\n }\n } else {\n key_value_pairs.push([key, JSON.stringify(value)]);\n }\n } else {\n key_value_pairs.push([key, value]);\n }\n }\n }\n for (let j = 0, pair: any; pair = key_value_pairs[j++];) {\n key_value_pairs[j - 1] = `${encodeURIComponent(pair[0])}=${encodeURIComponent(pair[1])}`;\n }\n return key_value_pairs.join(\"&\");\n}\n\n\nexport class HttpResponse {\n\n private _xhr: XMLHttpRequest;\n\n constructor(xhr: XMLHttpRequest) {\n this._xhr = xhr;\n }\n\n getHeaders(): string {\n return this._xhr.getAllResponseHeaders();\n }\n\n getHeader(header: string): string | null {\n return this._xhr.getResponseHeader(header);\n }\n\n getBody(): any {\n return this._xhr.response;\n }\n\n getType(): string {\n return this._xhr.responseType;\n }\n\n getContentType(): string | null {\n return this.getHeader(\"Content-Type\");\n }\n\n getText(): string {\n return this._xhr.responseText;\n }\n\n getJson(): any {\n return JSON.parse(this._xhr.responseText);\n }\n\n getXml(): Document | null {\n return this._xhr.responseXML;\n }\n\n}\n\n\nexport interface HttpProgress {\n loaded: number;\n total?: number;\n}\n\nexport type HttpMethod =\n | \"GET\"\n | \"POST\"\n | \"PUT\"\n | \"DELETE\"\n | \"PATCH\"\n | \"HEAD\"\n | \"CONNECT\"\n | \"OPTIONS\"\n | \"TRACE\";\n\nexport type HttpResponseType =\n | \"arraybuffer\"\n | \"blob\"\n | \"document\"\n | \"json\"\n | \"text\";\n\nexport const authBasic = (login: string, password: string) => (req: HttpRequest) => {\n req.headers({ \"Authorization\": \"Basic \" + btoa(login + \":\" + password) });\n};\n\nexport const authJwt = (jwt: string) => (req: HttpRequest) => {\n req.headers({ \"Authorization\": \"Bearer \" + jwt });\n};\n\nexport class HttpRequest {\n\n static readonly xhrs: HttpRequest[] = [];\n\n static onRequest?: (request: HttpRequest) => void;\n static onResponse?: (response: HttpResponse) => void;\n static onError?: (e: Event) => void;\n\n static abortAll() {\n HttpRequest.xhrs.forEach(x => x.abort());\n HttpRequest.xhrs.length = 0;\n }\n\n private _url?: string;\n private _query?: Object;\n private _method: HttpMethod = \"GET\";\n private _headers: { [key: string]: string } = {};\n private _timeout?: number;\n private _responseType?: HttpResponseType;\n\n private _onProgress?: (progress: HttpProgress) => void;\n private _onResponse?: (response: HttpResponse) => void;\n private _onError?: (e?: Event) => void;\n\n private _xhr?: XMLHttpRequest;\n private _async: boolean = true;\n private _noCache: boolean = false;\n\n get(url: string, query?: Object): this {\n this.method(\"GET\");\n this.url(url, query);\n return this;\n }\n\n post(url: string, query?: Object): this {\n this.method(\"POST\");\n this.url(url, query);\n return this;\n }\n\n put(url: string, query?: Object): this {\n this.method(\"PUT\");\n this.url(url, query);\n return this;\n }\n\n patch(url: string, query?: Object): this {\n this.method(\"PATCH\");\n this.url(url, query);\n return this;\n }\n\n del(url: string, query?: Object): this {\n this.method(\"DELETE\");\n this.url(url, query);\n return this;\n }\n\n url(url: string, query?: Object): this {\n this._url = url;\n this._query = query;\n return this;\n }\n\n method(method: HttpMethod): this {\n this._method = method;\n return this;\n }\n\n headers(headers: { [key: string]: string }): this {\n for (const key in headers) {\n if (headers.hasOwnProperty(key)) {\n this._headers[key] = headers[key];\n }\n }\n return this;\n }\n\n use(middleware: (req: HttpRequest) => void): this {\n middleware(this);\n return this;\n }\n\n timeout(timeout: number): this {\n this._timeout = timeout;\n return this;\n }\n\n responseType(type: HttpResponseType): this {\n this._responseType = type;\n return this;\n }\n\n onProgress(onProgress: (progress: HttpProgress) => void): this {\n this._onProgress = onProgress;\n return this;\n }\n\n onResponse(onResponse: (response: HttpResponse) => void): this {\n this._onResponse = onResponse;\n return this;\n }\n\n onError(onError: (e?: Event) => void): this {\n this._onError = onError;\n return this;\n }\n\n async(async: boolean = true): this {\n this._async = async;\n return this;\n }\n\n noCache(noCache: boolean = true): this {\n this._noCache = noCache;\n return this;\n }\n\n abort(): this {\n if (this._xhr) {\n this._xhr.abort();\n }\n return this;\n }\n\n send(data?: any, contentType?: string): void {\n if (contentType) {\n this._headers[\"Content-Type\"] = contentType;\n }\n // this._headers[\"X-Requested-With\"] = \"XMLHttpRequest\";\n this._send(data, this._headers);\n }\n\n sendPromise(data?: any, contentType?: string): Promise<HttpResponse> {\n return new Promise<HttpResponse>((res, rej) => {\n this._onResponse = res;\n this._onError = rej;\n if (contentType) {\n this._headers[\"Content-Type\"] = contentType;\n }\n this._send(data, this._headers);\n });\n }\n\n private _send(data?: any, headers?: { [key: string]: string }): void {\n const xhr = new XMLHttpRequest();\n this._xhr = xhr;\n\n let url = this._url ?? \"\";\n if (this._query) {\n const query = encodeUrlQuery(this._query);\n url = query ? `${url}?${query}` : url;\n }\n if (this._noCache) {\n url += (/\\?/.test(url) ? \"&\" : \"?\") + new Date().getTime();\n }\n // console.debug(\"HttpRequest: \" + this._method + \" \" + url, data);\n\n if (this._responseType) {\n this._xhr.responseType = this._responseType;\n }\n\n if (\"onprogress\" in xhr) {\n if (this._onProgress) {\n const onprogress = (e: ProgressEvent) => {\n this._onProgress!({\n loaded: e.loaded,\n total: e.lengthComputable ? e.total : undefined\n });\n };\n xhr.upload.onprogress = onprogress;\n xhr.onprogress = onprogress;\n }\n }\n\n HttpRequest.xhrs.push(this);\n\n xhr.open(this._method, url, this._async);\n\n for (const header in headers) {\n if (headers.hasOwnProperty(header)) {\n xhr.setRequestHeader(header, headers[header]);\n }\n }\n\n if (this._timeout) {\n xhr.timeout = this._timeout;\n }\n\n if (\"ontimeout\" in xhr) {\n if (this._onError || HttpRequest.onError) {\n xhr.ontimeout = (e: ProgressEvent) => {\n HttpRequest.onError && HttpRequest.onError(e);\n this._onError && this._onError(e);\n };\n }\n }\n\n if (\"onabort\" in xhr) {\n if (this._onError || HttpRequest.onError) {\n xhr.onabort = (e: ProgressEvent) => {\n HttpRequest.onError && HttpRequest.onError(e);\n this._onError && this._onError(e);\n };\n }\n }\n\n if (this._onError || HttpRequest.onError) {\n xhr.onerror = (e: ProgressEvent) => {\n HttpRequest.onError && HttpRequest.onError(e);\n this._onError && this._onError(e);\n };\n }\n\n if (this._async) {\n if (\"onload\" in xhr) {\n xhr.onload = (e: ProgressEvent) => {\n (HttpRequest as any).xhrs = HttpRequest.xhrs.filter(x => this !== x);\n if (xhr.status >= 200 && xhr.status < 300) {\n const respone = new HttpResponse(xhr);\n if (HttpRequest.onResponse) {\n HttpRequest.onResponse(respone);\n }\n if (this._onResponse) {\n this._onResponse(respone);\n }\n } else {\n if (HttpRequest.onError) {\n HttpRequest.onError(e);\n }\n if (this._onError) {\n this._onError(e);\n }\n }\n };\n } else {\n // legacy\n (xhr as any).onreadystatechange = (e: Event) => {\n switch ((xhr as any).readyState) {\n // 0 UNSENT Client has been created. open() not called yet.\n // 1 OPENED open() has been called.\n // 2 HEADERS_RECEIVED send() has been called, and headers and status are available.\n // 3 LOADING Downloading; responseText holds partial data.\n // 4 DONE The operation is complete.\n // case 3: // loading\n // if (this._onProgress) {\n // this._onProgress(new HttpResponse(httpRequest));\n // }\n // break;\n case 4: // done\n (HttpRequest as any).xhrs = HttpRequest.xhrs.filter(x => this !== x);\n // const httpStatusOk = xhr.status >= 200 && xhr.status < 300;\n // schemes other than http/https (file, ftp)\n // const fileFtpStatusOk = xhr.status === 0 && !this._url.match(/^https?:\\/\\//);\n // const fileFtpStatusOk = xhr.status === 0 && !xhr.responseURL.match(/^https?:\\/\\//);\n // if (httpStatusOk || fileFtpStatusOk) {\n if ((xhr as any).status >= 200 && (xhr as any).status < 300) {\n const respone = new HttpResponse(xhr);\n if (HttpRequest.onResponse) {\n HttpRequest.onResponse(respone);\n }\n if (this._onResponse) {\n this._onResponse(respone);\n }\n } else {\n if (HttpRequest.onError) {\n HttpRequest.onError(e);\n }\n if (this._onError) {\n this._onError(e);\n }\n }\n break;\n default:\n }\n };\n }\n\n if (data !== undefined) {\n if (\n typeof data === \"string\" ||\n data instanceof FormData ||\n data instanceof Blob\n ) {\n xhr.send(data);\n } else {\n if (!this._headers[\"Content-Type\"]) {\n xhr.setRequestHeader(\"Content-Type\", \"application/json\");\n }\n xhr.send(JSON.stringify(data));\n }\n } else {\n xhr.send();\n }\n } else {\n if (data) {\n const payload = (typeof data === \"string\") ? data : JSON.stringify(data);\n xhr.send(payload);\n } else {\n xhr.send();\n }\n return JSON.parse(xhr.responseText);\n }\n }\n\n}\n\n\nexport function httpGet(url: string, query?: Object): HttpRequest {\n return new HttpRequest().method(\"GET\").url(url, query);\n}\n\nexport function httpPost(url: string, query?: Object): HttpRequest {\n return new HttpRequest().method(\"POST\").url(url, query);\n}\n\nexport function httpPut(url: string, query?: Object): HttpRequest {\n return new HttpRequest().method(\"PUT\").url(url, query);\n}\n\nexport function httpPatch(url: string, query?: Object): HttpRequest {\n return new HttpRequest().method(\"PATCH\").url(url, query);\n}\n\nexport function httpDelete(url: string, query?: Object): HttpRequest {\n return new HttpRequest().method(\"DELETE\").url(url, query);\n}\n\nexport function httpOnRequest(onRequest: (req: HttpRequest) => void): void {\n HttpRequest.onRequest = onRequest;\n}\n\nexport function httpOnResponse(onResponse: (req: HttpResponse) => void): void {\n HttpRequest.onResponse = onResponse;\n}\n\nexport function httpOnError(onError: (req: Event) => void): void {\n HttpRequest.onError = onError;\n}\n\nexport const http = {\n get: httpGet,\n post: httpPost,\n put: httpPut,\n patch: httpPatch,\n delete: httpDelete,\n onRequest: httpOnRequest,\n onResponse: httpOnResponse,\n onError: httpOnError\n};\n","import { authBasic, authJwt, http } from \"../src/http\";\n\nhttp.onRequest(req => {\n req.headers({ \"X-Requested-With\": \"XMLHttpRequest\" });\n console.log(req);\n});\n\nhttp.onResponse(res => {\n console.log(res);\n});\n\nhttp.onError(e => {\n console.log(e);\n});\n\nhttp.get(\"http://date.jsontest.com\")\n // .use(authBasic(\"login\", \"passwd\"))\n // .use(authJwt(\"JWT-auth-tocken\"))\n .onProgress(progress => {\n console.log(\"progress: \", progress);\n })\n .onResponse(response => {\n console.log(\"response: \" + response.getContentType(), response.getBody());\n })\n .onError(error => {\n console.log(\"response error: \", error);\n })\n .noCache()\n .send();\n\nhttp.get(\"http://date.jsontest.com\")\n .onProgress(progress => {\n console.log(\"progress: \", progress);\n })\n .noCache()\n .sendPromise()\n .then(response => {\n console.log(\"response: \" + response.getContentType(), response.getBody());\n })\n .catch(error => {\n console.log(\"response error: \", error);\n });\n\n// get(\"https://maps.googleapis.com/maps/api/geocode/json\", {\n// sensor: false,\n// address: \"Bratislava I\",\n// xxx: [\"yyy\", \"zzz\"]\n// })\n// // .timeout(10)\n// .onProgress(progress => {\n// console.log(\"response progress: \", progress);\n// })\n// .onResponse(response => {\n// console.log(\"response: \" + response.getContentType(), response.getJson());\n// })\n// .onError(error => {\n// console.log(\"response error: \", error);\n// })\n// .noCache()\n// // .headers({\"Content-Type\": \"application/json\"})\n// // .send(data, \"application/json\");\n// .send();\n\n// dd if=/dev/urandom of=http_demp.bigfile bs=1M count=100\n// get(\"http_demp.bigfile\")\n// .onProgress(progress => {\n// console.log(\"progress: \", progress);\n// })\n// .onResponse(response => {\n// console.log(\"response: \" + response.getContentType(), response);\n// })\n// .onError(error => {\n// console.log(\"response error: \", error);\n// })\n// .noCache()\n// .send();\n\n\n// HttpRequest.abortAll();\n"],"names":["$b0a183df1ec8d297$export$1d94dfe0d9d1f1e7","getHeaders","this","_xhr","getAllResponseHeaders","getHeader","header","getResponseHeader","getBody","response","getType","responseType","getContentType","getText","responseText","getJson","JSON","parse","getXml","responseXML","constructor","xhr","$b0a183df1ec8d297$export$7587955500404ec3","static","xhrs","forEach","x","abort","length","get","url","query","method","post","put","patch","del","_url","_query","_method","headers","key","hasOwnProperty","_headers","use","middleware","timeout","_timeout","type","_responseType","onProgress","_onProgress","onResponse","_onResponse","onError","_onError","async","_async","noCache","_noCache","send","data","contentType","_send","sendPromise","Promise","res","rej","XMLHttpRequest","_a","key_value_pairs","value","obj","Array","isArray","undefined","indexOf","propertyIsEnumerable","item","push","stringify","pair","j","encodeURIComponent","join","$b0a183df1ec8d297$export$6c9b9e72a9438aa2","test","Date","getTime","onprogress","e","loaded","total","lengthComputable","upload","open","setRequestHeader","ontimeout","onabort","onerror","payload","onload","filter","status","respone","onreadystatechange","readyState","FormData","Blob","$b0a183df1ec8d297$export$7d6f1c8842f9f527","delete","onRequest","req","console","log","progress","error","then","catch"],"version":3,"file":"http_demo.8e435f23.js.map"}