@bquery/bquery 1.8.1 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/README.md +97 -25
  2. package/dist/{a11y-DVBCy09c.js → a11y-_9X-kt-_.js} +2 -2
  3. package/dist/{a11y-DVBCy09c.js.map → a11y-_9X-kt-_.js.map} +1 -1
  4. package/dist/a11y.es.mjs +1 -1
  5. package/dist/{forms-UcRHsYxC.js → forms-UhAeJEoO.js} +13 -13
  6. package/dist/{forms-UcRHsYxC.js.map → forms-UhAeJEoO.js.map} +1 -1
  7. package/dist/forms.es.mjs +1 -1
  8. package/dist/full.d.ts +4 -4
  9. package/dist/full.d.ts.map +1 -1
  10. package/dist/full.es.mjs +201 -196
  11. package/dist/full.iife.js +20 -20
  12. package/dist/full.iife.js.map +1 -1
  13. package/dist/full.umd.js +20 -20
  14. package/dist/full.umd.js.map +1 -1
  15. package/dist/index.es.mjs +214 -209
  16. package/dist/media/index.d.ts +10 -3
  17. package/dist/media/index.d.ts.map +1 -1
  18. package/dist/media/observers.d.ts +99 -0
  19. package/dist/media/observers.d.ts.map +1 -0
  20. package/dist/media/types.d.ts +125 -0
  21. package/dist/media/types.d.ts.map +1 -1
  22. package/dist/media-D4zLj9t-.js +514 -0
  23. package/dist/media-D4zLj9t-.js.map +1 -0
  24. package/dist/media.es.mjs +12 -9
  25. package/dist/mount-B-JvH6Y0.js +449 -0
  26. package/dist/mount-B-JvH6Y0.js.map +1 -0
  27. package/dist/reactive/index.d.ts +2 -2
  28. package/dist/reactive/index.d.ts.map +1 -1
  29. package/dist/reactive/signal.d.ts +2 -1
  30. package/dist/reactive/signal.d.ts.map +1 -1
  31. package/dist/reactive/watch.d.ts +49 -0
  32. package/dist/reactive/watch.d.ts.map +1 -1
  33. package/dist/reactive-BjpLkclt.js +1184 -0
  34. package/dist/{reactive-DwkhUJfP.js.map → reactive-BjpLkclt.js.map} +1 -1
  35. package/dist/reactive.es.mjs +35 -33
  36. package/dist/{router-CQikC9Ed.js → router-BieVwgci.js} +2 -2
  37. package/dist/{router-CQikC9Ed.js.map → router-BieVwgci.js.map} +1 -1
  38. package/dist/router.es.mjs +1 -1
  39. package/dist/{ssr-_dAcGdzu.js → ssr-CrGSJySz.js} +3 -3
  40. package/dist/{ssr-_dAcGdzu.js.map → ssr-CrGSJySz.js.map} +1 -1
  41. package/dist/ssr.es.mjs +1 -1
  42. package/dist/{store-Cb3gPRve.js → store-CY6sjTW3.js} +2 -2
  43. package/dist/{store-Cb3gPRve.js.map → store-CY6sjTW3.js.map} +1 -1
  44. package/dist/store.es.mjs +1 -1
  45. package/dist/{testing-C5Sjfsna.js → testing-UjAtu9aQ.js} +9 -9
  46. package/dist/{testing-C5Sjfsna.js.map → testing-UjAtu9aQ.js.map} +1 -1
  47. package/dist/testing.es.mjs +1 -1
  48. package/dist/view/directives/aria.d.ts +7 -0
  49. package/dist/view/directives/aria.d.ts.map +1 -0
  50. package/dist/view/directives/error.d.ts +7 -0
  51. package/dist/view/directives/error.d.ts.map +1 -0
  52. package/dist/view/directives/index.d.ts +2 -0
  53. package/dist/view/directives/index.d.ts.map +1 -1
  54. package/dist/view/mount.d.ts.map +1 -1
  55. package/dist/view/process.d.ts +2 -0
  56. package/dist/view/process.d.ts.map +1 -1
  57. package/dist/view.es.mjs +2 -2
  58. package/package.json +7 -6
  59. package/src/full.ts +12 -0
  60. package/src/media/index.ts +20 -2
  61. package/src/media/observers.ts +421 -0
  62. package/src/media/types.ts +136 -0
  63. package/src/reactive/index.ts +3 -0
  64. package/src/reactive/signal.ts +2 -1
  65. package/src/reactive/watch.ts +137 -0
  66. package/src/view/directives/aria.ts +72 -0
  67. package/src/view/directives/error.ts +56 -0
  68. package/src/view/directives/index.ts +2 -0
  69. package/src/view/mount.ts +4 -0
  70. package/src/view/process.ts +6 -0
  71. package/dist/media-i-fB5WxI.js +0 -340
  72. package/dist/media-i-fB5WxI.js.map +0 -1
  73. package/dist/mount-B4Y8bk8Z.js +0 -403
  74. package/dist/mount-B4Y8bk8Z.js.map +0 -1
  75. package/dist/reactive-DwkhUJfP.js +0 -1148
