@bquery/bquery 1.6.0 → 1.8.1
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 +192 -18
- 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-DVBCy09c.js +421 -0
- package/dist/a11y-DVBCy09c.js.map +1 -0
- package/dist/a11y.es.mjs +14 -0
- package/dist/component/component.d.ts.map +1 -1
- package/dist/component/html.d.ts.map +1 -1
- package/dist/component/index.d.ts +2 -1
- 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 +53 -1
- package/dist/component/types.d.ts.map +1 -1
- package/dist/component-L3-JfOFz.js +684 -0
- package/dist/component-L3-JfOFz.js.map +1 -0
- package/dist/component.es.mjs +9 -6
- package/dist/{config-DRmZZno3.js → config-DhT9auRm.js} +4 -4
- package/dist/{config-DRmZZno3.js.map → config-DhT9auRm.js.map} +1 -1
- package/dist/constraints-D5RHQLmP.js +100 -0
- package/dist/constraints-D5RHQLmP.js.map +1 -0
- package/dist/core/collection.d.ts +134 -0
- package/dist/core/collection.d.ts.map +1 -1
- package/dist/core/element.d.ts +120 -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 +14 -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-DdtZHzsS.js +168 -0
- package/dist/core-DdtZHzsS.js.map +1 -0
- package/dist/{core-CCEabVHl.js → core-EMYSLzaT.js} +293 -194
- package/dist/core-EMYSLzaT.js.map +1 -0
- package/dist/core.es.mjs +48 -46
- package/dist/custom-directives-Dr4C5lVV.js +9 -0
- package/dist/custom-directives-Dr4C5lVV.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-BhB2iDPT.js +122 -0
- package/dist/devtools-BhB2iDPT.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-NwZBYh4l.js +244 -0
- package/dist/dnd-NwZBYh4l.js.map +1 -0
- package/dist/dnd.es.mjs +6 -0
- package/dist/env-CTdvLaH2.js +19 -0
- package/dist/env-CTdvLaH2.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 +40 -0
- package/dist/forms/index.d.ts.map +1 -0
- package/dist/forms/types.d.ts +185 -0
- package/dist/forms/types.d.ts.map +1 -0
- package/dist/forms/use-field.d.ts +34 -0
- package/dist/forms/use-field.d.ts.map +1 -0
- package/dist/forms/validators.d.ts +204 -0
- package/dist/forms/validators.d.ts.map +1 -0
- package/dist/forms-UcRHsYxC.js +227 -0
- package/dist/forms-UcRHsYxC.js.map +1 -0
- package/dist/forms.es.mjs +16 -0
- package/dist/full.d.ts +30 -11
- package/dist/full.d.ts.map +1 -1
- package/dist/full.es.mjs +209 -93
- 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/function-Cybd57JV.js +33 -0
- package/dist/function-Cybd57JV.js.map +1 -0
- 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-kuF6Ekj6.js +89 -0
- package/dist/i18n-kuF6Ekj6.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 +257 -143
- 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-i-fB5WxI.js +340 -0
- package/dist/media-i-fB5WxI.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-BJsAuULb.js +530 -0
- package/dist/motion-BJsAuULb.js.map +1 -0
- package/dist/motion.es.mjs +27 -23
- package/dist/{view-C70lA3vf.js → mount-B4Y8bk8Z.js} +166 -160
- package/dist/mount-B4Y8bk8Z.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-Dr9b6fsq.js → platform-Dw2gE3zI.js} +21 -22
- package/dist/{platform-Dr9b6fsq.js.map → platform-Dw2gE3zI.js.map} +1 -1
- 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-C2WuC8SF.js +66 -0
- package/dist/plugin-C2WuC8SF.js.map +1 -0
- package/dist/plugin.es.mjs +9 -0
- package/dist/reactive/async-data.d.ts +28 -3
- package/dist/reactive/async-data.d.ts.map +1 -1
- package/dist/reactive/computed.d.ts +10 -0
- package/dist/reactive/computed.d.ts.map +1 -1
- package/dist/reactive/effect.d.ts +3 -0
- package/dist/reactive/effect.d.ts.map +1 -1
- package/dist/reactive/http.d.ts +194 -0
- package/dist/reactive/http.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/pagination.d.ts +126 -0
- package/dist/reactive/pagination.d.ts.map +1 -0
- package/dist/reactive/polling.d.ts +55 -0
- package/dist/reactive/polling.d.ts.map +1 -0
- package/dist/reactive/readonly.d.ts +20 -1
- package/dist/reactive/readonly.d.ts.map +1 -1
- package/dist/reactive/rest.d.ts +293 -0
- package/dist/reactive/rest.d.ts.map +1 -0
- package/dist/reactive/scope.d.ts +140 -0
- package/dist/reactive/scope.d.ts.map +1 -0
- package/dist/reactive/signal.d.ts +16 -2
- package/dist/reactive/signal.d.ts.map +1 -1
- package/dist/reactive/to-value.d.ts +57 -0
- package/dist/reactive/to-value.d.ts.map +1 -0
- package/dist/reactive/websocket.d.ts +285 -0
- package/dist/reactive/websocket.d.ts.map +1 -0
- package/dist/reactive-DwkhUJfP.js +1148 -0
- package/dist/reactive-DwkhUJfP.js.map +1 -0
- package/dist/reactive.es.mjs +38 -20
- package/dist/registry-B08iilIh.js +26 -0
- package/dist/registry-B08iilIh.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 +15 -7
- 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/state.d.ts +25 -2
- package/dist/router/state.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-CQikC9Ed.js +492 -0
- package/dist/router-CQikC9Ed.js.map +1 -0
- package/dist/router.es.mjs +14 -10
- package/dist/{sanitize-Bs2dkMby.js → sanitize-B1V4JswB.js} +2 -1
- package/dist/{sanitize-Bs2dkMby.js.map → sanitize-B1V4JswB.js.map} +1 -1
- package/dist/security/index.d.ts +2 -2
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security.es.mjs +1 -1
- 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-_dAcGdzu.js +248 -0
- package/dist/ssr-_dAcGdzu.js.map +1 -0
- package/dist/ssr.es.mjs +9 -0
- package/dist/store/create-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/persisted.d.ts +38 -4
- package/dist/store/persisted.d.ts.map +1 -1
- package/dist/store/types.d.ts +138 -1
- 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-Cb3gPRve.js +338 -0
- package/dist/store-Cb3gPRve.js.map +1 -0
- package/dist/store.es.mjs +11 -10
- package/dist/storybook/index.d.ts.map +1 -1
- package/dist/storybook.es.mjs +1 -1
- package/dist/storybook.es.mjs.map +1 -1
- 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-C5Sjfsna.js +224 -0
- package/dist/testing-C5Sjfsna.js.map +1 -0
- package/dist/testing.es.mjs +9 -0
- package/dist/type-guards-BMX2c0LP.js +44 -0
- package/dist/type-guards-BMX2c0LP.js.map +1 -0
- package/dist/untrack-D0fnO5k2.js +36 -0
- package/dist/untrack-D0fnO5k2.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 +9 -9
- package/package.json +47 -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 +599 -524
- package/src/component/html.ts +153 -153
- package/src/component/index.ts +52 -50
- package/src/component/library.ts +540 -518
- package/src/component/scope.ts +212 -0
- package/src/component/types.ts +310 -256
- package/src/core/collection.ts +249 -1
- package/src/core/element.ts +252 -11
- package/src/core/env.ts +60 -0
- package/src/core/index.ts +1 -0
- package/src/core/shared.ts +64 -0
- package/src/core/utils/index.ts +66 -1
- 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 +320 -0
- package/src/forms/index.ts +70 -0
- package/src/forms/types.ts +203 -0
- package/src/forms/use-field.ts +231 -0
- package/src/forms/validators.ts +294 -0
- package/src/full.ts +554 -229
- 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 +72 -0
- package/src/media/battery.ts +116 -0
- package/src/media/breakpoints.ts +129 -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 +11 -2
- package/src/motion/morph.ts +151 -0
- package/src/motion/parallax.ts +120 -0
- package/src/motion/reduced-motion.ts +52 -3
- package/src/motion/types.ts +63 -0
- package/src/motion/typewriter.ts +164 -0
- package/src/plugin/index.ts +37 -0
- package/src/plugin/registry.ts +284 -0
- package/src/plugin/types.ts +137 -0
- package/src/reactive/async-data.ts +250 -29
- package/src/reactive/computed.ts +53 -1
- package/src/reactive/effect.ts +29 -6
- package/src/reactive/http.ts +790 -0
- package/src/reactive/index.ts +60 -0
- package/src/reactive/pagination.ts +317 -0
- package/src/reactive/polling.ts +179 -0
- package/src/reactive/readonly.ts +52 -8
- package/src/reactive/rest.ts +859 -0
- package/src/reactive/scope.ts +276 -0
- package/src/reactive/signal.ts +61 -1
- package/src/reactive/to-value.ts +71 -0
- package/src/reactive/websocket.ts +849 -0
- package/src/router/bq-link.ts +279 -0
- package/src/router/constraints.ts +204 -0
- package/src/router/index.ts +15 -7
- package/src/router/match.ts +255 -49
- package/src/router/path-pattern.ts +52 -0
- package/src/router/query.ts +3 -0
- package/src/router/router.ts +258 -48
- package/src/router/state.ts +51 -3
- package/src/router/types.ts +50 -4
- package/src/router/use-route.ts +68 -0
- package/src/router/utils.ts +44 -3
- package/src/security/index.ts +12 -17
- package/src/security/sanitize.ts +70 -70
- package/src/security/trusted-html.ts +71 -71
- package/src/ssr/hydrate.ts +84 -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 +146 -8
- package/src/store/define-store.ts +49 -49
- package/src/store/index.ts +5 -0
- package/src/store/mapping.ts +74 -74
- package/src/store/persisted.ts +245 -62
- package/src/store/types.ts +247 -92
- package/src/store/utils.ts +4 -10
- package/src/store/watch.ts +53 -53
- package/src/storybook/index.ts +480 -479
- 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 +28 -0
- package/src/view/evaluate.ts +2 -0
- package/src/view/process.ts +19 -3
- package/dist/component-BEQgt5hl.js +0 -600
- package/dist/component-BEQgt5hl.js.map +0 -1
- package/dist/core-BGQJVw0-.js +0 -35
- package/dist/core-BGQJVw0-.js.map +0 -1
- package/dist/core-CCEabVHl.js.map +0 -1
- package/dist/effect-AFRW_Plg.js +0 -84
- package/dist/effect-AFRW_Plg.js.map +0 -1
- package/dist/motion-D9TcHxOF.js +0 -415
- package/dist/motion-D9TcHxOF.js.map +0 -1
- package/dist/reactive-DSkct0dO.js +0 -254
- package/dist/reactive-DSkct0dO.js.map +0 -1
- package/dist/router-CbDhl8rS.js +0 -188
- package/dist/router-CbDhl8rS.js.map +0 -1
- package/dist/store-BwDvI45q.js +0 -263
- package/dist/store-BwDvI45q.js.map +0 -1
- package/dist/untrack-B0rVscTc.js +0 -7
- package/dist/untrack-B0rVscTc.js.map +0 -1
- package/dist/view-C70lA3vf.js.map +0 -1
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Form handling module for bQuery.js.
|
|
3
|
+
*
|
|
4
|
+
* Provides a reactive, TypeScript-first form API with field-level
|
|
5
|
+
* and cross-field validation, dirty/touched tracking, and submission
|
|
6
|
+
* handling — all backed by bQuery's signal-based reactivity system.
|
|
7
|
+
*
|
|
8
|
+
* @module bquery/forms
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* import { createForm, required, email, min } from '@bquery/bquery/forms';
|
|
13
|
+
*
|
|
14
|
+
* const form = createForm({
|
|
15
|
+
* fields: {
|
|
16
|
+
* name: { initialValue: '', validators: [required()] },
|
|
17
|
+
* email: { initialValue: '', validators: [required(), email()] },
|
|
18
|
+
* age: { initialValue: 0, validators: [min(18, 'Must be 18+')] },
|
|
19
|
+
* },
|
|
20
|
+
* onSubmit: async (values) => {
|
|
21
|
+
* await fetch('/api/register', {
|
|
22
|
+
* method: 'POST',
|
|
23
|
+
* body: JSON.stringify(values),
|
|
24
|
+
* });
|
|
25
|
+
* },
|
|
26
|
+
* });
|
|
27
|
+
*
|
|
28
|
+
* // Reactive access
|
|
29
|
+
* console.log(form.isValid.value); // boolean
|
|
30
|
+
* console.log(form.fields.name.error.value); // '' or error message
|
|
31
|
+
*
|
|
32
|
+
* // Submit
|
|
33
|
+
* await form.handleSubmit();
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export { createForm } from './create-form';
|
|
37
|
+
export { useFormField } from './use-field';
|
|
38
|
+
export { custom, customAsync, email, matchField, max, maxLength, min, minLength, pattern, required, url, } from './validators';
|
|
39
|
+
export type { AsyncValidator, CrossFieldValidator, FieldConfig, Form, FormConfig, FormErrors, FormField, FormFieldValidationMode, FormFields, SubmitHandler, SyncValidator, UseFormFieldOptions, UseFormFieldReturn, ValidationResult, Validator, } from './types';
|
|
40
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/forms/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EACL,MAAM,EACN,WAAW,EACX,KAAK,EACL,UAAU,EACV,GAAG,EACH,SAAS,EACT,GAAG,EACH,SAAS,EACT,OAAO,EACP,QAAQ,EACR,GAAG,GACJ,MAAM,cAAc,CAAC;AAEtB,YAAY,EACV,cAAc,EACd,mBAAmB,EACnB,WAAW,EACX,IAAI,EACJ,UAAU,EACV,UAAU,EACV,SAAS,EACT,uBAAuB,EACvB,UAAU,EACV,aAAa,EACb,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,SAAS,GACV,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Form module types and interfaces.
|
|
3
|
+
*
|
|
4
|
+
* @module bquery/forms
|
|
5
|
+
*/
|
|
6
|
+
import type { Computed, Signal } from '../reactive/index';
|
|
7
|
+
/**
|
|
8
|
+
* Result of a single validation rule.
|
|
9
|
+
* A string indicates an error message; `true` or `undefined` means valid.
|
|
10
|
+
*/
|
|
11
|
+
export type ValidationResult = string | true | undefined;
|
|
12
|
+
/**
|
|
13
|
+
* Synchronous validator function.
|
|
14
|
+
*
|
|
15
|
+
* @param value - The current field value
|
|
16
|
+
* @returns A validation result — `true` / `undefined` for valid, or an error string
|
|
17
|
+
*/
|
|
18
|
+
export type SyncValidator<T = unknown> = (value: T) => ValidationResult;
|
|
19
|
+
/**
|
|
20
|
+
* Asynchronous validator function.
|
|
21
|
+
*
|
|
22
|
+
* @param value - The current field value
|
|
23
|
+
* @returns A promise resolving to a validation result
|
|
24
|
+
*/
|
|
25
|
+
export type AsyncValidator<T = unknown> = (value: T) => Promise<ValidationResult>;
|
|
26
|
+
/**
|
|
27
|
+
* Either a sync or async validator.
|
|
28
|
+
*/
|
|
29
|
+
export type Validator<T = unknown> = SyncValidator<T> | AsyncValidator<T>;
|
|
30
|
+
/**
|
|
31
|
+
* Configuration for a single form field.
|
|
32
|
+
*
|
|
33
|
+
* @template T - The type of the field value
|
|
34
|
+
*/
|
|
35
|
+
export type FieldConfig<T = unknown> = {
|
|
36
|
+
/** Initial value for this field */
|
|
37
|
+
initialValue: T;
|
|
38
|
+
/** Validation rules applied in order; stops at first failure */
|
|
39
|
+
validators?: Validator<T>[];
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Reactive state for a single form field.
|
|
43
|
+
*
|
|
44
|
+
* @template T - The type of the field value
|
|
45
|
+
*/
|
|
46
|
+
export type FormField<T = unknown> = {
|
|
47
|
+
/** Reactive signal holding the current value */
|
|
48
|
+
value: Signal<T>;
|
|
49
|
+
/** Reactive signal for the first validation error (empty string when valid) */
|
|
50
|
+
error: Signal<string>;
|
|
51
|
+
/** Whether the field value differs from its initial value */
|
|
52
|
+
isDirty: Computed<boolean>;
|
|
53
|
+
/** Whether the field has been interacted with (blur / explicit touch) */
|
|
54
|
+
isTouched: Signal<boolean>;
|
|
55
|
+
/** Whether the field has never been modified */
|
|
56
|
+
isPristine: Computed<boolean>;
|
|
57
|
+
/** Mark the field as touched */
|
|
58
|
+
touch: () => void;
|
|
59
|
+
/** Reset the field to its initial value and clear errors */
|
|
60
|
+
reset: () => void;
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Controls when {@link useFormField} runs validation automatically.
|
|
64
|
+
*/
|
|
65
|
+
export type FormFieldValidationMode = 'manual' | 'change' | 'blur' | 'both';
|
|
66
|
+
/**
|
|
67
|
+
* Configuration for {@link useFormField}.
|
|
68
|
+
*
|
|
69
|
+
* @template T - The type of the field value
|
|
70
|
+
*/
|
|
71
|
+
export type UseFormFieldOptions<T = unknown> = {
|
|
72
|
+
/** Validation rules applied in order; stops at first failure */
|
|
73
|
+
validators?: Validator<T>[];
|
|
74
|
+
/** When validation should run automatically. Defaults to `'manual'`. */
|
|
75
|
+
validateOn?: FormFieldValidationMode;
|
|
76
|
+
/** Delay automatic validation by the given milliseconds. Defaults to `0`. */
|
|
77
|
+
debounceMs?: number;
|
|
78
|
+
/** Initial error message for the field. Defaults to an empty string. */
|
|
79
|
+
initialError?: string;
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* Return value of {@link useFormField}.
|
|
83
|
+
*
|
|
84
|
+
* Extends the standard field state with validation helpers for standalone field usage.
|
|
85
|
+
*
|
|
86
|
+
* @template T - The type of the field value
|
|
87
|
+
*/
|
|
88
|
+
export type UseFormFieldReturn<T = unknown> = FormField<T> & {
|
|
89
|
+
/** Whether the current field has no validation error */
|
|
90
|
+
isValid: Computed<boolean>;
|
|
91
|
+
/** Reactive signal: `true` while async validation is still running */
|
|
92
|
+
isValidating: Signal<boolean>;
|
|
93
|
+
/** Validate the current field value immediately */
|
|
94
|
+
validate: () => Promise<boolean>;
|
|
95
|
+
/** Cancel pending timers and automatic validation subscriptions */
|
|
96
|
+
destroy: () => void;
|
|
97
|
+
};
|
|
98
|
+
/**
|
|
99
|
+
* Map of field names to their reactive field state.
|
|
100
|
+
*/
|
|
101
|
+
export type FormFields<T extends Record<string, unknown>> = {
|
|
102
|
+
[K in keyof T]: FormField<T[K]>;
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* Map of field names to their error strings (reactive signals).
|
|
106
|
+
*/
|
|
107
|
+
export type FormErrors<T extends Record<string, unknown>> = {
|
|
108
|
+
[K in keyof T]: Signal<string>;
|
|
109
|
+
};
|
|
110
|
+
/**
|
|
111
|
+
* Cross-field validation function.
|
|
112
|
+
* Receives all current field values and returns a map of field name → error message,
|
|
113
|
+
* or an empty object / undefined if all fields are valid.
|
|
114
|
+
*/
|
|
115
|
+
export type CrossFieldValidator<T extends Record<string, unknown>> = (values: T) => Partial<Record<keyof T, string>> | undefined | Promise<Partial<Record<keyof T, string>> | undefined>;
|
|
116
|
+
/**
|
|
117
|
+
* Submit handler function.
|
|
118
|
+
*
|
|
119
|
+
* @template T - Shape of the form values
|
|
120
|
+
*/
|
|
121
|
+
export type SubmitHandler<T extends Record<string, unknown>> = (values: T) => void | Promise<void>;
|
|
122
|
+
/**
|
|
123
|
+
* Configuration for `createForm()`.
|
|
124
|
+
*
|
|
125
|
+
* @template T - Shape of the form values
|
|
126
|
+
*
|
|
127
|
+
* @example
|
|
128
|
+
* ```ts
|
|
129
|
+
* const config: FormConfig<{ name: string; age: number }> = {
|
|
130
|
+
* fields: {
|
|
131
|
+
* name: { initialValue: '', validators: [required('Name is required')] },
|
|
132
|
+
* age: { initialValue: 0, validators: [min(1, 'Must be positive')] },
|
|
133
|
+
* },
|
|
134
|
+
* onSubmit: (values) => console.log(values),
|
|
135
|
+
* };
|
|
136
|
+
* ```
|
|
137
|
+
*/
|
|
138
|
+
export type FormConfig<T extends Record<string, unknown>> = {
|
|
139
|
+
/** Per-field configuration with initial values and validators */
|
|
140
|
+
fields: {
|
|
141
|
+
[K in keyof T]: FieldConfig<T[K]>;
|
|
142
|
+
};
|
|
143
|
+
/** Optional cross-field validators run after per-field validation */
|
|
144
|
+
crossValidators?: CrossFieldValidator<T>[];
|
|
145
|
+
/** Callback invoked on successful form submission */
|
|
146
|
+
onSubmit?: SubmitHandler<T>;
|
|
147
|
+
};
|
|
148
|
+
/**
|
|
149
|
+
* Return value of `createForm()`.
|
|
150
|
+
*
|
|
151
|
+
* @template T - Shape of the form values
|
|
152
|
+
*/
|
|
153
|
+
export type Form<T extends Record<string, unknown>> = {
|
|
154
|
+
/** Reactive field objects keyed by field name */
|
|
155
|
+
fields: FormFields<T>;
|
|
156
|
+
/** Shorthand error signals keyed by field name */
|
|
157
|
+
errors: FormErrors<T>;
|
|
158
|
+
/** Computed signal: `true` when all fields pass validation */
|
|
159
|
+
isValid: Computed<boolean>;
|
|
160
|
+
/** Computed signal: `true` when any field value differs from initial */
|
|
161
|
+
isDirty: Computed<boolean>;
|
|
162
|
+
/** Reactive signal: `true` while the submit handler is executing */
|
|
163
|
+
isSubmitting: Signal<boolean>;
|
|
164
|
+
/** Validate all fields and, if valid, call the `onSubmit` handler */
|
|
165
|
+
handleSubmit: () => Promise<void>;
|
|
166
|
+
/** Validate a single field by name */
|
|
167
|
+
validateField: (name: keyof T & string) => Promise<void>;
|
|
168
|
+
/** Validate all fields without submitting */
|
|
169
|
+
validate: () => Promise<boolean>;
|
|
170
|
+
/** Reset the entire form to initial values */
|
|
171
|
+
reset: () => void;
|
|
172
|
+
/** Get a snapshot of all current field values */
|
|
173
|
+
getValues: () => T;
|
|
174
|
+
/**
|
|
175
|
+
* Bulk-set field values from a partial object.
|
|
176
|
+
* Only fields present in the object are updated; missing keys are left unchanged.
|
|
177
|
+
*/
|
|
178
|
+
setValues: (values: Partial<T>) => void;
|
|
179
|
+
/**
|
|
180
|
+
* Bulk-set field error messages from a partial object.
|
|
181
|
+
* Useful for applying server-side validation errors.
|
|
182
|
+
*/
|
|
183
|
+
setErrors: (errors: Partial<Record<keyof T & string, string>>) => void;
|
|
184
|
+
};
|
|
185
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/forms/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standalone reactive field composable.
|
|
3
|
+
*
|
|
4
|
+
* @module bquery/forms
|
|
5
|
+
*/
|
|
6
|
+
import type { MaybeSignal } from '../reactive/index';
|
|
7
|
+
import type { UseFormFieldOptions, UseFormFieldReturn } from './types';
|
|
8
|
+
/**
|
|
9
|
+
* Creates a standalone reactive form field with optional automatic validation.
|
|
10
|
+
*
|
|
11
|
+
* This helper is useful when you want field-level state without creating a full form,
|
|
12
|
+
* or when you want to bind an existing signal to the forms validation model.
|
|
13
|
+
*
|
|
14
|
+
* @template T - The type of the field value
|
|
15
|
+
* @param initialValue - Plain initial value, an existing writable signal to reuse, or a
|
|
16
|
+
* computed / readonly reactive source to snapshot
|
|
17
|
+
* @param options - Validation mode, validators, debounce, and initial error configuration
|
|
18
|
+
* @returns A reactive field handle with validation helpers
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```ts
|
|
22
|
+
* import { useFormField, required } from '@bquery/bquery/forms';
|
|
23
|
+
*
|
|
24
|
+
* const email = useFormField('', {
|
|
25
|
+
* validators: [required()],
|
|
26
|
+
* validateOn: 'blur',
|
|
27
|
+
* });
|
|
28
|
+
*
|
|
29
|
+
* email.value.value = 'ada@example.com';
|
|
30
|
+
* email.touch();
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export declare const useFormField: <T>(initialValue: MaybeSignal<T>, options?: UseFormFieldOptions<T>) => UseFormFieldReturn<T>;
|
|
34
|
+
//# sourceMappingURL=use-field.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-field.d.ts","sourceRoot":"","sources":["../../src/forms/use-field.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAA+B,MAAM,SAAS,CAAC;AAmBpG;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,YAAY,GAAI,CAAC,EAC5B,cAAc,WAAW,CAAC,CAAC,CAAC,EAC5B,UAAS,mBAAmB,CAAC,CAAC,CAAM,KACnC,kBAAkB,CAAC,CAAC,CA0JtB,CAAC"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in validation functions for form fields.
|
|
3
|
+
*
|
|
4
|
+
* Each factory returns a {@link SyncValidator} that can be passed
|
|
5
|
+
* to a field's `validators` array in {@link FormConfig}.
|
|
6
|
+
*
|
|
7
|
+
* @module bquery/forms
|
|
8
|
+
*/
|
|
9
|
+
import type { AsyncValidator, SyncValidator } from './types';
|
|
10
|
+
/**
|
|
11
|
+
* Requires a non-empty value.
|
|
12
|
+
*
|
|
13
|
+
* Fails for `undefined`, `null`, empty strings (after trim), and empty arrays.
|
|
14
|
+
*
|
|
15
|
+
* @param message - Custom error message (default: `'This field is required'`)
|
|
16
|
+
* @returns A sync validator function
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```ts
|
|
20
|
+
* import { required } from '@bquery/bquery/forms';
|
|
21
|
+
* const validate = required('Name is required');
|
|
22
|
+
* validate(''); // 'Name is required'
|
|
23
|
+
* validate('Ada'); // true
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export declare const required: (message?: string) => SyncValidator;
|
|
27
|
+
/**
|
|
28
|
+
* Requires a string to have at least `len` characters.
|
|
29
|
+
*
|
|
30
|
+
* Non-string values are coerced via `String()` before checking length.
|
|
31
|
+
*
|
|
32
|
+
* @param len - Minimum length
|
|
33
|
+
* @param message - Custom error message
|
|
34
|
+
* @returns A sync validator function
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```ts
|
|
38
|
+
* import { minLength } from '@bquery/bquery/forms';
|
|
39
|
+
* const validate = minLength(3);
|
|
40
|
+
* validate('ab'); // 'Must be at least 3 characters'
|
|
41
|
+
* validate('abc'); // true
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export declare const minLength: (len: number, message?: string) => SyncValidator<unknown>;
|
|
45
|
+
/**
|
|
46
|
+
* Requires a string to have at most `len` characters.
|
|
47
|
+
*
|
|
48
|
+
* Non-string values are coerced via `String()` before checking length.
|
|
49
|
+
*
|
|
50
|
+
* @param len - Maximum length
|
|
51
|
+
* @param message - Custom error message
|
|
52
|
+
* @returns A sync validator function
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```ts
|
|
56
|
+
* import { maxLength } from '@bquery/bquery/forms';
|
|
57
|
+
* const validate = maxLength(10);
|
|
58
|
+
* validate('hello world!!'); // 'Must be at most 10 characters'
|
|
59
|
+
* validate('hello'); // true
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
export declare const maxLength: (len: number, message?: string) => SyncValidator<unknown>;
|
|
63
|
+
/**
|
|
64
|
+
* Requires a string to match a regular expression pattern.
|
|
65
|
+
*
|
|
66
|
+
* Non-string values are coerced via `String()` before testing.
|
|
67
|
+
*
|
|
68
|
+
* @param regex - Pattern to test against
|
|
69
|
+
* @param message - Custom error message (default: `'Invalid format'`)
|
|
70
|
+
* @returns A sync validator function
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* ```ts
|
|
74
|
+
* import { pattern } from '@bquery/bquery/forms';
|
|
75
|
+
* const validate = pattern(/^\d+$/, 'Numbers only');
|
|
76
|
+
* validate('abc'); // 'Numbers only'
|
|
77
|
+
* validate('123'); // true
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
export declare const pattern: (regex: RegExp, message?: string) => SyncValidator<unknown>;
|
|
81
|
+
/**
|
|
82
|
+
* RFC 5322–simplified email validation.
|
|
83
|
+
*
|
|
84
|
+
* @param message - Custom error message (default: `'Invalid email address'`)
|
|
85
|
+
* @returns A sync validator function
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* ```ts
|
|
89
|
+
* import { email } from '@bquery/bquery/forms';
|
|
90
|
+
* const validate = email();
|
|
91
|
+
* validate('nope'); // 'Invalid email address'
|
|
92
|
+
* validate('ada@lovelace'); // 'Invalid email address'
|
|
93
|
+
* validate('ada@love.co'); // true
|
|
94
|
+
* ```
|
|
95
|
+
*/
|
|
96
|
+
export declare const email: (message?: string) => SyncValidator<unknown>;
|
|
97
|
+
/**
|
|
98
|
+
* Requires a string to be a valid URL.
|
|
99
|
+
*
|
|
100
|
+
* Uses the native `URL` constructor for validation.
|
|
101
|
+
*
|
|
102
|
+
* @param message - Custom error message (default: `'Invalid URL'`)
|
|
103
|
+
* @returns A sync validator function
|
|
104
|
+
*
|
|
105
|
+
* @example
|
|
106
|
+
* ```ts
|
|
107
|
+
* import { url } from '@bquery/bquery/forms';
|
|
108
|
+
* const validate = url();
|
|
109
|
+
* validate('not-a-url'); // 'Invalid URL'
|
|
110
|
+
* validate('https://example.com'); // true
|
|
111
|
+
* ```
|
|
112
|
+
*/
|
|
113
|
+
export declare const url: (message?: string) => SyncValidator<unknown>;
|
|
114
|
+
/**
|
|
115
|
+
* Requires a numeric value to be at least `limit`.
|
|
116
|
+
*
|
|
117
|
+
* @param limit - Minimum allowed value (inclusive)
|
|
118
|
+
* @param message - Custom error message
|
|
119
|
+
* @returns A sync validator function
|
|
120
|
+
*
|
|
121
|
+
* @example
|
|
122
|
+
* ```ts
|
|
123
|
+
* import { min } from '@bquery/bquery/forms';
|
|
124
|
+
* const validate = min(1, 'Must be positive');
|
|
125
|
+
* validate(0); // 'Must be positive'
|
|
126
|
+
* validate(1); // true
|
|
127
|
+
* ```
|
|
128
|
+
*/
|
|
129
|
+
export declare const min: (limit: number, message?: string) => SyncValidator<unknown>;
|
|
130
|
+
/**
|
|
131
|
+
* Requires a numeric value to be at most `limit`.
|
|
132
|
+
*
|
|
133
|
+
* @param limit - Maximum allowed value (inclusive)
|
|
134
|
+
* @param message - Custom error message
|
|
135
|
+
* @returns A sync validator function
|
|
136
|
+
*
|
|
137
|
+
* @example
|
|
138
|
+
* ```ts
|
|
139
|
+
* import { max } from '@bquery/bquery/forms';
|
|
140
|
+
* const validate = max(100, 'Too high');
|
|
141
|
+
* validate(101); // 'Too high'
|
|
142
|
+
* validate(100); // true
|
|
143
|
+
* ```
|
|
144
|
+
*/
|
|
145
|
+
export declare const max: (limit: number, message?: string) => SyncValidator<unknown>;
|
|
146
|
+
/**
|
|
147
|
+
* Creates a custom synchronous validator from any predicate function.
|
|
148
|
+
*
|
|
149
|
+
* @param fn - Predicate that returns `true` when the value is valid
|
|
150
|
+
* @param message - Error message when the predicate returns `false`
|
|
151
|
+
* @returns A sync validator function
|
|
152
|
+
*
|
|
153
|
+
* @example
|
|
154
|
+
* ```ts
|
|
155
|
+
* import { custom } from '@bquery/bquery/forms';
|
|
156
|
+
* const isEven = custom((v: number) => v % 2 === 0, 'Must be even');
|
|
157
|
+
* isEven(3); // 'Must be even'
|
|
158
|
+
* isEven(4); // true
|
|
159
|
+
* ```
|
|
160
|
+
*/
|
|
161
|
+
export declare const custom: <T = unknown>(fn: (value: T) => boolean, message: string) => SyncValidator<T>;
|
|
162
|
+
/**
|
|
163
|
+
* Creates a custom asynchronous validator.
|
|
164
|
+
*
|
|
165
|
+
* @param fn - Async predicate that resolves to `true` when valid
|
|
166
|
+
* @param message - Error message when the predicate resolves to `false`
|
|
167
|
+
* @returns An async validator function
|
|
168
|
+
*
|
|
169
|
+
* @example
|
|
170
|
+
* ```ts
|
|
171
|
+
* import { customAsync } from '@bquery/bquery/forms';
|
|
172
|
+
* const isUnique = customAsync(
|
|
173
|
+
* async (name: string) => !(await checkExists(name)),
|
|
174
|
+
* 'Already taken',
|
|
175
|
+
* );
|
|
176
|
+
* ```
|
|
177
|
+
*/
|
|
178
|
+
export declare const customAsync: <T = unknown>(fn: (value: T) => Promise<boolean>, message: string) => AsyncValidator<T>;
|
|
179
|
+
/**
|
|
180
|
+
* Requires a field's value to match the current value of a reference signal.
|
|
181
|
+
*
|
|
182
|
+
* Typically used for "confirm password" or "confirm email" patterns where
|
|
183
|
+
* one field must have the same value as another.
|
|
184
|
+
*
|
|
185
|
+
* @param ref - A reactive signal whose current value is the comparison target
|
|
186
|
+
* @param message - Custom error message (default: `'Fields do not match'`)
|
|
187
|
+
* @returns A sync validator function
|
|
188
|
+
*
|
|
189
|
+
* @example
|
|
190
|
+
* ```ts
|
|
191
|
+
* import { signal } from '@bquery/bquery/reactive';
|
|
192
|
+
* import { matchField } from '@bquery/bquery/forms';
|
|
193
|
+
*
|
|
194
|
+
* const password = signal('secret');
|
|
195
|
+
* const confirmPassword = signal('');
|
|
196
|
+
* const validateConfirmPassword = matchField(password, 'Passwords must match');
|
|
197
|
+
*
|
|
198
|
+
* validateConfirmPassword(confirmPassword.value);
|
|
199
|
+
* ```
|
|
200
|
+
*/
|
|
201
|
+
export declare const matchField: <T>(ref: {
|
|
202
|
+
readonly value: T;
|
|
203
|
+
}, message?: string) => SyncValidator<T>;
|
|
204
|
+
//# sourceMappingURL=validators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/forms/validators.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7D;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,QAAQ,GAAI,gBAAkC,KAAG,aAO7D,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,SAAS,GAAI,KAAK,MAAM,EAAE,UAAU,MAAM,KAAG,aAAa,CAAC,OAAO,CAM9E,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,SAAS,GAAI,KAAK,MAAM,EAAE,UAAU,MAAM,KAAG,aAAa,CAAC,OAAO,CAM9E,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,OAAO,GAAI,OAAO,MAAM,EAAE,gBAA0B,KAAG,aAAa,CAAC,OAAO,CAWxF,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,KAAK,GAAI,gBAAiC,KAAG,aAAa,CAAC,OAAO,CAS9E,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,GAAG,GAAI,gBAAuB,KAAG,aAAa,CAAC,OAAO,CAWlE,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,GAAG,GAAI,OAAO,MAAM,EAAE,UAAU,MAAM,KAAG,aAAa,CAAC,OAAO,CAQ1E,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,GAAG,GAAI,OAAO,MAAM,EAAE,UAAU,MAAM,KAAG,aAAa,CAAC,OAAO,CAQ1E,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,MAAM,GAAI,CAAC,GAAG,OAAO,EAChC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,EACzB,SAAS,MAAM,KACd,aAAa,CAAC,CAAC,CAEjB,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,WAAW,GAAI,CAAC,GAAG,OAAO,EACrC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,EAClC,SAAS,MAAM,KACd,cAAc,CAAC,CAAC,CAElB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,UAAU,GAAI,CAAC,EAC1B,KAAK;IAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAAE,EAC1B,gBAA+B,KAC9B,aAAa,CAAC,CAAC,CAEjB,CAAC"}
|