@orkestrel/validator 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/constants.ts","../src/errors.ts","../src/collections.ts","../src/primitives.ts","../src/helpers.ts","../src/factories.ts","../src/arrays.ts","../src/emptiness.ts","../src/functions.ts","../src/guards.ts"],"sourcesContent":["import type { ValidationRuleName } from './types.js'\n\n/** Ordered evaluation of all built-in validation rules. */\nexport const VALIDATION_RULE_NAMES: readonly ValidationRuleName[] = [\n\t'required',\n\t'minimum',\n\t'maximum',\n\t'pattern',\n\t'email',\n\t'url',\n\t'numeric',\n\t'integer',\n\t'alphanumeric',\n\t'custom',\n]\n\n/** Basic email format: local@domain.tld. */\nexport const EMAIL_PATTERN = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n\n/** HTTP or HTTPS URL. */\nexport const URL_PATTERN = /^https?:\\/\\/.+/\n\n/** Numeric value: integer or decimal, optionally negative. */\nexport const NUMERIC_PATTERN = /^-?\\d+(\\.\\d+)?$/\n\n/** Integer value, optionally negative. */\nexport const INTEGER_PATTERN = /^-?\\d+$/\n\n/** Letters and digits only. */\nexport const ALPHANUMERIC_PATTERN = /^[a-zA-Z0-9]+$/\n","import type { ValidatorErrorCode, ValidatorErrorContext } from './types.js'\n\n/**\n * Error thrown for invalid validator configuration.\n *\n * @param code - Machine-readable validator error code.\n * @param message - Human-readable explanation.\n * @param context - Additional error context.\n * @returns A configured `ValidatorError` instance.\n * @example\n * ```ts\n * throw new ValidatorError('INVALID_PATTERN', 'Pattern is invalid')\n * ```\n */\nexport class ValidatorError extends Error {\n\treadonly code: ValidatorErrorCode\n\treadonly context: ValidatorErrorContext\n\n\tconstructor(code: ValidatorErrorCode, message: string, context: ValidatorErrorContext = {}) {\n\t\tsuper(message)\n\t\tthis.name = 'ValidatorError'\n\t\tthis.code = code\n\t\tthis.context = { ...context }\n\t}\n}\n\n/**\n * Narrow an unknown value to `ValidatorError`.\n *\n * @param value - Value to test.\n * @returns `true` when the value is a `ValidatorError`.\n * @example\n * ```ts\n * isValidatorError(new ValidatorError('INVALID_RULES', 'Invalid rules'))\n * ```\n */\nexport function isValidatorError(value: unknown): value is ValidatorError {\n\treturn value instanceof ValidatorError\n}\n","/**\n * Narrow an unknown value to `Map`.\n *\n * @param value - Value to test.\n * @returns `true` when the value is a `Map`.\n * @example\n * ```ts\n * isMap(new Map())\n * ```\n */\nexport function isMap<K = unknown, V = unknown>(value: ReadonlyMap<K, V>): boolean\nexport function isMap<K = unknown, V = unknown>(value: unknown): value is ReadonlyMap<K, V>\nexport function isMap(value: unknown): boolean {\n\treturn value instanceof Map\n}\n\n/**\n * Narrow an unknown value to `Set`.\n *\n * @param value - Value to test.\n * @returns `true` when the value is a `Set`.\n * @example\n * ```ts\n * isSet(new Set())\n * ```\n */\nexport function isSet<T = unknown>(value: ReadonlySet<T>): boolean\nexport function isSet<T = unknown>(value: unknown): value is ReadonlySet<T>\nexport function isSet(value: unknown): boolean {\n\treturn value instanceof Set\n}\n\n/**\n * Narrow an unknown value to `WeakMap`.\n *\n * @param value - Value to test.\n * @returns `true` when the value is a `WeakMap`.\n * @example\n * ```ts\n * isWeakMap(new WeakMap())\n * ```\n */\nexport function isWeakMap(value: WeakMap<object, unknown>): boolean\nexport function isWeakMap(value: unknown): value is WeakMap<object, unknown>\nexport function isWeakMap(value: unknown): boolean {\n\treturn value instanceof WeakMap\n}\n\n/**\n * Narrow an unknown value to `WeakSet`.\n *\n * @param value - Value to test.\n * @returns `true` when the value is a `WeakSet`.\n * @example\n * ```ts\n * isWeakSet(new WeakSet())\n * ```\n */\nexport function isWeakSet(value: WeakSet<object>): boolean\nexport function isWeakSet(value: unknown): value is WeakSet<object>\nexport function isWeakSet(value: unknown): boolean {\n\treturn value instanceof WeakSet\n}\n\n/**\n * Narrow an unknown value to a non-null object.\n *\n * @param value - Value to test.\n * @returns `true` when the value is an object and not `null`.\n * @example\n * ```ts\n * isObject({})\n * ```\n */\nexport function isObject(value: object): boolean\nexport function isObject(value: unknown): value is object\nexport function isObject(value: unknown): boolean {\n\treturn typeof value === 'object' && value !== null\n}\n\n/**\n * Narrow an unknown value to a plain string-keyed record.\n *\n * @param value - Value to test.\n * @returns `true` when the value is a non-array object.\n * @example\n * ```ts\n * isRecord({ id: 'u1' })\n * ```\n */\nexport function isRecord(value: Record<string, unknown>): boolean\nexport function isRecord(value: unknown): value is Record<string, unknown>\nexport function isRecord(value: unknown): boolean {\n\treturn isObject(value) && !Array.isArray(value)\n}\n","import type { AnyFunction } from './types.js'\nimport { isObject } from './collections.js'\n\n/**\n * Narrow an unknown value to `null`.\n *\n * @param value - Value to test.\n * @returns `true` when the value is `null`.\n * @example\n * ```ts\n * isNull(null)\n * ```\n */\nexport function isNull(value: null): boolean\nexport function isNull(value: unknown): value is null\nexport function isNull(value: unknown): boolean {\n\treturn value === null\n}\n\n/**\n * Narrow an unknown value to `undefined`.\n *\n * @param value - Value to test.\n * @returns `true` when the value is `undefined`.\n * @example\n * ```ts\n * isUndefined(undefined)\n * ```\n */\nexport function isUndefined(value: undefined): boolean\nexport function isUndefined(value: unknown): value is undefined\nexport function isUndefined(value: unknown): boolean {\n\treturn value === undefined\n}\n\n/**\n * Narrow a value by excluding `null` and `undefined`.\n *\n * @param value - Value to test.\n * @returns `true` when the value is defined.\n * @example\n * ```ts\n * isDefined('value')\n * ```\n */\nexport function isDefined<T>(value: T): boolean\nexport function isDefined<T>(value: T | null | undefined): value is T\nexport function isDefined<T>(value: T | null | undefined): boolean {\n\treturn value !== null && value !== undefined\n}\n\n/**\n * Narrow an unknown value to `string`.\n *\n * @param value - Value to test.\n * @returns `true` when the value is a string.\n * @example\n * ```ts\n * isString('hello')\n * ```\n */\nexport function isString(value: string): boolean\nexport function isString(value: unknown): value is string\nexport function isString(value: unknown): boolean {\n\treturn typeof value === 'string'\n}\n\n/**\n * Narrow an unknown value to `number`.\n *\n * @param value - Value to test.\n * @returns `true` when the value is a number.\n * @example\n * ```ts\n * isNumber(1)\n * ```\n */\nexport function isNumber(value: number): boolean\nexport function isNumber(value: unknown): value is number\nexport function isNumber(value: unknown): boolean {\n\treturn typeof value === 'number'\n}\n\n/**\n * Narrow an unknown value to `boolean`.\n *\n * @param value - Value to test.\n * @returns `true` when the value is a boolean.\n * @example\n * ```ts\n * isBoolean(false)\n * ```\n */\nexport function isBoolean(value: boolean): boolean\nexport function isBoolean(value: unknown): value is boolean\nexport function isBoolean(value: unknown): boolean {\n\treturn typeof value === 'boolean'\n}\n\n/**\n * Narrow an unknown value to `bigint`.\n *\n * @param value - Value to test.\n * @returns `true` when the value is a bigint.\n * @example\n * ```ts\n * isBigInt(1n)\n * ```\n */\nexport function isBigInt(value: bigint): boolean\nexport function isBigInt(value: unknown): value is bigint\nexport function isBigInt(value: unknown): boolean {\n\treturn typeof value === 'bigint'\n}\n\n/**\n * Narrow an unknown value to `symbol`.\n *\n * @param value - Value to test.\n * @returns `true` when the value is a symbol.\n * @example\n * ```ts\n * isSymbol(Symbol('x'))\n * ```\n */\nexport function isSymbol(value: symbol): boolean\nexport function isSymbol(value: unknown): value is symbol\nexport function isSymbol(value: unknown): boolean {\n\treturn typeof value === 'symbol'\n}\n\n/**\n * Narrow an unknown value to a callable function.\n *\n * @param value - Value to test.\n * @returns `true` when the value is a function.\n * @example\n * ```ts\n * isFunction(() => true)\n * ```\n */\nexport function isFunction(value: AnyFunction): boolean\nexport function isFunction(value: unknown): value is AnyFunction\nexport function isFunction(value: unknown): boolean {\n\treturn typeof value === 'function'\n}\n\n/**\n * Narrow an unknown value to `Date`.\n *\n * @param value - Value to test.\n * @returns `true` when the value is a `Date`.\n * @example\n * ```ts\n * isDate(new Date())\n * ```\n */\nexport function isDate(value: Date): boolean\nexport function isDate(value: unknown): value is Date\nexport function isDate(value: unknown): boolean {\n\treturn value instanceof Date\n}\n\n/**\n * Narrow an unknown value to `RegExp`.\n *\n * @param value - Value to test.\n * @returns `true` when the value is a `RegExp`.\n * @example\n * ```ts\n * isRegExp(/a/)\n * ```\n */\nexport function isRegExp(value: RegExp): boolean\nexport function isRegExp(value: unknown): value is RegExp\nexport function isRegExp(value: unknown): boolean {\n\treturn value instanceof RegExp\n}\n\n/**\n * Narrow an unknown value to `Error`.\n *\n * @param value - Value to test.\n * @returns `true` when the value is an `Error`.\n * @example\n * ```ts\n * isError(new Error('boom'))\n * ```\n */\nexport function isError(value: Error): boolean\nexport function isError(value: unknown): value is Error\nexport function isError(value: unknown): boolean {\n\treturn value instanceof Error\n}\n\n/**\n * Narrow an unknown value to a Promise-like object.\n *\n * @param value - Value to test.\n * @returns `true` when the value exposes `then`, `catch`, and `finally` methods.\n * @example\n * ```ts\n * isPromiseLike(Promise.resolve(1))\n * ```\n */\nexport function isPromiseLike<T = unknown>(\n\tvalue: unknown,\n): value is Promise<T> | (PromiseLike<T> & { catch: unknown; finally: unknown }) {\n\tif (!isObject(value)) {\n\t\treturn false\n\t}\n\n\tconst thenValue = Reflect.get(value, 'then')\n\tconst catchValue = Reflect.get(value, 'catch')\n\tconst finallyValue = Reflect.get(value, 'finally')\n\n\treturn (\n\t\ttypeof thenValue === 'function' &&\n\t\ttypeof catchValue === 'function' &&\n\t\ttypeof finallyValue === 'function'\n\t)\n}\n\n/**\n * Narrow an unknown value to `Promise`.\n *\n * @param value - Value to test.\n * @returns `true` when the value is a native promise.\n * @example\n * ```ts\n * isPromise(Promise.resolve(1))\n * ```\n */\nexport function isPromise<T = unknown>(value: Promise<T>): boolean\nexport function isPromise<T = unknown>(value: unknown): value is Promise<T>\nexport function isPromise(value: unknown): boolean {\n\treturn value instanceof Promise\n}\n\n/**\n * Narrow an unknown value to `ArrayBuffer`.\n *\n * @param value - Value to test.\n * @returns `true` when the value is an `ArrayBuffer`.\n * @example\n * ```ts\n * isArrayBuffer(new ArrayBuffer(8))\n * ```\n */\nexport function isArrayBuffer(value: ArrayBuffer): boolean\nexport function isArrayBuffer(value: unknown): value is ArrayBuffer\nexport function isArrayBuffer(value: unknown): boolean {\n\treturn value instanceof ArrayBuffer\n}\n\n/**\n * Narrow an unknown value to `SharedArrayBuffer` when supported.\n *\n * @param value - Value to test.\n * @returns `true` when the value is a `SharedArrayBuffer`.\n * @example\n * ```ts\n * isSharedArrayBuffer(typeof SharedArrayBuffer === 'undefined' ? undefined : new SharedArrayBuffer(8))\n * ```\n */\nexport function isSharedArrayBuffer(value: SharedArrayBuffer): boolean\nexport function isSharedArrayBuffer(value: unknown): value is SharedArrayBuffer\nexport function isSharedArrayBuffer(value: unknown): boolean {\n\treturn typeof SharedArrayBuffer !== 'undefined' && value instanceof SharedArrayBuffer\n}\n\n/**\n * Narrow an unknown value to an iterable.\n *\n * @param value - Value to test.\n * @returns `true` when the value implements `Symbol.iterator`.\n * @example\n * ```ts\n * isIterable([1, 2, 3])\n * ```\n */\nexport function isIterable<T = unknown>(value: Iterable<T>): boolean\nexport function isIterable<T = unknown>(value: unknown): value is Iterable<T>\nexport function isIterable(value: unknown): boolean {\n\tif (typeof value === 'string') {\n\t\treturn true\n\t}\n\n\tif (!isObject(value)) {\n\t\treturn false\n\t}\n\n\treturn typeof Reflect.get(value, Symbol.iterator) === 'function'\n}\n\n/**\n * Narrow an unknown value to an async iterable.\n *\n * @param value - Value to test.\n * @returns `true` when the value implements `Symbol.asyncIterator`.\n * @example\n * ```ts\n * isAsyncIterator((async function* () { yield 1 })())\n * ```\n */\nexport function isAsyncIterator<T = unknown>(value: AsyncIterable<T>): boolean\nexport function isAsyncIterator<T = unknown>(value: unknown): value is AsyncIterable<T>\nexport function isAsyncIterator(value: unknown): boolean {\n\tif (!isObject(value)) {\n\t\treturn false\n\t}\n\n\treturn typeof Reflect.get(value, Symbol.asyncIterator) === 'function'\n}\n","import type {\n\tGuardsShape,\n\tValidationError,\n\tValidationResult,\n\tValidationRuleName,\n\tValidationRuleValue,\n\tValidationRules,\n\tValidatorFunction,\n} from './types.js'\nimport {\n\tALPHANUMERIC_PATTERN,\n\tEMAIL_PATTERN,\n\tINTEGER_PATTERN,\n\tNUMERIC_PATTERN,\n\tURL_PATTERN,\n\tVALIDATION_RULE_NAMES,\n} from './constants.js'\nimport { ValidatorError } from './errors.js'\nimport { isRecord } from './collections.js'\nimport { isBoolean, isString } from './primitives.js'\n/**\n * Read a property value from a record-like object.\n *\n * @param record - Object to read from.\n * @param key - Property key to resolve.\n * @returns The resolved property value.\n * @example\n * ```ts\n * recordValue({ id: 'u1' }, 'id')\n * ```\n */\nexport function recordValue(record: object, key: PropertyKey): unknown {\n\treturn Reflect.get(record, key)\n}\n/**\n * Resolve a named validation rule from a rule object.\n *\n * @param rules - Rule object to read from.\n * @param ruleName - Rule name to resolve.\n * @returns The configured rule value, or `undefined` when not configured.\n * @example\n * ```ts\n * ruleValue({ required: true }, 'required')\n * ```\n */\nexport function ruleValue(\n\trules: ValidationRules,\n\truleName: ValidationRuleName,\n): ValidationRuleValue | undefined {\n\tswitch (ruleName) {\n\t\tcase 'required':\n\t\t\treturn rules.required\n\t\tcase 'minimum':\n\t\t\treturn rules.minimum\n\t\tcase 'maximum':\n\t\t\treturn rules.maximum\n\t\tcase 'pattern':\n\t\t\treturn rules.pattern\n\t\tcase 'email':\n\t\t\treturn rules.email\n\t\tcase 'url':\n\t\t\treturn rules.url\n\t\tcase 'numeric':\n\t\t\treturn rules.numeric\n\t\tcase 'integer':\n\t\t\treturn rules.integer\n\t\tcase 'alphanumeric':\n\t\t\treturn rules.alphanumeric\n\t\tcase 'custom':\n\t\t\treturn rules.custom\n\t}\n}\n/**\n * Check whether a validation rule value is a boolean rule configuration.\n *\n * @param value - Value to test.\n * @returns `true` when the value is `undefined`, a boolean, or a validator function.\n * @example\n * ```ts\n * isBooleanRuleValue(true)\n * ```\n */\nexport function isBooleanRuleValue(value: unknown): boolean {\n\treturn value === undefined || typeof value === 'boolean' || isValidatorFunction(value)\n}\n/**\n * Check whether a validation rule value is a number rule configuration.\n *\n * @param value - Value to test.\n * @returns `true` when the value is `undefined`, a non-negative integer, or a validator function.\n * @example\n * ```ts\n * isNumberRuleValue(3)\n * ```\n */\nexport function isNumberRuleValue(value: unknown): boolean {\n\tif (value === undefined || isValidatorFunction(value)) {\n\t\treturn true\n\t}\n\treturn typeof value === 'number' && Number.isInteger(value) && value >= 0\n}\n/**\n * Check whether a validation rule value is a pattern rule configuration.\n *\n * @param value - Value to test.\n * @returns `true` when the value is `undefined`, a string pattern, or a validator function.\n * @example\n * ```ts\n * isPatternRuleValue('^a+$')\n * ```\n */\nexport function isPatternRuleValue(value: unknown): boolean {\n\treturn value === undefined || typeof value === 'string' || isValidatorFunction(value)\n}\n/**\n * Check whether a value is valid for a specific validation rule.\n *\n * @param ruleName - Rule name controlling the accepted value kind.\n * @param value - Value to test.\n * @returns `true` when the value is valid for the given rule name.\n * @example\n * ```ts\n * isRuleValue('minimum', 3)\n * ```\n */\nexport function isRuleValue(ruleName: ValidationRuleName, value: unknown): boolean {\n\tswitch (ruleName) {\n\t\tcase 'required':\n\t\tcase 'email':\n\t\tcase 'url':\n\t\tcase 'numeric':\n\t\tcase 'integer':\n\t\tcase 'alphanumeric':\n\t\t\treturn isBooleanRuleValue(value)\n\t\tcase 'minimum':\n\t\tcase 'maximum':\n\t\t\treturn isNumberRuleValue(value)\n\t\tcase 'pattern':\n\t\t\treturn isPatternRuleValue(value)\n\t\tcase 'custom':\n\t\t\treturn value === undefined || isValidatorFunction(value)\n\t}\n}\n/**\n * Count enumerable symbol keys on an object.\n *\n * @param value - Object to inspect.\n * @returns The number of enumerable symbol properties.\n * @example\n * ```ts\n * enumerableSymbolCount({ [Symbol('x')]: true })\n * ```\n */\nexport function enumerableSymbolCount(value: object): number {\n\tlet count = 0\n\tfor (const symbolKey of Object.getOwnPropertySymbols(value)) {\n\t\tconst descriptor = Object.getOwnPropertyDescriptor(value, symbolKey)\n\t\tif (descriptor?.enumerable === true) {\n\t\t\tcount += 1\n\t\t}\n\t}\n\treturn count\n}\n/**\n * Assert that a partial shape result matches a picked guard shape.\n *\n * @param value - Value to refine.\n * @param shape - Source shape.\n * @param keys - Picked keys.\n * @returns Nothing. Refines `value` for the caller.\n * @example\n * ```ts\n * const value: unknown = {}\n * ensurePickedShape(value, { id: isString }, ['id'])\n * ```\n */\nexport function ensurePickedShape<S extends GuardsShape, K extends Array<keyof S & string>>(\n\tvalue: unknown,\n\tshape: S,\n\tkeys: K,\n): asserts value is Pick<S, K[number]> {\n\tvoid value\n\tvoid shape\n\tvoid keys\n}\n/**\n * Assert that a partial shape result matches an omitted guard shape.\n *\n * @param value - Value to refine.\n * @param shape - Source shape.\n * @param keys - Omitted keys.\n * @returns Nothing. Refines `value` for the caller.\n * @example\n * ```ts\n * const value: unknown = {}\n * ensureOmittedShape(value, { id: isString }, [])\n * ```\n */\nexport function ensureOmittedShape<S extends GuardsShape, K extends Array<keyof S & string>>(\n\tvalue: unknown,\n\tshape: S,\n\tkeys: K,\n): asserts value is Omit<S, K[number]> {\n\tvoid value\n\tvoid shape\n\tvoid keys\n}\n/**\n * Narrow an unknown value to a validator callback.\n *\n * @param value - Value to test.\n * @returns `true` when the value is a validator callback.\n * @example\n * ```ts\n * isValidatorFunction((input) => input.length > 0)\n * ```\n */\nexport function isValidatorFunction(value: unknown): value is ValidatorFunction {\n\treturn typeof value === 'function'\n}\n/**\n * Narrow an unknown value to `ValidationRuleName`.\n *\n * @param value - Value to test.\n * @returns `true` when the value is a supported rule name.\n * @example\n * ```ts\n * isValidationRuleName('required')\n * ```\n */\nexport function isValidationRuleName(value: unknown): value is ValidationRuleName {\n\treturn typeof value === 'string' && VALIDATION_RULE_NAMES.some((ruleName) => ruleName === value)\n}\n/**\n * Narrow an unknown value to `ValidationRules`.\n *\n * @param value - Value to test.\n * @returns `true` when the value is a valid validation rule object.\n * @example\n * ```ts\n * isValidationRules({ required: true, minimum: 3 })\n * ```\n */\nexport function isValidationRules(value: unknown): value is ValidationRules {\n\tif (!isRecord(value)) {\n\t\treturn false\n\t}\n\tfor (const key of Object.keys(value)) {\n\t\tif (!isValidationRuleName(key)) {\n\t\t\treturn false\n\t\t}\n\t\tif (!isRuleValue(key, recordValue(value, key))) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n/**\n * Narrow an unknown value to `ValidationError`.\n *\n * @param value - Value to test.\n * @returns `true` when the value is a validation error object.\n * @example\n * ```ts\n * isValidationError({ rule: 'required', message: 'Missing' })\n * ```\n */\nexport function isValidationError(value: unknown): value is ValidationError {\n\tif (!isRecord(value)) {\n\t\treturn false\n\t}\n\treturn isValidationRuleName(recordValue(value, 'rule')) && isString(recordValue(value, 'message'))\n}\n/**\n * Narrow an unknown value to `ValidationResult`.\n *\n * @param value - Value to test.\n * @returns `true` when the value is a validation result object.\n * @example\n * ```ts\n * isValidationResult({ valid: true, errors: [] })\n * ```\n */\nexport function isValidationResult(value: unknown): value is ValidationResult {\n\tif (!isRecord(value)) {\n\t\treturn false\n\t}\n\tconst valid = recordValue(value, 'valid')\n\tconst errors = recordValue(value, 'errors')\n\tif (!isBoolean(valid) || !Array.isArray(errors)) {\n\t\treturn false\n\t}\n\tfor (const error of errors) {\n\t\tif (!isValidationError(error)) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n/**\n * Assert that a validation rule object is well-formed.\n *\n * @param rules - Rules to validate.\n * @returns Nothing. Throws when the rules are invalid.\n * @example\n * ```ts\n * assertValidationRules({ required: true })\n * ```\n */\nexport function assertValidationRules(rules: unknown): asserts rules is ValidationRules {\n\tif (!isValidationRules(rules)) {\n\t\tthrow new ValidatorError(\n\t\t\t'INVALID_RULES',\n\t\t\t'Validation rules must contain only supported rule values',\n\t\t)\n\t}\n\tconst minimum = rules.minimum\n\tif (typeof minimum === 'number' && minimum < 0) {\n\t\tthrow new ValidatorError('INVALID_RULE_VALUE', 'Minimum must be zero or greater', {\n\t\t\trule: 'minimum',\n\t\t\tvalue: minimum,\n\t\t})\n\t}\n\tconst maximum = rules.maximum\n\tif (typeof maximum === 'number' && maximum < 0) {\n\t\tthrow new ValidatorError('INVALID_RULE_VALUE', 'Maximum must be zero or greater', {\n\t\t\trule: 'maximum',\n\t\t\tvalue: maximum,\n\t\t})\n\t}\n\tif (typeof minimum === 'number' && typeof maximum === 'number' && minimum > maximum) {\n\t\tthrow new ValidatorError('INVALID_RULE_VALUE', 'Minimum cannot be greater than maximum', {\n\t\t\trule: 'minimum',\n\t\t\tvalue: minimum,\n\t\t})\n\t}\n\tconst pattern = rules.pattern\n\tif (typeof pattern === 'string') {\n\t\ttry {\n\t\t\tvoid new RegExp(pattern)\n\t\t} catch {\n\t\t\tthrow new ValidatorError('INVALID_PATTERN', 'Pattern must be a valid regular expression', {\n\t\t\t\trule: 'pattern',\n\t\t\t\tvalue: pattern,\n\t\t\t})\n\t\t}\n\t}\n}\n/**\n * Clone a validation rule object.\n *\n * @param rules - Rules to clone.\n * @returns A shallow cloned rule object.\n * @example\n * ```ts\n * const rules = cloneValidationRules({ required: true })\n * ```\n */\nexport function cloneValidationRules(rules: ValidationRules): ValidationRules {\n\tassertValidationRules(rules)\n\treturn {\n\t\t...(rules.required !== undefined ? { required: rules.required } : {}),\n\t\t...(rules.minimum !== undefined ? { minimum: rules.minimum } : {}),\n\t\t...(rules.maximum !== undefined ? { maximum: rules.maximum } : {}),\n\t\t...(rules.pattern !== undefined ? { pattern: rules.pattern } : {}),\n\t\t...(rules.email !== undefined ? { email: rules.email } : {}),\n\t\t...(rules.url !== undefined ? { url: rules.url } : {}),\n\t\t...(rules.numeric !== undefined ? { numeric: rules.numeric } : {}),\n\t\t...(rules.integer !== undefined ? { integer: rules.integer } : {}),\n\t\t...(rules.alphanumeric !== undefined ? { alphanumeric: rules.alphanumeric } : {}),\n\t\t...(rules.custom !== undefined ? { custom: rules.custom } : {}),\n\t}\n}\n/**\n * Evaluate a single validation rule against input.\n *\n * @param ruleName - Rule being evaluated.\n * @param check - Rule value to evaluate.\n * @param input - Input value to validate.\n * @returns An error message when the rule fails, otherwise `undefined`.\n * @example\n * ```ts\n * evaluateRule('required', true, '')\n * ```\n */\nexport function evaluateRule(\n\truleName: ValidationRuleName,\n\tcheck: ValidationRuleValue,\n\tinput: string,\n): string | undefined {\n\tif (typeof check === 'function') {\n\t\tconst result = check(input)\n\t\tif (result === true) {\n\t\t\treturn undefined\n\t\t}\n\t\treturn typeof result === 'string' ? result : 'Invalid input'\n\t}\n\tswitch (ruleName) {\n\t\tcase 'required':\n\t\t\tif (check === true && input.trim().length === 0) {\n\t\t\t\treturn 'This field is required'\n\t\t\t}\n\t\t\tbreak\n\t\tcase 'minimum':\n\t\t\tif (typeof check === 'number' && input.length < check) {\n\t\t\t\treturn `Must be at least ${String(check)} characters`\n\t\t\t}\n\t\t\tbreak\n\t\tcase 'maximum':\n\t\t\tif (typeof check === 'number' && input.length > check) {\n\t\t\t\treturn `Must be at most ${String(check)} characters`\n\t\t\t}\n\t\t\tbreak\n\t\tcase 'pattern':\n\t\t\tif (typeof check === 'string' && !new RegExp(check).test(input)) {\n\t\t\t\treturn `Must match pattern: ${check}`\n\t\t\t}\n\t\t\tbreak\n\t\tcase 'email':\n\t\t\tif (check === true && !EMAIL_PATTERN.test(input)) {\n\t\t\t\treturn 'Must be a valid email address'\n\t\t\t}\n\t\t\tbreak\n\t\tcase 'url':\n\t\t\tif (check === true && !URL_PATTERN.test(input)) {\n\t\t\t\treturn 'Must be a valid URL'\n\t\t\t}\n\t\t\tbreak\n\t\tcase 'numeric':\n\t\t\tif (check === true && !NUMERIC_PATTERN.test(input)) {\n\t\t\t\treturn 'Must be a numeric value'\n\t\t\t}\n\t\t\tbreak\n\t\tcase 'integer':\n\t\t\tif (check === true && !INTEGER_PATTERN.test(input)) {\n\t\t\t\treturn 'Must be an integer'\n\t\t\t}\n\t\t\tbreak\n\t\tcase 'alphanumeric':\n\t\t\tif (check === true && !ALPHANUMERIC_PATTERN.test(input)) {\n\t\t\t\treturn 'Must contain only letters and digits'\n\t\t\t}\n\t\t\tbreak\n\t\tcase 'custom':\n\t\t\tbreak\n\t}\n\treturn undefined\n}\n/**\n * Validate input against all configured validation rules.\n *\n * @param input - Input string to validate.\n * @param rules - Rules to evaluate.\n * @returns A structured validation result.\n * @example\n * ```ts\n * validateInput('', { required: true })\n * ```\n */\nexport function validateInput(input: string, rules: ValidationRules): ValidationResult {\n\tassertValidationRules(rules)\n\tconst errors: ValidationError[] = []\n\tfor (const ruleName of VALIDATION_RULE_NAMES) {\n\t\tconst check = ruleValue(rules, ruleName)\n\t\tif (check === undefined || check === false) {\n\t\t\tcontinue\n\t\t}\n\t\tconst message = evaluateRule(ruleName, check, input)\n\t\tif (message !== undefined) {\n\t\t\terrors.push({ rule: ruleName, message })\n\t\t}\n\t}\n\treturn {\n\t\tvalid: errors.length === 0,\n\t\terrors,\n\t}\n}\n/**\n * Test whether input passes all configured validation rules.\n *\n * @param input - Input string to validate.\n * @param rules - Rules to evaluate.\n * @returns `true` when the input is valid.\n * @example\n * ```ts\n * testInput('value', { required: true })\n * ```\n */\nexport function testInput(input: string, rules: ValidationRules): boolean {\n\treturn validateInput(input, rules).valid\n}\n","import type { Guard, GuardsShape, ShapeGuardResult } from './types.js'\nimport { isRecord } from './collections.js'\nimport { recordValue } from './helpers.js'\n\n/**\n * Normalize an enum-like object into its distinct public values.\n *\n * @param enumeration - Enum object or enum-like map.\n * @returns A normalized list of accepted enum values.\n * @example\n * ```ts\n * createEnumValues({ idle: 'IDLE', busy: 'BUSY' })\n * ```\n */\nexport function createEnumValues<E extends Record<string, string | number>>(\n\tenumeration: E,\n): readonly (string | number)[] {\n\tconst values: Array<string | number> = []\n\n\tfor (const key of Object.keys(enumeration)) {\n\t\tconst value = enumeration[key]\n\t\tif (typeof value === 'number') {\n\t\t\tvalues.push(value)\n\t\t\tcontinue\n\t\t}\n\n\t\tconst numericKey = Number(key)\n\t\tconst keyIsNumeric = Number.isInteger(numericKey) && String(numericKey) === key\n\t\tconst reverseValue = enumeration[value]\n\n\t\tif (!(keyIsNumeric && typeof reverseValue === 'number')) {\n\t\t\tvalues.push(value)\n\t\t}\n\t}\n\n\treturn values\n}\n\n/**\n * Build an exact shape guard from a guard shape and optional-key configuration.\n *\n * @param shape - Guard shape to apply.\n * @param optional - Optional keys, or `true` to make every key optional.\n * @returns A guard enforcing exact string keys and per-property validation.\n * @example\n * ```ts\n * const isUser = createShapeGuard({ id: isString })\n * ```\n */\nexport function createShapeGuard<\n\tS extends GuardsShape,\n\tK extends Array<keyof S & string> | true | undefined,\n>(shape: S, optional?: K): Guard<ShapeGuardResult<S, K>> {\n\tconst allowed = new Set<string>()\n\tfor (const key in shape) {\n\t\tif (Object.prototype.hasOwnProperty.call(shape, key)) {\n\t\t\tallowed.add(key)\n\t\t}\n\t}\n\n\tconst optionalSet = new Set<string>(\n\t\toptional === true\n\t\t\t? [...allowed]\n\t\t\t: Array.isArray(optional)\n\t\t\t\t? optional.map((key) => String(key))\n\t\t\t\t: [],\n\t)\n\n\treturn (value: unknown): value is ShapeGuardResult<S, K> => {\n\t\tif (!isRecord(value)) {\n\t\t\treturn false\n\t\t}\n\n\t\tfor (const key of Object.keys(value)) {\n\t\t\tif (!allowed.has(key)) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\n\t\tfor (const key in shape) {\n\t\t\tif (!Object.prototype.hasOwnProperty.call(shape, key)) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tconst present = key in value\n\t\t\tif (!optionalSet.has(key) && !present) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tif (present && !shape[key](recordValue(value, key))) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\n\t\treturn true\n\t}\n}\n","/**\n * Narrow an unknown value to an array.\n *\n * @param value - Value to test.\n * @returns `true` when the value is an array.\n * @example\n * ```ts\n * isArray([1, 2])\n * ```\n */\nexport function isArray<T = unknown>(value: readonly T[]): boolean\nexport function isArray<T = unknown>(value: unknown): value is readonly T[]\nexport function isArray(value: unknown): boolean {\n\treturn Array.isArray(value)\n}\n\n/**\n * Narrow an unknown value to `DataView`.\n *\n * @param value - Value to test.\n * @returns `true` when the value is a `DataView`.\n * @example\n * ```ts\n * isDataView(new DataView(new ArrayBuffer(8)))\n * ```\n */\nexport function isDataView(value: DataView): boolean\nexport function isDataView(value: unknown): value is DataView\nexport function isDataView(value: unknown): boolean {\n\treturn value instanceof DataView\n}\n\n/**\n * Narrow an unknown value to any `ArrayBufferView`.\n *\n * @param value - Value to test.\n * @returns `true` when the value is a typed array or `DataView`.\n * @example\n * ```ts\n * isArrayBufferView(new Uint8Array(4))\n * ```\n */\nexport function isArrayBufferView(value: ArrayBufferView): boolean\nexport function isArrayBufferView(value: unknown): value is ArrayBufferView\nexport function isArrayBufferView(value: unknown): boolean {\n\treturn ArrayBuffer.isView(value)\n}\n\n/**\n * Narrow an unknown value to `Int8Array`.\n *\n * @param value - Value to test.\n * @returns `true` when the value is an `Int8Array`.\n * @example\n * ```ts\n * isInt8Array(new Int8Array(1))\n * ```\n */\nexport function isInt8Array(value: Int8Array): boolean\nexport function isInt8Array(value: unknown): value is Int8Array\nexport function isInt8Array(value: unknown): boolean {\n\treturn value instanceof Int8Array\n}\n\n/**\n * Narrow an unknown value to `Uint8Array`.\n *\n * @param value - Value to test.\n * @returns `true` when the value is a `Uint8Array`.\n * @example\n * ```ts\n * isUint8Array(new Uint8Array(1))\n * ```\n */\nexport function isUint8Array(value: Uint8Array): boolean\nexport function isUint8Array(value: unknown): value is Uint8Array\nexport function isUint8Array(value: unknown): boolean {\n\treturn value instanceof Uint8Array\n}\n\n/**\n * Narrow an unknown value to `Uint8ClampedArray`.\n *\n * @param value - Value to test.\n * @returns `true` when the value is a `Uint8ClampedArray`.\n * @example\n * ```ts\n * isUint8ClampedArray(new Uint8ClampedArray(1))\n * ```\n */\nexport function isUint8ClampedArray(value: Uint8ClampedArray): boolean\nexport function isUint8ClampedArray(value: unknown): value is Uint8ClampedArray\nexport function isUint8ClampedArray(value: unknown): boolean {\n\treturn value instanceof Uint8ClampedArray\n}\n\n/**\n * Narrow an unknown value to `Int16Array`.\n *\n * @param value - Value to test.\n * @returns `true` when the value is an `Int16Array`.\n * @example\n * ```ts\n * isInt16Array(new Int16Array(1))\n * ```\n */\nexport function isInt16Array(value: Int16Array): boolean\nexport function isInt16Array(value: unknown): value is Int16Array\nexport function isInt16Array(value: unknown): boolean {\n\treturn value instanceof Int16Array\n}\n\n/**\n * Narrow an unknown value to `Uint16Array`.\n *\n * @param value - Value to test.\n * @returns `true` when the value is a `Uint16Array`.\n * @example\n * ```ts\n * isUint16Array(new Uint16Array(1))\n * ```\n */\nexport function isUint16Array(value: Uint16Array): boolean\nexport function isUint16Array(value: unknown): value is Uint16Array\nexport function isUint16Array(value: unknown): boolean {\n\treturn value instanceof Uint16Array\n}\n\n/**\n * Narrow an unknown value to `Int32Array`.\n *\n * @param value - Value to test.\n * @returns `true` when the value is an `Int32Array`.\n * @example\n * ```ts\n * isInt32Array(new Int32Array(1))\n * ```\n */\nexport function isInt32Array(value: Int32Array): boolean\nexport function isInt32Array(value: unknown): value is Int32Array\nexport function isInt32Array(value: unknown): boolean {\n\treturn value instanceof Int32Array\n}\n\n/**\n * Narrow an unknown value to `Uint32Array`.\n *\n * @param value - Value to test.\n * @returns `true` when the value is a `Uint32Array`.\n * @example\n * ```ts\n * isUint32Array(new Uint32Array(1))\n * ```\n */\nexport function isUint32Array(value: Uint32Array): boolean\nexport function isUint32Array(value: unknown): value is Uint32Array\nexport function isUint32Array(value: unknown): boolean {\n\treturn value instanceof Uint32Array\n}\n\n/**\n * Narrow an unknown value to `Float32Array`.\n *\n * @param value - Value to test.\n * @returns `true` when the value is a `Float32Array`.\n * @example\n * ```ts\n * isFloat32Array(new Float32Array(1))\n * ```\n */\nexport function isFloat32Array(value: Float32Array): boolean\nexport function isFloat32Array(value: unknown): value is Float32Array\nexport function isFloat32Array(value: unknown): boolean {\n\treturn value instanceof Float32Array\n}\n\n/**\n * Narrow an unknown value to `Float64Array`.\n *\n * @param value - Value to test.\n * @returns `true` when the value is a `Float64Array`.\n * @example\n * ```ts\n * isFloat64Array(new Float64Array(1))\n * ```\n */\nexport function isFloat64Array(value: Float64Array): boolean\nexport function isFloat64Array(value: unknown): value is Float64Array\nexport function isFloat64Array(value: unknown): boolean {\n\treturn value instanceof Float64Array\n}\n\n/**\n * Narrow an unknown value to `BigInt64Array` when supported.\n *\n * @param value - Value to test.\n * @returns `true` when the value is a `BigInt64Array`.\n * @example\n * ```ts\n * isBigInt64Array(typeof BigInt64Array === 'undefined' ? undefined : new BigInt64Array(1))\n * ```\n */\nexport function isBigInt64Array(value: BigInt64Array): boolean\nexport function isBigInt64Array(value: unknown): value is BigInt64Array\nexport function isBigInt64Array(value: unknown): boolean {\n\treturn typeof BigInt64Array !== 'undefined' && value instanceof BigInt64Array\n}\n\n/**\n * Narrow an unknown value to `BigUint64Array` when supported.\n *\n * @param value - Value to test.\n * @returns `true` when the value is a `BigUint64Array`.\n * @example\n * ```ts\n * isBigUint64Array(typeof BigUint64Array === 'undefined' ? undefined : new BigUint64Array(1))\n * ```\n */\nexport function isBigUint64Array(value: BigUint64Array): boolean\nexport function isBigUint64Array(value: unknown): value is BigUint64Array\nexport function isBigUint64Array(value: unknown): boolean {\n\treturn typeof BigUint64Array !== 'undefined' && value instanceof BigUint64Array\n}\n","import { enumerableSymbolCount } from './helpers.js'\nimport { isRecord } from './collections.js'\n\n/**\n * Narrow an unknown value to the empty string.\n *\n * @param value - Value to test.\n * @returns `true` when the value is `''`.\n * @example\n * ```ts\n * isEmptyString('')\n * ```\n */\nexport function isEmptyString(value: unknown): value is '' {\n\treturn value === ''\n}\n\n/**\n * Narrow an unknown value to an empty array.\n *\n * @param value - Value to test.\n * @returns `true` when the value is an empty array.\n * @example\n * ```ts\n * isEmptyArray([])\n * ```\n */\nexport function isEmptyArray(value: []): boolean\nexport function isEmptyArray(value: unknown): value is readonly []\nexport function isEmptyArray(value: unknown): boolean {\n\treturn Array.isArray(value) && value.length === 0\n}\n\n/**\n * Narrow an unknown value to an empty plain object.\n *\n * @param value - Value to test.\n * @returns `true` when the value has no enumerable string or symbol keys.\n * @example\n * ```ts\n * isEmptyObject({})\n * ```\n */\nexport function isEmptyObject(value: Record<string | symbol, never>): boolean\nexport function isEmptyObject(value: unknown): value is Record<string | symbol, never>\nexport function isEmptyObject(value: unknown): boolean {\n\tif (!isRecord(value)) {\n\t\treturn false\n\t}\n\n\treturn Object.keys(value).length === 0 && enumerableSymbolCount(value) === 0\n}\n\n/**\n * Narrow an unknown value to an empty map.\n *\n * @param value - Value to test.\n * @returns `true` when the value is a map with size `0`.\n * @example\n * ```ts\n * isEmptyMap(new Map())\n * ```\n */\nexport function isEmptyMap(value: ReadonlyMap<never, never>): boolean\nexport function isEmptyMap(value: unknown): value is ReadonlyMap<never, never>\nexport function isEmptyMap(value: unknown): boolean {\n\treturn value instanceof Map && value.size === 0\n}\n\n/**\n * Narrow an unknown value to an empty set.\n *\n * @param value - Value to test.\n * @returns `true` when the value is a set with size `0`.\n * @example\n * ```ts\n * isEmptySet(new Set())\n * ```\n */\nexport function isEmptySet(value: ReadonlySet<never>): boolean\nexport function isEmptySet(value: unknown): value is ReadonlySet<never>\nexport function isEmptySet(value: unknown): boolean {\n\treturn value instanceof Set && value.size === 0\n}\n\n/**\n * Narrow an unknown value to a non-empty string.\n *\n * @param value - Value to test.\n * @returns `true` when the value is a string with length greater than `0`.\n * @example\n * ```ts\n * isNonEmptyString('value')\n * ```\n */\nexport function isNonEmptyString(value: string): boolean\nexport function isNonEmptyString(value: unknown): value is string\nexport function isNonEmptyString(value: unknown): boolean {\n\treturn typeof value === 'string' && value.length > 0\n}\n\n/**\n * Narrow an unknown value to a non-empty array.\n *\n * @param value - Value to test.\n * @returns `true` when the value is an array with at least one item.\n * @example\n * ```ts\n * isNonEmptyArray([1])\n * ```\n */\nexport function isNonEmptyArray<T = unknown>(value: [T, ...T[]]): boolean\nexport function isNonEmptyArray<T = unknown>(value: unknown): value is readonly [T, ...T[]]\nexport function isNonEmptyArray(value: unknown): boolean {\n\treturn Array.isArray(value) && value.length > 0\n}\n\n/**\n * Narrow an unknown value to a non-empty plain object.\n *\n * @param value - Value to test.\n * @returns `true` when the value has at least one enumerable key.\n * @example\n * ```ts\n * isNonEmptyObject({ id: '1' })\n * ```\n */\nexport function isNonEmptyObject(value: Record<string | symbol, unknown>): boolean\nexport function isNonEmptyObject(value: unknown): value is Record<string | symbol, unknown>\nexport function isNonEmptyObject(value: unknown): boolean {\n\tif (!isRecord(value)) {\n\t\treturn false\n\t}\n\n\treturn Object.keys(value).length > 0 || enumerableSymbolCount(value) > 0\n}\n\n/**\n * Narrow an unknown value to a non-empty map.\n *\n * @param value - Value to test.\n * @returns `true` when the value is a map with at least one entry.\n * @example\n * ```ts\n * isNonEmptyMap(new Map([['a', 1]]))\n * ```\n */\nexport function isNonEmptyMap<K = unknown, V = unknown>(value: ReadonlyMap<K, V>): boolean\nexport function isNonEmptyMap<K = unknown, V = unknown>(value: unknown): value is ReadonlyMap<K, V>\nexport function isNonEmptyMap(value: unknown): boolean {\n\treturn value instanceof Map && value.size > 0\n}\n\n/**\n * Narrow an unknown value to a non-empty set.\n *\n * @param value - Value to test.\n * @returns `true` when the value is a set with at least one entry.\n * @example\n * ```ts\n * isNonEmptySet(new Set([1]))\n * ```\n */\nexport function isNonEmptySet<T = unknown>(value: ReadonlySet<T>): boolean\nexport function isNonEmptySet<T = unknown>(value: unknown): value is ReadonlySet<T>\nexport function isNonEmptySet(value: unknown): boolean {\n\treturn value instanceof Set && value.size > 0\n}\n","import type {\n\tAnyAsyncFunction,\n\tAnyFunction,\n\tZeroArgAsyncFunction,\n\tZeroArgFunction,\n} from './types.js'\nimport { isFunction } from './primitives.js'\n\n/**\n * Narrow a function to one with no declared parameters.\n *\n * @param value - Function to inspect.\n * @returns `true` when the function has zero declared parameters.\n * @example\n * ```ts\n * isZeroArg(() => true)\n * ```\n */\nexport function isZeroArg<F extends ZeroArgFunction>(value: F): value is F\nexport function isZeroArg(value: AnyFunction): value is ZeroArgFunction\nexport function isZeroArg(value: AnyFunction): boolean {\n\treturn value.length === 0\n}\n\n/**\n * Narrow a function to a native async function.\n *\n * @param value - Function to inspect.\n * @returns `true` when the function is a native async function.\n * @example\n * ```ts\n * isAsyncFunction(async () => true)\n * ```\n */\nexport function isAsyncFunction<F extends AnyAsyncFunction>(value: F): value is F\nexport function isAsyncFunction(value: unknown): value is AnyAsyncFunction\nexport function isAsyncFunction(value: unknown): boolean {\n\treturn isFunction(value) && value.constructor.name === 'AsyncFunction'\n}\n\n/**\n * Narrow a function to a generator function.\n *\n * @param value - Function to inspect.\n * @returns `true` when the function is a generator function.\n * @example\n * ```ts\n * isGeneratorFunction(function* () { yield 1 })\n * ```\n */\nexport function isGeneratorFunction<\n\tF extends (...args: unknown[]) => Generator<unknown, unknown, unknown>,\n>(value: F): value is F\nexport function isGeneratorFunction(\n\tvalue: unknown,\n): value is (...args: unknown[]) => Generator<unknown, unknown, unknown>\nexport function isGeneratorFunction(value: unknown): boolean {\n\treturn isFunction(value) && value.constructor.name === 'GeneratorFunction'\n}\n\n/**\n * Narrow a function to an async generator function.\n *\n * @param value - Function to inspect.\n * @returns `true` when the function is an async generator function.\n * @example\n * ```ts\n * isAsyncGeneratorFunction(async function* () { yield 1 })\n * ```\n */\nexport function isAsyncGeneratorFunction<\n\tF extends (...args: unknown[]) => AsyncGenerator<unknown, unknown, unknown>,\n>(value: F): value is F\nexport function isAsyncGeneratorFunction(\n\tvalue: unknown,\n): value is (...args: unknown[]) => AsyncGenerator<unknown, unknown, unknown>\nexport function isAsyncGeneratorFunction(value: unknown): boolean {\n\treturn isFunction(value) && value.constructor.name === 'AsyncGeneratorFunction'\n}\n\n/**\n * Narrow a function to a zero-argument async function.\n *\n * @param value - Function to inspect.\n * @returns `true` when the function is async and has no declared parameters.\n * @example\n * ```ts\n * isZeroArgAsync(async () => true)\n * ```\n */\nexport function isZeroArgAsync<F extends ZeroArgAsyncFunction>(value: F): value is F\nexport function isZeroArgAsync(value: unknown): value is ZeroArgAsyncFunction\nexport function isZeroArgAsync(value: unknown): boolean {\n\treturn isFunction(value) && isZeroArg(value) && isAsyncFunction(value)\n}\n\n/**\n * Narrow a function to a zero-argument generator function.\n *\n * @param value - Function to inspect.\n * @returns `true` when the function is a generator with no declared parameters.\n * @example\n * ```ts\n * isZeroArgGenerator(function* () { yield 1 })\n * ```\n */\nexport function isZeroArgGenerator<\n\tF extends (...args: unknown[]) => Generator<unknown, unknown, unknown>,\n>(value: F): value is F\nexport function isZeroArgGenerator(\n\tvalue: unknown,\n): value is () => Generator<unknown, unknown, unknown>\nexport function isZeroArgGenerator(value: unknown): boolean {\n\treturn isFunction(value) && isZeroArg(value) && isGeneratorFunction(value)\n}\n\n/**\n * Narrow a function to a zero-argument async generator function.\n *\n * @param value - Function to inspect.\n * @returns `true` when the function is an async generator with no declared parameters.\n * @example\n * ```ts\n * isZeroArgAsyncGenerator(async function* () { yield 1 })\n * ```\n */\nexport function isZeroArgAsyncGenerator<\n\tF extends (...args: unknown[]) => AsyncGenerator<unknown, unknown, unknown>,\n>(value: F): value is F\nexport function isZeroArgAsyncGenerator(\n\tvalue: unknown,\n): value is () => AsyncGenerator<unknown, unknown, unknown>\nexport function isZeroArgAsyncGenerator(value: unknown): boolean {\n\treturn isFunction(value) && isZeroArg(value) && isAsyncGeneratorFunction(value)\n}\n","import type {\n\tAnyConstructor,\n\tGuard,\n\tGuardType,\n\tGuardsShape,\n\tIntersectionFromGuards,\n\tShapeGuardResult,\n\tTupleFromGuards,\n} from './types.js'\nimport { createEnumValues, createShapeGuard } from './factories.js'\nimport { isArray } from './arrays.js'\nimport { isMap, isObject, isSet } from './collections.js'\nimport { ensureOmittedShape, ensurePickedShape } from './helpers.js'\nimport { isIterable, isNumber, isString, isSymbol } from './primitives.js'\n\n/**\n * Build an array guard from an element guard or predicate.\n *\n * @param elementGuard - Guard or predicate for each array element.\n * @returns A guard for arrays whose values all satisfy the provided guard.\n * @example\n * ```ts\n * const isStrings = arrayOf(isString)\n * ```\n */\nexport function arrayOf<T>(elementGuard: Guard<T>): Guard<readonly T[]>\nexport function arrayOf(elementGuard: (value: unknown) => boolean): Guard<readonly unknown[]>\nexport function arrayOf(elementGuard: (value: unknown) => boolean): Guard<readonly unknown[]> {\n\treturn (value: unknown): value is readonly unknown[] =>\n\t\tisArray(value) && value.every(elementGuard)\n}\n\n/**\n * Build a fixed-length tuple guard from per-index guards.\n *\n * @param guards - Guards applied by tuple index.\n * @returns A guard for a tuple that matches the provided index guards.\n * @example\n * ```ts\n * const isPair = tupleOf(isString, isNumber)\n * ```\n */\nexport function tupleOf<const Gs extends Array<Guard<unknown>>>(\n\t...guards: Gs\n): Guard<TupleFromGuards<Gs>>\nexport function tupleOf(...guards: Array<(value: unknown) => boolean>): Guard<readonly unknown[]>\nexport function tupleOf(...guards: Array<(value: unknown) => boolean>): Guard<readonly unknown[]> {\n\treturn (value: unknown): value is readonly unknown[] => {\n\t\tif (!Array.isArray(value) || value.length !== guards.length) {\n\t\t\treturn false\n\t\t}\n\n\t\tfor (let index = 0; index < guards.length; index += 1) {\n\t\t\tconst guard = guards[index]\n\t\t\tif (!guard(value[index])) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\n\t\treturn true\n\t}\n}\n\n/**\n * Build an exact object guard from a guard shape.\n *\n * @param shape - Guards per property.\n * @param optional - Optional keys, or `true` to make every key optional.\n * @returns A guard for an exact object matching the provided shape.\n * @example\n * ```ts\n * const isUser = objectOf({ id: isString, age: isNumber })\n * ```\n */\nexport function objectOf<S extends GuardsShape>(shape: S): Guard<ShapeGuardResult<S, undefined>>\nexport function objectOf<S extends GuardsShape, const K extends Array<keyof S & string>>(\n\tshape: S,\n\toptional: K,\n): Guard<ShapeGuardResult<S, K>>\nexport function objectOf<S extends GuardsShape>(\n\tshape: S,\n\toptional: true,\n): Guard<ShapeGuardResult<S, true>>\nexport function objectOf<\n\tS extends GuardsShape,\n\tK extends Array<keyof S & string> | true | undefined,\n>(shape: S, optional?: K): Guard<ShapeGuardResult<S, K>> {\n\treturn createShapeGuard(shape, optional)\n}\n\n/**\n * Create a guard that accepts one of the provided literal values.\n *\n * @param literals - Literal values to accept.\n * @returns A guard for the provided literal union.\n * @example\n * ```ts\n * const isRole = literalOf('user', 'admin')\n * ```\n */\nexport function literalOf<const Literals extends Array<string | number | boolean>>(\n\t...literals: Literals\n): Guard<Literals[number]> {\n\treturn (value: unknown): value is Literals[number] =>\n\t\tliterals.some((literal) => Object.is(literal, value))\n}\n\n/**\n * Create a guard using `instanceof`.\n *\n * @param constructor - Constructor used for the `instanceof` check.\n * @returns A guard that narrows to instances of the provided constructor.\n * @example\n * ```ts\n * const isDateInstance = instanceOf(Date)\n * ```\n */\nexport function instanceOf<C extends AnyConstructor>(constructor: C): Guard<InstanceType<C>> {\n\treturn (value: unknown): value is InstanceType<C> =>\n\t\tisObject(value) && value instanceof constructor\n}\n\n/**\n * Create a guard from an enum-like object.\n *\n * @param enumeration - Enum object or enum-like map.\n * @returns A guard that accepts enum values.\n * @example\n * ```ts\n * const isStatus = enumOf({ ok: 'OK', fail: 'FAIL' })\n * ```\n */\nexport function enumOf<E extends Record<string, string | number>>(\n\tenumeration: E,\n): Guard<E[keyof E]> {\n\tconst values = createEnumValues(enumeration)\n\n\treturn (value: unknown): value is E[keyof E] => {\n\t\tif (!isString(value) && !isNumber(value)) {\n\t\t\treturn false\n\t\t}\n\n\t\tfor (const enumValue of values) {\n\t\t\tif (Object.is(enumValue, value)) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\n\t\treturn false\n\t}\n}\n\n/**\n * Build a Set guard from an element guard or predicate.\n *\n * @param elementGuard - Guard or predicate for each set element.\n * @returns A guard for sets whose elements all satisfy the provided guard.\n * @example\n * ```ts\n * const isNumberSet = setOf(isNumber)\n * ```\n */\nexport function setOf<T>(elementGuard: Guard<T>): Guard<ReadonlySet<T>>\nexport function setOf(elementGuard: (value: unknown) => boolean): Guard<ReadonlySet<unknown>>\nexport function setOf(elementGuard: (value: unknown) => boolean): Guard<ReadonlySet<unknown>> {\n\treturn (value: unknown): value is ReadonlySet<unknown> => {\n\t\tif (!isSet(value)) {\n\t\t\treturn false\n\t\t}\n\n\t\tfor (const entry of value) {\n\t\t\tif (!elementGuard(entry)) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\n\t\treturn true\n\t}\n}\n\n/**\n * Build a Map guard from key and value guards.\n *\n * @param keyGuard - Guard or predicate for each key.\n * @param valueGuard - Guard or predicate for each value.\n * @returns A guard for maps whose keys and values satisfy the provided guards.\n * @example\n * ```ts\n * const isScores = mapOf(isString, isNumber)\n * ```\n */\nexport function mapOf<K, V>(keyGuard: Guard<K>, valueGuard: Guard<V>): Guard<ReadonlyMap<K, V>>\nexport function mapOf(\n\tkeyGuard: (value: unknown) => boolean,\n\tvalueGuard: (value: unknown) => boolean,\n): Guard<ReadonlyMap<unknown, unknown>>\nexport function mapOf(\n\tkeyGuard: (value: unknown) => boolean,\n\tvalueGuard: (value: unknown) => boolean,\n): Guard<ReadonlyMap<unknown, unknown>> {\n\treturn (value: unknown): value is ReadonlyMap<unknown, unknown> => {\n\t\tif (!isMap(value)) {\n\t\t\treturn false\n\t\t}\n\n\t\tfor (const [key, entryValue] of value) {\n\t\t\tif (!keyGuard(key) || !valueGuard(entryValue)) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\n\t\treturn true\n\t}\n}\n\n/**\n * Build an exact record guard from a guard shape.\n *\n * @param shape - Guards per property.\n * @param optional - Optional keys, or `true` to make every key optional.\n * @returns A guard for an exact record matching the provided shape.\n * @example\n * ```ts\n * const isUser = recordOf({ id: isString, age: isNumber })\n * ```\n */\nexport function recordOf<S extends GuardsShape>(shape: S): Guard<ShapeGuardResult<S, undefined>>\nexport function recordOf<S extends GuardsShape, const K extends Array<keyof S & string>>(\n\tshape: S,\n\toptional: K,\n): Guard<ShapeGuardResult<S, K>>\nexport function recordOf<S extends GuardsShape>(\n\tshape: S,\n\toptional: true,\n): Guard<ShapeGuardResult<S, true>>\nexport function recordOf<\n\tS extends GuardsShape,\n\tK extends Array<keyof S & string> | true | undefined,\n>(shape: S, optional?: K): Guard<ShapeGuardResult<S, K>> {\n\treturn createShapeGuard(shape, optional)\n}\n\n/**\n * Build an iterable guard from an element guard or predicate.\n *\n * @param elementGuard - Guard or predicate applied to each iterated value.\n * @returns A guard for iterables whose yielded values satisfy the provided guard.\n * @example\n * ```ts\n * const isNumbers = iterableOf(isNumber)\n * ```\n */\nexport function iterableOf<T>(elementGuard: Guard<T>): Guard<Iterable<T>>\nexport function iterableOf(elementGuard: (value: unknown) => boolean): Guard<Iterable<unknown>>\nexport function iterableOf(elementGuard: (value: unknown) => boolean): Guard<Iterable<unknown>> {\n\treturn (value: unknown): value is Iterable<unknown> => {\n\t\tif (!isIterable(value)) {\n\t\t\treturn false\n\t\t}\n\n\t\tfor (const entry of value) {\n\t\t\tif (!elementGuard(entry)) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\n\t\treturn true\n\t}\n}\n\n/**\n * Create a guard for keys of the provided object.\n *\n * @param value - Object whose keys form the allowed key set.\n * @returns A guard that accepts keys present on the provided object.\n * @example\n * ```ts\n * const isKey = keyOf({ id: 1, name: 2 })\n * ```\n */\nexport function keyOf<const O extends Readonly<Record<PropertyKey, unknown>>>(\n\tvalue: O,\n): Guard<keyof O> {\n\treturn (entry: unknown): entry is keyof O =>\n\t\t(isString(entry) || isSymbol(entry) || isNumber(entry)) && entry in value\n}\n\n/**\n * Build a new guard shape by picking specific keys.\n *\n * @param shape - Source shape.\n * @param keys - Keys to keep.\n * @returns A new shape containing only the selected keys.\n * @example\n * ```ts\n * const picked = pickOf({ id: isString, age: isNumber }, ['id'])\n * ```\n */\nexport function pickOf<S extends GuardsShape, const K extends Array<keyof S & string>>(\n\tshape: S,\n\tkeys: K,\n): Pick<S, K[number]> {\n\tconst result: Partial<Record<keyof S & string, Guard<unknown>>> = {}\n\n\tfor (const key of keys) {\n\t\tif (Object.prototype.hasOwnProperty.call(shape, key)) {\n\t\t\tresult[key] = shape[key]\n\t\t}\n\t}\n\n\tensurePickedShape(result, shape, keys)\n\n\treturn result\n}\n\n/**\n * Build a new guard shape by omitting specific keys.\n *\n * @param shape - Source shape.\n * @param keys - Keys to remove.\n * @returns A new shape without the omitted keys.\n * @example\n * ```ts\n * const omitted = omitOf({ id: isString, age: isNumber }, ['age'])\n * ```\n */\nexport function omitOf<S extends GuardsShape, const K extends Array<keyof S & string>>(\n\tshape: S,\n\tkeys: K,\n): Omit<S, K[number]> {\n\tconst skipped = new Set<PropertyKey>()\n\tfor (const key of keys) {\n\t\tskipped.add(key)\n\t}\n\n\tconst result: Partial<Record<keyof S & string, Guard<unknown>>> = {}\n\tfor (const key in shape) {\n\t\tif (!Object.prototype.hasOwnProperty.call(shape, key)) {\n\t\t\tcontinue\n\t\t}\n\n\t\tif (!skipped.has(key)) {\n\t\t\tresult[key] = shape[key]\n\t\t}\n\t}\n\n\tensureOmittedShape(result, shape, keys)\n\n\treturn result\n}\n\n/**\n * Combine two guards or predicates with logical AND.\n *\n * @param left - First guard or predicate.\n * @param right - Second guard or predicate.\n * @returns A guard that requires both inputs to pass.\n * @example\n * ```ts\n * const isNonEmptyString = andOf(isString, (value: string) => value.length > 0)\n * ```\n */\nexport function andOf<A, B>(left: Guard<A>, right: Guard<B>): Guard<A & B>\nexport function andOf<T, U extends T>(left: Guard<T>, right: (value: T) => value is U): Guard<U>\nexport function andOf<T>(left: Guard<T>, right: (value: T) => boolean): Guard<T>\nexport function andOf(\n\tleft: (value: unknown) => boolean,\n\tright: (value: unknown) => boolean,\n): Guard<unknown>\nexport function andOf(\n\tleft: (value: unknown) => boolean,\n\tright: (value: unknown) => boolean,\n): Guard<unknown> {\n\treturn (value: unknown): value is unknown => left(value) && right(value)\n}\n\n/**\n * Combine two guards or predicates with logical OR.\n *\n * @param left - First guard or predicate.\n * @param right - Second guard or predicate.\n * @returns A guard that accepts values from either side.\n * @example\n * ```ts\n * const isLetter = orOf(literalOf('a'), literalOf('b'))\n * ```\n */\nexport function orOf<A, B>(left: Guard<A>, right: Guard<B>): Guard<A | B>\nexport function orOf(\n\tleft: (value: unknown) => boolean,\n\tright: (value: unknown) => boolean,\n): Guard<unknown>\nexport function orOf(\n\tleft: (value: unknown) => boolean,\n\tright: (value: unknown) => boolean,\n): Guard<unknown> {\n\treturn (value: unknown): value is unknown => left(value) || right(value)\n}\n\n/**\n * Negate a guard or predicate.\n *\n * @param guard - Guard or predicate to negate.\n * @returns A guard that passes when the provided guard fails.\n * @example\n * ```ts\n * const isNotString = notOf(isString)\n * ```\n */\nexport function notOf(guard: (value: unknown) => boolean): Guard<unknown> {\n\treturn (value: unknown): value is unknown => !guard(value)\n}\n\n/**\n * Exclude a narrower guard from a broader one.\n *\n * @param base - Base guard describing the larger set.\n * @param excluded - Guard describing the subset to exclude.\n * @returns A guard that accepts the base type minus the excluded subset.\n * @example\n * ```ts\n * const isNonEmpty = complementOf(isString, (value: string): value is '' => value === '')\n * ```\n */\nexport function complementOf<TBase, TExcluded extends TBase>(\n\tbase: Guard<TBase>,\n\texcluded: Guard<TExcluded> | ((value: TBase) => value is TExcluded),\n): Guard<Exclude<TBase, TExcluded>> {\n\treturn (value: unknown): value is Exclude<TBase, TExcluded> => {\n\t\tif (!base(value)) {\n\t\t\treturn false\n\t\t}\n\n\t\treturn !excluded(value)\n\t}\n}\n\n/**\n * Create a union guard from multiple guards or predicates.\n *\n * @param guards - Guards or predicates to union.\n * @returns A guard that accepts any value matching one of the inputs.\n * @example\n * ```ts\n * const isRole = unionOf(literalOf('user'), literalOf('admin'))\n * ```\n */\nexport function unionOf<const Gs extends Array<Guard<unknown>>>(\n\t...guards: Gs\n): Guard<GuardType<Gs[number]>>\nexport function unionOf(...guards: Array<(value: unknown) => boolean>): Guard<unknown>\nexport function unionOf(...guards: Array<(value: unknown) => boolean>): Guard<unknown> {\n\treturn (value: unknown): value is unknown => guards.some((guard) => guard(value))\n}\n\n/**\n * Create an intersection guard from multiple guards or predicates.\n *\n * @param guards - Guards or predicates to intersect.\n * @returns A guard that requires every input guard to pass.\n * @example\n * ```ts\n * const isShortString = intersectionOf(isString, (value): value is string => isString(value) && value.length < 5)\n * ```\n */\nexport function intersectionOf<const Gs extends Array<Guard<unknown>>>(\n\t...guards: Gs\n): Guard<IntersectionFromGuards<Gs>>\nexport function intersectionOf(...guards: Array<(value: unknown) => boolean>): Guard<unknown>\nexport function intersectionOf(...guards: Array<(value: unknown) => boolean>): Guard<unknown> {\n\treturn (value: unknown): value is unknown => guards.every((guard) => guard(value))\n}\n\n/**\n * Compose multiple guards through logical AND.\n *\n * @param guards - Guards or predicates to compose.\n * @returns A guard that passes only when every input guard passes.\n * @example\n * ```ts\n * const isAlphaTwo = composedOf(\n * (value): value is string => isString(value) && /^[A-Za-z]+$/.test(value),\n * (value): value is string => isString(value) && value.length === 2,\n * )\n * ```\n */\nexport function composedOf<const Gs extends Array<Guard<unknown>>>(\n\t...guards: Gs\n): Guard<IntersectionFromGuards<Gs>>\nexport function composedOf(...guards: Array<(value: unknown) => boolean>): Guard<unknown>\nexport function composedOf(...guards: Array<(value: unknown) => boolean>): Guard<unknown> {\n\treturn (value: unknown): value is unknown => guards.every((guard) => guard(value))\n}\n\n/**\n * Refine a base guard with an additional predicate.\n *\n * @param base - Base guard checked first.\n * @param predicate - Predicate evaluated after the base guard succeeds.\n * @returns A guard preserving the base type while enforcing the predicate.\n * @example\n * ```ts\n * const isNonEmptyString = whereOf(isString, (value) => value.length > 0)\n * ```\n */\nexport function whereOf<T>(base: Guard<T>, predicate: (value: T) => boolean): Guard<T>\nexport function whereOf<T, U extends T>(\n\tbase: Guard<T>,\n\tpredicate: (value: T) => value is U,\n): Guard<U>\nexport function whereOf<T>(base: Guard<T>, predicate: (value: T) => boolean): Guard<T> {\n\treturn (value: unknown): value is T => {\n\t\tif (!base(value)) {\n\t\t\treturn false\n\t\t}\n\n\t\treturn predicate(value)\n\t}\n}\n\n/**\n * Defer guard creation until runtime.\n *\n * @param thunk - Function that returns the real guard.\n * @returns A lazily resolved guard.\n * @example\n * ```ts\n * const isTree = lazyOf(() => objectOf({ value: isNumber }))\n * ```\n */\nexport function lazyOf<T>(thunk: () => Guard<T>): Guard<T> {\n\treturn (value: unknown): value is T => thunk()(value)\n}\n\n/**\n * Validate a projected value after a base guard passes.\n *\n * @param base - Base guard checked first.\n * @param project - Projection applied after the base guard succeeds.\n * @param target - Guard or predicate evaluated against the projected value.\n * @returns A guard that validates the original input through the projected value.\n * @example\n * ```ts\n * const hasLength = transformOf(isString, (value) => value.length, (value): value is number => typeof value === 'number' && value > 0)\n * ```\n */\nexport function transformOf<T, U>(\n\tbase: Guard<T>,\n\tproject: (value: T) => U,\n\ttarget: Guard<U>,\n): Guard<T>\nexport function transformOf<T>(\n\tbase: Guard<T>,\n\tproject: (value: T) => unknown,\n\ttarget: (value: unknown) => boolean,\n): Guard<T>\nexport function transformOf<T>(\n\tbase: Guard<T>,\n\tproject: (value: T) => unknown,\n\ttarget: (value: unknown) => boolean,\n): Guard<T> {\n\treturn (value: unknown): value is T => {\n\t\tif (!base(value)) {\n\t\t\treturn false\n\t\t}\n\n\t\treturn target(project(value))\n\t}\n}\n\n/**\n * Extend a guard to also allow `null`.\n *\n * @param guard - Base guard.\n * @returns A guard that accepts `null` or values passing the base guard.\n * @example\n * ```ts\n * const isNullableString = nullableOf(isString)\n * ```\n */\nexport function nullableOf<T>(guard: Guard<T>): Guard<T | null> {\n\treturn (value: unknown): value is T | null => value === null || guard(value)\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,219 @@
1
+ import type { AnyFunction } from './types.js';
2
+ /**
3
+ * Narrow an unknown value to `null`.
4
+ *
5
+ * @param value - Value to test.
6
+ * @returns `true` when the value is `null`.
7
+ * @example
8
+ * ```ts
9
+ * isNull(null)
10
+ * ```
11
+ */
12
+ export declare function isNull(value: null): boolean;
13
+ export declare function isNull(value: unknown): value is null;
14
+ /**
15
+ * Narrow an unknown value to `undefined`.
16
+ *
17
+ * @param value - Value to test.
18
+ * @returns `true` when the value is `undefined`.
19
+ * @example
20
+ * ```ts
21
+ * isUndefined(undefined)
22
+ * ```
23
+ */
24
+ export declare function isUndefined(value: undefined): boolean;
25
+ export declare function isUndefined(value: unknown): value is undefined;
26
+ /**
27
+ * Narrow a value by excluding `null` and `undefined`.
28
+ *
29
+ * @param value - Value to test.
30
+ * @returns `true` when the value is defined.
31
+ * @example
32
+ * ```ts
33
+ * isDefined('value')
34
+ * ```
35
+ */
36
+ export declare function isDefined<T>(value: T): boolean;
37
+ export declare function isDefined<T>(value: T | null | undefined): value is T;
38
+ /**
39
+ * Narrow an unknown value to `string`.
40
+ *
41
+ * @param value - Value to test.
42
+ * @returns `true` when the value is a string.
43
+ * @example
44
+ * ```ts
45
+ * isString('hello')
46
+ * ```
47
+ */
48
+ export declare function isString(value: string): boolean;
49
+ export declare function isString(value: unknown): value is string;
50
+ /**
51
+ * Narrow an unknown value to `number`.
52
+ *
53
+ * @param value - Value to test.
54
+ * @returns `true` when the value is a number.
55
+ * @example
56
+ * ```ts
57
+ * isNumber(1)
58
+ * ```
59
+ */
60
+ export declare function isNumber(value: number): boolean;
61
+ export declare function isNumber(value: unknown): value is number;
62
+ /**
63
+ * Narrow an unknown value to `boolean`.
64
+ *
65
+ * @param value - Value to test.
66
+ * @returns `true` when the value is a boolean.
67
+ * @example
68
+ * ```ts
69
+ * isBoolean(false)
70
+ * ```
71
+ */
72
+ export declare function isBoolean(value: boolean): boolean;
73
+ export declare function isBoolean(value: unknown): value is boolean;
74
+ /**
75
+ * Narrow an unknown value to `bigint`.
76
+ *
77
+ * @param value - Value to test.
78
+ * @returns `true` when the value is a bigint.
79
+ * @example
80
+ * ```ts
81
+ * isBigInt(1n)
82
+ * ```
83
+ */
84
+ export declare function isBigInt(value: bigint): boolean;
85
+ export declare function isBigInt(value: unknown): value is bigint;
86
+ /**
87
+ * Narrow an unknown value to `symbol`.
88
+ *
89
+ * @param value - Value to test.
90
+ * @returns `true` when the value is a symbol.
91
+ * @example
92
+ * ```ts
93
+ * isSymbol(Symbol('x'))
94
+ * ```
95
+ */
96
+ export declare function isSymbol(value: symbol): boolean;
97
+ export declare function isSymbol(value: unknown): value is symbol;
98
+ /**
99
+ * Narrow an unknown value to a callable function.
100
+ *
101
+ * @param value - Value to test.
102
+ * @returns `true` when the value is a function.
103
+ * @example
104
+ * ```ts
105
+ * isFunction(() => true)
106
+ * ```
107
+ */
108
+ export declare function isFunction(value: AnyFunction): boolean;
109
+ export declare function isFunction(value: unknown): value is AnyFunction;
110
+ /**
111
+ * Narrow an unknown value to `Date`.
112
+ *
113
+ * @param value - Value to test.
114
+ * @returns `true` when the value is a `Date`.
115
+ * @example
116
+ * ```ts
117
+ * isDate(new Date())
118
+ * ```
119
+ */
120
+ export declare function isDate(value: Date): boolean;
121
+ export declare function isDate(value: unknown): value is Date;
122
+ /**
123
+ * Narrow an unknown value to `RegExp`.
124
+ *
125
+ * @param value - Value to test.
126
+ * @returns `true` when the value is a `RegExp`.
127
+ * @example
128
+ * ```ts
129
+ * isRegExp(/a/)
130
+ * ```
131
+ */
132
+ export declare function isRegExp(value: RegExp): boolean;
133
+ export declare function isRegExp(value: unknown): value is RegExp;
134
+ /**
135
+ * Narrow an unknown value to `Error`.
136
+ *
137
+ * @param value - Value to test.
138
+ * @returns `true` when the value is an `Error`.
139
+ * @example
140
+ * ```ts
141
+ * isError(new Error('boom'))
142
+ * ```
143
+ */
144
+ export declare function isError(value: Error): boolean;
145
+ export declare function isError(value: unknown): value is Error;
146
+ /**
147
+ * Narrow an unknown value to a Promise-like object.
148
+ *
149
+ * @param value - Value to test.
150
+ * @returns `true` when the value exposes `then`, `catch`, and `finally` methods.
151
+ * @example
152
+ * ```ts
153
+ * isPromiseLike(Promise.resolve(1))
154
+ * ```
155
+ */
156
+ export declare function isPromiseLike<T = unknown>(value: unknown): value is Promise<T> | (PromiseLike<T> & {
157
+ catch: unknown;
158
+ finally: unknown;
159
+ });
160
+ /**
161
+ * Narrow an unknown value to `Promise`.
162
+ *
163
+ * @param value - Value to test.
164
+ * @returns `true` when the value is a native promise.
165
+ * @example
166
+ * ```ts
167
+ * isPromise(Promise.resolve(1))
168
+ * ```
169
+ */
170
+ export declare function isPromise<T = unknown>(value: Promise<T>): boolean;
171
+ export declare function isPromise<T = unknown>(value: unknown): value is Promise<T>;
172
+ /**
173
+ * Narrow an unknown value to `ArrayBuffer`.
174
+ *
175
+ * @param value - Value to test.
176
+ * @returns `true` when the value is an `ArrayBuffer`.
177
+ * @example
178
+ * ```ts
179
+ * isArrayBuffer(new ArrayBuffer(8))
180
+ * ```
181
+ */
182
+ export declare function isArrayBuffer(value: ArrayBuffer): boolean;
183
+ export declare function isArrayBuffer(value: unknown): value is ArrayBuffer;
184
+ /**
185
+ * Narrow an unknown value to `SharedArrayBuffer` when supported.
186
+ *
187
+ * @param value - Value to test.
188
+ * @returns `true` when the value is a `SharedArrayBuffer`.
189
+ * @example
190
+ * ```ts
191
+ * isSharedArrayBuffer(typeof SharedArrayBuffer === 'undefined' ? undefined : new SharedArrayBuffer(8))
192
+ * ```
193
+ */
194
+ export declare function isSharedArrayBuffer(value: SharedArrayBuffer): boolean;
195
+ export declare function isSharedArrayBuffer(value: unknown): value is SharedArrayBuffer;
196
+ /**
197
+ * Narrow an unknown value to an iterable.
198
+ *
199
+ * @param value - Value to test.
200
+ * @returns `true` when the value implements `Symbol.iterator`.
201
+ * @example
202
+ * ```ts
203
+ * isIterable([1, 2, 3])
204
+ * ```
205
+ */
206
+ export declare function isIterable<T = unknown>(value: Iterable<T>): boolean;
207
+ export declare function isIterable<T = unknown>(value: unknown): value is Iterable<T>;
208
+ /**
209
+ * Narrow an unknown value to an async iterable.
210
+ *
211
+ * @param value - Value to test.
212
+ * @returns `true` when the value implements `Symbol.asyncIterator`.
213
+ * @example
214
+ * ```ts
215
+ * isAsyncIterator((async function* () { yield 1 })())
216
+ * ```
217
+ */
218
+ export declare function isAsyncIterator<T = unknown>(value: AsyncIterable<T>): boolean;
219
+ export declare function isAsyncIterator<T = unknown>(value: unknown): value is AsyncIterable<T>;
@@ -0,0 +1,256 @@
1
+ /**
2
+ * Supported validation rule names.
3
+ *
4
+ * @example
5
+ * ```ts
6
+ * const rule: ValidationRuleName = 'required'
7
+ * ```
8
+ */
9
+ export type ValidationRuleName = 'required' | 'minimum' | 'maximum' | 'pattern' | 'email' | 'url' | 'numeric' | 'integer' | 'alphanumeric' | 'custom';
10
+ /**
11
+ * Return value from a validator callback.
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * const result: ValidatorFunctionResult = true
16
+ * ```
17
+ */
18
+ export type ValidatorFunctionResult = boolean | string;
19
+ /**
20
+ * Programmatic validator callback.
21
+ *
22
+ * @param input - Input value to validate.
23
+ * @returns `true` when valid, or an error message when invalid.
24
+ * @example
25
+ * ```ts
26
+ * const validator: ValidatorFunction = (input) => input.length >= 3 || 'Too short'
27
+ * ```
28
+ */
29
+ export type ValidatorFunction = (input: string) => ValidatorFunctionResult;
30
+ /**
31
+ * Rule value accepted by the rule evaluator.
32
+ *
33
+ * @example
34
+ * ```ts
35
+ * const value: ValidationRuleValue = 3
36
+ * ```
37
+ */
38
+ export type ValidationRuleValue = boolean | number | string | ValidatorFunction;
39
+ /**
40
+ * Declarative validation rules for string input.
41
+ *
42
+ * @example
43
+ * ```ts
44
+ * const rules: ValidationRules = {
45
+ * required: true,
46
+ * minimum: 3,
47
+ * maximum: 50,
48
+ * }
49
+ * ```
50
+ */
51
+ export interface ValidationRules {
52
+ readonly required?: boolean | ValidatorFunction;
53
+ readonly minimum?: number | ValidatorFunction;
54
+ readonly maximum?: number | ValidatorFunction;
55
+ readonly pattern?: string | ValidatorFunction;
56
+ readonly email?: boolean | ValidatorFunction;
57
+ readonly url?: boolean | ValidatorFunction;
58
+ readonly numeric?: boolean | ValidatorFunction;
59
+ readonly integer?: boolean | ValidatorFunction;
60
+ readonly alphanumeric?: boolean | ValidatorFunction;
61
+ readonly custom?: ValidatorFunction;
62
+ }
63
+ /**
64
+ * A single validation failure.
65
+ *
66
+ * @example
67
+ * ```ts
68
+ * const error: ValidationError = {
69
+ * rule: 'required',
70
+ * message: 'This field is required',
71
+ * }
72
+ * ```
73
+ */
74
+ export interface ValidationError {
75
+ readonly rule: ValidationRuleName;
76
+ readonly message: string;
77
+ }
78
+ /**
79
+ * Result of validating input against a rule set.
80
+ *
81
+ * @example
82
+ * ```ts
83
+ * const result: ValidationResult = {
84
+ * valid: false,
85
+ * errors: [{ rule: 'required', message: 'This field is required' }],
86
+ * }
87
+ * ```
88
+ */
89
+ export interface ValidationResult {
90
+ readonly valid: boolean;
91
+ readonly errors: readonly ValidationError[];
92
+ }
93
+ /**
94
+ * Machine-readable validator error code.
95
+ *
96
+ * @example
97
+ * ```ts
98
+ * const code: ValidatorErrorCode = 'INVALID_PATTERN'
99
+ * ```
100
+ */
101
+ export type ValidatorErrorCode = 'INVALID_RULES' | 'INVALID_RULE_VALUE' | 'INVALID_PATTERN';
102
+ /**
103
+ * Extra metadata attached to a `ValidatorError`.
104
+ *
105
+ * @example
106
+ * ```ts
107
+ * const context: ValidatorErrorContext = { rule: 'pattern', value: '[' }
108
+ * ```
109
+ */
110
+ export interface ValidatorErrorContext {
111
+ readonly rule?: ValidationRuleName;
112
+ readonly value?: unknown;
113
+ }
114
+ /**
115
+ * Runtime type guard that narrows unknown values.
116
+ *
117
+ * @example
118
+ * ```ts
119
+ * const isStringGuard: Guard<string> = (value): value is string => typeof value === 'string'
120
+ * ```
121
+ */
122
+ export type Guard<T> = (value: unknown) => value is T;
123
+ /**
124
+ * Extract the narrowed type from a guard.
125
+ *
126
+ * @example
127
+ * ```ts
128
+ * type Value = GuardType<Guard<string>>
129
+ * ```
130
+ */
131
+ export type GuardType<G> = G extends Guard<infer T> ? T : never;
132
+ /**
133
+ * Shape object mapping keys to guards.
134
+ *
135
+ * @example
136
+ * ```ts
137
+ * const shape: GuardsShape = { id: (value): value is string => typeof value === 'string' }
138
+ * ```
139
+ */
140
+ export type GuardsShape = Readonly<Record<string, Guard<unknown>>>;
141
+ /**
142
+ * Resolve a guard shape to its readonly object output type.
143
+ *
144
+ * @example
145
+ * ```ts
146
+ * type User = FromGuards<{ id: Guard<string> }>
147
+ * ```
148
+ */
149
+ export type FromGuards<G extends GuardsShape> = Readonly<{
150
+ [K in keyof G]: GuardType<G[K]>;
151
+ }>;
152
+ /**
153
+ * Resolve a guard shape to an object type with selected optional keys.
154
+ *
155
+ * @example
156
+ * ```ts
157
+ * type User = OptionalFromGuards<{ id: Guard<string>; note: Guard<string> }, ['note']>
158
+ * ```
159
+ */
160
+ export type OptionalFromGuards<S extends GuardsShape, K extends Array<keyof S & string>> = Readonly<{
161
+ [P in Exclude<keyof S, K[number]>]: GuardType<S[P]>;
162
+ } & {
163
+ [P in K[number]]?: GuardType<S[P]>;
164
+ }>;
165
+ /**
166
+ * Resolve a guard shape to a fully optional readonly object type.
167
+ *
168
+ * @example
169
+ * ```ts
170
+ * type PartialUser = AllOptionalFromGuards<{ id: Guard<string> }>
171
+ * ```
172
+ */
173
+ export type AllOptionalFromGuards<S extends GuardsShape> = Readonly<Partial<FromGuards<S>>>;
174
+ /**
175
+ * Result type returned by object and record guard builders.
176
+ *
177
+ * @example
178
+ * ```ts
179
+ * type User = ShapeGuardResult<{ id: Guard<string> }, undefined>
180
+ * ```
181
+ */
182
+ export type ShapeGuardResult<S extends GuardsShape, K extends Array<keyof S & string> | true | undefined> = K extends true ? AllOptionalFromGuards<S> : K extends Array<keyof S & string> ? OptionalFromGuards<S, K> : FromGuards<S>;
183
+ /**
184
+ * Resolve a tuple of guards to a readonly tuple type.
185
+ *
186
+ * @example
187
+ * ```ts
188
+ * type Pair = TupleFromGuards<[Guard<string>, Guard<number>]>
189
+ * ```
190
+ */
191
+ export type TupleFromGuards<Ts extends Array<Guard<unknown>>> = Readonly<{
192
+ [K in keyof Ts]: GuardType<Ts[K]>;
193
+ }>;
194
+ /**
195
+ * Convert a union into an intersection.
196
+ *
197
+ * @example
198
+ * ```ts
199
+ * type Value = UnionToIntersection<{ a: 1 } | { b: 2 }>
200
+ * ```
201
+ */
202
+ export type UnionToIntersection<U> = (U extends unknown ? (value: U) => void : never) extends (value: infer I) => void ? I : never;
203
+ /**
204
+ * Resolve a tuple of guards to the intersection of their narrowed types.
205
+ *
206
+ * @example
207
+ * ```ts
208
+ * type Value = IntersectionFromGuards<[Guard<string>, Guard<'a' | 'b'>]>
209
+ * ```
210
+ */
211
+ export type IntersectionFromGuards<Gs extends Array<Guard<unknown>>> = UnionToIntersection<GuardType<Gs[number]>>;
212
+ /**
213
+ * Constructor signature that produces instances of `T`.
214
+ *
215
+ * @example
216
+ * ```ts
217
+ * type UserConstructor = AnyConstructor<{ id: string }>
218
+ * ```
219
+ */
220
+ export type AnyConstructor<T = unknown> = new (...args: never[]) => T;
221
+ /**
222
+ * Generic function signature.
223
+ *
224
+ * @example
225
+ * ```ts
226
+ * const fn: AnyFunction = () => true
227
+ * ```
228
+ */
229
+ export type AnyFunction = (...args: unknown[]) => unknown;
230
+ /**
231
+ * Generic async function signature.
232
+ *
233
+ * @example
234
+ * ```ts
235
+ * const fn: AnyAsyncFunction = async () => true
236
+ * ```
237
+ */
238
+ export type AnyAsyncFunction = (...args: unknown[]) => Promise<unknown>;
239
+ /**
240
+ * Zero-argument function signature.
241
+ *
242
+ * @example
243
+ * ```ts
244
+ * const fn: ZeroArgFunction = () => 'ok'
245
+ * ```
246
+ */
247
+ export type ZeroArgFunction = () => unknown;
248
+ /**
249
+ * Zero-argument async function signature.
250
+ *
251
+ * @example
252
+ * ```ts
253
+ * const fn: ZeroArgAsyncFunction = async () => 'ok'
254
+ * ```
255
+ */
256
+ export type ZeroArgAsyncFunction = () => Promise<unknown>;