@bquery/bquery 1.5.0 → 1.7.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 +193 -23
- package/dist/a11y/announce.d.ts +43 -0
- package/dist/a11y/announce.d.ts.map +1 -0
- package/dist/a11y/audit.d.ts +42 -0
- package/dist/a11y/audit.d.ts.map +1 -0
- package/dist/a11y/index.d.ts +53 -0
- package/dist/a11y/index.d.ts.map +1 -0
- package/dist/a11y/media-preferences.d.ts +77 -0
- package/dist/a11y/media-preferences.d.ts.map +1 -0
- package/dist/a11y/roving-tab-index.d.ts +38 -0
- package/dist/a11y/roving-tab-index.d.ts.map +1 -0
- package/dist/a11y/skip-link.d.ts +37 -0
- package/dist/a11y/skip-link.d.ts.map +1 -0
- package/dist/a11y/trap-focus.d.ts +49 -0
- package/dist/a11y/trap-focus.d.ts.map +1 -0
- package/dist/a11y/types.d.ts +152 -0
- package/dist/a11y/types.d.ts.map +1 -0
- package/dist/a11y-C5QOVvRn.js +421 -0
- package/dist/a11y-C5QOVvRn.js.map +1 -0
- package/dist/a11y.es.mjs +14 -0
- package/dist/component/component.d.ts +13 -5
- package/dist/component/component.d.ts.map +1 -1
- package/dist/component/html.d.ts +40 -3
- package/dist/component/html.d.ts.map +1 -1
- package/dist/component/index.d.ts +3 -2
- package/dist/component/index.d.ts.map +1 -1
- package/dist/component/library.d.ts.map +1 -1
- package/dist/component/scope.d.ts +138 -0
- package/dist/component/scope.d.ts.map +1 -0
- package/dist/component/types.d.ts +184 -17
- package/dist/component/types.d.ts.map +1 -1
- package/dist/component-CuuTijA6.js +684 -0
- package/dist/component-CuuTijA6.js.map +1 -0
- package/dist/component.es.mjs +10 -6
- package/dist/{config-DRmZZno3.js → config-BW35FKuA.js} +4 -4
- package/dist/config-BW35FKuA.js.map +1 -0
- package/dist/constraints-3lV9yyBw.js +100 -0
- package/dist/constraints-3lV9yyBw.js.map +1 -0
- package/dist/core/collection.d.ts +48 -0
- package/dist/core/collection.d.ts.map +1 -1
- package/dist/core/element.d.ts +92 -0
- package/dist/core/element.d.ts.map +1 -1
- package/dist/core/env.d.ts +18 -0
- package/dist/core/env.d.ts.map +1 -0
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/shared.d.ts +8 -0
- package/dist/core/shared.d.ts.map +1 -1
- package/dist/core/utils/index.d.ts +52 -41
- package/dist/core/utils/index.d.ts.map +1 -1
- package/dist/core-Cjl7GUu8.js +717 -0
- package/dist/core-Cjl7GUu8.js.map +1 -0
- package/dist/{core-DPdbItcq.js → core-DnlyjbF2.js} +1 -1
- package/dist/{core-DPdbItcq.js.map → core-DnlyjbF2.js.map} +1 -1
- package/dist/core.es.mjs +45 -44
- package/dist/custom-directives-7wAShnnd.js +9 -0
- package/dist/custom-directives-7wAShnnd.js.map +1 -0
- package/dist/devtools/devtools.d.ts +212 -0
- package/dist/devtools/devtools.d.ts.map +1 -0
- package/dist/devtools/index.d.ts +20 -0
- package/dist/devtools/index.d.ts.map +1 -0
- package/dist/devtools/types.d.ts +69 -0
- package/dist/devtools/types.d.ts.map +1 -0
- package/dist/devtools-D2fQLhDN.js +122 -0
- package/dist/devtools-D2fQLhDN.js.map +1 -0
- package/dist/devtools.es.mjs +19 -0
- package/dist/dnd/draggable.d.ts +51 -0
- package/dist/dnd/draggable.d.ts.map +1 -0
- package/dist/dnd/droppable.d.ts +38 -0
- package/dist/dnd/droppable.d.ts.map +1 -0
- package/dist/dnd/index.d.ts +47 -0
- package/dist/dnd/index.d.ts.map +1 -0
- package/dist/dnd/sortable.d.ts +43 -0
- package/dist/dnd/sortable.d.ts.map +1 -0
- package/dist/dnd/types.d.ts +250 -0
- package/dist/dnd/types.d.ts.map +1 -0
- package/dist/dnd-B8EgyzaI.js +244 -0
- package/dist/dnd-B8EgyzaI.js.map +1 -0
- package/dist/dnd.es.mjs +6 -0
- package/dist/env-NeVmr4Gf.js +19 -0
- package/dist/env-NeVmr4Gf.js.map +1 -0
- package/dist/forms/create-form.d.ts +49 -0
- package/dist/forms/create-form.d.ts.map +1 -0
- package/dist/forms/index.d.ts +39 -0
- package/dist/forms/index.d.ts.map +1 -0
- package/dist/forms/types.d.ts +139 -0
- package/dist/forms/types.d.ts.map +1 -0
- package/dist/forms/validators.d.ts +179 -0
- package/dist/forms/validators.d.ts.map +1 -0
- package/dist/forms-C3yovgH9.js +141 -0
- package/dist/forms-C3yovgH9.js.map +1 -0
- package/dist/forms.es.mjs +14 -0
- package/dist/full.d.ts +37 -9
- package/dist/full.d.ts.map +1 -1
- package/dist/full.es.mjs +186 -91
- package/dist/full.iife.js +47 -31
- package/dist/full.iife.js.map +1 -1
- package/dist/full.umd.js +47 -31
- package/dist/full.umd.js.map +1 -1
- package/dist/i18n/formatting.d.ts +40 -0
- package/dist/i18n/formatting.d.ts.map +1 -0
- package/dist/i18n/i18n.d.ts +48 -0
- package/dist/i18n/i18n.d.ts.map +1 -0
- package/dist/i18n/index.d.ts +57 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/translate.d.ts +83 -0
- package/dist/i18n/translate.d.ts.map +1 -0
- package/dist/i18n/types.d.ts +156 -0
- package/dist/i18n/types.d.ts.map +1 -0
- package/dist/i18n-BnnhTFOS.js +89 -0
- package/dist/i18n-BnnhTFOS.js.map +1 -0
- package/dist/i18n.es.mjs +6 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.es.mjs +233 -138
- package/dist/media/battery.d.ts +35 -0
- package/dist/media/battery.d.ts.map +1 -0
- package/dist/media/breakpoints.d.ts +51 -0
- package/dist/media/breakpoints.d.ts.map +1 -0
- package/dist/media/clipboard.d.ts +30 -0
- package/dist/media/clipboard.d.ts.map +1 -0
- package/dist/media/device-sensors.d.ts +54 -0
- package/dist/media/device-sensors.d.ts.map +1 -0
- package/dist/media/geolocation.d.ts +38 -0
- package/dist/media/geolocation.d.ts.map +1 -0
- package/dist/media/index.d.ts +42 -0
- package/dist/media/index.d.ts.map +1 -0
- package/dist/media/media-query.d.ts +36 -0
- package/dist/media/media-query.d.ts.map +1 -0
- package/dist/media/network.d.ts +35 -0
- package/dist/media/network.d.ts.map +1 -0
- package/dist/media/types.d.ts +173 -0
- package/dist/media/types.d.ts.map +1 -0
- package/dist/media/viewport.d.ts +32 -0
- package/dist/media/viewport.d.ts.map +1 -0
- package/dist/media-Di2Ta22s.js +340 -0
- package/dist/media-Di2Ta22s.js.map +1 -0
- package/dist/media.es.mjs +12 -0
- package/dist/motion/index.d.ts +7 -3
- package/dist/motion/index.d.ts.map +1 -1
- package/dist/motion/morph.d.ts +27 -0
- package/dist/motion/morph.d.ts.map +1 -0
- package/dist/motion/parallax.d.ts +30 -0
- package/dist/motion/parallax.d.ts.map +1 -0
- package/dist/motion/reduced-motion.d.ts +36 -3
- package/dist/motion/reduced-motion.d.ts.map +1 -1
- package/dist/motion/types.d.ts +58 -0
- package/dist/motion/types.d.ts.map +1 -1
- package/dist/motion/typewriter.d.ts +31 -0
- package/dist/motion/typewriter.d.ts.map +1 -0
- package/dist/motion-qPj_TYGv.js +530 -0
- package/dist/motion-qPj_TYGv.js.map +1 -0
- package/dist/motion.es.mjs +27 -23
- package/dist/mount-SM07RUa6.js +403 -0
- package/dist/mount-SM07RUa6.js.map +1 -0
- package/dist/{object-qGpWr6-J.js → object-BCk-1c8T.js} +5 -4
- package/dist/{object-qGpWr6-J.js.map → object-BCk-1c8T.js.map} +1 -1
- package/dist/{platform-B7JhGBc7.js → platform-CPbCprb6.js} +3 -3
- package/dist/platform-CPbCprb6.js.map +1 -0
- package/dist/platform.es.mjs +2 -2
- package/dist/plugin/index.d.ts +22 -0
- package/dist/plugin/index.d.ts.map +1 -0
- package/dist/plugin/registry.d.ts +108 -0
- package/dist/plugin/registry.d.ts.map +1 -0
- package/dist/plugin/types.d.ts +110 -0
- package/dist/plugin/types.d.ts.map +1 -0
- package/dist/plugin-cPoOHFLY.js +64 -0
- package/dist/plugin-cPoOHFLY.js.map +1 -0
- package/dist/plugin.es.mjs +9 -0
- package/dist/reactive/computed.d.ts +7 -0
- package/dist/reactive/computed.d.ts.map +1 -1
- package/dist/reactive-Cfv0RK6x.js +233 -0
- package/dist/reactive-Cfv0RK6x.js.map +1 -0
- package/dist/reactive.es.mjs +18 -17
- package/dist/registry-CWf368tT.js +26 -0
- package/dist/registry-CWf368tT.js.map +1 -0
- package/dist/router/bq-link.d.ts +112 -0
- package/dist/router/bq-link.d.ts.map +1 -0
- package/dist/router/constraints.d.ts +9 -0
- package/dist/router/constraints.d.ts.map +1 -0
- package/dist/router/index.d.ts +14 -6
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/match.d.ts +0 -1
- package/dist/router/match.d.ts.map +1 -1
- package/dist/router/path-pattern.d.ts +14 -0
- package/dist/router/path-pattern.d.ts.map +1 -0
- package/dist/router/query.d.ts.map +1 -1
- package/dist/router/router.d.ts +3 -1
- package/dist/router/router.d.ts.map +1 -1
- package/dist/router/types.d.ts +48 -4
- package/dist/router/types.d.ts.map +1 -1
- package/dist/router/use-route.d.ts +50 -0
- package/dist/router/use-route.d.ts.map +1 -0
- package/dist/router/utils.d.ts +3 -0
- package/dist/router/utils.d.ts.map +1 -1
- package/dist/router-BrthaP_z.js +473 -0
- package/dist/router-BrthaP_z.js.map +1 -0
- package/dist/router.es.mjs +13 -10
- package/dist/{sanitize-jyJ2ryE2.js → sanitize-B1V4JswB.js} +95 -83
- package/dist/sanitize-B1V4JswB.js.map +1 -0
- package/dist/security/index.d.ts +2 -0
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/sanitize.d.ts +4 -1
- package/dist/security/sanitize.d.ts.map +1 -1
- package/dist/security/trusted-html.d.ts +53 -0
- package/dist/security/trusted-html.d.ts.map +1 -0
- package/dist/security.es.mjs +10 -9
- package/dist/ssr/hydrate.d.ts +65 -0
- package/dist/ssr/hydrate.d.ts.map +1 -0
- package/dist/ssr/index.d.ts +59 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/render.d.ts +62 -0
- package/dist/ssr/render.d.ts.map +1 -0
- package/dist/ssr/serialize.d.ts +118 -0
- package/dist/ssr/serialize.d.ts.map +1 -0
- package/dist/ssr/types.d.ts +70 -0
- package/dist/ssr/types.d.ts.map +1 -0
- package/dist/ssr-B2qd_WBB.js +248 -0
- package/dist/ssr-B2qd_WBB.js.map +1 -0
- package/dist/ssr.es.mjs +9 -0
- package/dist/store/create-store.d.ts.map +1 -1
- package/dist/store/define-store.d.ts +1 -1
- package/dist/store/define-store.d.ts.map +1 -1
- package/dist/store/index.d.ts +1 -1
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/mapping.d.ts +1 -1
- package/dist/store/mapping.d.ts.map +1 -1
- package/dist/store/persisted.d.ts +38 -4
- package/dist/store/persisted.d.ts.map +1 -1
- package/dist/store/types.d.ts +140 -3
- package/dist/store/types.d.ts.map +1 -1
- package/dist/store/utils.d.ts +2 -2
- package/dist/store/utils.d.ts.map +1 -1
- package/dist/store/watch.d.ts +1 -1
- package/dist/store/watch.d.ts.map +1 -1
- package/dist/store-DWpyH6p5.js +338 -0
- package/dist/store-DWpyH6p5.js.map +1 -0
- package/dist/store.es.mjs +11 -10
- package/dist/storybook/index.d.ts +37 -0
- package/dist/storybook/index.d.ts.map +1 -0
- package/dist/storybook.es.mjs +151 -0
- package/dist/storybook.es.mjs.map +1 -0
- package/dist/testing/index.d.ts +23 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/testing.d.ts +156 -0
- package/dist/testing/testing.d.ts.map +1 -0
- package/dist/testing/types.d.ts +134 -0
- package/dist/testing/types.d.ts.map +1 -0
- package/dist/testing-CsqjNUyy.js +224 -0
- package/dist/testing-CsqjNUyy.js.map +1 -0
- package/dist/testing.es.mjs +9 -0
- package/dist/type-guards-Do9DWgNp.js +44 -0
- package/dist/type-guards-Do9DWgNp.js.map +1 -0
- package/dist/untrack-DJVQQ2WM.js +33 -0
- package/dist/untrack-DJVQQ2WM.js.map +1 -0
- package/dist/view/custom-directives.d.ts +20 -0
- package/dist/view/custom-directives.d.ts.map +1 -0
- package/dist/view/evaluate.d.ts.map +1 -1
- package/dist/view/process.d.ts.map +1 -1
- package/dist/view.es.mjs +11 -10
- package/package.json +52 -11
- package/src/a11y/announce.ts +131 -0
- package/src/a11y/audit.ts +314 -0
- package/src/a11y/index.ts +68 -0
- package/src/a11y/media-preferences.ts +255 -0
- package/src/a11y/roving-tab-index.ts +164 -0
- package/src/a11y/skip-link.ts +255 -0
- package/src/a11y/trap-focus.ts +184 -0
- package/src/a11y/types.ts +183 -0
- package/src/component/component.ts +345 -65
- package/src/component/html.ts +153 -53
- package/src/component/index.ts +12 -2
- package/src/component/library.ts +66 -28
- package/src/component/scope.ts +212 -0
- package/src/component/types.ts +238 -19
- package/src/core/collection.ts +707 -628
- package/src/core/element.ts +981 -774
- package/src/core/env.ts +60 -0
- package/src/core/index.ts +49 -48
- package/src/core/shared.ts +62 -13
- package/src/core/utils/index.ts +148 -83
- package/src/devtools/devtools.ts +410 -0
- package/src/devtools/index.ts +48 -0
- package/src/devtools/types.ts +104 -0
- package/src/dnd/draggable.ts +296 -0
- package/src/dnd/droppable.ts +228 -0
- package/src/dnd/index.ts +62 -0
- package/src/dnd/sortable.ts +307 -0
- package/src/dnd/types.ts +293 -0
- package/src/forms/create-form.ts +278 -0
- package/src/forms/index.ts +65 -0
- package/src/forms/types.ts +154 -0
- package/src/forms/validators.ts +265 -0
- package/src/full.ts +260 -3
- package/src/i18n/formatting.ts +67 -0
- package/src/i18n/i18n.ts +200 -0
- package/src/i18n/index.ts +67 -0
- package/src/i18n/translate.ts +182 -0
- package/src/i18n/types.ts +171 -0
- package/src/index.ts +108 -36
- package/src/media/battery.ts +116 -0
- package/src/media/breakpoints.ts +131 -0
- package/src/media/clipboard.ts +80 -0
- package/src/media/device-sensors.ts +158 -0
- package/src/media/geolocation.ts +119 -0
- package/src/media/index.ts +76 -0
- package/src/media/media-query.ts +92 -0
- package/src/media/network.ts +115 -0
- package/src/media/types.ts +177 -0
- package/src/media/viewport.ts +84 -0
- package/src/motion/index.ts +57 -48
- package/src/motion/morph.ts +151 -0
- package/src/motion/parallax.ts +120 -0
- package/src/motion/reduced-motion.ts +66 -17
- package/src/motion/transition.ts +97 -97
- package/src/motion/types.ts +63 -0
- package/src/motion/typewriter.ts +164 -0
- package/src/platform/announcer.ts +208 -208
- package/src/platform/config.ts +163 -163
- package/src/platform/cookies.ts +165 -165
- package/src/platform/index.ts +39 -39
- package/src/platform/meta.ts +168 -168
- package/src/plugin/index.ts +37 -0
- package/src/plugin/registry.ts +269 -0
- package/src/plugin/types.ts +137 -0
- package/src/reactive/async-data.ts +486 -486
- package/src/reactive/computed.ts +130 -92
- package/src/reactive/index.ts +37 -37
- package/src/reactive/signal.ts +29 -29
- package/src/router/bq-link.ts +279 -0
- package/src/router/constraints.ts +201 -0
- package/src/router/index.ts +49 -41
- package/src/router/match.ts +312 -106
- package/src/router/path-pattern.ts +52 -0
- package/src/router/query.ts +38 -35
- package/src/router/router.ts +402 -211
- package/src/router/types.ts +139 -93
- package/src/router/use-route.ts +68 -0
- package/src/router/utils.ts +157 -116
- package/src/security/constants.ts +211 -211
- package/src/security/index.ts +12 -10
- package/src/security/sanitize.ts +6 -2
- package/src/security/trusted-html.ts +71 -0
- package/src/ssr/hydrate.ts +82 -0
- package/src/ssr/index.ts +70 -0
- package/src/ssr/render.ts +508 -0
- package/src/ssr/serialize.ts +296 -0
- package/src/ssr/types.ts +81 -0
- package/src/store/create-store.ts +467 -329
- package/src/store/define-store.ts +2 -1
- package/src/store/index.ts +27 -22
- package/src/store/mapping.ts +2 -1
- package/src/store/persisted.ts +249 -61
- package/src/store/types.ts +247 -94
- package/src/store/utils.ts +135 -141
- package/src/store/watch.ts +2 -1
- package/src/storybook/index.ts +480 -0
- package/src/testing/index.ts +42 -0
- package/src/testing/testing.ts +593 -0
- package/src/testing/types.ts +170 -0
- package/src/view/custom-directives.ts +30 -0
- package/src/view/evaluate.ts +292 -290
- package/src/view/process.ts +108 -92
- package/dist/component-CY5MVoYN.js +0 -531
- package/dist/component-CY5MVoYN.js.map +0 -1
- package/dist/config-DRmZZno3.js.map +0 -1
- package/dist/core-CK2Mfpf4.js +0 -648
- package/dist/core-CK2Mfpf4.js.map +0 -1
- package/dist/motion-C5DRdPnO.js +0 -415
- package/dist/motion-C5DRdPnO.js.map +0 -1
- package/dist/platform-B7JhGBc7.js.map +0 -1
- package/dist/reactive-BDya-ia8.js +0 -253
- package/dist/reactive-BDya-ia8.js.map +0 -1
- package/dist/router-CijiICxt.js +0 -188
- package/dist/router-CijiICxt.js.map +0 -1
- package/dist/sanitize-jyJ2ryE2.js.map +0 -1
- package/dist/store-CPK9E62U.js +0 -262
- package/dist/store-CPK9E62U.js.map +0 -1
- package/dist/view-Cdi0g-qo.js +0 -396
- package/dist/view-Cdi0g-qo.js.map +0 -1
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { n as S } from "./sanitize-B1V4JswB.js";
|
|
2
|
+
var b = "\0", u = (t) => t === " " || t === " " || t === `
|
|
3
|
+
` || t === "\r" || t === "\f", A = (t) => t === b, d = (t) => u(t) || A(t), h = (t) => {
|
|
4
|
+
const r = t.charCodeAt(0);
|
|
5
|
+
return r >= 65 && r <= 90 || r >= 97 && r <= 122;
|
|
6
|
+
}, C = (t) => h(t), T = (t) => {
|
|
7
|
+
const r = t.charCodeAt(0);
|
|
8
|
+
return h(t) || r >= 48 && r <= 57 || t === ":" || t === "." || t === "_" || t === "-";
|
|
9
|
+
}, $ = (t) => t === '"' || t === "'", B = (t) => {
|
|
10
|
+
const r = t.charCodeAt(0);
|
|
11
|
+
return h(t) || r >= 48 && r <= 57 || t === "." || t === "_" || t === "-";
|
|
12
|
+
}, E = (t) => {
|
|
13
|
+
for (let r = 0; r < t.length; r += 1) if (t[r] === `
|
|
14
|
+
` || t[r] === "\r") return !0;
|
|
15
|
+
return !1;
|
|
16
|
+
}, x = (t) => {
|
|
17
|
+
let r = 0;
|
|
18
|
+
for (; r < t.length && !d(t[r]) && t[r] !== "/" && t[r] !== ">"; ) r += 1;
|
|
19
|
+
return r;
|
|
20
|
+
}, N = (t) => {
|
|
21
|
+
if (!t.includes("-") || !h(t[0])) return !1;
|
|
22
|
+
const r = t[t.length - 1], n = r.charCodeAt(0);
|
|
23
|
+
return h(r) || n >= 48 && n <= 57 || r === "." || r === "_";
|
|
24
|
+
}, f = (t) => t !== "style" && !t.startsWith("on"), k = (t) => {
|
|
25
|
+
let r = t.length - 1;
|
|
26
|
+
for (; r >= 0 && u(t[r]); ) r -= 1;
|
|
27
|
+
if (r < 0 || t[r] !== "=") return null;
|
|
28
|
+
for (r -= 1; r >= 0 && u(t[r]); ) r -= 1;
|
|
29
|
+
const n = r;
|
|
30
|
+
for (; r >= 0 && !u(t[r]) && t[r] !== "?" && t[r] !== "=" && t[r] !== "/" && t[r] !== ">"; ) r -= 1;
|
|
31
|
+
const i = r + 1;
|
|
32
|
+
if (i > n || t[r] !== "?") return null;
|
|
33
|
+
const e = r;
|
|
34
|
+
let o = e;
|
|
35
|
+
for (; o > 0 && u(t[o - 1]); ) o -= 1;
|
|
36
|
+
return {
|
|
37
|
+
attribute: t.slice(i, n + 1),
|
|
38
|
+
basePart: t.slice(0, o),
|
|
39
|
+
spacing: t.slice(o, e)
|
|
40
|
+
};
|
|
41
|
+
}, L = (t) => {
|
|
42
|
+
const r = [];
|
|
43
|
+
let n = 0;
|
|
44
|
+
for (; n < t.length; ) {
|
|
45
|
+
if (t[n] !== "<") {
|
|
46
|
+
n += 1;
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
const i = t[n + 1];
|
|
50
|
+
if (!i || i === "/" || i === "!" || i === "?") {
|
|
51
|
+
n += 1;
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
let e = n + 1;
|
|
55
|
+
if (!h(t[e])) {
|
|
56
|
+
n += 1;
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
for (; e < t.length && B(t[e]); ) e += 1;
|
|
60
|
+
const o = n + 1;
|
|
61
|
+
if (!t.slice(o, e)) {
|
|
62
|
+
n += 1;
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
let s = null, c = e;
|
|
66
|
+
for (; c < t.length; ) {
|
|
67
|
+
const l = t[c];
|
|
68
|
+
if (s) {
|
|
69
|
+
l === s && (s = null), c += 1;
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (l === '"' || l === "'") {
|
|
73
|
+
s = l, c += 1;
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
if (l === ">") {
|
|
77
|
+
r.push(t.slice(n + 1, c)), c += 1;
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
c += 1;
|
|
81
|
+
}
|
|
82
|
+
n = c;
|
|
83
|
+
}
|
|
84
|
+
return r;
|
|
85
|
+
}, O = (t, r) => {
|
|
86
|
+
if (r >= t.length) return r;
|
|
87
|
+
let n = r;
|
|
88
|
+
if (A(t[n])) return n + 1;
|
|
89
|
+
for (; n < t.length && u(t[n]); ) n += 1;
|
|
90
|
+
if (n >= t.length) return n;
|
|
91
|
+
if (A(t[n])) return n + 1;
|
|
92
|
+
const i = t[n];
|
|
93
|
+
if ($(i)) {
|
|
94
|
+
for (n += 1; n < t.length; ) {
|
|
95
|
+
if (t[n] === i) return n + 1;
|
|
96
|
+
n += 1;
|
|
97
|
+
}
|
|
98
|
+
return n;
|
|
99
|
+
}
|
|
100
|
+
for (; n < t.length && !d(t[n]) && t[n] !== "/" && t[n] !== ">"; ) n += 1;
|
|
101
|
+
return n < t.length && A(t[n]) ? n + 1 : n;
|
|
102
|
+
}, _ = (t, r, n) => {
|
|
103
|
+
let i = 0;
|
|
104
|
+
for (; i < t.length && !d(t[i]); ) i += 1;
|
|
105
|
+
for (; i < t.length; ) {
|
|
106
|
+
for (; i < t.length && d(t[i]); ) i += 1;
|
|
107
|
+
if (i >= t.length || t[i] === "/") return;
|
|
108
|
+
if (t[i] === ":") {
|
|
109
|
+
i += 1;
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
const e = t[i] === "?";
|
|
113
|
+
if (e && (i += 1), i >= t.length || !C(t[i])) {
|
|
114
|
+
i += 1;
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
const o = i;
|
|
118
|
+
for (i += 1; i < t.length && T(t[i]); ) i += 1;
|
|
119
|
+
const s = t.slice(o, i).toLowerCase();
|
|
120
|
+
for (; i < t.length && d(t[i]); ) i += 1;
|
|
121
|
+
if (i < t.length && t[i] === "=") {
|
|
122
|
+
n && f(s) && r.add(s), i = O(t, i + 1);
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
e && n && f(s) && r.add(s);
|
|
126
|
+
}
|
|
127
|
+
}, g = (t) => {
|
|
128
|
+
const r = t.join(b), n = /* @__PURE__ */ new Set(), i = /* @__PURE__ */ new Set();
|
|
129
|
+
for (const e of L(r)) {
|
|
130
|
+
const o = e.slice(0, x(e)).toLowerCase(), s = N(o);
|
|
131
|
+
s && n.add(o), _(e, i, s);
|
|
132
|
+
}
|
|
133
|
+
return {
|
|
134
|
+
allowTags: Array.from(n),
|
|
135
|
+
allowAttributes: Array.from(i)
|
|
136
|
+
};
|
|
137
|
+
}, w = (t) => t == null ? "" : Array.isArray(t) ? t.map((r) => w(r)).join("") : typeof t == "function" ? w(t()) : String(t), a = (t) => t == null ? !1 : typeof t == "function" ? a(t()) : Array.isArray(t) ? !!w(t) : typeof t == "boolean" ? t : !!t, M = (t, ...r) => S(t.reduce((n, i, e) => {
|
|
138
|
+
if (e >= r.length) return `${n}${i}`;
|
|
139
|
+
const o = k(i);
|
|
140
|
+
if (o) {
|
|
141
|
+
const { attribute: s, basePart: c, spacing: l } = o, y = E(l) ? l : "";
|
|
142
|
+
return `${n}${c}${a(r[e]) ? `${l}${s}` : y}`;
|
|
143
|
+
}
|
|
144
|
+
return `${n}${i}${w(r[e])}`;
|
|
145
|
+
}, ""), g(t)), P = (t, r, n) => w(t ? r : n);
|
|
146
|
+
export {
|
|
147
|
+
M as storyHtml,
|
|
148
|
+
P as when
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
//# sourceMappingURL=storybook.es.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storybook.es.mjs","names":[],"sources":["../src/storybook/index.ts"],"sourcesContent":["/**\r\n * Storybook template helpers for authoring bQuery component stories.\r\n *\r\n * `storyHtml` mirrors bQuery's string-based `html` tag while adding support for\r\n * Storybook-friendly boolean attribute shorthand (`?disabled=${true}`).\r\n *\r\n * @module bquery/storybook\r\n */\r\n\r\nimport { sanitizeHtml } from '../security/sanitize';\r\n\r\ntype StoryValue = string | number | boolean | null | undefined | StoryValue[] | (() => StoryValue);\r\n\r\n/**\r\n * Marks template interpolation boundaries while inferring sanitizer allowlists.\r\n * Uses the null character because authored HTML/template strings should not\r\n * contain it, making it a safe internal sentinel during parsing.\r\n */\r\nconst INTERPOLATION_BOUNDARY_MARKER = '\\u0000';\r\n\r\nconst isWhitespace = (value: string): boolean => {\r\n return value === ' ' || value === '\\t' || value === '\\n' || value === '\\r' || value === '\\f';\r\n};\r\n\r\n/**\r\n * Detects interpolation boundaries embedded into joined template string fragments.\r\n */\r\nconst isInterpolationBoundaryMarker = (value: string): boolean =>\r\n value === INTERPOLATION_BOUNDARY_MARKER;\r\n\r\nconst isAttributeSeparator = (value: string): boolean => {\r\n return isWhitespace(value) || isInterpolationBoundaryMarker(value);\r\n};\r\n\r\nconst isAsciiLetter = (value: string): boolean => {\r\n const code = value.charCodeAt(0);\r\n\r\n return (code >= 65 && code <= 90) || (code >= 97 && code <= 122);\r\n};\r\n\r\nconst isAttributeNameStart = (value: string): boolean => isAsciiLetter(value);\r\n\r\nconst isAttributeNameChar = (value: string): boolean => {\r\n const code = value.charCodeAt(0);\r\n\r\n return (\r\n isAsciiLetter(value) ||\r\n (code >= 48 && code <= 57) ||\r\n value === ':' ||\r\n value === '.' ||\r\n value === '_' ||\r\n value === '-'\r\n );\r\n};\r\n\r\nconst isQuoteChar = (value: string): boolean => value === '\"' || value === \"'\";\r\n\r\nconst isTagNameChar = (value: string): boolean => {\r\n const code = value.charCodeAt(0);\r\n\r\n return (\r\n isAsciiLetter(value) ||\r\n (code >= 48 && code <= 57) ||\r\n value === '.' ||\r\n value === '_' ||\r\n value === '-'\r\n );\r\n};\r\n\r\nconst hasLineBreak = (value: string): boolean => {\r\n for (let index = 0; index < value.length; index += 1) {\r\n if (value[index] === '\\n' || value[index] === '\\r') {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n};\r\n\r\nconst getTagNameEnd = (fragment: string): number => {\r\n let index = 0;\r\n\r\n while (\r\n index < fragment.length &&\r\n !isAttributeSeparator(fragment[index]) &&\r\n fragment[index] !== '/' &&\r\n fragment[index] !== '>'\r\n ) {\r\n index += 1;\r\n }\r\n\r\n return index;\r\n};\r\n\r\nconst isCustomElementTagName = (tagName: string): boolean => {\r\n if (!tagName.includes('-') || !isAsciiLetter(tagName[0])) {\r\n return false;\r\n }\r\n\r\n const last = tagName[tagName.length - 1];\r\n const code = last.charCodeAt(0);\r\n\r\n return isAsciiLetter(last) || (code >= 48 && code <= 57) || last === '.' || last === '_';\r\n};\r\n\r\nconst isAutoAllowedStoryAttribute = (attributeName: string): boolean => {\r\n return attributeName !== 'style' && !attributeName.startsWith('on');\r\n};\r\n\r\nconst findBooleanAttributeSuffix = (\r\n part: string\r\n): { attribute: string; basePart: string; spacing: string } | null => {\r\n let index = part.length - 1;\r\n\r\n while (index >= 0 && isWhitespace(part[index])) {\r\n index -= 1;\r\n }\r\n\r\n if (index < 0 || part[index] !== '=') {\r\n return null;\r\n }\r\n\r\n index -= 1;\r\n\r\n while (index >= 0 && isWhitespace(part[index])) {\r\n index -= 1;\r\n }\r\n\r\n const attributeEnd = index;\r\n\r\n while (\r\n index >= 0 &&\r\n !isWhitespace(part[index]) &&\r\n part[index] !== '?' &&\r\n part[index] !== '=' &&\r\n part[index] !== '/' &&\r\n part[index] !== '>'\r\n ) {\r\n index -= 1;\r\n }\r\n\r\n const attributeStart = index + 1;\r\n\r\n if (attributeStart > attributeEnd || part[index] !== '?') {\r\n return null;\r\n }\r\n\r\n const questionMarkIndex = index;\r\n let spacingStart = questionMarkIndex;\r\n\r\n while (spacingStart > 0 && isWhitespace(part[spacingStart - 1])) {\r\n spacingStart -= 1;\r\n }\r\n\r\n return {\r\n attribute: part.slice(attributeStart, attributeEnd + 1),\r\n basePart: part.slice(0, spacingStart),\r\n spacing: part.slice(spacingStart, questionMarkIndex),\r\n };\r\n};\r\n\r\nconst collectOpeningTagFragments = (template: string): string[] => {\r\n const fragments: string[] = [];\r\n let index = 0;\r\n\r\n while (index < template.length) {\r\n if (template[index] !== '<') {\r\n index += 1;\r\n continue;\r\n }\r\n\r\n const next = template[index + 1];\r\n\r\n if (!next || next === '/' || next === '!' || next === '?') {\r\n index += 1;\r\n continue;\r\n }\r\n\r\n let cursor = index + 1;\r\n\r\n if (!isAsciiLetter(template[cursor])) {\r\n index += 1;\r\n continue;\r\n }\r\n\r\n while (cursor < template.length && isTagNameChar(template[cursor])) {\r\n cursor += 1;\r\n }\r\n\r\n const tagStart = index + 1;\r\n const tagName = template.slice(tagStart, cursor);\r\n\r\n if (!tagName) {\r\n index += 1;\r\n continue;\r\n }\r\n\r\n let inQuote: '\"' | \"'\" | null = null;\r\n let tagEnd = cursor;\r\n\r\n while (tagEnd < template.length) {\r\n const char = template[tagEnd];\r\n\r\n if (inQuote) {\r\n if (char === inQuote) {\r\n inQuote = null;\r\n }\r\n\r\n tagEnd += 1;\r\n continue;\r\n }\r\n\r\n if (char === '\"' || char === \"'\") {\r\n inQuote = char;\r\n tagEnd += 1;\r\n continue;\r\n }\r\n\r\n if (char === '>') {\r\n fragments.push(template.slice(index + 1, tagEnd));\r\n tagEnd += 1;\r\n break;\r\n }\r\n\r\n tagEnd += 1;\r\n }\r\n\r\n index = tagEnd;\r\n }\r\n\r\n return fragments;\r\n};\r\n\r\n/**\r\n * Consumes a literal HTML attribute value starting at the given index.\r\n *\r\n * Returns the position immediately after a quoted or unquoted value. When the\r\n * current position reaches an interpolation boundary (optionally after\r\n * whitespace), the returned index advances past the boundary marker so\r\n * interpolated attributes do not swallow following authored attributes during\r\n * sanitizer allowlist inference.\r\n *\r\n * @param fragment - The opening-tag fragment currently being scanned\r\n * @param index - The position immediately after the `=` sign\r\n * @returns The index after the consumed literal value, or just past an\r\n * interpolation boundary when no literal value should be consumed from the\r\n * current template fragment.\r\n */\r\nconst skipAttributeValue = (fragment: string, index: number): number => {\r\n if (index >= fragment.length) {\r\n return index;\r\n }\r\n\r\n let cursor = index;\r\n\r\n if (isInterpolationBoundaryMarker(fragment[cursor])) {\r\n return cursor + 1;\r\n }\r\n\r\n while (cursor < fragment.length && isWhitespace(fragment[cursor])) {\r\n cursor += 1;\r\n }\r\n\r\n if (cursor >= fragment.length) {\r\n return cursor;\r\n }\r\n\r\n if (isInterpolationBoundaryMarker(fragment[cursor])) {\r\n return cursor + 1;\r\n }\r\n\r\n const quote = fragment[cursor];\r\n\r\n if (isQuoteChar(quote)) {\r\n cursor += 1;\r\n\r\n while (cursor < fragment.length) {\r\n if (fragment[cursor] === quote) {\r\n return cursor + 1;\r\n }\r\n\r\n cursor += 1;\r\n }\r\n\r\n return cursor;\r\n }\r\n\r\n while (\r\n cursor < fragment.length &&\r\n !isAttributeSeparator(fragment[cursor]) &&\r\n fragment[cursor] !== '/' &&\r\n fragment[cursor] !== '>'\r\n ) {\r\n cursor += 1;\r\n }\r\n\r\n if (cursor < fragment.length && isInterpolationBoundaryMarker(fragment[cursor])) {\r\n return cursor + 1;\r\n }\r\n\r\n return cursor;\r\n};\r\n\r\nconst collectAttributesFromTagFragment = (\r\n fragment: string,\r\n allowAttributes: Set<string>,\r\n autoAllowAttributes: boolean\r\n): void => {\r\n let index = 0;\r\n\r\n while (index < fragment.length && !isAttributeSeparator(fragment[index])) {\r\n index += 1;\r\n }\r\n\r\n while (index < fragment.length) {\r\n while (index < fragment.length && isAttributeSeparator(fragment[index])) {\r\n index += 1;\r\n }\r\n\r\n if (index >= fragment.length || fragment[index] === '/') {\r\n return;\r\n }\r\n\r\n // Skip standalone colons (e.g. namespace prefixes or framework-specific bindings)\r\n if (fragment[index] === ':') {\r\n index += 1;\r\n continue;\r\n }\r\n\r\n const hasBooleanPrefix = fragment[index] === '?';\r\n\r\n if (hasBooleanPrefix) {\r\n index += 1;\r\n }\r\n\r\n if (index >= fragment.length || !isAttributeNameStart(fragment[index])) {\r\n // Skip unrecognised character to avoid an infinite loop\r\n index += 1;\r\n continue;\r\n }\r\n\r\n const nameStart = index;\r\n\r\n index += 1;\r\n\r\n while (index < fragment.length && isAttributeNameChar(fragment[index])) {\r\n index += 1;\r\n }\r\n\r\n const attributeName = fragment.slice(nameStart, index).toLowerCase();\r\n\r\n while (index < fragment.length && isAttributeSeparator(fragment[index])) {\r\n index += 1;\r\n }\r\n\r\n if (index < fragment.length && fragment[index] === '=') {\r\n if (autoAllowAttributes && isAutoAllowedStoryAttribute(attributeName)) {\r\n allowAttributes.add(attributeName);\r\n }\r\n index = skipAttributeValue(fragment, index + 1);\r\n continue;\r\n }\r\n\r\n if (hasBooleanPrefix && autoAllowAttributes && isAutoAllowedStoryAttribute(attributeName)) {\r\n allowAttributes.add(attributeName);\r\n }\r\n }\r\n};\r\n\r\nconst collectTemplateSanitizeOptions = (strings: TemplateStringsArray) => {\r\n const template = strings.join(INTERPOLATION_BOUNDARY_MARKER);\r\n const allowTags = new Set<string>();\r\n const allowAttributes = new Set<string>();\r\n\r\n for (const fragment of collectOpeningTagFragments(template)) {\r\n const tagName = fragment.slice(0, getTagNameEnd(fragment)).toLowerCase();\r\n const isCustomElement = isCustomElementTagName(tagName);\r\n\r\n if (isCustomElement) {\r\n allowTags.add(tagName);\r\n }\r\n\r\n collectAttributesFromTagFragment(fragment, allowAttributes, isCustomElement);\r\n }\r\n\r\n return {\r\n allowTags: Array.from(allowTags),\r\n allowAttributes: Array.from(allowAttributes),\r\n };\r\n};\r\n\r\nconst resolveStoryValue = (value: StoryValue): string => {\r\n if (value == null) {\r\n return '';\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return value.map((item) => resolveStoryValue(item)).join('');\r\n }\r\n\r\n if (typeof value === 'function') {\r\n return resolveStoryValue(value());\r\n }\r\n\r\n return String(value);\r\n};\r\n\r\nconst resolveBooleanStoryValue = (value: StoryValue): boolean => {\r\n if (value == null) {\r\n return false;\r\n }\r\n\r\n if (typeof value === 'function') {\r\n return resolveBooleanStoryValue(value());\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return Boolean(resolveStoryValue(value));\r\n }\r\n\r\n if (typeof value === 'boolean') {\r\n return value;\r\n }\r\n\r\n return Boolean(value);\r\n};\r\n\r\n/**\r\n * Tagged template literal for Storybook render functions.\r\n *\r\n * Supports boolean attribute shorthand compatible with Storybook's string\r\n * renderer:\r\n *\r\n * ```ts\r\n * storyHtml`<bq-button ?disabled=${true}>Save</bq-button>`;\r\n * // => '<bq-button disabled=\"\">Save</bq-button>'\r\n * ```\r\n *\r\n * @param strings - Template literal string parts\r\n * @param values - Interpolated values\r\n * @returns HTML string compatible with `@storybook/web-components`\r\n */\r\nexport const storyHtml = (strings: TemplateStringsArray, ...values: StoryValue[]): string => {\r\n const rendered = strings.reduce((acc, part, index) => {\r\n if (index >= values.length) {\r\n return `${acc}${part}`;\r\n }\r\n\r\n const booleanAttributeMatch = findBooleanAttributeSuffix(part);\r\n\r\n if (booleanAttributeMatch) {\r\n const { attribute, basePart, spacing } = booleanAttributeMatch;\r\n const preservedSpacing = hasLineBreak(spacing) ? spacing : '';\r\n const isEnabled = resolveBooleanStoryValue(values[index]);\r\n\r\n return `${acc}${basePart}${isEnabled ? `${spacing}${attribute}` : preservedSpacing}`;\r\n }\r\n\r\n return `${acc}${part}${resolveStoryValue(values[index])}`;\r\n }, '');\r\n\r\n return sanitizeHtml(rendered, collectTemplateSanitizeOptions(strings));\r\n};\r\n\r\n/**\r\n * Conditionally render a value or template fragment.\r\n *\r\n * @param condition - Condition that controls rendering\r\n * @param truthyValue - Value or callback rendered when the condition is truthy\r\n * @param falsyValue - Optional value or callback rendered when the condition is falsy\r\n * @returns Rendered string fragment, or an empty string when the condition is\r\n * falsy and no fallback is provided\r\n */\r\nexport const when = (\r\n condition: unknown,\r\n truthyValue: StoryValue,\r\n falsyValue?: StoryValue\r\n): string => {\r\n return resolveStoryValue(condition ? truthyValue : falsyValue);\r\n};\r\n"],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* bQuery.js Testing Utilities
|
|
3
|
+
*
|
|
4
|
+
* Helpers for mounting components, controlling signals, mocking the router,
|
|
5
|
+
* dispatching events, and asserting async conditions in tests.
|
|
6
|
+
*
|
|
7
|
+
* @module bquery/testing
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* import {
|
|
12
|
+
* renderComponent,
|
|
13
|
+
* flushEffects,
|
|
14
|
+
* mockSignal,
|
|
15
|
+
* mockRouter,
|
|
16
|
+
* fireEvent,
|
|
17
|
+
* waitFor,
|
|
18
|
+
* } from '@bquery/bquery/testing';
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export { renderComponent, flushEffects, mockSignal, mockRouter, fireEvent, waitFor, } from './testing';
|
|
22
|
+
export type { FireEventOptions, MockRouter, MockRouterOptions, MockSignal, RenderComponentOptions, RenderResult, TestRoute, WaitForOptions, } from './types';
|
|
23
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,EACL,eAAe,EACf,YAAY,EACZ,UAAU,EACV,UAAU,EACV,SAAS,EACT,OAAO,GACR,MAAM,WAAW,CAAC;AAGnB,YAAY,EACV,gBAAgB,EAChB,UAAU,EACV,iBAAiB,EACjB,UAAU,EACV,sBAAsB,EACtB,YAAY,EACZ,SAAS,EACT,cAAc,GACf,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Testing utilities for bQuery.js.
|
|
3
|
+
*
|
|
4
|
+
* Provides helpers for mounting components, controlling signals, mocking
|
|
5
|
+
* the router, dispatching events, and asserting async conditions — all
|
|
6
|
+
* designed for use with `bun:test` and happy-dom.
|
|
7
|
+
*
|
|
8
|
+
* @module bquery/testing
|
|
9
|
+
*/
|
|
10
|
+
import type { FireEventOptions, MockRouter, MockRouterOptions, MockSignal, RenderComponentOptions, RenderResult, WaitForOptions } from './types';
|
|
11
|
+
/**
|
|
12
|
+
* Mounts a custom element by tag name for testing and returns a handle
|
|
13
|
+
* to interact with it.
|
|
14
|
+
*
|
|
15
|
+
* The element is created, configured with the given props and slots,
|
|
16
|
+
* and appended to the container (defaults to `document.body`). Call
|
|
17
|
+
* `unmount()` to remove the element and trigger its `disconnectedCallback`.
|
|
18
|
+
*
|
|
19
|
+
* @param tagName - The custom element tag name (must already be registered)
|
|
20
|
+
* @param options - Props, slots, and container configuration
|
|
21
|
+
* @returns A {@link RenderResult} with the element and an unmount function
|
|
22
|
+
* @throws {Error} If the tag name is not a valid custom element name
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```ts
|
|
26
|
+
* import { renderComponent } from '@bquery/bquery/testing';
|
|
27
|
+
*
|
|
28
|
+
* const { el, unmount } = renderComponent('my-counter', {
|
|
29
|
+
* props: { start: '5' },
|
|
30
|
+
* });
|
|
31
|
+
* expect(el.shadowRoot?.textContent).toContain('5');
|
|
32
|
+
* unmount();
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare function renderComponent(tagName: string, options?: RenderComponentOptions): RenderResult;
|
|
36
|
+
/**
|
|
37
|
+
* Synchronously flushes any pending reactive effects.
|
|
38
|
+
*
|
|
39
|
+
* In bQuery's reactive system, effects outside of a batch are executed
|
|
40
|
+
* synchronously. This helper exists primarily for clarity and for
|
|
41
|
+
* flushing effects that may have been deferred inside a batch.
|
|
42
|
+
*
|
|
43
|
+
* Internally it performs a no-op batch to trigger the flush of any
|
|
44
|
+
* pending observers that were queued during a prior `batch()` call.
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```ts
|
|
48
|
+
* import { signal, batch } from '@bquery/bquery/reactive';
|
|
49
|
+
* import { flushEffects } from '@bquery/bquery/testing';
|
|
50
|
+
*
|
|
51
|
+
* const count = signal(0);
|
|
52
|
+
* let observed = 0;
|
|
53
|
+
* effect(() => { observed = count.value; });
|
|
54
|
+
*
|
|
55
|
+
* batch(() => { count.value = 42; });
|
|
56
|
+
* flushEffects();
|
|
57
|
+
* expect(observed).toBe(42);
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
export declare function flushEffects(): void;
|
|
61
|
+
/**
|
|
62
|
+
* Creates a controllable signal for tests with `set()` and `reset()` helpers.
|
|
63
|
+
*
|
|
64
|
+
* This is a thin wrapper around `signal()` that records the initial value
|
|
65
|
+
* and adds explicit `set()` / `reset()` methods for clearer test intent.
|
|
66
|
+
*
|
|
67
|
+
* @template T - The type of the signal value
|
|
68
|
+
* @param initialValue - The initial value
|
|
69
|
+
* @returns A {@link MockSignal} instance
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* ```ts
|
|
73
|
+
* import { mockSignal } from '@bquery/bquery/testing';
|
|
74
|
+
*
|
|
75
|
+
* const count = mockSignal(0);
|
|
76
|
+
* count.set(5);
|
|
77
|
+
* expect(count.value).toBe(5);
|
|
78
|
+
* count.reset();
|
|
79
|
+
* expect(count.value).toBe(0);
|
|
80
|
+
* ```
|
|
81
|
+
*/
|
|
82
|
+
export declare function mockSignal<T>(initialValue: T): MockSignal<T>;
|
|
83
|
+
/**
|
|
84
|
+
* Creates a lightweight mock router for testing that does not interact
|
|
85
|
+
* with the browser History API.
|
|
86
|
+
*
|
|
87
|
+
* The mock router provides a reactive `currentRoute` signal that updates
|
|
88
|
+
* when `push()` or `replace()` is called, making it ideal for testing
|
|
89
|
+
* components or logic that depend on route state.
|
|
90
|
+
*
|
|
91
|
+
* @param options - Mock router configuration
|
|
92
|
+
* @returns A {@link MockRouter} instance
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* ```ts
|
|
96
|
+
* import { mockRouter } from '@bquery/bquery/testing';
|
|
97
|
+
*
|
|
98
|
+
* const router = mockRouter({
|
|
99
|
+
* routes: [
|
|
100
|
+
* { path: '/', component: () => null },
|
|
101
|
+
* { path: '/user/:id', component: () => null },
|
|
102
|
+
* ],
|
|
103
|
+
* initialPath: '/',
|
|
104
|
+
* });
|
|
105
|
+
*
|
|
106
|
+
* router.push('/user/42');
|
|
107
|
+
* expect(router.currentRoute.value.params.id).toBe('42');
|
|
108
|
+
* router.destroy();
|
|
109
|
+
* ```
|
|
110
|
+
*/
|
|
111
|
+
export declare function mockRouter(options?: MockRouterOptions): MockRouter;
|
|
112
|
+
/**
|
|
113
|
+
* Dispatches a synthetic event on an element and flushes pending effects.
|
|
114
|
+
*
|
|
115
|
+
* By default the event bubbles, is cancelable, and is composed (crosses
|
|
116
|
+
* shadow DOM boundaries). Pass a `detail` option to create a `CustomEvent`.
|
|
117
|
+
*
|
|
118
|
+
* @param el - The target element
|
|
119
|
+
* @param eventName - The event type (e.g. 'click', 'input', 'my-event')
|
|
120
|
+
* @param options - Event configuration
|
|
121
|
+
* @returns `true` if the event was not cancelled
|
|
122
|
+
*
|
|
123
|
+
* @example
|
|
124
|
+
* ```ts
|
|
125
|
+
* import { fireEvent } from '@bquery/bquery/testing';
|
|
126
|
+
*
|
|
127
|
+
* const button = document.createElement('button');
|
|
128
|
+
* let clicked = false;
|
|
129
|
+
* button.addEventListener('click', () => { clicked = true; });
|
|
130
|
+
* fireEvent(button, 'click');
|
|
131
|
+
* expect(clicked).toBe(true);
|
|
132
|
+
* ```
|
|
133
|
+
*/
|
|
134
|
+
export declare function fireEvent(el: Element, eventName: string, options?: FireEventOptions): boolean;
|
|
135
|
+
/**
|
|
136
|
+
* Waits for a predicate to return `true`, polling at a configurable interval.
|
|
137
|
+
*
|
|
138
|
+
* Useful for asserting conditions that depend on asynchronous operations,
|
|
139
|
+
* timers, or deferred reactive updates.
|
|
140
|
+
*
|
|
141
|
+
* @param predicate - A function that returns `true` when the condition is met
|
|
142
|
+
* @param options - Timeout and interval configuration
|
|
143
|
+
* @returns A promise that resolves when the predicate returns `true`
|
|
144
|
+
* @throws {Error} If the predicate does not return `true` within the timeout
|
|
145
|
+
*
|
|
146
|
+
* @example
|
|
147
|
+
* ```ts
|
|
148
|
+
* import { waitFor } from '@bquery/bquery/testing';
|
|
149
|
+
*
|
|
150
|
+
* await waitFor(() => document.querySelector('.loaded') !== null, {
|
|
151
|
+
* timeout: 2000,
|
|
152
|
+
* });
|
|
153
|
+
* ```
|
|
154
|
+
*/
|
|
155
|
+
export declare function waitFor(predicate: () => boolean | Promise<boolean>, options?: WaitForOptions): Promise<void>;
|
|
156
|
+
//# sourceMappingURL=testing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../src/testing/testing.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EACV,gBAAgB,EAEhB,UAAU,EACV,iBAAiB,EACjB,UAAU,EACV,sBAAsB,EACtB,YAAY,EAEZ,cAAc,EACf,MAAM,SAAS,CAAC;AA4DjB;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,sBAA2B,GACnC,YAAY,CAmDd;AAMD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,YAAY,IAAI,IAAI,CAOnC;AAMD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAsB5D;AAwLD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,UAAU,CA8BtE;AAMD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAuBjG;AAMD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,OAAO,CAC3B,SAAS,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,EAC3C,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAwBf"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for the bQuery testing utilities module.
|
|
3
|
+
* @module bquery/testing
|
|
4
|
+
*/
|
|
5
|
+
import type { Signal } from '../reactive/index';
|
|
6
|
+
/**
|
|
7
|
+
* Minimal route shape accepted by the testing mock router.
|
|
8
|
+
*/
|
|
9
|
+
export interface MockRouteDefinition {
|
|
10
|
+
path: string;
|
|
11
|
+
[key: string]: unknown;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Options for mounting a bQuery component in tests.
|
|
15
|
+
*/
|
|
16
|
+
export interface RenderComponentOptions {
|
|
17
|
+
/**
|
|
18
|
+
* Attributes (props) to set on the custom element.
|
|
19
|
+
* Keys are attribute names; values are stringified automatically.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```ts
|
|
23
|
+
* renderComponent('my-counter', { props: { start: 5 } });
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
props?: Record<string, unknown>;
|
|
27
|
+
/**
|
|
28
|
+
* Named or default slot content to inject inside the host element
|
|
29
|
+
* **before** it is connected to the DOM.
|
|
30
|
+
*
|
|
31
|
+
* - A plain string sets the default (unnamed) slot.
|
|
32
|
+
* - An object maps slot names to HTML strings.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```ts
|
|
36
|
+
* renderComponent('my-card', {
|
|
37
|
+
* slots: { default: '<p>Body</p>', header: '<h2>Title</h2>' },
|
|
38
|
+
* });
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
slots?: string | Record<string, string>;
|
|
42
|
+
/**
|
|
43
|
+
* Parent element to attach to. Defaults to `document.body`.
|
|
44
|
+
*/
|
|
45
|
+
container?: HTMLElement;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Return value of {@link renderComponent}.
|
|
49
|
+
*/
|
|
50
|
+
export interface RenderResult {
|
|
51
|
+
/** The mounted custom element instance. */
|
|
52
|
+
el: HTMLElement;
|
|
53
|
+
/** Remove the element and run cleanup. */
|
|
54
|
+
unmount: () => void;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* A controllable signal for use in tests.
|
|
58
|
+
*
|
|
59
|
+
* Extends the regular Signal with explicit `set()` and `reset()` helpers
|
|
60
|
+
* that make test intent clearer.
|
|
61
|
+
*/
|
|
62
|
+
export interface MockSignal<T> extends Signal<T> {
|
|
63
|
+
/**
|
|
64
|
+
* Explicitly set the signal value (alias for `.value = v`).
|
|
65
|
+
*/
|
|
66
|
+
set(value: T): void;
|
|
67
|
+
/**
|
|
68
|
+
* Reset the signal back to its initial value.
|
|
69
|
+
*/
|
|
70
|
+
reset(): void;
|
|
71
|
+
/**
|
|
72
|
+
* The initial value this mock was created with.
|
|
73
|
+
*/
|
|
74
|
+
readonly initialValue: T;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Options for creating a mock router.
|
|
78
|
+
*/
|
|
79
|
+
export interface MockRouterOptions {
|
|
80
|
+
/** Route definitions. Defaults to a single catch-all route. */
|
|
81
|
+
routes?: MockRouteDefinition[];
|
|
82
|
+
/** Initial path. Defaults to '/'. */
|
|
83
|
+
initialPath?: string;
|
|
84
|
+
/** Base path. Defaults to ''. */
|
|
85
|
+
base?: string;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* A lightweight mock router for tests that doesn't touch the History API.
|
|
89
|
+
*/
|
|
90
|
+
export interface MockRouter {
|
|
91
|
+
/** Navigate to a path (synchronous, no guards). */
|
|
92
|
+
push(path: string): void;
|
|
93
|
+
/** Replace the current path. */
|
|
94
|
+
replace(path: string): void;
|
|
95
|
+
/** The current route (reactive signal). */
|
|
96
|
+
readonly currentRoute: Signal<TestRoute>;
|
|
97
|
+
/** Registered routes. */
|
|
98
|
+
readonly routes: MockRouteDefinition[];
|
|
99
|
+
/** Destroy and clean up. */
|
|
100
|
+
destroy(): void;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Minimal route shape for the mock router.
|
|
104
|
+
*/
|
|
105
|
+
export interface TestRoute {
|
|
106
|
+
path: string;
|
|
107
|
+
params: Record<string, string>;
|
|
108
|
+
query: Record<string, string | string[]>;
|
|
109
|
+
matched: MockRouteDefinition | null;
|
|
110
|
+
hash: string;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Options for dispatching a synthetic event.
|
|
114
|
+
*/
|
|
115
|
+
export interface FireEventOptions {
|
|
116
|
+
/** Whether the event bubbles. Defaults to `true`. */
|
|
117
|
+
bubbles?: boolean;
|
|
118
|
+
/** Whether the event is cancelable. Defaults to `true`. */
|
|
119
|
+
cancelable?: boolean;
|
|
120
|
+
/** Whether the event crosses shadow DOM boundaries. Defaults to `true`. */
|
|
121
|
+
composed?: boolean;
|
|
122
|
+
/** Extra detail data for CustomEvent. */
|
|
123
|
+
detail?: unknown;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Options for the async `waitFor` helper.
|
|
127
|
+
*/
|
|
128
|
+
export interface WaitForOptions {
|
|
129
|
+
/** Maximum time (ms) to wait before timing out. Defaults to 1000. */
|
|
130
|
+
timeout?: number;
|
|
131
|
+
/** Polling interval (ms). Defaults to 10. */
|
|
132
|
+
interval?: number;
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/testing/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAKhD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAMD;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;;;;;;OAQG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEhC;;;;;;;;;;;;;OAaG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAExC;;OAEG;IACH,SAAS,CAAC,EAAE,WAAW,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,2CAA2C;IAC3C,EAAE,EAAE,WAAW,CAAC;IAChB,0CAA0C;IAC1C,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAMD;;;;;GAKG;AACH,MAAM,WAAW,UAAU,CAAC,CAAC,CAAE,SAAQ,MAAM,CAAC,CAAC,CAAC;IAC9C;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IAEpB;;OAEG;IACH,KAAK,IAAI,IAAI,CAAC;IAEd;;OAEG;IACH,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC;CAC1B;AAMD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,+DAA+D;IAC/D,MAAM,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC/B,qCAAqC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iCAAiC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,mDAAmD;IACnD,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,gCAAgC;IAChC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,2CAA2C;IAC3C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IACzC,yBAAyB;IACzB,QAAQ,CAAC,MAAM,EAAE,mBAAmB,EAAE,CAAC;IACvC,4BAA4B;IAC5B,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IACzC,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACpC,IAAI,EAAE,MAAM,CAAC;CACd;AAMD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,qDAAqD;IACrD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,2DAA2D;IAC3D,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yCAAyC;IACzC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAMD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,qEAAqE;IACrE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB"}
|