runcheck 1.15.0 → 1.17.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.
- package/README.md +29 -0
- package/dist/autofixable.cjs +3 -3
- package/dist/autofixable.cjs.map +1 -1
- package/dist/autofixable.js +1 -1
- package/dist/chunk-523HPU74.js +4 -0
- package/dist/chunk-523HPU74.js.map +1 -0
- package/dist/runcheck.cjs +3 -3
- package/dist/runcheck.cjs.map +1 -1
- package/dist/runcheck.d.cts +71 -1
- package/dist/runcheck.d.ts +71 -1
- package/dist/runcheck.js +1 -1
- package/package.json +3 -4
- package/dist/chunk-JPCZKLXK.js +0 -4
- package/dist/chunk-JPCZKLXK.js.map +0 -1
package/README.md
CHANGED
|
@@ -22,6 +22,9 @@ pnpm add runcheck
|
|
|
22
22
|
| `rc_date` | `Date` |
|
|
23
23
|
| `rc_instanceof(instance: T)` | Classes typecheck in general |
|
|
24
24
|
| `rc_literals(...literals: T[])` | Type literal in general like `hello`, `true`, `1` |
|
|
25
|
+
| `rc_string_starts_with(p)` | `` `${p}${string}` `` |
|
|
26
|
+
| `rc_string_ends_with(s)` | `` `${string}${s}` `` |
|
|
27
|
+
| `rc_string_contains(s)` | `` `${string}${s}${string}` `` |
|
|
25
28
|
| `rc_union(...types: T[])` | Union types in general like `string \| 1` |
|
|
26
29
|
| `rc_array<T>(type: T)` | `T[]` |
|
|
27
30
|
| `rc_loose_array<T>(type: T)` | `T[]` (filters invalid items) |
|
|
@@ -328,6 +331,32 @@ import {
|
|
|
328
331
|
| `rc_string_autofix` | `string` | valid `number` inputs |
|
|
329
332
|
| `rc_number_autofix` | `number` | valid numeric `string` inputs |
|
|
330
333
|
|
|
334
|
+
## `rc_try_fix`
|
|
335
|
+
|
|
336
|
+
Use `rc_try_fix` to try to fix an invalid input and revalidate the fixed value with the same schema. Unlike `withAutofix`, the fix function doesn't need to return an already valid value, as the fixed value is validated again.
|
|
337
|
+
|
|
338
|
+
```ts
|
|
339
|
+
const schema = rc_try_fix(
|
|
340
|
+
rc_object({ name: rc_string, age: rc_number }),
|
|
341
|
+
(input, { errors, warnings }) => {
|
|
342
|
+
// try to fix stringified json inputs
|
|
343
|
+
if (typeof input === 'string') {
|
|
344
|
+
const parsed: unknown = JSON.parse(input)
|
|
345
|
+
return { fixed: parsed }
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
// return false to skip fixing
|
|
349
|
+
return false
|
|
350
|
+
},
|
|
351
|
+
)
|
|
352
|
+
|
|
353
|
+
const result = rc_parse('{"name":"John","age":30}', schema)
|
|
354
|
+
// passes, with the fixed errors reported as warnings:
|
|
355
|
+
// `Fixed error -> Type 'string' is not assignable to 'object{ name: string, age: number }'`
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
The fix is attempted only once: if the fixed value is still invalid, the original result is returned. If the fix succeeds, the errors of the original parse are reported as warnings (`Fixed error -> ...`) alongside any warnings from the revalidation, deduplicated.
|
|
359
|
+
|
|
331
360
|
# Performing custom checks
|
|
332
361
|
|
|
333
362
|
You can also use `rc_[type].where(customCheckFunction)` to perform custom checks.
|
package/dist/autofixable.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var R=Object.defineProperty;var W=Object.getOwnPropertyDescriptor;var
|
|
2
|
-
`)}`)}function c(){if(this.errors)throw new _(this.errors);return g(this),this.value}function y(
|
|
3
|
-
`));this.errors=s}name="RcValidationError"};function
|
|
1
|
+
"use strict";var R=Object.defineProperty;var W=Object.getOwnPropertyDescriptor;var V=Object.getOwnPropertyNames;var U=Object.prototype.hasOwnProperty;var C=(r,e)=>{for(var s in e)R(r,s,{get:e[s],enumerable:!0})},F=(r,e,s,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of V(e))!U.call(r,n)&&n!==s&&R(r,n,{get:()=>e[n],enumerable:!(t=W(e,n))||t.enumerable});return r};var K=r=>F(R({},"__esModule",{value:!0}),r);var or={};C(or,{rc_boolean_autofix:()=>tr,rc_number_autofix:()=>ar,rc_string_autofix:()=>sr});module.exports=K(or);var D=()=>{};function q(r){return{...this,R:r===void 0?D:r}}function L(r){return Y(this,r)}function M(r){return rr(this,r)}function B(r){return X(this,r)}function J(r,e){return I(r,this,e)}function z(r,e){return nr(r,this,e)}function f(r,e){return`${r.n?`$${r.n}: `:""}${e}`}function N(r,e){r.i.push(e.startsWith("$")?e:f(r,e))}function i(r,e,s,t){if(r.l&&e===void 0)return{ok:!0,data:e,errors:void 0};if(r.f&&e==null)return{ok:!0,data:e,errors:void 0};if(r.d&&e===null)return{ok:!0,data:e,errors:void 0};let n=t();if(n&&(n===!0||!n.errors))return{ok:!0,data:n===!0?e:n.data,errors:void 0};if(!s.y){let a=r.R;if(a!==void 0)return N(s,`Fallback used, errors -> ${P(n,s,r,e)}`),{ok:!0,data:w(a)?a(e):a,errors:void 0};if(r.k&&r.T){let o=r.T(e);if(o)return o.safeFix||N(s,`Autofixed from error -> ${P(n,s,r,e)}`),o.errors?{ok:!1,data:void 0,errors:o.errors.map(l=>f(s,l))}:{ok:!0,data:o.fixed,errors:void 0}}}return{ok:!1,data:void 0,errors:n?n.errors:[f(s,v(r,e))]}}function P(r,e,s,t){return r?r.errors.map(n=>n.replace(e.n,"")).join("; "):v(s,t)}function Z(r){return{...this,k:!0,T:r}}function G(r){return{...this,r:(e,s)=>i(this,e,s,()=>{let t=this.r(e,s);if(!t.ok)return{errors:t.errors,data:void 0};let n=r(t.data);return n!==!0?{errors:[f(s,`Predicate failed${n===!1?` for type '${this.e}'`:`: ${n.error}`}`)],data:void 0}:{errors:!1,data:t.data}})}}function $(){return{...this,l:!0,e:`undefined | ${this.e}`}}function v(r,e){return`Type '${A(e,!!r.h)}' is not assignable to '${r.e}'`}function H(){return{...this,d:!0,e:`null | ${this.e}`}}function Q(){return{...this,f:!0,e:`null | undefined | ${this.e}`}}var u={__rc_type:void 0,withFallback:q,where:G,r:void 0,e:void 0,optional:$,optionalKey:$,orNullish:Q,withAutofix:Z,orNull:H,default:L,nullishDefault:M,or:B,parse:J,parseJson:z,_:void 0,R:void 0,x:void 0,l:!1,d:!1,f:!1,k:!1,h:!1,c:void 0,T:void 0,s:void 0,p:void 0,o:!1,g:!1},ur={...u,r(r,e){return i(this,r,e,()=>r===void 0)},e:"undefined"},lr={...u,r(r,e){return i(this,r,e,()=>r===null)},e:"null"},fr={...u,r(r){return{ok:!0,data:r,errors:void 0}},e:"any"},dr={...u,r(r){return{ok:!0,data:r,errors:void 0}},e:"unknown"},O={...u,r(r,e){return i(this,r,e,()=>typeof r=="boolean")},e:"boolean"},S={...u,r(r,e){return i(this,r,e,()=>typeof r=="string")},e:"string"},E={...u,r(r,e){return i(this,r,e,()=>typeof r=="number"&&!Number.isNaN(r))},e:"number"},cr={...u,r(r,e){return i(this,r,e,()=>typeof r=="object"&&r instanceof Date&&!Number.isNaN(r.getTime()))},e:"date"};var x=1;function X(...r){if(r.length===0)throw new Error("Unions should have at least one type");let e="",s=!1;for(let t of r)e&&(e+=" | "),e+=t.e,!s&&t.o&&(s=!0);return{...u,e,o:s,r(t,n){return i(this,t,n,()=>{let a=n.n,o=[],l=0,b=!1,p=[],m=0;for(let h of r){m+=1,h.o&&(n.n=`${a}|union ${m}|`);let j=n.t;n.t=!0,n.a=0;let d=h.r(t,n),k=n.a;if(n.t=j,n.a=0,d.ok)return{data:d.data,errors:!1};h.o&&k!==-1?k>0?p.push(...d.errors):(l<x&&o.push(...d.errors),l+=1):b=!0}return n.n=a,p.length>0||o.length>0?((l>x||b)&&o.push(f(n,"not matches any other union member")),{errors:[...p,...o],data:void 0}):!1})}}}function Y(r,e){return{...r,l:!1,f:!1,d:!1,r(t,n){return i(this,t,n,()=>{if(t===void 0)return s();let a=r.r(t,n);return a.ok?a.data===void 0?s():{data:a.data,errors:!1}:{data:void 0,errors:a.errors}})},e:`${r.e}_default`};function s(){return{data:w(e)?e():e,errors:!1}}}function rr(r,e){return{...r,l:!1,f:!1,d:!1,r(t,n){return i(this,t,n,()=>{if(t==null)return s();let a=r.r(t,n);return a.ok?a.data===null||a.data===void 0?s():{data:a.data,errors:!1}:{data:void 0,errors:a.errors}})},e:`${r.e}_nullish_default`};function s(){return{data:w(e)?e():e,errors:!1}}}function g(r){r.warnings&&r.warnings.length>0&&console.warn(`Unwrap warnings: ${r.warnings.join(`
|
|
2
|
+
`)}`)}function c(){if(this.errors)throw new _(this.errors);return g(this),this.value}function y(r){return this.errors?r:(g(this),this.value)}function T(){return this.errors?null:(g(this),this.value)}function I(r,e,{noWarnings:s=!1}={}){let t={i:[],n:"",t:!1,a:0,y:s,u:!1,b:!1},n=e.r(r,t);return n.ok?{error:!1,errors:!1,ok:!0,data:n.data,value:n.data,warnings:t.i.length>0?t.i:!1,unwrap:c,unwrapOr:y,unwrapOrNull:T}:{ok:!1,error:!0,errors:n.errors,unwrap:c,unwrapOr:y,unwrapOrNull:T}}var _=class extends Error{constructor(s){super(s.join(`
|
|
3
|
+
`));this.errors=s}name="RcValidationError"};function A(r,e){let s=typeof r,t=(()=>{if(s==="object"){if(Array.isArray(r))return"array";if(!r)return"null"}return typeof r=="number"&&Number.isNaN(r)?"NaN":s})();return e&&(t==="string"||t==="number"||t==="boolean")?`${t}(${r})`:t}function er(r){return typeof r=="object"&&r!==null&&!Array.isArray(r)}function nr(r,e,s){try{if(typeof r!="string")return{ok:!1,error:!0,errors:[`expected a json string, got ${A(r,!0)}`],unwrap:c,unwrapOr:y,unwrapOrNull:T};let t=JSON.parse(r);return I(t,e,s)}catch(t){return{ok:!1,error:!0,errors:[`json parsing error: ${er(t)?t.message:""}`],unwrap:c,unwrapOr:y,unwrapOrNull:T}}}function w(r){return typeof r=="function"}var tr=O.withAutofix(r=>r==null||r===0||r===1?{fixed:!!r}:r==="true"||r==="false"?{fixed:r==="true"}:!1),sr=S.withAutofix(r=>typeof r=="number"&&!Number.isNaN(r)?{fixed:r.toString()}:!1),ar=E.withAutofix(r=>{if(typeof r=="string"){let e=Number(r);if(!Number.isNaN(e))return{fixed:e}}return!1});0&&(module.exports={rc_boolean_autofix,rc_number_autofix,rc_string_autofix});
|
|
4
4
|
//# sourceMappingURL=autofixable.cjs.map
|
package/dist/autofixable.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/autofixable.ts","../src/runcheck.ts"],"sourcesContent":["import { rc_boolean, rc_number, rc_string } from './runcheck'\n\n/** Equivalent to ts type: `boolean`. Autofixes `0 | 1 | 'true' | 'false' | null | undefined` inputs. */\nexport const rc_boolean_autofix = rc_boolean.withAutofix((input) => {\n if (input === null || input === undefined || input === 0 || input === 1) {\n return { fixed: !!input }\n }\n\n if (input === 'true' || input === 'false') {\n return { fixed: input === 'true' }\n }\n\n return false\n})\n\n/** Equivalent to ts type: `string`. Autofixes valid `number` inputs. */\nexport const rc_string_autofix = rc_string.withAutofix((input) => {\n if (typeof input === 'number' && !Number.isNaN(input)) {\n return { fixed: input.toString() }\n }\n\n return false\n})\n\n/** Equivalent to ts type: `number`. Autofixes valid numeric `string` inputs. */\nexport const rc_number_autofix = rc_number.withAutofix((input) => {\n if (typeof input === 'string') {\n const parsed = Number(input)\n\n if (!Number.isNaN(parsed)) {\n return { fixed: parsed }\n }\n }\n\n return false\n})\n","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"],"mappings":"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","names":["autofixable_exports","__export","rc_boolean_autofix","rc_number_autofix","rc_string_autofix","__toCommonJS","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_","parse","type","input","ctx","checkIfIsValid","_optional_","_orNullish_","_orNull_","isValid","noWarnings_","fb","_fallback_","addWarning","getResultErrors","isFn","_useAutFix_","_autoFix_","autofixed","error","getWarningOrErrorWithPath","getErrorMsg","err","path_","withAutofix","customAutofix","where","predicate","_parse_","result","predicateResult","_kind_","optional","normalizedTypeOf","_show_value_in_error_","orNull","orNullish","defaultProps","withFallback","defaultMethod","nullishDefaultMethod","orMethod","parseMethod","parseJsonMethod","_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","maxShallowObjErrors","rc_union","types","kind","allIsObject","type","_kind_","_is_object_","defaultProps","_parse_","input","ctx","parse","basePath","path_","shallowObjErrors","shallowObjErrorsCount","hasNonObjTypeMember","nonShallowObjErrors","i","currentObjErrShortCircuit","objErrShortCircuit_","objErrKeyIndex_","parseResult","objErrIndex","getWarningOrErrorWithPath","rc_default","schema","defaultValue","_optional_","_orNullish_","_orNull_","getDefaultResult","isFn","rc_nullish_default","showWarnings","result","unwrap","RcValidationError","unwrapOr","defaultValue","unwrapOrNull","rc_parse","input","type","noWarnings","ctx","warnings_","path_","objErrShortCircuit_","objErrKeyIndex_","noWarnings_","strictObj_","noLooseArray_","parseResult","_parse_","RcValidationError","errors","normalizedTypeOf","input","showValueInError","typeOf","type","isObject","value","rc_parse_json","jsonString","schema","options","normalizedTypeOf","unwrap","unwrapOr","unwrapOrNull","parsed","rc_parse","err","isObject","isFn","value","rc_boolean_autofix","rc_boolean","input","rc_string_autofix","rc_string","rc_number_autofix","rc_number","parsed"]}
|
|
1
|
+
{"version":3,"sources":["../src/autofixable.ts","../src/runcheck.ts"],"sourcesContent":["import { rc_boolean, rc_number, rc_string } from './runcheck'\n\n/** Equivalent to ts type: `boolean`. Autofixes `0 | 1 | 'true' | 'false' | null | undefined` inputs. */\nexport const rc_boolean_autofix = rc_boolean.withAutofix((input) => {\n if (input === null || input === undefined || input === 0 || input === 1) {\n return { fixed: !!input }\n }\n\n if (input === 'true' || input === 'false') {\n return { fixed: input === 'true' }\n }\n\n return false\n})\n\n/** Equivalent to ts type: `string`. Autofixes valid `number` inputs. */\nexport const rc_string_autofix = rc_string.withAutofix((input) => {\n if (typeof input === 'number' && !Number.isNaN(input)) {\n return { fixed: input.toString() }\n }\n\n return false\n})\n\n/** Equivalent to ts type: `number`. Autofixes valid numeric `string` inputs. */\nexport const rc_number_autofix = rc_number.withAutofix((input) => {\n if (typeof input === 'string') {\n const parsed = Number(input)\n\n if (!Number.isNaN(parsed)) {\n return { fixed: parsed }\n }\n }\n\n return false\n})\n","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\n/**\n * Validates a string that starts with `prefix`.\n *\n * Infers the template-literal type `` `${prefix}${string}` ``.\n *\n * @example\n * ```typescript\n * const schema = rc_string_starts_with('user_') // RcType<`user_${string}`>\n * schema.parse('user_42') // ok\n * schema.parse('admin_42') // error\n * ```\n */\nexport function rc_string_starts_with<const P extends string>(\n prefix: P,\n): RcType<`${P}${string}`> {\n return {\n ...defaultProps,\n _parse_(input, ctx) {\n return parse(\n this,\n input,\n ctx,\n () => typeof input === 'string' && input.startsWith(prefix),\n )\n },\n _show_value_in_error_: true,\n _kind_: `\\`${prefix}\\${string}\\``,\n }\n}\n\n/**\n * Validates a string that ends with `suffix`.\n *\n * Infers the template-literal type `` `${string}${suffix}` ``.\n *\n * @example\n * ```typescript\n * const schema = rc_string_ends_with('.png') // RcType<`${string}.png`>\n * schema.parse('avatar.png') // ok\n * schema.parse('avatar.jpg') // error\n * ```\n */\nexport function rc_string_ends_with<const S extends string>(\n suffix: S,\n): RcType<`${string}${S}`> {\n return {\n ...defaultProps,\n _parse_(input, ctx) {\n return parse(\n this,\n input,\n ctx,\n () => typeof input === 'string' && input.endsWith(suffix),\n )\n },\n _show_value_in_error_: true,\n _kind_: `\\`\\${string}${suffix}\\``,\n }\n}\n\n/**\n * Validates a string that contains `substring`.\n *\n * Infers the template-literal type `` `${string}${substring}${string}` ``.\n *\n * @example\n * ```typescript\n * const schema = rc_string_contains('@') // RcType<`${string}@${string}`>\n * schema.parse('a@b') // ok\n * schema.parse('ab') // error\n * ```\n */\nexport function rc_string_contains<const S extends string>(\n substring: S,\n): RcType<`${string}${S}${string}`> {\n return {\n ...defaultProps,\n _parse_(input, ctx) {\n return parse(\n this,\n input,\n ctx,\n () => typeof input === 'string' && input.includes(substring),\n )\n },\n _show_value_in_error_: true,\n _kind_: `\\`\\${string}${substring}\\${string}\\``,\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\n/** try to fix an invalid input and revalidate the fixed value with the same schema */\n/**\n * Creates a type that attempts to fix an invalid input once and revalidates\n * the fixed value against the same schema. If the fixed value is still\n * invalid, the original result is returned. If the fix succeeds, validation\n * passes and the original errors are reported as warnings.\n * @param type - The type to validate against\n * @param tryFix - Function that receives the invalid input and the errors and\n * warnings of the failed parse. Returns `{ fixed: value }` to revalidate the\n * fixed value, or `false` to skip fixing\n * @returns A runcheck type that tries to fix invalid inputs\n * @example\n * ```typescript\n * const schema = rc_try_fix(\n * rc_object({ name: rc_string, age: rc_number }),\n * (input) => {\n * if (typeof input === 'string') {\n * const parsed: unknown = JSON.parse(input)\n * return { fixed: parsed }\n * }\n * return false\n * },\n * )\n * ```\n */\nexport function rc_try_fix<T>(\n type: RcType<T>,\n tryFix: (\n input: unknown,\n failedParse: { errors: string[]; warnings: string[] },\n ) => { fixed: unknown } | false,\n): RcType<T> {\n return {\n ...defaultProps,\n _kind_: type._kind_,\n _parse_(input, ctx) {\n return parse(this, input, ctx, (): IsValid<T> => {\n // failed parses can leave child path/short-circuit state in ctx, so\n // it needs to be restored before reusing the ctx in a new parse\n const parentPath = ctx.path_\n const parentObjErrShortCircuit = ctx.objErrShortCircuit_\n const parentObjErrKeyIndex = ctx.objErrKeyIndex_\n const warningsStart = ctx.warnings_.length\n\n const result = type._parse_(input, ctx)\n\n if (result.ok) {\n return { errors: false, data: result.data }\n }\n\n if (ctx.noWarnings_) {\n return { errors: result.errors, data: undefined }\n }\n\n const attemptWarnings = ctx.warnings_.splice(warningsStart)\n\n ctx.path_ = parentPath\n ctx.objErrShortCircuit_ = parentObjErrShortCircuit\n ctx.objErrKeyIndex_ = parentObjErrKeyIndex\n\n const fixResult = tryFix(input, {\n errors: result.errors,\n warnings: attemptWarnings,\n })\n\n if (fixResult) {\n const fixedParseResult = type._parse_(fixResult.fixed, ctx)\n\n if (fixedParseResult.ok) {\n const fixedWarnings = ctx.warnings_.splice(warningsStart)\n\n const dedupedWarnings = new Set<string>()\n\n for (const error of result.errors) {\n const pathEnd = error.startsWith('$') ? error.indexOf(': ') : -1\n\n dedupedWarnings.add(\n pathEnd === -1 ?\n `Fixed error -> ${error}`\n : `${error.slice(0, pathEnd)}: Fixed error -> ${error.slice(\n pathEnd + 2,\n )}`,\n )\n }\n\n for (const warning of fixedWarnings) {\n dedupedWarnings.add(warning)\n }\n\n for (const warning of dedupedWarnings) {\n ctx.warnings_.push(warning)\n }\n\n return { errors: false, data: fixedParseResult.data }\n }\n\n ctx.warnings_.length = warningsStart\n ctx.path_ = parentPath\n ctx.objErrShortCircuit_ = parentObjErrShortCircuit\n ctx.objErrKeyIndex_ = parentObjErrKeyIndex\n }\n\n for (const warning of attemptWarnings) {\n ctx.warnings_.push(warning)\n }\n\n return { errors: result.errors, data: undefined }\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"],"mappings":"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","names":["autofixable_exports","__export","rc_boolean_autofix","rc_number_autofix","rc_string_autofix","__toCommonJS","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_","parse","type","input","ctx","checkIfIsValid","_optional_","_orNullish_","_orNull_","isValid","noWarnings_","fb","_fallback_","addWarning","getResultErrors","isFn","_useAutFix_","_autoFix_","autofixed","error","getWarningOrErrorWithPath","getErrorMsg","err","path_","withAutofix","customAutofix","where","predicate","_parse_","result","predicateResult","_kind_","optional","normalizedTypeOf","_show_value_in_error_","orNull","orNullish","defaultProps","withFallback","defaultMethod","nullishDefaultMethod","orMethod","parseMethod","parseJsonMethod","_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","maxShallowObjErrors","rc_union","types","kind","allIsObject","type","_kind_","_is_object_","defaultProps","_parse_","input","ctx","parse","basePath","path_","shallowObjErrors","shallowObjErrorsCount","hasNonObjTypeMember","nonShallowObjErrors","i","currentObjErrShortCircuit","objErrShortCircuit_","objErrKeyIndex_","parseResult","objErrIndex","getWarningOrErrorWithPath","rc_default","schema","defaultValue","_optional_","_orNullish_","_orNull_","getDefaultResult","isFn","rc_nullish_default","showWarnings","result","unwrap","RcValidationError","unwrapOr","defaultValue","unwrapOrNull","rc_parse","input","type","noWarnings","ctx","warnings_","path_","objErrShortCircuit_","objErrKeyIndex_","noWarnings_","strictObj_","noLooseArray_","parseResult","_parse_","RcValidationError","errors","normalizedTypeOf","input","showValueInError","typeOf","type","isObject","value","rc_parse_json","jsonString","schema","options","normalizedTypeOf","unwrap","unwrapOr","unwrapOrNull","parsed","rc_parse","err","isObject","isFn","value","rc_boolean_autofix","rc_boolean","input","rc_string_autofix","rc_string","rc_number_autofix","rc_number","parsed"]}
|
package/dist/autofixable.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as f,v as t,w as o}from"./chunk-
|
|
1
|
+
import{u as f,v as t,w as o}from"./chunk-523HPU74.js";var s=f.withAutofix(r=>r==null||r===0||r===1?{fixed:!!r}:r==="true"||r==="false"?{fixed:r==="true"}:!1),n=t.withAutofix(r=>typeof r=="number"&&!Number.isNaN(r)?{fixed:r.toString()}:!1),u=o.withAutofix(r=>{if(typeof r=="string"){let e=Number(r);if(!Number.isNaN(e))return{fixed:e}}return!1});export{s as rc_boolean_autofix,u as rc_number_autofix,n as rc_string_autofix};
|
|
2
2
|
//# sourceMappingURL=autofixable.js.map
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
function G(e,r){return{...r,c:e}}function g(e){if($(e))return e;if(x(e)){let r={};for(let[n,t]of Object.entries(e))r[n]=g(t);return O(r)}else if(Array.isArray(e)){let[r,n]=e;switch(r){case"optional":return g(n).optional();case"nullish_or":return g(n).orNullish();case"null_or":return g(n).orNull();case"array_of":return P(g(n));case"loose_array_of":return S(g(n));case"optional_array_of":return P(g(n)).optional();case"optional_loose_array_of":return S(g(n)).optional();case"null_or_array_of":return P(g(n)).orNull();case"null_or_loose_array_of":return S(g(n)).orNull();case"nullish_or_array_of":return P(g(n)).orNullish();case"nullish_or_loose_array_of":return S(g(n)).orNullish();default:return r}}throw new Error(`invalid schema: ${e}`)}function O(e,{normalizeKeysFrom:r,extends:n}={}){let t={};for(let[o,a]of Object.entries(e))t[o]=g(a);let s=Object.entries(t).map(([o,a])=>({key:o,type:a}));return{...d,s:t,e:n?"extends_object":"object",p:"",o:!0,g:!!n,r(o,a){return y(this,o,a,()=>{if(!x(o)){if(a.a=-1,a.t&&!this.p)return!1;if(!this.p){let l=`${this.e}{ `,u=0;for(let{key:p,type:m}of s){if(l.length>100){l+=", ...";break}u!==0&&(l+=", "),l+=`${p}: ${m.e}`,u++}l+=" }",this.p=l}return{data:void 0,errors:[R(a,`Type '${w(o,!1)}' is not assignable to '${this.p}'`)]}}let i=this.e==="strict_obj"||a.u?new Set(Object.keys(o)):void 0;if(i&&i.size>s.length){a.a=-1;let l=[];if(a.t)return{data:void 0,errors:[R(a,`Expected strict object with ${s.length} keys but got ${i.size}`)]};for(let{key:u}of s)i.has(u)?i.delete(u):l.push(R(a,`Key '${u}' is missing`));for(let u of i)l.push(R(a,`Key '${u}' is not defined in the object shape`));return{data:void 0,errors:l}}let f={},h=[],b=a.n,k=-1;for(let l of s){let u=l.key,p=l.type,m=u;k+=1;let T=u===""||u.includes(" ")?`['${u}']`:`.${u}`,_=`${b}${T}`;a.n=_;let j=o[u],D=u;if(j===void 0&&p.c&&(j=o[p.c],D=p.c),j===void 0&&r==="snake_case"){let N=F(u);j=o[N],D=N}i?.delete(D);let C=p.r(j,a);if(C.ok)f[m]=C.data;else{for(let N of C.errors)a.n=_,h.push(N);if(a.t){a.a=k;break}}}if(i&&i.size>0)for(let l of i)a.n=b,h.push(R(a,`Key '${l}' is not defined in the object shape`));return h.length>0?{errors:h,data:void 0}:(a.n=b,this.g?{errors:!1,data:{...o,...f}}:{errors:!1,data:f})})}}}function H(e,r){if($(e)){if(!e.s)throw new Error("rc_obj_extends: schema must be an object type");return{...e,e:"extends_object",g:!0}}return{...O(e,r),e:"extends_object",g:!0}}function X(e){if(!e.s)throw new Error("type does not have an object shape");return e.s}function Y(e,r){return{...O(e,r),e:"strict_obj"}}function ee(e,{nonRecursive:r}={}){if(r){if(!e.s)throw new Error("rc_enable_obj_strict: nonRecursive option can only be used on object types");return{...e,e:"strict_obj"}}return{...e,r(n,t){let s=t.u;t.u=!0;let o=e.r(n,t);return t.u=s,o}}}function re(...e){let r={};for(let n of e)Object.assign(r,n.s);return O(r)}function ne(e,r){let n={};if(!e.s)throw new Error("rc_obj_pick: obj must be an object type");for(let t of r){let s=e.s[t];s&&(n[t]=s)}return O(n)}function te(e,r){let n={};if(!e.s)throw new Error("rc_obj_omit: obj must be an object type");for(let t of Object.keys(e.s))r.includes(t)||(n[t]=e.s[t]);return O(n)}function se(){return(e,r)=>O(e,r)}function V(e,r){let n={};for(let[t,s]of Object.entries(r))n[t]=$(s)?s:O(s);return{...d,e:"discriminated_union",o:!0,r(t,s){return y(this,t,s,()=>{if(!x(t))return s.a=-1,!1;let o=t[e],a=s.n,c=n[o];if(!c){let f=w(o,!0);return{errors:[R({n:`${a}.${e}`},`Type '${f}' is not a valid discriminator`)],data:void 0}}s.n=`${a}|${e}: ${o}|`;let i=c.r(t,s);return s.n=a,i.ok?(i.data[e]=o,{errors:!1,data:i.data}):{errors:i.errors,data:void 0}})}}}function oe(e){return r=>V(e,r)}function ae(...e){let r="",n=!0;for(let t of e)r&&(r+=" & "),t.o||(n=!1),r+=t.e.includes("|")?`(${t.e})`:t.e;return{...d,e:r,o:n,r(t,s){return y(this,t,s,()=>{let o=null;for(let a of e){let c=a.r(t,s);if(c.ok)a.o&&(o={...o||{},...c.data});else return a.o?c:!1}return o?{data:o,errors:!1}:!0})}}}var ie=()=>{};function ue(e){return{...this,R:e===void 0?ie:e}}function ce(e){return be(this,e)}function le(e){return ge(this,e)}function fe(e){return _e(this,e)}function ye(e,r){return A(e,this,r)}function de(e,r){return we(e,this,r)}function R(e,r){return`${e.n?`$${e.n}: `:""}${r}`}function B(e,r){e.i.push(r.startsWith("$")?r:R(e,r))}function J(e,r){r.forEach(n=>B(e,n))}function y(e,r,n,t){if(e.l&&r===void 0)return{ok:!0,data:r,errors:void 0};if(e.f&&r==null)return{ok:!0,data:r,errors:void 0};if(e.d&&r===null)return{ok:!0,data:r,errors:void 0};let s=t();if(s&&(s===!0||!s.errors))return{ok:!0,data:s===!0?r:s.data,errors:void 0};if(!n.y){let o=e.R;if(o!==void 0)return B(n,`Fallback used, errors -> ${L(s,n,e,r)}`),{ok:!0,data:U(o)?o(r):o,errors:void 0};if(e.k&&e.T){let a=e.T(r);if(a)return a.safeFix||B(n,`Autofixed from error -> ${L(s,n,e,r)}`),a.errors?{ok:!1,data:void 0,errors:a.errors.map(c=>R(n,c))}:{ok:!0,data:a.fixed,errors:void 0}}}return{ok:!1,data:void 0,errors:s?s.errors:[R(n,Q(e,r))]}}function L(e,r,n,t){return e?e.errors.map(s=>s.replace(r.n,"")).join("; "):Q(n,t)}function Te(e){return{...this,k:!0,T:e}}function pe(e){return{...this,r:(r,n)=>y(this,r,n,()=>{let t=this.r(r,n);if(!t.ok)return{errors:t.errors,data:void 0};let s=e(t.data);return s!==!0?{errors:[R(n,`Predicate failed${s===!1?` for type '${this.e}'`:`: ${s.error}`}`)],data:void 0}:{errors:!1,data:t.data}})}}function M(){return{...this,l:!0,e:`undefined | ${this.e}`}}function Q(e,r){return`Type '${w(r,!!e.h)}' is not assignable to '${e.e}'`}function Re(){return{...this,d:!0,e:`null | ${this.e}`}}function he(){return{...this,f:!0,e:`null | undefined | ${this.e}`}}var d={__rc_type:void 0,withFallback:ue,where:pe,r:void 0,e:void 0,optional:M,optionalKey:M,orNullish:he,withAutofix:Te,orNull:Re,default:ce,nullishDefault:le,or:fe,parse:ye,parseJson:de,_:void 0,R:void 0,x:void 0,l:!1,d:!1,f:!1,k:!1,h:!1,c:void 0,T:void 0,s:void 0,p:void 0,o:!1,g:!1},ze={...d,r(e,r){return y(this,e,r,()=>e===void 0)},e:"undefined"},Je={...d,r(e,r){return y(this,e,r,()=>e===null)},e:"null"},Qe={...d,r(e){return{ok:!0,data:e,errors:void 0}},e:"any"},Ze={...d,r(e){return{ok:!0,data:e,errors:void 0}},e:"unknown"},Ge={...d,r(e,r){return y(this,e,r,()=>typeof e=="boolean")},e:"boolean"},He={...d,r(e,r){return y(this,e,r,()=>typeof e=="string")},e:"string"},Xe={...d,r(e,r){return y(this,e,r,()=>typeof e=="number"&&!Number.isNaN(e))},e:"number"},Ye={...d,r(e,r){return y(this,e,r,()=>typeof e=="object"&&e instanceof Date&&!Number.isNaN(e.getTime()))},e:"date"};function er(e){return{...d,r(r,n){return y(this,r,n,()=>r instanceof e)},e:`instanceof_${e.name||"AnonymousClass"}`}}function rr(...e){let r=Array.isArray(e[0])?e[0]:e;if(r.length===0)throw new Error("rc_literal requires at least one literal");return{...d,r(n,t){return y(this,n,t,()=>{for(let s of r)if(n===s)return!0;return!1})},h:!0,m:r,e:r.length==1?w(r[0],!0):r.map(n=>w(n,!0)).join(" | ")}}function nr(e){if(!e.m)throw new Error("Type is not a literal type");return e.m}function tr(e){return{...d,r(r,n){return y(this,r,n,()=>typeof r=="string"&&r.startsWith(e))},h:!0,e:`\`${e}\${string}\``}}function sr(e){return{...d,r(r,n){return y(this,r,n,()=>typeof r=="string"&&r.endsWith(e))},h:!0,e:`\`\${string}${e}\``}}function or(e){return{...d,r(r,n){return y(this,r,n,()=>typeof r=="string"&&r.includes(e))},h:!0,e:`\`\${string}${e}\${string}\``}}var z=1;function _e(...e){if(e.length===0)throw new Error("Unions should have at least one type");let r="",n=!1;for(let t of e)r&&(r+=" | "),r+=t.e,!n&&t.o&&(n=!0);return{...d,e:r,o:n,r(t,s){return y(this,t,s,()=>{let o=s.n,a=[],c=0,i=!1,f=[],h=0;for(let b of e){h+=1,b.o&&(s.n=`${o}|union ${h}|`);let k=s.t;s.t=!0,s.a=0;let l=b.r(t,s),u=s.a;if(s.t=k,s.a=0,l.ok)return{data:l.data,errors:!1};b.o&&u!==-1?u>0?f.push(...l.errors):(c<z&&a.push(...l.errors),c+=1):i=!0}return s.n=o,f.length>0||a.length>0?((c>z||i)&&a.push(R(s,"not matches any other union member")),{errors:[...f,...a],data:void 0}):!1})}}}function be(e,r){return{...e,l:!1,f:!1,d:!1,r(t,s){return y(this,t,s,()=>{if(t===void 0)return n();let o=e.r(t,s);return o.ok?o.data===void 0?n():{data:o.data,errors:!1}:{data:void 0,errors:o.errors}})},e:`${e.e}_default`};function n(){return{data:U(r)?r():r,errors:!1}}}function ge(e,r){return{...e,l:!1,f:!1,d:!1,r(t,s){return y(this,t,s,()=>{if(t==null)return n();let o=e.r(t,s);return o.ok?o.data===null||o.data===void 0?n():{data:o.data,errors:!1}:{data:void 0,errors:o.errors}})},e:`${e.e}_nullish_default`};function n(){return{data:U(r)?r():r,errors:!1}}}function ar(e,r){return{...e,r(n,t){return y(this,n,t,()=>{let s=e.r(n,t);return s.ok?{data:s.data,errors:!1}:{data:U(r)?r():r,errors:!1}})}}}function ke(e,{checkKey:r,looseCheck:n}={}){return{...d,e:`record<string, ${e.e}>`,o:!0,r(t,s){return y(this,t,s,()=>{if(!x(t))return!1;let o={},a=[],c=s.n;for(let[i,f]of Object.entries(t)){let h=i===""||i.includes(" ")?`['${i}']`:`.${i}`,b=`${c}${h}`;if(s.n=b,r&&!r(i)){a.push(R(s,`Key '${i}' is not allowed`));continue}let k=t[i],l=e.r(f,s);if(l.ok)o[i]=k;else{let u=l.errors;for(let p of u)a.push(p);if(s.t)break}}if(a.length>0)if(n)J(s,a);else return{errors:a,data:void 0};return s.n=c,{errors:!1,data:o}})}}}function ir(e,{checkKey:r}={}){return ke(e,{checkKey:r,looseCheck:!0})}function E(e,r,n,t=!1,s){let o=t&&!n.y&&!n.b,a=s?.unique,c=[],i=[],f=a?new Set:void 0,h=n.n,b=Array.isArray(r),k=-1;for(let l of e){k++;let u=b?r[k]:r,p=`[${k}]`,m=`${h}${p}`;if(n.n=m,s?.filter){let _=s.filter(l);if(typeof _=="boolean"){if(!_)continue}else if("errors"in _)if(o){c.push([_.errors,m]);continue}else return{errors:_.errors,data:void 0};n.n=m}let T=u.r(l,n);if(n.n=m,T.ok&&f){let _=T.data,j=typeof a=="string";j?_=T.data[a]:typeof a=="function"&&(_=a(T.data)),f.has(_)?(j&&(n.n=`${h}${p}.${a}`),T={ok:!1,data:void 0,errors:[R(n,j?`Type '${u.s?.[a]?.e}' with value "${_}" is not unique`:typeof a=="function"?`Type '${u.e}' unique fn return with value "${_}" is not unique`:`${u.e} value is not unique`)]}):f.add(_)}if(T.ok)i.push(T.data);else if(o){c.push([T.errors,m]);continue}else return{errors:T.errors,data:void 0}}if(c.length>0){let l=[];for(let[u,p]of c){for(let m of u){let T=m.slice(p.length+1);T.startsWith(": ")&&(T=T.slice(2)),(T.startsWith(".")||T.startsWith("["))&&(T=`#${T}`);let _=`$${p}: Rejected, error -> ${T}`;l.push(_)}J(n,l)}}return{errors:!1,data:i}}function P(e,r){return{...d,e:`${e.e}[]`,_:e,r(n,t){return y(this,n,t,()=>Array.isArray(n)?n.length===0?!0:E.call(this,n,e,t,!1,r):!1)}}}function ur(e){if(!e._)throw new Error("Type does not have an item type");return e._}function cr(e,{nonRecursive:r=!1}={}){if(r){if(!e.e.endsWith("[]"))throw new Error("rc_disable_loose_array: nonRecursive option can only be used with array types");return{...e,r(n,t){return y(this,n,t,()=>Array.isArray(n)?n.length===0?!0:E.call(this,n,e,t,!1):!1)}}}return{...e,r(n,t){let s=t.b;t.b=!0;let o=e.r(n,t);return t.b=s,o}}}function S(e,r){return{...d,_:e,e:`${e.e}[]`,r(n,t){return y(this,n,t,()=>Array.isArray(n)?n.length===0?!0:E.call(this,n,e,t,!0,r):!1)}}}function lr(e,r,n,t){return{...d,_:n,e:`${n.e}[]`,r(s,o){return y(this,s,o,()=>Array.isArray(s)?s.length===0?!0:E.call(this,s,n,o,t?.loose,{...t,filter(a){let c=e.r(a,o);return c.ok?r(c.data):{errors:c.errors}}}):!1)}}}function fr(e){return{...d,e:`[${e.map(r=>r.e).join(", ")}]`,r(r,n){return y(this,r,n,()=>!Array.isArray(r)||r.length!==e.length?!1:E.call(this,r,e,n))}}}function q(e){e.warnings&&e.warnings.length>0&&console.warn(`Unwrap warnings: ${e.warnings.join(`
|
|
2
|
+
`)}`)}function v(){if(this.errors)throw new I(this.errors);return q(this),this.value}function W(e){return this.errors?e:(q(this),this.value)}function K(){return this.errors?null:(q(this),this.value)}function A(e,r,{noWarnings:n=!1}={}){let t={i:[],n:"",t:!1,a:0,y:n,u:!1,b:!1},s=r.r(e,t);return s.ok?{error:!1,errors:!1,ok:!0,data:s.data,value:s.data,warnings:t.i.length>0?t.i:!1,unwrap:v,unwrapOr:W,unwrapOrNull:K}:{ok:!1,error:!0,errors:s.errors,unwrap:v,unwrapOr:W,unwrapOrNull:K}}function yr(e){return r=>A(r,e)}function dr(e,r,n){let t=A(e,r,n);return t.errors?{data:null,errors:t.errors,warnings:!1}:{data:t.value,errors:!1,warnings:t.warnings}}function Tr(e){return me(e,null)}function me(e,r){return e.error?{value:r,errors:e.errors,warnings:!1}:{value:e.value,errors:!1,warnings:e.warnings}}var I=class extends Error{constructor(n){super(n.join(`
|
|
3
|
+
`));this.errors=n}name="RcValidationError"};function pr(e){if(e.errors)throw new I(e.errors);return e}function Oe(e,r){let n={i:[],n:"",t:!1,a:0,y:!1,u:!1,b:!1};return r.r(e,n).ok}function Rr(e){return r=>Oe(r,e)}function hr(e){let r;return{...d,e:"recursive",r(n,t){return r||(r={...e()},this.l&&(r.l=this.l),this.f&&(r.f=this.f),this.d&&(r.d=this.d),this.T&&(r.T=this.T),this.R&&(r.R=this.R),this.c&&(r.c=this.c)),r.r(n,t)}}}function Z(e,r,n,t){let s=e.n,o=e.t,a=e.u,c=e.y;e.t=!0,e.n=`${s}|output|`,t||(e.u=!0,e.y=!0);let i=r.r(n,e);return e.u=a,e.y=c,e.n=s,e.t=o,i}function je(e,r,{outputSchema:n,disableStrictOutputSchema:t}={}){return{...d,e:`${e.e}_transform`,r(s,o){return y(this,s,o,()=>{let a=null;if(n){let f=Z(o,n,s,t);if(f.ok)return{data:f.data,errors:!1};a=f.errors}let i={...e,e:this.e}.r(s,o);return i.ok?{errors:!1,data:r(i.data,e)}:{errors:[...a||[],...i.errors],data:void 0}})}}}function _r(e,r){return je(e,r)}function br(e,r,{outputSchema:n,disableStrictOutputSchema:t}={}){return{...d,e:`${e.e}_transform`,r(s,o){return y(this,s,o,()=>{let a=null;if(n){let f=Z(o,n,s,t);if(f.ok)return{errors:!1,data:f.data};a=f.errors}let i={...e,e:this.e}.r(s,o);if(i.ok){let f=r(i.data,e);return f.ok?{errors:!1,data:f.data}:{errors:typeof f.errors=="string"?[R(o,f.errors)]:f.errors.map(h=>R(o,h)),data:void 0}}return{errors:[...a||[],...i.errors],data:void 0}})}}}function gr(e,r){return{...d,e:e.e,r(n,t){return y(this,n,t,()=>{let s=t.n,o=t.t,a=t.a,c=t.i.length,i=e.r(n,t);if(i.ok)return{errors:!1,data:i.data};if(t.y)return{errors:i.errors,data:void 0};let f=t.i.splice(c);t.n=s,t.t=o,t.a=a;let h=r(n,{errors:i.errors,warnings:f});if(h){let b=e.r(h.fixed,t);if(b.ok){let k=t.i.splice(c),l=new Set;for(let u of i.errors){let p=u.startsWith("$")?u.indexOf(": "):-1;l.add(p===-1?`Fixed error -> ${u}`:`${u.slice(0,p)}: Fixed error -> ${u.slice(p+2)}`)}for(let u of k)l.add(u);for(let u of l)t.i.push(u);return{errors:!1,data:b.data}}t.i.length=c,t.n=s,t.t=o,t.a=a}for(let b of f)t.i.push(b);return{errors:i.errors,data:void 0}})}}}function w(e,r){let n=typeof e,t=(()=>{if(n==="object"){if(Array.isArray(e))return"array";if(!e)return"null"}return typeof e=="number"&&Number.isNaN(e)?"NaN":n})();return r&&(t==="string"||t==="number"||t==="boolean")?`${t}(${e})`:t}function kr(e){if(e.errors)throw new Error(`invalid input: ${e.errors.join(", ")}`)}function x(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function F(e){return e.replace(/\W+/g," ").split(/ |\B(?=[A-Z])/).map(r=>r.toLowerCase()).join("_")}function we(e,r,n){try{if(typeof e!="string")return{ok:!1,error:!0,errors:[`expected a json string, got ${w(e,!0)}`],unwrap:v,unwrapOr:W,unwrapOrNull:K};let t=JSON.parse(e);return A(t,r,n)}catch(t){return{ok:!1,error:!0,errors:[`json parsing error: ${x(t)?t.message:""}`],unwrap:v,unwrapOr:W,unwrapOrNull:K}}}function U(e){return typeof e=="function"}function $(e){return x(e)&&"__rc_type"in e}function mr(e){return e}function Or(e){return e.e}function jr(e,{errorOnWarnings:r=!1,onWarnings:n}={}){return{"~standard":{validate(t){let s="ok"in e?e:A(t,e);return xe(s,r,n)},vendor:"runcheck",version:1}}}function xe(e,r,n){return r&&e.ok&&e.warnings?{issues:e.warnings.map(t=>({message:t}))}:e.ok?(n&&e.warnings&&n(e.warnings),{value:e.value}):{issues:e.errors.map(t=>({message:t}))}}function wr(e,r){let n=e["~standard"];return{...d,e:r||`standard_schema_${n.vendor}@${n.version}`,r(t,s){return y(this,t,s,()=>{let o=n.validate(t);return"value"in o?{data:o.value,errors:!1}:"issues"in o?{data:void 0,errors:o.issues.map(a=>R(s,a.message))}:!1})}}}export{G as a,O as b,H as c,X as d,Y as e,ee as f,re as g,ne as h,te as i,se as j,V as k,oe as l,ae as m,R as n,y as o,d as p,ze as q,Je as r,Qe as s,Ze as t,Ge as u,He as v,Xe as w,Ye as x,er as y,rr as z,nr as A,tr as B,sr as C,or as D,_e as E,be as F,ge as G,ar as H,ke as I,ir as J,P as K,ur as L,cr as M,S as N,lr as O,fr as P,A as Q,yr as R,dr as S,Tr as T,me as U,I as V,pr as W,Oe as X,Rr as Y,hr as Z,je as _,_r as $,br as aa,gr as ba,w as ca,kr as da,x as ea,F as fa,we as ga,$ as ha,mr as ia,Or as ja,jr as ka,wr as la};
|
|
4
|
+
//# sourceMappingURL=chunk-523HPU74.js.map
|