defuss 2.1.11 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (278) hide show
  1. package/dist/component-registry-CPBzgkm2.cjs +20 -0
  2. package/dist/component-registry-rwX6GHzq.mjs +15 -0
  3. package/dist/dom--qQgTXnx.mjs +2603 -0
  4. package/dist/dom-0JFHc2kn.cjs +2810 -0
  5. package/dist/dom-4vhaViIf.mjs +2801 -0
  6. package/dist/dom-5V9JcMrR.mjs +2695 -0
  7. package/dist/dom-B0lpSx0p.mjs +2604 -0
  8. package/dist/dom-B0mZwIcb.cjs +2859 -0
  9. package/dist/dom-B4MQngSF.cjs +2782 -0
  10. package/dist/dom-B58Ij3VD.cjs +2907 -0
  11. package/dist/dom-B5zbx-3T.mjs +2810 -0
  12. package/dist/dom-B6fFOlKv.cjs +2898 -0
  13. package/dist/dom-B7UqtWqL.cjs +2814 -0
  14. package/dist/dom-BDL4winW.cjs +2892 -0
  15. package/dist/dom-BHi3SKvU.mjs +2595 -0
  16. package/dist/dom-BMSWQp9d.cjs +2899 -0
  17. package/dist/dom-BOjwen4W.cjs +2894 -0
  18. package/dist/dom-BSXG5cMV.mjs +2678 -0
  19. package/dist/dom-BUUPuzZG.cjs +2681 -0
  20. package/dist/dom-BW8oGJV-.cjs +2890 -0
  21. package/dist/dom-B_g5muLk.mjs +2798 -0
  22. package/dist/dom-Ba8Rmsy6.mjs +2557 -0
  23. package/dist/dom-BaaPAgsv.mjs +2569 -0
  24. package/dist/dom-Bb17xYzx.mjs +2599 -0
  25. package/dist/dom-BcW3GkDu.cjs +2897 -0
  26. package/dist/dom-BfqchTxj.mjs +2696 -0
  27. package/dist/dom-Bg0Eqh-g.cjs +2718 -0
  28. package/dist/dom-Bi5Eowqw.cjs +2728 -0
  29. package/dist/dom-BjFpmoeW.mjs +2818 -0
  30. package/dist/dom-BjwVMyGv.mjs +2644 -0
  31. package/dist/dom-Bjy_d0D1.mjs +2652 -0
  32. package/dist/dom-BkrsFnv4.mjs +2719 -0
  33. package/dist/dom-Bl9sFsMf.mjs +2797 -0
  34. package/dist/dom-BpugjT-d.cjs +2764 -0
  35. package/dist/dom-BzcdRPS7.cjs +2676 -0
  36. package/dist/dom-C1Dv_k31.cjs +2831 -0
  37. package/dist/dom-C2miKN96.cjs +2887 -0
  38. package/dist/dom-C3iIctYx.cjs +2602 -0
  39. package/dist/dom-C6c71RsI.cjs +2892 -0
  40. package/dist/dom-C6qPzZDU.mjs +2526 -0
  41. package/dist/dom-C91wPWgb.mjs +2587 -0
  42. package/dist/dom-CEEtTZJb.cjs +2891 -0
  43. package/dist/dom-CG8ZC5zA.cjs +2645 -0
  44. package/dist/dom-CHfN0q0-.cjs +2805 -0
  45. package/dist/dom-CLpZk5Ok.cjs +2890 -0
  46. package/dist/dom-CMwQ9pmp.cjs +2767 -0
  47. package/dist/dom-COTHhb5r.mjs +2634 -0
  48. package/dist/dom-CRRoa52F.mjs +2805 -0
  49. package/dist/dom-CUHgK6d1.mjs +2807 -0
  50. package/dist/dom-CfCTjzif.mjs +2803 -0
  51. package/dist/dom-Cg17fK2D.mjs +2490 -0
  52. package/dist/dom-CjffEyZp.mjs +2809 -0
  53. package/dist/dom-Cn7eypGU.cjs +2898 -0
  54. package/dist/dom-CoBIe6TZ.mjs +2685 -0
  55. package/dist/dom-Cr99biSm.mjs +2795 -0
  56. package/dist/dom-CuPnZIwb.mjs +2803 -0
  57. package/dist/dom-CyaFGBis.cjs +2897 -0
  58. package/dist/dom-CzDaYcdd.cjs +2896 -0
  59. package/dist/dom-D-M2CWHK.cjs +2805 -0
  60. package/dist/dom-D00lHhSQ.cjs +2887 -0
  61. package/dist/dom-DA76MFiR.mjs +2808 -0
  62. package/dist/dom-DCxc_aGE.mjs +2634 -0
  63. package/dist/dom-DDB7B6E0.mjs +2801 -0
  64. package/dist/dom-DDtrH45u.cjs +2673 -0
  65. package/dist/dom-DKZZG5RP.mjs +2798 -0
  66. package/dist/dom-DOswyRty.mjs +2681 -0
  67. package/dist/dom-DQiJQigd.cjs +2890 -0
  68. package/dist/dom-DRUJMjpd.cjs +2736 -0
  69. package/dist/dom-DU3JvIZO.cjs +2886 -0
  70. package/dist/dom-DWDVSwjd.cjs +2566 -0
  71. package/dist/dom-D_3LE_Qi.mjs +2722 -0
  72. package/dist/dom-DbhNF_Km.cjs +2665 -0
  73. package/dist/dom-Deh17qfR.mjs +2795 -0
  74. package/dist/dom-DfIL_s0t.mjs +2634 -0
  75. package/dist/dom-DhzvIchP.cjs +2680 -0
  76. package/dist/dom-DjEOa9GM.mjs +2801 -0
  77. package/dist/dom-DqWHLuln.cjs +2763 -0
  78. package/dist/dom-Dw0cUaXk.cjs +2717 -0
  79. package/dist/dom-FaIf556X.mjs +2801 -0
  80. package/dist/dom-Kdtm5aoM.mjs +2798 -0
  81. package/dist/dom-O2cdv0jV.cjs +2887 -0
  82. package/dist/dom-YfFA0iKZ.mjs +2726 -0
  83. package/dist/dom-YpZtMxDS.cjs +2783 -0
  84. package/dist/dom-YuuCUzeb.mjs +2744 -0
  85. package/dist/dom-_naqXmaM.mjs +2677 -0
  86. package/dist/dom-iQGpbrON.cjs +2718 -0
  87. package/dist/dom-j57Lsb1X.cjs +2884 -0
  88. package/dist/dom-jKUS5flE.mjs +2771 -0
  89. package/dist/dom-khd7HASe.cjs +2771 -0
  90. package/dist/dom-lEWdDKb4.mjs +2718 -0
  91. package/dist/dom-mA0CVs3o.mjs +2809 -0
  92. package/dist/dom-mt5spBGS.cjs +2634 -0
  93. package/dist/dom-rjEgJGTC.cjs +2806 -0
  94. package/dist/dom-smXiaXEP.mjs +2718 -0
  95. package/dist/dom-wcIpcL6F.mjs +2807 -0
  96. package/dist/dom-xtwhQmkx.cjs +2884 -0
  97. package/dist/dom-xu1m78jm.mjs +2808 -0
  98. package/dist/index-B4BHyohJ.d.ts +1536 -0
  99. package/dist/index-BDnHS4Fq.d.ts +1425 -0
  100. package/dist/index-BENswTvz.d.ts +1505 -0
  101. package/dist/index-BFHuQ4xu.d.ts +1435 -0
  102. package/dist/index-BM5mxtvJ.d.ts +1543 -0
  103. package/dist/index-BOHKDFwH.d.ts +1435 -0
  104. package/dist/index-BRnR4FIe.d.ts +1436 -0
  105. package/dist/index-B_mKPzYo.d.ts +1578 -0
  106. package/dist/index-BctcSoO5.d.ts +1576 -0
  107. package/dist/index-BfvJsCS_.d.ts +1426 -0
  108. package/dist/index-BhNZrSrs.d.ts +1352 -0
  109. package/dist/index-Bi8j-_h_.d.cts +1488 -0
  110. package/dist/index-Bi8j-_h_.d.ts +1488 -0
  111. package/dist/index-BkobKBZk.d.ts +1430 -0
  112. package/dist/index-Bu2vwaJ2.d.ts +1352 -0
  113. package/dist/index-BvvZRMKD.d.ts +1569 -0
  114. package/dist/index-C1AAn__7.d.ts +1433 -0
  115. package/dist/index-C6Eg-vsd.d.ts +1424 -0
  116. package/dist/index-C6OhaPcR.d.ts +1433 -0
  117. package/dist/index-CCeP2S3d.d.ts +1434 -0
  118. package/dist/index-CEIsFrMM.d.ts +1542 -0
  119. package/dist/index-CFDpKGh7.d.ts +1428 -0
  120. package/dist/index-CFrYY_Mt.d.ts +1436 -0
  121. package/dist/index-CGDnSWTS.d.ts +1527 -0
  122. package/dist/index-CKwxYOvH.d.ts +1437 -0
  123. package/dist/index-CLBqO3Y7.d.ts +1544 -0
  124. package/dist/index-CRsLiENw.d.ts +1436 -0
  125. package/dist/index-CTjaPtOu.d.ts +1544 -0
  126. package/dist/index-CWP_xArI.d.ts +1433 -0
  127. package/dist/index-CZunST0r.d.ts +1436 -0
  128. package/dist/index-CeqDyZsK.d.ts +1436 -0
  129. package/dist/index-CiDj5eUV.d.ts +1576 -0
  130. package/dist/index-CidSP07o.d.ts +1361 -0
  131. package/dist/index-Cj_9DtdX.d.ts +1436 -0
  132. package/dist/index-Cm1e5jei.d.ts +1436 -0
  133. package/dist/index-CnQ2vhtJ.d.ts +1563 -0
  134. package/dist/index-CpkEL1jH.d.ts +1569 -0
  135. package/dist/index-Cq5d1Zz3.d.ts +1437 -0
  136. package/dist/index-CuCNTbJn.d.ts +1503 -0
  137. package/dist/index-CxFq13gU.d.ts +1352 -0
  138. package/dist/index-D5dNz_3e.d.ts +1571 -0
  139. package/dist/index-D5yYZNhb.d.ts +1428 -0
  140. package/dist/index-D64A9cbc.d.ts +1428 -0
  141. package/dist/index-DE8BSmm3.d.ts +1575 -0
  142. package/dist/index-DG6bq7_g.d.ts +1436 -0
  143. package/dist/index-DHy5_GN-.d.ts +1437 -0
  144. package/dist/index-DTegsEZx.d.ts +1435 -0
  145. package/dist/index-DXx9mqPm.d.ts +1352 -0
  146. package/dist/index-DbOTogCX.d.ts +1435 -0
  147. package/dist/index-DfXUO0lq.d.ts +1352 -0
  148. package/dist/index-DirmTpEb.d.ts +1352 -0
  149. package/dist/index-DnUO13Ql.d.ts +1365 -0
  150. package/dist/index-DqFnifuO.d.ts +1576 -0
  151. package/dist/index-DsAkAm0h.d.ts +1429 -0
  152. package/dist/index-DsDkGdbl.d.ts +1352 -0
  153. package/dist/index-DugBnSpg.d.ts +1439 -0
  154. package/dist/index-DyF8SurV.d.ts +1437 -0
  155. package/dist/index-VAwbjQuD.d.ts +1436 -0
  156. package/dist/index-VRdwaTq1.d.ts +1544 -0
  157. package/dist/index-WJDLtNz6.d.ts +1437 -0
  158. package/dist/index-XHQiCZJu.d.ts +1344 -0
  159. package/dist/index-YGI08ZC3.d.ts +1435 -0
  160. package/dist/index-YlvmjCMz.d.ts +1574 -0
  161. package/dist/index-_R_iWuBk.d.ts +1435 -0
  162. package/dist/index-bKRdI8Js.d.ts +1544 -0
  163. package/dist/index-sdb3nXP9.d.ts +1436 -0
  164. package/dist/index-u8kUqFhR.d.ts +1442 -0
  165. package/dist/index-uCL6lDoN.d.ts +1365 -0
  166. package/dist/index-wMtGrbTW.d.ts +1435 -0
  167. package/dist/index-wmq1KsvF.d.ts +1523 -0
  168. package/dist/index.cjs +298 -92
  169. package/dist/index.d.cts +6 -5
  170. package/dist/index.d.ts +198 -35
  171. package/dist/index.mjs +277 -94
  172. package/dist/mount--bdP_py-.cjs +27 -0
  173. package/dist/mount-5mGNlNE0.cjs +29 -0
  174. package/dist/mount-9aJ90VEy.cjs +29 -0
  175. package/dist/mount-B-nSxYMI.cjs +29 -0
  176. package/dist/mount-B1ZGm6Vx.mjs +26 -0
  177. package/dist/mount-B268CIyG.mjs +26 -0
  178. package/dist/mount-B7ZORKUE.mjs +26 -0
  179. package/dist/mount-BDMCcckP.mjs +26 -0
  180. package/dist/mount-BFwjtKGf.mjs +23 -0
  181. package/dist/mount-BIX7Q5ve.cjs +29 -0
  182. package/dist/mount-BIjY0oQo.cjs +29 -0
  183. package/dist/mount-BJ2d7Snl.cjs +29 -0
  184. package/dist/mount-BJUfLVrn.cjs +27 -0
  185. package/dist/mount-BL3IoYf-.cjs +29 -0
  186. package/dist/mount-BLgGRFKO.mjs +26 -0
  187. package/dist/mount-BPdF-23b.mjs +26 -0
  188. package/dist/mount-BREA5x3R.mjs +26 -0
  189. package/dist/mount-BSj7I235.cjs +29 -0
  190. package/dist/mount-BSqj-PWe.cjs +26 -0
  191. package/dist/mount-B_MohJp1.mjs +24 -0
  192. package/dist/mount-BhJaAQYc.cjs +29 -0
  193. package/dist/mount-BmhdXDtN.mjs +26 -0
  194. package/dist/mount-Bn8gK_5W.mjs +26 -0
  195. package/dist/mount-BnITFgq_.mjs +26 -0
  196. package/dist/mount-BoeMXBAs.cjs +29 -0
  197. package/dist/mount-BsWXMcQo.mjs +26 -0
  198. package/dist/mount-BvArK3iG.cjs +26 -0
  199. package/dist/mount-Bw7-xmEB.mjs +24 -0
  200. package/dist/mount-BwNr0Cw7.cjs +29 -0
  201. package/dist/mount-C1WHPtGU.mjs +26 -0
  202. package/dist/mount-C6Wj_FWd.cjs +29 -0
  203. package/dist/mount-C7-zVnHp.mjs +26 -0
  204. package/dist/mount-C99AnUyn.mjs +24 -0
  205. package/dist/mount-CC8_T-gT.cjs +29 -0
  206. package/dist/mount-CE1mUC04.cjs +27 -0
  207. package/dist/mount-CGOXBqpC.cjs +29 -0
  208. package/dist/mount-CJGmuyD_.cjs +29 -0
  209. package/dist/mount-COdfKsz3.mjs +26 -0
  210. package/dist/mount-CTXA2JwJ.cjs +29 -0
  211. package/dist/mount-CVcZv8p4.mjs +24 -0
  212. package/dist/mount-CY2jiisH.cjs +27 -0
  213. package/dist/mount-C_THF3G-.mjs +26 -0
  214. package/dist/mount-CgYRpExe.mjs +24 -0
  215. package/dist/mount-CiSuPb2d.cjs +29 -0
  216. package/dist/mount-CjvdhG7D.mjs +24 -0
  217. package/dist/mount-Ck4Sw7qu.cjs +29 -0
  218. package/dist/mount-CkBH-ziv.mjs +26 -0
  219. package/dist/mount-Cl5bq4AK.mjs +26 -0
  220. package/dist/mount-CnRlxDvH.cjs +26 -0
  221. package/dist/mount-Cnhy4x8j.cjs +29 -0
  222. package/dist/mount-CofCsKEL.cjs +27 -0
  223. package/dist/mount-CuZ9kuJ_.cjs +29 -0
  224. package/dist/mount-Cz18Dqhg.cjs +29 -0
  225. package/dist/mount-CzoPJJ3U.cjs +29 -0
  226. package/dist/mount-D-08N9KC.mjs +26 -0
  227. package/dist/mount-D-RpVmv-.cjs +27 -0
  228. package/dist/mount-D0wRLhsJ.mjs +23 -0
  229. package/dist/mount-DBHsNvGL.mjs +24 -0
  230. package/dist/mount-DE_6OU5O.cjs +27 -0
  231. package/dist/mount-DFrJC1Ee.mjs +26 -0
  232. package/dist/mount-DRpQI95j.mjs +26 -0
  233. package/dist/mount-DaS_nGtr.cjs +26 -0
  234. package/dist/mount-DbFi8R0Q.mjs +26 -0
  235. package/dist/mount-DeqZS1eY.mjs +26 -0
  236. package/dist/mount-DetJmqRg.mjs +26 -0
  237. package/dist/mount-DhMUtUgA.cjs +29 -0
  238. package/dist/mount-DlsFpu0l.mjs +26 -0
  239. package/dist/mount-DmThSQhX.mjs +26 -0
  240. package/dist/mount-DpCAhV34.cjs +29 -0
  241. package/dist/mount-DqMUI3Li.cjs +29 -0
  242. package/dist/mount-DrvT4c9H.mjs +23 -0
  243. package/dist/mount-DyrgmigG.mjs +26 -0
  244. package/dist/mount-E-PFWZoH.cjs +29 -0
  245. package/dist/mount-EbSuNkcp.cjs +29 -0
  246. package/dist/mount-FGWwjyl3.mjs +23 -0
  247. package/dist/mount-NvaShFIJ.mjs +24 -0
  248. package/dist/mount-OwEsrEgH.mjs +26 -0
  249. package/dist/mount-OzbDDNzG.cjs +29 -0
  250. package/dist/mount-TA9rAjfX.mjs +26 -0
  251. package/dist/mount-Ta6JNwOd.cjs +29 -0
  252. package/dist/mount-WayWo_Wo.cjs +29 -0
  253. package/dist/mount-cbdw4Rn8.mjs +26 -0
  254. package/dist/mount-euC2wM_H.mjs +26 -0
  255. package/dist/mount-gY0N84Yl.cjs +29 -0
  256. package/dist/mount-j5GGTHgL.mjs +26 -0
  257. package/dist/mount-lrm6DtLS.cjs +29 -0
  258. package/dist/mount-mI6oAeYn.mjs +26 -0
  259. package/dist/mount-qXpzCgOn.cjs +27 -0
  260. package/dist/mount-s4KN8Ng-.mjs +26 -0
  261. package/dist/mount-wMBAOpuQ.mjs +26 -0
  262. package/dist/mount-yB4RTAZ9.cjs +29 -0
  263. package/dist/mount-zEZORNEX.mjs +26 -0
  264. package/dist/mount-zk9YB0XU.cjs +29 -0
  265. package/dist/render/client.cjs +28 -11
  266. package/dist/render/client.d.ts +4 -4
  267. package/dist/render/client.mjs +13 -13
  268. package/dist/render/dev/index.cjs +4 -1
  269. package/dist/render/dev/index.d.ts +2 -3
  270. package/dist/render/dev/index.mjs +1 -1
  271. package/dist/render/index.cjs +20 -1
  272. package/dist/render/index.d.cts +76 -1
  273. package/dist/render/index.d.ts +88 -3
  274. package/dist/render/index.mjs +2 -1
  275. package/dist/render/server.cjs +19 -1
  276. package/dist/render/server.d.ts +4 -4
  277. package/dist/render/server.mjs +3 -2
  278. package/package.json +19 -11
