@cleverbrush/schema 4.5.0 → 5.0.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/LICENSE +28 -0
- package/README.md +176 -19
- package/dist/builders/AnySchemaBuilder.d.ts +11 -2
- package/dist/builders/AnySchemaBuilder.js +1 -1
- package/dist/builders/ArraySchemaBuilder.d.ts +15 -4
- package/dist/builders/ArraySchemaBuilder.js +1 -1
- package/dist/builders/BooleanSchemaBuilder.d.ts +21 -6
- package/dist/builders/BooleanSchemaBuilder.js +1 -1
- package/dist/builders/DateSchemaBuilder.d.ts +24 -10
- package/dist/builders/DateSchemaBuilder.js +1 -1
- package/dist/builders/ExternSchemaBuilder.d.ts +3 -2
- package/dist/builders/ExternSchemaBuilder.js +1 -1
- package/dist/builders/FunctionSchemaBuilder.d.ts +14 -2
- package/dist/builders/FunctionSchemaBuilder.js +1 -1
- package/dist/builders/GenericSchemaBuilder.d.ts +14 -3
- package/dist/builders/IntersectionSchemaBuilder.d.ts +1 -0
- package/dist/builders/LazySchemaBuilder.d.ts +1 -0
- package/dist/builders/NullSchemaBuilder.d.ts +2 -4
- package/dist/builders/NumberSchemaBuilder.d.ts +21 -7
- package/dist/builders/NumberSchemaBuilder.js +1 -1
- package/dist/builders/ObjectSchemaBuilder.d.ts +15 -4
- package/dist/builders/ObjectSchemaBuilder.js +1 -1
- package/dist/builders/ParseStringSchemaBuilder.d.ts +1 -0
- package/dist/builders/ParseStringSchemaBuilder.js +1 -1
- package/dist/builders/PromiseSchemaBuilder.d.ts +13 -2
- package/dist/builders/PromiseSchemaBuilder.js +1 -1
- package/dist/builders/RecordSchemaBuilder.d.ts +12 -0
- package/dist/builders/RecordSchemaBuilder.js +1 -1
- package/dist/builders/SchemaBuilder.d.ts +59 -10
- package/dist/builders/StringSchemaBuilder.d.ts +23 -8
- package/dist/builders/StringSchemaBuilder.js +1 -1
- package/dist/builders/TupleSchemaBuilder.d.ts +16 -4
- package/dist/builders/TupleSchemaBuilder.js +1 -1
- package/dist/builders/UnionSchemaBuilder.d.ts +12 -2
- package/dist/builders/UnionSchemaBuilder.js +1 -1
- package/dist/chunk-25KL2NBJ.js +2 -0
- package/dist/chunk-25KL2NBJ.js.map +1 -0
- package/dist/chunk-2BKBVVZ3.js +2 -0
- package/dist/chunk-2BKBVVZ3.js.map +1 -0
- package/dist/chunk-3E5M6GRR.js +2 -0
- package/dist/chunk-3E5M6GRR.js.map +1 -0
- package/dist/chunk-66U6MMJ2.js +2 -0
- package/dist/chunk-66U6MMJ2.js.map +1 -0
- package/dist/chunk-BMA2X7LI.js +2 -0
- package/dist/chunk-BMA2X7LI.js.map +1 -0
- package/dist/chunk-BTR3ZGES.js +2 -0
- package/dist/chunk-BTR3ZGES.js.map +1 -0
- package/dist/chunk-CR2QIV5I.js +2 -0
- package/dist/chunk-CR2QIV5I.js.map +1 -0
- package/dist/chunk-D7RXO2FA.js +2 -0
- package/dist/chunk-D7RXO2FA.js.map +1 -0
- package/dist/chunk-JEBLDVKG.js +2 -0
- package/dist/chunk-JEBLDVKG.js.map +1 -0
- package/dist/chunk-JH7VLA6C.js +2 -0
- package/dist/chunk-JH7VLA6C.js.map +1 -0
- package/dist/chunk-K7TDPKGQ.js +2 -0
- package/dist/chunk-K7TDPKGQ.js.map +1 -0
- package/dist/chunk-NDESVCWI.js +2 -0
- package/dist/chunk-NDESVCWI.js.map +1 -0
- package/dist/chunk-VBPZRO7L.js +2 -0
- package/dist/chunk-VBPZRO7L.js.map +1 -0
- package/dist/chunk-W5D22D4P.js +2 -0
- package/dist/chunk-W5D22D4P.js.map +1 -0
- package/dist/{chunk-XHSBY2QK.js → chunk-X6CT6I2V.js} +2 -2
- package/dist/{chunk-XHSBY2QK.js.map → chunk-X6CT6I2V.js.map} +1 -1
- package/dist/chunk-XASMTNON.js +2 -0
- package/dist/chunk-XASMTNON.js.map +1 -0
- package/dist/chunk-ZYWDTLNL.js +2 -0
- package/dist/chunk-ZYWDTLNL.js.map +1 -0
- package/dist/core.d.ts +3 -3
- package/dist/core.js +1 -1
- package/dist/extension.d.ts +4 -1
- package/dist/extension.js +1 -1
- package/dist/extensions/string.d.ts +2 -4
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/metadata-extension.d.ts +196 -0
- package/package.json +6 -3
- package/dist/chunk-54RHS4F4.js +0 -2
- package/dist/chunk-54RHS4F4.js.map +0 -1
- package/dist/chunk-6LSN7NXQ.js +0 -2
- package/dist/chunk-6LSN7NXQ.js.map +0 -1
- package/dist/chunk-C6YQOKWB.js +0 -2
- package/dist/chunk-C6YQOKWB.js.map +0 -1
- package/dist/chunk-ELPPAHNO.js +0 -2
- package/dist/chunk-ELPPAHNO.js.map +0 -1
- package/dist/chunk-G424M7GI.js +0 -2
- package/dist/chunk-G424M7GI.js.map +0 -1
- package/dist/chunk-JUFZ7PLO.js +0 -2
- package/dist/chunk-JUFZ7PLO.js.map +0 -1
- package/dist/chunk-K4ZLXLE2.js +0 -2
- package/dist/chunk-K4ZLXLE2.js.map +0 -1
- package/dist/chunk-KC45JEFL.js +0 -2
- package/dist/chunk-KC45JEFL.js.map +0 -1
- package/dist/chunk-NF4CRFMN.js +0 -2
- package/dist/chunk-NF4CRFMN.js.map +0 -1
- package/dist/chunk-ORV2G6ZL.js +0 -2
- package/dist/chunk-ORV2G6ZL.js.map +0 -1
- package/dist/chunk-PQINUGZW.js +0 -2
- package/dist/chunk-PQINUGZW.js.map +0 -1
- package/dist/chunk-REYZ7G7J.js +0 -2
- package/dist/chunk-REYZ7G7J.js.map +0 -1
- package/dist/chunk-VSU5GILY.js +0 -2
- package/dist/chunk-VSU5GILY.js.map +0 -1
- package/dist/chunk-XL723XFL.js +0 -2
- package/dist/chunk-XL723XFL.js.map +0 -1
- package/dist/chunk-XPLTW5DI.js +0 -2
- package/dist/chunk-XPLTW5DI.js.map +0 -1
- package/dist/chunk-YAOZEA2R.js +0 -2
- package/dist/chunk-YAOZEA2R.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/builders/AnySchemaBuilder.ts"],"sourcesContent":["import {\n type BRAND,\n SchemaBuilder,\n type ValidationContext,\n type ValidationErrorMessageProvider,\n type ValidationResult\n} from './SchemaBuilder.js';\n\ntype AnySchemaBuilderCreateProps<R extends boolean = true> = Partial<\n ReturnType<AnySchemaBuilder<R>['introspect']>\n>;\n\n/**\n * Any schema builder class. Similar to the `any` type\n * in TypeScript. Allows to define a schema for `any` value.\n * Use it when you don't know the type of the value.\n *\n * **NOTE** this class is exported only to give opportunity to extend it\n * by inheriting. It is not recommended to create an instance of this class\n * directly. Use `any()` function instead.\n *\n * @example\n * ```ts\n * const schema = any();\n * const result = schema.validate(123);\n * // result.valid === true\n * // result.object === 123\n * ```\n */\nexport class AnySchemaBuilder<\n TRequired extends boolean = true,\n TNullable extends boolean = false,\n TExplicitType = undefined,\n THasDefault extends boolean = false,\n TExtensions = {},\n TResult = TExplicitType extends undefined ? any : TExplicitType\n> extends SchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n> {\n /**\n * @hidden\n */\n public static create(props: AnySchemaBuilderCreateProps<any>) {\n return new AnySchemaBuilder({\n type: 'any',\n ...props\n });\n }\n\n protected constructor(props: AnySchemaBuilderCreateProps<TRequired>) {\n super(props as any);\n }\n\n /**\n * @inheritdoc\n */\n public hasType<T>(\n _notUsed?: T\n ): AnySchemaBuilder<true, TNullable, T, THasDefault, TExtensions> &\n TExtensions {\n return this.createFromProps({\n ...this.introspect()\n } as any) as any;\n }\n\n /**\n * @inheritdoc\n */\n public clearHasType(): AnySchemaBuilder<\n TRequired,\n TNullable,\n undefined,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.createFromProps({\n ...this.introspect()\n } as any) as any;\n }\n\n #buildResult(\n superResult: ReturnType<AnySchemaBuilder['preValidateSync']>\n ): ValidationResult<TResult> {\n const {\n valid,\n transaction: preValidationTransaction,\n errors\n } = superResult;\n\n if (!valid) {\n return { valid, errors };\n }\n\n const {\n object: { validatedObject: objToValidate }\n } = preValidationTransaction!;\n\n return { valid: true, object: objToValidate };\n }\n\n /** {@inheritDoc SchemaBuilder.validate} */\n public validate(\n object: TResult,\n context?: ValidationContext\n ): ValidationResult<TResult> {\n return super.validate(object, context) as ValidationResult<TResult>;\n }\n\n /** {@inheritDoc SchemaBuilder.validateAsync} */\n public async validateAsync(\n object: TResult,\n context?: ValidationContext\n ): Promise<ValidationResult<TResult>> {\n return super.validateAsync(object, context) as Promise<\n ValidationResult<TResult>\n >;\n }\n\n /**\n * Performs synchronous validation of the schema over `object`.\n * Throws if any preprocessor, validator, or error message provider returns a Promise.\n * @param context Optional `ValidationContext` settings.\n */\n protected _validate(\n object: TResult,\n context?: ValidationContext\n ): ValidationResult<TResult> {\n return this.#buildResult(this.preValidateSync(object, context));\n }\n\n /**\n * Performs async validation of the schema over `object`.\n * Supports async preprocessors, validators, and error message providers.\n * @param context Optional `ValidationContext` settings.\n */\n protected async _validateAsync(\n object: TResult,\n context?: ValidationContext\n ): Promise<ValidationResult<TResult>> {\n return this.#buildResult(await super.preValidateAsync(object, context));\n }\n\n protected createFromProps<TReq extends boolean>(\n props: AnySchemaBuilderCreateProps<TReq>\n ): this {\n return AnySchemaBuilder.create(props as any) as any;\n }\n\n /**\n * @hidden\n */\n public required(\n errorMessage?: ValidationErrorMessageProvider\n ): AnySchemaBuilder<\n true,\n TNullable,\n TExplicitType,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.required(errorMessage);\n }\n\n /**\n * @hidden\n */\n public optional(): AnySchemaBuilder<\n false,\n TNullable,\n TExplicitType,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.optional();\n }\n\n /**\n * @hidden\n */\n public default(\n value: TResult | (() => TResult)\n ): AnySchemaBuilder<true, TNullable, TExplicitType, true, TExtensions> &\n TExtensions {\n return super.default(value) as any;\n }\n\n /**\n * @hidden\n */\n public clearDefault(): AnySchemaBuilder<\n TRequired,\n TNullable,\n TExplicitType,\n false,\n TExtensions\n > &\n TExtensions {\n return super.clearDefault() as any;\n }\n\n /**\n * @hidden\n */\n public brand<TBrand extends string | symbol>(\n _name?: TBrand\n ): AnySchemaBuilder<\n TRequired,\n TNullable,\n TResult & { readonly [K in BRAND]: TBrand },\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.brand(_name);\n }\n\n /**\n * Marks the inferred type as `Readonly<T>`. Sets the `isReadonly`\n * introspection flag for tooling consistency.\n *\n * @see {@link SchemaBuilder.readonly}\n */\n public readonly(): AnySchemaBuilder<\n TRequired,\n TNullable,\n Readonly<TResult>,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.readonly();\n }\n\n /**\n * @hidden\n */\n public nullable(): AnySchemaBuilder<\n TRequired,\n true,\n TExplicitType,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.nullable() as any;\n }\n\n /**\n * @hidden\n */\n public notNullable(): AnySchemaBuilder<\n TRequired,\n false,\n TExplicitType,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.notNullable() as any;\n }\n}\n\n/**\n * Creates a `any` schema.\n * @example\n * ```\n * const anyObject = any();\n *\n * // null - invalid\n * // undefined - invalid\n * // string - valid\n * // {} - valid\n * // Date -valid\n * // { someProp: 123 } - valid\n * // etc\n * ```\n * @example\n * ```\n * const anyObject = any().optional();\n * // null - valid\n * // undefined - valid\n * // string - valid\n * // {} - valid\n * // Date -valid\n * // { someProp: 123 } - valid\n * ```\n */\nexport const any = () =>\n AnySchemaBuilder.create({\n isRequired: true\n }) as AnySchemaBuilder<true>;\n"],"mappings":"wCA6BO,IAAMA,EAAN,MAAMC,UAOHC,CAMR,CAIE,OAAc,OAAOC,EAAyC,CAC1D,OAAO,IAAIF,EAAiB,CACxB,KAAM,MACN,GAAGE,CACP,CAAC,CACL,CAEU,YAAYA,EAA+C,CACjE,MAAMA,CAAY,CACtB,CAKO,QACHC,EAEY,CACZ,OAAO,KAAK,gBAAgB,CACxB,GAAG,KAAK,WAAW,CACvB,CAAQ,CACZ,CAKO,cAOS,CACZ,OAAO,KAAK,gBAAgB,CACxB,GAAG,KAAK,WAAW,CACvB,CAAQ,CACZ,CAEAC,GACIC,EACyB,CACzB,GAAM,CACF,MAAAC,EACA,YAAaC,EACb,OAAAC,CACJ,EAAIH,EAEJ,GAAI,CAACC,EACD,MAAO,CAAE,MAAAA,EAAO,OAAAE,CAAO,EAG3B,GAAM,CACF,OAAQ,CAAE,gBAAiBC,CAAc,CAC7C,EAAIF,EAEJ,MAAO,CAAE,MAAO,GAAM,OAAQE,CAAc,CAChD,CAGO,SACHC,EACAC,EACyB,CACzB,OAAO,MAAM,SAASD,EAAQC,CAAO,CACzC,CAGA,MAAa,cACTD,EACAC,EACkC,CAClC,OAAO,MAAM,cAAcD,EAAQC,CAAO,CAG9C,CAOU,UACND,EACAC,EACyB,CACzB,OAAO,KAAKP,GAAa,KAAK,gBAAgBM,EAAQC,CAAO,CAAC,CAClE,CAOA,MAAgB,eACZD,EACAC,EACkC,CAClC,OAAO,KAAKP,GAAa,MAAM,MAAM,iBAAiBM,EAAQC,CAAO,CAAC,CAC1E,CAEU,gBACNT,EACI,CACJ,OAAOF,EAAiB,OAAOE,CAAY,CAC/C,CAKO,SACHU,EAQY,CACZ,OAAO,MAAM,SAASA,CAAY,CACtC,CAKO,UAOS,CACZ,OAAO,MAAM,SAAS,CAC1B,CAKO,QACHC,EAEY,CACZ,OAAO,MAAM,QAAQA,CAAK,CAC9B,CAKO,cAOS,CACZ,OAAO,MAAM,aAAa,CAC9B,CAKO,MACHC,EAQY,CACZ,OAAO,MAAM,MAAMA,CAAK,CAC5B,CAQO,UAOS,CACZ,OAAO,MAAM,SAAS,CAC1B,CAKO,UAOS,CACZ,OAAO,MAAM,SAAS,CAC1B,CAKO,aAOS,CACZ,OAAO,MAAM,YAAY,CAC7B,CACJ,EA2BaC,EAAM,IACfhB,EAAiB,OAAO,CACpB,WAAY,EAChB,CAAC","names":["AnySchemaBuilder","_AnySchemaBuilder","SchemaBuilder","props","_notUsed","#buildResult","superResult","valid","preValidationTransaction","errors","objToValidate","object","context","errorMessage","value","_name","any"]}
|
package/dist/chunk-YAOZEA2R.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{d as p,f as h}from"./chunk-REYZ7G7J.js";function S(s){return typeof s=="object"&&s!==null&&"key"in s?String(s.key):String(s)}function m(s){return s.map(S).join(".")}var T=class s extends h{#e;[p]=!0;static create(e){return new s({type:"extern",...e})}constructor(e){super(e),this.#e=e.standardSchema}get standardSchema(){return this.#e}hasType(e){return this.createFromProps({...this.introspect()})}clearHasType(){return this.createFromProps({...this.introspect()})}#a(e){return e.map(t=>({message:t.path&&t.path.length>0?`${m(t.path)}: ${t.message}`:t.message}))}#t(e,t){let i=new Map,o=[];for(let r of e)if(r.path&&r.path.length>0){let a=S(r.path[0]),d=r.path.slice(1),c=d.length>0?`${m(d)}: ${r.message}`:r.message;i.has(a)||(i.set(a,[]),o.push(a)),i.get(a).push(c)}let l=new WeakMap,n=t?.currentPropertyDescriptor;if(n)for(let r of o){let a=n[r];a&&typeof a=="object"&&l.set(a,r)}return{fn:r=>{let a;if(typeof r=="function"?a=r(n):a=n,!a||typeof a!="object")return{isValid:!0,errors:[]};let d=l.get(a),c=d?i.get(d)||[]:[];return{isValid:c.length===0,errors:c}},errorPropertyNames:o}}validate(e,t){return super.validate(e,t)}async validateAsync(e,t){return super.validateAsync(e,t)}_validate(e,t){let i=this.preValidateSync(e,t);if(!i.valid)return{valid:!1,errors:i.errors};let{transaction:o}=i,l=o.object.validatedObject;if(l==null)return{valid:!0,object:l};let n=this.#e["~standard"].validate(l);if(n instanceof Promise)throw new Error("The external Standard Schema returned a Promise from validate(). Use validateAsync() for schemas with async validation.");if("value"in n){let{fn:a}=this.#t([],t);return{valid:!0,object:n.value,getErrorsFor:a}}let{fn:u,errorPropertyNames:r}=this.#t(n.issues,t);return{valid:!1,errors:this.#a(n.issues),getErrorsFor:u,__externErrorPropertyNames:r}}async _validateAsync(e,t){let i=await this.preValidateAsync(e,t);if(!i.valid)return{valid:!1,errors:i.errors};let{transaction:o}=i,l=o.object.validatedObject;if(l==null)return{valid:!0,object:l};let n=await this.#e["~standard"].validate(l);if("value"in n){let{fn:a}=this.#t([],t);return{valid:!0,object:n.value,getErrorsFor:a}}let{fn:u,errorPropertyNames:r}=this.#t(n.issues,t);return{valid:!1,errors:this.#a(n.issues),getErrorsFor:u,__externErrorPropertyNames:r}}createFromProps(e){return s.create(e)}introspect(){return{...super.introspect(),standardSchema:this.#e}}required(e){return super.required(e)}optional(){return super.optional()}default(e){return super.default(e)}clearDefault(){return super.clearDefault()}brand(e){return super.brand(e)}readonly(){return super.readonly()}nullable(){return super.nullable()}notNullable(){return super.notNullable()}},f=s=>T.create({isRequired:!0,standardSchema:s});export{T as a,f as b};
|
|
2
|
-
//# sourceMappingURL=chunk-YAOZEA2R.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/builders/ExternSchemaBuilder.ts"],"sourcesContent":["import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport {\n type BRAND,\n SchemaBuilder,\n SYMBOL_HAS_PROPERTIES,\n type ValidationContext,\n type ValidationErrorMessageProvider,\n type ValidationResult\n} from './SchemaBuilder.js';\n\ntype ExternSchemaBuilderCreateProps<R extends boolean = true> = Partial<\n ReturnType<ExternSchemaBuilder<any, R>['introspect']>\n> & {\n standardSchema: StandardSchemaV1;\n};\n\n/**\n * Extracts the first path segment from a Standard Schema issue path entry\n * as a string.\n */\nfunction firstPathSegmentStr(\n segment: PropertyKey | StandardSchemaV1.PathSegment\n): string {\n return typeof segment === 'object' && segment !== null && 'key' in segment\n ? String(segment.key)\n : String(segment);\n}\n\n/**\n * Formats a Standard Schema issue path into a dotted string.\n *\n * Standard Schema paths may contain bare `PropertyKey` values (string, number,\n * symbol) or `PathSegment` objects with a `.key` property.\n *\n * @example\n * ```\n * formatIssuePath(['address', 'city']) // → 'address.city'\n * formatIssuePath([{ key: 'items' }, 0]) // → 'items.0'\n * ```\n */\nfunction formatIssuePath(\n path: ReadonlyArray<PropertyKey | StandardSchemaV1.PathSegment>\n): string {\n return path.map(firstPathSegmentStr).join('.');\n}\n\n/**\n * Schema builder that wraps an external\n * [Standard Schema v1](https://standardschema.dev/) compatible schema\n * (e.g. Zod, Valibot, ArkType) into a `@cleverbrush/schema` builder.\n *\n * This enables cross-library schema composition — you can use a Zod schema\n * as a property inside a `@cleverbrush/schema` object schema, and the\n * inferred TypeScript type will be correct.\n *\n * Validation is delegated entirely to the external schema's\n * `['~standard'].validate()` method. Standard Schema issues are mapped to\n * `@cleverbrush/schema` `ValidationError` objects, with any issue paths\n * formatted as dotted prefixes (e.g. `\"address.city: must be a string\"`).\n *\n * When used inside an `object()` schema, the property descriptor tree is\n * built dynamically (via Proxy) from the external schema's output type,\n * so `getErrorsFor(t => t.order.id)` works without any additional\n * configuration.\n *\n * **NOTE** this class is exported only to give opportunity to extend it\n * by inheriting. It is not recommended to create an instance of this class\n * directly. Use the {@link extern | extern()} factory function instead.\n *\n * @example\n * ```ts\n * import { z } from 'zod';\n * import { object, date, extern, InferType } from '@cleverbrush/schema';\n *\n * const zodUser = z.object({ first: z.string(), last: z.string() });\n *\n * const order = object({\n * user: extern(zodUser),\n * date: date(),\n * });\n *\n * type Order = InferType<typeof order>;\n * // { user: { first: string; last: string }; date: Date }\n * ```\n *\n * @see {@link extern}\n */\nexport class ExternSchemaBuilder<\n TStandardSchema extends StandardSchemaV1 = StandardSchemaV1,\n TRequired extends boolean = true,\n TNullable extends boolean = false,\n TExplicitType = undefined,\n THasDefault extends boolean = false,\n TExtensions = {},\n TResult = TExplicitType extends undefined\n ? StandardSchemaV1.InferOutput<TStandardSchema>\n : TExplicitType\n> extends SchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n> {\n #standardSchema: TStandardSchema;\n\n /**\n * Always `true` for extern schemas — enables Proxy-based property\n * descriptor trees and nested error propagation in\n * `ObjectSchemaBuilder`.\n */\n readonly [SYMBOL_HAS_PROPERTIES] = true;\n\n /**\n * @hidden\n */\n public static create(props: ExternSchemaBuilderCreateProps<any>) {\n return new ExternSchemaBuilder({\n type: 'extern',\n ...props\n });\n }\n\n protected constructor(props: ExternSchemaBuilderCreateProps<TRequired>) {\n super(props as any);\n this.#standardSchema = props.standardSchema as TStandardSchema;\n }\n\n /**\n * Returns the wrapped Standard Schema instance.\n */\n public get standardSchema(): TStandardSchema {\n return this.#standardSchema;\n }\n\n /**\n * @inheritdoc\n */\n public hasType<T>(\n _notUsed?: T\n ): ExternSchemaBuilder<\n TStandardSchema,\n true,\n TNullable,\n T,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.createFromProps({\n ...this.introspect()\n } as any) as any;\n }\n\n /**\n * @inheritdoc\n */\n public clearHasType(): ExternSchemaBuilder<\n TStandardSchema,\n TRequired,\n TNullable,\n undefined,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.createFromProps({\n ...this.introspect()\n } as any) as any;\n }\n\n /**\n * Maps a Standard Schema failure result into the library's\n * `ValidationError[]` format.\n */\n #mapIssues(\n issues: ReadonlyArray<StandardSchemaV1.Issue>\n ): { message: string }[] {\n return issues.map(issue => ({\n message:\n issue.path && issue.path.length > 0\n ? `${formatIssuePath(issue.path)}: ${issue.message}`\n : issue.message\n }));\n }\n\n /**\n * Builds a `getErrorsFor` function that maps Standard Schema issue\n * paths to per-property error lists via the Proxy-based property\n * descriptor tree.\n *\n * The function groups issues by their first path segment, then builds\n * a WeakMap from each Proxy-created child descriptor to its property\n * name so that `getErrorsFor(() => descriptor)` can look up errors.\n */\n #buildGetErrorsFor(\n issues: ReadonlyArray<StandardSchemaV1.Issue>,\n context?: ValidationContext\n ): {\n fn: (selector?: Function) => { isValid: boolean; errors: string[] };\n errorPropertyNames: string[];\n } {\n const errorsByProperty = new Map<string, string[]>();\n const errorPropertyNames: string[] = [];\n\n for (const issue of issues) {\n if (issue.path && issue.path.length > 0) {\n const firstName = firstPathSegmentStr(issue.path[0]);\n\n const restPath = issue.path.slice(1);\n const message =\n restPath.length > 0\n ? `${formatIssuePath(restPath)}: ${issue.message}`\n : issue.message;\n\n if (!errorsByProperty.has(firstName)) {\n errorsByProperty.set(firstName, []);\n errorPropertyNames.push(firstName);\n }\n errorsByProperty.get(firstName)!.push(message);\n }\n }\n\n // Build reverse map: access each error property on the Proxy\n // descriptor to create (and cache) the child, then map it back\n // to the property name.\n const descriptorToName = new WeakMap<object, string>();\n const currentPropertyDescriptor = context?.currentPropertyDescriptor;\n if (currentPropertyDescriptor) {\n for (const name of errorPropertyNames) {\n const desc = (currentPropertyDescriptor as any)[name];\n if (desc && typeof desc === 'object') {\n descriptorToName.set(desc, name);\n }\n }\n }\n\n const fn = (selector?: Function) => {\n let descriptor: any;\n if (typeof selector === 'function') {\n descriptor = selector(currentPropertyDescriptor);\n } else {\n descriptor = currentPropertyDescriptor;\n }\n\n if (!descriptor || typeof descriptor !== 'object') {\n return { isValid: true, errors: [] };\n }\n\n const propName = descriptorToName.get(descriptor);\n const errors = propName ? errorsByProperty.get(propName) || [] : [];\n\n return {\n isValid: errors.length === 0,\n errors\n };\n };\n\n return { fn, errorPropertyNames };\n }\n\n /** {@inheritDoc SchemaBuilder.validate} */\n public validate(\n object: TResult,\n context?: ValidationContext\n ): ValidationResult<TResult> {\n return super.validate(object, context) as ValidationResult<TResult>;\n }\n\n /** {@inheritDoc SchemaBuilder.validateAsync} */\n public async validateAsync(\n object: TResult,\n context?: ValidationContext\n ): Promise<ValidationResult<TResult>> {\n return super.validateAsync(object, context) as Promise<\n ValidationResult<TResult>\n >;\n }\n\n /**\n * Performs synchronous validation by delegating to the external\n * Standard Schema's `validate()` method.\n *\n * If the external schema returns a `Promise` (async validation),\n * this method throws — use {@link validateAsync} instead.\n */\n protected _validate(\n object: TResult,\n context?: ValidationContext\n ): ValidationResult<TResult> {\n const superResult = this.preValidateSync(object, context);\n\n if (!superResult.valid) {\n return { valid: false, errors: superResult.errors };\n }\n\n const { transaction: preValidationTransaction } = superResult;\n\n const objToValidate = preValidationTransaction!.object.validatedObject;\n\n // When the value is null/undefined and preValidation accepted it\n // (optional or nullable), return early without calling the external\n // schema — it would likely reject these sentinel values.\n if (objToValidate === undefined || objToValidate === null) {\n return { valid: true, object: objToValidate };\n }\n\n const result =\n this.#standardSchema['~standard'].validate(objToValidate);\n\n if (result instanceof Promise) {\n throw new Error(\n 'The external Standard Schema returned a Promise from validate(). ' +\n 'Use validateAsync() for schemas with async validation.'\n );\n }\n\n if ('value' in result) {\n const { fn } = this.#buildGetErrorsFor([], context);\n return {\n valid: true,\n object: result.value as TResult,\n getErrorsFor: fn\n } as any;\n }\n\n const { fn, errorPropertyNames } = this.#buildGetErrorsFor(\n result.issues,\n context\n );\n return {\n valid: false,\n errors: this.#mapIssues(result.issues),\n getErrorsFor: fn,\n __externErrorPropertyNames: errorPropertyNames\n } as any;\n }\n\n /**\n * Performs async validation by delegating to the external\n * Standard Schema's `validate()` method. Supports external schemas\n * that return a `Promise` from their `validate()`.\n */\n protected async _validateAsync(\n object: TResult,\n context?: ValidationContext\n ): Promise<ValidationResult<TResult>> {\n const superResult = await this.preValidateAsync(object, context);\n\n if (!superResult.valid) {\n return { valid: false, errors: superResult.errors };\n }\n\n const { transaction: preValidationTransaction } = superResult;\n\n const objToValidate = preValidationTransaction!.object.validatedObject;\n\n if (objToValidate === undefined || objToValidate === null) {\n return { valid: true, object: objToValidate };\n }\n\n const result =\n await this.#standardSchema['~standard'].validate(objToValidate);\n\n if ('value' in result) {\n const { fn } = this.#buildGetErrorsFor([], context);\n return {\n valid: true,\n object: result.value as TResult,\n getErrorsFor: fn\n } as any;\n }\n\n const { fn, errorPropertyNames } = this.#buildGetErrorsFor(\n result.issues,\n context\n );\n return {\n valid: false,\n errors: this.#mapIssues(result.issues),\n getErrorsFor: fn,\n __externErrorPropertyNames: errorPropertyNames\n } as any;\n }\n\n protected createFromProps<TReq extends boolean>(\n props: ExternSchemaBuilderCreateProps<TReq>\n ): this {\n return ExternSchemaBuilder.create(props as any) as any;\n }\n\n /**\n * Returns a snapshot of the builder's internal state.\n * Includes the wrapped `standardSchema` reference.\n */\n public introspect() {\n return {\n ...super.introspect(),\n standardSchema: this.#standardSchema\n };\n }\n\n /**\n * @hidden\n */\n public required(\n errorMessage?: ValidationErrorMessageProvider\n ): ExternSchemaBuilder<\n TStandardSchema,\n true,\n TNullable,\n TExplicitType,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.required(errorMessage);\n }\n\n /**\n * @hidden\n */\n public optional(): ExternSchemaBuilder<\n TStandardSchema,\n false,\n TNullable,\n TExplicitType,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.optional();\n }\n\n /**\n * @hidden\n */\n public default(\n value: TResult | (() => TResult)\n ): ExternSchemaBuilder<\n TStandardSchema,\n true,\n TNullable,\n TExplicitType,\n true,\n TExtensions\n > &\n TExtensions {\n return super.default(value) as any;\n }\n\n /**\n * @hidden\n */\n public clearDefault(): ExternSchemaBuilder<\n TStandardSchema,\n TRequired,\n TNullable,\n TExplicitType,\n false,\n TExtensions\n > &\n TExtensions {\n return super.clearDefault() as any;\n }\n\n /**\n * @hidden\n */\n public brand<TBrand extends string | symbol>(\n _name?: TBrand\n ): ExternSchemaBuilder<\n TStandardSchema,\n TRequired,\n TNullable,\n TResult & { readonly [K in BRAND]: TBrand },\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.brand(_name);\n }\n\n /**\n * Marks the inferred type as `Readonly<T>`. Sets the `isReadonly`\n * introspection flag for tooling consistency.\n *\n * @see {@link SchemaBuilder.readonly}\n */\n public readonly(): ExternSchemaBuilder<\n TStandardSchema,\n TRequired,\n TNullable,\n Readonly<TResult>,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.readonly();\n }\n\n /**\n * @hidden\n */\n public nullable(): ExternSchemaBuilder<\n TStandardSchema,\n TRequired,\n true,\n TExplicitType,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.nullable() as any;\n }\n\n /**\n * @hidden\n */\n public notNullable(): ExternSchemaBuilder<\n TStandardSchema,\n TRequired,\n false,\n TExplicitType,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.notNullable() as any;\n }\n}\n\n/**\n * Wraps an external [Standard Schema v1](https://standardschema.dev/)\n * compatible schema into a `@cleverbrush/schema` builder.\n *\n * This enables cross-library schema composition — use schemas from Zod,\n * Valibot, ArkType, or any Standard Schema v1 compliant library as\n * properties inside `@cleverbrush/schema` object schemas with full type\n * inference.\n *\n * @param standardSchema - A Standard Schema v1 compliant schema instance\n * (any object that exposes a `['~standard']` property with `version: 1`\n * and a `validate` function).\n *\n * @example\n * ```ts\n * import { z } from 'zod';\n * import { object, date, extern, InferType } from '@cleverbrush/schema';\n *\n * const zodUser = z.object({ first: z.string(), last: z.string() });\n *\n * const order = object({\n * user: extern(zodUser),\n * date: date(),\n * });\n *\n * type Order = InferType<typeof order>;\n * // { user: { first: string; last: string }; date: Date }\n *\n * order.validate({\n * user: { first: 'Alice', last: 'Smith' },\n * date: new Date(),\n * }); // { valid: true, object: { user: …, date: … } }\n * ```\n *\n * @example\n * ```ts\n * // Optional external schema\n * const schema = extern(zodUser).optional();\n * schema.validate(undefined); // valid\n * ```\n *\n * @example\n * ```ts\n * // Inside an array\n * import { array, extern } from '@cleverbrush/schema';\n * const users = array(extern(zodUser));\n * ```\n */\nexport const extern = <T extends StandardSchemaV1>(standardSchema: T) =>\n ExternSchemaBuilder.create({\n isRequired: true,\n standardSchema\n }) as ExternSchemaBuilder<T, true>;\n"],"mappings":"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","names":["firstPathSegmentStr","segment","formatIssuePath","path","ExternSchemaBuilder","_ExternSchemaBuilder","SchemaBuilder","#standardSchema","SYMBOL_HAS_PROPERTIES","props","_notUsed","#mapIssues","issues","issue","#buildGetErrorsFor","context","errorsByProperty","errorPropertyNames","firstName","restPath","message","descriptorToName","currentPropertyDescriptor","name","desc","selector","descriptor","propName","errors","object","superResult","preValidationTransaction","objToValidate","result","fn","errorMessage","value","_name","extern","standardSchema"]}
|