@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.
- package/README.md +501 -323
- package/dist/batch-4LAvfLE7.js +13 -0
- package/dist/batch-4LAvfLE7.js.map +1 -0
- package/dist/component/component.d.ts +69 -0
- package/dist/component/component.d.ts.map +1 -0
- package/dist/component/html.d.ts +35 -0
- package/dist/component/html.d.ts.map +1 -0
- package/dist/component/index.d.ts +3 -126
- package/dist/component/index.d.ts.map +1 -1
- package/dist/component/props.d.ts +18 -0
- package/dist/component/props.d.ts.map +1 -0
- package/dist/component/types.d.ts +77 -0
- package/dist/component/types.d.ts.map +1 -0
- package/dist/component.es.mjs +90 -59
- package/dist/component.es.mjs.map +1 -1
- package/dist/core/collection.d.ts +36 -0
- package/dist/core/collection.d.ts.map +1 -1
- package/dist/core/dom.d.ts +6 -0
- package/dist/core/dom.d.ts.map +1 -0
- package/dist/core/element.d.ts +8 -0
- package/dist/core/element.d.ts.map +1 -1
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/utils/array.d.ts +74 -0
- package/dist/core/utils/array.d.ts.map +1 -0
- package/dist/core/utils/function.d.ts +70 -0
- package/dist/core/utils/function.d.ts.map +1 -0
- package/dist/core/utils/index.d.ts +70 -0
- package/dist/core/utils/index.d.ts.map +1 -0
- package/dist/core/utils/misc.d.ts +63 -0
- package/dist/core/utils/misc.d.ts.map +1 -0
- package/dist/core/utils/number.d.ts +65 -0
- package/dist/core/utils/number.d.ts.map +1 -0
- package/dist/core/utils/object.d.ts +133 -0
- package/dist/core/utils/object.d.ts.map +1 -0
- package/dist/core/utils/string.d.ts +80 -0
- package/dist/core/utils/string.d.ts.map +1 -0
- package/dist/core/utils/type-guards.d.ts +79 -0
- package/dist/core/utils/type-guards.d.ts.map +1 -0
- package/dist/core-COenAZjD.js +145 -0
- package/dist/core-COenAZjD.js.map +1 -0
- package/dist/core.es.mjs +411 -448
- package/dist/core.es.mjs.map +1 -1
- package/dist/full.d.ts +8 -2
- package/dist/full.d.ts.map +1 -1
- package/dist/full.es.mjs +86 -40
- package/dist/full.es.mjs.map +1 -1
- package/dist/full.iife.js +6 -1
- package/dist/full.iife.js.map +1 -1
- package/dist/full.umd.js +6 -1
- package/dist/full.umd.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.es.mjs +137 -44
- package/dist/index.es.mjs.map +1 -1
- package/dist/motion/animate.d.ts +25 -0
- package/dist/motion/animate.d.ts.map +1 -0
- package/dist/motion/easing.d.ts +30 -0
- package/dist/motion/easing.d.ts.map +1 -0
- package/dist/motion/flip.d.ts +55 -0
- package/dist/motion/flip.d.ts.map +1 -0
- package/dist/motion/index.d.ts +11 -138
- package/dist/motion/index.d.ts.map +1 -1
- package/dist/motion/keyframes.d.ts +21 -0
- package/dist/motion/keyframes.d.ts.map +1 -0
- package/dist/motion/reduced-motion.d.ts +12 -0
- package/dist/motion/reduced-motion.d.ts.map +1 -0
- package/dist/motion/scroll.d.ts +15 -0
- package/dist/motion/scroll.d.ts.map +1 -0
- package/dist/motion/spring.d.ts +42 -0
- package/dist/motion/spring.d.ts.map +1 -0
- package/dist/motion/stagger.d.ts +22 -0
- package/dist/motion/stagger.d.ts.map +1 -0
- package/dist/motion/timeline.d.ts +21 -0
- package/dist/motion/timeline.d.ts.map +1 -0
- package/dist/motion/transition.d.ts +22 -0
- package/dist/motion/transition.d.ts.map +1 -0
- package/dist/motion/types.d.ts +182 -0
- package/dist/motion/types.d.ts.map +1 -0
- package/dist/motion.es.mjs +320 -61
- package/dist/motion.es.mjs.map +1 -1
- package/dist/persisted-Dz_ryNuC.js +278 -0
- package/dist/persisted-Dz_ryNuC.js.map +1 -0
- package/dist/reactive/batch.d.ts +13 -0
- package/dist/reactive/batch.d.ts.map +1 -0
- package/dist/reactive/computed.d.ts +50 -0
- package/dist/reactive/computed.d.ts.map +1 -0
- package/dist/reactive/core.d.ts +60 -0
- package/dist/reactive/core.d.ts.map +1 -0
- package/dist/reactive/effect.d.ts +15 -0
- package/dist/reactive/effect.d.ts.map +1 -0
- package/dist/reactive/index.d.ts +2 -2
- package/dist/reactive/index.d.ts.map +1 -1
- package/dist/reactive/internals.d.ts +36 -0
- package/dist/reactive/internals.d.ts.map +1 -0
- package/dist/reactive/linked.d.ts +36 -0
- package/dist/reactive/linked.d.ts.map +1 -0
- package/dist/reactive/persisted.d.ts +14 -0
- package/dist/reactive/persisted.d.ts.map +1 -0
- package/dist/reactive/readonly.d.ts +26 -0
- package/dist/reactive/readonly.d.ts.map +1 -0
- package/dist/reactive/signal.d.ts +13 -305
- package/dist/reactive/signal.d.ts.map +1 -1
- package/dist/reactive/type-guards.d.ts +20 -0
- package/dist/reactive/type-guards.d.ts.map +1 -0
- package/dist/reactive/untrack.d.ts +29 -0
- package/dist/reactive/untrack.d.ts.map +1 -0
- package/dist/reactive/watch.d.ts +42 -0
- package/dist/reactive/watch.d.ts.map +1 -0
- package/dist/reactive.es.mjs +30 -154
- package/dist/reactive.es.mjs.map +1 -1
- package/dist/router/index.d.ts +41 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/links.d.ts +44 -0
- package/dist/router/links.d.ts.map +1 -0
- package/dist/router/match.d.ts +20 -0
- package/dist/router/match.d.ts.map +1 -0
- package/dist/router/navigation.d.ts +45 -0
- package/dist/router/navigation.d.ts.map +1 -0
- package/dist/router/query.d.ts +16 -0
- package/dist/router/query.d.ts.map +1 -0
- package/dist/router/router.d.ts +34 -0
- package/dist/router/router.d.ts.map +1 -0
- package/dist/router/state.d.ts +27 -0
- package/dist/router/state.d.ts.map +1 -0
- package/dist/router/types.d.ts +88 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/utils.d.ts +65 -0
- package/dist/router/utils.d.ts.map +1 -0
- package/dist/router.es.mjs +202 -0
- package/dist/router.es.mjs.map +1 -0
- package/dist/sanitize-1FBEPAFH.js +272 -0
- package/dist/sanitize-1FBEPAFH.js.map +1 -0
- package/dist/security/constants.d.ts +42 -0
- package/dist/security/constants.d.ts.map +1 -0
- package/dist/security/csp.d.ts +24 -0
- package/dist/security/csp.d.ts.map +1 -0
- package/dist/security/index.d.ts +4 -2
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/sanitize-core.d.ts +13 -0
- package/dist/security/sanitize-core.d.ts.map +1 -0
- package/dist/security/sanitize.d.ts +5 -57
- package/dist/security/sanitize.d.ts.map +1 -1
- package/dist/security/trusted-types.d.ts +25 -0
- package/dist/security/trusted-types.d.ts.map +1 -0
- package/dist/security/types.d.ts +36 -0
- package/dist/security/types.d.ts.map +1 -0
- package/dist/security.es.mjs +50 -277
- package/dist/security.es.mjs.map +1 -1
- package/dist/store/create-store.d.ts +15 -0
- package/dist/store/create-store.d.ts.map +1 -0
- package/dist/store/define-store.d.ts +28 -0
- package/dist/store/define-store.d.ts.map +1 -0
- package/dist/store/devtools.d.ts +22 -0
- package/dist/store/devtools.d.ts.map +1 -0
- package/dist/store/index.d.ts +12 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/mapping.d.ts +28 -0
- package/dist/store/mapping.d.ts.map +1 -0
- package/dist/store/persisted.d.ts +13 -0
- package/dist/store/persisted.d.ts.map +1 -0
- package/dist/store/plugins.d.ts +13 -0
- package/dist/store/plugins.d.ts.map +1 -0
- package/dist/store/registry.d.ts +28 -0
- package/dist/store/registry.d.ts.map +1 -0
- package/dist/store/types.d.ts +71 -0
- package/dist/store/types.d.ts.map +1 -0
- package/dist/store/utils.d.ts +28 -0
- package/dist/store/utils.d.ts.map +1 -0
- package/dist/store/watch.d.ts +23 -0
- package/dist/store/watch.d.ts.map +1 -0
- package/dist/store.es.mjs +27 -0
- package/dist/store.es.mjs.map +1 -0
- package/dist/type-guards-DRma3-Kc.js +16 -0
- package/dist/type-guards-DRma3-Kc.js.map +1 -0
- package/dist/untrack-BuEQKH7_.js +6 -0
- package/dist/untrack-BuEQKH7_.js.map +1 -0
- package/dist/view/directives/bind.d.ts +7 -0
- package/dist/view/directives/bind.d.ts.map +1 -0
- package/dist/view/directives/class.d.ts +8 -0
- package/dist/view/directives/class.d.ts.map +1 -0
- package/dist/view/directives/for.d.ts +23 -0
- package/dist/view/directives/for.d.ts.map +1 -0
- package/dist/view/directives/html.d.ts +7 -0
- package/dist/view/directives/html.d.ts.map +1 -0
- package/dist/view/directives/if.d.ts +7 -0
- package/dist/view/directives/if.d.ts.map +1 -0
- package/dist/view/directives/index.d.ts +12 -0
- package/dist/view/directives/index.d.ts.map +1 -0
- package/dist/view/directives/model.d.ts +7 -0
- package/dist/view/directives/model.d.ts.map +1 -0
- package/dist/view/directives/on.d.ts +7 -0
- package/dist/view/directives/on.d.ts.map +1 -0
- package/dist/view/directives/ref.d.ts +7 -0
- package/dist/view/directives/ref.d.ts.map +1 -0
- package/dist/view/directives/show.d.ts +7 -0
- package/dist/view/directives/show.d.ts.map +1 -0
- package/dist/view/directives/style.d.ts +7 -0
- package/dist/view/directives/style.d.ts.map +1 -0
- package/dist/view/directives/text.d.ts +7 -0
- package/dist/view/directives/text.d.ts.map +1 -0
- package/dist/view/evaluate.d.ts +43 -0
- package/dist/view/evaluate.d.ts.map +1 -0
- package/dist/view/index.d.ts +111 -0
- package/dist/view/index.d.ts.map +1 -0
- package/dist/view/mount.d.ts +69 -0
- package/dist/view/mount.d.ts.map +1 -0
- package/dist/view/process.d.ts +26 -0
- package/dist/view/process.d.ts.map +1 -0
- package/dist/view/types.d.ts +36 -0
- package/dist/view/types.d.ts.map +1 -0
- package/dist/view.es.mjs +426 -0
- package/dist/view.es.mjs.map +1 -0
- package/dist/watch-CXyaBC_9.js +58 -0
- package/dist/watch-CXyaBC_9.js.map +1 -0
- package/package.json +26 -14
- package/src/component/component.ts +289 -0
- package/src/component/html.ts +53 -0
- package/src/component/index.ts +40 -414
- package/src/component/props.ts +116 -0
- package/src/component/types.ts +85 -0
- package/src/core/collection.ts +588 -454
- package/src/core/dom.ts +38 -0
- package/src/core/element.ts +746 -740
- package/src/core/index.ts +43 -0
- package/src/core/utils/array.ts +102 -0
- package/src/core/utils/function.ts +110 -0
- package/src/core/utils/index.ts +83 -0
- package/src/core/utils/misc.ts +82 -0
- package/src/core/utils/number.ts +78 -0
- package/src/core/utils/object.ts +206 -0
- package/src/core/utils/string.ts +112 -0
- package/src/core/utils/type-guards.ts +112 -0
- package/src/full.ts +187 -106
- package/src/index.ts +36 -27
- package/src/motion/animate.ts +113 -0
- package/src/motion/easing.ts +40 -0
- package/src/motion/flip.ts +176 -0
- package/src/motion/index.ts +41 -358
- package/src/motion/keyframes.ts +46 -0
- package/src/motion/reduced-motion.ts +17 -0
- package/src/motion/scroll.ts +57 -0
- package/src/motion/spring.ts +150 -0
- package/src/motion/stagger.ts +43 -0
- package/src/motion/timeline.ts +246 -0
- package/src/motion/transition.ts +51 -0
- package/src/motion/types.ts +198 -0
- package/src/reactive/batch.ts +22 -0
- package/src/reactive/computed.ts +92 -0
- package/src/reactive/core.ts +93 -0
- package/src/reactive/effect.ts +43 -0
- package/src/reactive/index.ts +23 -22
- package/src/reactive/internals.ts +105 -0
- package/src/reactive/linked.ts +56 -0
- package/src/reactive/persisted.ts +74 -0
- package/src/reactive/readonly.ts +35 -0
- package/src/reactive/signal.ts +20 -506
- package/src/reactive/type-guards.ts +22 -0
- package/src/reactive/untrack.ts +31 -0
- package/src/reactive/watch.ts +73 -0
- package/src/router/index.ts +41 -0
- package/src/router/links.ts +130 -0
- package/src/router/match.ts +106 -0
- package/src/router/navigation.ts +71 -0
- package/src/router/query.ts +35 -0
- package/src/router/router.ts +211 -0
- package/src/router/state.ts +46 -0
- package/src/router/types.ts +93 -0
- package/src/router/utils.ts +116 -0
- package/src/security/constants.ts +209 -0
- package/src/security/csp.ts +77 -0
- package/src/security/index.ts +4 -12
- package/src/security/sanitize-core.ts +343 -0
- package/src/security/sanitize.ts +66 -625
- package/src/security/trusted-types.ts +69 -0
- package/src/security/types.ts +40 -0
- package/src/store/create-store.ts +329 -0
- package/src/store/define-store.ts +48 -0
- package/src/store/devtools.ts +45 -0
- package/src/store/index.ts +22 -0
- package/src/store/mapping.ts +73 -0
- package/src/store/persisted.ts +61 -0
- package/src/store/plugins.ts +32 -0
- package/src/store/registry.ts +51 -0
- package/src/store/types.ts +94 -0
- package/src/store/utils.ts +141 -0
- package/src/store/watch.ts +52 -0
- package/src/view/directives/bind.ts +23 -0
- package/src/view/directives/class.ts +70 -0
- package/src/view/directives/for.ts +275 -0
- package/src/view/directives/html.ts +19 -0
- package/src/view/directives/if.ts +30 -0
- package/src/view/directives/index.ts +11 -0
- package/src/view/directives/model.ts +56 -0
- package/src/view/directives/on.ts +41 -0
- package/src/view/directives/ref.ts +41 -0
- package/src/view/directives/show.ts +26 -0
- package/src/view/directives/style.ts +47 -0
- package/src/view/directives/text.ts +15 -0
- package/src/view/evaluate.ts +274 -0
- package/src/view/index.ts +112 -0
- package/src/view/mount.ts +200 -0
- package/src/view/process.ts +92 -0
- package/src/view/types.ts +44 -0
- package/dist/core/utils.d.ts +0 -313
- package/dist/core/utils.d.ts.map +0 -1
- 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"}
|
package/dist/view.es.mjs
ADDED
|
@@ -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
|