package/dist/index.cjs CHANGED
@@ -1,9 +1,10 @@
1
1
  'use strict';
2
2
 
3
- var dom = require('./dom-B1qmM5mC.cjs');
3
+ var dom = require('./dom-B58Ij3VD.cjs');
4
+ var mount = require('./mount-WayWo_Wo.cjs');
4
5
  require('defuss-runtime');
5
6
 
6
- const inDevMode = true;
7
+ const inDevMode = typeof process !== "undefined" && process.env ? process.env.NODE_ENV !== "production" : false;
7
8
 
8
9
  const VARIABLE_REGEX = /{([^}]*)}/g;
9
10
  const DOUBLE_BRACE_REGEX = /\{\{([^}]*)\}\}/g;
@@ -32,7 +33,7 @@ const createI18n = () => {
32
33
  get language() {
33
34
  return language;
34
35
  },
35
- changeLanguage(newLanguage) {
36
+ changeLanguage: (newLanguage) => {
36
37
  if (newLanguage !== language) {
37
38
  language = newLanguage;
38
39
  onLanguageChangeCallbacks.forEach((callback) => {
@@ -43,7 +44,7 @@ const createI18n = () => {
43
44
  // example usage of the t function with placeholders:
44
45
  // const translatedString = t('greeting', { name: 'John', age: '30' }, 'common');
45
46
  // this would replace placeholders {name} and {age} in the translation string with 'John' and '30' respectively.
46
- t(path, replacements = {}) {
47
+ t: (path, replacements = {}) => {
47
48
  const languageData = translationsStore.get(language);
48
49
  if (!languageData) {
49
50
  return path;
@@ -68,7 +69,7 @@ const createI18n = () => {
68
69
  }
69
70
  return interpolate(template, replacements);
70
71
  },
71
- loadLanguage(newLanguage, namespaceTranslations) {
72
+ loadLanguage: (newLanguage, namespaceTranslations) => {
72
73
  translationsStore.set(newLanguage, {
73
74
  ...translationsStore.get(newLanguage),
74
75
  ...namespaceTranslations
@@ -94,12 +95,12 @@ if (!globalThis.__defuss_i18n) {
94
95
  globalThis.__defuss_i18n = createI18n();
95
96
  }
96
97
  const i18n = globalThis.__defuss_i18n;
97
- const t = i18n.t.bind(i18n);
98
- const changeLanguage = i18n.changeLanguage.bind(i18n);
99
- const loadLanguage = i18n.loadLanguage.bind(i18n);
98
+ const t = i18n.t;
99
+ const changeLanguage = i18n.changeLanguage;
100
+ const loadLanguage = i18n.loadLanguage;
100
101
  const getLanguage = () => i18n.language;
101
102
 
102
- const Trans = ({
103
+ const createTrans = (i18n) => ({
103
104
  key,
104
105
  values,
105
106
  tag,
@@ -138,25 +139,92 @@ const Trans = ({
138
139
  onUnmount
139
140
  },
140
141
  // initially render
141
- children: i18n.t(key, values)
142
+ children: [i18n.t(key, values)]
142
143
  };
143
144
  };
145
+ const Trans = createTrans(i18n);
144
146
  const T = Trans;
145
147
 
146
148
  const tokenizePath = (path) => {
147
- const paramNameRegexp = /:([^\/\.\\]+)/g;
149
+ const paramNameRegexp = /:([a-zA-Z0-9_]+)|\*/g;
148
150
  const groups = {};
149
151
  let groupIndex = 1;
150
- const pattern = path.replace(paramNameRegexp, (_, paramName) => {
151
- groups[paramName] = groupIndex++;
152
- return "([^/.\\]+)";
153
- });
152
+ const escapeRegex = (str) => str.replace(/[.+?^${}()|[\]\\]/g, "\\$&");
153
+ let pattern = "";
154
+ let lastIndex = 0;
155
+ let match;
156
+ while ((match = paramNameRegexp.exec(path)) !== null) {
157
+ const [fullMatch, paramName] = match;
158
+ const offset = match.index;
159
+ pattern += escapeRegex(path.slice(lastIndex, offset));
160
+ if (fullMatch === "*") {
161
+ groups["wildcard"] = groupIndex++;
162
+ pattern += "(.*)";
163
+ } else {
164
+ groups[paramName] = groupIndex++;
165
+ pattern += "([^/]+)";
166
+ }
167
+ lastIndex = offset + fullMatch.length;
168
+ }
169
+ pattern += escapeRegex(path.slice(lastIndex));
170
+ if (pattern.endsWith("/")) {
171
+ pattern = pattern.slice(0, -1) + "/?";
172
+ } else if (pattern !== "") {
173
+ pattern += "/?";
174
+ }
154
175
  return {
155
176
  groups,
156
177
  regexp: new RegExp(`^${pattern}$`)
157
178
  };
158
179
  };
159
- const matchRouteRegistrations = (routeRegistrations, actualPathName, haystackPathName) => {
180
+ const parseParams = (str) => {
181
+ const params = {};
182
+ if (!str) return params;
183
+ const cleanStr = str.startsWith("?") || str.startsWith("#") ? str.slice(1) : str;
184
+ if (!cleanStr) return params;
185
+ const searchParams = new URLSearchParams(cleanStr);
186
+ for (const [key, value] of searchParams.entries()) {
187
+ params[key] = value;
188
+ }
189
+ return params;
190
+ };
191
+ const buildRouteRequest = (windowImpl, pathname, matched, matchedRoute, params = {}) => {
192
+ let protocol = "";
193
+ let domain = "";
194
+ let port = "";
195
+ let baseUrl = "";
196
+ let url = pathname;
197
+ let queryParams = {};
198
+ let hashParams = {};
199
+ if (windowImpl) {
200
+ const loc = windowImpl.location;
201
+ protocol = loc.protocol.replace(":", "");
202
+ domain = loc.hostname;
203
+ port = loc.port;
204
+ baseUrl = `${loc.protocol}//${loc.hostname}`;
205
+ if (loc.port) {
206
+ baseUrl += `:${loc.port}`;
207
+ }
208
+ url = loc.href;
209
+ queryParams = parseParams(loc.search);
210
+ hashParams = parseParams(loc.hash);
211
+ }
212
+ return {
213
+ match: matched,
214
+ matchedRoute,
215
+ protocol,
216
+ domain,
217
+ port,
218
+ baseUrl,
219
+ path: pathname,
220
+ url,
221
+ params,
222
+ queryParams,
223
+ hashParams
224
+ };
225
+ };
226
+ const matchRouteRegistrations = (routeRegistrations, actualPathName, haystackPathName, opts = {}, windowImpl) => {
227
+ const invokeHandler = opts.invokeHandler ?? true;
160
228
  for (const route of routeRegistrations) {
161
229
  if (haystackPathName && route.path !== haystackPathName) {
162
230
  continue;
@@ -164,37 +232,60 @@ const matchRouteRegistrations = (routeRegistrations, actualPathName, haystackPat
164
232
  if (route.exact && route.path !== actualPathName) {
165
233
  continue;
166
234
  }
167
- const match = route.tokenizedPath.regexp.exec(actualPathName);
168
- if (!match) continue;
235
+ const regexMatch = route.tokenizedPath.regexp.exec(actualPathName);
236
+ if (!regexMatch) {
237
+ continue;
238
+ }
169
239
  const params = {};
170
240
  for (const [paramName, groupIndex] of Object.entries(
171
241
  route.tokenizedPath.groups
172
242
  )) {
173
- params[paramName] = match[groupIndex];
243
+ params[paramName] = regexMatch[groupIndex];
174
244
  }
175
- const request = { url: actualPathName, params };
176
- if (typeof route.handler === "function") {
245
+ const request = buildRouteRequest(
246
+ windowImpl,
247
+ actualPathName,
248
+ true,
249
+ route.path,
250
+ params
251
+ );
252
+ if (invokeHandler && typeof route.handler === "function") {
177
253
  route.handler(request);
178
254
  }
179
255
  return request;
180
256
  }
181
- return false;
257
+ return buildRouteRequest(windowImpl, actualPathName, false, null);
182
258
  };
183
259
  const setupRouter = (config = {
184
260
  strategy: "page-refresh"
185
261
  // default
186
262
  }, windowImpl) => {
187
- const routeRegistrations = [];
188
- let currentPath = "";
263
+ const state = globalThis.__defuss_router_state__ ?? {
264
+ routeRegistrations: [],
265
+ currentRequest: null,
266
+ isReady: false,
267
+ pendingResolvers: [],
268
+ currentPath: "",
269
+ popAttached: false
270
+ };
271
+ const routeRegistrations = state.routeRegistrations;
189
272
  if (typeof window !== "undefined" && !windowImpl) {
190
273
  windowImpl = globalThis.__defuss_window || window;
191
274
  }
192
- if (!windowImpl && !dom.isServer()) {
193
- console.warn("Router requires a Window API implementation!");
194
- }
195
275
  if (windowImpl) {
196
- currentPath = windowImpl.document.location.pathname;
276
+ state.currentPath = windowImpl.document.location.pathname;
197
277
  }
278
+ const resolveFromLocation = (invokeHandler) => {
279
+ const pathname = windowImpl?.document.location.pathname ?? "/";
280
+ state.currentRequest = matchRouteRegistrations(
281
+ routeRegistrations,
282
+ pathname,
283
+ void 0,
284
+ { invokeHandler },
285
+ windowImpl
286
+ );
287
+ return state.currentRequest;
288
+ };
198
289
  const api = {
199
290
  ...config,
200
291
  listeners: [],
@@ -215,22 +306,49 @@ const setupRouter = (config = {
215
306
  return api;
216
307
  },
217
308
  match(path) {
218
- return matchRouteRegistrations(
309
+ const pathname = windowImpl?.document.location.pathname ?? "/";
310
+ const req = matchRouteRegistrations(
311
+ routeRegistrations,
312
+ pathname,
313
+ path,
314
+ { invokeHandler: false },
315
+ windowImpl
316
+ );
317
+ return req;
318
+ },
319
+ resolve(pathname) {
320
+ const actualPathname = pathname ?? windowImpl?.document.location.pathname ?? "/";
321
+ state.currentRequest = matchRouteRegistrations(
219
322
  routeRegistrations,
220
- windowImpl.document.location.pathname,
221
- path
323
+ actualPathname,
324
+ void 0,
325
+ { invokeHandler: false },
326
+ windowImpl
222
327
  );
328
+ return state.currentRequest;
329
+ },
330
+ getRequest() {
331
+ if (state.currentRequest) return state.currentRequest;
332
+ return resolveFromLocation(false);
223
333
  },
224
334
  navigate(newPath) {
225
335
  const strategy = api.strategy || "page-refresh";
226
- const oldPath = currentPath;
336
+ const oldPath = state.currentPath;
227
337
  if (strategy === "page-refresh") {
228
- document.location.href = newPath;
338
+ windowImpl.location.href = newPath;
229
339
  } else if (strategy === "slot-refresh") {
340
+ const pathname = newPath.split("?")[0].split("#")[0];
230
341
  if (typeof windowImpl !== "undefined") {
231
342
  windowImpl.history.pushState({}, "", newPath);
232
343
  }
233
- currentPath = newPath;
344
+ state.currentPath = pathname;
345
+ state.currentRequest = matchRouteRegistrations(
346
+ routeRegistrations,
347
+ pathname,
348
+ void 0,
349
+ { invokeHandler: false },
350
+ windowImpl
351
+ );
234
352
  queueMicrotask(() => {
235
353
  for (const listener of api.listeners) {
236
354
  listener(newPath, oldPath);
@@ -244,19 +362,39 @@ const setupRouter = (config = {
244
362
  destroy() {
245
363
  if (windowImpl && api.strategy === "slot-refresh") {
246
364
  windowImpl.removeEventListener("popstate", handlePopState);
365
+ state.popAttached = false;
247
366
  }
248
367
  },
249
368
  attachPopStateHandler() {
250
- if (windowImpl && api.strategy === "slot-refresh") {
369
+ if (windowImpl && api.strategy === "slot-refresh" && !state.popAttached) {
251
370
  windowImpl.addEventListener("popstate", handlePopState);
371
+ state.popAttached = true;
372
+ }
373
+ },
374
+ ready() {
375
+ if (state.isReady) {
376
+ return Promise.resolve();
377
+ }
378
+ return new Promise((resolve) => {
379
+ state.pendingResolvers.push(resolve);
380
+ });
381
+ },
382
+ setReady() {
383
+ if (state.isReady) return;
384
+ state.isReady = true;
385
+ resolveFromLocation(false);
386
+ for (const resolve of state.pendingResolvers) {
387
+ resolve();
252
388
  }
389
+ state.pendingResolvers = [];
253
390
  }
254
391
  };
255
392
  const handlePopState = (event) => {
256
393
  if (api.strategy === "slot-refresh" && windowImpl) {
257
394
  const newPath = windowImpl.document.location.pathname;
258
- const oldPath = currentPath;
259
- currentPath = newPath;
395
+ const oldPath = state.currentPath;
396
+ state.currentPath = newPath;
397
+ resolveFromLocation(false);
260
398
  queueMicrotask(() => {
261
399
  for (const listener of api.listeners) {
262
400
  listener(newPath, oldPath);
@@ -269,7 +407,21 @@ const setupRouter = (config = {
269
407
  }
270
408
  return api;
271
409
  };
272
- const Router = setupRouter();
410
+ const ROUTER_GLOBAL_KEY = "__defuss_router__";
411
+ const ROUTER_STATE_KEY = "__defuss_router_state__";
412
+ if (!globalThis[ROUTER_STATE_KEY]) {
413
+ globalThis[ROUTER_STATE_KEY] = {
414
+ routeRegistrations: [],
415
+ currentRequest: null,
416
+ isReady: false,
417
+ pendingResolvers: [],
418
+ currentPath: "",
419
+ popAttached: false
420
+ };
421
+ }
422
+ const getRouterState = () => globalThis[ROUTER_STATE_KEY];
423
+ const existingRouter = globalThis[ROUTER_GLOBAL_KEY];
424
+ const Router = existingRouter ?? (globalThis[ROUTER_GLOBAL_KEY] = setupRouter());
273
425
 
274
426
  const Route = ({
275
427
  path,
@@ -281,7 +433,9 @@ const Route = ({
281
433
  path,
282
434
  exact: exact || false
283
435
  });
284
- return router.match(path) ? Array.isArray(children) ? children[0] : null : null;
436
+ const req = router.match(path);
437
+ if (!req.match) return null;
438
+ return Array.isArray(children) ? children[0] : children || null;
285
439
  };
286
440
 
287
441
  const Redirect = ({
@@ -299,10 +453,12 @@ const Redirect = ({
299
453
  };
300
454
 
301
455
  const RouterSlotId = "router-slot";
456
+ const ROUTER_SLOT_GUARD = Symbol.for("defuss.RouterSlot.guard");
302
457
  const RouterSlot = ({
303
458
  router = Router,
304
459
  children,
305
460
  RouterOutlet,
461
+ id,
306
462
  transitionConfig = {
307
463
  type: "fade",
308
464
  duration: 25,
@@ -312,22 +468,37 @@ const RouterSlot = ({
312
468
  }) => {
313
469
  const { tag, ...attributesWithoutTag } = attributes;
314
470
  const ref = dom.createRef();
471
+ const slotId = id ?? RouterSlotId;
315
472
  router.strategy = "slot-refresh";
316
473
  router.attachPopStateHandler();
317
- router.onRouteChange(async () => {
318
- await dom.$(ref).update(RouterOutlet(), transitionConfig);
319
- });
320
- if (document.getElementById(RouterSlotId)) {
474
+ const r = router;
475
+ if (!r[ROUTER_SLOT_GUARD]) {
476
+ r[ROUTER_SLOT_GUARD] = true;
477
+ let lastPath = window.location.pathname;
478
+ router.onRouteChange(async () => {
479
+ const currentPath = router.getRequest().path;
480
+ const isSamePath = currentPath === lastPath;
481
+ lastPath = currentPath;
482
+ await dom.$(ref).update(
483
+ typeof RouterOutlet === "function" ? RouterOutlet() : [],
484
+ isSamePath ? void 0 : transitionConfig
485
+ );
486
+ });
487
+ }
488
+ if (document.getElementById(slotId)) {
321
489
  console.warn(
322
- `It seems there's more than one <RouterSlot /> components defined as an element with id #${RouterSlotId} already exists in the DOM.`
490
+ `It seems there's more than one <RouterSlot /> components defined as an element with id #${slotId} already exists in the DOM.`
323
491
  );
324
492
  }
493
+ queueMicrotask(() => {
494
+ router.setReady();
495
+ });
325
496
  return {
326
- children: RouterOutlet() || [],
497
+ children: [RouterOutlet() || []].flat(),
327
498
  type: attributes.tag || "div",
328
499
  attributes: {
329
500
  ...attributesWithoutTag,
330
- id: RouterSlotId,
501
+ id: slotId,
331
502
  ref
332
503
  }
333
504
  };
@@ -346,72 +517,77 @@ const Async = ({
346
517
  onError
347
518
  }) => {
348
519
  let childrenToRender = children;
520
+ let updateToken = 0;
349
521
  const containerRef = dom.createRef(
350
522
  function onSuspenseUpdate(state) {
351
- try {
352
- if (!containerRef.current) {
353
- if (inDevMode) {
354
- console.warn(
355
- "Suspense container is not mounted yet, but a state update demands a render. State is:",
356
- state
357
- );
358
- }
359
- return;
523
+ const currentToken = ++updateToken;
524
+ if (!containerRef.current) {
525
+ if (inDevMode) {
526
+ console.warn(
527
+ "Suspense container is not mounted yet, but a state update demands a render. State is:",
528
+ state
529
+ );
360
530
  }
361
- (async () => {
362
- await dom.$(containerRef.current).removeClass(
531
+ return;
532
+ }
533
+ void (async () => {
534
+ await dom.$(containerRef.current).removeClass(loadingClassName || "suspense-loading").removeClass(loadedClassName || "suspense-loaded").removeClass(errorClassName || "suspense-error");
535
+ if (currentToken !== updateToken) return;
536
+ if (!children || state === "error") {
537
+ await dom.$(containerRef.current).addClass(
538
+ errorClassName || "suspense-error"
539
+ );
540
+ if (currentToken !== updateToken) return;
541
+ await dom.$(containerRef).jsx({
542
+ type: "div",
543
+ children: ["Loading error!"]
544
+ });
545
+ } else if (state === "loading") {
546
+ await dom.$(containerRef.current).addClass(
363
547
  loadingClassName || "suspense-loading"
364
548
  );
365
- await dom.$(containerRef.current).removeClass(
549
+ if (currentToken !== updateToken) return;
550
+ if (containerRef.current && containerRef.current.childNodes.length === 0) {
551
+ if (fallback) {
552
+ await dom.$(containerRef).jsx(fallback);
553
+ } else {
554
+ await dom.$(containerRef.current).empty();
555
+ }
556
+ }
557
+ } else if (state === "loaded") {
558
+ await dom.$(containerRef.current).addClass(
366
559
  loadedClassName || "suspense-loaded"
367
560
  );
368
- await dom.$(containerRef.current).removeClass(
369
- errorClassName || "suspense-error"
370
- );
371
- if (!children || state === "error") {
372
- await dom.$(containerRef.current).addClass(
373
- errorClassName || "suspense-error"
374
- );
375
- await dom.$(containerRef).jsx({
376
- type: "div",
377
- children: ["Loading error!"]
378
- });
379
- } else if (state === "loading") {
380
- await dom.$(containerRef.current).addClass(
381
- loadingClassName || "suspense-loading"
382
- );
383
- await dom.$(containerRef).jsx(fallback);
384
- } else if (state === "loaded") {
385
- await dom.$(containerRef.current).addClass(
386
- loadedClassName || "suspense-loaded"
387
- );
388
- console.log("[Async render] start");
389
- await dom.$(containerRef).jsx(childrenToRender);
390
- console.log("[Async render] finished");
391
- }
392
- })();
393
- } catch (error) {
394
- containerRef.update("error");
561
+ if (currentToken !== updateToken) return;
562
+ await dom.$(containerRef).jsx(childrenToRender);
563
+ }
564
+ })().catch((error) => {
565
+ containerRef.updateState("error");
395
566
  containerRef.error = error;
396
567
  if (typeof onError === "function") {
397
568
  onError(error);
398
569
  }
399
- }
570
+ });
400
571
  },
401
572
  "loading"
402
573
  );
403
574
  if (dom.isRef(ref)) {
404
575
  let isInitial = true;
576
+ const outerUpdateState = ref.updateState.bind(ref);
405
577
  ref.updateState = (state) => {
578
+ outerUpdateState(state);
406
579
  if (!isInitial) {
407
580
  containerRef.updateState(state);
408
581
  }
409
582
  };
410
- ref.updateState("loading");
583
+ outerUpdateState("loading");
411
584
  isInitial = false;
412
585
  }
413
586
  const promisedChildren = (Array.isArray(children) ? children : children ? [children] : []).map((vnode) => {
414
587
  try {
588
+ if (vnode instanceof Promise) {
589
+ return vnode;
590
+ }
415
591
  if (!vnode || vnode && !vnode.type) {
416
592
  return Promise.resolve("");
417
593
  }
@@ -429,20 +605,21 @@ const Async = ({
429
605
  if (typeof onError === "function") {
430
606
  onError(error);
431
607
  }
608
+ return null;
432
609
  }
433
610
  });
434
611
  const onMount = () => {
435
612
  if (promisedChildren.length) {
436
613
  containerRef.updateState("loading");
437
614
  Promise.all(promisedChildren).then((awaitedVnodes) => {
438
- childrenToRender = awaitedVnodes.flatMap(
615
+ childrenToRender = awaitedVnodes.filter((vnode) => vnode != null).flatMap(
439
616
  (vnode) => vnode?.type === "Fragment" ? vnode.children : vnode
440
617
  );
441
618
  containerRef.updateState("loaded");
442
619
  }).catch((error) => {
443
620
  containerRef.updateState("error");
444
621
  containerRef.error = error;
445
- {
622
+ if (inDevMode) {
446
623
  console.error("SuspenseLoadingError", error);
447
624
  }
448
625
  (async () => {
@@ -456,15 +633,22 @@ const Async = ({
456
633
  };
457
634
  return {
458
635
  type: "div",
459
- attributes: { id, class: _class, className, ref: containerRef, onMount },
636
+ attributes: {
637
+ id,
638
+ class: _class,
639
+ className,
640
+ ref: containerRef,
641
+ onMount,
642
+ "data-defuss-keep": true
643
+ // Prevent sync DOM overwrite during updates
644
+ },
460
645
  children: fallback ? [fallback] : []
461
646
  };
462
647
  };
463
648
  const Suspense = Async;
464
649
 
465
- console.log(`defuss v${"2.1.11"}`);
466
-
467
650
  exports.$ = dom.$;
651
+ exports.CAPTURE_ONLY_EVENTS = dom.CAPTURE_ONLY_EVENTS;
468
652
  exports.CLASS_ATTRIBUTE_NAME = dom.CLASS_ATTRIBUTE_NAME;
469
653
  exports.Call = dom.Call;
470
654
  exports.CallChainImpl = dom.CallChainImpl;
@@ -480,6 +664,8 @@ exports.addNonChainedReturnCallNames = dom.addNonChainedReturnCallNames;
480
664
  exports.applyStyles = dom.applyStyles;
481
665
  exports.areDomNodesEqual = dom.areDomNodesEqual;
482
666
  exports.checkElementVisibility = dom.checkElementVisibility;
667
+ exports.clearDelegatedEvents = dom.clearDelegatedEvents;
668
+ exports.clearDelegatedEventsDeep = dom.clearDelegatedEventsDeep;
483
669
  exports.clearElementEvents = dom.clearElementEvents;
484
670
  exports.createCall = dom.createCall;
485
671
  exports.createGetterSetterCall = dom.createGetterSetterCall;
@@ -487,20 +673,26 @@ exports.createInPlaceErrorMessageVNode = dom.createInPlaceErrorMessageVNode;
487
673
  exports.createRef = dom.createRef;
488
674
  exports.createStore = dom.createStore;
489
675
  exports.createSubChain = dom.createSubChain;
676
+ exports.createSyncCall = dom.createSyncCall;
677
+ exports.deepEquals = dom.deepEquals;
490
678
  exports.delayedAutoStart = dom.delayedAutoStart;
491
679
  exports.dequery = dom.dequery;
492
680
  exports.domNodeToVNode = dom.domNodeToVNode;
493
681
  exports.emptyImpl = dom.emptyImpl;
494
682
  exports.getAllFormValues = dom.getAllFormValues;
683
+ exports.getComponentInstance = dom.getComponentInstance;
495
684
  exports.getDefaultDequeryOptions = dom.getDefaultDequeryOptions;
496
685
  exports.getEventMap = dom.getEventMap;
497
686
  exports.getMimeType = dom.getMimeType;
498
687
  exports.getNonChainedReturnCallNames = dom.getNonChainedReturnCallNames;
688
+ exports.getRegisteredEventKeys = dom.getRegisteredEventKeys;
689
+ exports.getRegisteredEventTypes = dom.getRegisteredEventTypes;
499
690
  exports.getRenderer = dom.getRenderer;
500
691
  exports.getTransitionStyles = dom.getTransitionStyles;
501
692
  exports.globalScopeDomApis = dom.globalScopeDomApis;
502
693
  exports.handleLifecycleEventsForOnMount = dom.handleLifecycleEventsForOnMount;
503
694
  exports.htmlStringToVNodes = dom.htmlStringToVNodes;
695
+ exports.isComponentRoot = dom.isComponentRoot;
504
696
  exports.isDequery = dom.isDequery;
505
697
  exports.isDequeryOptionsObject = dom.isDequeryOptionsObject;
506
698
  exports.isHTML = dom.isHTML;
@@ -513,12 +705,20 @@ exports.jsx = dom.jsx;
513
705
  exports.jsxDEV = dom.jsxDEV;
514
706
  exports.jsxs = dom.jsxs;
515
707
  exports.mapArrayIndexAccess = dom.mapArrayIndexAccess;
708
+ exports.nsMap = dom.nsMap;
516
709
  exports.observeUnmount = dom.observeUnmount;
517
710
  exports.parseDOM = dom.parseDOM;
711
+ exports.parseEventPropName = dom.parseEventPropName;
518
712
  exports.performTransition = dom.performTransition;
519
713
  exports.processAllFormElements = dom.processAllFormElements;
520
714
  exports.queueCallback = dom.queueCallback;
715
+ exports.registerComponent = dom.registerComponent;
716
+ exports.registerDelegatedEvent = dom.registerDelegatedEvent;
717
+ exports.removeDelegatedEvent = dom.removeDelegatedEvent;
718
+ exports.removeDelegatedEventByKey = dom.removeDelegatedEventByKey;
521
719
  exports.removeElementEvent = dom.removeElementEvent;
720
+ exports.render = dom.render;
721
+ exports.renderInto = dom.renderInto;
522
722
  exports.renderIsomorphicAsync = dom.renderIsomorphicAsync;
523
723
  exports.renderIsomorphicSync = dom.renderIsomorphicSync;
524
724
  exports.renderMarkup = dom.renderMarkup;
@@ -527,12 +727,16 @@ exports.replaceDomWithVdom = dom.replaceDomWithVdom;
527
727
  exports.resolveNodes = dom.resolveNodes;
528
728
  exports.runWithTimeGuard = dom.runWithTimeGuard;
529
729
  exports.scrollHelper = dom.scrollHelper;
730
+ exports.shallowEquals = dom.shallowEquals;
530
731
  exports.subChainForNextAwait = dom.subChainForNextAwait;
531
732
  exports.traverse = dom.traverse;
733
+ exports.unregisterComponent = dom.unregisterComponent;
532
734
  exports.updateDom = dom.updateDom;
533
735
  exports.updateDomWithVdom = dom.updateDomWithVdom;
534
736
  exports.waitForDOM = dom.waitForDOM;
535
737
  exports.webstorage = dom.webstorage;
738
+ exports.mount = mount.mount;
739
+ exports.unmount = mount.unmount;
536
740
  exports.Async = Async;
537
741
  exports.Redirect = Redirect;
538
742
  exports.Route = Route;
@@ -544,7 +748,9 @@ exports.T = T;
544
748
  exports.Trans = Trans;
545
749
  exports.changeLanguage = changeLanguage;
546
750
  exports.createI18n = createI18n;
751
+ exports.createTrans = createTrans;
547
752
  exports.getLanguage = getLanguage;
753
+ exports.getRouterState = getRouterState;
548
754
  exports.i18n = i18n;
549
755
  exports.inDevMode = inDevMode;
550
756
  exports.loadLanguage = loadLanguage;