@@ -1 +1 @@
1
- {"version":3,"file":"forms-UcRHsYxC.js","names":[],"sources":["../src/forms/create-form.ts","../src/forms/use-field.ts","../src/forms/validators.ts"],"sourcesContent":["/**\n * Reactive form creation and management.\n *\n * @module bquery/forms\n */\n\nimport { computed, signal } from '../reactive/index';\nimport { isPrototypePollutionKey } from '../core/utils/object';\nimport { isPromise } from '../core/utils/type-guards';\nimport type {\n CrossFieldValidator,\n FieldConfig,\n Form,\n FormConfig,\n FormErrors,\n FormField,\n FormFields,\n ValidationResult,\n Validator,\n} from './types';\n\n/**\n * Determines whether a validator returned a valid result.\n * @internal\n */\nconst isValid = (result: ValidationResult): boolean => result === true || result === undefined;\n\n/**\n * Runs a single validator, normalising sync and async results.\n * @internal\n */\nconst runValidator = async <T>(validator: Validator<T>, value: T): Promise<string | undefined> => {\n const result = validator(value);\n const resolved = isPromise(result) ? await result : result;\n return isValid(resolved) ? undefined : (resolved as string);\n};\n\n/**\n * Creates a reactive form field from its configuration.\n * @internal\n */\nconst createField = <T>(config: FieldConfig<T>): FormField<T> => {\n const initial = config.initialValue;\n const value = signal<T>(initial);\n const error = signal('');\n const isTouched = signal(false);\n\n const isDirty = computed(() => !Object.is(value.value, initial));\n const isPristine = computed(() => !isDirty.value);\n\n return {\n value,\n error,\n isDirty,\n isTouched,\n isPristine,\n touch: () => {\n isTouched.value = true;\n },\n reset: () => {\n value.value = initial;\n error.value = '';\n isTouched.value = false;\n },\n };\n};\n\n/**\n * Validates a single field against its validators.\n * Sets the field's error signal.\n *\n * @returns The first error message, or an empty string if valid.\n * @internal\n */\nconst validateSingleField = async <T>(\n field: FormField<T>,\n validators: Validator<T>[] | undefined\n): Promise<string> => {\n if (!validators || validators.length === 0) {\n field.error.value = '';\n return '';\n }\n\n for (const validator of validators) {\n const errorMsg = await runValidator(validator, field.value.value);\n if (errorMsg) {\n field.error.value = errorMsg;\n return errorMsg;\n }\n }\n\n field.error.value = '';\n return '';\n};\n\n/**\n * Creates a fully reactive form with field-level validation,\n * dirty/touched tracking, cross-field validation, and submission handling.\n *\n * Each field's `value`, `error`, `isDirty`, `isTouched`, and `isPristine`\n * are reactive signals/computed values that can be used in effects, computed\n * values, or directly read/written.\n *\n * @template T - Shape of the form values (e.g. `{ name: string; age: number }`)\n * @param config - Form configuration with field definitions, validators, and submit handler\n * @returns A reactive {@link Form} instance\n *\n * @example\n * ```ts\n * import { createForm, required, email, min } from '@bquery/bquery/forms';\n *\n * const form = createForm({\n * fields: {\n * name: { initialValue: '', validators: [required()] },\n * email: { initialValue: '', validators: [required(), email()] },\n * age: { initialValue: 0, validators: [min(18, 'Must be 18+')] },\n * },\n * onSubmit: async (values) => {\n * await fetch('/api/register', {\n * method: 'POST',\n * body: JSON.stringify(values),\n * });\n * },\n * });\n *\n * // Read reactive state\n * console.log(form.isValid.value); // true (initially, before validation runs)\n * console.log(form.fields.name.value.value); // ''\n *\n * // Update a field\n * form.fields.name.value.value = 'Ada';\n *\n * // Validate and submit\n * await form.handleSubmit();\n * ```\n */\nexport const createForm = <T extends Record<string, unknown>>(config: FormConfig<T>): Form<T> => {\n // Build reactive field objects\n const fieldEntries = Object.entries(config.fields) as [\n keyof T & string,\n FieldConfig<T[keyof T]>,\n ][];\n\n const fields = {} as FormFields<T>;\n const errors = {} as FormErrors<T>;\n\n for (const [name, fieldConfig] of fieldEntries) {\n const field = createField(fieldConfig as FieldConfig<T[typeof name]>);\n (fields as Record<string, FormField>)[name] = field;\n (errors as Record<string, typeof field.error>)[name] = field.error;\n }\n\n const isSubmitting = signal(false);\n\n // Computed: form is valid when all error signals are empty\n const isFormValid = computed(() => {\n for (const name of Object.keys(fields)) {\n if ((fields as Record<string, FormField>)[name].error.value !== '') {\n return false;\n }\n }\n return true;\n });\n\n // Computed: form is dirty when any field is dirty\n const isFormDirty = computed(() => {\n for (const name of Object.keys(fields)) {\n if ((fields as Record<string, FormField>)[name].isDirty.value) {\n return true;\n }\n }\n return false;\n });\n\n /**\n * Validate a single field by name.\n */\n const validateField = async (name: keyof T & string): Promise<void> => {\n const field = (fields as Record<string, FormField>)[name];\n const fieldConfig = (config.fields as Record<string, FieldConfig>)[name];\n if (!field || !fieldConfig) return;\n await validateSingleField(field, fieldConfig.validators);\n };\n\n /**\n * Validate all fields (per-field + cross-field).\n * Returns `true` if the entire form is valid.\n */\n const validate = async (): Promise<boolean> => {\n let hasError = false;\n\n // Per-field validation\n for (const [name, fieldConfig] of fieldEntries) {\n const field = (fields as Record<string, FormField>)[name];\n const error = await validateSingleField(field, (fieldConfig as FieldConfig).validators);\n if (error) hasError = true;\n }\n\n // Cross-field validation\n if (config.crossValidators && config.crossValidators.length > 0) {\n const values = getValues();\n for (const crossValidator of config.crossValidators as CrossFieldValidator<T>[]) {\n const crossErrors = await crossValidator(values);\n if (crossErrors) {\n for (const [fieldName, errorMsg] of Object.entries(crossErrors) as [\n string,\n string | undefined,\n ][]) {\n if (errorMsg) {\n const field = (fields as Record<string, FormField>)[fieldName];\n if (field) {\n // Only set cross-field error if no per-field error exists\n if (field.error.value === '') {\n field.error.value = errorMsg;\n }\n hasError = true;\n }\n }\n }\n }\n }\n }\n\n return !hasError;\n };\n\n /**\n * Validate all fields and, if valid, invoke the onSubmit handler.\n * Prevents concurrent submissions by setting isSubmitting before validation.\n */\n const handleSubmit = async (): Promise<void> => {\n if (isSubmitting.value) return;\n isSubmitting.value = true;\n\n try {\n const valid = await validate();\n if (!valid) return;\n\n if (config.onSubmit) {\n await config.onSubmit(getValues());\n }\n } finally {\n isSubmitting.value = false;\n }\n };\n\n /**\n * Reset every field to its initial value and clear all errors.\n */\n const reset = (): void => {\n for (const name of Object.keys(fields)) {\n (fields as Record<string, FormField>)[name].reset();\n }\n };\n\n /**\n * Return a plain object snapshot of all current field values.\n */\n const getValues = (): T => {\n const values = {} as Record<string, unknown>;\n for (const name of Object.keys(fields)) {\n values[name] = (fields as Record<string, FormField>)[name].value.value;\n }\n return values as T;\n };\n\n /**\n * Bulk-set field values from a partial object.\n * Only fields present in the object are updated; missing keys are left unchanged.\n */\n const setValues = (values: Partial<T>): void => {\n for (const [name, val] of Object.entries(values)) {\n // Ignore inherited keys and prototype-pollution vectors before mutating field state.\n if (isPrototypePollutionKey(name) || !Object.prototype.hasOwnProperty.call(fields, name)) {\n continue;\n }\n\n const field = (fields as Record<string, FormField>)[name];\n if (!field) {\n continue;\n }\n field.value.value = val;\n }\n };\n\n /**\n * Bulk-set field error messages from a partial object.\n * Useful for applying server-side validation errors.\n * Only fields present in the object are updated; missing keys are left unchanged.\n */\n const setErrors = (errorMap: Partial<Record<keyof T & string, string>>): void => {\n for (const [name, msg] of Object.entries(errorMap)) {\n // Ignore inherited keys and prototype-pollution vectors before mutating field state.\n if (isPrototypePollutionKey(name) || !Object.prototype.hasOwnProperty.call(fields, name)) {\n continue;\n }\n\n const field = (fields as Record<string, FormField>)[name];\n if (!field) {\n continue;\n }\n field.error.value = (msg as string) ?? '';\n }\n };\n\n return {\n fields,\n errors,\n isValid: isFormValid,\n isDirty: isFormDirty,\n isSubmitting,\n handleSubmit,\n validateField,\n validate,\n reset,\n getValues,\n setValues,\n setErrors,\n };\n};\n","/**\n * Standalone reactive field composable.\n *\n * @module bquery/forms\n */\n\nimport { debounce } from '../core/utils/function';\nimport { isPromise } from '../core/utils/type-guards';\nimport { Computed } from '../reactive/computed';\nimport { Signal } from '../reactive/core';\nimport { computed, effect, signal } from '../reactive/index';\nimport type { MaybeSignal } from '../reactive/index';\nimport { isReadonlySignal } from '../reactive/readonly';\nimport type { UseFormFieldOptions, UseFormFieldReturn, ValidationResult, Validator } from './types';\n\n/**\n * Determines whether a validator returned a valid result.\n * @internal\n */\nconst isValidationSuccess = (result: ValidationResult): boolean =>\n result === true || result === undefined;\n\n/**\n * Runs a single validator, normalising sync and async results.\n * @internal\n */\nconst runValidator = async <T>(validator: Validator<T>, value: T): Promise<string | undefined> => {\n const result = validator(value);\n const resolved = isPromise(result) ? await result : result;\n return isValidationSuccess(resolved) ? undefined : (resolved as string);\n};\n\n/**\n * Creates a standalone reactive form field with optional automatic validation.\n *\n * This helper is useful when you want field-level state without creating a full form,\n * or when you want to bind an existing signal to the forms validation model.\n *\n * @template T - The type of the field value\n * @param initialValue - Plain initial value, an existing writable signal to reuse, or a\n * computed / readonly reactive source to snapshot\n * @param options - Validation mode, validators, debounce, and initial error configuration\n * @returns A reactive field handle with validation helpers\n *\n * @example\n * ```ts\n * import { useFormField, required } from '@bquery/bquery/forms';\n *\n * const email = useFormField('', {\n * validators: [required()],\n * validateOn: 'blur',\n * });\n *\n * email.value.value = 'ada@example.com';\n * email.touch();\n * ```\n */\nexport const useFormField = <T>(\n initialValue: MaybeSignal<T>,\n options: UseFormFieldOptions<T> = {}\n): UseFormFieldReturn<T> => {\n let value: Signal<T>;\n\n if (isSignal(initialValue)) {\n value = initialValue as Signal<T>;\n } else {\n const startingValue: T =\n isReadonlySignal<T>(initialValue) || isComputedValue<T>(initialValue)\n ? initialValue.peek()\n : (initialValue as T);\n value = signal(startingValue);\n }\n\n const initial = value.peek();\n const error = signal(options.initialError ?? '');\n const isTouched = signal(false);\n const isValidating = signal(false);\n const isDirty = computed(() => !Object.is(value.value, initial));\n const isPristine = computed(() => !isDirty.value);\n const isValid = computed(() => error.value === '');\n const validateOn = options.validateOn ?? 'manual';\n const debounceMs = Math.max(0, options.debounceMs ?? 0);\n\n let validationId = 0;\n let changeInitialized = false;\n let suppressNextChangeValidation = false;\n let isDestroyed = false;\n let stopChangeValidationEffect: (() => void) | undefined;\n\n const logValidationError = (validationError: unknown): void => {\n console.error('bQuery forms: Error in scheduled field validation', validationError);\n };\n\n const runValidation = async (): Promise<boolean> => {\n const currentValidationId = ++validationId;\n const validators = options.validators;\n\n if (!validators || validators.length === 0) {\n error.value = '';\n isValidating.value = false;\n return true;\n }\n\n isValidating.value = true;\n\n try {\n const currentValue = value.peek();\n\n for (const validator of validators) {\n const nextError = await runValidator(validator, currentValue);\n\n if (currentValidationId !== validationId) {\n return error.peek() === '';\n }\n\n if (nextError) {\n error.value = nextError;\n return false;\n }\n }\n\n if (currentValidationId === validationId) {\n error.value = '';\n }\n return true;\n } finally {\n if (currentValidationId === validationId) {\n isValidating.value = false;\n }\n }\n };\n\n const debouncedValidate = debounce(() => {\n void runValidation().catch(logValidationError);\n }, debounceMs);\n\n const scheduleValidation = (): void => {\n if (isDestroyed) {\n return;\n }\n\n if (debounceMs > 0) {\n debouncedValidate();\n return;\n }\n\n void runValidation().catch(logValidationError);\n };\n\n if (validateOn === 'change' || validateOn === 'both') {\n stopChangeValidationEffect = effect(() => {\n void value.value;\n\n if (!changeInitialized) {\n changeInitialized = true;\n return;\n }\n\n if (suppressNextChangeValidation) {\n suppressNextChangeValidation = false;\n return;\n }\n\n scheduleValidation();\n });\n }\n\n const destroy = (): void => {\n if (isDestroyed) {\n return;\n }\n\n isDestroyed = true;\n validationId += 1;\n debouncedValidate.cancel();\n stopChangeValidationEffect?.();\n stopChangeValidationEffect = undefined;\n isDirty.dispose();\n isPristine.dispose();\n isValid.dispose();\n isValidating.value = false;\n };\n\n return {\n value,\n error,\n isDirty,\n isTouched,\n isPristine,\n isValid,\n isValidating,\n touch: () => {\n isTouched.value = true;\n if (validateOn === 'blur' || validateOn === 'both') {\n scheduleValidation();\n }\n },\n reset: () => {\n validationId += 1;\n debouncedValidate.cancel();\n if (!Object.is(value.peek(), initial)) {\n suppressNextChangeValidation = true;\n }\n value.value = initial;\n error.value = options.initialError ?? '';\n isTouched.value = false;\n isValidating.value = false;\n },\n validate: async () => {\n debouncedValidate.cancel();\n return runValidation();\n },\n destroy,\n };\n};\n\n/**\n * Determines whether a value looks like a writable signal.\n * @internal\n */\nconst isSignal = (value: unknown): value is Signal<unknown> => {\n return value instanceof Signal;\n};\n\n/**\n * Determines whether a value is a computed reactive source.\n * @internal\n */\nconst isComputedValue = <T>(value: unknown): value is Computed<T> => {\n return value instanceof Computed;\n};\n","/**\n * Built-in validation functions for form fields.\n *\n * Each factory returns a {@link SyncValidator} that can be passed\n * to a field's `validators` array in {@link FormConfig}.\n *\n * @module bquery/forms\n */\n\nimport type { AsyncValidator, SyncValidator } from './types';\n\n/**\n * Requires a non-empty value.\n *\n * Fails for `undefined`, `null`, empty strings (after trim), and empty arrays.\n *\n * @param message - Custom error message (default: `'This field is required'`)\n * @returns A sync validator function\n *\n * @example\n * ```ts\n * import { required } from '@bquery/bquery/forms';\n * const validate = required('Name is required');\n * validate(''); // 'Name is required'\n * validate('Ada'); // true\n * ```\n */\nexport const required = (message = 'This field is required'): SyncValidator => {\n return (value: unknown) => {\n if (value == null) return message;\n if (typeof value === 'string' && value.trim() === '') return message;\n if (Array.isArray(value) && value.length === 0) return message;\n return true;\n };\n};\n\n/**\n * Requires a string to have at least `len` characters.\n *\n * Non-string values are coerced via `String()` before checking length.\n *\n * @param len - Minimum length\n * @param message - Custom error message\n * @returns A sync validator function\n *\n * @example\n * ```ts\n * import { minLength } from '@bquery/bquery/forms';\n * const validate = minLength(3);\n * validate('ab'); // 'Must be at least 3 characters'\n * validate('abc'); // true\n * ```\n */\nexport const minLength = (len: number, message?: string): SyncValidator<unknown> => {\n const msg = message ?? `Must be at least ${len} characters`;\n return (value: unknown) => {\n const str = typeof value === 'string' ? value : String(value ?? '');\n return str.length >= len ? true : msg;\n };\n};\n\n/**\n * Requires a string to have at most `len` characters.\n *\n * Non-string values are coerced via `String()` before checking length.\n *\n * @param len - Maximum length\n * @param message - Custom error message\n * @returns A sync validator function\n *\n * @example\n * ```ts\n * import { maxLength } from '@bquery/bquery/forms';\n * const validate = maxLength(10);\n * validate('hello world!!'); // 'Must be at most 10 characters'\n * validate('hello'); // true\n * ```\n */\nexport const maxLength = (len: number, message?: string): SyncValidator<unknown> => {\n const msg = message ?? `Must be at most ${len} characters`;\n return (value: unknown) => {\n const str = typeof value === 'string' ? value : String(value ?? '');\n return str.length <= len ? true : msg;\n };\n};\n\n/**\n * Requires a string to match a regular expression pattern.\n *\n * Non-string values are coerced via `String()` before testing.\n *\n * @param regex - Pattern to test against\n * @param message - Custom error message (default: `'Invalid format'`)\n * @returns A sync validator function\n *\n * @example\n * ```ts\n * import { pattern } from '@bquery/bquery/forms';\n * const validate = pattern(/^\\d+$/, 'Numbers only');\n * validate('abc'); // 'Numbers only'\n * validate('123'); // true\n * ```\n */\nexport const pattern = (regex: RegExp, message = 'Invalid format'): SyncValidator<unknown> => {\n const safeRegex =\n regex.global || regex.sticky\n ? new RegExp(regex.source, regex.flags.replace(/[gy]/g, ''))\n : regex;\n\n return (value: unknown) => {\n const str = typeof value === 'string' ? value : String(value ?? '');\n safeRegex.lastIndex = 0;\n return safeRegex.test(str) ? true : message;\n };\n};\n\n/**\n * RFC 5322–simplified email validation.\n *\n * @param message - Custom error message (default: `'Invalid email address'`)\n * @returns A sync validator function\n *\n * @example\n * ```ts\n * import { email } from '@bquery/bquery/forms';\n * const validate = email();\n * validate('nope'); // 'Invalid email address'\n * validate('ada@lovelace'); // 'Invalid email address'\n * validate('ada@love.co'); // true\n * ```\n */\nexport const email = (message = 'Invalid email address'): SyncValidator<unknown> => {\n // Intentionally simple — covers the vast majority of valid addresses\n // without re-implementing the full RFC 5322 grammar.\n const re = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return (value: unknown) => {\n const str = typeof value === 'string' ? value : String(value ?? '');\n if (str === '') return true; // empty is handled by `required`\n return re.test(str) ? true : message;\n };\n};\n\n/**\n * Requires a string to be a valid URL.\n *\n * Uses the native `URL` constructor for validation.\n *\n * @param message - Custom error message (default: `'Invalid URL'`)\n * @returns A sync validator function\n *\n * @example\n * ```ts\n * import { url } from '@bquery/bquery/forms';\n * const validate = url();\n * validate('not-a-url'); // 'Invalid URL'\n * validate('https://example.com'); // true\n * ```\n */\nexport const url = (message = 'Invalid URL'): SyncValidator<unknown> => {\n return (value: unknown) => {\n const str = typeof value === 'string' ? value : String(value ?? '');\n if (str === '') return true; // empty is handled by `required`\n try {\n new URL(str);\n return true;\n } catch {\n return message;\n }\n };\n};\n\n/**\n * Requires a numeric value to be at least `limit`.\n *\n * @param limit - Minimum allowed value (inclusive)\n * @param message - Custom error message\n * @returns A sync validator function\n *\n * @example\n * ```ts\n * import { min } from '@bquery/bquery/forms';\n * const validate = min(1, 'Must be positive');\n * validate(0); // 'Must be positive'\n * validate(1); // true\n * ```\n */\nexport const min = (limit: number, message?: string): SyncValidator<unknown> => {\n const msg = message ?? `Must be at least ${limit}`;\n return (value: unknown) => {\n if (value == null) return true;\n if (typeof value === 'string' && value.trim() === '') return true;\n const num = typeof value === 'number' ? value : Number(value);\n return num >= limit ? true : msg;\n };\n};\n\n/**\n * Requires a numeric value to be at most `limit`.\n *\n * @param limit - Maximum allowed value (inclusive)\n * @param message - Custom error message\n * @returns A sync validator function\n *\n * @example\n * ```ts\n * import { max } from '@bquery/bquery/forms';\n * const validate = max(100, 'Too high');\n * validate(101); // 'Too high'\n * validate(100); // true\n * ```\n */\nexport const max = (limit: number, message?: string): SyncValidator<unknown> => {\n const msg = message ?? `Must be at most ${limit}`;\n return (value: unknown) => {\n if (value == null) return true;\n if (typeof value === 'string' && value.trim() === '') return true;\n const num = typeof value === 'number' ? value : Number(value);\n return num <= limit ? true : msg;\n };\n};\n\n/**\n * Creates a custom synchronous validator from any predicate function.\n *\n * @param fn - Predicate that returns `true` when the value is valid\n * @param message - Error message when the predicate returns `false`\n * @returns A sync validator function\n *\n * @example\n * ```ts\n * import { custom } from '@bquery/bquery/forms';\n * const isEven = custom((v: number) => v % 2 === 0, 'Must be even');\n * isEven(3); // 'Must be even'\n * isEven(4); // true\n * ```\n */\nexport const custom = <T = unknown>(\n fn: (value: T) => boolean,\n message: string\n): SyncValidator<T> => {\n return (value: T) => (fn(value) ? true : message);\n};\n\n/**\n * Creates a custom asynchronous validator.\n *\n * @param fn - Async predicate that resolves to `true` when valid\n * @param message - Error message when the predicate resolves to `false`\n * @returns An async validator function\n *\n * @example\n * ```ts\n * import { customAsync } from '@bquery/bquery/forms';\n * const isUnique = customAsync(\n * async (name: string) => !(await checkExists(name)),\n * 'Already taken',\n * );\n * ```\n */\nexport const customAsync = <T = unknown>(\n fn: (value: T) => Promise<boolean>,\n message: string\n): AsyncValidator<T> => {\n return async (value: T) => ((await fn(value)) ? true : message);\n};\n\n/**\n * Requires a field's value to match the current value of a reference signal.\n *\n * Typically used for \"confirm password\" or \"confirm email\" patterns where\n * one field must have the same value as another.\n *\n * @param ref - A reactive signal whose current value is the comparison target\n * @param message - Custom error message (default: `'Fields do not match'`)\n * @returns A sync validator function\n *\n * @example\n * ```ts\n * import { signal } from '@bquery/bquery/reactive';\n * import { matchField } from '@bquery/bquery/forms';\n *\n * const password = signal('secret');\n * const confirmPassword = signal('');\n * const validateConfirmPassword = matchField(password, 'Passwords must match');\n *\n * validateConfirmPassword(confirmPassword.value);\n * ```\n */\nexport const matchField = <T>(\n ref: { readonly value: T },\n message = 'Fields do not match'\n): SyncValidator<T> => {\n return (value: T) => (Object.is(value, ref.value) ? true : message);\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"forms-UhAeJEoO.js","names":[],"sources":["../src/forms/create-form.ts","../src/forms/use-field.ts","../src/forms/validators.ts"],"sourcesContent":["/**\n * Reactive form creation and management.\n *\n * @module bquery/forms\n */\n\nimport { computed, signal } from '../reactive/index';\nimport { isPrototypePollutionKey } from '../core/utils/object';\nimport { isPromise } from '../core/utils/type-guards';\nimport type {\n CrossFieldValidator,\n FieldConfig,\n Form,\n FormConfig,\n FormErrors,\n FormField,\n FormFields,\n ValidationResult,\n Validator,\n} from './types';\n\n/**\n * Determines whether a validator returned a valid result.\n * @internal\n */\nconst isValid = (result: ValidationResult): boolean => result === true || result === undefined;\n\n/**\n * Runs a single validator, normalising sync and async results.\n * @internal\n */\nconst runValidator = async <T>(validator: Validator<T>, value: T): Promise<string | undefined> => {\n const result = validator(value);\n const resolved = isPromise(result) ? await result : result;\n return isValid(resolved) ? undefined : (resolved as string);\n};\n\n/**\n * Creates a reactive form field from its configuration.\n * @internal\n */\nconst createField = <T>(config: FieldConfig<T>): FormField<T> => {\n const initial = config.initialValue;\n const value = signal<T>(initial);\n const error = signal('');\n const isTouched = signal(false);\n\n const isDirty = computed(() => !Object.is(value.value, initial));\n const isPristine = computed(() => !isDirty.value);\n\n return {\n value,\n error,\n isDirty,\n isTouched,\n isPristine,\n touch: () => {\n isTouched.value = true;\n },\n reset: () => {\n value.value = initial;\n error.value = '';\n isTouched.value = false;\n },\n };\n};\n\n/**\n * Validates a single field against its validators.\n * Sets the field's error signal.\n *\n * @returns The first error message, or an empty string if valid.\n * @internal\n */\nconst validateSingleField = async <T>(\n field: FormField<T>,\n validators: Validator<T>[] | undefined\n): Promise<string> => {\n if (!validators || validators.length === 0) {\n field.error.value = '';\n return '';\n }\n\n for (const validator of validators) {\n const errorMsg = await runValidator(validator, field.value.value);\n if (errorMsg) {\n field.error.value = errorMsg;\n return errorMsg;\n }\n }\n\n field.error.value = '';\n return '';\n};\n\n/**\n * Creates a fully reactive form with field-level validation,\n * dirty/touched tracking, cross-field validation, and submission handling.\n *\n * Each field's `value`, `error`, `isDirty`, `isTouched`, and `isPristine`\n * are reactive signals/computed values that can be used in effects, computed\n * values, or directly read/written.\n *\n * @template T - Shape of the form values (e.g. `{ name: string; age: number }`)\n * @param config - Form configuration with field definitions, validators, and submit handler\n * @returns A reactive {@link Form} instance\n *\n * @example\n * ```ts\n * import { createForm, required, email, min } from '@bquery/bquery/forms';\n *\n * const form = createForm({\n * fields: {\n * name: { initialValue: '', validators: [required()] },\n * email: { initialValue: '', validators: [required(), email()] },\n * age: { initialValue: 0, validators: [min(18, 'Must be 18+')] },\n * },\n * onSubmit: async (values) => {\n * await fetch('/api/register', {\n * method: 'POST',\n * body: JSON.stringify(values),\n * });\n * },\n * });\n *\n * // Read reactive state\n * console.log(form.isValid.value); // true (initially, before validation runs)\n * console.log(form.fields.name.value.value); // ''\n *\n * // Update a field\n * form.fields.name.value.value = 'Ada';\n *\n * // Validate and submit\n * await form.handleSubmit();\n * ```\n */\nexport const createForm = <T extends Record<string, unknown>>(config: FormConfig<T>): Form<T> => {\n // Build reactive field objects\n const fieldEntries = Object.entries(config.fields) as [\n keyof T & string,\n FieldConfig<T[keyof T]>,\n ][];\n\n const fields = {} as FormFields<T>;\n const errors = {} as FormErrors<T>;\n\n for (const [name, fieldConfig] of fieldEntries) {\n const field = createField(fieldConfig as FieldConfig<T[typeof name]>);\n (fields as Record<string, FormField>)[name] = field;\n (errors as Record<string, typeof field.error>)[name] = field.error;\n }\n\n const isSubmitting = signal(false);\n\n // Computed: form is valid when all error signals are empty\n const isFormValid = computed(() => {\n for (const name of Object.keys(fields)) {\n if ((fields as Record<string, FormField>)[name].error.value !== '') {\n return false;\n }\n }\n return true;\n });\n\n // Computed: form is dirty when any field is dirty\n const isFormDirty = computed(() => {\n for (const name of Object.keys(fields)) {\n if ((fields as Record<string, FormField>)[name].isDirty.value) {\n return true;\n }\n }\n return false;\n });\n\n /**\n * Validate a single field by name.\n */\n const validateField = async (name: keyof T & string): Promise<void> => {\n const field = (fields as Record<string, FormField>)[name];\n const fieldConfig = (config.fields as Record<string, FieldConfig>)[name];\n if (!field || !fieldConfig) return;\n await validateSingleField(field, fieldConfig.validators);\n };\n\n /**\n * Validate all fields (per-field + cross-field).\n * Returns `true` if the entire form is valid.\n */\n const validate = async (): Promise<boolean> => {\n let hasError = false;\n\n // Per-field validation\n for (const [name, fieldConfig] of fieldEntries) {\n const field = (fields as Record<string, FormField>)[name];\n const error = await validateSingleField(field, (fieldConfig as FieldConfig).validators);\n if (error) hasError = true;\n }\n\n // Cross-field validation\n if (config.crossValidators && config.crossValidators.length > 0) {\n const values = getValues();\n for (const crossValidator of config.crossValidators as CrossFieldValidator<T>[]) {\n const crossErrors = await crossValidator(values);\n if (crossErrors) {\n for (const [fieldName, errorMsg] of Object.entries(crossErrors) as [\n string,\n string | undefined,\n ][]) {\n if (errorMsg) {\n const field = (fields as Record<string, FormField>)[fieldName];\n if (field) {\n // Only set cross-field error if no per-field error exists\n if (field.error.value === '') {\n field.error.value = errorMsg;\n }\n hasError = true;\n }\n }\n }\n }\n }\n }\n\n return !hasError;\n };\n\n /**\n * Validate all fields and, if valid, invoke the onSubmit handler.\n * Prevents concurrent submissions by setting isSubmitting before validation.\n */\n const handleSubmit = async (): Promise<void> => {\n if (isSubmitting.value) return;\n isSubmitting.value = true;\n\n try {\n const valid = await validate();\n if (!valid) return;\n\n if (config.onSubmit) {\n await config.onSubmit(getValues());\n }\n } finally {\n isSubmitting.value = false;\n }\n };\n\n /**\n * Reset every field to its initial value and clear all errors.\n */\n const reset = (): void => {\n for (const name of Object.keys(fields)) {\n (fields as Record<string, FormField>)[name].reset();\n }\n };\n\n /**\n * Return a plain object snapshot of all current field values.\n */\n const getValues = (): T => {\n const values = {} as Record<string, unknown>;\n for (const name of Object.keys(fields)) {\n values[name] = (fields as Record<string, FormField>)[name].value.value;\n }\n return values as T;\n };\n\n /**\n * Bulk-set field values from a partial object.\n * Only fields present in the object are updated; missing keys are left unchanged.\n */\n const setValues = (values: Partial<T>): void => {\n for (const [name, val] of Object.entries(values)) {\n // Ignore inherited keys and prototype-pollution vectors before mutating field state.\n if (isPrototypePollutionKey(name) || !Object.prototype.hasOwnProperty.call(fields, name)) {\n continue;\n }\n\n const field = (fields as Record<string, FormField>)[name];\n if (!field) {\n continue;\n }\n field.value.value = val;\n }\n };\n\n /**\n * Bulk-set field error messages from a partial object.\n * Useful for applying server-side validation errors.\n * Only fields present in the object are updated; missing keys are left unchanged.\n */\n const setErrors = (errorMap: Partial<Record<keyof T & string, string>>): void => {\n for (const [name, msg] of Object.entries(errorMap)) {\n // Ignore inherited keys and prototype-pollution vectors before mutating field state.\n if (isPrototypePollutionKey(name) || !Object.prototype.hasOwnProperty.call(fields, name)) {\n continue;\n }\n\n const field = (fields as Record<string, FormField>)[name];\n if (!field) {\n continue;\n }\n field.error.value = (msg as string) ?? '';\n }\n };\n\n return {\n fields,\n errors,\n isValid: isFormValid,\n isDirty: isFormDirty,\n isSubmitting,\n handleSubmit,\n validateField,\n validate,\n reset,\n getValues,\n setValues,\n setErrors,\n };\n};\n","/**\n * Standalone reactive field composable.\n *\n * @module bquery/forms\n */\n\nimport { debounce } from '../core/utils/function';\nimport { isPromise } from '../core/utils/type-guards';\nimport { Computed } from '../reactive/computed';\nimport { Signal } from '../reactive/core';\nimport { computed, effect, signal } from '../reactive/index';\nimport type { MaybeSignal } from '../reactive/index';\nimport { isReadonlySignal } from '../reactive/readonly';\nimport type { UseFormFieldOptions, UseFormFieldReturn, ValidationResult, Validator } from './types';\n\n/**\n * Determines whether a validator returned a valid result.\n * @internal\n */\nconst isValidationSuccess = (result: ValidationResult): boolean =>\n result === true || result === undefined;\n\n/**\n * Runs a single validator, normalising sync and async results.\n * @internal\n */\nconst runValidator = async <T>(validator: Validator<T>, value: T): Promise<string | undefined> => {\n const result = validator(value);\n const resolved = isPromise(result) ? await result : result;\n return isValidationSuccess(resolved) ? undefined : (resolved as string);\n};\n\n/**\n * Creates a standalone reactive form field with optional automatic validation.\n *\n * This helper is useful when you want field-level state without creating a full form,\n * or when you want to bind an existing signal to the forms validation model.\n *\n * @template T - The type of the field value\n * @param initialValue - Plain initial value, an existing writable signal to reuse, or a\n * computed / readonly reactive source to snapshot\n * @param options - Validation mode, validators, debounce, and initial error configuration\n * @returns A reactive field handle with validation helpers\n *\n * @example\n * ```ts\n * import { useFormField, required } from '@bquery/bquery/forms';\n *\n * const email = useFormField('', {\n * validators: [required()],\n * validateOn: 'blur',\n * });\n *\n * email.value.value = 'ada@example.com';\n * email.touch();\n * ```\n */\nexport const useFormField = <T>(\n initialValue: MaybeSignal<T>,\n options: UseFormFieldOptions<T> = {}\n): UseFormFieldReturn<T> => {\n let value: Signal<T>;\n\n if (isSignal(initialValue)) {\n value = initialValue as Signal<T>;\n } else {\n const startingValue: T =\n isReadonlySignal<T>(initialValue) || isComputedValue<T>(initialValue)\n ? initialValue.peek()\n : (initialValue as T);\n value = signal(startingValue);\n }\n\n const initial = value.peek();\n const error = signal(options.initialError ?? '');\n const isTouched = signal(false);\n const isValidating = signal(false);\n const isDirty = computed(() => !Object.is(value.value, initial));\n const isPristine = computed(() => !isDirty.value);\n const isValid = computed(() => error.value === '');\n const validateOn = options.validateOn ?? 'manual';\n const debounceMs = Math.max(0, options.debounceMs ?? 0);\n\n let validationId = 0;\n let changeInitialized = false;\n let suppressNextChangeValidation = false;\n let isDestroyed = false;\n let stopChangeValidationEffect: (() => void) | undefined;\n\n const logValidationError = (validationError: unknown): void => {\n console.error('bQuery forms: Error in scheduled field validation', validationError);\n };\n\n const runValidation = async (): Promise<boolean> => {\n const currentValidationId = ++validationId;\n const validators = options.validators;\n\n if (!validators || validators.length === 0) {\n error.value = '';\n isValidating.value = false;\n return true;\n }\n\n isValidating.value = true;\n\n try {\n const currentValue = value.peek();\n\n for (const validator of validators) {\n const nextError = await runValidator(validator, currentValue);\n\n if (currentValidationId !== validationId) {\n return error.peek() === '';\n }\n\n if (nextError) {\n error.value = nextError;\n return false;\n }\n }\n\n if (currentValidationId === validationId) {\n error.value = '';\n }\n return true;\n } finally {\n if (currentValidationId === validationId) {\n isValidating.value = false;\n }\n }\n };\n\n const debouncedValidate = debounce(() => {\n void runValidation().catch(logValidationError);\n }, debounceMs);\n\n const scheduleValidation = (): void => {\n if (isDestroyed) {\n return;\n }\n\n if (debounceMs > 0) {\n debouncedValidate();\n return;\n }\n\n void runValidation().catch(logValidationError);\n };\n\n if (validateOn === 'change' || validateOn === 'both') {\n stopChangeValidationEffect = effect(() => {\n void value.value;\n\n if (!changeInitialized) {\n changeInitialized = true;\n return;\n }\n\n if (suppressNextChangeValidation) {\n suppressNextChangeValidation = false;\n return;\n }\n\n scheduleValidation();\n });\n }\n\n const destroy = (): void => {\n if (isDestroyed) {\n return;\n }\n\n isDestroyed = true;\n validationId += 1;\n debouncedValidate.cancel();\n stopChangeValidationEffect?.();\n stopChangeValidationEffect = undefined;\n isDirty.dispose();\n isPristine.dispose();\n isValid.dispose();\n isValidating.value = false;\n };\n\n return {\n value,\n error,\n isDirty,\n isTouched,\n isPristine,\n isValid,\n isValidating,\n touch: () => {\n isTouched.value = true;\n if (validateOn === 'blur' || validateOn === 'both') {\n scheduleValidation();\n }\n },\n reset: () => {\n validationId += 1;\n debouncedValidate.cancel();\n if (!Object.is(value.peek(), initial)) {\n suppressNextChangeValidation = true;\n }\n value.value = initial;\n error.value = options.initialError ?? '';\n isTouched.value = false;\n isValidating.value = false;\n },\n validate: async () => {\n debouncedValidate.cancel();\n return runValidation();\n },\n destroy,\n };\n};\n\n/**\n * Determines whether a value looks like a writable signal.\n * @internal\n */\nconst isSignal = (value: unknown): value is Signal<unknown> => {\n return value instanceof Signal;\n};\n\n/**\n * Determines whether a value is a computed reactive source.\n * @internal\n */\nconst isComputedValue = <T>(value: unknown): value is Computed<T> => {\n return value instanceof Computed;\n};\n","/**\n * Built-in validation functions for form fields.\n *\n * Each factory returns a {@link SyncValidator} that can be passed\n * to a field's `validators` array in {@link FormConfig}.\n *\n * @module bquery/forms\n */\n\nimport type { AsyncValidator, SyncValidator } from './types';\n\n/**\n * Requires a non-empty value.\n *\n * Fails for `undefined`, `null`, empty strings (after trim), and empty arrays.\n *\n * @param message - Custom error message (default: `'This field is required'`)\n * @returns A sync validator function\n *\n * @example\n * ```ts\n * import { required } from '@bquery/bquery/forms';\n * const validate = required('Name is required');\n * validate(''); // 'Name is required'\n * validate('Ada'); // true\n * ```\n */\nexport const required = (message = 'This field is required'): SyncValidator => {\n return (value: unknown) => {\n if (value == null) return message;\n if (typeof value === 'string' && value.trim() === '') return message;\n if (Array.isArray(value) && value.length === 0) return message;\n return true;\n };\n};\n\n/**\n * Requires a string to have at least `len` characters.\n *\n * Non-string values are coerced via `String()` before checking length.\n *\n * @param len - Minimum length\n * @param message - Custom error message\n * @returns A sync validator function\n *\n * @example\n * ```ts\n * import { minLength } from '@bquery/bquery/forms';\n * const validate = minLength(3);\n * validate('ab'); // 'Must be at least 3 characters'\n * validate('abc'); // true\n * ```\n */\nexport const minLength = (len: number, message?: string): SyncValidator<unknown> => {\n const msg = message ?? `Must be at least ${len} characters`;\n return (value: unknown) => {\n const str = typeof value === 'string' ? value : String(value ?? '');\n return str.length >= len ? true : msg;\n };\n};\n\n/**\n * Requires a string to have at most `len` characters.\n *\n * Non-string values are coerced via `String()` before checking length.\n *\n * @param len - Maximum length\n * @param message - Custom error message\n * @returns A sync validator function\n *\n * @example\n * ```ts\n * import { maxLength } from '@bquery/bquery/forms';\n * const validate = maxLength(10);\n * validate('hello world!!'); // 'Must be at most 10 characters'\n * validate('hello'); // true\n * ```\n */\nexport const maxLength = (len: number, message?: string): SyncValidator<unknown> => {\n const msg = message ?? `Must be at most ${len} characters`;\n return (value: unknown) => {\n const str = typeof value === 'string' ? value : String(value ?? '');\n return str.length <= len ? true : msg;\n };\n};\n\n/**\n * Requires a string to match a regular expression pattern.\n *\n * Non-string values are coerced via `String()` before testing.\n *\n * @param regex - Pattern to test against\n * @param message - Custom error message (default: `'Invalid format'`)\n * @returns A sync validator function\n *\n * @example\n * ```ts\n * import { pattern } from '@bquery/bquery/forms';\n * const validate = pattern(/^\\d+$/, 'Numbers only');\n * validate('abc'); // 'Numbers only'\n * validate('123'); // true\n * ```\n */\nexport const pattern = (regex: RegExp, message = 'Invalid format'): SyncValidator<unknown> => {\n const safeRegex =\n regex.global || regex.sticky\n ? new RegExp(regex.source, regex.flags.replace(/[gy]/g, ''))\n : regex;\n\n return (value: unknown) => {\n const str = typeof value === 'string' ? value : String(value ?? '');\n safeRegex.lastIndex = 0;\n return safeRegex.test(str) ? true : message;\n };\n};\n\n/**\n * RFC 5322–simplified email validation.\n *\n * @param message - Custom error message (default: `'Invalid email address'`)\n * @returns A sync validator function\n *\n * @example\n * ```ts\n * import { email } from '@bquery/bquery/forms';\n * const validate = email();\n * validate('nope'); // 'Invalid email address'\n * validate('ada@lovelace'); // 'Invalid email address'\n * validate('ada@love.co'); // true\n * ```\n */\nexport const email = (message = 'Invalid email address'): SyncValidator<unknown> => {\n // Intentionally simple — covers the vast majority of valid addresses\n // without re-implementing the full RFC 5322 grammar.\n const re = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return (value: unknown) => {\n const str = typeof value === 'string' ? value : String(value ?? '');\n if (str === '') return true; // empty is handled by `required`\n return re.test(str) ? true : message;\n };\n};\n\n/**\n * Requires a string to be a valid URL.\n *\n * Uses the native `URL` constructor for validation.\n *\n * @param message - Custom error message (default: `'Invalid URL'`)\n * @returns A sync validator function\n *\n * @example\n * ```ts\n * import { url } from '@bquery/bquery/forms';\n * const validate = url();\n * validate('not-a-url'); // 'Invalid URL'\n * validate('https://example.com'); // true\n * ```\n */\nexport const url = (message = 'Invalid URL'): SyncValidator<unknown> => {\n return (value: unknown) => {\n const str = typeof value === 'string' ? value : String(value ?? '');\n if (str === '') return true; // empty is handled by `required`\n try {\n new URL(str);\n return true;\n } catch {\n return message;\n }\n };\n};\n\n/**\n * Requires a numeric value to be at least `limit`.\n *\n * @param limit - Minimum allowed value (inclusive)\n * @param message - Custom error message\n * @returns A sync validator function\n *\n * @example\n * ```ts\n * import { min } from '@bquery/bquery/forms';\n * const validate = min(1, 'Must be positive');\n * validate(0); // 'Must be positive'\n * validate(1); // true\n * ```\n */\nexport const min = (limit: number, message?: string): SyncValidator<unknown> => {\n const msg = message ?? `Must be at least ${limit}`;\n return (value: unknown) => {\n if (value == null) return true;\n if (typeof value === 'string' && value.trim() === '') return true;\n const num = typeof value === 'number' ? value : Number(value);\n return num >= limit ? true : msg;\n };\n};\n\n/**\n * Requires a numeric value to be at most `limit`.\n *\n * @param limit - Maximum allowed value (inclusive)\n * @param message - Custom error message\n * @returns A sync validator function\n *\n * @example\n * ```ts\n * import { max } from '@bquery/bquery/forms';\n * const validate = max(100, 'Too high');\n * validate(101); // 'Too high'\n * validate(100); // true\n * ```\n */\nexport const max = (limit: number, message?: string): SyncValidator<unknown> => {\n const msg = message ?? `Must be at most ${limit}`;\n return (value: unknown) => {\n if (value == null) return true;\n if (typeof value === 'string' && value.trim() === '') return true;\n const num = typeof value === 'number' ? value : Number(value);\n return num <= limit ? true : msg;\n };\n};\n\n/**\n * Creates a custom synchronous validator from any predicate function.\n *\n * @param fn - Predicate that returns `true` when the value is valid\n * @param message - Error message when the predicate returns `false`\n * @returns A sync validator function\n *\n * @example\n * ```ts\n * import { custom } from '@bquery/bquery/forms';\n * const isEven = custom((v: number) => v % 2 === 0, 'Must be even');\n * isEven(3); // 'Must be even'\n * isEven(4); // true\n * ```\n */\nexport const custom = <T = unknown>(\n fn: (value: T) => boolean,\n message: string\n): SyncValidator<T> => {\n return (value: T) => (fn(value) ? true : message);\n};\n\n/**\n * Creates a custom asynchronous validator.\n *\n * @param fn - Async predicate that resolves to `true` when valid\n * @param message - Error message when the predicate resolves to `false`\n * @returns An async validator function\n *\n * @example\n * ```ts\n * import { customAsync } from '@bquery/bquery/forms';\n * const isUnique = customAsync(\n * async (name: string) => !(await checkExists(name)),\n * 'Already taken',\n * );\n * ```\n */\nexport const customAsync = <T = unknown>(\n fn: (value: T) => Promise<boolean>,\n message: string\n): AsyncValidator<T> => {\n return async (value: T) => ((await fn(value)) ? true : message);\n};\n\n/**\n * Requires a field's value to match the current value of a reference signal.\n *\n * Typically used for \"confirm password\" or \"confirm email\" patterns where\n * one field must have the same value as another.\n *\n * @param ref - A reactive signal whose current value is the comparison target\n * @param message - Custom error message (default: `'Fields do not match'`)\n * @returns A sync validator function\n *\n * @example\n * ```ts\n * import { signal } from '@bquery/bquery/reactive';\n * import { matchField } from '@bquery/bquery/forms';\n *\n * const password = signal('secret');\n * const confirmPassword = signal('');\n * const validateConfirmPassword = matchField(password, 'Passwords must match');\n *\n * validateConfirmPassword(confirmPassword.value);\n * ```\n */\nexport const matchField = <T>(\n ref: { readonly value: T },\n message = 'Fields do not match'\n): SyncValidator<T> => {\n return (value: T) => (Object.is(value, ref.value) ? true : message);\n};\n"],"mappings":"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"}
package/dist/forms.es.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { a as s, c as e, d as m, f as r, i as t, l as i, n as o, o as n, p as c, r as u, s as l, t as d, u as p } from "./forms-UcRHsYxC.js";
1
+ import { a as s, c as e, d as m, f as r, i as t, l as i, n as o, o as n, p as c, r as u, s as l, t as d, u as p } from "./forms-UhAeJEoO.js";
2
2
  export {
3
3
  c as createForm,
4
4
  d as custom,
package/dist/full.d.ts CHANGED
@@ -36,8 +36,8 @@
36
36
  */
37
37
  export { $, $$, BQueryCollection, BQueryElement, utils } from './core/index';
38
38
  export type { BQueryUtils } from './core/index';
39
- export { batch, Computed, computed, createHttp, createRequestQueue, createRestClient, createUseFetch, deduplicateRequest, effect, effectScope, getCurrentScope, http, HttpError, isComputed, isSignal, linkedSignal, onScopeDispose, persistedSignal, readonly, Signal, signal, toValue, untrack, useAsyncData, useEventSource, useFetch, useInfiniteFetch, usePaginatedFetch, usePolling, useResource, useResourceList, useSubmit, useWebSocket, useWebSocketChannel, watch, } from './reactive/index';
40
- export type { AsyncDataState, AsyncDataStatus, AsyncWatchSource, ChannelMessage, ChannelSubscription, CleanupFn, EffectScope, EventSourceStatus, FetchInput, HttpClient, HttpProgressEvent, HttpRequestConfig, HttpResponse, IdExtractor, InfiniteState, Interceptor, InterceptorManager, LinkedSignal, MaybeSignal, Observer, PaginatedState, PollingState, ReadonlySignal, ReadonlySignalHandle, RequestQueue, RequestQueueOptions, ResourceListActions, RestClient, RetryConfig, UseAsyncDataOptions, UseEventSourceOptions, UseEventSourceReturn, UseFetchOptions, UseFetchRetryConfig, UseInfiniteFetchOptions, UsePaginatedFetchOptions, UsePollingOptions, UseResourceListOptions, UseResourceListReturn, UseResourceOptions, UseResourceReturn, UseSubmitOptions, UseSubmitReturn, UseWebSocketChannelOptions, UseWebSocketChannelReturn, UseWebSocketOptions, UseWebSocketReturn, WebSocketHeartbeatConfig, WebSocketReconnectConfig, WebSocketSerializer, WebSocketStatus, } from './reactive/index';
39
+ export { batch, Computed, computed, createHttp, createRequestQueue, createRestClient, createUseFetch, deduplicateRequest, effect, effectScope, getCurrentScope, http, HttpError, isComputed, isSignal, linkedSignal, onScopeDispose, persistedSignal, readonly, Signal, signal, toValue, untrack, useAsyncData, useEventSource, useFetch, useInfiniteFetch, usePaginatedFetch, usePolling, useResource, useResourceList, useSubmit, useWebSocket, useWebSocketChannel, watch, watchDebounce, watchThrottle, } from './reactive/index';
40
+ export type { AsyncDataState, AsyncDataStatus, AsyncWatchSource, ChannelMessage, ChannelSubscription, CleanupFn, EffectScope, EventSourceStatus, FetchInput, HttpClient, HttpProgressEvent, HttpRequestConfig, HttpResponse, IdExtractor, InfiniteState, Interceptor, InterceptorManager, LinkedSignal, MaybeSignal, Observer, PaginatedState, PollingState, ReadonlySignal, ReadonlySignalHandle, RequestQueue, RequestQueueOptions, ResourceListActions, RestClient, RetryConfig, UseAsyncDataOptions, UseEventSourceOptions, UseEventSourceReturn, UseFetchOptions, UseFetchRetryConfig, UseInfiniteFetchOptions, UsePaginatedFetchOptions, UsePollingOptions, UseResourceListOptions, UseResourceListReturn, UseResourceOptions, UseResourceReturn, UseSubmitOptions, UseSubmitReturn, UseWebSocketChannelOptions, UseWebSocketChannelReturn, UseWebSocketOptions, UseWebSocketReturn, WatchOptions, WebSocketHeartbeatConfig, WebSocketReconnectConfig, WebSocketSerializer, WebSocketStatus, } from './reactive/index';
41
41
  export { bool, component, defineComponent, html, registerDefaultComponents, safeHtml, useComputed, useEffect, useSignal, } from './component/index';
42
42
  export type { AttributeChange, ComponentDefinition, ComponentRenderContext, ComponentSignalLike, ComponentSignals, ComponentStateKey, DefaultComponentLibraryOptions, PropDefinition, RegisteredDefaultComponents, ShadowMode, } from './component/index';
43
43
  export { animate, capturePosition, easeInCubic, easeInOutCubic, easeInOutQuad, easeInQuad, easeOutBack, easeOutCubic, easeOutExpo, easeOutQuad, easingPresets, flip, flipElements, flipList, keyframePresets, linear, morphElement, parallax, prefersReducedMotion, scrollAnimate, sequence, setReducedMotion, spring, springPresets, stagger, timeline, transition, typewriter, } from './motion/index';
@@ -60,8 +60,8 @@ export { announceToScreenReader, auditA11y, clearAnnouncements, getFocusableElem
60
60
  export type { AnnouncePriority, AuditFinding, AuditResult, AuditSeverity, ColorScheme, ContrastPreference, FocusTrapHandle, RovingTabIndexHandle, RovingTabIndexOptions, SkipLinkHandle, SkipLinkOptions, TrapFocusOptions, } from './a11y/index';
61
61
  export { draggable, droppable, sortable } from './dnd/index';
62
62
  export type { BoundsRect, DragAxis, DragBounds, DragEventData, DraggableHandle, DraggableOptions, DragPosition, DropEventData, DroppableHandle, DroppableOptions, SortableHandle, SortableOptions, SortEventData, } from './dnd/index';
63
- export { breakpoints, clipboard, mediaQuery, useBattery, useDeviceMotion, useDeviceOrientation, useGeolocation, useNetworkStatus, useViewport, } from './media/index';
64
- export type { BatteryState, BreakpointMap, ClipboardAPI, DeviceMotionState, DeviceOrientationState, GeolocationOptions, GeolocationState, NetworkState, ViewportState, } from './media/index';
63
+ export { breakpoints, clipboard, mediaQuery, useBattery, useDeviceMotion, useDeviceOrientation, useGeolocation, useIntersectionObserver, useMutationObserver, useNetworkStatus, useResizeObserver, useViewport, } from './media/index';
64
+ export type { BatteryState, BreakpointMap, ClipboardAPI, DeviceMotionState, DeviceOrientationState, GeolocationOptions, GeolocationState, IntersectionObserverOptions, IntersectionObserverState, MutationObserverOptions, MutationObserverState, NetworkState, ResizeObserverOptions, ResizeObserverState, ViewportState, } from './media/index';
65
65
  export { getCustomDirective, getCustomDirectives, getInstalledPlugins, isInstalled, resetPlugins, use, } from './plugin/index';
66
66
  export type { BQueryPlugin, CustomDirective, CustomDirectiveHandler, PluginInstallContext, } from './plugin/index';
67
67
  export { clearTimeline, enableDevtools, generateSignalLabel, getDevtoolsState, getTimeline, inspectComponents, inspectSignals, inspectStores, isDevtoolsEnabled, logComponents, logSignals, logStores, logTimeline, recordEvent, trackSignal, untrackSignal, } from './devtools/index';
@@ -1 +1 @@
1
- {"version":3,"file":"full.d.ts","sourceRoot":"","sources":["../src/full.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"full.d.ts","sourceRoot":"","sources":["../src/full.ts"],"names":[],"mappings":"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"}