{"version":3,"file":"dvirus-js-angular-signals-signal-form.mjs","sources":["../../../../packages/angular-signals/signal-form/src/lib/signal-form/errors.ts","../../../../packages/angular-signals/signal-form/src/lib/signal-form/control.ts","../../../../packages/angular-signals/signal-form/src/lib/signal-form/form.ts","../../../../packages/angular-signals/signal-form/src/lib/signal-form/array.ts","../../../../packages/angular-signals/signal-form/src/lib/signal-form/validators.ts","../../../../packages/angular-signals/signal-form/src/lib/signal-form/index.ts","../../../../packages/angular-signals/signal-form/src/dvirus-js-angular-signals-signal-form.ts"],"sourcesContent":["import {\n  SignalFormContext,\n  SignalFormValidationError,\n  SignalFormValidatorFn,\n} from './types';\n\n/**\n * Normalizes a validation error object by filtering out empty/null values.\n * \n * Converts a raw validation result into a clean error map containing only\n * non-empty string messages. Filters out undefined, null, and empty strings.\n * \n * @param error - Raw validation error object or null\n * @returns Clean error map with only valid error messages\n * \n * @example\n * ```typescript\n * normalizeValidationError({ required: 'Error', empty: '', invalid: null });\n * // Returns: { required: 'Error' }\n * ```\n */\nexport function normalizeValidationError(\n  error: SignalFormValidationError,\n): Record<string, string> {\n  if (!error) return {};\n  return Object.entries(error).reduce<Record<string, string>>(\n    (acc, [key, val]) => {\n      if (typeof val === 'string' && val.length > 0) {\n        acc[key] = val;\n      }\n      return acc;\n    },\n    {},\n  );\n}\n\n/**\n * Executes an array of validators and collects all error messages.\n * \n * Runs each validator function with the provided context and merges all\n * error messages into a single error map. Empty/null results are filtered out.\n * \n * @template TControls - Object type defining available sibling controls\n * @template TValue - The type of value being validated\n * \n * @param validators - Array of validator functions to execute\n * @param ctx - Validation context with current value and control accessor\n * @returns Combined error map from all validators\n * \n * @example\n * ```typescript\n * const errors = collectValidationErrors(\n *   [signalFormValidators.required, signalFormValidators.minLength(3)],\n *   { item: { value: '' }, getControl: () => {} }\n * );\n * // Returns: { required: 'This field is required' }\n * ```\n */\nexport function collectValidationErrors<TControls extends object, TValue>(\n  validators: SignalFormValidatorFn<TControls, TValue>[] | undefined,\n  ctx: SignalFormContext<TControls, TValue>,\n): Record<string, string> {\n  if (!validators?.length) return {};\n  return validators.reduce<Record<string, string>>((acc, validator) => {\n    const normalized = normalizeValidationError(validator(ctx));\n    Object.entries(normalized).forEach(([key, val]) => {\n      acc[key] = val;\n    });\n    return acc;\n  }, {});\n}\n\n/**\n * Checks if an error map contains any errors.\n * \n * Simple utility to determine if a control has validation errors by\n * checking if the error map object has any keys.\n * \n * @param errorMap - Error map to check\n * @returns True if there are any errors, false if empty\n * \n * @example\n * ```typescript\n * hasErrors({ required: 'Error' }); // true\n * hasErrors({}); // false\n * ```\n */\nexport function hasErrors(errorMap: Record<string, string>): boolean {\n  return Object.keys(errorMap).length > 0;\n}\n\n/**\n * Recursively checks if an error tree structure is completely empty.\n * \n * Traverses nested error structures (objects and arrays) to determine if\n * there are any actual error messages anywhere in the tree. Returns true\n * only when the entire structure contains no errors.\n * \n * @param value - Error tree to check (can be nested objects/arrays)\n * @returns True if no errors exist anywhere in the tree\n * \n * @example\n * ```typescript\n * isEmptyErrorTree({ name: undefined, address: { street: undefined } }); // true\n * isEmptyErrorTree({ name: { required: 'Error' } }); // false\n * isEmptyErrorTree([undefined, undefined]); // true\n * ```\n */\nexport function isEmptyErrorTree(value: unknown): boolean {\n  if (value === null || value === undefined) return true;\n  if (Array.isArray(value)) {\n    return value.every(isEmptyErrorTree);\n  }\n  if (typeof value === 'object') {\n    return Object.values(value as Record<string, unknown>).every(\n      isEmptyErrorTree,\n    );\n  }\n  return false;\n}\n","import { computed, isSignal, signal } from '@angular/core';\nimport {\n  fromSignalObj,\n  SignalOrValue,\n  signalOrValue,\n  SignalOrValueObj,\n  writableSignal,\n} from '@dvirus-js/angular-signals';\nimport { collectValidationErrors, hasErrors } from './errors';\n\nimport {\n  FirstError,\n  SignalFormControl,\n  SignalFormControlConfig,\n  SignalFormControlInput,\n  SignalFormControlLike,\n  SignalFormContext,\n  SignalFormDisabledFn,\n  SignalFormSetValueOptions,\n} from './types';\n\n/**\n * Internal type for accessing sibling controls in a form.\n *\n * @internal\n */\ntype ControlAccessor<TControls extends object> = <Key extends keyof TControls>(\n  controlName: Key,\n) => SignalFormControlLike<TControls[Key]>;\n\n/**\n * Shared empty error map object to avoid creating new objects.\n *\n * @internal\n */\nconst EMPTY_ERROR_MAP: Record<string, string> = {};\n\n/**\n * Checks if a value is a plain JavaScript object (not array, not null, not class instance).\n *\n * @internal\n * @param value - Value to check\n * @returns True if value is a plain object\n */\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n  if (!value || typeof value !== 'object') return false;\n  const proto = Object.getPrototypeOf(value);\n  return proto === Object.prototype || proto === null;\n}\n\n/**\n * Checks if an object contains any Angular signal values.\n *\n * @internal\n * @param obj - Object to check for signal values\n * @returns True if any property value is a signal\n */\nfunction hasSignalValues(obj: Record<string, unknown>): boolean {\n  return Object.values(obj).some((value) => isSignal(value));\n}\n\n/**\n * Resolves a SignalOrValue to its actual value, handling nested signal objects.\n *\n * If the resolved value is a plain object containing signals, it converts\n * all signal properties to their values using fromSignalObj.\n *\n * @internal\n * @template TValue - The type of value to resolve\n * @param value - Signal or static value to resolve\n * @returns The resolved value\n */\nfunction resolveControlValue<TValue>(\n  value: SignalOrValue<TValue | undefined>,\n): TValue | undefined {\n  const resolved = signalOrValue(value);\n  if (isPlainObject(resolved) && hasSignalValues(resolved)) {\n    return fromSignalObj(resolved as SignalOrValueObj) as TValue;\n  }\n  return resolved;\n}\n\n/**\n * Normalizes various control input formats to a standard SignalFormControlConfig.\n *\n * Handles three input types:\n * - SignalFormControl: extracts current value\n * - Config object with 'value' property: uses as-is\n * - Raw value: wraps in config object\n *\n * @internal\n * @template TValue - The type of control value\n * @template TControls - Object type defining available sibling controls\n * @param input - Input in any accepted format\n * @returns Normalized control configuration\n */\nfunction normalizeControlInput<TValue, TControls extends object>(\n  input: SignalFormControlInput<TValue, TControls>,\n): SignalFormControlConfig<TValue, TControls> {\n  if (isSignalFormControl(input)) {\n    return { value: input.value() } as SignalFormControlConfig<\n      TValue,\n      TControls\n    >;\n  }\n  if (typeof input === 'object' && input !== null && 'value' in input) {\n    return input as SignalFormControlConfig<TValue, TControls>;\n  }\n  return { value: input as SignalOrValue<TValue | undefined> };\n}\n\n/**\n * Type guard to check if an object is a SignalFormControl.\n *\n * @template TValue - The type of value the control manages\n * @param obj - Object to check\n * @returns True if obj is a SignalFormControl\n *\n * @example\n * ```typescript\n * if (isSignalFormControl(value)) {\n *   console.log(value.value()); // TypeScript knows this is a control\n * }\n * ```\n */\nexport function isSignalFormControl<TValue>(\n  obj: unknown,\n): obj is SignalFormControl<TValue> {\n  return (\n    !!obj &&\n    typeof obj === 'object' &&\n    (obj as SignalFormControl<TValue>).kind === 'control'\n  );\n}\n\n/**\n * Creates a reactive form control with signal-based state management.\n *\n * Builds a control that wraps a primitive value (string, number, boolean, etc.)\n * with validation, state tracking, and reactive updates using Angular signals.\n *\n * Features:\n * - Reactive value updates through signals\n * - Validators for errors (mark control as invalid)\n * - Warnings (validation messages without invalidating)\n * - Dynamic disabled state based on form context\n * - State tracking (touched, dirty)\n * - Manual error/warning management\n *\n * @template TControls - Object type defining available sibling controls for cross-field validation\n * @template TValue - The type of value this control manages\n *\n * @param input - Control input (raw value, config object, or existing control)\n * @param getControl - Optional accessor function for sibling controls\n * @returns Fully configured SignalFormControl instance\n *\n * @example\n * ```typescript\n * // Simple control\n * const nameControl = createSignalFormControl('John');\n *\n * // With validators\n * const ageControl = createSignalFormControl({\n *   value: 25,\n *   validators: [signalFormValidators.required, signalFormValidators.min(0)],\n *   warnings: [signalFormValidators.max(120)]\n * });\n *\n * // With dynamic disabled\n * const emailControl = createSignalFormControl({\n *   value: '',\n *   disabled: (ctx) => ctx.getControl('accountType').value() === 'guest'\n * });\n * ```\n */\nexport function createSignalFormControl<TControls extends object, TValue>(\n  input: SignalFormControlInput<TValue, TControls>,\n  getControl?: ControlAccessor<TControls>,\n): SignalFormControl<TValue> {\n  if (isSignalFormControl(input)) {\n    return input as SignalFormControl<TValue>;\n  }\n\n  const config = normalizeControlInput(input);\n  const accessControl =\n    getControl ??\n    ((() => {\n      throw new Error('getControl is not available for this control.');\n    }) as ControlAccessor<TControls>);\n\n  const initialValue = resolveControlValue(config.value);\n  const value = writableSignal(() => resolveControlValue(config.value));\n  const manualErrors = signal<Record<string, string>>({});\n  const manualWarnings = signal<Record<string, string>>({});\n  const selfTouched = signal(false);\n  const selfDirty = signal(false);\n  const selfDisabled = signal(false);\n\n  const disabledResolver = config.disabled;\n  const disabled = computed(() => {\n    const derived =\n      typeof disabledResolver === 'function'\n        ? (disabledResolver as SignalFormDisabledFn<TControls, TValue>)({\n            item: { value: value() },\n            getControl: accessControl,\n          })\n        : disabledResolver\n          ? signalOrValue(disabledResolver)\n          : false;\n    return selfDisabled() || derived;\n  });\n\n  const errors = computed(() => {\n    if (disabled()) return EMPTY_ERROR_MAP;\n    const ctx: SignalFormContext<TControls, TValue> = {\n      item: { value: value() },\n      getControl: accessControl,\n    };\n    return {\n      ...collectValidationErrors(config.validators, ctx),\n      ...manualErrors(),\n    };\n  });\n\n  const warnings = computed(() => {\n    if (disabled()) return EMPTY_ERROR_MAP;\n    const ctx: SignalFormContext<TControls, TValue> = {\n      item: { value: value() },\n      getControl: accessControl,\n    };\n    return {\n      ...collectValidationErrors(config.warnings, ctx),\n      ...manualWarnings(),\n    };\n  });\n\n  const invalid = computed(() => !disabled() && hasErrors(errors()));\n  const valid = computed(() => !invalid());\n\n  const firstError = computed<FirstError<'error'>>(() => {\n    const entries = Object.entries(errors());\n    if (!entries.length) return undefined;\n    const [name, message] = entries[0] ?? ['', ''];\n    return { name, message, type: 'error' };\n  });\n\n  const firstWarning = computed<FirstError<'warning'>>(() => {\n    const entries = Object.entries(warnings());\n    if (!entries.length) return undefined;\n    const [name, message] = entries[0] ?? ['', ''];\n    return { name, message, type: 'warning' };\n  });\n\n  const firstErrorOrWarning = computed<FirstError<'error' | 'warning'>>(() => {\n    return firstError() ?? firstWarning();\n  });\n\n  const setValue = (\n    next: TValue | undefined,\n    options?: SignalFormSetValueOptions,\n  ): void => {\n    value.set(next);\n    if (options?.markDirty ?? true) selfDirty.set(true);\n    if (options?.markTouched) selfTouched.set(true);\n  };\n\n  const reset = (next?: TValue | undefined): void => {\n    value.set(next ?? initialValue);\n    selfDirty.set(false);\n    selfTouched.set(false);\n    manualErrors.set({});\n    manualWarnings.set({});\n  };\n\n  return {\n    kind: 'control',\n    value,\n    disabled,\n    touched: computed(() => selfTouched()),\n    dirty: computed(() => selfDirty()),\n    errors,\n    warnings,\n    selfErrors: errors,\n    selfWarnings: warnings,\n    invalid,\n    valid,\n    firstError,\n    firstWarning,\n    firstErrorOrWarning,\n    setValue,\n    reset,\n    markTouched: () => selfTouched.set(true),\n    markUntouched: () => selfTouched.set(false),\n    markDirty: () => selfDirty.set(true),\n    markPristine: () => selfDirty.set(false),\n    setDisabled: (next: boolean) => selfDisabled.set(next),\n    setError: (key: string, message: string) =>\n      manualErrors.update((current) => ({ ...current, [key]: message })),\n    clearError: (key: string) =>\n      manualErrors.update((current) => {\n        // eslint-disable-next-line @typescript-eslint/no-unused-vars\n        const { [key]: _removed, ...rest } = current;\n        return rest;\n      }),\n    clearErrors: () => manualErrors.set({}),\n    setWarning: (key: string, message: string) =>\n      manualWarnings.update((current) => ({ ...current, [key]: message })),\n    clearWarning: (key: string) =>\n      manualWarnings.update((current) => {\n        // eslint-disable-next-line @typescript-eslint/no-unused-vars\n        const { [key]: _removed, ...rest } = current;\n        return rest;\n      }),\n    clearWarnings: () => manualWarnings.set({}),\n  };\n}\n","import { computed, signal } from '@angular/core';\n\nimport { createSignalFormArray, isSignalFormArray } from './array';\nimport { createSignalFormControl, isSignalFormControl } from './control';\nimport { hasErrors, isEmptyErrorTree } from './errors';\nimport {\n  SignalForm,\n  SignalFormArray,\n  SignalFormControl,\n  SignalFormControlConfig,\n  SignalFormControlInput,\n  SignalFormControlLike,\n  SignalFormDisableOptions,\n  SignalFormErrorFor,\n  SignalFormInput,\n  SignalFormInputs,\n  SignalFormSetValueOptions,\n  SignalFormValueFor,\n} from './types';\n\n/**\n * Internal type for accessing controls within a form group.\n * \n * @internal\n */\ntype ControlAccessor<TControls extends object> = <Key extends keyof TControls>(\n  controlName: Key,\n) => SignalFormControlLike<TControls[Key]>;\n\n/**\n * Set of valid keys for control configuration objects.\n * Used to distinguish config objects from plain value objects.\n * \n * @internal\n */\nconst CONTROL_CONFIG_KEYS = new Set([\n  'value',\n  'validators',\n  'warnings',\n  'disabled',\n]);\n\n/**\n * Checks if a value is a control configuration object.\n * \n * Determines if the value has a 'value' property and only contains\n * valid control config keys (value, validators, warnings, disabled).\n * \n * @internal\n * @param value - Value to check\n * @returns True if value is a control config object\n */\nfunction isControlConfig(\n  value: unknown,\n): value is SignalFormControlConfig<unknown, object> {\n  if (!value || typeof value !== 'object') return false;\n  if (!('value' in (value as Record<string, unknown>))) return false;\n  return Object.keys(value as Record<string, unknown>).every(key =>\n    CONTROL_CONFIG_KEYS.has(key),\n  );\n}\n\n/**\n * Creates the appropriate control node from various input types.\n * \n * Recursively determines and creates the correct control type:\n * - Existing controls are returned as-is\n * - Arrays become SignalFormArray\n * - Objects (non-config) become SignalForm (group)\n * - Primitives/configs become SignalFormControl\n * \n * @internal\n * @template TValue - The type of value to create a control for\n * @template TControls - Object type defining available sibling controls\n * @param input - Input value in any accepted format\n * @param getControl - Accessor for sibling controls\n * @returns Appropriate control type for the input\n */\nfunction createNodeFromInput<TValue, TControls extends object>(\n  input: SignalFormInput<TValue, TControls>,\n  getControl: ControlAccessor<TControls>,\n): SignalFormControlLike<TValue> {\n  if (isSignalFormControl<TValue>(input)) {\n    return input as SignalFormControlLike<TValue>;\n  }\n  if (isSignalFormGroup<object>(input)) {\n    return input as SignalFormControlLike<TValue>;\n  }\n  if (isSignalFormArray<TValue>(input)) {\n    return input as SignalFormControlLike<TValue>;\n  }\n  if (Array.isArray(input)) {\n    return createSignalFormArray(\n      input as SignalFormInput<TValue, TControls>[],\n      getControl,\n    ) as SignalFormControlLike<TValue>;\n  }\n  if (typeof input === 'object' && input !== null && !isControlConfig(input)) {\n    return createSignalFormGroup(\n      input as SignalFormInputs<TValue & object>,\n    ) as SignalFormControlLike<TValue>;\n  }\n  return createSignalFormControl(\n    input as SignalFormControlInput<TValue, TControls>,\n    getControl,\n  ) as SignalFormControlLike<TValue>;\n}\n\n/**\n * Type guard to check if an object is a SignalForm (form group).\n * \n * @template TData - Object type defining the form structure\n * @param obj - Object to check\n * @returns True if obj is a SignalForm\n * \n * @example\n * ```typescript\n * if (isSignalFormGroup(value)) {\n *   console.log(value.controls.name); // TypeScript knows this is a form group\n * }\n * ```\n */\nexport function isSignalFormGroup<TData extends object>(\n  obj: unknown,\n): obj is SignalForm<TData> {\n  return (\n    !!obj &&\n    typeof obj === 'object' &&\n    (obj as SignalForm<TData>).kind === 'group'\n  );\n}\n\n/**\n * Creates a reactive form group for managing structured form data.\n * \n * Builds a typed form container that holds multiple named controls, groups, or arrays.\n * Each property in the input object becomes a control with full signal-based reactivity.\n * Provides type-safe access to controls and tracks collective validation state.\n * \n * Features:\n * - Type-safe control access via `.controls` property\n * - Reactive value and error tracking across all controls\n * - Collective state management (touched, dirty, valid)\n * - Manual error/warning management at group level\n * - Support for nested groups and arrays\n * - Cross-field validation via getControl accessor\n * \n * @template TData - Object type defining the structure and types of all controls\n * \n * @param inputs - Object mapping property names to their control inputs\n * @returns Fully configured SignalForm instance\n * \n * @example\n * ```typescript\n * // Simple form\n * const form = createSignalFormGroup({\n *   name: 'John',\n *   age: 25\n * });\n * \n * // With validators and nested structure\n * const form = createSignalFormGroup<User>({\n *   email: {\n *     value: '',\n *     validators: [signalFormValidators.required, signalFormValidators.email]\n *   },\n *   age: {\n *     value: 25,\n *     validators: [signalFormValidators.min(0)],\n *     warnings: [signalFormValidators.max(120)]\n *   },\n *   address: {\n *     street: '123 Main St',\n *     city: 'NYC'\n *   },\n *   hobbies: ['coding', 'gaming']\n * });\n * \n * // Access controls\n * form.controls.email.value(); // Type-safe access\n * form.getControl('age').setValue(30);\n * ```\n */\nexport function createSignalFormGroup<TData extends object>(\n  inputs: SignalFormInputs<TData>,\n): SignalForm<TData> {\n  // type _Controls = { [Key in keyof TData]: SignalFormControlLike<TData[Key]> };\n  type _ControlsValues = SignalFormControlLike<TData[keyof TData]>;\n\n  const controls = {} as {\n    [Key in keyof TData]: SignalFormControlLike<TData[Key]>;\n  };\n\n  const getControl: ControlAccessor<TData> = key => controls[key];\n\n  Object.entries(inputs).forEach(([key, value]) => {\n    controls[key as keyof TData] = createNodeFromInput(\n      value as SignalFormInput<TData[keyof TData], TData>,\n      getControl,\n    );\n  });\n\n  const selfDirty = signal(false);\n  const selfTouched = signal(false);\n  const selfDisabled = signal(false);\n  const manualErrors = signal<Record<string, string>>({});\n  const manualWarnings = signal<Record<string, string>>({});\n\n  const value = computed(() => {\n    return (\n      Object.entries(controls) as [\n        string,\n        SignalFormControlLike<TData[keyof TData]>,\n      ][]\n    ).reduce(\n      (acc, [key, control]) => {\n        acc[key as keyof TData] = control.value() as SignalFormValueFor<\n          TData[keyof TData]\n        >;\n        return acc;\n      },\n      {} as { [Key in keyof TData]: SignalFormValueFor<TData[Key]> },\n    );\n  });\n\n  const errors = computed(() => {\n    const all = {} as { [Key in keyof TData]: SignalFormErrorFor<TData[Key]> };\n    (\n      Object.entries(controls) as [\n        string,\n        SignalFormControlLike<TData[keyof TData]>,\n      ][]\n    ).forEach(([key, control]) => {\n      if (control.kind === 'control') {\n        const map = control.errors();\n        all[key as keyof TData] = (\n          hasErrors(map) ? map : undefined\n        ) as SignalFormErrorFor<TData[keyof TData]>;\n        return;\n      }\n      const childErrors = control.errors();\n      all[key as keyof TData] = (\n        isEmptyErrorTree(childErrors) ? undefined : childErrors\n      ) as SignalFormErrorFor<TData[keyof TData]>;\n    });\n    return all;\n  });\n\n  const warnings = computed(() => {\n    const all = {} as { [Key in keyof TData]: SignalFormErrorFor<TData[Key]> };\n    (\n      Object.entries(controls) as [\n        string,\n        SignalFormControlLike<TData[keyof TData]>,\n      ][]\n    ).forEach(([key, control]) => {\n      if (control.kind === 'control') {\n        const map = control.warnings();\n        all[key as keyof TData] = (\n          hasErrors(map) ? map : undefined\n        ) as SignalFormErrorFor<TData[keyof TData]>;\n        return;\n      }\n      const childWarnings = control.warnings();\n      all[key as keyof TData] = (\n        isEmptyErrorTree(childWarnings) ? undefined : childWarnings\n      ) as SignalFormErrorFor<TData[keyof TData]>;\n    });\n    return all;\n  });\n\n  const selfErrors = computed(() => {\n    if (selfDisabled()) return {};\n    return { ...manualErrors() };\n  });\n\n  const selfWarnings = computed(() => {\n    if (selfDisabled()) return {};\n    return { ...manualWarnings() };\n  });\n\n  const invalid = computed(() => {\n    if (selfDisabled()) return false;\n    return (\n      hasErrors(selfErrors()) ||\n      (Object.values(controls) as _ControlsValues[]).some(control =>\n        control.invalid(),\n      )\n    );\n  });\n\n  const valid = computed(() => !invalid());\n\n  const touched = computed(\n    () =>\n      selfTouched() ||\n      (Object.values(controls) as _ControlsValues[]).some(control =>\n        control.touched(),\n      ),\n  );\n\n  const dirty = computed(\n    () =>\n      selfDirty() ||\n      (Object.values(controls) as _ControlsValues[]).some(control =>\n        control.dirty(),\n      ),\n  );\n\n  const setValue = (\n    nextValues: Partial<{\n      [Key in keyof TData]: SignalFormValueFor<TData[Key]>;\n    }>,\n    options?: SignalFormSetValueOptions,\n  ): void => {\n    Object.entries(nextValues).forEach(([key, nextValue]) => {\n      const control = controls[key as keyof TData];\n      control?.setValue(nextValue as never, options);\n    });\n    if (options?.markDirty ?? true) selfDirty.set(true);\n    if (options?.markTouched) selfTouched.set(true);\n  };\n\n  const reset = (\n    nextValues?: Partial<{\n      [Key in keyof TData]: SignalFormValueFor<TData[Key]>;\n    }>,\n  ): void => {\n    if (nextValues) {\n      setValue(nextValues, { markDirty: false });\n    } else {\n      (Object.values(controls) as _ControlsValues[]).forEach(control =>\n        control.reset(),\n      );\n    }\n    selfDirty.set(false);\n    selfTouched.set(false);\n    manualErrors.set({});\n    manualWarnings.set({});\n  };\n\n  const setDisabled = (\n    disabled: boolean,\n    options?: SignalFormDisableOptions,\n  ): void => {\n    selfDisabled.set(disabled);\n    if (!options?.onlySelf) {\n      (Object.values(controls) as _ControlsValues[]).forEach(control =>\n        control.setDisabled(disabled),\n      );\n    }\n  };\n\n  return {\n    kind: 'group',\n    controls,\n    value,\n    errors,\n    warnings,\n    selfErrors,\n    selfWarnings,\n    disabled: computed(() => selfDisabled()),\n    touched,\n    dirty,\n    invalid,\n    valid,\n    getControl,\n    setValue,\n    reset,\n    markTouched: () => selfTouched.set(true),\n    markUntouched: () => selfTouched.set(false),\n    markDirty: () => selfDirty.set(true),\n    markPristine: () => selfDirty.set(false),\n    markAllTouched: () =>\n      (Object.values(controls) as _ControlsValues[]).forEach(control =>\n        control.markTouched(),\n      ),\n    setDisabled,\n    setError: (key: string, message: string) =>\n      manualErrors.update(current => ({ ...current, [key]: message })),\n    clearError: (key: string) =>\n      manualErrors.update(current => {\n        // eslint-disable-next-line @typescript-eslint/no-unused-vars\n        const { [key]: _removed, ...rest } = current;\n        return rest;\n      }),\n    clearErrors: () => manualErrors.set({}),\n    setWarning: (key: string, message: string) =>\n      manualWarnings.update(current => ({ ...current, [key]: message })),\n    clearWarning: (key: string) =>\n      manualWarnings.update(current => {\n        // eslint-disable-next-line @typescript-eslint/no-unused-vars\n        const { [key]: _removed, ...rest } = current;\n        return rest;\n      }),\n    clearWarnings: () => manualWarnings.set({}),\n  };\n}\n\n/**\n * Helper function to create a standalone form control.\n * \n * Creates a control without sibling control access. Useful for creating\n * individual controls outside of a form group context.\n * \n * @template TValue - The type of value the control manages\n * @param input - Control input (raw value, config object, or existing control)\n * @returns SignalFormControl instance\n * \n * @example\n * ```typescript\n * const nameControl = formControl('John');\n * const ageControl = formControl({\n *   value: 25,\n *   validators: [signalFormValidators.min(0)]\n * });\n * ```\n */\nexport function formControl<TValue>(\n  input: SignalFormControlInput<TValue, object>,\n): SignalFormControl<TValue> {\n  return createSignalFormControl(input, undefined);\n}\n\n/**\n * Helper function to create a standalone form array.\n * \n * Creates an array without sibling control access. Useful for creating\n * array controls outside of a form group context.\n * \n * @template TValue - The type of each item in the array\n * @param input - Array of initial items\n * @returns SignalFormArray instance\n * \n * @example\n * ```typescript\n * const tagsArray = formArray(['tag1', 'tag2', 'tag3']);\n * const addressesArray = formArray<Address>([\n *   { street: '123 Main', city: 'NYC' }\n * ]);\n * ```\n */\nexport function formArray<TValue>(\n  input: SignalFormInput<TValue, object>[],\n): SignalFormArray<TValue> {\n  return createSignalFormArray(input, undefined);\n}\n\n/**\n * Helper function to create a form group.\n * \n * Alias for createSignalFormGroup. Creates a typed form with multiple controls.\n * \n * @template TData - Object type defining the form structure\n * @param input - Object mapping property names to control inputs\n * @returns SignalForm instance\n * \n * @example\n * ```typescript\n * const form = formGroup({\n *   name: 'John',\n *   email: {\n *     value: 'john@example.com',\n *     validators: [signalFormValidators.email]\n *   }\n * });\n * ```\n */\nexport function formGroup<TData extends object>(\n  input: SignalFormInputs<TData>,\n): SignalForm<TData> {\n  return createSignalFormGroup(input);\n}\n\n/**\n * Primary API for creating signal-based reactive forms.\n * \n * Alias for `formGroup`. This is the main entry point for creating forms.\n * Provides type-safe, signal-based form state management with built-in validation.\n * \n * @example\n * ```typescript\n * // Basic form\n * const form = signalForm({ name: 'John', age: 25 });\n * \n * // Complex form with validation\n * const form = signalForm<Person>({\n *   name: {\n *     value: '',\n *     validators: [signalFormValidators.required, signalFormValidators.minLength(2)]\n *   },\n *   age: {\n *     value: 30,\n *     validators: [signalFormValidators.min(0)],\n *     warnings: [signalFormValidators.max(120)],\n *     disabled: (ctx) => ctx.getControl('name').value() === 'admin'\n *   },\n *   address: {\n *     street: '123 Main St',\n *     city: 'NYC'\n *   },\n *   hobbies: ['coding', 'gaming']\n * });\n * \n * // Access form state\n * console.log(form.value()); // { name: '', age: 30, address: {...}, hobbies: [...] }\n * console.log(form.valid()); // boolean\n * console.log(form.controls.name.errors()); // { required: 'This field is required' }\n * ```\n */\nexport const signalForm = formGroup;\n","import { computed, signal } from '@angular/core';\n\nimport { createSignalFormControl, isSignalFormControl } from './control';\nimport { hasErrors, isEmptyErrorTree } from './errors';\nimport { createSignalFormGroup, isSignalFormGroup } from './form';\nimport {\n  SignalFormArray,\n  SignalFormControlLike,\n  SignalFormDisableOptions,\n  SignalFormErrorFor,\n  SignalFormInput,\n  SignalFormInputs,\n  SignalFormSetValueOptions,\n  SignalFormValueFor,\n} from './types';\n\n/**\n * Internal type for accessing sibling controls in a form.\n * \n * @internal\n */\ntype ControlAccessor<TControls extends object> = <Key extends keyof TControls>(\n  controlName: Key,\n) => SignalFormControlLike<TControls[Key]>;\n\n/**\n * Set of valid keys for control configuration objects.\n * Used to distinguish config objects from plain value objects.\n * \n * @internal\n */\nconst CONTROL_CONFIG_KEYS = new Set([\n  'value',\n  'validators',\n  'warnings',\n  'disabled',\n]);\n\n/**\n * Checks if a value is a control configuration object.\n * \n * Determines if the value has a 'value' property and only contains\n * valid control config keys (value, validators, warnings, disabled).\n * \n * @internal\n * @param value - Value to check\n * @returns True if value is a control config object\n */\nfunction isControlConfig(value: unknown): boolean {\n  if (!value || typeof value !== 'object') return false;\n  if (!('value' in (value as Record<string, unknown>))) return false;\n  return Object.keys(value as Record<string, unknown>).every(key =>\n    CONTROL_CONFIG_KEYS.has(key),\n  );\n}\n\n/**\n * Creates the appropriate control node from various input types.\n * \n * Recursively determines and creates the correct control type:\n * - Existing controls are returned as-is\n * - Arrays become SignalFormArray\n * - Objects (non-config) become SignalForm (group)\n * - Primitives/configs become SignalFormControl\n * \n * @internal\n * @template TItem - The type of item to create a control for\n * @template TControls - Object type defining available sibling controls\n * @param input - Input value in any accepted format\n * @param getControl - Accessor for sibling controls\n * @returns Appropriate control type for the input\n */\nfunction createNodeFromInput<TItem, TControls extends object>(\n  input: SignalFormInput<TItem, TControls> | SignalFormValueFor<TItem>,\n  getControl: ControlAccessor<TControls>,\n): SignalFormControlLike<TItem> {\n  if (isSignalFormControl<TItem>(input)) {\n    return input as SignalFormControlLike<TItem>;\n  }\n  if (isSignalFormGroup<object>(input)) {\n    return input as SignalFormControlLike<TItem>;\n  }\n  if (isSignalFormArray<TItem>(input)) {\n    return input as SignalFormControlLike<TItem>;\n  }\n  if (Array.isArray(input)) {\n    return createSignalFormArray(\n      input as SignalFormInput<TItem, TControls>[],\n      getControl,\n    ) as SignalFormControlLike<TItem>;\n  }\n  if (typeof input === 'object' && input !== null && !isControlConfig(input)) {\n    return createSignalFormGroup(\n      input as SignalFormInputs<TItem & object>,\n    ) as SignalFormControlLike<TItem>;\n  }\n  return createSignalFormControl(\n    input as SignalFormInput<TItem, TControls>,\n    getControl,\n  ) as SignalFormControlLike<TItem>;\n}\n\n/**\n * Type guard to check if an object is a SignalFormArray.\n * \n * @template TValue - The type of items in the array\n * @param obj - Object to check\n * @returns True if obj is a SignalFormArray\n * \n * @example\n * ```typescript\n * if (isSignalFormArray(value)) {\n *   console.log(value.controls().length); // TypeScript knows this is an array\n * }\n * ```\n */\nexport function isSignalFormArray<TValue>(\n  obj: unknown,\n): obj is SignalFormArray<TValue> {\n  return (\n    !!obj &&\n    typeof obj === 'object' &&\n    (obj as SignalFormArray<TValue>).kind === 'array'\n  );\n}\n\n/**\n * Creates a reactive form array for managing dynamic collections of controls.\n * \n * Builds an array container that can hold multiple controls (primitives, groups, or nested arrays)\n * with full signal-based reactivity. Provides methods for dynamic addition/removal of items\n * and tracks collective validation state.\n * \n * Features:\n * - Dynamic array operations (push, insert, remove, clear)\n * - Reactive value and error tracking across all items\n * - Collective state management (touched, dirty, valid)\n * - Manual error/warning management at array level\n * - Type-safe access to individual controls\n * \n * @template TItem - The type of each item in the array\n * @template TControls - Object type defining available sibling controls\n * \n * @param inputItems - Array of initial items (values, configs, or controls)\n * @param getControl - Optional accessor for sibling controls\n * @returns Fully configured SignalFormArray instance\n * \n * @example\n * ```typescript\n * // Array of primitives\n * const tagsArray = createSignalFormArray(['tag1', 'tag2']);\n * tagsArray.push('tag3');\n * \n * // Array of objects\n * const addressesArray = createSignalFormArray<Address>([\n *   { street: '123 Main', city: 'NYC' },\n *   { street: '456 Oak', city: 'LA' }\n * ]);\n * \n * // Array with validators\n * const hobbiesArray = createSignalFormArray([\n *   { value: 'coding', validators: [signalFormValidators.minLength(3)] },\n *   'gaming'\n * ]);\n * ```\n */\nexport function createSignalFormArray<TItem, TControls extends object = object>(\n  inputItems: SignalFormInput<TItem, TControls>[],\n  getControl?: ControlAccessor<TControls>,\n): SignalFormArray<TItem> {\n  const accessControl =\n    getControl ??\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    (((_: keyof TControls) => {\n      throw new Error('getControl is not available for this array.');\n    }) as ControlAccessor<TControls>);\n\n  const controls = signal<SignalFormControlLike<TItem>[]>(\n    inputItems.map(item => createNodeFromInput(item, accessControl)),\n  );\n\n  const selfDirty = signal(false);\n  const selfTouched = signal(false);\n  const selfDisabled = signal(false);\n  const manualErrors = signal<Record<string, string>>({});\n  const manualWarnings = signal<Record<string, string>>({});\n\n  const value = computed<SignalFormValueFor<TItem>[]>(\n    () =>\n      controls().map(control => control.value()) as SignalFormValueFor<TItem>[],\n  );\n\n  const errors = computed<SignalFormErrorFor<TItem>[]>(\n    () =>\n      controls().map(control => {\n        if (control.kind === 'control') {\n          const map = control.errors();\n          return hasErrors(map) ? map : undefined;\n        }\n        const childErrors = control.errors();\n        return isEmptyErrorTree(childErrors) ? undefined : childErrors;\n      }) as SignalFormErrorFor<TItem>[],\n  );\n\n  const warnings = computed<SignalFormErrorFor<TItem>[]>(\n    () =>\n      controls().map(control => {\n        if (control.kind === 'control') {\n          const map = control.warnings();\n          return hasErrors(map) ? map : undefined;\n        }\n        const childWarnings = control.warnings();\n        return isEmptyErrorTree(childWarnings) ? undefined : childWarnings;\n      }) as SignalFormErrorFor<TItem>[],\n  );\n\n  const selfErrors = computed(() => {\n    if (selfDisabled()) return {};\n    return { ...manualErrors() };\n  });\n\n  const selfWarnings = computed(() => {\n    if (selfDisabled()) return {};\n    return { ...manualWarnings() };\n  });\n\n  const invalid = computed(() => {\n    if (selfDisabled()) return false;\n    return (\n      hasErrors(selfErrors()) || controls().some(control => control.invalid())\n    );\n  });\n\n  const valid = computed(() => !invalid());\n\n  const touched = computed(\n    () => selfTouched() || controls().some(control => control.touched()),\n  );\n\n  const dirty = computed(\n    () => selfDirty() || controls().some(control => control.dirty()),\n  );\n\n  const insert = (\n    item: SignalFormInput<TItem, TControls> | SignalFormValueFor<TItem>,\n    index?: number,\n  ): number => {\n    const node = createNodeFromInput(item, accessControl);\n    const position = index ?? controls().length;\n    controls.update(old => {\n      const newArray = [...old];\n      newArray.splice(position, 0, node)\n      return newArray;\n    });\n    selfDirty.set(true);\n    return position;\n  };\n\n  const push = (\n    item: SignalFormInput<TItem, TControls> | SignalFormValueFor<TItem>,\n  ): number => insert(item);\n\n  const removeAt = (index: number): void => {\n    controls.update(old => {\n      const newArray = [...old];\n      newArray.splice(index, 1);\n      return newArray;\n    });\n    selfDirty.set(true);\n  };\n\n  const clear = (): void => {\n    controls.set([]);\n    selfDirty.set(true);\n  };\n\n  const at = (index: number): SignalFormControlLike<TItem> | undefined =>\n    controls()[index];\n\n  const setValue = (\n    nextValues: SignalFormValueFor<TItem>[],\n    options?: SignalFormSetValueOptions,\n  ): void => {\n    controls.update(old => {\n      if (nextValues.length !== old.length) {\n        return nextValues.map(_value =>\n          createNodeFromInput(_value, accessControl),\n        );\n      }\n      old.forEach((control, index) => {\n        control.setValue(nextValues[index] as never, options);\n      });\n      return old;\n    });\n    if (options?.markDirty ?? true) selfDirty.set(true);\n    if (options?.markTouched) selfTouched.set(true);\n  };\n\n  const reset = (nextValues?: SignalFormValueFor<TItem>[]): void => {\n    if (nextValues) {\n      setValue(nextValues, { markDirty: false });\n    } else {\n      controls().forEach(control => control.reset());\n    }\n    selfDirty.set(false);\n    selfTouched.set(false);\n    manualErrors.set({});\n    manualWarnings.set({});\n  };\n\n  const setDisabled = (\n    disabled: boolean,\n    options?: SignalFormDisableOptions,\n  ): void => {\n    selfDisabled.set(disabled);\n    if (!options?.onlySelf) {\n      controls().forEach(control => control.setDisabled(disabled));\n    }\n  };\n\n  return {\n    kind: 'array',\n    controls,\n    value,\n    errors,\n    warnings,\n    selfErrors,\n    selfWarnings,\n    disabled: computed(() => selfDisabled()),\n    touched,\n    dirty,\n    invalid,\n    valid,\n    insert,\n    push,\n    removeAt,\n    clear,\n    at,\n    setValue,\n    reset,\n    markTouched: () => selfTouched.set(true),\n    markUntouched: () => selfTouched.set(false),\n    markDirty: () => selfDirty.set(true),\n    markPristine: () => selfDirty.set(false),\n    markAllTouched: () => controls().forEach(control => control.markTouched()),\n    setDisabled,\n    setError: (key: string, message: string) =>\n      manualErrors.update(current => ({ ...current, [key]: message })),\n    clearError: (key: string) =>\n      manualErrors.update(current => {\n        // eslint-disable-next-line @typescript-eslint/no-unused-vars\n        const { [key]: _removed, ...rest } = current;\n        return rest;\n      }),\n    clearErrors: () => manualErrors.set({}),\n    setWarning: (key: string, message: string) =>\n      manualWarnings.update(current => ({ ...current, [key]: message })),\n    clearWarning: (key: string) =>\n      manualWarnings.update(current => {\n        // eslint-disable-next-line @typescript-eslint/no-unused-vars\n        const { [key]: _removed, ...rest } = current;\n        return rest;\n      }),\n    clearWarnings: () => manualWarnings.set({}),\n  };\n}\n","import { SignalFormValidatorFn } from './types';\n\nexport type {\n  FirstError,\n  SignalFormValidationError,\n  SignalFormValidatorFn,\n} from './types';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ValidatorFn = SignalFormValidatorFn<any, any>;\n\n/**\n * Regular expression for email validation.\n * \n * Aligned with Angular's built-in email validator. Validates standard email formats\n * with proper domain and local parts.\n * \n * Pattern requirements:\n * - Total length: 1-254 characters\n * - Local part (before @): 1-64 characters\n * - Allows alphanumeric and special characters: !#$%&'*+/=?^_`{|}~-\n * - Domain must have valid format with optional subdomains\n */\nconst EMAIL_REGEXP =\n  /^(?=.{1,254}$)(?=.{1,64}@)[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n\n/**\n * Determines if a value is considered empty for validation purposes.\n * \n * Checks various types:\n * - null/undefined: always empty\n * - Numbers: empty when equals 0\n * - Strings/Arrays: empty when length is 0\n * - Sets: empty when size is 0\n * \n * @param value - Value to check for emptiness\n * @returns True if the value is considered empty\n * \n * @example\n * ```typescript\n * isEmptyInputValue(null); // true\n * isEmptyInputValue(''); // true\n * isEmptyInputValue(0); // true\n * isEmptyInputValue('hello'); // false\n * ```\n */\nfunction isEmptyInputValue(value: unknown): boolean {\n  if (value === null || value === undefined) return true;\n  // TODO 1: check if number==0 is empty or number.length==0 is empty\n  if (typeof value === 'number' /* or - isNumber(value) */) {\n    return value == 0;\n  }\n  if (Array.isArray(value) || typeof value === 'string') {\n    return value.length === 0;\n  }\n  if (value instanceof Set) {\n    return value.size === 0;\n  }\n  return false;\n}\n\n/**\n * Type guard that checks if a value can be coerced to a valid number.\n * \n * Uses JavaScript's Number coercion and checks for NaN to determine\n * if a value represents a valid numeric value.\n * \n * @param value - Value to check\n * @returns True if value is or can be coerced to a number\n * \n * @example\n * ```typescript\n * isNumber(42); // true\n * isNumber('42'); // true\n * isNumber('hello'); // false\n * ```\n */\nfunction isNumber(value: unknown): value is number {\n  return !Number.isNaN(Number(value));\n}\n\n/**\n * Validator that requires a non-empty value.\n * \n * Fails when the value is null, undefined, empty string, empty array,\n * zero (for numbers), or empty Set.\n * \n * @param ctx - Validation context with the value to check\n * @returns Error object with 'required' key if validation fails, null otherwise\n * \n * @example\n * ```typescript\n * const control = signalForm({ name: { value: '', validators: [signalFormValidators.required] } });\n * // control.controls.name.errors() => { required: 'This field is required' }\n * ```\n */\nconst required: ValidatorFn = ({ item: { value } }) =>\n  isEmptyInputValue(value) ? { required: 'This field is required' } : null;\n\n/**\n * Validator that enforces a maximum string or number length.\n * \n * Converts the value to string and checks if its length exceeds the specified maximum.\n * Works with both string and number types.\n * \n * @param num - Maximum allowed length (inclusive)\n * @returns Validator function\n * \n * @example\n * ```typescript\n * const control = signalForm({\n *   username: { value: 'verylongusername', validators: [signalFormValidators.maxLength(10)] }\n * });\n * // control.controls.username.errors() => { maxLength: 'To long' }\n * ```\n */\nfunction maxLength(num: number): ValidatorFn {\n  return ({ item: { value } }) =>\n    (typeof value == 'string' || typeof value == 'number') &&\n    value.toString().length > num\n      ? { maxLength: 'To long' }\n      : null;\n}\n\n/**\n * Validator that enforces a minimum string or number length.\n * \n * Converts the value to string and checks if its length is less than or equal to the specified minimum.\n * Works with both string and number types.\n * \n * @param num - Minimum required length (inclusive)\n * @returns Validator function\n * \n * @example\n * ```typescript\n * const control = signalForm({\n *   code: { value: 'ab', validators: [signalFormValidators.minLength(3)] }\n * });\n * // control.controls.code.errors() => { minLength: 'To short' }\n * ```\n */\nfunction minLength(num: number): ValidatorFn {\n  return ({ item: { value } }) =>\n    (typeof value == 'string' || typeof value == 'number') &&\n    value.toString().length <= num\n      ? { minLength: 'To short' }\n      : null;\n}\n\n/**\n * Validator that enforces a minimum numeric value.\n * \n * Checks if a numeric value is less than or equal to the specified minimum.\n * Value is coerced to a number for comparison.\n * \n * @param num - Minimum allowed value (exclusive - value must be greater than this)\n * @returns Validator function\n * \n * @example\n * ```typescript\n * const control = signalForm({\n *   age: { value: -5, validators: [signalFormValidators.min(0)] }\n * });\n * // control.controls.age.errors() => { minLength: 'To small' }\n * ```\n */\nfunction min(num: number): ValidatorFn {\n  return ({ item: { value } }) =>\n    isNumber(value) && value <= num ? { minLength: 'To small' } : null;\n}\n\n/**\n * Validator that enforces a maximum numeric value.\n * \n * Checks if a numeric value exceeds the specified maximum.\n * Value is coerced to a number for comparison.\n * \n * @param num - Maximum allowed value (inclusive)\n * @returns Validator function\n * \n * @example\n * ```typescript\n * const control = signalForm({\n *   age: { value: 150, validators: [signalFormValidators.max(120)] }\n * });\n * // control.controls.age.errors() => { minLength: 'To big' }\n * ```\n */\nfunction max(num: number): ValidatorFn {\n  return ({ item: { value } }) =>\n    isNumber(value) && value > num ? { minLength: 'To big' } : null;\n}\n\n/**\n * Validator that checks if a value is a valid email address.\n * \n * Uses Angular-compatible email regex pattern to validate email format.\n * Skips validation for empty values (use with `required` if needed).\n * \n * @param ctx - Validation context with the email value to check\n * @returns Error object with 'email' key if validation fails, null otherwise\n * \n * @example\n * ```typescript\n * const control = signalForm({\n *   email: { value: 'invalid-email', validators: [signalFormValidators.email] }\n * });\n * // control.controls.email.errors() => { email: 'Invalid email' }\n * ```\n */\nconst email: ValidatorFn = ({ item: { value } }) => {\n  if (isEmptyInputValue(value)) return null;\n  return EMAIL_REGEXP.test(String(value)) ? null : { email: 'Invalid email' };\n};\n\n/**\n * Validator that checks if a value matches a specified regular expression pattern.\n * \n * Accepts either a RegExp object or a string pattern. String patterns are automatically\n * wrapped with ^ and $ anchors to match the entire value.\n * \n * Skips validation for empty values (use with `required` if needed).\n * \n * @param valuePattern - Regular expression or pattern string to match against\n * @returns Validator function\n * \n * @example\n * ```typescript\n * // Using regex\n * const control1 = signalForm({\n *   code: { value: 'abc', validators: [signalFormValidators.pattern(/^[0-9]+$/)] }\n * });\n * // control1.controls.code.errors() => { pattern: 'RequiredPattern: ^[0-9]+$, ActualValue: abc' }\n * \n * // Using string pattern\n * const control2 = signalForm({\n *   zipCode: { value: 'ABC', validators: [signalFormValidators.pattern('[0-9]{5}')] }\n * });\n * ```\n */\nfunction pattern(valuePattern: string | RegExp): ValidatorFn {\n  if (!valuePattern) return () => null;\n  let regex: RegExp;\n  let regexStr: string;\n  if (typeof valuePattern === 'string') {\n    regexStr = '';\n    if (valuePattern.charAt(0) !== '^') regexStr += '^';\n    regexStr += valuePattern;\n    if (valuePattern.charAt(valuePattern.length - 1) !== '$') regexStr += '$';\n    regex = new RegExp(regexStr);\n  } else {\n    regexStr = valuePattern.toString();\n    regex = valuePattern;\n  }\n\n  return ({ item: { value } }) => {\n    if (isEmptyInputValue(value)) return null;\n    const valueStr = String(value);\n    return regex.test(valueStr)\n      ? null\n      : {\n          pattern: `RequiredPattern: ${regexStr}, ActualValue: ${valueStr}`,\n        };\n  };\n}\n\n/**\n * Collection of built-in validators for signal-form controls.\n * \n * Provides common validation functions that can be used in the `validators` or `warnings`\n * arrays of form controls. All validators skip empty values except `required`.\n * \n * @property required - Ensures the value is not empty (null, undefined, '', [], 0, empty Set)\n * @property maxLength - Ensures string/number length doesn't exceed maximum\n * @property minLength - Ensures string/number length meets minimum requirement\n * @property min - Ensures numeric value is greater than minimum (exclusive)\n * @property max - Ensures numeric value doesn't exceed maximum (inclusive)\n * @property email - Validates email address format using Angular-compatible regex\n * @property pattern - Validates value matches a regular expression pattern\n * \n * @example\n * ```typescript\n * const form = signalForm({\n *   email: {\n *     value: '',\n *     validators: [signalFormValidators.required, signalFormValidators.email]\n *   },\n *   age: {\n *     value: 25,\n *     validators: [signalFormValidators.min(0), signalFormValidators.max(120)],\n *     warnings: [signalFormValidators.max(100)] // Warning but doesn't invalidate\n *   },\n *   username: {\n *     value: '',\n *     validators: [\n *       signalFormValidators.required,\n *       signalFormValidators.minLength(3),\n *       signalFormValidators.maxLength(20),\n *       signalFormValidators.pattern(/^[a-zA-Z0-9_]+$/)\n *     ]\n *   }\n * });\n * ```\n */\nexport const signalFormValidators = {\n  required,\n  maxLength,\n  minLength,\n  min,\n  max,\n  email,\n  pattern,\n};\n","export * from './array';\nexport * from './control';\nexport * from './form';\nexport * from './types';\nexport * from './validators';\n\n/**\n * Example demonstrating the usage of signal-based reactive forms.\n *\n * Shows various features including:\n * - Simple value initialization\n * - Validators that mark controls as invalid\n * - Warnings that don't affect validity\n * - Dynamic disabled state based on other controls\n * - Nested objects and arrays\n * - Type-safe control access\n *\n * This function is exported as an example and reference implementation.\n * It's not meant to be called in production code.\n *\n * @example\n * ```typescript\n * // Basic usage pattern from the example\n * const form = signalForm<Person>({\n *   name: 'dvirus',\n *   age: {\n *     value: 130,\n *     validators: [signalFormValidators.required, signalFormValidators.min(0)],\n *     warnings: [signalFormValidators.max(120)],\n *     disabled: (ctx) => ctx.getControl('name').value() === 'admin'\n *   },\n *   address: {\n *     street: { value: '123 Main St', validators: [signalFormValidators.required] }\n *   },\n *   hobbies: [\n *     { value: 'coding', validators: [signalFormValidators.minLength(3)] },\n *     'programming'\n *   ]\n * });\n *\n * // Access form state\n * form.getControl('address').value(); // { street: '123 Main St' }\n * form.controls.hobbies.controls()[0].errors(); // {}\n * form.controls.age.firstErrorOrWarning(); // { name: 'max', message: 'To big', type: 'warning' }\n * ```\n */\n// function main() {\n//   type Person = {\n//     name: string;\n//     age: number;\n//     address: {\n//       street: string;\n//       city: string;\n//     };\n//     hobbies: string[];\n//   };\n\n//   /**\n//    * Example 1: Simple form with direct value initialization.\n//    *\n//    * Creates a form from a plain object. Each property becomes\n//    * a control with the provided value.\n//    */\n//   const model1: Person = {\n//     name: 'dvirus',\n//     age: 30,\n//     address: {\n//       street: '123 Main St',\n//       city: 'Any-town',\n//     },\n//     hobbies: ['coding', 'gaming'],\n//   };\n\n//   const form1 = signalForm(model1);\n\n//   /**\n//    * Example 2: Advanced form with validators, warnings, and dynamic disabled state.\n//    *\n//    * Demonstrates:\n//    * - Simple value for name field\n//    * - Age control with validators (required, min) and warnings (max)\n//    * - Dynamic disabled logic based on name value\n//    * - Nested address object with validated street field\n//    * - Array of hobbies with mixed control configs and simple values\n//    */\n//   const form2 = signalForm<Person>({\n//     name: 'dvirus',\n//     age: {\n//       // initial value\n//       value: 130,\n//       // example of validators, they add error messages and mark the control as invalid if the validation fails\n//       validators: [signalFormValidators.required, signalFormValidators.min(0)],\n//       // warning are like validators but they don't make the control invalid, just add a warning message\n//       warnings: [signalFormValidators.max(120)],\n//       // example of dynamic disabling based on another control's value\n//       disabled: (ctx) => ctx.getControl('name').value() === 'admin',\n//     },\n//     address: {\n//       street: {\n//         value: '123 Main St',\n//         validators: [signalFormValidators.required],\n//         disabled: false,\n//       },\n//     },\n//     hobbies: [\n//       {\n//         value: 'coding',\n//         validators: [signalFormValidators.minLength(3)],\n//         disabled: computed(() => false),\n//       },\n//       'programming',\n//       'Typing',\n//     ],\n//   });\n\n//   // Example outputs demonstrating form access patterns\n//   console.log(form2.getControl('address').value()); // { street: '123 Main St' }\n//   console.log(form2.controls.hobbies.controls()[0].errors()); // {}\n//   console.log(form2.controls.age.firstErrorOrWarning()); // {name: 'minLength', message: 'To big', type: 'warning'}\n//   console.log(form2.controls.age.warnings()); // { minLength: 'To big' }\n// }\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["CONTROL_CONFIG_KEYS","isControlConfig","createNodeFromInput"],"mappings":"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"}