@bquery/bquery 1.1.2 → 1.3.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 (307) hide show
  1. package/README.md +501 -323
  2. package/dist/batch-4LAvfLE7.js +13 -0
  3. package/dist/batch-4LAvfLE7.js.map +1 -0
  4. package/dist/component/component.d.ts +69 -0
  5. package/dist/component/component.d.ts.map +1 -0
  6. package/dist/component/html.d.ts +35 -0
  7. package/dist/component/html.d.ts.map +1 -0
  8. package/dist/component/index.d.ts +3 -126
  9. package/dist/component/index.d.ts.map +1 -1
  10. package/dist/component/props.d.ts +18 -0
  11. package/dist/component/props.d.ts.map +1 -0
  12. package/dist/component/types.d.ts +77 -0
  13. package/dist/component/types.d.ts.map +1 -0
  14. package/dist/component.es.mjs +90 -59
  15. package/dist/component.es.mjs.map +1 -1
  16. package/dist/core/collection.d.ts +36 -0
  17. package/dist/core/collection.d.ts.map +1 -1
  18. package/dist/core/dom.d.ts +6 -0
  19. package/dist/core/dom.d.ts.map +1 -0
  20. package/dist/core/element.d.ts +8 -0
  21. package/dist/core/element.d.ts.map +1 -1
  22. package/dist/core/index.d.ts +1 -0
  23. package/dist/core/index.d.ts.map +1 -1
  24. package/dist/core/utils/array.d.ts +74 -0
  25. package/dist/core/utils/array.d.ts.map +1 -0
  26. package/dist/core/utils/function.d.ts +70 -0
  27. package/dist/core/utils/function.d.ts.map +1 -0
  28. package/dist/core/utils/index.d.ts +70 -0
  29. package/dist/core/utils/index.d.ts.map +1 -0
  30. package/dist/core/utils/misc.d.ts +63 -0
  31. package/dist/core/utils/misc.d.ts.map +1 -0
  32. package/dist/core/utils/number.d.ts +65 -0
  33. package/dist/core/utils/number.d.ts.map +1 -0
  34. package/dist/core/utils/object.d.ts +133 -0
  35. package/dist/core/utils/object.d.ts.map +1 -0
  36. package/dist/core/utils/string.d.ts +80 -0
  37. package/dist/core/utils/string.d.ts.map +1 -0
  38. package/dist/core/utils/type-guards.d.ts +79 -0
  39. package/dist/core/utils/type-guards.d.ts.map +1 -0
  40. package/dist/core-COenAZjD.js +145 -0
  41. package/dist/core-COenAZjD.js.map +1 -0
  42. package/dist/core.es.mjs +411 -448
  43. package/dist/core.es.mjs.map +1 -1
  44. package/dist/full.d.ts +8 -2
  45. package/dist/full.d.ts.map +1 -1
  46. package/dist/full.es.mjs +86 -40
  47. package/dist/full.es.mjs.map +1 -1
  48. package/dist/full.iife.js +6 -1
  49. package/dist/full.iife.js.map +1 -1
  50. package/dist/full.umd.js +6 -1
  51. package/dist/full.umd.js.map +1 -1
  52. package/dist/index.d.ts +3 -0
  53. package/dist/index.d.ts.map +1 -1
  54. package/dist/index.es.mjs +137 -44
  55. package/dist/index.es.mjs.map +1 -1
  56. package/dist/motion/animate.d.ts +25 -0
  57. package/dist/motion/animate.d.ts.map +1 -0
  58. package/dist/motion/easing.d.ts +30 -0
  59. package/dist/motion/easing.d.ts.map +1 -0
  60. package/dist/motion/flip.d.ts +55 -0
  61. package/dist/motion/flip.d.ts.map +1 -0
  62. package/dist/motion/index.d.ts +11 -138
  63. package/dist/motion/index.d.ts.map +1 -1
  64. package/dist/motion/keyframes.d.ts +21 -0
  65. package/dist/motion/keyframes.d.ts.map +1 -0
  66. package/dist/motion/reduced-motion.d.ts +12 -0
  67. package/dist/motion/reduced-motion.d.ts.map +1 -0
  68. package/dist/motion/scroll.d.ts +15 -0
  69. package/dist/motion/scroll.d.ts.map +1 -0
  70. package/dist/motion/spring.d.ts +42 -0
  71. package/dist/motion/spring.d.ts.map +1 -0
  72. package/dist/motion/stagger.d.ts +22 -0
  73. package/dist/motion/stagger.d.ts.map +1 -0
  74. package/dist/motion/timeline.d.ts +21 -0
  75. package/dist/motion/timeline.d.ts.map +1 -0
  76. package/dist/motion/transition.d.ts +22 -0
  77. package/dist/motion/transition.d.ts.map +1 -0
  78. package/dist/motion/types.d.ts +182 -0
  79. package/dist/motion/types.d.ts.map +1 -0
  80. package/dist/motion.es.mjs +320 -61
  81. package/dist/motion.es.mjs.map +1 -1
  82. package/dist/persisted-Dz_ryNuC.js +278 -0
  83. package/dist/persisted-Dz_ryNuC.js.map +1 -0
  84. package/dist/reactive/batch.d.ts +13 -0
  85. package/dist/reactive/batch.d.ts.map +1 -0
  86. package/dist/reactive/computed.d.ts +50 -0
  87. package/dist/reactive/computed.d.ts.map +1 -0
  88. package/dist/reactive/core.d.ts +60 -0
  89. package/dist/reactive/core.d.ts.map +1 -0
  90. package/dist/reactive/effect.d.ts +15 -0
  91. package/dist/reactive/effect.d.ts.map +1 -0
  92. package/dist/reactive/index.d.ts +2 -2
  93. package/dist/reactive/index.d.ts.map +1 -1
  94. package/dist/reactive/internals.d.ts +36 -0
  95. package/dist/reactive/internals.d.ts.map +1 -0
  96. package/dist/reactive/linked.d.ts +36 -0
  97. package/dist/reactive/linked.d.ts.map +1 -0
  98. package/dist/reactive/persisted.d.ts +14 -0
  99. package/dist/reactive/persisted.d.ts.map +1 -0
  100. package/dist/reactive/readonly.d.ts +26 -0
  101. package/dist/reactive/readonly.d.ts.map +1 -0
  102. package/dist/reactive/signal.d.ts +13 -305
  103. package/dist/reactive/signal.d.ts.map +1 -1
  104. package/dist/reactive/type-guards.d.ts +20 -0
  105. package/dist/reactive/type-guards.d.ts.map +1 -0
  106. package/dist/reactive/untrack.d.ts +29 -0
  107. package/dist/reactive/untrack.d.ts.map +1 -0
  108. package/dist/reactive/watch.d.ts +42 -0
  109. package/dist/reactive/watch.d.ts.map +1 -0
  110. package/dist/reactive.es.mjs +30 -154
  111. package/dist/reactive.es.mjs.map +1 -1
  112. package/dist/router/index.d.ts +41 -0
  113. package/dist/router/index.d.ts.map +1 -0
  114. package/dist/router/links.d.ts +44 -0
  115. package/dist/router/links.d.ts.map +1 -0
  116. package/dist/router/match.d.ts +20 -0
  117. package/dist/router/match.d.ts.map +1 -0
  118. package/dist/router/navigation.d.ts +45 -0
  119. package/dist/router/navigation.d.ts.map +1 -0
  120. package/dist/router/query.d.ts +16 -0
  121. package/dist/router/query.d.ts.map +1 -0
  122. package/dist/router/router.d.ts +34 -0
  123. package/dist/router/router.d.ts.map +1 -0
  124. package/dist/router/state.d.ts +27 -0
  125. package/dist/router/state.d.ts.map +1 -0
  126. package/dist/router/types.d.ts +88 -0
  127. package/dist/router/types.d.ts.map +1 -0
  128. package/dist/router/utils.d.ts +65 -0
  129. package/dist/router/utils.d.ts.map +1 -0
  130. package/dist/router.es.mjs +202 -0
  131. package/dist/router.es.mjs.map +1 -0
  132. package/dist/sanitize-1FBEPAFH.js +272 -0
  133. package/dist/sanitize-1FBEPAFH.js.map +1 -0
  134. package/dist/security/constants.d.ts +42 -0
  135. package/dist/security/constants.d.ts.map +1 -0
  136. package/dist/security/csp.d.ts +24 -0
  137. package/dist/security/csp.d.ts.map +1 -0
  138. package/dist/security/index.d.ts +4 -2
  139. package/dist/security/index.d.ts.map +1 -1
  140. package/dist/security/sanitize-core.d.ts +13 -0
  141. package/dist/security/sanitize-core.d.ts.map +1 -0
  142. package/dist/security/sanitize.d.ts +5 -57
  143. package/dist/security/sanitize.d.ts.map +1 -1
  144. package/dist/security/trusted-types.d.ts +25 -0
  145. package/dist/security/trusted-types.d.ts.map +1 -0
  146. package/dist/security/types.d.ts +36 -0
  147. package/dist/security/types.d.ts.map +1 -0
  148. package/dist/security.es.mjs +50 -277
  149. package/dist/security.es.mjs.map +1 -1
  150. package/dist/store/create-store.d.ts +15 -0
  151. package/dist/store/create-store.d.ts.map +1 -0
  152. package/dist/store/define-store.d.ts +28 -0
  153. package/dist/store/define-store.d.ts.map +1 -0
  154. package/dist/store/devtools.d.ts +22 -0
  155. package/dist/store/devtools.d.ts.map +1 -0
  156. package/dist/store/index.d.ts +12 -0
  157. package/dist/store/index.d.ts.map +1 -0
  158. package/dist/store/mapping.d.ts +28 -0
  159. package/dist/store/mapping.d.ts.map +1 -0
  160. package/dist/store/persisted.d.ts +13 -0
  161. package/dist/store/persisted.d.ts.map +1 -0
  162. package/dist/store/plugins.d.ts +13 -0
  163. package/dist/store/plugins.d.ts.map +1 -0
  164. package/dist/store/registry.d.ts +28 -0
  165. package/dist/store/registry.d.ts.map +1 -0
  166. package/dist/store/types.d.ts +71 -0
  167. package/dist/store/types.d.ts.map +1 -0
  168. package/dist/store/utils.d.ts +28 -0
  169. package/dist/store/utils.d.ts.map +1 -0
  170. package/dist/store/watch.d.ts +23 -0
  171. package/dist/store/watch.d.ts.map +1 -0
  172. package/dist/store.es.mjs +27 -0
  173. package/dist/store.es.mjs.map +1 -0
  174. package/dist/type-guards-DRma3-Kc.js +16 -0
  175. package/dist/type-guards-DRma3-Kc.js.map +1 -0
  176. package/dist/untrack-BuEQKH7_.js +6 -0
  177. package/dist/untrack-BuEQKH7_.js.map +1 -0
  178. package/dist/view/directives/bind.d.ts +7 -0
  179. package/dist/view/directives/bind.d.ts.map +1 -0
  180. package/dist/view/directives/class.d.ts +8 -0
  181. package/dist/view/directives/class.d.ts.map +1 -0
  182. package/dist/view/directives/for.d.ts +23 -0
  183. package/dist/view/directives/for.d.ts.map +1 -0
  184. package/dist/view/directives/html.d.ts +7 -0
  185. package/dist/view/directives/html.d.ts.map +1 -0
  186. package/dist/view/directives/if.d.ts +7 -0
  187. package/dist/view/directives/if.d.ts.map +1 -0
  188. package/dist/view/directives/index.d.ts +12 -0
  189. package/dist/view/directives/index.d.ts.map +1 -0
  190. package/dist/view/directives/model.d.ts +7 -0
  191. package/dist/view/directives/model.d.ts.map +1 -0
  192. package/dist/view/directives/on.d.ts +7 -0
  193. package/dist/view/directives/on.d.ts.map +1 -0
  194. package/dist/view/directives/ref.d.ts +7 -0
  195. package/dist/view/directives/ref.d.ts.map +1 -0
  196. package/dist/view/directives/show.d.ts +7 -0
  197. package/dist/view/directives/show.d.ts.map +1 -0
  198. package/dist/view/directives/style.d.ts +7 -0
  199. package/dist/view/directives/style.d.ts.map +1 -0
  200. package/dist/view/directives/text.d.ts +7 -0
  201. package/dist/view/directives/text.d.ts.map +1 -0
  202. package/dist/view/evaluate.d.ts +43 -0
  203. package/dist/view/evaluate.d.ts.map +1 -0
  204. package/dist/view/index.d.ts +111 -0
  205. package/dist/view/index.d.ts.map +1 -0
  206. package/dist/view/mount.d.ts +69 -0
  207. package/dist/view/mount.d.ts.map +1 -0
  208. package/dist/view/process.d.ts +26 -0
  209. package/dist/view/process.d.ts.map +1 -0
  210. package/dist/view/types.d.ts +36 -0
  211. package/dist/view/types.d.ts.map +1 -0
  212. package/dist/view.es.mjs +426 -0
  213. package/dist/view.es.mjs.map +1 -0
  214. package/dist/watch-CXyaBC_9.js +58 -0
  215. package/dist/watch-CXyaBC_9.js.map +1 -0
  216. package/package.json +26 -14
  217. package/src/component/component.ts +289 -0
  218. package/src/component/html.ts +53 -0
  219. package/src/component/index.ts +40 -414
  220. package/src/component/props.ts +116 -0
  221. package/src/component/types.ts +85 -0
  222. package/src/core/collection.ts +588 -454
  223. package/src/core/dom.ts +38 -0
  224. package/src/core/element.ts +746 -740
  225. package/src/core/index.ts +43 -0
  226. package/src/core/utils/array.ts +102 -0
  227. package/src/core/utils/function.ts +110 -0
  228. package/src/core/utils/index.ts +83 -0
  229. package/src/core/utils/misc.ts +82 -0
  230. package/src/core/utils/number.ts +78 -0
  231. package/src/core/utils/object.ts +206 -0
  232. package/src/core/utils/string.ts +112 -0
  233. package/src/core/utils/type-guards.ts +112 -0
  234. package/src/full.ts +187 -106
  235. package/src/index.ts +36 -27
  236. package/src/motion/animate.ts +113 -0
  237. package/src/motion/easing.ts +40 -0
  238. package/src/motion/flip.ts +176 -0
  239. package/src/motion/index.ts +41 -358
  240. package/src/motion/keyframes.ts +46 -0
  241. package/src/motion/reduced-motion.ts +17 -0
  242. package/src/motion/scroll.ts +57 -0
  243. package/src/motion/spring.ts +150 -0
  244. package/src/motion/stagger.ts +43 -0
  245. package/src/motion/timeline.ts +246 -0
  246. package/src/motion/transition.ts +51 -0
  247. package/src/motion/types.ts +198 -0
  248. package/src/reactive/batch.ts +22 -0
  249. package/src/reactive/computed.ts +92 -0
  250. package/src/reactive/core.ts +93 -0
  251. package/src/reactive/effect.ts +43 -0
  252. package/src/reactive/index.ts +23 -22
  253. package/src/reactive/internals.ts +105 -0
  254. package/src/reactive/linked.ts +56 -0
  255. package/src/reactive/persisted.ts +74 -0
  256. package/src/reactive/readonly.ts +35 -0
  257. package/src/reactive/signal.ts +20 -506
  258. package/src/reactive/type-guards.ts +22 -0
  259. package/src/reactive/untrack.ts +31 -0
  260. package/src/reactive/watch.ts +73 -0
  261. package/src/router/index.ts +41 -0
  262. package/src/router/links.ts +130 -0
  263. package/src/router/match.ts +106 -0
  264. package/src/router/navigation.ts +71 -0
  265. package/src/router/query.ts +35 -0
  266. package/src/router/router.ts +211 -0
  267. package/src/router/state.ts +46 -0
  268. package/src/router/types.ts +93 -0
  269. package/src/router/utils.ts +116 -0
  270. package/src/security/constants.ts +209 -0
  271. package/src/security/csp.ts +77 -0
  272. package/src/security/index.ts +4 -12
  273. package/src/security/sanitize-core.ts +343 -0
  274. package/src/security/sanitize.ts +66 -625
  275. package/src/security/trusted-types.ts +69 -0
  276. package/src/security/types.ts +40 -0
  277. package/src/store/create-store.ts +329 -0
  278. package/src/store/define-store.ts +48 -0
  279. package/src/store/devtools.ts +45 -0
  280. package/src/store/index.ts +22 -0
  281. package/src/store/mapping.ts +73 -0
  282. package/src/store/persisted.ts +61 -0
  283. package/src/store/plugins.ts +32 -0
  284. package/src/store/registry.ts +51 -0
  285. package/src/store/types.ts +94 -0
  286. package/src/store/utils.ts +141 -0
  287. package/src/store/watch.ts +52 -0
  288. package/src/view/directives/bind.ts +23 -0
  289. package/src/view/directives/class.ts +70 -0
  290. package/src/view/directives/for.ts +275 -0
  291. package/src/view/directives/html.ts +19 -0
  292. package/src/view/directives/if.ts +30 -0
  293. package/src/view/directives/index.ts +11 -0
  294. package/src/view/directives/model.ts +56 -0
  295. package/src/view/directives/on.ts +41 -0
  296. package/src/view/directives/ref.ts +41 -0
  297. package/src/view/directives/show.ts +26 -0
  298. package/src/view/directives/style.ts +47 -0
  299. package/src/view/directives/text.ts +15 -0
  300. package/src/view/evaluate.ts +274 -0
  301. package/src/view/index.ts +112 -0
  302. package/src/view/mount.ts +200 -0
  303. package/src/view/process.ts +92 -0
  304. package/src/view/types.ts +44 -0
  305. package/dist/core/utils.d.ts +0 -313
  306. package/dist/core/utils.d.ts.map +0 -1
  307. package/src/core/utils.ts +0 -444
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../../src/view/evaluate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AA4D9C;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,oBAAoB,QAAO,IAGvC,CAAC;AA8BF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,QAAQ,GAAI,CAAC,GAAG,OAAO,EAAE,YAAY,MAAM,EAAE,SAAS,cAAc,KAAG,CAoBnF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GAAI,CAAC,GAAG,OAAO,EAAE,YAAY,MAAM,EAAE,SAAS,cAAc,KAAG,CAiBtF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAAI,YAAY,MAAM,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAqG/E,CAAC"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Declarative DOM bindings via data attributes.
3
+ *
4
+ * This module provides Vue/Svelte-style template directives without
5
+ * requiring a compiler. Bindings are evaluated at runtime using
6
+ * bQuery's reactive system. Features include:
7
+ * - Conditional rendering (bq-if)
8
+ * - List rendering (bq-for)
9
+ * - Two-way binding (bq-model)
10
+ * - Class binding (bq-class)
11
+ * - Text/HTML binding (bq-text, bq-html)
12
+ * - Attribute binding (bq-bind)
13
+ * - Event binding (bq-on)
14
+ *
15
+ * ## Security Considerations
16
+ *
17
+ * **WARNING:** This module uses `new Function()` to evaluate expressions at runtime.
18
+ * This is similar to Vue/Alpine's approach but carries inherent security risks:
19
+ *
20
+ * - **NEVER** use expressions derived from user input or untrusted sources
21
+ * - Expressions should only come from developer-controlled templates
22
+ * - The context object should not contain sensitive data that could be exfiltrated
23
+ * - For user-generated content, use static bindings with sanitized values instead
24
+ *
25
+ * Since bQuery is runtime-only (no build-time compilation), expressions are evaluated
26
+ * dynamically. If your application loads templates from external sources (APIs, databases),
27
+ * ensure they are trusted and validated before mounting.
28
+ *
29
+ * ## Content Security Policy (CSP) Compatibility
30
+ *
31
+ * **IMPORTANT:** This module requires `'unsafe-eval'` in your CSP `script-src` directive.
32
+ * The `new Function()` constructor used for expression evaluation will be blocked by
33
+ * strict CSP policies that omit `'unsafe-eval'`.
34
+ *
35
+ * ### Required CSP Header
36
+ * ```
37
+ * Content-Security-Policy: script-src 'self' 'unsafe-eval';
38
+ * ```
39
+ *
40
+ * ### CSP-Strict Alternatives
41
+ *
42
+ * If your application requires a strict CSP without `'unsafe-eval'`, consider these alternatives:
43
+ *
44
+ * 1. **Use bQuery's core reactive system directly** - Bind signals to DOM elements manually
45
+ * using `effect()` without the view module's template directives:
46
+ * ```ts
47
+ * import { signal, effect } from 'bquery/reactive';
48
+ * import { $ } from 'bquery';
49
+ *
50
+ * const count = signal(0);
51
+ * effect(() => {
52
+ * $('#counter').text(String(count.value));
53
+ * });
54
+ * ```
55
+ *
56
+ * 2. **Use bQuery's component module** - Web Components with typed props don't require
57
+ * dynamic expression evaluation:
58
+ * ```ts
59
+ * import { component } from 'bquery/component';
60
+ * component('my-counter', {
61
+ * props: { count: { type: Number } },
62
+ * render: ({ props }) => `<span>${props.count}</span>`,
63
+ * });
64
+ * ```
65
+ *
66
+ * 3. **Pre-compile templates at build time** - Use a build step to transform bq-* attributes
67
+ * into static JavaScript (similar to Svelte/Vue SFC compilation). This is outside bQuery's
68
+ * scope but can be achieved with custom Vite/Rollup plugins.
69
+ *
70
+ * The view module is designed for rapid prototyping and applications where CSP flexibility
71
+ * is acceptable. For security-critical applications requiring strict CSP, use the alternatives above.
72
+ *
73
+ * @module bquery/view
74
+ *
75
+ * @example
76
+ * ```html
77
+ * <div id="app">
78
+ * <input bq-model="name" />
79
+ * <p bq-text="greeting"></p>
80
+ * <ul>
81
+ * <li bq-for="item in items" bq-text="item.name"></li>
82
+ * </ul>
83
+ * <button bq-on:click="handleClick">Click me</button>
84
+ * <div bq-if="showDetails" bq-class="{ active: isActive }">
85
+ * Details here
86
+ * </div>
87
+ * </div>
88
+ * ```
89
+ *
90
+ * ```ts
91
+ * import { mount } from 'bquery/view';
92
+ * import { signal } from 'bquery/reactive';
93
+ *
94
+ * mount('#app', {
95
+ * name: signal('World'),
96
+ * greeting: computed(() => `Hello, ${name.value}!`),
97
+ * items: signal([{ name: 'Item 1' }, { name: 'Item 2' }]),
98
+ * showDetails: signal(true),
99
+ * isActive: signal(false),
100
+ * handleClick: () => console.log('Clicked!'),
101
+ * });
102
+ * ```
103
+ */
104
+ export { clearExpressionCache } from './evaluate';
105
+ export { createTemplate, mount } from './mount';
106
+ export type { BindingContext, MountOptions, View } from './types';
107
+ /**
108
+ * Re-export reactive primitives for convenience.
109
+ */
110
+ export { batch, computed, effect, signal } from '../reactive/index';
111
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/view/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsGG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChD,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAElE;;GAEG;AACH,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,69 @@
1
+ import type { BindingContext, MountOptions, View } from './types';
2
+ /**
3
+ * Mounts a reactive view to an element.
4
+ *
5
+ * @param selector - CSS selector or Element
6
+ * @param context - Binding context with signals, computed, and functions
7
+ * @param options - Mount options
8
+ * @returns The mounted View instance
9
+ *
10
+ * @security **WARNING:** Directive expressions (bq-text, bq-if, bq-on, etc.) are evaluated
11
+ * using `new Function()` at runtime. This means:
12
+ * - Template attributes must come from trusted sources only
13
+ * - NEVER load templates containing bq-* attributes from user input or untrusted APIs
14
+ * - If you must use external templates, validate/sanitize attribute values first
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * import { mount } from 'bquery/view';
19
+ * import { signal, computed } from 'bquery/reactive';
20
+ *
21
+ * const name = signal('World');
22
+ * const greeting = computed(() => `Hello, ${name.value}!`);
23
+ * const items = signal([
24
+ * { id: 1, text: 'Item 1' },
25
+ * { id: 2, text: 'Item 2' },
26
+ * ]);
27
+ *
28
+ * const view = mount('#app', {
29
+ * name,
30
+ * greeting,
31
+ * items,
32
+ * addItem: () => {
33
+ * items.value = [...items.value, { id: Date.now(), text: 'New Item' }];
34
+ * },
35
+ * });
36
+ *
37
+ * // Later, cleanup
38
+ * view.destroy();
39
+ * ```
40
+ */
41
+ export declare const mount: (selector: string | Element, context: BindingContext, options?: MountOptions) => View;
42
+ /**
43
+ * Creates a reactive template function.
44
+ *
45
+ * @param template - HTML template string
46
+ * @returns A function that creates a mounted element with the given context
47
+ *
48
+ * @example
49
+ * ```ts
50
+ * import { createTemplate } from 'bquery/view';
51
+ * import { signal } from 'bquery/reactive';
52
+ *
53
+ * const TodoItem = createTemplate(`
54
+ * <li bq-class="{ completed: done }">
55
+ * <input type="checkbox" bq-model="done" />
56
+ * <span bq-text="text"></span>
57
+ * </li>
58
+ * `);
59
+ *
60
+ * const item = TodoItem({
61
+ * done: signal(false),
62
+ * text: 'Buy groceries',
63
+ * });
64
+ *
65
+ * document.querySelector('#list').append(item.el);
66
+ * ```
67
+ */
68
+ export declare const createTemplate: (template: string, options?: MountOptions) => ((context: BindingContext) => View);
69
+ //# sourceMappingURL=mount.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mount.d.ts","sourceRoot":"","sources":["../../src/view/mount.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAElE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,eAAO,MAAM,KAAK,GAChB,UAAU,MAAM,GAAG,OAAO,EAC1B,SAAS,cAAc,EACvB,UAAS,YAAiB,KACzB,IA2EF,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,eAAO,MAAM,cAAc,GACzB,UAAU,MAAM,EAChB,UAAS,YAAiB,KACzB,CAAC,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAiCpC,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { CleanupFn } from '../reactive/index';
2
+ import type { BindingContext, DirectiveHandler } from './types';
3
+ export type DirectiveHandlers = {
4
+ text: DirectiveHandler;
5
+ html: DirectiveHandler;
6
+ if: DirectiveHandler;
7
+ show: DirectiveHandler;
8
+ class: DirectiveHandler;
9
+ style: DirectiveHandler;
10
+ model: DirectiveHandler;
11
+ ref: DirectiveHandler;
12
+ for: DirectiveHandler;
13
+ bind: (attrName: string) => DirectiveHandler;
14
+ on: (eventName: string) => DirectiveHandler;
15
+ };
16
+ /**
17
+ * Processes a single element for directives.
18
+ * @internal
19
+ */
20
+ export declare const processElement: (el: Element, context: BindingContext, prefix: string, cleanups: CleanupFn[], handlers: DirectiveHandlers) => void;
21
+ /**
22
+ * Recursively processes children of an element.
23
+ * @internal
24
+ */
25
+ export declare const processChildren: (el: Element, context: BindingContext, prefix: string, cleanups: CleanupFn[], handlers: DirectiveHandlers) => void;
26
+ //# sourceMappingURL=process.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../src/view/process.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEhE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,gBAAgB,CAAC;IACvB,IAAI,EAAE,gBAAgB,CAAC;IACvB,EAAE,EAAE,gBAAgB,CAAC;IACrB,IAAI,EAAE,gBAAgB,CAAC;IACvB,KAAK,EAAE,gBAAgB,CAAC;IACxB,KAAK,EAAE,gBAAgB,CAAC;IACxB,KAAK,EAAE,gBAAgB,CAAC;IACxB,GAAG,EAAE,gBAAgB,CAAC;IACtB,GAAG,EAAE,gBAAgB,CAAC;IACtB,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,gBAAgB,CAAC;IAC7C,EAAE,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,gBAAgB,CAAC;CAC7C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,GACzB,IAAI,OAAO,EACX,SAAS,cAAc,EACvB,QAAQ,MAAM,EACd,UAAU,SAAS,EAAE,EACrB,UAAU,iBAAiB,KAC1B,IAyCF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,eAAe,GAC1B,IAAI,OAAO,EACX,SAAS,cAAc,EACvB,QAAQ,MAAM,EACd,UAAU,SAAS,EAAE,EACrB,UAAU,iBAAiB,KAC1B,IAWF,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Public types for the view module.
3
+ */
4
+ import type { CleanupFn } from '../reactive/index';
5
+ /**
6
+ * Context object passed to binding expressions.
7
+ */
8
+ export type BindingContext = Record<string, unknown>;
9
+ /**
10
+ * Configuration options for mount.
11
+ */
12
+ export type MountOptions = {
13
+ /** Prefix for directive attributes (default: 'bq') */
14
+ prefix?: string;
15
+ /** Whether to sanitize bq-html content (default: true) */
16
+ sanitize?: boolean;
17
+ };
18
+ /**
19
+ * Mounted view instance.
20
+ */
21
+ export type View = {
22
+ /** The root element */
23
+ el: Element;
24
+ /** The binding context */
25
+ context: BindingContext;
26
+ /** Update the context object. Note: this only mutates the context; reactive re-rendering happens automatically when signals/computed values change. */
27
+ update: (newContext: Partial<BindingContext>) => void;
28
+ /** Destroy the view and cleanup effects */
29
+ destroy: () => void;
30
+ };
31
+ /**
32
+ * Internal directive handler type.
33
+ * @internal
34
+ */
35
+ export type DirectiveHandler = (el: Element, expression: string, context: BindingContext, cleanups: CleanupFn[]) => void;
36
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/view/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAErD;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,IAAI,GAAG;IACjB,uBAAuB;IACvB,EAAE,EAAE,OAAO,CAAC;IACZ,0BAA0B;IAC1B,OAAO,EAAE,cAAc,CAAC;IACxB,uJAAuJ;IACvJ,MAAM,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IACtD,2CAA2C;IAC3C,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAC7B,EAAE,EAAE,OAAO,EACX,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,SAAS,EAAE,KAClB,IAAI,CAAC"}
@@ -0,0 +1,426 @@
1
+ import { a as z, i as V, e as E } from "./type-guards-DRma3-Kc.js";
2
+ import { s as P } from "./core-COenAZjD.js";
3
+ import { c as ye } from "./core-COenAZjD.js";
4
+ import { s as Z } from "./sanitize-1FBEPAFH.js";
5
+ import { b as be } from "./batch-4LAvfLE7.js";
6
+ const N = 500;
7
+ class D {
8
+ constructor(e) {
9
+ this.cache = /* @__PURE__ */ new Map(), this.maxSize = e;
10
+ }
11
+ get(e) {
12
+ const s = this.cache.get(e);
13
+ return s !== void 0 && (this.cache.delete(e), this.cache.set(e, s)), s;
14
+ }
15
+ set(e, s) {
16
+ if (this.cache.has(e))
17
+ this.cache.delete(e);
18
+ else if (this.cache.size >= this.maxSize) {
19
+ const r = this.cache.keys().next().value;
20
+ r !== void 0 && this.cache.delete(r);
21
+ }
22
+ this.cache.set(e, s);
23
+ }
24
+ clear() {
25
+ this.cache.clear();
26
+ }
27
+ get size() {
28
+ return this.cache.size;
29
+ }
30
+ }
31
+ const O = new D(N), T = new D(N), de = () => {
32
+ O.clear(), T.clear();
33
+ }, U = (n) => new Proxy(n, {
34
+ get(e, s) {
35
+ if (typeof s != "string")
36
+ return Reflect.get(e, s);
37
+ const r = e[s];
38
+ return z(r) || V(r) ? r.value : r;
39
+ },
40
+ has(e, s) {
41
+ return typeof s != "string" ? Reflect.has(e, s) : s in e;
42
+ }
43
+ }), y = (n, e) => {
44
+ try {
45
+ const s = U(e);
46
+ let r = O.get(n);
47
+ return r || (r = new Function("$ctx", `with($ctx) { return (${n}); }`), O.set(n, r)), r(s);
48
+ } catch (s) {
49
+ console.error(`bQuery view: Error evaluating "${n}"`, s);
50
+ return;
51
+ }
52
+ }, q = (n, e) => {
53
+ try {
54
+ let s = T.get(n);
55
+ return s || (s = new Function("$ctx", `with($ctx) { return (${n}); }`), T.set(n, s)), s(e);
56
+ } catch (s) {
57
+ console.error(`bQuery view: Error evaluating "${n}"`, s);
58
+ return;
59
+ }
60
+ }, _ = (n) => {
61
+ const e = {}, s = n.trim().replace(/^\{|\}$/g, "").trim();
62
+ if (!s) return e;
63
+ const r = [];
64
+ let t = "", a = 0, i = null;
65
+ for (let c = 0; c < s.length; c++) {
66
+ const o = s[c], l = c > 0 ? s[c - 1] : "";
67
+ if ((o === '"' || o === "'" || o === "`") && l !== "\\") {
68
+ i === null ? i = o : i === o && (i = null), t += o;
69
+ continue;
70
+ }
71
+ if (i !== null) {
72
+ t += o;
73
+ continue;
74
+ }
75
+ o === "(" || o === "[" || o === "{" ? (a++, t += o) : o === ")" || o === "]" || o === "}" ? (a--, t += o) : o === "," && a === 0 ? (r.push(t.trim()), t = "") : t += o;
76
+ }
77
+ t.trim() && r.push(t.trim());
78
+ for (const c of r) {
79
+ let o = -1, l = 0, h = null;
80
+ for (let u = 0; u < c.length; u++) {
81
+ const f = c[u], W = u > 0 ? c[u - 1] : "";
82
+ if ((f === '"' || f === "'" || f === "`") && W !== "\\") {
83
+ h === null ? h = f : h === f && (h = null);
84
+ continue;
85
+ }
86
+ if (h === null) {
87
+ if (f === "(" || f === "[" || f === "{")
88
+ l++;
89
+ else if (f === ")" || f === "]" || f === "}")
90
+ l--;
91
+ else if (f === ":" && l === 0) {
92
+ o = u;
93
+ break;
94
+ }
95
+ }
96
+ }
97
+ if (o > -1) {
98
+ const u = c.slice(0, o).trim().replace(/^['"]|['"]$/g, ""), f = c.slice(o + 1).trim();
99
+ e[u] = f;
100
+ }
101
+ }
102
+ return e;
103
+ }, X = (n) => (e, s, r, t) => {
104
+ const a = E(() => {
105
+ const i = y(s, r);
106
+ i == null || i === !1 ? e.removeAttribute(n) : i === !0 ? e.setAttribute(n, "") : e.setAttribute(n, String(i));
107
+ });
108
+ t.push(a);
109
+ }, G = (n, e, s, r) => {
110
+ let t = /* @__PURE__ */ new Set();
111
+ const a = E(() => {
112
+ const i = /* @__PURE__ */ new Set();
113
+ if (e.trimStart().startsWith("{")) {
114
+ const c = _(e);
115
+ for (const [o, l] of Object.entries(c)) {
116
+ const h = y(l, s);
117
+ n.classList.toggle(o, !!h), i.add(o);
118
+ }
119
+ } else if (/^\s*\[/.test(e)) {
120
+ const c = y(e, s);
121
+ if (Array.isArray(c))
122
+ for (const o of c)
123
+ o && (n.classList.add(o), i.add(o));
124
+ } else {
125
+ const c = y(e, s);
126
+ typeof c == "string" ? c.split(/\s+/).forEach((o) => {
127
+ o && (n.classList.add(o), i.add(o));
128
+ }) : Array.isArray(c) && c.forEach((o) => {
129
+ o && (n.classList.add(o), i.add(o));
130
+ });
131
+ }
132
+ for (const c of t)
133
+ i.has(c) || n.classList.remove(c);
134
+ t = i;
135
+ });
136
+ r.push(a);
137
+ }, J = (n, e, s, r, t, a) => {
138
+ if (!s)
139
+ return e;
140
+ const i = {
141
+ ...a,
142
+ [r]: n
143
+ };
144
+ return t && (i[t] = e), y(s, i);
145
+ }, Y = (n) => {
146
+ const { prefix: e, processElement: s, processChildren: r } = n;
147
+ return (t, a, i, c) => {
148
+ const o = t.parentNode;
149
+ if (!o) return;
150
+ const l = a.match(/^\(?(\w+)(?:\s*,\s*(\w+))?\)?\s+in\s+(\S.*)$/);
151
+ if (!l) {
152
+ console.error(`bQuery view: Invalid bq-for expression "${a}"`);
153
+ return;
154
+ }
155
+ const [, h, u, f] = l, W = t.getAttribute(":key") || t.getAttribute(`${e}-key`), L = t.cloneNode(!0);
156
+ L.removeAttribute(`${e}-for`), L.removeAttribute(":key"), L.removeAttribute(`${e}-key`);
157
+ const Q = document.createComment(`bq-for: ${a}`);
158
+ o.replaceChild(Q, t);
159
+ let S = /* @__PURE__ */ new Map(), I = [];
160
+ const F = (d, p, w) => {
161
+ const C = L.cloneNode(!0), A = [], k = P(d), $ = u ? P(p) : null, m = {
162
+ ...i,
163
+ [h]: k
164
+ };
165
+ return u && $ && (m[u] = $), s(C, m, e, A), r(C, m, e, A), {
166
+ key: w,
167
+ element: C,
168
+ cleanups: A,
169
+ item: d,
170
+ index: p,
171
+ itemSignal: k,
172
+ indexSignal: $
173
+ };
174
+ }, R = (d) => {
175
+ for (const p of d.cleanups)
176
+ p();
177
+ d.element.remove();
178
+ }, K = (d, p, w) => {
179
+ Object.is(d.item, p) || (d.item = p, d.itemSignal.value = p), d.index !== w && (d.index = w, d.indexSignal && (d.indexSignal.value = w));
180
+ }, B = E(() => {
181
+ const d = y(f, i);
182
+ if (!Array.isArray(d)) {
183
+ for (const m of S.values())
184
+ R(m);
185
+ S.clear(), I = [];
186
+ return;
187
+ }
188
+ const p = [], w = /* @__PURE__ */ new Map(), C = /* @__PURE__ */ new Set();
189
+ d.forEach((m, v) => {
190
+ let g = J(m, v, W, h, u, i);
191
+ C.has(g) && (console.warn(
192
+ `bq-for: Duplicate key "${String(g)}" detected at index ${v}. Falling back to index-based key for this item. Ensure :key expressions produce unique values for each item.`
193
+ ), g = { __bqDuplicateKey: g, __bqIndex: v }), C.add(g), p.push(g), w.set(g, { item: m, index: v });
194
+ });
195
+ const A = [];
196
+ for (const m of I)
197
+ w.has(m) || A.push(m);
198
+ for (const m of A) {
199
+ const v = S.get(m);
200
+ v && (R(v), S.delete(m));
201
+ }
202
+ const k = /* @__PURE__ */ new Map();
203
+ let $ = Q;
204
+ for (let m = 0; m < p.length; m++) {
205
+ const v = p[m], { item: g, index: H } = w.get(v);
206
+ let b = S.get(v);
207
+ b ? (K(b, g, H), k.set(v, b), $.nextSibling !== b.element && $.after(b.element), $ = b.element) : (b = F(g, H, v), k.set(v, b), $.after(b.element), $ = b.element);
208
+ }
209
+ S = k, I = p;
210
+ });
211
+ c.push(() => {
212
+ B();
213
+ for (const d of S.values())
214
+ for (const p of d.cleanups)
215
+ p();
216
+ S.clear();
217
+ });
218
+ };
219
+ }, x = (n) => (e, s, r, t) => {
220
+ const a = E(() => {
221
+ const i = y(s, r), c = String(i ?? "");
222
+ e.innerHTML = n ? Z(c) : c;
223
+ });
224
+ t.push(a);
225
+ }, ee = (n, e, s, r) => {
226
+ const t = document.createComment(`bq-if: ${e}`);
227
+ let a = !0;
228
+ const i = E(() => {
229
+ const c = y(e, s);
230
+ c && !a ? (t.replaceWith(n), a = !0) : !c && a && (n.replaceWith(t), a = !1);
231
+ });
232
+ r.push(i);
233
+ }, te = (n, e, s, r) => {
234
+ const t = n, a = q(e, s);
235
+ if (!z(a)) {
236
+ console.warn(`bQuery view: bq-model requires a signal, got "${e}"`);
237
+ return;
238
+ }
239
+ const i = a, c = t.type === "checkbox", o = t.type === "radio", l = () => {
240
+ c ? t.checked = !!i.value : o ? t.checked = i.value === t.value : t.value = String(i.value ?? "");
241
+ }, h = E(() => {
242
+ l();
243
+ });
244
+ r.push(h);
245
+ const u = t.tagName === "SELECT" ? "change" : "input", f = () => {
246
+ c ? i.value = t.checked : o ? t.checked && (i.value = t.value) : i.value = t.value;
247
+ };
248
+ t.addEventListener(u, f), r.push(() => t.removeEventListener(u, f));
249
+ }, ne = (n) => (e, s, r, t) => {
250
+ const a = (i) => {
251
+ const c = { ...r, $event: i, $el: e };
252
+ if (!s.includes("(")) {
253
+ const l = q(s, c);
254
+ if (typeof l == "function") {
255
+ l(i);
256
+ return;
257
+ }
258
+ return;
259
+ }
260
+ q(s, c);
261
+ };
262
+ e.addEventListener(n, a), t.push(() => e.removeEventListener(n, a));
263
+ };
264
+ function se(n) {
265
+ const e = Object.getOwnPropertyDescriptor(n, "value");
266
+ return e ? "value" in e ? e.writable === !0 : typeof e.set == "function" : !1;
267
+ }
268
+ const re = (n, e, s, r) => {
269
+ const t = q(
270
+ e,
271
+ s
272
+ );
273
+ z(t) ? (t.value = n, r.push(() => {
274
+ t.value = null;
275
+ })) : typeof t == "object" && t !== null && se(t) && (t.value = n, r.push(() => {
276
+ t.value = null;
277
+ }));
278
+ }, oe = (n, e, s, r) => {
279
+ const t = n;
280
+ let a = t.style.display;
281
+ if (!a || a === "none") {
282
+ const c = t.ownerDocument.defaultView?.getComputedStyle(t).display ?? "";
283
+ a = c !== "none" ? c : "";
284
+ }
285
+ const i = E(() => {
286
+ const c = y(e, s);
287
+ t.style.display = c ? a : "none";
288
+ });
289
+ r.push(i);
290
+ }, ie = (n, e, s, r) => {
291
+ const t = n;
292
+ let a = /* @__PURE__ */ new Set();
293
+ const i = E(() => {
294
+ const c = /* @__PURE__ */ new Set();
295
+ if (e.trimStart().startsWith("{")) {
296
+ const o = _(e);
297
+ for (const [l, h] of Object.entries(o)) {
298
+ const u = y(h, s), f = l.replace(/([A-Z])/g, "-$1").toLowerCase();
299
+ t.style.setProperty(f, String(u ?? "")), c.add(f);
300
+ }
301
+ } else {
302
+ const o = y(e, s);
303
+ if (o && typeof o == "object")
304
+ for (const [l, h] of Object.entries(o)) {
305
+ const u = l.replace(/([A-Z])/g, "-$1").toLowerCase();
306
+ t.style.setProperty(u, String(h ?? "")), c.add(u);
307
+ }
308
+ }
309
+ for (const o of a)
310
+ c.has(o) || t.style.removeProperty(o);
311
+ a = c;
312
+ });
313
+ r.push(i);
314
+ }, ce = (n, e, s, r) => {
315
+ const t = E(() => {
316
+ const a = y(e, s);
317
+ n.textContent = String(a ?? "");
318
+ });
319
+ r.push(t);
320
+ }, M = (n, e, s, r, t) => {
321
+ const a = Array.from(n.attributes);
322
+ for (const i of a) {
323
+ const { name: c, value: o } = i;
324
+ if (!c.startsWith(`${s}-`)) continue;
325
+ const l = c.slice(s.length + 1);
326
+ if (l === "for") {
327
+ t.for(n, o, e, r);
328
+ return;
329
+ }
330
+ if (l === "text")
331
+ t.text(n, o, e, r);
332
+ else if (l === "html")
333
+ t.html(n, o, e, r);
334
+ else if (l === "if")
335
+ t.if(n, o, e, r);
336
+ else if (l === "show")
337
+ t.show(n, o, e, r);
338
+ else if (l === "class")
339
+ t.class(n, o, e, r);
340
+ else if (l === "style")
341
+ t.style(n, o, e, r);
342
+ else if (l === "model")
343
+ t.model(n, o, e, r);
344
+ else if (l === "ref")
345
+ t.ref(n, o, e, r);
346
+ else if (l.startsWith("bind:")) {
347
+ const h = l.slice(5);
348
+ t.bind(h)(n, o, e, r);
349
+ } else if (l.startsWith("on:")) {
350
+ const h = l.slice(3);
351
+ t.on(h)(n, o, e, r);
352
+ }
353
+ }
354
+ }, j = (n, e, s, r, t) => {
355
+ const a = Array.from(n.children);
356
+ for (const i of a)
357
+ i.hasAttribute(`${s}-for`) ? M(i, e, s, r, t) : (M(i, e, s, r, t), j(i, e, s, r, t));
358
+ }, ae = (n, e, s = {}) => {
359
+ const { prefix: r = "bq", sanitize: t = !0 } = s, a = typeof n == "string" ? document.querySelector(n) : n;
360
+ if (!a)
361
+ throw new Error(`bQuery view: Element "${n}" not found.`);
362
+ if (a.hasAttribute(`${r}-for`))
363
+ throw new Error(
364
+ `bQuery view: Cannot mount on element with ${r}-for directive. Wrap the ${r}-for element in a container instead.`
365
+ );
366
+ const i = [], c = {
367
+ text: ce,
368
+ html: x(t),
369
+ if: ee,
370
+ show: oe,
371
+ class: G,
372
+ style: ie,
373
+ model: te,
374
+ ref: re,
375
+ for: Y({
376
+ prefix: r,
377
+ processElement: (l, h, u, f) => M(l, h, u, f, c),
378
+ processChildren: (l, h, u, f) => j(l, h, u, f, c)
379
+ }),
380
+ bind: X,
381
+ on: ne
382
+ };
383
+ return ((l, h, u) => {
384
+ const f = l.hasAttribute(`${r}-for`);
385
+ M(l, h, r, u, c), f || j(l, h, r, u, c);
386
+ })(a, e, i), {
387
+ el: a,
388
+ context: e,
389
+ update: (l) => {
390
+ Object.assign(e, l);
391
+ },
392
+ destroy: () => {
393
+ for (const l of i)
394
+ l();
395
+ i.length = 0;
396
+ }
397
+ };
398
+ }, me = (n, e = {}) => (s) => {
399
+ const r = document.createElement("div");
400
+ r.innerHTML = n.trim();
401
+ const t = r.firstElementChild;
402
+ if (!t)
403
+ throw new Error("bQuery view: Template must contain a single root element.");
404
+ if (r.childElementCount > 1)
405
+ throw new Error(
406
+ `bQuery view: Template must contain exactly one root element, found ${r.childElementCount}.`
407
+ );
408
+ const { prefix: a = "bq" } = e;
409
+ if (t.hasAttribute(`${a}-for`) || t.hasAttribute(`${a}-if`)) {
410
+ const i = t.hasAttribute(`${a}-for`) ? "for" : "if";
411
+ throw new Error(
412
+ `bQuery view: Template root element cannot have ${a}-${i} directive. Wrap the ${a}-${i} element in a container instead.`
413
+ );
414
+ }
415
+ return ae(t, s, e);
416
+ };
417
+ export {
418
+ be as batch,
419
+ de as clearExpressionCache,
420
+ ye as computed,
421
+ me as createTemplate,
422
+ E as effect,
423
+ ae as mount,
424
+ P as signal
425
+ };
426
+ //# sourceMappingURL=view.es.mjs.map