runcheck 1.14.0 → 1.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/runcheck.ts","../src/rc_object.ts","../src/rc_discriminated_union.ts","../src/rc_intersection.ts"],"sourcesContent":["export {\n rc_discriminated_union,\n rc_discriminated_union_builder,\n} from './rc_discriminated_union'\nexport { rc_intersection } from './rc_intersection'\nexport {\n rc_enable_obj_strict,\n rc_get_from_key_as_fallback,\n rc_get_obj_shape,\n rc_obj_builder,\n rc_obj_extends,\n rc_obj_merge,\n rc_obj_omit,\n rc_obj_pick,\n rc_obj_strict,\n rc_object,\n} from './rc_object'\nimport { StandardSchemaV1 } from '@standard-schema/spec'\n\nexport type RcOkResult<T> = {\n /** @deprecated use errors instead */\n error: false\n errors: false\n ok: true\n /** @deprecated use value instead */\n data: T\n value: T\n warnings: string[] | false\n unwrap: () => T\n unwrapOr: (defaultValue: T) => T\n unwrapOrNull: () => T | null\n}\n\nexport type RcErrorResult<T> = {\n ok: false\n /** @deprecated use errors instead */\n error: true\n errors: string[]\n unwrap: () => T\n unwrapOr: (defaultValue: T) => T\n unwrapOrNull: () => T | null\n}\n\nexport type RcParseResult<T> = RcOkResult<T> | RcErrorResult<T>\n\nexport type RcInferType<T extends RcType<any>> =\n T extends RcType<infer U> ? U : never\n\ntype ParseResultCtx = {\n warnings_: string[]\n path_: string\n objErrShortCircuit_: boolean\n objErrKeyIndex_: number\n strictObj_: boolean\n noWarnings_: boolean\n noLooseArray_: boolean\n}\n\ntype InternalParseResult<T> =\n | { ok: true; data: T; errors: undefined }\n | { ok: false; errors: ErrorWithPath[]; data: undefined }\n\ntype WithFallback<T> = (\n fallback: T | ((invalidInput: unknown) => T),\n) => RcType<T>\n\nexport type AutoFixResult<T> =\n | false\n | { errors: string[]; safeFix?: undefined; fixed?: undefined }\n | {\n fixed: T\n errors?: undefined\n /** do not report autofix as warning */\n safeFix?: boolean\n }\n\ntype WithAutofix<T> = (\n customAutofix: (input: unknown) => AutoFixResult<T>,\n) => RcType<T>\n\ntype RemoveArrayNever<T> = T extends never[] ? never : T\n\nexport type RcOptionalKeyType<T> = RcBase<T, true>\n\nexport type RcType<T> = RcBase<T, false>\n\ntype Schema<T> = (t: T) => T\n\nexport type RcBase<T, RequiredKey extends boolean> = {\n __rc_type: Schema<T>\n readonly withFallback: WithFallback<T>\n readonly where: (\n predicate: (input: T) => boolean | { error: string },\n ) => RcType<T>\n /** RcType | undefined */\n readonly optional: () => RcType<T | undefined>\n /** { key?: RcType | undefined } */\n readonly optionalKey: () => RcOptionalKeyType<T | undefined>\n /** RcType | null */\n readonly orNull: () => RcType<T | null>\n /** RcType | null | undefined */\n readonly orNullish: () => RcType<T | null | undefined>\n readonly withAutofix: WithAutofix<T>\n readonly default: <D extends NotUndefined<T>>(\n defaultValue: D | (() => D),\n ) => RcType<NotUndefined<T> | RemoveArrayNever<D>>\n readonly nullishDefault: <D extends NotNullish<T>>(\n defaultValue: D | (() => D),\n ) => RcType<NotNullish<T> | RemoveArrayNever<D>>\n\n readonly or: <O>(schema: RcType<O>) => RcType<T | O>\n readonly parse: (input: unknown, options?: ParseOptions) => RcParseResult<T>\n readonly parseJson: (\n jsonString: string,\n options?: ParseOptions,\n ) => RcParseResult<T>\n\n // This should not be stripped out because it is used in type inference\n readonly _optional_key_?: RequiredKey\n /** @internal */\n readonly _parse_: (\n input: unknown,\n ctx: ParseResultCtx,\n ) => InternalParseResult<T>\n /** @internal */\n readonly _kind_: string\n /** @internal */\n readonly _fallback_: T | ((invalidInput: unknown) => T) | undefined\n /** @internal */\n readonly _optional_: boolean\n /** @internal */\n readonly _orNullish_: boolean\n /** @internal */\n readonly _orNull_: boolean\n /** @internal */\n readonly _useAutFix_: boolean\n /** @internal */\n readonly _is_extend_obj_: boolean\n /** @internal */\n readonly _is_object_: boolean\n /** @internal */\n readonly _array_item_type_: RcType<any> | undefined\n /** @internal */\n readonly _show_value_in_error_: boolean\n /** @internal */\n readonly _alternative_key_: string | undefined\n /** @internal */\n _detailed_obj_shape_: string | undefined\n /** @internal */\n readonly _obj_shape_: Record<string, RcType<any>> | undefined\n /** @internal */\n readonly _autoFix_: ((input: unknown) => AutoFixResult<T>) | undefined\n}\n\nconst getUndefined = () => undefined\n\nfunction withFallback(this: RcType<any>, fallback: any): RcType<any> {\n return {\n ...this,\n _fallback_: fallback === undefined ? getUndefined : fallback,\n }\n}\n\nfunction defaultMethod<T>(\n this: RcType<T>,\n defaultValue: NotUndefined<T> | (() => NotUndefined<T>),\n): RcType<NotUndefined<T>> {\n return rc_default(this, defaultValue)\n}\n\nfunction nullishDefaultMethod<T>(\n this: RcType<T>,\n defaultValue: NotNullish<T> | (() => NotNullish<T>),\n): RcType<NotNullish<T>> {\n return rc_nullish_default(this, defaultValue)\n}\n\nfunction orMethod<T, O>(this: RcType<T>, schema: RcType<O>): RcType<T | O> {\n return rc_union(this, schema)\n}\n\nfunction parseMethod<T>(\n this: RcType<T>,\n input: unknown,\n options: ParseOptions,\n): RcParseResult<T> {\n return rc_parse(input, this, options)\n}\n\nfunction parseJsonMethod<T>(\n this: RcType<T>,\n jsonString: string,\n options: ParseOptions,\n): RcParseResult<T> {\n return rc_parse_json(jsonString, this, options)\n}\n\n/** @internal */\nexport type ErrorWithPath = string & { __withPath: true }\ntype ErrorWithoutPath = string & { __withPath?: never }\n\nexport function getWarningOrErrorWithPath(\n ctx: { path_: string },\n message: ErrorWithoutPath,\n): ErrorWithPath {\n return `${ctx.path_ ? `$${ctx.path_}: ` : ''}${message}` as ErrorWithPath\n}\n\nfunction addWarning(ctx: ParseResultCtx, warning: string) {\n ctx.warnings_.push(\n warning.startsWith('$') ? warning : getWarningOrErrorWithPath(ctx, warning),\n )\n}\n\nfunction addWarnings(ctx: ParseResultCtx, warnings: string[]) {\n warnings.forEach((warning) => addWarning(ctx, warning))\n}\n\ntype IsValid<T> =\n | boolean\n | { data: T; errors: false }\n | { data: undefined; errors: ErrorWithPath[] }\n\nexport function parse<T>(\n type: RcType<T>,\n input: unknown,\n ctx: ParseResultCtx,\n checkIfIsValid: () => IsValid<T>,\n): InternalParseResult<T> {\n if (type._optional_) {\n if (input === undefined) {\n return { ok: true, data: input as T, errors: undefined }\n }\n }\n\n if (type._orNullish_) {\n if (input === null || input === undefined) {\n return { ok: true, data: input as T, errors: undefined }\n }\n }\n\n if (type._orNull_) {\n if (input === null) {\n return { ok: true, data: input as T, errors: undefined }\n }\n }\n\n const isValid = checkIfIsValid()\n\n if (isValid) {\n if (isValid === true || !isValid.errors) {\n const validResult = isValid === true ? (input as T) : isValid.data\n\n return { ok: true, data: validResult, errors: undefined }\n }\n }\n\n if (!ctx.noWarnings_) {\n const fb = type._fallback_\n\n if (fb !== undefined) {\n addWarning(\n ctx,\n `Fallback used, errors -> ${getResultErrors(\n isValid,\n ctx,\n type,\n input,\n )}`,\n )\n\n return { ok: true, data: isFn(fb) ? fb(input) : fb, errors: undefined }\n }\n\n if (type._useAutFix_ && type._autoFix_) {\n const autofixed = type._autoFix_(input)\n\n if (autofixed) {\n if (!autofixed.safeFix) {\n addWarning(\n ctx,\n `Autofixed from error -> ${getResultErrors(\n isValid,\n ctx,\n type,\n input,\n )}`,\n )\n }\n\n if (autofixed.errors) {\n return {\n ok: false,\n data: undefined,\n errors: autofixed.errors.map((error) =>\n getWarningOrErrorWithPath(ctx, error),\n ),\n }\n }\n\n return { ok: true, data: autofixed.fixed, errors: undefined }\n }\n }\n }\n\n return {\n ok: false,\n data: undefined,\n errors:\n isValid ?\n isValid.errors\n : [getWarningOrErrorWithPath(ctx, getErrorMsg(type, input))],\n }\n}\n\nfunction getResultErrors(\n isValid: false | { errors: string[] },\n ctx: ParseResultCtx,\n type: RcType<any>,\n input: unknown,\n) {\n return isValid ?\n isValid.errors.map((err) => err.replace(ctx.path_, '')).join('; ')\n : getErrorMsg(type, input)\n}\n\nfunction withAutofix(\n this: RcType<any>,\n customAutofix: (input: unknown) => any,\n): RcType<any> {\n return {\n ...this,\n _useAutFix_: true,\n _autoFix_: customAutofix,\n }\n}\n\nfunction where(\n this: RcType<any>,\n predicate: (input: any) => boolean | { error: string },\n): RcType<any> {\n return {\n ...this,\n _parse_: (input, ctx) => {\n return parse(this, input, ctx, () => {\n const result = this._parse_(input, ctx)\n\n if (!result.ok) {\n return {\n errors: result.errors,\n data: undefined,\n }\n }\n\n const predicateResult = predicate(result.data)\n\n if (predicateResult !== true) {\n return {\n errors: [\n getWarningOrErrorWithPath(\n ctx,\n `Predicate failed${\n predicateResult === false ?\n ` for type '${this._kind_}'`\n : `: ${predicateResult.error}`\n }`,\n ),\n ],\n data: undefined,\n }\n }\n\n return { errors: false, data: result.data }\n })\n },\n }\n}\n\nfunction optional(this: RcType<any>): RcType<any> {\n return {\n ...this,\n _optional_: true,\n _kind_: `undefined | ${this._kind_}`,\n }\n}\n\nfunction getErrorMsg(type: RcType<any>, input: unknown): string {\n return `Type '${normalizedTypeOf(\n input,\n !!type._show_value_in_error_,\n )}' is not assignable to '${type._kind_}'`\n}\n\nfunction orNull(this: RcType<any>): RcType<any> {\n return {\n ...this,\n _orNull_: true,\n _kind_: `null | ${this._kind_}`,\n }\n}\n\nfunction orNullish(this: RcType<any>): RcType<any> {\n return {\n ...this,\n _orNullish_: true,\n _kind_: `null | undefined | ${this._kind_}`,\n }\n}\n\nexport const defaultProps: Omit<RcType<any>, '_parse_' | '_kind_'> = {\n __rc_type: undefined as any,\n withFallback,\n where,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment -- perf improvement to avoid polymorphic deoptimizations\n // @ts-ignore\n _parse_: undefined as any,\n _kind_: undefined as any,\n optional,\n optionalKey: optional as any,\n orNullish,\n withAutofix,\n orNull,\n default: defaultMethod as any,\n nullishDefault: nullishDefaultMethod as any,\n or: orMethod as any,\n parse: parseMethod as any,\n parseJson: parseJsonMethod as any,\n _array_item_type_: undefined,\n _fallback_: undefined,\n _predicate_: undefined,\n _optional_: false,\n _orNull_: false,\n _orNullish_: false,\n _useAutFix_: false,\n _show_value_in_error_: false,\n _alternative_key_: undefined,\n _autoFix_: undefined,\n _obj_shape_: undefined,\n _detailed_obj_shape_: undefined,\n _is_object_: false,\n _is_extend_obj_: false,\n}\n\n/** Equivalent to ts type: `undefined`. */\nexport const rc_undefined: RcType<undefined> = {\n ...(defaultProps as Omit<RcType<undefined>, '_parse_' | '_kind_'>),\n _parse_(input, ctx) {\n return parse(this, input, ctx, () => input === undefined)\n },\n _kind_: 'undefined',\n}\n\n/** Equivalent to ts type: `null`. */\nexport const rc_null: RcType<null> = {\n ...(defaultProps as Omit<RcType<null>, '_parse_' | '_kind_'>),\n _parse_(input, ctx) {\n return parse(this, input, ctx, () => input === null)\n },\n _kind_: 'null',\n}\n\n/** Equivalent to ts type: `any`. */\nexport const rc_any: RcType<any> = {\n ...defaultProps,\n _parse_(input) {\n return { ok: true, data: input, errors: undefined }\n },\n _kind_: 'any',\n}\n\n/** Equivalent to ts type: `unknown`. */\nexport const rc_unknown: RcType<unknown> = {\n ...defaultProps,\n _parse_(input) {\n return { ok: true, data: input, errors: undefined }\n },\n _kind_: 'unknown',\n}\n\n/** Equivalent to ts type: `boolean`. */\nexport const rc_boolean: RcType<boolean> = {\n ...defaultProps,\n _parse_(input, ctx) {\n return parse(this, input, ctx, () => typeof input === 'boolean')\n },\n _kind_: 'boolean',\n}\n\n/** Equivalent to ts type: `string`. */\nexport const rc_string: RcType<string> = {\n ...defaultProps,\n _parse_(input, ctx) {\n return parse(this, input, ctx, () => typeof input === 'string')\n },\n _kind_: 'string',\n}\n\n/** Equivalent to ts type: `number`. Excludes `NaN`. */\nexport const rc_number: RcType<number> = {\n ...defaultProps,\n _parse_(input, ctx) {\n return parse(\n this,\n input,\n ctx,\n () => typeof input === 'number' && !Number.isNaN(input),\n )\n },\n _kind_: 'number',\n}\n\n/** Equivalent to ts type: `Date`. Excludes invalid dates. */\nexport const rc_date: RcType<Date> = {\n ...defaultProps,\n _parse_(input, ctx) {\n return parse(this, input, ctx, () => {\n return (\n typeof input === 'object' &&\n input instanceof Date &&\n !Number.isNaN(input.getTime())\n )\n })\n },\n _kind_: 'date',\n}\n\n/** Validates class instances using `instanceof` checks.\n *\n * @example\n * ```typescript\n * const userSchema = rc_instanceof(User) // schema is equivalent to `User` type\n * const result = userSchema.parse(new User('John', 30)) // valid\n * const result2 = userSchema.parse(new Admin('John', 30)) // invalid\n * ```\n */\nexport function rc_instanceof<T extends new (...args: any[]) => any>(\n classToCheck: T,\n): RcType<InstanceType<T>> {\n return {\n ...defaultProps,\n _parse_(input, ctx) {\n return parse(this, input, ctx, () => {\n return input instanceof classToCheck\n })\n },\n _kind_: `instanceof_${classToCheck.name || 'AnonymousClass'}`,\n }\n}\n\n/** Validates literal values like `'hello' | true | 1`. */\nexport function rc_literals<T extends (string | number | boolean)[]>(\n ...literals: T\n): RcType<T[number]> {\n if (literals.length === 0) {\n throw new Error('rc_literal requires at least one literal')\n }\n\n return {\n ...defaultProps,\n _parse_(input, ctx) {\n return parse(this, input, ctx, () => {\n for (const literal of literals) {\n if (input === literal) {\n return true\n }\n }\n\n return false\n })\n },\n _show_value_in_error_: true,\n _kind_:\n literals.length == 1 ?\n normalizedTypeOf(literals[0], true)\n : literals.map((literal) => normalizedTypeOf(literal, true)).join(' | '),\n }\n}\n\nconst maxShallowObjErrors = 1\n\n/** Validates union types like `string | number`. */\nexport function rc_union<T extends RcType<any>[]>(\n ...types: T\n): RcType<RcInferType<T[number]>> {\n if (types.length === 0) {\n throw new Error('Unions should have at least one type')\n }\n\n let kind = ''\n let allIsObject = false\n\n for (const type of types) {\n if (kind) {\n kind += ' | '\n }\n\n kind += type._kind_\n\n if (!allIsObject && type._is_object_) {\n allIsObject = true\n }\n }\n\n return {\n ...defaultProps,\n _kind_: kind,\n _is_object_: allIsObject,\n _parse_(input, ctx) {\n return parse(this, input, ctx, () => {\n const basePath = ctx.path_\n const shallowObjErrors: ErrorWithPath[] = []\n let shallowObjErrorsCount = 0\n let hasNonObjTypeMember = false\n const nonShallowObjErrors: ErrorWithPath[] = []\n\n let i = 0\n for (const type of types) {\n i += 1\n\n if (type._is_object_) {\n ctx.path_ = `${basePath}|union ${i}|`\n }\n\n const currentObjErrShortCircuit = ctx.objErrShortCircuit_\n ctx.objErrShortCircuit_ = true\n ctx.objErrKeyIndex_ = 0\n\n const parseResult = type._parse_(input, ctx)\n\n const objErrIndex = ctx.objErrKeyIndex_\n\n ctx.objErrShortCircuit_ = currentObjErrShortCircuit\n ctx.objErrKeyIndex_ = 0\n\n if (parseResult.ok) {\n return { data: parseResult.data, errors: false }\n } else if (type._is_object_ && objErrIndex !== -1) {\n if (objErrIndex > 0) {\n nonShallowObjErrors.push(...parseResult.errors)\n } else {\n if (shallowObjErrorsCount < maxShallowObjErrors) {\n shallowObjErrors.push(...parseResult.errors)\n }\n\n shallowObjErrorsCount += 1\n }\n } else {\n hasNonObjTypeMember = true\n }\n }\n\n ctx.path_ = basePath\n\n if (nonShallowObjErrors.length > 0 || shallowObjErrors.length > 0) {\n if (\n shallowObjErrorsCount > maxShallowObjErrors ||\n hasNonObjTypeMember\n ) {\n shallowObjErrors.push(\n getWarningOrErrorWithPath(\n ctx,\n 'not matches any other union member',\n ),\n )\n }\n\n return {\n errors: [...nonShallowObjErrors, ...shallowObjErrors],\n data: undefined,\n }\n }\n\n return false\n })\n },\n }\n}\n\ntype NotUndefined<T> = Exclude<T, undefined>\n\n/** Generate a schema with valid fallback value for undefined inputs */\n/** Provides default value for `undefined` inputs. */\nexport function rc_default<T>(\n schema: RcType<T>,\n defaultValue: NotUndefined<T> | (() => NotUndefined<T>),\n): RcType<NotUndefined<T>> {\n return {\n ...(schema as unknown as RcType<NotUndefined<T>>),\n _optional_: false,\n _orNullish_: false,\n _orNull_: false,\n _parse_(input, ctx) {\n return parse(this, input, ctx, () => {\n if (input === undefined) {\n return getDefaultResult()\n }\n\n const parseResult = schema._parse_(input, ctx)\n\n if (parseResult.ok) {\n if (parseResult.data === undefined) {\n return getDefaultResult()\n }\n\n return { data: parseResult.data as NotUndefined<T>, errors: false }\n } else {\n return { data: undefined, errors: parseResult.errors }\n }\n })\n },\n _kind_: `${schema._kind_}_default`,\n }\n\n function getDefaultResult(): IsValid<NotUndefined<T>> {\n return {\n data: isFn(defaultValue) ? defaultValue() : defaultValue,\n errors: false,\n }\n }\n}\n\ntype NotNullish<T> = Exclude<T, null | undefined>\n\n/** Provides default value for `null | undefined` inputs. */\nexport function rc_nullish_default<T>(\n schema: RcType<T>,\n defaultValue: NotNullish<T> | (() => NotNullish<T>),\n): RcType<NotNullish<T>> {\n return {\n ...(schema as unknown as RcType<NotNullish<T>>),\n _optional_: false,\n _orNullish_: false,\n _orNull_: false,\n _parse_(input, ctx) {\n return parse(this, input, ctx, () => {\n if (input === null || input === undefined) {\n return getDefaultResult()\n }\n\n const parseResult = schema._parse_(input, ctx)\n\n if (parseResult.ok) {\n if (parseResult.data === null || parseResult.data === undefined) {\n return getDefaultResult()\n }\n\n return { data: parseResult.data as NotNullish<T>, errors: false }\n } else {\n return { data: undefined, errors: parseResult.errors }\n }\n })\n },\n _kind_: `${schema._kind_}_nullish_default`,\n }\n\n function getDefaultResult(): IsValid<NotNullish<T>> {\n return {\n data: isFn(defaultValue) ? defaultValue() : defaultValue,\n errors: false,\n }\n }\n}\n\n/** returns a fallback in case of wrong inputs without adding a warning */\n/** Provides fallback value for invalid inputs without warnings. */\nexport function rc_safe_fallback<T>(\n schema: RcType<T>,\n fallback: NoInfer<T> | (() => NoInfer<T>),\n): RcType<T> {\n return {\n ...(schema as unknown as RcType<T>),\n _parse_(input, ctx) {\n return parse(this, input, ctx, () => {\n const parseResult = schema._parse_(input, ctx)\n\n if (parseResult.ok) {\n return { data: parseResult.data, errors: false }\n }\n\n return { data: isFn(fallback) ? fallback() : fallback, errors: false }\n })\n },\n }\n}\n\n/** Validates `Record<string, T>`. Supports key validation and loose checking. */\nexport function rc_record<V>(\n valueType: RcType<V>,\n {\n checkKey,\n looseCheck,\n }: { checkKey?: (key: string) => boolean; looseCheck?: boolean } = {},\n): RcType<Record<string, V>> {\n return {\n ...defaultProps,\n _kind_: `record<string, ${valueType._kind_}>`,\n _is_object_: true,\n _parse_(inputObj, ctx) {\n return parse<Record<string, V>>(this, inputObj, ctx, () => {\n if (!isObject(inputObj)) return false\n\n const resultObj: Record<any, string> = {} as any\n const resultErrors: ErrorWithPath[] = []\n\n const parentPath = ctx.path_\n\n for (const [key, inputValue] of Object.entries(inputObj)) {\n const subPath =\n key === '' || key.includes(' ') ? `['${key}']` : `.${key}`\n\n const path = `${parentPath}${subPath}`\n ctx.path_ = path\n\n if (checkKey && !checkKey(key)) {\n resultErrors.push(\n getWarningOrErrorWithPath(ctx, `Key '${key}' is not allowed`),\n )\n continue\n }\n\n const input = inputObj[key]\n\n const parseResult = valueType._parse_(inputValue, ctx)\n\n if (parseResult.ok) {\n resultObj[key] = input\n }\n //\n else {\n const errors = parseResult.errors\n\n for (const subError of errors) {\n resultErrors.push(subError)\n }\n\n if (ctx.objErrShortCircuit_) {\n break\n }\n }\n }\n\n if (resultErrors.length > 0) {\n if (looseCheck) {\n addWarnings(ctx, resultErrors)\n } else {\n return { errors: resultErrors, data: undefined }\n }\n }\n\n ctx.path_ = parentPath\n\n return { errors: false, data: resultObj as any }\n })\n },\n }\n}\n\n/** instead of returning a general error, rejects invalid keys and returns warnings for these items */\n/** Validates `Record<string, T>`. Filters out invalid values instead of rejecting. */\nexport function rc_loose_record<V>(\n valueType: RcType<V>,\n { checkKey }: { checkKey?: (key: string) => boolean } = {},\n): RcType<Record<string, V>> {\n return rc_record(valueType, { checkKey, looseCheck: true })\n}\n\nfunction checkArrayItems(\n this: RcType<any>,\n input: any[],\n types: RcType<any> | readonly RcType<any>[],\n ctx: ParseResultCtx,\n _loose = false,\n options?: ArrayOptions<RcType<any>>,\n): IsValid<any[]> {\n const useLooseMode = _loose && !ctx.noWarnings_ && !ctx.noLooseArray_\n const unique = options?.unique\n\n const looseErrors: [err: ErrorWithPath[], path: string][] = []\n const arrayResult: any[] = []\n const uniqueValues = unique ? new Set<any>() : undefined\n\n const parentPath = ctx.path_\n\n const isTuple = Array.isArray(types)\n\n let index = -1\n for (const _item of input) {\n index++\n\n const type: RcType<any> = isTuple ? types[index] : types\n\n const subPath = `[${index}]`\n\n const path = `${parentPath}${subPath}`\n\n ctx.path_ = path\n\n if (options?.filter) {\n const filterResult = options.filter(_item)\n\n if (typeof filterResult === 'boolean') {\n if (!filterResult) {\n continue\n }\n } else if ('errors' in filterResult) {\n if (!useLooseMode) {\n return { errors: filterResult.errors, data: undefined }\n } else {\n looseErrors.push([filterResult.errors, path])\n continue\n }\n }\n\n ctx.path_ = path\n }\n\n let parseResult = type._parse_(_item, ctx)\n\n ctx.path_ = path\n\n if (parseResult.ok && uniqueValues) {\n let uniqueValueToCheck = parseResult.data\n\n const isUniqueKey = typeof unique === 'string'\n\n if (isUniqueKey) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n uniqueValueToCheck = parseResult.data[unique]\n } else if (typeof unique === 'function') {\n uniqueValueToCheck = unique(parseResult.data)\n }\n\n if (uniqueValues.has(uniqueValueToCheck)) {\n if (isUniqueKey) {\n ctx.path_ = `${parentPath}${subPath}.${unique}`\n }\n\n parseResult = {\n ok: false,\n data: undefined,\n errors: [\n getWarningOrErrorWithPath(\n ctx,\n isUniqueKey ?\n `Type '${type._obj_shape_?.[unique]?._kind_}' with value \"${uniqueValueToCheck}\" is not unique`\n : typeof unique === 'function' ?\n `Type '${type._kind_}' unique fn return with value \"${uniqueValueToCheck}\" is not unique`\n : `${type._kind_} value is not unique`,\n ),\n ],\n }\n } else {\n uniqueValues.add(uniqueValueToCheck)\n }\n }\n\n if (!parseResult.ok) {\n if (!useLooseMode) {\n return {\n errors: parseResult.errors,\n data: undefined,\n }\n } else {\n looseErrors.push([parseResult.errors, path])\n continue\n }\n } else {\n arrayResult.push(parseResult.data)\n }\n }\n\n if (looseErrors.length > 0) {\n const adjustedLooseErrors: ErrorWithPath[] = []\n\n for (const [errors, path] of looseErrors) {\n for (const err of errors) {\n let itemError = err.slice(path.length + 1)\n\n if (itemError.startsWith(': ')) {\n itemError = itemError.slice(2)\n }\n\n if (itemError.startsWith('.') || itemError.startsWith('[')) {\n itemError = `#${itemError}`\n }\n\n const newError = `$${path}: Rejected, error -> ${itemError}`\n\n adjustedLooseErrors.push(newError as ErrorWithPath)\n }\n\n addWarnings(ctx, adjustedLooseErrors)\n }\n }\n\n return { errors: false, data: arrayResult }\n}\n\ntype ArrayOptions<T extends RcType<any>> = {\n unique?: RcInferType<T> extends Record<string, any> ?\n keyof RcInferType<T> | ((parsedItem: RcInferType<T>) => any)\n : boolean | ((parsedItem: RcInferType<T>) => any)\n filter?: (item: RcInferType<T>) => boolean | { errors: ErrorWithPath[] }\n}\n\n/** Validates arrays of type `T[]`. Supports unique value checking. */\nexport function rc_array<T extends RcType<any>>(\n type: T,\n options?: ArrayOptions<T>,\n): RcType<RcInferType<T>[]> {\n return {\n ...defaultProps,\n _kind_: `${type._kind_}[]`,\n _array_item_type_: type,\n _parse_(input, ctx) {\n return parse(this, input, ctx, () => {\n if (!Array.isArray(input)) return false\n\n if (input.length === 0) return true\n\n return checkArrayItems.call(this, input, type, ctx, false, options)\n })\n },\n }\n}\n\n/**\n * Extracts the item type from an array type.\n * @param type - The array type to extract the item type from\n * @returns The item type of the array\n * @example\n * ```typescript\n * const stringArray = rc_array(rc_string)\n * const itemType = rc_get_array_item_type(stringArray) // rc_string\n * ```\n */\nexport function rc_get_array_item_type<T>(type: RcType<T[]>): RcType<T> {\n if (!type._array_item_type_) {\n throw new Error(`Type does not have an item type`)\n }\n\n return type._array_item_type_\n}\n\n/**\n * Disables loose array validation for a type.\n * @param type - The type to modify\n * @param options - Configuration options\n * @param options.nonRecursive - If true, only affects the immediate array type\n * @returns The modified type with loose array validation disabled\n * @example\n * ```typescript\n * const strictArray = rc_disable_loose_array(rc_array(rc_string))\n * ```\n */\nexport function rc_disable_loose_array<T extends RcType<any>>(\n type: T,\n { nonRecursive = false }: { nonRecursive?: boolean } = {},\n): T {\n if (nonRecursive) {\n if (!type._kind_.endsWith('[]')) {\n throw new Error(\n `rc_disable_loose_array: nonRecursive option can only be used with array types`,\n )\n }\n\n return {\n ...type,\n _parse_(input, ctx) {\n return parse(this, input, ctx, () => {\n if (!Array.isArray(input)) return false\n\n if (input.length === 0) return true\n\n return checkArrayItems.call(this, input, type, ctx, false)\n })\n },\n }\n }\n\n return {\n ...type,\n _parse_(input, ctx) {\n const parentDisableLooseArray = ctx.noLooseArray_\n\n ctx.noLooseArray_ = true\n const result = type._parse_(input, ctx)\n ctx.noLooseArray_ = parentDisableLooseArray\n\n return result\n },\n }\n}\n\n/** instead of returning a general error, rejects invalid array items and returns warnings for these items */\n/** Validates arrays of type `T[]`. Filters out invalid elements instead of rejecting the array. */\nexport function rc_loose_array<T extends RcType<any>>(\n type: T,\n options?: ArrayOptions<T>,\n): RcType<RcInferType<T>[]> {\n return {\n ...defaultProps,\n _array_item_type_: type,\n _kind_: `${type._kind_}[]`,\n _parse_(input, ctx) {\n return parse(this, input, ctx, () => {\n if (!Array.isArray(input)) return false\n\n if (input.length === 0) return true\n\n return checkArrayItems.call(this, input, type, ctx, true, options)\n })\n },\n }\n}\n\n/**\n * Creates an array validator with schema-based filtering.\n * @param filterSchema - The schema to validate items before filtering\n * @param filterFn - The function to determine if validated items should be included\n * @param type - The type to validate for included array elements\n * @param options - Configuration options\n * @returns A runcheck type that validates and filters arrays based on the schema\n * @example\n * ```typescript\n * const evenNumbers = rc_array_filter_from_schema(\n * rc_number,\n * (n) => n % 2 === 0,\n * rc_number\n * )\n * const result = evenNumbers.parse([1, 2, 3, 4]) // returns [2, 4]\n * ```\n */\nexport function rc_array_filter_from_schema<B, T>(\n filterSchema: RcType<B>,\n filterFn: (item: B) => boolean,\n type: RcType<T>,\n options?: Omit<ArrayOptions<RcType<any>>, 'filter'> & {\n loose?: boolean\n },\n): RcType<T[]> {\n return {\n ...defaultProps,\n _array_item_type_: type,\n _kind_: `${type._kind_}[]`,\n _parse_(input, ctx) {\n return parse(this, input, ctx, () => {\n if (!Array.isArray(input)) return false\n\n if (input.length === 0) return true\n\n return checkArrayItems.call(this, input, type, ctx, options?.loose, {\n ...options,\n filter(item) {\n const filterResult = filterSchema._parse_(item, ctx)\n\n if (!filterResult.ok) {\n return { errors: filterResult.errors }\n }\n\n return filterFn(filterResult.data)\n },\n })\n })\n },\n }\n}\n\ntype MapTupleToTypes<T extends readonly [...any[]]> = {\n -readonly [K in keyof T]: RcInferType<T[K]>\n}\n\n/**\n * Check for a tuple of types\n *\n * TS equivalent example: [string, number, boolean]\n */\n/** Validates tuples like `[T, T]` with fixed length. */\nexport function rc_tuple<const T extends readonly RcType<any>[]>(\n types: T,\n): RcType<MapTupleToTypes<T>> {\n return {\n ...defaultProps,\n _kind_: `[${types.map((type) => type._kind_).join(', ')}]`,\n _parse_(input, ctx) {\n return parse(this, input, ctx, () => {\n if (!Array.isArray(input)) return false\n\n if (input.length !== types.length) return false\n\n return checkArrayItems.call(this, input, types, ctx) as boolean\n })\n },\n }\n}\n\ntype ParseOptions = {\n /** ignore fallback and autofix */\n noWarnings?: boolean\n}\n\nfunction showWarnings(result: RcOkResult<any>) {\n if (result.warnings && result.warnings.length > 0) {\n console.warn(`Unwrap warnings: ${result.warnings.join('\\n')}`)\n }\n}\n\nfunction unwrap(this: RcParseResult<any>) {\n if (this.errors) {\n throw new RcValidationError(this.errors)\n }\n\n showWarnings(this)\n\n return this.value\n}\n\nfunction unwrapOr(this: RcParseResult<any>, defaultValue: any) {\n if (this.errors) {\n return defaultValue\n }\n\n showWarnings(this)\n\n return this.value\n}\n\nfunction unwrapOrNull(this: RcParseResult<any>) {\n if (this.errors) {\n return null\n }\n\n showWarnings(this)\n\n return this.value\n}\n\n/**\n * Parse a runcheck type. If valid return the valid input, with warning for autofix\n * and fallback, or the errors if invalid\n */\n/**\n * Parses and validates input against a runcheck type schema.\n * @param input - The input value to validate\n * @param type - The runcheck type schema to validate against\n * @param options - Parse options\n * @param options.noWarnings - If true, disables fallback and autofix warnings\n * @returns The parse result containing either the validated value or errors\n * @example\n * ```typescript\n * const result = rc_parse('hello', rc_string)\n * if (result.ok) {\n * console.log(result.value) // 'hello'\n * } else {\n * console.log(result.errors) // validation errors\n * }\n * ```\n */\nexport function rc_parse<S>(\n input: any,\n type: RcType<S>,\n { noWarnings = false }: ParseOptions = {},\n): RcParseResult<S> {\n const ctx: ParseResultCtx = {\n warnings_: [],\n path_: '',\n objErrShortCircuit_: false,\n objErrKeyIndex_: 0,\n noWarnings_: noWarnings,\n strictObj_: false,\n noLooseArray_: false,\n }\n\n const parseResult = type._parse_(input, ctx)\n\n if (parseResult.ok) {\n return {\n error: false,\n errors: false,\n ok: true,\n data: parseResult.data,\n value: parseResult.data,\n warnings: ctx.warnings_.length > 0 ? ctx.warnings_ : false,\n unwrap,\n unwrapOr,\n unwrapOrNull,\n }\n }\n\n return {\n ok: false,\n error: true,\n errors: parseResult.errors,\n unwrap,\n unwrapOr,\n unwrapOrNull,\n }\n}\n\nexport type RcParser<T> = (input: any) => RcParseResult<T>\n\n/** create a reusable parser for a certain type */\n/**\n * Creates a reusable parser function for a runcheck type.\n * @param type - The runcheck type to create a parser for\n * @returns A parser function that can be called with input values\n * @example\n * ```typescript\n * const parseString = rc_parser(rc_string)\n * const result1 = parseString('hello')\n * const result2 = parseString(123)\n * ```\n */\nexport function rc_parser<S>(type: RcType<S>): RcParser<S> {\n return (input: any) => rc_parse(input, type)\n}\n\n/** @deprecated use rc_unwrap_or_null instead */\nexport function rc_loose_parse<S>(\n input: any,\n type: RcType<S>,\n options?: ParseOptions,\n): { data: S | null; errors: string[] | false; warnings: string[] | false } {\n const result = rc_parse(input, type, options)\n\n if (result.errors) {\n return {\n data: null,\n errors: result.errors,\n warnings: false,\n }\n }\n\n return { data: result.value, errors: false, warnings: result.warnings }\n}\n\n/** @deprecated use rc_parse(...).unwrapOrNull() instead */\nexport function rc_unwrap_or_null<R>(result: RcParseResult<R>): {\n value: R | null\n errors: string[] | false\n warnings: string[] | false\n} {\n return rc_unwrap_or(result, null)\n}\n\n/** @deprecated use rc_parse(...).unwrapOr(defaultValue) instead */\nexport function rc_unwrap_or<R, F = NoInfer<R>>(\n result: RcParseResult<R>,\n fallback: F,\n): {\n value: R | F\n errors: string[] | false\n warnings: string[] | false\n} {\n if (result.error) {\n return {\n value: fallback,\n errors: result.errors,\n warnings: false,\n }\n }\n\n return { value: result.value, errors: false, warnings: result.warnings }\n}\n\nexport class RcValidationError extends Error {\n name = 'RcValidationError'\n\n constructor(public readonly errors: string[]) {\n super(errors.join('\\n'))\n }\n}\n\n/** @deprecated use rc_parse(...).unwrap() instead */\nexport function rc_unwrap<R>(result: RcParseResult<R>): {\n value: R\n warnings: string[] | false\n} {\n if (result.errors) {\n throw new RcValidationError(result.errors)\n }\n\n return result\n}\n\n/**\n * Type guard function that checks if input is valid for a given type.\n * @param input - The input value to validate\n * @param type - The runcheck type to validate against\n * @returns True if input is valid, false otherwise (with type narrowing)\n * @example\n * ```typescript\n * if (rc_is_valid(input, rc_string)) {\n * // input is now typed as string\n * console.log(input.toUpperCase())\n * }\n * ```\n */\nexport function rc_is_valid<S>(input: any, type: RcType<S>): input is S {\n const ctx: ParseResultCtx = {\n warnings_: [],\n path_: '',\n objErrShortCircuit_: false,\n objErrKeyIndex_: 0,\n noWarnings_: false,\n strictObj_: false,\n noLooseArray_: false,\n }\n\n return type._parse_(input, ctx).ok\n}\n\n/**\n * Creates a validator function that acts as a type guard.\n * @param type - The runcheck type to create a validator for\n * @returns A validator function that can be used as a type guard\n * @example\n * ```typescript\n * const isString = rc_validator(rc_string)\n * if (isString(input)) {\n * // input is now typed as string\n * console.log(input.length)\n * }\n * ```\n */\nexport function rc_validator<S>(type: RcType<S>) {\n return (input: any): input is S => rc_is_valid(input, type)\n}\n\n/**\n * Creates a recursive type definition for self-referencing data structures.\n * @param type - A function that returns the recursive type definition\n * @returns A runcheck type that can handle recursive structures\n * @example\n * ```typescript\n * type TreeNode = {\n * value: string\n * children?: TreeNode[]\n * }\n *\n * const TreeNode: RcType<TreeNode> = rc_recursive(() =>\n * rc_object({\n * value: rc_string,\n * children: rc_array(TreeNode).optional(),\n * })\n * )\n * ```\n */\nexport function rc_recursive<T extends RcBase<any, any>>(type: () => T): T {\n let recursiveType: { -readonly [K in keyof T]: T[K] } | undefined = undefined\n\n return {\n ...defaultProps,\n _kind_: 'recursive',\n _parse_(input, ctx) {\n if (!recursiveType) {\n recursiveType = {\n ...type(),\n }\n\n if (this._optional_) {\n recursiveType._optional_ = this._optional_\n }\n\n if (this._orNullish_) {\n recursiveType._orNullish_ = this._orNullish_\n }\n\n if (this._orNull_) {\n recursiveType._orNull_ = this._orNull_\n }\n\n if (this._autoFix_) {\n recursiveType._autoFix_ = this._autoFix_\n }\n\n if (this._fallback_) {\n recursiveType._fallback_ = this._fallback_\n }\n\n if (this._alternative_key_) {\n recursiveType._alternative_key_ = this._alternative_key_\n }\n }\n\n return recursiveType._parse_(input, ctx)\n },\n } as T\n}\n\ntype TransformOptions<T> = {\n /**\n * @deprecated will be removed in the next major version\n *\n * if the input type is invalid, the transform will be ignore\n * schema will be used to validate the input\n */\n outputSchema?: RcType<T>\n /** @deprecated will be removed in the next major version */\n disableStrictOutputSchema?: boolean\n}\n\nfunction validateTransformOutput<T>(\n ctx: ParseResultCtx,\n outputSchema: RcType<T>,\n input: any,\n disableStrictOutputSchema: boolean | undefined,\n): InternalParseResult<T> {\n const parentPath = ctx.path_\n const parentObjErrShortCircuit = ctx.objErrShortCircuit_\n const parentStrictObj = ctx.strictObj_\n const parentNoWarnings = ctx.noWarnings_\n\n ctx.objErrShortCircuit_ = true\n ctx.path_ = `${parentPath}|output|`\n\n if (!disableStrictOutputSchema) {\n ctx.strictObj_ = true\n ctx.noWarnings_ = true\n }\n\n const result = outputSchema._parse_(input, ctx)\n\n ctx.strictObj_ = parentStrictObj\n ctx.noWarnings_ = parentNoWarnings\n ctx.path_ = parentPath\n ctx.objErrShortCircuit_ = parentObjErrShortCircuit\n\n return result\n}\n\n/** validate a input or subset of input and transform the valid result */\n/**\n * Creates a type that validates input and transforms the result.\n * @param type - The input type to validate against\n * @param transform - Function to transform the validated input\n * @param options - Transform options\n * @param options.outputSchema - Optional schema to validate the transformed output\n * @param options.disableStrictOutputSchema - If true, allows loose validation of output\n * @returns A runcheck type that validates input and applies transformation\n * @example\n * ```typescript\n * const upperCaseString = rc_transform(\n * rc_string,\n * (str) => str.toUpperCase()\n * )\n * const result = upperCaseString.parse('hello') // returns 'HELLO'\n * ```\n */\nexport function rc_transform<Input, Transformed>(\n type: RcType<Input>,\n transform: (input: Input, inputSchema: RcType<Input>) => Transformed,\n {\n outputSchema,\n disableStrictOutputSchema,\n }: TransformOptions<Transformed> = {},\n): RcType<Transformed> {\n return {\n ...defaultProps,\n _kind_: `${type._kind_}_transform`,\n _parse_(input, ctx) {\n return parse(this, input, ctx, () => {\n let outputResultErrors: ErrorWithPath[] | null = null\n\n if (outputSchema) {\n const parseResult = validateTransformOutput(\n ctx,\n outputSchema,\n input,\n disableStrictOutputSchema,\n )\n\n if (parseResult.ok) {\n return {\n data: parseResult.data,\n errors: false,\n }\n } else {\n outputResultErrors = parseResult.errors\n }\n }\n\n // TODO: optimize this\n const newType = {\n ...type,\n _kind_: this._kind_,\n }\n\n const parseResult = newType._parse_(input, ctx)\n\n if (parseResult.ok) {\n return {\n errors: false,\n data: transform(parseResult.data, type),\n }\n } else {\n return {\n errors: [...(outputResultErrors || []), ...parseResult.errors],\n data: undefined,\n }\n }\n })\n },\n }\n}\n\n/** Create transforms which result can be validated with the same schema */\n/**\n * Creates a narrowing transformation that refines the input type.\n * @param type - The input type to validate against\n * @param narrow - Function to narrow the validated input to a more specific type\n * @returns A runcheck type that validates and narrows the input\n * @example\n * ```typescript\n * const positiveNumber = rc_narrow(\n * rc_number,\n * (n) => n > 0 ? n : 0\n * )\n * ```\n */\nexport function rc_narrow<Input, Narrowed extends Input>(\n type: RcType<Input>,\n narrow: (input: Input, inputSchema: RcType<Input>) => Narrowed,\n): RcType<Narrowed> {\n return rc_transform(type, narrow)\n}\n\n/** Allows the transform function to return a error if transformation is invalid */\n/**\n * Creates a transformation that can fail with custom error messages.\n * @param type - The input type to validate against\n * @param transform - Function that returns either transformed data or errors\n * @param options - Transform options\n * @param options.outputSchema - Optional schema to validate the transformed output\n * @param options.disableStrictOutputSchema - If true, allows loose validation of output\n * @returns A runcheck type that validates input and applies fallible transformation\n * @example\n * ```typescript\n * const parseJson = rc_unsafe_transform(\n * rc_string,\n * (str) => {\n * try {\n * return { ok: true, data: JSON.parse(str) }\n * } catch {\n * return { ok: false, errors: 'Invalid JSON' }\n * }\n * }\n * )\n * ```\n */\nexport function rc_unsafe_transform<Input, Transformed>(\n type: RcType<Input>,\n transform: (\n input: Input,\n inputSchema: RcType<Input>,\n ) =>\n | { ok: true; data: Transformed }\n | { ok: false; errors: string | string[] },\n {\n outputSchema,\n disableStrictOutputSchema,\n }: TransformOptions<Transformed> = {},\n): RcType<Transformed> {\n return {\n ...defaultProps,\n _kind_: `${type._kind_}_transform`,\n _parse_(input, ctx) {\n return parse(this, input, ctx, (): IsValid<Transformed> => {\n let outputResultErrors: ErrorWithPath[] | null = null\n\n if (outputSchema) {\n const parseResult = validateTransformOutput(\n ctx,\n outputSchema,\n input,\n disableStrictOutputSchema,\n )\n\n if (parseResult.ok) {\n return {\n errors: false,\n data: parseResult.data,\n }\n } else {\n outputResultErrors = parseResult.errors\n }\n }\n\n // TODO: optimize this\n const newType = {\n ...type,\n _kind_: this._kind_,\n }\n\n const parseResult = newType._parse_(input, ctx)\n\n if (parseResult.ok) {\n const transformResult = transform(parseResult.data, type)\n\n if (transformResult.ok) {\n return { errors: false, data: transformResult.data }\n } else {\n return {\n errors:\n typeof transformResult.errors === 'string' ?\n [getWarningOrErrorWithPath(ctx, transformResult.errors)]\n : transformResult.errors.map((error) =>\n getWarningOrErrorWithPath(ctx, error),\n ),\n data: undefined,\n }\n }\n }\n\n return {\n errors: [...(outputResultErrors || []), ...parseResult.errors],\n data: undefined,\n }\n })\n },\n }\n}\n\nexport function normalizedTypeOf(\n input: unknown,\n showValueInError: boolean,\n): string {\n const typeOf = typeof input\n\n const type = ((): string => {\n if (typeOf === 'object') {\n if (Array.isArray(input)) {\n return 'array'\n }\n\n if (!input) {\n return 'null'\n }\n }\n\n if (typeof input === 'number' && Number.isNaN(input)) {\n return 'NaN'\n }\n\n return typeOf\n })()\n\n return (\n showValueInError &&\n (type === 'string' || type === 'number' || type === 'boolean')\n ) ?\n `${type}(${input})`\n : type\n}\n\ntype NonArrayObject = {\n [x: string]: any\n [y: number]: never\n}\n\n/**\n * Assertion function that throws if the parse result contains errors.\n * @param result - The parse result to assert validity for\n * @throws Error if the result contains validation errors\n * @example\n * ```typescript\n * const result = rc_parse(input, rc_string)\n * rc_assert_is_valid(result)\n * // result is now typed as successful result\n * console.log(result.value)\n * ```\n */\nexport function rc_assert_is_valid<S>(\n result: RcParseResult<S>,\n): asserts result is {\n ok: true\n error: false\n errors: false\n data: S\n value: S\n warnings: string[] | false\n unwrap: () => S\n unwrapOr: (defaultValue: S) => S\n unwrapOrNull: () => S | null\n} {\n if (result.errors) {\n throw new Error(`invalid input: ${result.errors.join(', ')}`)\n }\n}\n\n/** @internal */\nexport function isObject(value: any): value is NonArrayObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\n/** @internal */\nexport function snakeCase(str: string): string {\n return str\n .replace(/\\W+/g, ' ')\n .split(/ |\\B(?=[A-Z])/)\n .map((word) => word.toLowerCase())\n .join('_')\n}\n\n/**\n * Parses a JSON string and validates it against a schema.\n * @param jsonString - The JSON string to parse\n * @param schema - The runcheck type to validate the parsed JSON against\n * @param options - Parse options\n * @returns The parse result containing either the validated JSON value or errors\n * @example\n * ```typescript\n * const userSchema = rc_object({ name: rc_string, age: rc_number })\n * const result = rc_parse_json('{\"name\":\"John\",\"age\":30}', userSchema)\n * ```\n */\nexport function rc_parse_json<T>(\n jsonString: unknown,\n schema: RcType<T>,\n options?: ParseOptions,\n): RcParseResult<T> {\n try {\n if (typeof jsonString !== 'string') {\n return {\n ok: false,\n error: true,\n errors: [\n `expected a json string, got ${normalizedTypeOf(jsonString, true)}`,\n ],\n unwrap,\n unwrapOr,\n unwrapOrNull,\n }\n }\n\n const parsed = JSON.parse(jsonString)\n\n return rc_parse(parsed, schema, options)\n } catch (err) {\n return {\n ok: false,\n error: true,\n errors: [`json parsing error: ${isObject(err) ? err.message : ''}`],\n unwrap,\n unwrapOr,\n unwrapOrNull,\n }\n }\n}\n\nfunction isFn(value: any): value is (...args: any[]) => any {\n return typeof value === 'function'\n}\n\nexport type Prettify<T> =\n T extends Record<string, any> ?\n {\n [K in keyof T]: Prettify<T[K]>\n }\n : T\n\nexport type RcPrettyInferType<T extends RcType<any>> = Prettify<RcInferType<T>>\n\n/**\n * Type guard function that checks if a value is a runcheck type.\n * @param value - The value to check\n * @returns True if the value is a runcheck type, false otherwise\n * @example\n * ```typescript\n * if (isRcType(someValue)) {\n * // someValue is now typed as RcType<any>\n * const result = someValue.parse(input)\n * }\n * ```\n */\nexport function isRcType(value: any): value is RcType<any> {\n return isObject(value) && '__rc_type' in value\n}\n\n/** workaround for the typescript limitation: https://github.com/microsoft/TypeScript/issues/52295 */\n/**\n * Workaround for TypeScript limitation with union types.\n * @param type - The type to cast as a union type\n * @returns The type cast as a proper runcheck union type\n * @example\n * ```typescript\n * const unionType = joinAsRcTypeUnion(someComplexUnionType)\n * ```\n */\nexport function joinAsRcTypeUnion<T>(\n type: T,\n): RcType<T extends RcType<infer U> ? U : never> {\n return type as any\n}\n\n/**\n * Gets the kind/name of a runcheck schema for debugging purposes.\n * @param schema - The runcheck type to get the kind from\n * @returns The string representation of the schema kind\n * @example\n * ```typescript\n * const kind = getSchemaKind(rc_string) // returns 'string'\n * const kind2 = getSchemaKind(rc_array(rc_number)) // returns 'number[]'\n * ```\n */\nexport function getSchemaKind(schema: RcType<any>): string {\n return schema._kind_\n}\n\n/**\n * Converts a runcheck type or parse result to a Standard Schema V1.\n * @param schemaOrResult - The runcheck type or parse result to convert\n * @param options - Conversion options\n * @param options.errorOnWarnings - If true, treat warnings as errors\n * @param options.onWarnings - Callback function to handle warnings\n * @returns A Standard Schema V1 compatible object\n * @example\n * ```typescript\n * const standardSchema = rc_to_standard(rc_string)\n * const result = standardSchema['~standard'].validate('hello')\n * ```\n */\nexport function rc_to_standard<T>(\n schemaOrResult: RcType<T> | RcParseResult<T>,\n {\n errorOnWarnings = false,\n onWarnings,\n }: {\n errorOnWarnings?: boolean\n onWarnings?: (warnings: string[]) => void\n } = {},\n): StandardSchemaV1<T> {\n return {\n '~standard': {\n validate(value) {\n const result =\n 'ok' in schemaOrResult ? schemaOrResult : (\n rc_parse(value, schemaOrResult)\n )\n\n return parseResultToStandard(result, errorOnWarnings, onWarnings)\n },\n vendor: 'runcheck',\n version: 1,\n },\n }\n}\n\nfunction parseResultToStandard<T>(\n result: RcParseResult<T>,\n errorOnWarnings: boolean,\n onWarnings: ((warnings: string[]) => void) | undefined,\n): StandardSchemaV1.Result<T> {\n if (errorOnWarnings && result.ok && result.warnings) {\n return {\n issues: result.warnings.map((warning) => ({\n message: warning,\n })),\n }\n }\n\n if (result.ok) {\n if (onWarnings && result.warnings) {\n onWarnings(result.warnings)\n }\n\n return { value: result.value }\n }\n\n return {\n issues: result.errors.map((error) => ({\n message: error,\n })),\n }\n}\n\n/**\n * Converts a Standard Schema V1 to a runcheck type.\n * @param standardSchema - The Standard Schema V1 to convert\n * @param kind - Optional custom kind name for error messages\n * @returns A runcheck type that wraps the standard schema\n * @example\n * ```typescript\n * const rcType = rc_from_standard(someStandardSchema)\n * const result = rcType.parse(input)\n * ```\n */\nexport function rc_from_standard<T>(\n standardSchema: StandardSchemaV1<any, T>,\n /** use this kind instead of the default one in error messages (standard_schema_${standard.vendor}@${standard.version}) */\n kind?: string,\n): RcType<T> {\n const standard = standardSchema['~standard']\n return {\n ...defaultProps,\n _kind_: kind || `standard_schema_${standard.vendor}@${standard.version}`,\n _parse_(input, ctx) {\n return parse(this, input, ctx, () => {\n const result = standard.validate(input)\n\n if ('value' in result) {\n return { data: result.value, errors: false }\n }\n\n if ('issues' in result) {\n return {\n data: undefined,\n errors: result.issues.map((issue: { message: string }) =>\n getWarningOrErrorWithPath(ctx, issue.message),\n ),\n }\n }\n\n return false\n })\n },\n }\n}\n","import {\n ErrorWithPath,\n RcBase,\n RcInferType,\n RcOptionalKeyType,\n RcType,\n defaultProps,\n getWarningOrErrorWithPath,\n isObject,\n isRcType,\n normalizedTypeOf,\n parse,\n rc_array,\n rc_loose_array,\n snakeCase,\n} from './runcheck'\n\n/**\n * Creates a type that uses a fallback key when the primary key is undefined.\n * Can be used to rename keys from input or provide alternative key names.\n * @param fallbackKey - The alternative key to use when the primary key is undefined\n * @param type - The type to validate the value against\n * @returns A runcheck type that supports fallback key lookup\n * @example\n * ```typescript\n * const userSchema = rc_object({\n * name: rc_get_from_key_as_fallback('username', rc_string)\n * })\n * // Will look for 'name' first, then 'username' if 'name' is undefined\n * const result = userSchema.parse({ username: 'john' }) // valid\n * ```\n */\nexport function rc_get_from_key_as_fallback<T extends RcType<any>>(\n fallbackKey: string,\n type: T,\n): RcType<RcInferType<T>> {\n return {\n ...type,\n _alternative_key_: fallbackKey,\n }\n}\n\nexport type RcObject = {\n [key: string]: RcBase<any, any> | RcObject\n}\n\nexport type TypeOfObjectType<T extends RcObject> = Flatten<\n AddQuestionMarks<{\n [K in keyof T]: T[K] extends RcType<infer U> ? RequiredKey<U>\n : T[K] extends RcOptionalKeyType<infer W> ? W\n : T[K] extends RcObject ? RequiredKey<TypeOfObjectType<T[K]>>\n : never\n }>\n>\n\nexport type RcObjTypeReturn<T extends RcObject> = RcType<TypeOfObjectType<T>>\n\ntype RequiredKey<T> = { _required_key_: T }\n\ntype RequiredKeys<T extends object> = {\n [k in keyof T]: T[k] extends RequiredKey<any> ? k : never\n}[keyof T]\n\ntype AddQuestionMarks<\n T extends object,\n R extends keyof T = RequiredKeys<T>,\n> = Pick<Required<T>, R> & Partial<Omit<T, R>>\n\ntype Identity<T> = T\n\ntype Flatten<T> = Identity<{\n [k in keyof T]: T[k] extends RequiredKey<infer U> ? U : T[k]\n}>\n\nfunction unwrapToObjSchema(input: unknown): RcType<any> {\n if (isRcType(input)) {\n return input\n } else if (isObject(input)) {\n const objSchema: Record<string, RcType<any>> = {}\n\n for (const [key, value] of Object.entries(input)) {\n objSchema[key] = unwrapToObjSchema(value)\n }\n\n return rc_object(objSchema)\n } else if (Array.isArray(input)) {\n const [type, value] = input\n\n switch (type) {\n case 'optional':\n return unwrapToObjSchema(value).optional()\n case 'nullish_or':\n return unwrapToObjSchema(value).orNullish()\n case 'null_or':\n return unwrapToObjSchema(value).orNull()\n case 'array_of':\n return rc_array(unwrapToObjSchema(value))\n case 'loose_array_of':\n return rc_loose_array(unwrapToObjSchema(value))\n case 'optional_array_of':\n return rc_array(unwrapToObjSchema(value)).optional()\n case 'optional_loose_array_of':\n return rc_loose_array(unwrapToObjSchema(value)).optional()\n case 'null_or_array_of':\n return rc_array(unwrapToObjSchema(value)).orNull()\n case 'null_or_loose_array_of':\n return rc_loose_array(unwrapToObjSchema(value)).orNull()\n case 'nullish_or_array_of':\n return rc_array(unwrapToObjSchema(value)).orNullish()\n case 'nullish_or_loose_array_of':\n return rc_loose_array(unwrapToObjSchema(value)).orNullish()\n default:\n return type\n }\n }\n\n throw new Error(`invalid schema: ${input}`)\n}\n\nexport type ObjOptions = {\n normalizeKeysFrom?: 'snake_case'\n /** excess keys are not removed if extends is true */\n extends?: boolean\n}\n\n/**\n * Creates an object type validator with specified shape and options.\n * @param shape - The object shape defining the expected properties and their types\n * @param options - Configuration options for the object validator\n * @param options.normalizeKeysFrom - If 'snake_case', automatically converts camelCase keys to snake_case for lookup\n * @param options.extends - If true, allows excess properties in the input object\n * @returns A runcheck type that validates objects with the specified shape\n * @example\n * ```typescript\n * const userSchema = rc_object({\n * name: rc_string,\n * age: rc_number,\n * email: rc_string.optional()\n * })\n * const result = userSchema.parse({ name: 'John', age: 30 }) // valid\n * ```\n */\nexport function rc_object<T extends RcObject>(\n shape: T,\n { normalizeKeysFrom, extends: extendsObj }: ObjOptions = {},\n): RcObjTypeReturn<T> {\n const objShape: Record<string, RcType<any>> = {}\n\n for (const [key, value] of Object.entries(shape)) {\n objShape[key] = unwrapToObjSchema(value)\n }\n\n const shapeEntries = Object.entries(objShape).map(([key, type]) => {\n return { key, type }\n })\n\n return {\n ...defaultProps,\n _obj_shape_: objShape,\n _kind_: extendsObj ? 'extends_object' : 'object',\n _detailed_obj_shape_: '',\n _is_object_: true,\n _is_extend_obj_: !!extendsObj,\n _parse_(inputObj, ctx) {\n return parse<TypeOfObjectType<T>>(this, inputObj, ctx, () => {\n if (!isObject(inputObj)) {\n ctx.objErrKeyIndex_ = -1\n\n if (ctx.objErrShortCircuit_ && !this._detailed_obj_shape_) {\n return false\n }\n\n if (!this._detailed_obj_shape_) {\n let detailedObjShapeDescription = `${this._kind_}{ `\n let i = 0\n for (const { key, type } of shapeEntries) {\n if (detailedObjShapeDescription.length > 100) {\n detailedObjShapeDescription += `, ...`\n break\n }\n\n if (i !== 0) {\n detailedObjShapeDescription += `, `\n }\n\n detailedObjShapeDescription += `${key}: ${type._kind_}`\n i++\n }\n\n detailedObjShapeDescription += ` }`\n this._detailed_obj_shape_ = detailedObjShapeDescription\n }\n\n return {\n data: undefined,\n errors: [\n getWarningOrErrorWithPath(\n ctx,\n `Type '${normalizedTypeOf(inputObj, false)}' is not assignable to '${this._detailed_obj_shape_}'`,\n ),\n ],\n }\n }\n\n const isStrict = this._kind_ === 'strict_obj' || ctx.strictObj_\n\n const excessKeys =\n isStrict ? new Set<string>(Object.keys(inputObj)) : undefined\n\n if (excessKeys && excessKeys.size > shapeEntries.length) {\n ctx.objErrKeyIndex_ = -1\n const errors: ErrorWithPath[] = []\n\n if (ctx.objErrShortCircuit_) {\n return {\n data: undefined,\n errors: [\n getWarningOrErrorWithPath(\n ctx,\n `Expected strict object with ${shapeEntries.length} keys but got ${excessKeys.size}`,\n ),\n ],\n }\n }\n\n for (const { key } of shapeEntries) {\n if (!excessKeys.has(key)) {\n errors.push(\n getWarningOrErrorWithPath(ctx, `Key '${key}' is missing`),\n )\n } else {\n excessKeys.delete(key)\n }\n }\n\n for (const key of excessKeys) {\n errors.push(\n getWarningOrErrorWithPath(\n ctx,\n `Key '${key}' is not defined in the object shape`,\n ),\n )\n }\n\n return {\n data: undefined,\n errors,\n }\n }\n\n const resultObj: Record<any, string> = {} as any\n const resultErrors: ErrorWithPath[] = []\n\n const parentPath = ctx.path_\n\n let i = -1\n for (const shapeEntry of shapeEntries) {\n const key = shapeEntry.key\n const type = shapeEntry.type\n\n const typekey = key as keyof T\n i += 1\n\n const subPath =\n key === '' || key.includes(' ') ? `['${key}']` : `.${key}`\n\n const path = `${parentPath}${subPath}`\n\n ctx.path_ = path\n\n let input = inputObj[key]\n let keyToDeleteFromExcessKeys = key\n\n if (input === undefined && type._alternative_key_) {\n input = inputObj[type._alternative_key_]\n keyToDeleteFromExcessKeys = type._alternative_key_\n }\n\n if (input === undefined && normalizeKeysFrom === 'snake_case') {\n const snakeCaseKey = snakeCase(key)\n\n input = inputObj[snakeCaseKey]\n keyToDeleteFromExcessKeys = snakeCaseKey\n }\n\n excessKeys?.delete(keyToDeleteFromExcessKeys)\n\n const parseResult = type._parse_(input, ctx)\n\n if (parseResult.ok) {\n resultObj[typekey] = parseResult.data\n }\n //\n else {\n for (const subError of parseResult.errors) {\n ctx.path_ = path\n resultErrors.push(subError)\n }\n\n if (ctx.objErrShortCircuit_) {\n ctx.objErrKeyIndex_ = i\n break\n }\n }\n }\n\n if (excessKeys) {\n if (excessKeys.size > 0) {\n for (const key of excessKeys) {\n ctx.path_ = parentPath\n\n resultErrors.push(\n getWarningOrErrorWithPath(\n ctx,\n `Key '${key}' is not defined in the object shape`,\n ),\n )\n }\n }\n }\n\n if (resultErrors.length > 0) {\n return { errors: resultErrors, data: undefined }\n }\n\n ctx.path_ = parentPath\n\n if (this._is_extend_obj_) {\n return {\n errors: false,\n data: {\n ...(inputObj as any),\n ...(resultObj as any),\n },\n }\n }\n\n return { errors: false, data: resultObj as any }\n })\n },\n }\n}\n\ntype ExtendsOptions = Omit<ObjOptions, 'extends'>\n\n/**\n * Creates an object type that extends the input with additional properties.\n * Unlike strict objects, this allows excess properties from the input to be preserved.\n * @param shapeOrSchema - Either an object shape or an existing object type\n * @param options - Configuration options (excluding 'extends' which is always true)\n * @returns A runcheck type that validates and extends objects\n * @example\n * ```typescript\n * const baseSchema = rc_obj_extends({\n * name: rc_string\n * })\n * // Input: { name: 'John', extra: 'data' }\n * // Output: { name: 'John', extra: 'data' } (preserves extra properties)\n * ```\n */\nexport function rc_obj_extends<T extends RcObject>(\n shape: T,\n options?: ExtendsOptions,\n): RcObjTypeReturn<T>\nexport function rc_obj_extends<T extends Record<string, any>>(\n schema: RcType<T>,\n options?: ExtendsOptions,\n): RcType<T>\nexport function rc_obj_extends(\n shapeOrSchema: RcObject | RcType<Record<string, any>>,\n options?: ExtendsOptions,\n): RcType<Record<string, any>> {\n // If it's an existing RcType with object shape, use it directly\n if (isRcType(shapeOrSchema)) {\n if (!shapeOrSchema._obj_shape_) {\n throw new Error('rc_obj_extends: schema must be an object type')\n }\n\n return {\n ...shapeOrSchema,\n _kind_: `extends_object`,\n _is_extend_obj_: true,\n }\n }\n\n // Otherwise, treat it as a shape and create a new object\n return {\n ...rc_object(shapeOrSchema as any, options),\n _kind_: `extends_object`,\n _is_extend_obj_: true,\n }\n}\n\n/**\n * Extracts the object shape from an object type for inspection or manipulation.\n * @param type - The object type to extract the shape from\n * @returns The object shape containing the property types\n * @throws Error if the type is not an object type\n * @example\n * ```typescript\n * const userSchema = rc_object({ name: rc_string, age: rc_number })\n * const shape = rc_get_obj_shape(userSchema)\n * // shape = { name: RcType<string>, age: RcType<number> }\n * ```\n */\nexport function rc_get_obj_shape<T extends Record<string, any>>(\n type: RcType<T>,\n): {\n [K in keyof T]: RcType<T[K]>\n} {\n if (!type._obj_shape_) {\n throw new Error(`type does not have an object shape`)\n }\n\n return type._obj_shape_ as T\n}\n\n/**\n * Creates a strict object type that rejects input with excess properties.\n * @param shape - The object shape defining the expected properties and their types\n * @param options - Configuration options for the object validator\n * @returns A runcheck type that validates objects strictly (no excess properties allowed)\n * @example\n * ```typescript\n * const strictUser = rc_obj_strict({\n * name: rc_string,\n * age: rc_number\n * })\n * const result = strictUser.parse({ name: 'John', age: 30 }) // valid\n * const result2 = strictUser.parse({ name: 'John', age: 30, extra: 'data' }) // invalid\n * ```\n */\nexport function rc_obj_strict<T extends RcObject>(\n shape: T,\n options?: ObjOptions,\n): RcObjTypeReturn<T> {\n return {\n ...rc_object(shape, options),\n _kind_: `strict_obj`,\n }\n}\n\n/**\n * Enables strict object validation for a type, rejecting excess properties.\n * @param type - The type to make strict\n * @param options - Configuration options\n * @param options.nonRecursive - If true, only affects the immediate object type, not nested objects\n * @returns The type with strict object validation enabled\n * @example\n * ```typescript\n * const userSchema = rc_object({ name: rc_string, age: rc_number })\n * const strictUser = rc_enable_obj_strict(userSchema)\n * // Now rejects objects with excess properties\n * ```\n */\nexport function rc_enable_obj_strict<T extends RcType<any>>(\n type: T,\n {\n nonRecursive,\n }: {\n nonRecursive?: boolean\n } = {},\n): T {\n if (nonRecursive) {\n if (!type._obj_shape_) {\n throw new Error(\n `rc_enable_obj_strict: nonRecursive option can only be used on object types`,\n )\n }\n\n return {\n ...type,\n _kind_: `strict_obj`,\n }\n }\n\n return {\n ...type,\n _parse_(input, ctx) {\n const parentStrictObj = ctx.strictObj_\n ctx.strictObj_ = true\n const result = type._parse_(input, ctx)\n ctx.strictObj_ = parentStrictObj\n return result\n },\n }\n}\n\ntype AnyObj = Record<string, unknown>\n\ntype Extends<T extends AnyObj, W extends AnyObj> = Omit<T, keyof W> & W\n\n/**\n * Merges multiple object types into a single object type.\n * Later objects override properties from earlier objects.\n * @param objs - The object types to merge (2-4 objects supported)\n * @returns A runcheck type representing the merged object\n * @example\n * ```typescript\n * const base = rc_object({ name: rc_string, age: rc_number })\n * const extended = rc_object({ email: rc_string, age: rc_string }) // age overrides\n * const merged = rc_obj_merge(base, extended)\n * // Result: { name: string, age: string, email: string }\n * ```\n */\nexport function rc_obj_merge<A extends AnyObj, B extends AnyObj>(\n ...objs: [RcType<A>, RcType<B>]\n): RcType<Extends<A, B>>\nexport function rc_obj_merge<\n A extends AnyObj,\n B extends AnyObj,\n C extends AnyObj,\n>(...objs: [RcType<A>, RcType<B>, RcType<C>]): RcType<Extends<Extends<A, B>, C>>\nexport function rc_obj_merge<\n A extends AnyObj,\n B extends AnyObj,\n C extends AnyObj,\n D extends AnyObj,\n>(\n ...objs: [RcType<A>, RcType<B>, RcType<C>, RcType<D>]\n): RcType<Extends<Extends<Extends<A, B>, C>, D>>\nexport function rc_obj_merge(\n ...objs: RcType<Record<string, unknown>>[]\n): RcType<any> {\n const finalShape = {} as any\n\n for (const objShape of objs) {\n Object.assign(finalShape, objShape._obj_shape_)\n }\n\n return rc_object(finalShape)\n}\n\n/**\n * Creates a new object type with only the specified properties from the original.\n * @param obj - The object type to pick properties from\n * @param keys - The keys to pick from the object\n * @returns A runcheck type containing only the picked properties\n * @throws Error if the input is not an object type\n * @example\n * ```typescript\n * const userSchema = rc_object({ name: rc_string, age: rc_number, email: rc_string })\n * const nameAndAge = rc_obj_pick(userSchema, ['name', 'age'])\n * // Result: { name: string, age: number }\n * ```\n */\nexport function rc_obj_pick<O extends AnyObj, K extends keyof O>(\n obj: RcType<O>,\n keys: K[],\n): RcType<Pick<O, K>> {\n const shape = {} as any\n\n if (!obj._obj_shape_) {\n throw new Error('rc_obj_pick: obj must be an object type')\n }\n\n for (const key of keys) {\n const keyShape = obj._obj_shape_[key as string]\n if (keyShape) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n shape[key] = keyShape\n }\n }\n\n return rc_object(shape) as any\n}\n\n/**\n * Creates a new object type without the specified properties from the original.\n * @param obj - The object type to omit properties from\n * @param keys - The keys to omit from the object\n * @returns A runcheck type without the omitted properties\n * @throws Error if the input is not an object type\n * @example\n * ```typescript\n * const userSchema = rc_object({ name: rc_string, age: rc_number, email: rc_string })\n * const withoutEmail = rc_obj_omit(userSchema, ['email'])\n * // Result: { name: string, age: number }\n * ```\n */\nexport function rc_obj_omit<O extends AnyObj, K extends keyof O>(\n obj: RcType<O>,\n keys: K[],\n): RcType<Omit<O, K>> {\n const shape = {} as any\n\n if (!obj._obj_shape_) {\n throw new Error('rc_obj_omit: obj must be an object type')\n }\n\n for (const key of Object.keys(obj._obj_shape_)) {\n if (!(keys as any[]).includes(key)) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n shape[key] = obj._obj_shape_[key]\n }\n }\n\n return rc_object(shape) as any\n}\n\ntype ExpectedSchema<T> = (t: T) => T\n\ntype RcTypeWithSchemaEqualTo<T> = { __rc_type: ExpectedSchema<T> }\n\ntype StrictObjTypeToRcType<T> = {\n [K in keyof T]-?: StrictTypeToRcType<T[K]>\n}\n\ntype IsUnion<T, U extends T = T> =\n T extends unknown ?\n [U] extends [T] ?\n false\n : true\n : false\n\ntype StrictTypeToRcType<T> =\n [T] extends [(infer U)[]] ?\n | ['array_of' | 'loose_array_of', StrictTypeToRcType<U>]\n | RcTypeWithSchemaEqualTo<T>\n : [T] extends [(infer U)[] | undefined] ?\n | ['optional_array_of' | 'optional_loose_array_of', StrictTypeToRcType<U>]\n | RcTypeWithSchemaEqualTo<T>\n : [T] extends [(infer U)[] | null] ?\n | ['null_or_array_of' | 'null_or_loose_array_of', StrictTypeToRcType<U>]\n | RcTypeWithSchemaEqualTo<T>\n : [T] extends [(infer U)[] | undefined | null] ?\n | [\n 'nullish_or_array_of' | 'nullish_or_loose_array_of',\n StrictTypeToRcType<U>,\n ]\n | RcTypeWithSchemaEqualTo<T>\n : [T] extends [Record<string, any>] ?\n IsUnion<T> extends true ?\n RcTypeWithSchemaEqualTo<T>\n : StrictObjTypeToRcType<T> | RcTypeWithSchemaEqualTo<T>\n : [T] extends [Record<string, any> | null] ?\n ['null_or', StrictObjTypeToRcType<T>] | RcTypeWithSchemaEqualTo<T>\n : [T] extends [Record<string, any> | undefined] ?\n ['optional', StrictObjTypeToRcType<T>] | RcTypeWithSchemaEqualTo<T>\n : [T] extends [Record<string, any> | null | undefined] ?\n ['nullish_or', StrictObjTypeToRcType<T>] | RcTypeWithSchemaEqualTo<T>\n : RcTypeWithSchemaEqualTo<T>\n\nexport type StrictTypeToRcTypeBase<T extends Record<string, any>> = {\n [K in keyof T]-?: StrictTypeToRcType<T[K]>\n}\n\n/**\n * Creates a type-safe object builder that enforces the structure matches a TypeScript type.\n * Useful for creating schemas that must conform to existing TypeScript interfaces.\n * @returns A builder function that takes a schema matching the specified TypeScript type\n * @example\n * ```typescript\n * interface User {\n * name: string\n * age: number\n * email?: string\n * }\n *\n * const userBuilder = rc_obj_builder<User>()\n * const userSchema = userBuilder({\n * name: rc_string,\n * age: rc_number,\n * email: ['optional', rc_string]\n * })\n * ```\n */\nexport function rc_obj_builder<T extends Record<string, any>>() {\n return <S extends StrictTypeToRcTypeBase<T>>(\n schema: {\n [K in keyof S]: K extends keyof T ? S[K] : never\n },\n options?: ObjOptions,\n ): RcType<T> => {\n return rc_object(schema as any, options) as any\n }\n}\n","import {\n RcObject,\n StrictTypeToRcTypeBase,\n TypeOfObjectType,\n rc_object,\n} from './rc_object'\nimport {\n Prettify,\n RcBase,\n RcType,\n defaultProps,\n getWarningOrErrorWithPath,\n isObject,\n isRcType,\n normalizedTypeOf,\n parse,\n} from './runcheck'\n\n/**\n * Creates a discriminated union type validator.\n * Uses a discriminator key to determine which schema to validate against.\n * @param discriminatorKey - The property name used to discriminate between union members\n * @param types - An object mapping discriminator values to their corresponding schemas\n * @returns A runcheck type that validates discriminated union objects\n * @example\n * ```typescript\n * const shapeSchema = rc_discriminated_union('type', {\n * circle: { radius: rc_number },\n * rectangle: { width: rc_number, height: rc_number }\n * })\n *\n * const result1 = shapeSchema.parse({ type: 'circle', radius: 5 }) // valid\n * const result2 = shapeSchema.parse({ type: 'rectangle', width: 10, height: 20 }) // valid\n * const result3 = shapeSchema.parse({ type: 'triangle', sides: 3 }) // invalid - unknown discriminator\n * ```\n */\nexport function rc_discriminated_union<\n K extends string,\n T extends Record<string, RcObject | RcBase<any, any>>,\n>(\n discriminatorKey: K,\n types: T,\n): RcType<\n Prettify<\n {\n [P in keyof T]: {\n [Q in K]: P\n } & (T[P] extends RcType<infer U> ? U\n : T[P] extends RcObject ? TypeOfObjectType<T[P]>\n : never)\n }[keyof T]\n >\n> {\n const preComputedTypesShape = {} as Record<string, RcType<any>>\n\n for (const [key, type] of Object.entries(types)) {\n preComputedTypesShape[key] = isRcType(type) ? type : rc_object(type as any)\n }\n\n return {\n ...defaultProps,\n _kind_: `discriminated_union`,\n _is_object_: true,\n _parse_(input, ctx) {\n return parse<any>(this, input, ctx, () => {\n if (!isObject(input)) {\n ctx.objErrKeyIndex_ = -1\n return false\n }\n\n const discriminator = input[discriminatorKey]\n\n const parentPath = ctx.path_\n\n const type = preComputedTypesShape[discriminator]\n\n if (!type) {\n const invalidValueType = normalizedTypeOf(discriminator, true)\n\n return {\n errors: [\n getWarningOrErrorWithPath(\n { path_: `${parentPath}.${discriminatorKey}` },\n `Type '${invalidValueType}' is not a valid discriminator`,\n ),\n ],\n data: undefined,\n }\n }\n\n ctx.path_ = `${parentPath}|${discriminatorKey}: ${discriminator}|`\n\n const parseResult = type._parse_(input, ctx)\n\n ctx.path_ = parentPath\n\n if (!parseResult.ok) {\n return { errors: parseResult.errors, data: undefined }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n parseResult.data[discriminatorKey] = discriminator\n\n return { errors: false, data: parseResult.data }\n })\n },\n }\n}\n\ntype OmitDiscriminator<K, D extends Record<string, unknown>> =\n D extends any ? Omit<D, K & string> : never\n\n/**\n * Creates a type-safe discriminated union builder that enforces the structure matches a TypeScript type.\n * @param discriminatorKey - The property name used to discriminate between union members\n * @returns A builder function that takes a schema mapping matching the specified TypeScript discriminated union\n * @example\n * ```typescript\n * type Shape =\n * | { type: 'circle', radius: number }\n * | { type: 'rectangle', width: number, height: number }\n *\n * const shapeBuilder = rc_discriminated_union_builder<Shape, 'type'>('type')\n * const shapeSchema = shapeBuilder({\n * circle: { radius: rc_number },\n * rectangle: { width: rc_number, height: rc_number }\n * })\n * ```\n */\nexport function rc_discriminated_union_builder<\n D extends Record<string, unknown>,\n K extends keyof D,\n>(discriminatorKey: K) {\n return (schema: {\n [P in D[K] & string]: StrictTypeToRcTypeBase<\n OmitDiscriminator<K, D & { [Q in K]: P }>\n >\n }): RcType<D> => {\n return rc_discriminated_union(\n discriminatorKey as any,\n schema as any,\n ) as unknown as RcType<D>\n }\n}\n","import { RcType, defaultProps, parse } from './runcheck'\n\n/**\n * Creates an intersection type validator that requires input to satisfy all provided types.\n * For object types, merges the properties from all types.\n * For non-object types, input must be valid for all types simultaneously.\n * @param types - The types to intersect (2-4 types supported)\n * @returns A runcheck type representing the intersection of all input types\n * @example\n * ```typescript\n * const userBase = rc_object({ name: rc_string })\n * const userMeta = rc_object({ createdAt: rc_date })\n * const fullUser = rc_intersection(userBase, userMeta)\n * // Result: { name: string, createdAt: Date }\n * \n * const result = fullUser.parse({ name: 'John', createdAt: new Date() }) // valid\n * const result2 = fullUser.parse({ name: 'John' }) // invalid - missing createdAt\n * ```\n */\nexport function rc_intersection<A, B>(a: RcType<A>, b: RcType<B>): RcType<A & B>\nexport function rc_intersection<A, B, C>(\n a: RcType<A>,\n b: RcType<B>,\n c: RcType<C>,\n): RcType<A & B & C>\nexport function rc_intersection<A, B, C, D>(\n a: RcType<A>,\n b: RcType<B>,\n c: RcType<C>,\n d: RcType<D>,\n): RcType<A & B & C & D>\nexport function rc_intersection(...types: RcType<any>[]): RcType<any> {\n let kind = ''\n let allIsObject = true\n\n for (const type of types) {\n if (kind) {\n kind += ' & '\n }\n\n if (!type._is_object_) {\n allIsObject = false\n }\n\n kind += type._kind_.includes('|') ? `(${type._kind_})` : type._kind_\n }\n\n return {\n ...defaultProps,\n _kind_: kind,\n _is_object_: allIsObject,\n _parse_(input, ctx) {\n return parse(this, input, ctx, () => {\n let objResultData: Record<string, unknown> | null = null\n\n for (const type of types) {\n const result = type._parse_(input, ctx)\n\n if (!result.ok) {\n if (type._is_object_) {\n return result\n }\n\n return false\n } else {\n if (type._is_object_) {\n objResultData = { ...(objResultData || {}), ...result.data }\n }\n }\n }\n\n if (objResultData) {\n return {\n data: objResultData as any,\n errors: false,\n }\n }\n\n return true\n })\n },\n }\n}\n"],"mappings":"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","names":["runcheck_exports","__export","RcValidationError","defaultProps","getSchemaKind","getWarningOrErrorWithPath","isObject","isRcType","joinAsRcTypeUnion","normalizedTypeOf","parse","rc_any","rc_array","rc_array_filter_from_schema","rc_assert_is_valid","rc_boolean","rc_date","rc_default","rc_disable_loose_array","rc_discriminated_union","rc_discriminated_union_builder","rc_enable_obj_strict","rc_from_standard","rc_get_array_item_type","rc_get_from_key_as_fallback","rc_get_obj_shape","rc_instanceof","rc_intersection","rc_is_valid","rc_literals","rc_loose_array","rc_loose_parse","rc_loose_record","rc_narrow","rc_null","rc_nullish_default","rc_number","rc_obj_builder","rc_obj_extends","rc_obj_merge","rc_obj_omit","rc_obj_pick","rc_obj_strict","rc_object","rc_parse","rc_parse_json","rc_parser","rc_record","rc_recursive","rc_safe_fallback","rc_string","rc_to_standard","rc_transform","rc_tuple","rc_undefined","rc_union","rc_unknown","rc_unsafe_transform","rc_unwrap","rc_unwrap_or","rc_unwrap_or_null","rc_validator","snakeCase","__toCommonJS","rc_get_from_key_as_fallback","fallbackKey","type","_alternative_key_","unwrapToObjSchema","input","isRcType","isObject","objSchema","key","value","rc_object","rc_array","rc_loose_array","shape","normalizeKeysFrom","extendsObj","objShape","shapeEntries","defaultProps","_obj_shape_","_kind_","_detailed_obj_shape_","_is_object_","_is_extend_obj_","_parse_","inputObj","ctx","parse","objErrKeyIndex_","objErrShortCircuit_","detailedObjShapeDescription","i","getWarningOrErrorWithPath","normalizedTypeOf","excessKeys","strictObj_","errors","resultObj","resultErrors","parentPath","path_","shapeEntry","typekey","subPath","path","keyToDeleteFromExcessKeys","snakeCaseKey","snakeCase","parseResult","subError","rc_obj_extends","shapeOrSchema","options","rc_get_obj_shape","rc_obj_strict","rc_enable_obj_strict","nonRecursive","parentStrictObj","result","rc_obj_merge","objs","finalShape","rc_obj_pick","obj","keys","keyShape","rc_obj_omit","rc_obj_builder","schema","rc_discriminated_union","discriminatorKey","types","preComputedTypesShape","key","type","isRcType","rc_object","defaultProps","_kind_","_is_object_","_parse_","input","ctx","parse","isObject","objErrKeyIndex_","discriminator","parentPath","path_","invalidValueType","normalizedTypeOf","getWarningOrErrorWithPath","parseResult","rc_discriminated_union_builder","schema","rc_intersection","types","kind","allIsObject","type","_is_object_","_kind_","defaultProps","_parse_","input","ctx","parse","objResultData","result","getUndefined","withFallback","fallback","_fallback_","defaultMethod","defaultValue","rc_default","nullishDefaultMethod","rc_nullish_default","orMethod","schema","rc_union","parseMethod","input","options","rc_parse","parseJsonMethod","jsonString","rc_parse_json","getWarningOrErrorWithPath","ctx","message","path_","addWarning","warning","warnings_","addWarnings","warnings","parse","type","checkIfIsValid","_optional_","_orNullish_","_orNull_","isValid","noWarnings_","fb","getResultErrors","isFn","_useAutFix_","_autoFix_","autofixed","error","getErrorMsg","err","withAutofix","customAutofix","where","predicate","_parse_","result","predicateResult","_kind_","optional","normalizedTypeOf","_show_value_in_error_","orNull","orNullish","defaultProps","_array_item_type_","_predicate_","_alternative_key_","_obj_shape_","_detailed_obj_shape_","_is_object_","_is_extend_obj_","rc_undefined","rc_null","rc_any","rc_unknown","rc_boolean","rc_string","rc_number","rc_date","rc_instanceof","classToCheck","rc_literals","literals","literal","maxShallowObjErrors","types","kind","allIsObject","basePath","shallowObjErrors","shallowObjErrorsCount","hasNonObjTypeMember","nonShallowObjErrors","i","currentObjErrShortCircuit","objErrShortCircuit_","objErrKeyIndex_","parseResult","objErrIndex","getDefaultResult","rc_safe_fallback","rc_record","valueType","checkKey","looseCheck","inputObj","isObject","resultObj","resultErrors","parentPath","key","inputValue","subPath","path","errors","subError","rc_loose_record","checkArrayItems","_loose","useLooseMode","noLooseArray_","unique","looseErrors","arrayResult","uniqueValues","isTuple","index","_item","filterResult","uniqueValueToCheck","isUniqueKey","adjustedLooseErrors","itemError","newError","rc_array","rc_get_array_item_type","rc_disable_loose_array","nonRecursive","parentDisableLooseArray","rc_loose_array","rc_array_filter_from_schema","filterSchema","filterFn","item","rc_tuple","showWarnings","unwrap","RcValidationError","unwrapOr","unwrapOrNull","noWarnings","strictObj_","rc_parser","rc_loose_parse","rc_unwrap_or_null","rc_unwrap_or","rc_unwrap","rc_is_valid","rc_validator","rc_recursive","recursiveType","validateTransformOutput","outputSchema","disableStrictOutputSchema","parentObjErrShortCircuit","parentStrictObj","parentNoWarnings","rc_transform","transform","outputResultErrors","rc_narrow","narrow","rc_unsafe_transform","transformResult","showValueInError","typeOf","rc_assert_is_valid","value","snakeCase","str","word","parsed","isRcType","joinAsRcTypeUnion","getSchemaKind","rc_to_standard","schemaOrResult","errorOnWarnings","onWarnings","parseResultToStandard","rc_from_standard","standardSchema","standard","issue"]}
1
+ {"version":3,"sources":["../src/runcheck.ts","../src/rc_object.ts","../src/rc_discriminated_union.ts","../src/rc_intersection.ts"],"sourcesContent":["export {\n rc_discriminated_union,\n rc_discriminated_union_builder,\n} from './rc_discriminated_union'\nexport { rc_intersection } from './rc_intersection'\nexport {\n rc_enable_obj_strict,\n rc_get_from_key_as_fallback,\n rc_get_obj_shape,\n rc_obj_builder,\n rc_obj_extends,\n rc_obj_merge,\n rc_obj_omit,\n rc_obj_pick,\n rc_obj_strict,\n rc_object,\n} from './rc_object'\nimport { StandardSchemaV1 } from '@standard-schema/spec'\n\nexport type RcOkResult<T> = {\n /** @deprecated use errors instead */\n error: false\n errors: false\n ok: true\n /** @deprecated use value instead */\n data: T\n value: T\n warnings: string[] | false\n unwrap: () => T\n unwrapOr: (defaultValue: T) => T\n unwrapOrNull: () => T | null\n}\n\nexport type RcErrorResult<T> = {\n ok: false\n /** @deprecated use errors instead */\n error: true\n errors: string[]\n unwrap: () => T\n unwrapOr: (defaultValue: T) => T\n unwrapOrNull: () => T | null\n}\n\nexport type RcParseResult<T> = RcOkResult<T> | RcErrorResult<T>\n\nexport type RcInferType<T extends RcType<any>> =\n T extends RcType<infer U> ? U : never\n\ntype ParseResultCtx = {\n warnings_: string[]\n path_: string\n objErrShortCircuit_: boolean\n objErrKeyIndex_: number\n strictObj_: boolean\n noWarnings_: boolean\n noLooseArray_: boolean\n}\n\ntype InternalParseResult<T> =\n | { ok: true; data: T; errors: undefined }\n | { ok: false; errors: ErrorWithPath[]; data: undefined }\n\ntype WithFallback<T> = (\n fallback: T | ((invalidInput: unknown) => T),\n) => RcType<T>\n\nexport type AutoFixResult<T> =\n | false\n | { errors: string[]; safeFix?: undefined; fixed?: undefined }\n | {\n fixed: T\n errors?: undefined\n /** do not report autofix as warning */\n safeFix?: boolean\n }\n\ntype WithAutofix<T> = (\n customAutofix: (input: unknown) => AutoFixResult<T>,\n) => RcType<T>\n\ntype RemoveArrayNever<T> = T extends never[] ? never : T\n\nexport type RcOptionalKeyType<T> = RcBase<T, true>\n\nexport type RcType<T> = RcBase<T, false>\n\ntype Schema<T> = (t: T) => T\n\nexport type RcBase<T, RequiredKey extends boolean> = {\n __rc_type: Schema<T>\n readonly withFallback: WithFallback<T>\n readonly where: (\n predicate: (input: T) => boolean | { error: string },\n ) => RcType<T>\n /** RcType | undefined */\n readonly optional: () => RcType<T | undefined>\n /** { key?: RcType | undefined } */\n readonly optionalKey: () => RcOptionalKeyType<T | undefined>\n /** RcType | null */\n readonly orNull: () => RcType<T | null>\n /** RcType | null | undefined */\n readonly orNullish: () => RcType<T | null | undefined>\n readonly withAutofix: WithAutofix<T>\n readonly default: <D extends NotUndefined<T>>(\n defaultValue: D | (() => D),\n ) => RcType<NotUndefined<T> | RemoveArrayNever<D>>\n readonly nullishDefault: <D extends NotNullish<T>>(\n defaultValue: D | (() => D),\n ) => RcType<NotNullish<T> | RemoveArrayNever<D>>\n\n readonly or: <O>(schema: RcType<O>) => RcType<T | O>\n readonly parse: (input: unknown, options?: ParseOptions) => RcParseResult<T>\n readonly parseJson: (\n jsonString: string,\n options?: ParseOptions,\n ) => RcParseResult<T>\n\n // This should not be stripped out because it is used in type inference\n readonly _optional_key_?: RequiredKey\n /** @internal */\n readonly _parse_: (\n input: unknown,\n ctx: ParseResultCtx,\n ) => InternalParseResult<T>\n /** @internal */\n readonly _kind_: string\n /** @internal */\n readonly _fallback_: T | ((invalidInput: unknown) => T) | undefined\n /** @internal */\n readonly _optional_: boolean\n /** @internal */\n readonly _orNullish_: boolean\n /** @internal */\n readonly _orNull_: boolean\n /** @internal */\n readonly _useAutFix_: boolean\n /** @internal */\n readonly _is_extend_obj_: boolean\n /** @internal */\n readonly _is_object_: boolean\n /** @internal */\n readonly _array_item_type_: RcType<any> | undefined\n /** @internal */\n readonly _show_value_in_error_: boolean\n /** @internal */\n readonly _alternative_key_: string | undefined\n /** @internal */\n _detailed_obj_shape_: string | undefined\n /** @internal */\n readonly _obj_shape_: Record<string, RcType<any>> | undefined\n /** @internal */\n readonly _autoFix_: ((input: unknown) => AutoFixResult<T>) | undefined\n /** @internal */\n readonly _literal_values_: T[] | undefined\n}\n\nconst getUndefined = () => undefined\n\nfunction withFallback(this: RcType<any>, fallback: any): RcType<any> {\n return {\n ...this,\n _fallback_: fallback === undefined ? getUndefined : fallback,\n }\n}\n\nfunction defaultMethod<T>(\n this: RcType<T>,\n defaultValue: NotUndefined<T> | (() => NotUndefined<T>),\n): RcType<NotUndefined<T>> {\n return rc_default(this, defaultValue)\n}\n\nfunction nullishDefaultMethod<T>(\n this: RcType<T>,\n defaultValue: NotNullish<T> | (() => NotNullish<T>),\n): RcType<NotNullish<T>> {\n return rc_nullish_default(this, defaultValue)\n}\n\nfunction orMethod<T, O>(this: RcType<T>, schema: RcType<O>): RcType<T | O> {\n return rc_union(this, schema)\n}\n\nfunction parseMethod<T>(\n this: RcType<T>,\n input: unknown,\n options: ParseOptions,\n): RcParseResult<T> {\n return rc_parse(input, this, options)\n}\n\nfunction parseJsonMethod<T>(\n this: RcType<T>,\n jsonString: string,\n options: ParseOptions,\n): RcParseResult<T> {\n return rc_parse_json(jsonString, this, options)\n}\n\n/** @internal */\nexport type ErrorWithPath = string & { __withPath: true }\ntype ErrorWithoutPath = string & { __withPath?: never }\n\nexport function getWarningOrErrorWithPath(\n ctx: { path_: string },\n message: ErrorWithoutPath,\n): ErrorWithPath {\n return `${ctx.path_ ? `$${ctx.path_}: ` : ''}${message}` as ErrorWithPath\n}\n\nfunction addWarning(ctx: ParseResultCtx, warning: string) {\n ctx.warnings_.push(\n warning.startsWith('$') ? warning : getWarningOrErrorWithPath(ctx, warning),\n )\n}\n\nfunction addWarnings(ctx: ParseResultCtx, warnings: string[]) {\n warnings.forEach((warning) => addWarning(ctx, warning))\n}\n\ntype IsValid<T> =\n | boolean\n | { data: T; errors: false }\n | { data: undefined; errors: ErrorWithPath[] }\n\nexport function parse<T>(\n type: RcType<T>,\n input: unknown,\n ctx: ParseResultCtx,\n checkIfIsValid: () => IsValid<T>,\n): InternalParseResult<T> {\n if (type._optional_) {\n if (input === undefined) {\n return { ok: true, data: input as T, errors: undefined }\n }\n }\n\n if (type._orNullish_) {\n if (input === null || input === undefined) {\n return { ok: true, data: input as T, errors: undefined }\n }\n }\n\n if (type._orNull_) {\n if (input === null) {\n return { ok: true, data: input as T, errors: undefined }\n }\n }\n\n const isValid = checkIfIsValid()\n\n if (isValid) {\n if (isValid === true || !isValid.errors) {\n const validResult = isValid === true ? (input as T) : isValid.data\n\n return { ok: true, data: validResult, errors: undefined }\n }\n }\n\n if (!ctx.noWarnings_) {\n const fb = type._fallback_\n\n if (fb !== undefined) {\n addWarning(\n ctx,\n `Fallback used, errors -> ${getResultErrors(\n isValid,\n ctx,\n type,\n input,\n )}`,\n )\n\n return { ok: true, data: isFn(fb) ? fb(input) : fb, errors: undefined }\n }\n\n if (type._useAutFix_ && type._autoFix_) {\n const autofixed = type._autoFix_(input)\n\n if (autofixed) {\n if (!autofixed.safeFix) {\n addWarning(\n ctx,\n `Autofixed from error -> ${getResultErrors(\n isValid,\n ctx,\n type,\n input,\n )}`,\n )\n }\n\n if (autofixed.errors) {\n return {\n ok: false,\n data: undefined,\n errors: autofixed.errors.map((error) =>\n getWarningOrErrorWithPath(ctx, error),\n ),\n }\n }\n\n return { ok: true, data: autofixed.fixed, errors: undefined }\n }\n }\n }\n\n return {\n ok: false,\n data: undefined,\n errors:\n isValid ?\n isValid.errors\n : [getWarningOrErrorWithPath(ctx, getErrorMsg(type, input))],\n }\n}\n\nfunction getResultErrors(\n isValid: false | { errors: string[] },\n ctx: ParseResultCtx,\n type: RcType<any>,\n input: unknown,\n) {\n return isValid ?\n isValid.errors.map((err) => err.replace(ctx.path_, '')).join('; ')\n : getErrorMsg(type, input)\n}\n\nfunction withAutofix(\n this: RcType<any>,\n customAutofix: (input: unknown) => any,\n): RcType<any> {\n return {\n ...this,\n _useAutFix_: true,\n _autoFix_: customAutofix,\n }\n}\n\nfunction where(\n this: RcType<any>,\n predicate: (input: any) => boolean | { error: string },\n): RcType<any> {\n return {\n ...this,\n _parse_: (input, ctx) => {\n return parse(this, input, ctx, () => {\n const result = this._parse_(input, ctx)\n\n if (!result.ok) {\n return {\n errors: result.errors,\n data: undefined,\n }\n }\n\n const predicateResult = predicate(result.data)\n\n if (predicateResult !== true) {\n return {\n errors: [\n getWarningOrErrorWithPath(\n ctx,\n `Predicate failed${\n predicateResult === false ?\n ` for type '${this._kind_}'`\n : `: ${predicateResult.error}`\n }`,\n ),\n ],\n data: undefined,\n }\n }\n\n return { errors: false, data: result.data }\n })\n },\n }\n}\n\nfunction optional(this: RcType<any>): RcType<any> {\n return {\n ...this,\n _optional_: true,\n _kind_: `undefined | ${this._kind_}`,\n }\n}\n\nfunction getErrorMsg(type: RcType<any>, input: unknown): string {\n return `Type '${normalizedTypeOf(\n input,\n !!type._show_value_in_error_,\n )}' is not assignable to '${type._kind_}'`\n}\n\nfunction orNull(this: RcType<any>): RcType<any> {\n return {\n ...this,\n _orNull_: true,\n _kind_: `null | ${this._kind_}`,\n }\n}\n\nfunction orNullish(this: RcType<any>): RcType<any> {\n return {\n ...this,\n _orNullish_: true,\n _kind_: `null | undefined | ${this._kind_}`,\n }\n}\n\nexport const defaultProps: Omit<RcType<any>, '_parse_' | '_kind_'> = {\n __rc_type: undefined as any,\n withFallback,\n where,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment -- perf improvement to avoid polymorphic deoptimizations\n // @ts-ignore\n _parse_: undefined as any,\n _kind_: undefined as any,\n optional,\n optionalKey: optional as any,\n orNullish,\n withAutofix,\n orNull,\n default: defaultMethod as any,\n nullishDefault: nullishDefaultMethod as any,\n or: orMethod as any,\n parse: parseMethod as any,\n parseJson: parseJsonMethod as any,\n _array_item_type_: undefined,\n _fallback_: undefined,\n _predicate_: undefined,\n _optional_: false,\n _orNull_: false,\n _orNullish_: false,\n _useAutFix_: false,\n _show_value_in_error_: false,\n _alternative_key_: undefined,\n _autoFix_: undefined,\n _obj_shape_: undefined,\n _detailed_obj_shape_: undefined,\n _is_object_: false,\n _is_extend_obj_: false,\n}\n\n/** Equivalent to ts type: `undefined`. */\nexport const rc_undefined: RcType<undefined> = {\n ...(defaultProps as Omit<RcType<undefined>, '_parse_' | '_kind_'>),\n _parse_(input, ctx) {\n return parse(this, input, ctx, () => input === undefined)\n },\n _kind_: 'undefined',\n}\n\n/** Equivalent to ts type: `null`. */\nexport const rc_null: RcType<null> = {\n ...(defaultProps as Omit<RcType<null>, '_parse_' | '_kind_'>),\n _parse_(input, ctx) {\n return parse(this, input, ctx, () => input === null)\n },\n _kind_: 'null',\n}\n\n/** Equivalent to ts type: `any`. */\nexport const rc_any: RcType<any> = {\n ...defaultProps,\n _parse_(input) {\n return { ok: true, data: input, errors: undefined }\n },\n _kind_: 'any',\n}\n\n/** Equivalent to ts type: `unknown`. */\nexport const rc_unknown: RcType<unknown> = {\n ...defaultProps,\n _parse_(input) {\n return { ok: true, data: input, errors: undefined }\n },\n _kind_: 'unknown',\n}\n\n/** Equivalent to ts type: `boolean`. */\nexport const rc_boolean: RcType<boolean> = {\n ...defaultProps,\n _parse_(input, ctx) {\n return parse(this, input, ctx, () => typeof input === 'boolean')\n },\n _kind_: 'boolean',\n}\n\n/** Equivalent to ts type: `string`. */\nexport const rc_string: RcType<string> = {\n ...defaultProps,\n _parse_(input, ctx) {\n return parse(this, input, ctx, () => typeof input === 'string')\n },\n _kind_: 'string',\n}\n\n/** Equivalent to ts type: `number`. Excludes `NaN`. */\nexport const rc_number: RcType<number> = {\n ...defaultProps,\n _parse_(input, ctx) {\n return parse(\n this,\n input,\n ctx,\n () => typeof input === 'number' && !Number.isNaN(input),\n )\n },\n _kind_: 'number',\n}\n\n/** Equivalent to ts type: `Date`. Excludes invalid dates. */\nexport const rc_date: RcType<Date> = {\n ...defaultProps,\n _parse_(input, ctx) {\n return parse(this, input, ctx, () => {\n return (\n typeof input === 'object' &&\n input instanceof Date &&\n !Number.isNaN(input.getTime())\n )\n })\n },\n _kind_: 'date',\n}\n\n/** Validates class instances using `instanceof` checks.\n *\n * @example\n * ```typescript\n * const userSchema = rc_instanceof(User) // schema is equivalent to `User` type\n * const result = userSchema.parse(new User('John', 30)) // valid\n * const result2 = userSchema.parse(new Admin('John', 30)) // invalid\n * ```\n */\nexport function rc_instanceof<T extends new (...args: any[]) => any>(\n classToCheck: T,\n): RcType<InstanceType<T>> {\n return {\n ...defaultProps,\n _parse_(input, ctx) {\n return parse(this, input, ctx, () => {\n return input instanceof classToCheck\n })\n },\n _kind_: `instanceof_${classToCheck.name || 'AnonymousClass'}`,\n }\n}\n\ntype LiteralType = string | number | boolean\n\n/** Validates literal values like `'hello' | true | 1`. */\nexport function rc_literals<T extends LiteralType[]>(\n ...literals: T\n): RcType<T[number]>\nexport function rc_literals<const T extends readonly LiteralType[]>(\n literals: T,\n): RcType<T[number]>\nexport function rc_literals(\n ...args: LiteralType[] | [LiteralType[]]\n): RcType<LiteralType> {\n const literals: LiteralType[] =\n Array.isArray(args[0]) ? args[0] : (args as LiteralType[])\n\n if (literals.length === 0) {\n throw new Error('rc_literal requires at least one literal')\n }\n\n return {\n ...defaultProps,\n _parse_(input, ctx) {\n return parse(this, input, ctx, () => {\n for (const literal of literals) {\n if (input === literal) {\n return true\n }\n }\n\n return false\n })\n },\n _show_value_in_error_: true,\n _literal_values_: literals,\n _kind_:\n literals.length == 1 ?\n normalizedTypeOf(literals[0], true)\n : literals.map((literal) => normalizedTypeOf(literal, true)).join(' | '),\n }\n}\n\n/**\n * Get the values of a literal type.\n * @param type - The literal type to get the values of\n * @returns The values of the literal type\n */\nexport function rc_get_literal_values<T>(type: RcType<T>): T[] {\n if (!type._literal_values_) {\n throw new Error('Type is not a literal type')\n }\n\n return type._literal_values_\n}\n\nconst maxShallowObjErrors = 1\n\n/** Validates union types like `string | number`. */\nexport function rc_union<T extends RcType<any>[]>(\n ...types: T\n): RcType<RcInferType<T[number]>> {\n if (types.length === 0) {\n throw new Error('Unions should have at least one type')\n }\n\n let kind = ''\n let allIsObject = false\n\n for (const type of types) {\n if (kind) {\n kind += ' | '\n }\n\n kind += type._kind_\n\n if (!allIsObject && type._is_object_) {\n allIsObject = true\n }\n }\n\n return {\n ...defaultProps,\n _kind_: kind,\n _is_object_: allIsObject,\n _parse_(input, ctx) {\n return parse(this, input, ctx, () => {\n const basePath = ctx.path_\n const shallowObjErrors: ErrorWithPath[] = []\n let shallowObjErrorsCount = 0\n let hasNonObjTypeMember = false\n const nonShallowObjErrors: ErrorWithPath[] = []\n\n let i = 0\n for (const type of types) {\n i += 1\n\n if (type._is_object_) {\n ctx.path_ = `${basePath}|union ${i}|`\n }\n\n const currentObjErrShortCircuit = ctx.objErrShortCircuit_\n ctx.objErrShortCircuit_ = true\n ctx.objErrKeyIndex_ = 0\n\n const parseResult = type._parse_(input, ctx)\n\n const objErrIndex = ctx.objErrKeyIndex_\n\n ctx.objErrShortCircuit_ = currentObjErrShortCircuit\n ctx.objErrKeyIndex_ = 0\n\n if (parseResult.ok) {\n return { data: parseResult.data, errors: false }\n } else if (type._is_object_ && objErrIndex !== -1) {\n if (objErrIndex > 0) {\n nonShallowObjErrors.push(...parseResult.errors)\n } else {\n if (shallowObjErrorsCount < maxShallowObjErrors) {\n shallowObjErrors.push(...parseResult.errors)\n }\n\n shallowObjErrorsCount += 1\n }\n } else {\n hasNonObjTypeMember = true\n }\n }\n\n ctx.path_ = basePath\n\n if (nonShallowObjErrors.length > 0 || shallowObjErrors.length > 0) {\n if (\n shallowObjErrorsCount > maxShallowObjErrors ||\n hasNonObjTypeMember\n ) {\n shallowObjErrors.push(\n getWarningOrErrorWithPath(\n ctx,\n 'not matches any other union member',\n ),\n )\n }\n\n return {\n errors: [...nonShallowObjErrors, ...shallowObjErrors],\n data: undefined,\n }\n }\n\n return false\n })\n },\n }\n}\n\ntype NotUndefined<T> = Exclude<T, undefined>\n\n/** Generate a schema with valid fallback value for undefined inputs */\n/** Provides default value for `undefined` inputs. */\nexport function rc_default<T>(\n schema: RcType<T>,\n defaultValue: NotUndefined<T> | (() => NotUndefined<T>),\n): RcType<NotUndefined<T>> {\n return {\n ...(schema as unknown as RcType<NotUndefined<T>>),\n _optional_: false,\n _orNullish_: false,\n _orNull_: false,\n _parse_(input, ctx) {\n return parse(this, input, ctx, () => {\n if (input === undefined) {\n return getDefaultResult()\n }\n\n const parseResult = schema._parse_(input, ctx)\n\n if (parseResult.ok) {\n if (parseResult.data === undefined) {\n return getDefaultResult()\n }\n\n return { data: parseResult.data as NotUndefined<T>, errors: false }\n } else {\n return { data: undefined, errors: parseResult.errors }\n }\n })\n },\n _kind_: `${schema._kind_}_default`,\n }\n\n function getDefaultResult(): IsValid<NotUndefined<T>> {\n return {\n data: isFn(defaultValue) ? defaultValue() : defaultValue,\n errors: false,\n }\n }\n}\n\ntype NotNullish<T> = Exclude<T, null | undefined>\n\n/** Provides default value for `null | undefined` inputs. */\nexport function rc_nullish_default<T>(\n schema: RcType<T>,\n defaultValue: NotNullish<T> | (() => NotNullish<T>),\n): RcType<NotNullish<T>> {\n return {\n ...(schema as unknown as RcType<NotNullish<T>>),\n _optional_: false,\n _orNullish_: false,\n _orNull_: false,\n _parse_(input, ctx) {\n return parse(this, input, ctx, () => {\n if (input === null || input === undefined) {\n return getDefaultResult()\n }\n\n const parseResult = schema._parse_(input, ctx)\n\n if (parseResult.ok) {\n if (parseResult.data === null || parseResult.data === undefined) {\n return getDefaultResult()\n }\n\n return { data: parseResult.data as NotNullish<T>, errors: false }\n } else {\n return { data: undefined, errors: parseResult.errors }\n }\n })\n },\n _kind_: `${schema._kind_}_nullish_default`,\n }\n\n function getDefaultResult(): IsValid<NotNullish<T>> {\n return {\n data: isFn(defaultValue) ? defaultValue() : defaultValue,\n errors: false,\n }\n }\n}\n\n/** returns a fallback in case of wrong inputs without adding a warning */\n/** Provides fallback value for invalid inputs without warnings. */\nexport function rc_safe_fallback<T>(\n schema: RcType<T>,\n fallback: NoInfer<T> | (() => NoInfer<T>),\n): RcType<T> {\n return {\n ...(schema as unknown as RcType<T>),\n _parse_(input, ctx) {\n return parse(this, input, ctx, () => {\n const parseResult = schema._parse_(input, ctx)\n\n if (parseResult.ok) {\n return { data: parseResult.data, errors: false }\n }\n\n return { data: isFn(fallback) ? fallback() : fallback, errors: false }\n })\n },\n }\n}\n\n/** Validates `Record<string, T>`. Supports key validation and loose checking. */\nexport function rc_record<V>(\n valueType: RcType<V>,\n {\n checkKey,\n looseCheck,\n }: { checkKey?: (key: string) => boolean; looseCheck?: boolean } = {},\n): RcType<Record<string, V>> {\n return {\n ...defaultProps,\n _kind_: `record<string, ${valueType._kind_}>`,\n _is_object_: true,\n _parse_(inputObj, ctx) {\n return parse<Record<string, V>>(this, inputObj, ctx, () => {\n if (!isObject(inputObj)) return false\n\n const resultObj: Record<any, string> = {} as any\n const resultErrors: ErrorWithPath[] = []\n\n const parentPath = ctx.path_\n\n for (const [key, inputValue] of Object.entries(inputObj)) {\n const subPath =\n key === '' || key.includes(' ') ? `['${key}']` : `.${key}`\n\n const path = `${parentPath}${subPath}`\n ctx.path_ = path\n\n if (checkKey && !checkKey(key)) {\n resultErrors.push(\n getWarningOrErrorWithPath(ctx, `Key '${key}' is not allowed`),\n )\n continue\n }\n\n const input = inputObj[key]\n\n const parseResult = valueType._parse_(inputValue, ctx)\n\n if (parseResult.ok) {\n resultObj[key] = input\n }\n //\n else {\n const errors = parseResult.errors\n\n for (const subError of errors) {\n resultErrors.push(subError)\n }\n\n if (ctx.objErrShortCircuit_) {\n break\n }\n }\n }\n\n if (resultErrors.length > 0) {\n if (looseCheck) {\n addWarnings(ctx, resultErrors)\n } else {\n return { errors: resultErrors, data: undefined }\n }\n }\n\n ctx.path_ = parentPath\n\n return { errors: false, data: resultObj as any }\n })\n },\n }\n}\n\n/** instead of returning a general error, rejects invalid keys and returns warnings for these items */\n/** Validates `Record<string, T>`. Filters out invalid values instead of rejecting. */\nexport function rc_loose_record<V>(\n valueType: RcType<V>,\n { checkKey }: { checkKey?: (key: string) => boolean } = {},\n): RcType<Record<string, V>> {\n return rc_record(valueType, { checkKey, looseCheck: true })\n}\n\nfunction checkArrayItems(\n this: RcType<any>,\n input: any[],\n types: RcType<any> | readonly RcType<any>[],\n ctx: ParseResultCtx,\n _loose = false,\n options?: ArrayOptions<RcType<any>>,\n): IsValid<any[]> {\n const useLooseMode = _loose && !ctx.noWarnings_ && !ctx.noLooseArray_\n const unique = options?.unique\n\n const looseErrors: [err: ErrorWithPath[], path: string][] = []\n const arrayResult: any[] = []\n const uniqueValues = unique ? new Set<any>() : undefined\n\n const parentPath = ctx.path_\n\n const isTuple = Array.isArray(types)\n\n let index = -1\n for (const _item of input) {\n index++\n\n const type: RcType<any> = isTuple ? types[index] : types\n\n const subPath = `[${index}]`\n\n const path = `${parentPath}${subPath}`\n\n ctx.path_ = path\n\n if (options?.filter) {\n const filterResult = options.filter(_item)\n\n if (typeof filterResult === 'boolean') {\n if (!filterResult) {\n continue\n }\n } else if ('errors' in filterResult) {\n if (!useLooseMode) {\n return { errors: filterResult.errors, data: undefined }\n } else {\n looseErrors.push([filterResult.errors, path])\n continue\n }\n }\n\n ctx.path_ = path\n }\n\n let parseResult = type._parse_(_item, ctx)\n\n ctx.path_ = path\n\n if (parseResult.ok && uniqueValues) {\n let uniqueValueToCheck = parseResult.data\n\n const isUniqueKey = typeof unique === 'string'\n\n if (isUniqueKey) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n uniqueValueToCheck = parseResult.data[unique]\n } else if (typeof unique === 'function') {\n uniqueValueToCheck = unique(parseResult.data)\n }\n\n if (uniqueValues.has(uniqueValueToCheck)) {\n if (isUniqueKey) {\n ctx.path_ = `${parentPath}${subPath}.${unique}`\n }\n\n parseResult = {\n ok: false,\n data: undefined,\n errors: [\n getWarningOrErrorWithPath(\n ctx,\n isUniqueKey ?\n `Type '${type._obj_shape_?.[unique]?._kind_}' with value \"${uniqueValueToCheck}\" is not unique`\n : typeof unique === 'function' ?\n `Type '${type._kind_}' unique fn return with value \"${uniqueValueToCheck}\" is not unique`\n : `${type._kind_} value is not unique`,\n ),\n ],\n }\n } else {\n uniqueValues.add(uniqueValueToCheck)\n }\n }\n\n if (!parseResult.ok) {\n if (!useLooseMode) {\n return {\n errors: parseResult.errors,\n data: undefined,\n }\n } else {\n looseErrors.push([parseResult.errors, path])\n continue\n }\n } else {\n arrayResult.push(parseResult.data)\n }\n }\n\n if (looseErrors.length > 0) {\n const adjustedLooseErrors: ErrorWithPath[] = []\n\n for (const [errors, path] of looseErrors) {\n for (const err of errors) {\n let itemError = err.slice(path.length + 1)\n\n if (itemError.startsWith(': ')) {\n itemError = itemError.slice(2)\n }\n\n if (itemError.startsWith('.') || itemError.startsWith('[')) {\n itemError = `#${itemError}`\n }\n\n const newError = `$${path}: Rejected, error -> ${itemError}`\n\n adjustedLooseErrors.push(newError as ErrorWithPath)\n }\n\n addWarnings(ctx, adjustedLooseErrors)\n }\n }\n\n return { errors: false, data: arrayResult }\n}\n\ntype ArrayOptions<T extends RcType<any>> = {\n unique?: RcInferType<T> extends Record<string, any> ?\n keyof RcInferType<T> | ((parsedItem: RcInferType<T>) => any)\n : boolean | ((parsedItem: RcInferType<T>) => any)\n filter?: (item: RcInferType<T>) => boolean | { errors: ErrorWithPath[] }\n}\n\n/** Validates arrays of type `T[]`. Supports unique value checking. */\nexport function rc_array<T extends RcType<any>>(\n type: T,\n options?: ArrayOptions<T>,\n): RcType<RcInferType<T>[]> {\n return {\n ...defaultProps,\n _kind_: `${type._kind_}[]`,\n _array_item_type_: type,\n _parse_(input, ctx) {\n return parse(this, input, ctx, () => {\n if (!Array.isArray(input)) return false\n\n if (input.length === 0) return true\n\n return checkArrayItems.call(this, input, type, ctx, false, options)\n })\n },\n }\n}\n\n/**\n * Extracts the item type from an array type.\n * @param type - The array type to extract the item type from\n * @returns The item type of the array\n * @example\n * ```typescript\n * const stringArray = rc_array(rc_string)\n * const itemType = rc_get_array_item_type(stringArray) // rc_string\n * ```\n */\nexport function rc_get_array_item_type<T>(type: RcType<T[]>): RcType<T> {\n if (!type._array_item_type_) {\n throw new Error(`Type does not have an item type`)\n }\n\n return type._array_item_type_\n}\n\n/**\n * Disables loose array validation for a type.\n * @param type - The type to modify\n * @param options - Configuration options\n * @param options.nonRecursive - If true, only affects the immediate array type\n * @returns The modified type with loose array validation disabled\n * @example\n * ```typescript\n * const strictArray = rc_disable_loose_array(rc_array(rc_string))\n * ```\n */\nexport function rc_disable_loose_array<T extends RcType<any>>(\n type: T,\n { nonRecursive = false }: { nonRecursive?: boolean } = {},\n): T {\n if (nonRecursive) {\n if (!type._kind_.endsWith('[]')) {\n throw new Error(\n `rc_disable_loose_array: nonRecursive option can only be used with array types`,\n )\n }\n\n return {\n ...type,\n _parse_(input, ctx) {\n return parse(this, input, ctx, () => {\n if (!Array.isArray(input)) return false\n\n if (input.length === 0) return true\n\n return checkArrayItems.call(this, input, type, ctx, false)\n })\n },\n }\n }\n\n return {\n ...type,\n _parse_(input, ctx) {\n const parentDisableLooseArray = ctx.noLooseArray_\n\n ctx.noLooseArray_ = true\n const result = type._parse_(input, ctx)\n ctx.noLooseArray_ = parentDisableLooseArray\n\n return result\n },\n }\n}\n\n/** instead of returning a general error, rejects invalid array items and returns warnings for these items */\n/** Validates arrays of type `T[]`. Filters out invalid elements instead of rejecting the array. */\nexport function rc_loose_array<T extends RcType<any>>(\n type: T,\n options?: ArrayOptions<T>,\n): RcType<RcInferType<T>[]> {\n return {\n ...defaultProps,\n _array_item_type_: type,\n _kind_: `${type._kind_}[]`,\n _parse_(input, ctx) {\n return parse(this, input, ctx, () => {\n if (!Array.isArray(input)) return false\n\n if (input.length === 0) return true\n\n return checkArrayItems.call(this, input, type, ctx, true, options)\n })\n },\n }\n}\n\n/**\n * Creates an array validator with schema-based filtering.\n * @param filterSchema - The schema to validate items before filtering\n * @param filterFn - The function to determine if validated items should be included\n * @param type - The type to validate for included array elements\n * @param options - Configuration options\n * @returns A runcheck type that validates and filters arrays based on the schema\n * @example\n * ```typescript\n * const evenNumbers = rc_array_filter_from_schema(\n * rc_number,\n * (n) => n % 2 === 0,\n * rc_number\n * )\n * const result = evenNumbers.parse([1, 2, 3, 4]) // returns [2, 4]\n * ```\n */\nexport function rc_array_filter_from_schema<B, T>(\n filterSchema: RcType<B>,\n filterFn: (item: B) => boolean,\n type: RcType<T>,\n options?: Omit<ArrayOptions<RcType<any>>, 'filter'> & {\n loose?: boolean\n },\n): RcType<T[]> {\n return {\n ...defaultProps,\n _array_item_type_: type,\n _kind_: `${type._kind_}[]`,\n _parse_(input, ctx) {\n return parse(this, input, ctx, () => {\n if (!Array.isArray(input)) return false\n\n if (input.length === 0) return true\n\n return checkArrayItems.call(this, input, type, ctx, options?.loose, {\n ...options,\n filter(item) {\n const filterResult = filterSchema._parse_(item, ctx)\n\n if (!filterResult.ok) {\n return { errors: filterResult.errors }\n }\n\n return filterFn(filterResult.data)\n },\n })\n })\n },\n }\n}\n\ntype MapTupleToTypes<T extends readonly [...any[]]> = {\n -readonly [K in keyof T]: RcInferType<T[K]>\n}\n\n/**\n * Check for a tuple of types\n *\n * TS equivalent example: [string, number, boolean]\n */\n/** Validates tuples like `[T, T]` with fixed length. */\nexport function rc_tuple<const T extends readonly RcType<any>[]>(\n types: T,\n): RcType<MapTupleToTypes<T>> {\n return {\n ...defaultProps,\n _kind_: `[${types.map((type) => type._kind_).join(', ')}]`,\n _parse_(input, ctx) {\n return parse(this, input, ctx, () => {\n if (!Array.isArray(input)) return false\n\n if (input.length !== types.length) return false\n\n return checkArrayItems.call(this, input, types, ctx) as boolean\n })\n },\n }\n}\n\ntype ParseOptions = {\n /** ignore fallback and autofix */\n noWarnings?: boolean\n}\n\nfunction showWarnings(result: RcOkResult<any>) {\n if (result.warnings && result.warnings.length > 0) {\n console.warn(`Unwrap warnings: ${result.warnings.join('\\n')}`)\n }\n}\n\nfunction unwrap(this: RcParseResult<any>) {\n if (this.errors) {\n throw new RcValidationError(this.errors)\n }\n\n showWarnings(this)\n\n return this.value\n}\n\nfunction unwrapOr(this: RcParseResult<any>, defaultValue: any) {\n if (this.errors) {\n return defaultValue\n }\n\n showWarnings(this)\n\n return this.value\n}\n\nfunction unwrapOrNull(this: RcParseResult<any>) {\n if (this.errors) {\n return null\n }\n\n showWarnings(this)\n\n return this.value\n}\n\n/**\n * Parse a runcheck type. If valid return the valid input, with warning for autofix\n * and fallback, or the errors if invalid\n */\n/**\n * Parses and validates input against a runcheck type schema.\n * @param input - The input value to validate\n * @param type - The runcheck type schema to validate against\n * @param options - Parse options\n * @param options.noWarnings - If true, disables fallback and autofix warnings\n * @returns The parse result containing either the validated value or errors\n * @example\n * ```typescript\n * const result = rc_parse('hello', rc_string)\n * if (result.ok) {\n * console.log(result.value) // 'hello'\n * } else {\n * console.log(result.errors) // validation errors\n * }\n * ```\n */\nexport function rc_parse<S>(\n input: any,\n type: RcType<S>,\n { noWarnings = false }: ParseOptions = {},\n): RcParseResult<S> {\n const ctx: ParseResultCtx = {\n warnings_: [],\n path_: '',\n objErrShortCircuit_: false,\n objErrKeyIndex_: 0,\n noWarnings_: noWarnings,\n strictObj_: false,\n noLooseArray_: false,\n }\n\n const parseResult = type._parse_(input, ctx)\n\n if (parseResult.ok) {\n return {\n error: false,\n errors: false,\n ok: true,\n data: parseResult.data,\n value: parseResult.data,\n warnings: ctx.warnings_.length > 0 ? ctx.warnings_ : false,\n unwrap,\n unwrapOr,\n unwrapOrNull,\n }\n }\n\n return {\n ok: false,\n error: true,\n errors: parseResult.errors,\n unwrap,\n unwrapOr,\n unwrapOrNull,\n }\n}\n\nexport type RcParser<T> = (input: any) => RcParseResult<T>\n\n/** create a reusable parser for a certain type */\n/**\n * Creates a reusable parser function for a runcheck type.\n * @param type - The runcheck type to create a parser for\n * @returns A parser function that can be called with input values\n * @example\n * ```typescript\n * const parseString = rc_parser(rc_string)\n * const result1 = parseString('hello')\n * const result2 = parseString(123)\n * ```\n */\nexport function rc_parser<S>(type: RcType<S>): RcParser<S> {\n return (input: any) => rc_parse(input, type)\n}\n\n/** @deprecated use rc_unwrap_or_null instead */\nexport function rc_loose_parse<S>(\n input: any,\n type: RcType<S>,\n options?: ParseOptions,\n): { data: S | null; errors: string[] | false; warnings: string[] | false } {\n const result = rc_parse(input, type, options)\n\n if (result.errors) {\n return {\n data: null,\n errors: result.errors,\n warnings: false,\n }\n }\n\n return { data: result.value, errors: false, warnings: result.warnings }\n}\n\n/** @deprecated use rc_parse(...).unwrapOrNull() instead */\nexport function rc_unwrap_or_null<R>(result: RcParseResult<R>): {\n value: R | null\n errors: string[] | false\n warnings: string[] | false\n} {\n return rc_unwrap_or(result, null)\n}\n\n/** @deprecated use rc_parse(...).unwrapOr(defaultValue) instead */\nexport function rc_unwrap_or<R, F = NoInfer<R>>(\n result: RcParseResult<R>,\n fallback: F,\n): {\n value: R | F\n errors: string[] | false\n warnings: string[] | false\n} {\n if (result.error) {\n return {\n value: fallback,\n errors: result.errors,\n warnings: false,\n }\n }\n\n return { value: result.value, errors: false, warnings: result.warnings }\n}\n\nexport class RcValidationError extends Error {\n name = 'RcValidationError'\n\n constructor(public readonly errors: string[]) {\n super(errors.join('\\n'))\n }\n}\n\n/** @deprecated use rc_parse(...).unwrap() instead */\nexport function rc_unwrap<R>(result: RcParseResult<R>): {\n value: R\n warnings: string[] | false\n} {\n if (result.errors) {\n throw new RcValidationError(result.errors)\n }\n\n return result\n}\n\n/**\n * Type guard function that checks if input is valid for a given type.\n * @param input - The input value to validate\n * @param type - The runcheck type to validate against\n * @returns True if input is valid, false otherwise (with type narrowing)\n * @example\n * ```typescript\n * if (rc_is_valid(input, rc_string)) {\n * // input is now typed as string\n * console.log(input.toUpperCase())\n * }\n * ```\n */\nexport function rc_is_valid<S>(input: any, type: RcType<S>): input is S {\n const ctx: ParseResultCtx = {\n warnings_: [],\n path_: '',\n objErrShortCircuit_: false,\n objErrKeyIndex_: 0,\n noWarnings_: false,\n strictObj_: false,\n noLooseArray_: false,\n }\n\n return type._parse_(input, ctx).ok\n}\n\n/**\n * Creates a validator function that acts as a type guard.\n * @param type - The runcheck type to create a validator for\n * @returns A validator function that can be used as a type guard\n * @example\n * ```typescript\n * const isString = rc_validator(rc_string)\n * if (isString(input)) {\n * // input is now typed as string\n * console.log(input.length)\n * }\n * ```\n */\nexport function rc_validator<S>(type: RcType<S>) {\n return (input: any): input is S => rc_is_valid(input, type)\n}\n\n/**\n * Creates a recursive type definition for self-referencing data structures.\n * @param type - A function that returns the recursive type definition\n * @returns A runcheck type that can handle recursive structures\n * @example\n * ```typescript\n * type TreeNode = {\n * value: string\n * children?: TreeNode[]\n * }\n *\n * const TreeNode: RcType<TreeNode> = rc_recursive(() =>\n * rc_object({\n * value: rc_string,\n * children: rc_array(TreeNode).optional(),\n * })\n * )\n * ```\n */\nexport function rc_recursive<T extends RcBase<any, any>>(type: () => T): T {\n let recursiveType: { -readonly [K in keyof T]: T[K] } | undefined = undefined\n\n return {\n ...defaultProps,\n _kind_: 'recursive',\n _parse_(input, ctx) {\n if (!recursiveType) {\n recursiveType = {\n ...type(),\n }\n\n if (this._optional_) {\n recursiveType._optional_ = this._optional_\n }\n\n if (this._orNullish_) {\n recursiveType._orNullish_ = this._orNullish_\n }\n\n if (this._orNull_) {\n recursiveType._orNull_ = this._orNull_\n }\n\n if (this._autoFix_) {\n recursiveType._autoFix_ = this._autoFix_\n }\n\n if (this._fallback_) {\n recursiveType._fallback_ = this._fallback_\n }\n\n if (this._alternative_key_) {\n recursiveType._alternative_key_ = this._alternative_key_\n }\n }\n\n return recursiveType._parse_(input, ctx)\n },\n } as T\n}\n\ntype TransformOptions<T> = {\n /**\n * @deprecated will be removed in the next major version\n *\n * if the input type is invalid, the transform will be ignore\n * schema will be used to validate the input\n */\n outputSchema?: RcType<T>\n /** @deprecated will be removed in the next major version */\n disableStrictOutputSchema?: boolean\n}\n\nfunction validateTransformOutput<T>(\n ctx: ParseResultCtx,\n outputSchema: RcType<T>,\n input: any,\n disableStrictOutputSchema: boolean | undefined,\n): InternalParseResult<T> {\n const parentPath = ctx.path_\n const parentObjErrShortCircuit = ctx.objErrShortCircuit_\n const parentStrictObj = ctx.strictObj_\n const parentNoWarnings = ctx.noWarnings_\n\n ctx.objErrShortCircuit_ = true\n ctx.path_ = `${parentPath}|output|`\n\n if (!disableStrictOutputSchema) {\n ctx.strictObj_ = true\n ctx.noWarnings_ = true\n }\n\n const result = outputSchema._parse_(input, ctx)\n\n ctx.strictObj_ = parentStrictObj\n ctx.noWarnings_ = parentNoWarnings\n ctx.path_ = parentPath\n ctx.objErrShortCircuit_ = parentObjErrShortCircuit\n\n return result\n}\n\n/** validate a input or subset of input and transform the valid result */\n/**\n * Creates a type that validates input and transforms the result.\n * @param type - The input type to validate against\n * @param transform - Function to transform the validated input\n * @param options - Transform options\n * @param options.outputSchema - Optional schema to validate the transformed output\n * @param options.disableStrictOutputSchema - If true, allows loose validation of output\n * @returns A runcheck type that validates input and applies transformation\n * @example\n * ```typescript\n * const upperCaseString = rc_transform(\n * rc_string,\n * (str) => str.toUpperCase()\n * )\n * const result = upperCaseString.parse('hello') // returns 'HELLO'\n * ```\n */\nexport function rc_transform<Input, Transformed>(\n type: RcType<Input>,\n transform: (input: Input, inputSchema: RcType<Input>) => Transformed,\n {\n outputSchema,\n disableStrictOutputSchema,\n }: TransformOptions<Transformed> = {},\n): RcType<Transformed> {\n return {\n ...defaultProps,\n _kind_: `${type._kind_}_transform`,\n _parse_(input, ctx) {\n return parse(this, input, ctx, () => {\n let outputResultErrors: ErrorWithPath[] | null = null\n\n if (outputSchema) {\n const parseResult = validateTransformOutput(\n ctx,\n outputSchema,\n input,\n disableStrictOutputSchema,\n )\n\n if (parseResult.ok) {\n return {\n data: parseResult.data,\n errors: false,\n }\n } else {\n outputResultErrors = parseResult.errors\n }\n }\n\n // TODO: optimize this\n const newType = {\n ...type,\n _kind_: this._kind_,\n }\n\n const parseResult = newType._parse_(input, ctx)\n\n if (parseResult.ok) {\n return {\n errors: false,\n data: transform(parseResult.data, type),\n }\n } else {\n return {\n errors: [...(outputResultErrors || []), ...parseResult.errors],\n data: undefined,\n }\n }\n })\n },\n }\n}\n\n/** Create transforms which result can be validated with the same schema */\n/**\n * Creates a narrowing transformation that refines the input type.\n * @param type - The input type to validate against\n * @param narrow - Function to narrow the validated input to a more specific type\n * @returns A runcheck type that validates and narrows the input\n * @example\n * ```typescript\n * const positiveNumber = rc_narrow(\n * rc_number,\n * (n) => n > 0 ? n : 0\n * )\n * ```\n */\nexport function rc_narrow<Input, Narrowed extends Input>(\n type: RcType<Input>,\n narrow: (input: Input, inputSchema: RcType<Input>) => Narrowed,\n): RcType<Narrowed> {\n return rc_transform(type, narrow)\n}\n\n/** Allows the transform function to return a error if transformation is invalid */\n/**\n * Creates a transformation that can fail with custom error messages.\n * @param type - The input type to validate against\n * @param transform - Function that returns either transformed data or errors\n * @param options - Transform options\n * @param options.outputSchema - Optional schema to validate the transformed output\n * @param options.disableStrictOutputSchema - If true, allows loose validation of output\n * @returns A runcheck type that validates input and applies fallible transformation\n * @example\n * ```typescript\n * const parseJson = rc_unsafe_transform(\n * rc_string,\n * (str) => {\n * try {\n * return { ok: true, data: JSON.parse(str) }\n * } catch {\n * return { ok: false, errors: 'Invalid JSON' }\n * }\n * }\n * )\n * ```\n */\nexport function rc_unsafe_transform<Input, Transformed>(\n type: RcType<Input>,\n transform: (\n input: Input,\n inputSchema: RcType<Input>,\n ) =>\n | { ok: true; data: Transformed }\n | { ok: false; errors: string | string[] },\n {\n outputSchema,\n disableStrictOutputSchema,\n }: TransformOptions<Transformed> = {},\n): RcType<Transformed> {\n return {\n ...defaultProps,\n _kind_: `${type._kind_}_transform`,\n _parse_(input, ctx) {\n return parse(this, input, ctx, (): IsValid<Transformed> => {\n let outputResultErrors: ErrorWithPath[] | null = null\n\n if (outputSchema) {\n const parseResult = validateTransformOutput(\n ctx,\n outputSchema,\n input,\n disableStrictOutputSchema,\n )\n\n if (parseResult.ok) {\n return {\n errors: false,\n data: parseResult.data,\n }\n } else {\n outputResultErrors = parseResult.errors\n }\n }\n\n // TODO: optimize this\n const newType = {\n ...type,\n _kind_: this._kind_,\n }\n\n const parseResult = newType._parse_(input, ctx)\n\n if (parseResult.ok) {\n const transformResult = transform(parseResult.data, type)\n\n if (transformResult.ok) {\n return { errors: false, data: transformResult.data }\n } else {\n return {\n errors:\n typeof transformResult.errors === 'string' ?\n [getWarningOrErrorWithPath(ctx, transformResult.errors)]\n : transformResult.errors.map((error) =>\n getWarningOrErrorWithPath(ctx, error),\n ),\n data: undefined,\n }\n }\n }\n\n return {\n errors: [...(outputResultErrors || []), ...parseResult.errors],\n data: undefined,\n }\n })\n },\n }\n}\n\nexport function normalizedTypeOf(\n input: unknown,\n showValueInError: boolean,\n): string {\n const typeOf = typeof input\n\n const type = ((): string => {\n if (typeOf === 'object') {\n if (Array.isArray(input)) {\n return 'array'\n }\n\n if (!input) {\n return 'null'\n }\n }\n\n if (typeof input === 'number' && Number.isNaN(input)) {\n return 'NaN'\n }\n\n return typeOf\n })()\n\n return (\n showValueInError &&\n (type === 'string' || type === 'number' || type === 'boolean')\n ) ?\n `${type}(${input})`\n : type\n}\n\ntype NonArrayObject = {\n [x: string]: any\n [y: number]: never\n}\n\n/**\n * Assertion function that throws if the parse result contains errors.\n * @param result - The parse result to assert validity for\n * @throws Error if the result contains validation errors\n * @example\n * ```typescript\n * const result = rc_parse(input, rc_string)\n * rc_assert_is_valid(result)\n * // result is now typed as successful result\n * console.log(result.value)\n * ```\n */\nexport function rc_assert_is_valid<S>(\n result: RcParseResult<S>,\n): asserts result is {\n ok: true\n error: false\n errors: false\n data: S\n value: S\n warnings: string[] | false\n unwrap: () => S\n unwrapOr: (defaultValue: S) => S\n unwrapOrNull: () => S | null\n} {\n if (result.errors) {\n throw new Error(`invalid input: ${result.errors.join(', ')}`)\n }\n}\n\n/** @internal */\nexport function isObject(value: any): value is NonArrayObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\n/** @internal */\nexport function snakeCase(str: string): string {\n return str\n .replace(/\\W+/g, ' ')\n .split(/ |\\B(?=[A-Z])/)\n .map((word) => word.toLowerCase())\n .join('_')\n}\n\n/**\n * Parses a JSON string and validates it against a schema.\n * @param jsonString - The JSON string to parse\n * @param schema - The runcheck type to validate the parsed JSON against\n * @param options - Parse options\n * @returns The parse result containing either the validated JSON value or errors\n * @example\n * ```typescript\n * const userSchema = rc_object({ name: rc_string, age: rc_number })\n * const result = rc_parse_json('{\"name\":\"John\",\"age\":30}', userSchema)\n * ```\n */\nexport function rc_parse_json<T>(\n jsonString: unknown,\n schema: RcType<T>,\n options?: ParseOptions,\n): RcParseResult<T> {\n try {\n if (typeof jsonString !== 'string') {\n return {\n ok: false,\n error: true,\n errors: [\n `expected a json string, got ${normalizedTypeOf(jsonString, true)}`,\n ],\n unwrap,\n unwrapOr,\n unwrapOrNull,\n }\n }\n\n const parsed = JSON.parse(jsonString)\n\n return rc_parse(parsed, schema, options)\n } catch (err) {\n return {\n ok: false,\n error: true,\n errors: [`json parsing error: ${isObject(err) ? err.message : ''}`],\n unwrap,\n unwrapOr,\n unwrapOrNull,\n }\n }\n}\n\nfunction isFn(value: any): value is (...args: any[]) => any {\n return typeof value === 'function'\n}\n\nexport type Prettify<T> =\n T extends Record<string, any> ?\n {\n [K in keyof T]: Prettify<T[K]>\n }\n : T\n\nexport type RcPrettyInferType<T extends RcType<any>> = Prettify<RcInferType<T>>\n\n/**\n * Type guard function that checks if a value is a runcheck type.\n * @param value - The value to check\n * @returns True if the value is a runcheck type, false otherwise\n * @example\n * ```typescript\n * if (isRcType(someValue)) {\n * // someValue is now typed as RcType<any>\n * const result = someValue.parse(input)\n * }\n * ```\n */\nexport function isRcType(value: any): value is RcType<any> {\n return isObject(value) && '__rc_type' in value\n}\n\n/** workaround for the typescript limitation: https://github.com/microsoft/TypeScript/issues/52295 */\n/**\n * Workaround for TypeScript limitation with union types.\n * @param type - The type to cast as a union type\n * @returns The type cast as a proper runcheck union type\n * @example\n * ```typescript\n * const unionType = joinAsRcTypeUnion(someComplexUnionType)\n * ```\n */\nexport function joinAsRcTypeUnion<T>(\n type: T,\n): RcType<T extends RcType<infer U> ? U : never> {\n return type as any\n}\n\n/**\n * Gets the kind/name of a runcheck schema for debugging purposes.\n * @param schema - The runcheck type to get the kind from\n * @returns The string representation of the schema kind\n * @example\n * ```typescript\n * const kind = getSchemaKind(rc_string) // returns 'string'\n * const kind2 = getSchemaKind(rc_array(rc_number)) // returns 'number[]'\n * ```\n */\nexport function getSchemaKind(schema: RcType<any>): string {\n return schema._kind_\n}\n\n/**\n * Converts a runcheck type or parse result to a Standard Schema V1.\n * @param schemaOrResult - The runcheck type or parse result to convert\n * @param options - Conversion options\n * @param options.errorOnWarnings - If true, treat warnings as errors\n * @param options.onWarnings - Callback function to handle warnings\n * @returns A Standard Schema V1 compatible object\n * @example\n * ```typescript\n * const standardSchema = rc_to_standard(rc_string)\n * const result = standardSchema['~standard'].validate('hello')\n * ```\n */\nexport function rc_to_standard<T>(\n schemaOrResult: RcType<T> | RcParseResult<T>,\n {\n errorOnWarnings = false,\n onWarnings,\n }: {\n errorOnWarnings?: boolean\n onWarnings?: (warnings: string[]) => void\n } = {},\n): StandardSchemaV1<T> {\n return {\n '~standard': {\n validate(value) {\n const result =\n 'ok' in schemaOrResult ? schemaOrResult : (\n rc_parse(value, schemaOrResult)\n )\n\n return parseResultToStandard(result, errorOnWarnings, onWarnings)\n },\n vendor: 'runcheck',\n version: 1,\n },\n }\n}\n\nfunction parseResultToStandard<T>(\n result: RcParseResult<T>,\n errorOnWarnings: boolean,\n onWarnings: ((warnings: string[]) => void) | undefined,\n): StandardSchemaV1.Result<T> {\n if (errorOnWarnings && result.ok && result.warnings) {\n return {\n issues: result.warnings.map((warning) => ({\n message: warning,\n })),\n }\n }\n\n if (result.ok) {\n if (onWarnings && result.warnings) {\n onWarnings(result.warnings)\n }\n\n return { value: result.value }\n }\n\n return {\n issues: result.errors.map((error) => ({\n message: error,\n })),\n }\n}\n\n/**\n * Converts a Standard Schema V1 to a runcheck type.\n * @param standardSchema - The Standard Schema V1 to convert\n * @param kind - Optional custom kind name for error messages\n * @returns A runcheck type that wraps the standard schema\n * @example\n * ```typescript\n * const rcType = rc_from_standard(someStandardSchema)\n * const result = rcType.parse(input)\n * ```\n */\nexport function rc_from_standard<T>(\n standardSchema: StandardSchemaV1<any, T>,\n /** use this kind instead of the default one in error messages (standard_schema_${standard.vendor}@${standard.version}) */\n kind?: string,\n): RcType<T> {\n const standard = standardSchema['~standard']\n return {\n ...defaultProps,\n _kind_: kind || `standard_schema_${standard.vendor}@${standard.version}`,\n _parse_(input, ctx) {\n return parse(this, input, ctx, () => {\n const result = standard.validate(input)\n\n if ('value' in result) {\n return { data: result.value, errors: false }\n }\n\n if ('issues' in result) {\n return {\n data: undefined,\n errors: result.issues.map((issue: { message: string }) =>\n getWarningOrErrorWithPath(ctx, issue.message),\n ),\n }\n }\n\n return false\n })\n },\n }\n}\n","import {\n ErrorWithPath,\n RcBase,\n RcInferType,\n RcOptionalKeyType,\n RcType,\n defaultProps,\n getWarningOrErrorWithPath,\n isObject,\n isRcType,\n normalizedTypeOf,\n parse,\n rc_array,\n rc_loose_array,\n snakeCase,\n} from './runcheck'\n\n/**\n * Creates a type that uses a fallback key when the primary key is undefined.\n * Can be used to rename keys from input or provide alternative key names.\n * @param fallbackKey - The alternative key to use when the primary key is undefined\n * @param type - The type to validate the value against\n * @returns A runcheck type that supports fallback key lookup\n * @example\n * ```typescript\n * const userSchema = rc_object({\n * name: rc_get_from_key_as_fallback('username', rc_string)\n * })\n * // Will look for 'name' first, then 'username' if 'name' is undefined\n * const result = userSchema.parse({ username: 'john' }) // valid\n * ```\n */\nexport function rc_get_from_key_as_fallback<T extends RcType<any>>(\n fallbackKey: string,\n type: T,\n): RcType<RcInferType<T>> {\n return {\n ...type,\n _alternative_key_: fallbackKey,\n }\n}\n\nexport type RcObject = {\n [key: string]: RcBase<any, any> | RcObject\n}\n\nexport type TypeOfObjectType<T extends RcObject> = Flatten<\n AddQuestionMarks<{\n [K in keyof T]: T[K] extends RcType<infer U> ? RequiredKey<U>\n : T[K] extends RcOptionalKeyType<infer W> ? W\n : T[K] extends RcObject ? RequiredKey<TypeOfObjectType<T[K]>>\n : never\n }>\n>\n\nexport type RcObjTypeReturn<T extends RcObject> = RcType<TypeOfObjectType<T>>\n\ntype RequiredKey<T> = { _required_key_: T }\n\ntype RequiredKeys<T extends object> = {\n [k in keyof T]: T[k] extends RequiredKey<any> ? k : never\n}[keyof T]\n\ntype AddQuestionMarks<\n T extends object,\n R extends keyof T = RequiredKeys<T>,\n> = Pick<Required<T>, R> & Partial<Omit<T, R>>\n\ntype Identity<T> = T\n\ntype Flatten<T> = Identity<{\n [k in keyof T]: T[k] extends RequiredKey<infer U> ? U : T[k]\n}>\n\nfunction unwrapToObjSchema(input: unknown): RcType<any> {\n if (isRcType(input)) {\n return input\n } else if (isObject(input)) {\n const objSchema: Record<string, RcType<any>> = {}\n\n for (const [key, value] of Object.entries(input)) {\n objSchema[key] = unwrapToObjSchema(value)\n }\n\n return rc_object(objSchema)\n } else if (Array.isArray(input)) {\n const [type, value] = input\n\n switch (type) {\n case 'optional':\n return unwrapToObjSchema(value).optional()\n case 'nullish_or':\n return unwrapToObjSchema(value).orNullish()\n case 'null_or':\n return unwrapToObjSchema(value).orNull()\n case 'array_of':\n return rc_array(unwrapToObjSchema(value))\n case 'loose_array_of':\n return rc_loose_array(unwrapToObjSchema(value))\n case 'optional_array_of':\n return rc_array(unwrapToObjSchema(value)).optional()\n case 'optional_loose_array_of':\n return rc_loose_array(unwrapToObjSchema(value)).optional()\n case 'null_or_array_of':\n return rc_array(unwrapToObjSchema(value)).orNull()\n case 'null_or_loose_array_of':\n return rc_loose_array(unwrapToObjSchema(value)).orNull()\n case 'nullish_or_array_of':\n return rc_array(unwrapToObjSchema(value)).orNullish()\n case 'nullish_or_loose_array_of':\n return rc_loose_array(unwrapToObjSchema(value)).orNullish()\n default:\n return type\n }\n }\n\n throw new Error(`invalid schema: ${input}`)\n}\n\nexport type ObjOptions = {\n normalizeKeysFrom?: 'snake_case'\n /** excess keys are not removed if extends is true */\n extends?: boolean\n}\n\n/**\n * Creates an object type validator with specified shape and options.\n * @param shape - The object shape defining the expected properties and their types\n * @param options - Configuration options for the object validator\n * @param options.normalizeKeysFrom - If 'snake_case', automatically converts camelCase keys to snake_case for lookup\n * @param options.extends - If true, allows excess properties in the input object\n * @returns A runcheck type that validates objects with the specified shape\n * @example\n * ```typescript\n * const userSchema = rc_object({\n * name: rc_string,\n * age: rc_number,\n * email: rc_string.optional()\n * })\n * const result = userSchema.parse({ name: 'John', age: 30 }) // valid\n * ```\n */\nexport function rc_object<T extends RcObject>(\n shape: T,\n { normalizeKeysFrom, extends: extendsObj }: ObjOptions = {},\n): RcObjTypeReturn<T> {\n const objShape: Record<string, RcType<any>> = {}\n\n for (const [key, value] of Object.entries(shape)) {\n objShape[key] = unwrapToObjSchema(value)\n }\n\n const shapeEntries = Object.entries(objShape).map(([key, type]) => {\n return { key, type }\n })\n\n return {\n ...defaultProps,\n _obj_shape_: objShape,\n _kind_: extendsObj ? 'extends_object' : 'object',\n _detailed_obj_shape_: '',\n _is_object_: true,\n _is_extend_obj_: !!extendsObj,\n _parse_(inputObj, ctx) {\n return parse<TypeOfObjectType<T>>(this, inputObj, ctx, () => {\n if (!isObject(inputObj)) {\n ctx.objErrKeyIndex_ = -1\n\n if (ctx.objErrShortCircuit_ && !this._detailed_obj_shape_) {\n return false\n }\n\n if (!this._detailed_obj_shape_) {\n let detailedObjShapeDescription = `${this._kind_}{ `\n let i = 0\n for (const { key, type } of shapeEntries) {\n if (detailedObjShapeDescription.length > 100) {\n detailedObjShapeDescription += `, ...`\n break\n }\n\n if (i !== 0) {\n detailedObjShapeDescription += `, `\n }\n\n detailedObjShapeDescription += `${key}: ${type._kind_}`\n i++\n }\n\n detailedObjShapeDescription += ` }`\n this._detailed_obj_shape_ = detailedObjShapeDescription\n }\n\n return {\n data: undefined,\n errors: [\n getWarningOrErrorWithPath(\n ctx,\n `Type '${normalizedTypeOf(inputObj, false)}' is not assignable to '${this._detailed_obj_shape_}'`,\n ),\n ],\n }\n }\n\n const isStrict = this._kind_ === 'strict_obj' || ctx.strictObj_\n\n const excessKeys =\n isStrict ? new Set<string>(Object.keys(inputObj)) : undefined\n\n if (excessKeys && excessKeys.size > shapeEntries.length) {\n ctx.objErrKeyIndex_ = -1\n const errors: ErrorWithPath[] = []\n\n if (ctx.objErrShortCircuit_) {\n return {\n data: undefined,\n errors: [\n getWarningOrErrorWithPath(\n ctx,\n `Expected strict object with ${shapeEntries.length} keys but got ${excessKeys.size}`,\n ),\n ],\n }\n }\n\n for (const { key } of shapeEntries) {\n if (!excessKeys.has(key)) {\n errors.push(\n getWarningOrErrorWithPath(ctx, `Key '${key}' is missing`),\n )\n } else {\n excessKeys.delete(key)\n }\n }\n\n for (const key of excessKeys) {\n errors.push(\n getWarningOrErrorWithPath(\n ctx,\n `Key '${key}' is not defined in the object shape`,\n ),\n )\n }\n\n return {\n data: undefined,\n errors,\n }\n }\n\n const resultObj: Record<any, string> = {} as any\n const resultErrors: ErrorWithPath[] = []\n\n const parentPath = ctx.path_\n\n let i = -1\n for (const shapeEntry of shapeEntries) {\n const key = shapeEntry.key\n const type = shapeEntry.type\n\n const typekey = key as keyof T\n i += 1\n\n const subPath =\n key === '' || key.includes(' ') ? `['${key}']` : `.${key}`\n\n const path = `${parentPath}${subPath}`\n\n ctx.path_ = path\n\n let input = inputObj[key]\n let keyToDeleteFromExcessKeys = key\n\n if (input === undefined && type._alternative_key_) {\n input = inputObj[type._alternative_key_]\n keyToDeleteFromExcessKeys = type._alternative_key_\n }\n\n if (input === undefined && normalizeKeysFrom === 'snake_case') {\n const snakeCaseKey = snakeCase(key)\n\n input = inputObj[snakeCaseKey]\n keyToDeleteFromExcessKeys = snakeCaseKey\n }\n\n excessKeys?.delete(keyToDeleteFromExcessKeys)\n\n const parseResult = type._parse_(input, ctx)\n\n if (parseResult.ok) {\n resultObj[typekey] = parseResult.data\n }\n //\n else {\n for (const subError of parseResult.errors) {\n ctx.path_ = path\n resultErrors.push(subError)\n }\n\n if (ctx.objErrShortCircuit_) {\n ctx.objErrKeyIndex_ = i\n break\n }\n }\n }\n\n if (excessKeys) {\n if (excessKeys.size > 0) {\n for (const key of excessKeys) {\n ctx.path_ = parentPath\n\n resultErrors.push(\n getWarningOrErrorWithPath(\n ctx,\n `Key '${key}' is not defined in the object shape`,\n ),\n )\n }\n }\n }\n\n if (resultErrors.length > 0) {\n return { errors: resultErrors, data: undefined }\n }\n\n ctx.path_ = parentPath\n\n if (this._is_extend_obj_) {\n return {\n errors: false,\n data: {\n ...(inputObj as any),\n ...(resultObj as any),\n },\n }\n }\n\n return { errors: false, data: resultObj as any }\n })\n },\n }\n}\n\ntype ExtendsOptions = Omit<ObjOptions, 'extends'>\n\n/**\n * Creates an object type that extends the input with additional properties.\n * Unlike strict objects, this allows excess properties from the input to be preserved.\n * @param shapeOrSchema - Either an object shape or an existing object type\n * @param options - Configuration options (excluding 'extends' which is always true)\n * @returns A runcheck type that validates and extends objects\n * @example\n * ```typescript\n * const baseSchema = rc_obj_extends({\n * name: rc_string\n * })\n * // Input: { name: 'John', extra: 'data' }\n * // Output: { name: 'John', extra: 'data' } (preserves extra properties)\n * ```\n */\nexport function rc_obj_extends<T extends RcObject>(\n shape: T,\n options?: ExtendsOptions,\n): RcObjTypeReturn<T>\nexport function rc_obj_extends<T extends Record<string, any>>(\n schema: RcType<T>,\n options?: ExtendsOptions,\n): RcType<T>\nexport function rc_obj_extends(\n shapeOrSchema: RcObject | RcType<Record<string, any>>,\n options?: ExtendsOptions,\n): RcType<Record<string, any>> {\n // If it's an existing RcType with object shape, use it directly\n if (isRcType(shapeOrSchema)) {\n if (!shapeOrSchema._obj_shape_) {\n throw new Error('rc_obj_extends: schema must be an object type')\n }\n\n return {\n ...shapeOrSchema,\n _kind_: `extends_object`,\n _is_extend_obj_: true,\n }\n }\n\n // Otherwise, treat it as a shape and create a new object\n return {\n ...rc_object(shapeOrSchema as any, options),\n _kind_: `extends_object`,\n _is_extend_obj_: true,\n }\n}\n\n/**\n * Extracts the object shape from an object type for inspection or manipulation.\n * @param type - The object type to extract the shape from\n * @returns The object shape containing the property types\n * @throws Error if the type is not an object type\n * @example\n * ```typescript\n * const userSchema = rc_object({ name: rc_string, age: rc_number })\n * const shape = rc_get_obj_shape(userSchema)\n * // shape = { name: RcType<string>, age: RcType<number> }\n * ```\n */\nexport function rc_get_obj_shape<T extends Record<string, any>>(\n type: RcType<T>,\n): {\n [K in keyof T]: RcType<T[K]>\n} {\n if (!type._obj_shape_) {\n throw new Error(`type does not have an object shape`)\n }\n\n return type._obj_shape_ as T\n}\n\n/**\n * Creates a strict object type that rejects input with excess properties.\n * @param shape - The object shape defining the expected properties and their types\n * @param options - Configuration options for the object validator\n * @returns A runcheck type that validates objects strictly (no excess properties allowed)\n * @example\n * ```typescript\n * const strictUser = rc_obj_strict({\n * name: rc_string,\n * age: rc_number\n * })\n * const result = strictUser.parse({ name: 'John', age: 30 }) // valid\n * const result2 = strictUser.parse({ name: 'John', age: 30, extra: 'data' }) // invalid\n * ```\n */\nexport function rc_obj_strict<T extends RcObject>(\n shape: T,\n options?: ObjOptions,\n): RcObjTypeReturn<T> {\n return {\n ...rc_object(shape, options),\n _kind_: `strict_obj`,\n }\n}\n\n/**\n * Enables strict object validation for a type, rejecting excess properties.\n * @param type - The type to make strict\n * @param options - Configuration options\n * @param options.nonRecursive - If true, only affects the immediate object type, not nested objects\n * @returns The type with strict object validation enabled\n * @example\n * ```typescript\n * const userSchema = rc_object({ name: rc_string, age: rc_number })\n * const strictUser = rc_enable_obj_strict(userSchema)\n * // Now rejects objects with excess properties\n * ```\n */\nexport function rc_enable_obj_strict<T extends RcType<any>>(\n type: T,\n {\n nonRecursive,\n }: {\n nonRecursive?: boolean\n } = {},\n): T {\n if (nonRecursive) {\n if (!type._obj_shape_) {\n throw new Error(\n `rc_enable_obj_strict: nonRecursive option can only be used on object types`,\n )\n }\n\n return {\n ...type,\n _kind_: `strict_obj`,\n }\n }\n\n return {\n ...type,\n _parse_(input, ctx) {\n const parentStrictObj = ctx.strictObj_\n ctx.strictObj_ = true\n const result = type._parse_(input, ctx)\n ctx.strictObj_ = parentStrictObj\n return result\n },\n }\n}\n\ntype AnyObj = Record<string, unknown>\n\ntype Extends<T extends AnyObj, W extends AnyObj> = Omit<T, keyof W> & W\n\n/**\n * Merges multiple object types into a single object type.\n * Later objects override properties from earlier objects.\n * @param objs - The object types to merge (2-4 objects supported)\n * @returns A runcheck type representing the merged object\n * @example\n * ```typescript\n * const base = rc_object({ name: rc_string, age: rc_number })\n * const extended = rc_object({ email: rc_string, age: rc_string }) // age overrides\n * const merged = rc_obj_merge(base, extended)\n * // Result: { name: string, age: string, email: string }\n * ```\n */\nexport function rc_obj_merge<A extends AnyObj, B extends AnyObj>(\n ...objs: [RcType<A>, RcType<B>]\n): RcType<Extends<A, B>>\nexport function rc_obj_merge<\n A extends AnyObj,\n B extends AnyObj,\n C extends AnyObj,\n>(...objs: [RcType<A>, RcType<B>, RcType<C>]): RcType<Extends<Extends<A, B>, C>>\nexport function rc_obj_merge<\n A extends AnyObj,\n B extends AnyObj,\n C extends AnyObj,\n D extends AnyObj,\n>(\n ...objs: [RcType<A>, RcType<B>, RcType<C>, RcType<D>]\n): RcType<Extends<Extends<Extends<A, B>, C>, D>>\nexport function rc_obj_merge(\n ...objs: RcType<Record<string, unknown>>[]\n): RcType<any> {\n const finalShape = {} as any\n\n for (const objShape of objs) {\n Object.assign(finalShape, objShape._obj_shape_)\n }\n\n return rc_object(finalShape)\n}\n\n/**\n * Creates a new object type with only the specified properties from the original.\n * @param obj - The object type to pick properties from\n * @param keys - The keys to pick from the object\n * @returns A runcheck type containing only the picked properties\n * @throws Error if the input is not an object type\n * @example\n * ```typescript\n * const userSchema = rc_object({ name: rc_string, age: rc_number, email: rc_string })\n * const nameAndAge = rc_obj_pick(userSchema, ['name', 'age'])\n * // Result: { name: string, age: number }\n * ```\n */\nexport function rc_obj_pick<O extends AnyObj, K extends keyof O>(\n obj: RcType<O>,\n keys: K[],\n): RcType<Pick<O, K>> {\n const shape = {} as any\n\n if (!obj._obj_shape_) {\n throw new Error('rc_obj_pick: obj must be an object type')\n }\n\n for (const key of keys) {\n const keyShape = obj._obj_shape_[key as string]\n if (keyShape) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n shape[key] = keyShape\n }\n }\n\n return rc_object(shape) as any\n}\n\n/**\n * Creates a new object type without the specified properties from the original.\n * @param obj - The object type to omit properties from\n * @param keys - The keys to omit from the object\n * @returns A runcheck type without the omitted properties\n * @throws Error if the input is not an object type\n * @example\n * ```typescript\n * const userSchema = rc_object({ name: rc_string, age: rc_number, email: rc_string })\n * const withoutEmail = rc_obj_omit(userSchema, ['email'])\n * // Result: { name: string, age: number }\n * ```\n */\nexport function rc_obj_omit<O extends AnyObj, K extends keyof O>(\n obj: RcType<O>,\n keys: K[],\n): RcType<Omit<O, K>> {\n const shape = {} as any\n\n if (!obj._obj_shape_) {\n throw new Error('rc_obj_omit: obj must be an object type')\n }\n\n for (const key of Object.keys(obj._obj_shape_)) {\n if (!(keys as any[]).includes(key)) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n shape[key] = obj._obj_shape_[key]\n }\n }\n\n return rc_object(shape) as any\n}\n\ntype ExpectedSchema<T> = (t: T) => T\n\ntype RcTypeWithSchemaEqualTo<T> = { __rc_type: ExpectedSchema<T> }\n\ntype StrictObjTypeToRcType<T> = {\n [K in keyof T]-?: StrictTypeToRcType<T[K]>\n}\n\ntype IsUnion<T, U extends T = T> =\n T extends unknown ?\n [U] extends [T] ?\n false\n : true\n : false\n\ntype StrictTypeToRcType<T> =\n [T] extends [(infer U)[]] ?\n | ['array_of' | 'loose_array_of', StrictTypeToRcType<U>]\n | RcTypeWithSchemaEqualTo<T>\n : [T] extends [(infer U)[] | undefined] ?\n | ['optional_array_of' | 'optional_loose_array_of', StrictTypeToRcType<U>]\n | RcTypeWithSchemaEqualTo<T>\n : [T] extends [(infer U)[] | null] ?\n | ['null_or_array_of' | 'null_or_loose_array_of', StrictTypeToRcType<U>]\n | RcTypeWithSchemaEqualTo<T>\n : [T] extends [(infer U)[] | undefined | null] ?\n | [\n 'nullish_or_array_of' | 'nullish_or_loose_array_of',\n StrictTypeToRcType<U>,\n ]\n | RcTypeWithSchemaEqualTo<T>\n : [T] extends [Record<string, any>] ?\n IsUnion<T> extends true ?\n RcTypeWithSchemaEqualTo<T>\n : StrictObjTypeToRcType<T> | RcTypeWithSchemaEqualTo<T>\n : [T] extends [Record<string, any> | null] ?\n ['null_or', StrictObjTypeToRcType<T>] | RcTypeWithSchemaEqualTo<T>\n : [T] extends [Record<string, any> | undefined] ?\n ['optional', StrictObjTypeToRcType<T>] | RcTypeWithSchemaEqualTo<T>\n : [T] extends [Record<string, any> | null | undefined] ?\n ['nullish_or', StrictObjTypeToRcType<T>] | RcTypeWithSchemaEqualTo<T>\n : RcTypeWithSchemaEqualTo<T>\n\nexport type StrictTypeToRcTypeBase<T extends Record<string, any>> = {\n [K in keyof T]-?: StrictTypeToRcType<T[K]>\n}\n\n/**\n * Creates a type-safe object builder that enforces the structure matches a TypeScript type.\n * Useful for creating schemas that must conform to existing TypeScript interfaces.\n * @returns A builder function that takes a schema matching the specified TypeScript type\n * @example\n * ```typescript\n * interface User {\n * name: string\n * age: number\n * email?: string\n * }\n *\n * const userBuilder = rc_obj_builder<User>()\n * const userSchema = userBuilder({\n * name: rc_string,\n * age: rc_number,\n * email: ['optional', rc_string]\n * })\n * ```\n */\nexport function rc_obj_builder<T extends Record<string, any>>() {\n return <S extends StrictTypeToRcTypeBase<T>>(\n schema: {\n [K in keyof S]: K extends keyof T ? S[K] : never\n },\n options?: ObjOptions,\n ): RcType<T> => {\n return rc_object(schema as any, options) as any\n }\n}\n","import {\n RcObject,\n StrictTypeToRcTypeBase,\n TypeOfObjectType,\n rc_object,\n} from './rc_object'\nimport {\n Prettify,\n RcBase,\n RcType,\n defaultProps,\n getWarningOrErrorWithPath,\n isObject,\n isRcType,\n normalizedTypeOf,\n parse,\n} from './runcheck'\n\n/**\n * Creates a discriminated union type validator.\n * Uses a discriminator key to determine which schema to validate against.\n * @param discriminatorKey - The property name used to discriminate between union members\n * @param types - An object mapping discriminator values to their corresponding schemas\n * @returns A runcheck type that validates discriminated union objects\n * @example\n * ```typescript\n * const shapeSchema = rc_discriminated_union('type', {\n * circle: { radius: rc_number },\n * rectangle: { width: rc_number, height: rc_number }\n * })\n *\n * const result1 = shapeSchema.parse({ type: 'circle', radius: 5 }) // valid\n * const result2 = shapeSchema.parse({ type: 'rectangle', width: 10, height: 20 }) // valid\n * const result3 = shapeSchema.parse({ type: 'triangle', sides: 3 }) // invalid - unknown discriminator\n * ```\n */\nexport function rc_discriminated_union<\n K extends string,\n T extends Record<string, RcObject | RcBase<any, any>>,\n>(\n discriminatorKey: K,\n types: T,\n): RcType<\n Prettify<\n {\n [P in keyof T]: {\n [Q in K]: P\n } & (T[P] extends RcType<infer U> ? U\n : T[P] extends RcObject ? TypeOfObjectType<T[P]>\n : never)\n }[keyof T]\n >\n> {\n const preComputedTypesShape = {} as Record<string, RcType<any>>\n\n for (const [key, type] of Object.entries(types)) {\n preComputedTypesShape[key] = isRcType(type) ? type : rc_object(type as any)\n }\n\n return {\n ...defaultProps,\n _kind_: `discriminated_union`,\n _is_object_: true,\n _parse_(input, ctx) {\n return parse<any>(this, input, ctx, () => {\n if (!isObject(input)) {\n ctx.objErrKeyIndex_ = -1\n return false\n }\n\n const discriminator = input[discriminatorKey]\n\n const parentPath = ctx.path_\n\n const type = preComputedTypesShape[discriminator]\n\n if (!type) {\n const invalidValueType = normalizedTypeOf(discriminator, true)\n\n return {\n errors: [\n getWarningOrErrorWithPath(\n { path_: `${parentPath}.${discriminatorKey}` },\n `Type '${invalidValueType}' is not a valid discriminator`,\n ),\n ],\n data: undefined,\n }\n }\n\n ctx.path_ = `${parentPath}|${discriminatorKey}: ${discriminator}|`\n\n const parseResult = type._parse_(input, ctx)\n\n ctx.path_ = parentPath\n\n if (!parseResult.ok) {\n return { errors: parseResult.errors, data: undefined }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n parseResult.data[discriminatorKey] = discriminator\n\n return { errors: false, data: parseResult.data }\n })\n },\n }\n}\n\ntype OmitDiscriminator<K, D extends Record<string, unknown>> =\n D extends any ? Omit<D, K & string> : never\n\n/**\n * Creates a type-safe discriminated union builder that enforces the structure matches a TypeScript type.\n * @param discriminatorKey - The property name used to discriminate between union members\n * @returns A builder function that takes a schema mapping matching the specified TypeScript discriminated union\n * @example\n * ```typescript\n * type Shape =\n * | { type: 'circle', radius: number }\n * | { type: 'rectangle', width: number, height: number }\n *\n * const shapeBuilder = rc_discriminated_union_builder<Shape, 'type'>('type')\n * const shapeSchema = shapeBuilder({\n * circle: { radius: rc_number },\n * rectangle: { width: rc_number, height: rc_number }\n * })\n * ```\n */\nexport function rc_discriminated_union_builder<\n D extends Record<string, unknown>,\n K extends keyof D,\n>(discriminatorKey: K) {\n return (schema: {\n [P in D[K] & string]: StrictTypeToRcTypeBase<\n OmitDiscriminator<K, D & { [Q in K]: P }>\n >\n }): RcType<D> => {\n return rc_discriminated_union(\n discriminatorKey as any,\n schema as any,\n ) as unknown as RcType<D>\n }\n}\n","import { RcType, defaultProps, parse } from './runcheck'\n\n/**\n * Creates an intersection type validator that requires input to satisfy all provided types.\n * For object types, merges the properties from all types.\n * For non-object types, input must be valid for all types simultaneously.\n * @param types - The types to intersect (2-4 types supported)\n * @returns A runcheck type representing the intersection of all input types\n * @example\n * ```typescript\n * const userBase = rc_object({ name: rc_string })\n * const userMeta = rc_object({ createdAt: rc_date })\n * const fullUser = rc_intersection(userBase, userMeta)\n * // Result: { name: string, createdAt: Date }\n * \n * const result = fullUser.parse({ name: 'John', createdAt: new Date() }) // valid\n * const result2 = fullUser.parse({ name: 'John' }) // invalid - missing createdAt\n * ```\n */\nexport function rc_intersection<A, B>(a: RcType<A>, b: RcType<B>): RcType<A & B>\nexport function rc_intersection<A, B, C>(\n a: RcType<A>,\n b: RcType<B>,\n c: RcType<C>,\n): RcType<A & B & C>\nexport function rc_intersection<A, B, C, D>(\n a: RcType<A>,\n b: RcType<B>,\n c: RcType<C>,\n d: RcType<D>,\n): RcType<A & B & C & D>\nexport function rc_intersection(...types: RcType<any>[]): RcType<any> {\n let kind = ''\n let allIsObject = true\n\n for (const type of types) {\n if (kind) {\n kind += ' & '\n }\n\n if (!type._is_object_) {\n allIsObject = false\n }\n\n kind += type._kind_.includes('|') ? `(${type._kind_})` : type._kind_\n }\n\n return {\n ...defaultProps,\n _kind_: kind,\n _is_object_: allIsObject,\n _parse_(input, ctx) {\n return parse(this, input, ctx, () => {\n let objResultData: Record<string, unknown> | null = null\n\n for (const type of types) {\n const result = type._parse_(input, ctx)\n\n if (!result.ok) {\n if (type._is_object_) {\n return result\n }\n\n return false\n } else {\n if (type._is_object_) {\n objResultData = { ...(objResultData || {}), ...result.data }\n }\n }\n }\n\n if (objResultData) {\n return {\n data: objResultData as any,\n errors: false,\n }\n }\n\n return true\n })\n },\n }\n}\n"],"mappings":"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","names":["runcheck_exports","__export","RcValidationError","defaultProps","getSchemaKind","getWarningOrErrorWithPath","isObject","isRcType","joinAsRcTypeUnion","normalizedTypeOf","parse","rc_any","rc_array","rc_array_filter_from_schema","rc_assert_is_valid","rc_boolean","rc_date","rc_default","rc_disable_loose_array","rc_discriminated_union","rc_discriminated_union_builder","rc_enable_obj_strict","rc_from_standard","rc_get_array_item_type","rc_get_from_key_as_fallback","rc_get_literal_values","rc_get_obj_shape","rc_instanceof","rc_intersection","rc_is_valid","rc_literals","rc_loose_array","rc_loose_parse","rc_loose_record","rc_narrow","rc_null","rc_nullish_default","rc_number","rc_obj_builder","rc_obj_extends","rc_obj_merge","rc_obj_omit","rc_obj_pick","rc_obj_strict","rc_object","rc_parse","rc_parse_json","rc_parser","rc_record","rc_recursive","rc_safe_fallback","rc_string","rc_to_standard","rc_transform","rc_tuple","rc_undefined","rc_union","rc_unknown","rc_unsafe_transform","rc_unwrap","rc_unwrap_or","rc_unwrap_or_null","rc_validator","snakeCase","__toCommonJS","rc_get_from_key_as_fallback","fallbackKey","type","_alternative_key_","unwrapToObjSchema","input","isRcType","isObject","objSchema","key","value","rc_object","rc_array","rc_loose_array","shape","normalizeKeysFrom","extendsObj","objShape","shapeEntries","defaultProps","_obj_shape_","_kind_","_detailed_obj_shape_","_is_object_","_is_extend_obj_","_parse_","inputObj","ctx","parse","objErrKeyIndex_","objErrShortCircuit_","detailedObjShapeDescription","i","getWarningOrErrorWithPath","normalizedTypeOf","excessKeys","strictObj_","errors","resultObj","resultErrors","parentPath","path_","shapeEntry","typekey","subPath","path","keyToDeleteFromExcessKeys","snakeCaseKey","snakeCase","parseResult","subError","rc_obj_extends","shapeOrSchema","options","rc_get_obj_shape","rc_obj_strict","rc_enable_obj_strict","nonRecursive","parentStrictObj","result","rc_obj_merge","objs","finalShape","rc_obj_pick","obj","keys","keyShape","rc_obj_omit","rc_obj_builder","schema","rc_discriminated_union","discriminatorKey","types","preComputedTypesShape","key","type","isRcType","rc_object","defaultProps","_kind_","_is_object_","_parse_","input","ctx","parse","isObject","objErrKeyIndex_","discriminator","parentPath","path_","invalidValueType","normalizedTypeOf","getWarningOrErrorWithPath","parseResult","rc_discriminated_union_builder","schema","rc_intersection","types","kind","allIsObject","type","_is_object_","_kind_","defaultProps","_parse_","input","ctx","parse","objResultData","result","getUndefined","withFallback","fallback","_fallback_","defaultMethod","defaultValue","rc_default","nullishDefaultMethod","rc_nullish_default","orMethod","schema","rc_union","parseMethod","input","options","rc_parse","parseJsonMethod","jsonString","rc_parse_json","getWarningOrErrorWithPath","ctx","message","path_","addWarning","warning","warnings_","addWarnings","warnings","parse","type","checkIfIsValid","_optional_","_orNullish_","_orNull_","isValid","noWarnings_","fb","getResultErrors","isFn","_useAutFix_","_autoFix_","autofixed","error","getErrorMsg","err","withAutofix","customAutofix","where","predicate","_parse_","result","predicateResult","_kind_","optional","normalizedTypeOf","_show_value_in_error_","orNull","orNullish","defaultProps","_array_item_type_","_predicate_","_alternative_key_","_obj_shape_","_detailed_obj_shape_","_is_object_","_is_extend_obj_","rc_undefined","rc_null","rc_any","rc_unknown","rc_boolean","rc_string","rc_number","rc_date","rc_instanceof","classToCheck","rc_literals","args","literals","literal","_literal_values_","rc_get_literal_values","maxShallowObjErrors","types","kind","allIsObject","basePath","shallowObjErrors","shallowObjErrorsCount","hasNonObjTypeMember","nonShallowObjErrors","i","currentObjErrShortCircuit","objErrShortCircuit_","objErrKeyIndex_","parseResult","objErrIndex","getDefaultResult","rc_safe_fallback","rc_record","valueType","checkKey","looseCheck","inputObj","isObject","resultObj","resultErrors","parentPath","key","inputValue","subPath","path","errors","subError","rc_loose_record","checkArrayItems","_loose","useLooseMode","noLooseArray_","unique","looseErrors","arrayResult","uniqueValues","isTuple","index","_item","filterResult","uniqueValueToCheck","isUniqueKey","adjustedLooseErrors","itemError","newError","rc_array","rc_get_array_item_type","rc_disable_loose_array","nonRecursive","parentDisableLooseArray","rc_loose_array","rc_array_filter_from_schema","filterSchema","filterFn","item","rc_tuple","showWarnings","unwrap","RcValidationError","unwrapOr","unwrapOrNull","noWarnings","strictObj_","rc_parser","rc_loose_parse","rc_unwrap_or_null","rc_unwrap_or","rc_unwrap","rc_is_valid","rc_validator","rc_recursive","recursiveType","validateTransformOutput","outputSchema","disableStrictOutputSchema","parentObjErrShortCircuit","parentStrictObj","parentNoWarnings","rc_transform","transform","outputResultErrors","rc_narrow","narrow","rc_unsafe_transform","transformResult","showValueInError","typeOf","rc_assert_is_valid","value","snakeCase","str","word","parsed","isRcType","joinAsRcTypeUnion","getSchemaKind","rc_to_standard","schemaOrResult","errorOnWarnings","onWarnings","parseResultToStandard","rc_from_standard","standardSchema","standard","issue"]}