@cleverbrush/schema 4.5.0 → 5.1.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-D7RXO2FA.js +2 -0
- package/dist/chunk-D7RXO2FA.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-W5LLKFM7.js} +2 -2
- package/dist/{chunk-XHSBY2QK.js.map → chunk-W5LLKFM7.js.map} +1 -1
- package/dist/chunk-WNAU5MPQ.js +2 -0
- package/dist/chunk-WNAU5MPQ.js.map +1 -0
- package/dist/chunk-XASMTNON.js +2 -0
- package/dist/chunk-XASMTNON.js.map +1 -0
- package/dist/chunk-Z4SFUZSP.js +2 -0
- package/dist/chunk-Z4SFUZSP.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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/builders/DateSchemaBuilder.ts"],"sourcesContent":["import { transaction } from '../utils/transaction.js';\nimport {\n type BRAND,\n type PreprocessorEntry,\n SchemaBuilder,\n type ValidationContext,\n type ValidationErrorMessageProvider,\n type ValidationResult,\n type ValidatorEntry\n} from './SchemaBuilder.js';\n\ntype DateSchemaBuilderCreateProps<T = Date, R extends boolean = true> = Partial<\n ReturnType<DateSchemaBuilder<T, R, any>['introspect']>\n>;\n\nconst parseFromJsonPreprocessor = (value: any) => {\n if (typeof value === 'undefined') return value;\n if (typeof value === 'string') {\n const time = Date.parse(value);\n if (Number.isNaN(time)) return value;\n return new Date(time);\n }\n return value;\n};\n\nconst parseFromEpochPreprocessor = (value: any) => {\n if (typeof value === 'undefined') return value;\n if (typeof value === 'number') {\n const time = new Date(value);\n if (Number.isNaN(time.getTime())) return value;\n return time;\n }\n return value;\n};\n\n/**\n * Allows to create Date schema. It can be required or optional.\n * It can be restricted to be: equal to a certain value, in future, in past, in a certain range.\n * Supports parsing from JSON string and UNIX epoch (using preprocessors).\n *\n * **NOTE** this class is exported for type annotations and advanced use.\n * Customize via extensions rather than subclassing. Avoid instantiating it\n * directly. Use {@link date | date()} function instead.\n *\n * @example\n * ```ts\n * const value = new Date(2020, 0, 2);\n * const schema = date().min(new Date(2020, 0, 1));\n * const result = schema.validate(value);\n * // result.valid === true\n * // result.object === value\n * ```\n *\n * @example\n * ```ts\n * const schema = date();\n * const result = schema.validate('2020-01-01');\n * // result.valid === false\n * // result.errors[0].message === 'is expected to be a date'\n * ```\n *\n * @example\n * ```ts\n * const schema = date().parseFromJson();\n * const result = schema.validate('2020-01-01T00:00:00.000Z');\n * // result.valid === true\n * // result.object is equal to corresponding Date object\n * ```\n *\n * @example\n * ```ts\n * const schema = date().parseFromEpoch();\n * const result = schema.validate(1577836800000);\n * // result.valid === true\n * // result.object is equal to corresponding Date object\n * ```\n *\n * @see {@link date}\n */\nexport class DateSchemaBuilder<\n TResult = Date,\n TRequired extends boolean = true,\n TNullable extends boolean = false,\n THasDefault extends boolean = false,\n TExtensions = {}\n> extends SchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n> {\n /** Native type parameters for extension rebinding; never emitted at runtime. @internal */\n declare readonly __cleverbrush_builder_type__: readonly [\n 'date',\n TResult,\n TRequired,\n TNullable,\n THasDefault\n ];\n\n #min?: Date;\n #defaultMinErrorMessageProvider: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n > = function (this: DateSchemaBuilder) {\n return `is expected to be after ${this.#min} (${this.#min?.getTime()})`;\n };\n #minErrorMessageProvider: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n > = this.#defaultMinErrorMessageProvider;\n\n #max?: Date;\n #defaultMaxErrorMessageProvider: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n > = function (this: DateSchemaBuilder) {\n return `is expected to be before ${this.#max} (${this.#max?.getTime()})`;\n };\n #maxErrorMessageProvider: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n > = this.#defaultMaxErrorMessageProvider;\n\n #equalsTo?: Date;\n #defaultEqualsToErrorMessageProvider: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n > = function (this: DateSchemaBuilder) {\n return `is expected to be equal ${this.#equalsTo} (${this.#equalsTo?.getTime()})`;\n };\n #equalsToErrorMessageProvider: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n > = this.#defaultEqualsToErrorMessageProvider;\n\n #ensureIsInFuture = false;\n #defaultEnsureIsInFutureErrorMessageProvider: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n > = function (this: DateSchemaBuilder) {\n return 'is expected to be in future';\n };\n #ensureIsInFutureErrorMessageProvider: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n > = this.#defaultEnsureIsInFutureErrorMessageProvider;\n\n #ensureIsInPast = false;\n #defaultEnsureIsInPastErrorMessageProvider: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n > = function (this: DateSchemaBuilder) {\n return 'is expected to be in past';\n };\n #ensureIsInPastErrorMessageProvider: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n > = this.#defaultEnsureIsInPastErrorMessageProvider;\n\n #parseFromJson = false;\n #parseFromEpoch = false;\n #canFastPath = true;\n\n /**\n * @hidden\n */\n public static create(props: DateSchemaBuilderCreateProps) {\n return new DateSchemaBuilder({\n type: 'date',\n ...props\n });\n }\n\n protected constructor(props: DateSchemaBuilderCreateProps) {\n super(props as any);\n\n if (props.min instanceof Date) {\n this.#min = props.min;\n }\n\n this.#minErrorMessageProvider =\n this.assureValidationErrorMessageProvider(\n props.minValidationErrorMessageProvider,\n this.#defaultMinErrorMessageProvider\n );\n\n if (props.max instanceof Date) {\n this.#max = props.max;\n }\n\n this.#maxErrorMessageProvider =\n this.assureValidationErrorMessageProvider(\n props.maxValidationErrorMessageProvider,\n this.#defaultMaxErrorMessageProvider\n );\n\n if (typeof props.ensureIsInFuture === 'boolean') {\n this.#ensureIsInFuture = props.ensureIsInFuture;\n }\n\n this.#ensureIsInFutureErrorMessageProvider =\n this.assureValidationErrorMessageProvider(\n props.ensureIsInFutureValidationErrorMessageProvider,\n this.#defaultEnsureIsInFutureErrorMessageProvider\n );\n\n if (typeof props.ensureIsInPast === 'boolean') {\n this.#ensureIsInPast = props.ensureIsInPast;\n }\n\n this.#ensureIsInPastErrorMessageProvider =\n this.assureValidationErrorMessageProvider(\n props.ensureIsInPastValidationErrorMessageProvider,\n this.#defaultEnsureIsInPastErrorMessageProvider\n );\n\n if (typeof props.parseFromJson === 'boolean') {\n this.#parseFromJson = props.parseFromJson;\n }\n\n if (typeof props.parseFromEpoch === 'boolean') {\n this.#parseFromEpoch = props.parseFromEpoch;\n }\n\n if (\n props.equalsTo instanceof Date ||\n typeof props.equalsTo === 'undefined'\n ) {\n this.#equalsTo = props.equalsTo;\n }\n\n this.#equalsToErrorMessageProvider =\n this.assureValidationErrorMessageProvider(\n props.equalsToValidationErrorMessageProvider,\n this.#defaultEqualsToErrorMessageProvider\n );\n\n this.#canFastPath =\n this.canSkipPreValidation &&\n !this.#parseFromJson &&\n !this.#parseFromEpoch;\n }\n\n public introspect() {\n return {\n ...super.introspect(),\n /**\n * Min valid value (if defined).\n */\n min: this.#min,\n\n /**\n * Min value validation error message provider.\n * If not provided, default error message will be used.\n */\n minValidationErrorMessageProvider: this.#minErrorMessageProvider,\n\n /**\n * Max valid value (if defined).\n */\n max: this.#max,\n\n /**\n * Max value validation error message provider.\n * If not provided, default error message will be used.\n */\n maxValidationErrorMessageProvider: this.#maxErrorMessageProvider,\n\n /**\n * Make sure that date is in future. `false` by default.\n */\n ensureIsInFuture: this.#ensureIsInFuture,\n\n /**\n * Ensure in future validation error message provider.\n * If not provided, default error message will be used.\n */\n ensureIsInFutureValidationErrorMessageProvider:\n this.#ensureIsInFutureErrorMessageProvider,\n\n /**\n * Make sure that date is in past. `false` by default.\n */\n ensureIsInPast: this.#ensureIsInPast,\n\n /**\n * Ensure in past validation error message provider.\n * If not provided, default error message will be used.\n */\n ensureIsInPastValidationErrorMessageProvider:\n this.#ensureIsInPastErrorMessageProvider,\n\n /**\n * If set, restrict date to be equal to a certain value.\n */\n equalsTo: this.#equalsTo,\n\n /**\n * Equals to validation error message provider.\n * If not provided, default error message will be used.\n */\n equalsToValidationErrorMessageProvider:\n this.#equalsToErrorMessageProvider,\n\n /**\n * If set, schema will try to parse date from the UNIX epoch (number).\n * `false` by default.\n */\n parseFromEpoch: this.#parseFromEpoch,\n /**\n * If set, schema will try to parse date from JSON string.\n * `false` by default.\n */\n parseFromJson: this.#parseFromJson,\n /**\n * Array of preprocessor functions\n */\n preprocessors: this.preprocessors as PreprocessorEntry<TResult>[],\n /**\n * Array of validator functions\n */\n validators: this.validators as ValidatorEntry<TResult>[]\n };\n }\n\n /**\n * @inheritdoc\n */\n public hasType<T>(\n _notUsed?: T\n ): DateSchemaBuilder<T, true, TNullable, THasDefault, TExtensions> &\n TExtensions {\n return this.derive(\n {\n ...this.introspect()\n } as any,\n true\n ) as any;\n }\n\n /**\n * @inheritdoc\n */\n public clearHasType(): DateSchemaBuilder<\n Date,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.derive(\n {\n ...this.introspect()\n } as any,\n true\n ) as any;\n }\n\n #getConstraintViolation(\n objToValidate: any\n ): { message: string } | { provider: any } | null {\n if (!(objToValidate instanceof Date)) {\n return {\n message: `expected instance of Date, but saw ${typeof objToValidate}`\n };\n }\n\n if (\n typeof this.#equalsTo !== 'undefined' &&\n objToValidate.getTime() !== this.#equalsTo.getTime()\n ) {\n return { provider: this.#equalsToErrorMessageProvider };\n }\n\n if (this.#ensureIsInFuture && objToValidate <= new Date()) {\n return { provider: this.#ensureIsInFutureErrorMessageProvider };\n }\n\n if (this.#ensureIsInPast && objToValidate >= new Date()) {\n return { provider: this.#ensureIsInPastErrorMessageProvider };\n }\n\n if (typeof this.#min !== 'undefined') {\n if (objToValidate < this.#min)\n return { provider: this.#minErrorMessageProvider };\n }\n\n if (typeof this.#max !== 'undefined') {\n if (objToValidate > this.#max)\n return { provider: this.#maxErrorMessageProvider };\n }\n\n return null;\n }\n\n #buildResult(superResult: ReturnType<DateSchemaBuilder['preValidateSync']>):\n | { done: true; result: ValidationResult<TResult> }\n | {\n done: false;\n provider: any;\n objToValidate: any;\n } {\n const { valid, errors } = superResult;\n\n if (!valid) {\n return { done: true, result: { valid, errors } };\n }\n\n let { transaction: preValidationTransaction } = superResult;\n\n let {\n object: { validatedObject: objToValidate }\n } = preValidationTransaction!;\n\n if (\n (typeof objToValidate === 'undefined' && !this.isRequired) ||\n (objToValidate === null && (!this.isRequired || this.isNullable))\n ) {\n return {\n done: true,\n result: { valid: true, object: objToValidate }\n };\n }\n\n if (this.#parseFromJson) {\n preValidationTransaction = transaction({\n validatedObject: parseFromJsonPreprocessor(objToValidate)\n });\n objToValidate = preValidationTransaction.object.validatedObject;\n }\n\n if (this.#parseFromEpoch) {\n preValidationTransaction = transaction({\n validatedObject: parseFromEpochPreprocessor(objToValidate)\n });\n objToValidate = preValidationTransaction.object.validatedObject;\n }\n\n const violation = this.#getConstraintViolation(objToValidate);\n\n if (!violation) {\n return {\n done: true,\n result: {\n valid: true,\n object: preValidationTransaction!.commit()\n .validatedObject as TResult\n }\n };\n }\n\n if ('message' in violation) {\n return {\n done: true,\n result: {\n valid: false,\n errors: [{ message: violation.message }]\n }\n };\n }\n\n return {\n done: false,\n provider: violation.provider,\n objToValidate\n };\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 Date 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 // Fast path: no preprocessors, validators, or parse-from transformations\n if (this.#canFastPath) {\n if (typeof object === 'undefined' || object === null) {\n if (typeof object === 'undefined' && this.hasDefault) {\n object = this.resolveDefaultValue();\n } else if (\n !this.isRequired ||\n (object === null && this.isNullable)\n ) {\n return { valid: true, object: object };\n } else {\n return {\n valid: false,\n errors: [\n {\n message: this.getValidationErrorMessageSync(\n this.requiredErrorMessage,\n object\n )\n }\n ]\n };\n }\n }\n\n const violation = this.#getConstraintViolation(object);\n\n if (!violation) {\n return { valid: true, object: object as TResult };\n }\n\n if ('message' in violation) {\n return {\n valid: false,\n errors: [{ message: violation.message }]\n };\n }\n\n return {\n valid: false,\n errors: [\n {\n message: this.getValidationErrorMessageSync(\n violation.provider,\n object as TResult\n )\n }\n ]\n };\n }\n\n const r = this.#buildResult(this.preValidateSync(object, context));\n if (r.done) return r.result;\n return {\n valid: false,\n errors: [\n {\n message: this.getValidationErrorMessageSync(\n r.provider,\n r.objToValidate as TResult\n )\n }\n ]\n };\n }\n\n /**\n * Performs async validation of Date 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 const r = this.#buildResult(\n await super.preValidateAsync(object, context)\n );\n if (r.done) return r.result;\n return {\n valid: false,\n errors: [\n {\n message: await this.getValidationErrorMessage(\n r.provider,\n r.objToValidate as TResult\n )\n }\n ]\n };\n }\n\n /**\n * @hidden\n */\n protected createFromProps<T, TReq extends boolean>(\n props: DateSchemaBuilderCreateProps<T, TReq>\n ): this {\n return DateSchemaBuilder.create(props as any) as any;\n }\n\n /**\n * Restricts Date to be equal to `value`.\n */\n public equals<T extends Date>(\n value: T,\n /**\n * Custom error message provider.\n */\n errorMessage?: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n >\n ): DateSchemaBuilder<T, TRequired, TNullable, THasDefault, TExtensions> &\n TExtensions {\n if (!(value instanceof Date)) throw new Error('Date expected');\n return this.derive({\n ...this.introspect(),\n equalsTo: value,\n equalsToValidationErrorMessageProvider: errorMessage\n }) as any as DateSchemaBuilder<\n T,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions;\n }\n\n /**\n * Clears `equals()` call.\n */\n public clearEquals(): DateSchemaBuilder<\n Date,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.derive({\n ...this.introspect(),\n equalsTo: undefined\n }) as any;\n }\n\n /**\n * @hidden\n */\n public required(\n errorMessage?: ValidationErrorMessageProvider\n ): DateSchemaBuilder<TResult, true, TNullable, THasDefault, TExtensions> &\n TExtensions {\n return super.required(errorMessage);\n }\n\n /**\n * @hidden\n */\n public optional(): DateSchemaBuilder<\n TResult,\n false,\n TNullable,\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 ): DateSchemaBuilder<TResult, true, TNullable, true, TExtensions> &\n TExtensions {\n return super.default(value) as any;\n }\n\n /**\n * @hidden\n */\n public clearDefault(): DateSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\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 ): DateSchemaBuilder<\n TResult & { readonly [K in BRAND]: TBrand },\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.brand(_name);\n }\n\n /**\n * Marks the inferred type as `Readonly<Date>` — prevents mutation of\n * Date methods like `setFullYear()` at the type level. Validation\n * behaviour is unchanged.\n *\n * @see {@link SchemaBuilder.readonly}\n */\n public readonly(): DateSchemaBuilder<\n Readonly<TResult>,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.readonly();\n }\n\n /**\n * Accept only dates in the future.\n */\n public isInFuture(\n /**\n * Custom error message provider.\n */\n errorMessage?: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n >\n ): DateSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.derive({\n ...this.introspect(),\n ensureIsInFuture: true,\n ensureIsInFutureValidationErrorMessageProvider: errorMessage\n }) as any;\n }\n\n /**\n * Cancel `isInFuture()` call.\n */\n public clearIsInFuture(): DateSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.derive({\n ...this.introspect(),\n ensureIsInFuture: false\n }) as any;\n }\n\n /**\n * Accept only dates in the past.\n */\n public isInPast(\n /**\n * Custom error message provider.\n */\n errorMessage?: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n >\n ): DateSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.derive({\n ...this.introspect(),\n ensureIsInPast: true,\n ensureIsInPastValidationErrorMessageProvider: errorMessage\n }) as any;\n }\n\n /**\n * Cancel `isInPast()` call.\n */\n public clearIsInPast(): DateSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.derive({\n ...this.introspect(),\n ensureIsInPast: false\n }) as any;\n }\n\n /**\n * Set minimal valid Date value for schema.\n */\n public min(\n minValue: Date,\n /**\n * Custom error message provider.\n */\n errorMessage?: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n >\n ): DateSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n if (!(minValue instanceof Date))\n throw new Error('minValue must be a Date');\n return this.derive({\n ...this.introspect(),\n min: minValue,\n minValidationErrorMessageProvider: errorMessage\n }) as any;\n }\n\n /**\n * Clear `min()` call.\n */\n public clearMin(): DateSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n const schema = this.introspect();\n delete schema.min;\n return this.derive({\n ...schema\n }) as any;\n }\n\n /**\n * Set maximal valid Date value for schema.\n */\n public max(\n maxValue: Date,\n /**\n * Custom error message provider.\n */\n errorMessage?: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n >\n ): DateSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n if (!(maxValue instanceof Date))\n throw new Error('maxValue must be a Date');\n return this.derive({\n ...this.introspect(),\n max: maxValue,\n maxValidationErrorMessageProvider: errorMessage\n }) as any;\n }\n\n /**\n * Clear `max()` call.\n */\n public clearMax(): DateSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n const schema = this.introspect();\n delete schema.max;\n return this.derive({\n ...schema\n }) as any;\n }\n\n /**\n * Adds a preprocessor that coerces a string value to a Date\n * using `new Date(value)`. If the string does not represent a\n * valid date the original value is left unchanged so the date\n * schema rejects it.\n *\n * This is a convenient alias for common string→Date coercion.\n * For more specific parsing, see {@link acceptJsonString} and\n * {@link acceptEpoch}.\n *\n * @example\n * ```ts\n * const schema = date().coerce();\n * const result = schema.validate('2024-01-15');\n * // result.valid === true\n * // result.object instanceof Date === true\n * ```\n */\n public coerce(): DateSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.addPreprocessor(\n ((v: any) => {\n if (typeof v === 'string') {\n const d = new Date(v);\n return Number.isNaN(d.getTime()) ? v : d;\n }\n return v;\n }) as any,\n { mutates: true }\n ) as any;\n }\n\n /**\n * Accepts JSON string as a valid Date.\n * String must be in ISO format and will be parsed using `JSON.parse()`.\n */\n public acceptJsonString(): DateSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.derive({\n ...this.introspect(),\n parseFromJson: true\n }) as any;\n }\n\n /**\n * Cancel `acceptJsonString()` call.\n */\n public doNotAcceptJsonString(): DateSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.derive({\n ...this.introspect(),\n parseFromJson: false\n }) as any;\n }\n\n /**\n * Accepts epoch number as a valid Date.\n * Epoch number will be parsed using `new Date(epoch)`.\n */\n public acceptEpoch(): DateSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.derive({\n ...this.introspect(),\n parseFromEpoch: true\n }) as any;\n }\n\n /**\n * Cancel `acceptEpoch()` call.\n */\n public doNotAcceptEpoch(): DateSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.derive({\n ...this.introspect(),\n parseFromEpoch: false\n }) as any;\n }\n\n /**\n * @hidden\n */\n public nullable(): DateSchemaBuilder<\n TResult,\n TRequired,\n true,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.nullable() as any;\n }\n\n /**\n * @hidden\n */\n public notNullable(): DateSchemaBuilder<\n TResult,\n TRequired,\n false,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.notNullable() as any;\n }\n}\n\n/**\n * Creates a Date schema.\n */\nexport const date = () =>\n DateSchemaBuilder.create({\n isRequired: true\n });\n"],"mappings":"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","names":["parseFromJsonPreprocessor","value","time","parseFromEpochPreprocessor","DateSchemaBuilder","_DateSchemaBuilder","SchemaBuilder","#min","#defaultMinErrorMessageProvider","#minErrorMessageProvider","#max","#defaultMaxErrorMessageProvider","#maxErrorMessageProvider","#equalsTo","#defaultEqualsToErrorMessageProvider","#equalsToErrorMessageProvider","#ensureIsInFuture","#defaultEnsureIsInFutureErrorMessageProvider","#ensureIsInFutureErrorMessageProvider","#ensureIsInPast","#defaultEnsureIsInPastErrorMessageProvider","#ensureIsInPastErrorMessageProvider","#parseFromJson","#parseFromEpoch","#canFastPath","props","_notUsed","#getConstraintViolation","objToValidate","#buildResult","superResult","valid","errors","preValidationTransaction","transaction","violation","object","context","r","errorMessage","_name","minValue","schema","maxValue","v","d","date"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{f as n}from"./chunk-2BKBVVZ3.js";var r=class i extends n{#e=[];#a;static create(e){return new i({type:"function",...e})}constructor(e){super(e),Array.isArray(e.parameters)&&(this.#e=e.parameters.filter(a=>a instanceof n)),e.returnType instanceof n&&(this.#a=e.returnType)}hasType(e){return this.derive({...this.introspect()},!0)}clearHasType(){return this.derive({...this.introspect()},!0)}introspect(){return{...super.introspect(),parameters:[...this.#e],returnType:this.#a}}#t(e){let{valid:a,transaction:s,errors:u}=e;if(!a)return{valid:a,errors:u};let{object:{validatedObject:t}}=s;return typeof t>"u"&&!this.isRequired||t===null&&(!this.isRequired||this.isNullable)?{valid:!0,object:t}:typeof t!="function"?{valid:!1,errors:[{message:`expected type function, but saw ${typeof t}`}]}:{valid:!0,object:t}}validate(e,a){return super.validate(e,a)}async validateAsync(e,a){return super.validateAsync(e,a)}_validate(e,a){return this.#t(this.preValidateSync(e,a))}async _validateAsync(e,a){return this.#t(await super.preValidateAsync(e,a))}createFromProps(e){return i.create(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()}addParameter(e){return this.derive({...this.introspect(),parameters:[...this.#e,e]})}hasReturnType(e){return this.derive({...this.introspect(),returnType:e})}notNullable(){return super.notNullable()}},T=()=>r.create({isRequired:!0});export{r as a,T as b};
|
|
2
|
+
//# sourceMappingURL=chunk-BMA2X7LI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/builders/FunctionSchemaBuilder.ts"],"sourcesContent":["import {\n type BRAND,\n type InferType,\n SchemaBuilder,\n type ValidationContext,\n type ValidationErrorMessageProvider,\n type ValidationResult\n} from './SchemaBuilder.js';\n\ntype FunctionSchemaBuilderCreateProps<R extends boolean = true> = Partial<\n ReturnType<FunctionSchemaBuilder<R>['introspect']>\n>;\n\ntype InferParameters<TParams extends SchemaBuilder<any, any, any, any, any>[]> =\n {\n [K in keyof TParams]: InferType<TParams[K]>;\n };\n\n/**\n * Schema builder for functions. Allows to define a schema for a function.\n * It can be required or optional, and may carry typed parameter and return-type\n * schemas so that the inferred TypeScript function signature is fully typed.\n *\n * **NOTE** this class is exported for type annotations and advanced use.\n * Customize via extensions rather than subclassing. Avoid instantiating it\n * directly. Use {@link func | func()} function instead.\n *\n * @example Basic validation\n * ```ts\n * const schema = func();\n * const result = schema.validate(() => {});\n * // result.valid === true\n * // result.object === () => {}\n * ```\n *\n * @example Optional function schema\n * ```ts\n * const schema = func().optional();\n * const result = schema.validate(undefined);\n * // result.valid === true\n * // result.object === undefined\n * ```\n *\n * @example Typed parameters and return type\n * ```ts\n * import { func, string, number, InferType } from '@cleverbrush/schema';\n *\n * const greet = func()\n * .addParameter(string()) // first param: string\n * .addParameter(number().optional()) // second param: number | undefined\n * .hasReturnType(string()); // return type: string\n *\n * type Greet = InferType<typeof greet>;\n * // → (param0: string, param1: number | undefined) => string\n *\n * // Introspect at runtime\n * const info = greet.introspect();\n * // info.parameters → [StringSchemaBuilder, NumberSchemaBuilder]\n * // info.returnType → StringSchemaBuilder\n * ```\n *\n * @see {@link func}\n */\nexport class FunctionSchemaBuilder<\n TRequired extends boolean = true,\n TNullable extends boolean = false,\n TExplicitType = undefined,\n THasDefault extends boolean = false,\n TExtensions = {},\n TParameters extends SchemaBuilder<any, any, any, any, any>[] = [],\n TReturnTypeSchema extends\n | SchemaBuilder<any, any, any, any, any>\n | undefined = undefined,\n TResult = TExplicitType extends undefined\n ? (\n ...args: TParameters extends []\n ? any[]\n : InferParameters<TParameters>\n ) => TReturnTypeSchema extends SchemaBuilder<any, any, any, any, any>\n ? InferType<TReturnTypeSchema>\n : any\n : TExplicitType\n> extends SchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n> {\n /** Native type parameters for extension rebinding; never emitted at runtime. @internal */\n declare readonly __cleverbrush_builder_type__: readonly [\n 'func',\n TRequired,\n TNullable,\n TExplicitType,\n THasDefault,\n TParameters,\n TReturnTypeSchema,\n TResult\n ];\n\n #parameters: SchemaBuilder<any, any, any, any, any>[] = [];\n #returnType?: SchemaBuilder<any, any, any, any, any>;\n\n /**\n * @hidden\n */\n public static create(props: FunctionSchemaBuilderCreateProps<any>) {\n return new FunctionSchemaBuilder({\n type: 'function',\n ...props\n });\n }\n\n protected constructor(props: FunctionSchemaBuilderCreateProps<TRequired>) {\n super(props as any);\n\n if (Array.isArray(props.parameters)) {\n this.#parameters = props.parameters.filter(\n p => p instanceof SchemaBuilder\n );\n }\n\n if (props.returnType instanceof SchemaBuilder) {\n this.#returnType = props.returnType;\n }\n }\n\n /**\n * @hidden\n */\n public hasType<T>(\n _notUsed?: T\n ): FunctionSchemaBuilder<\n true,\n TNullable,\n T,\n THasDefault,\n TExtensions,\n TParameters,\n TReturnTypeSchema\n > &\n TExtensions {\n return this.derive(\n {\n ...this.introspect()\n } as any,\n true\n ) as any;\n }\n\n /**\n * @hidden\n */\n public clearHasType(): FunctionSchemaBuilder<\n TRequired,\n TNullable,\n undefined,\n THasDefault,\n TExtensions,\n TParameters,\n TReturnTypeSchema\n > &\n TExtensions {\n return this.derive(\n {\n ...this.introspect()\n } as any,\n true\n ) as any;\n }\n\n /**\n * Returns an object describing the current schema configuration.\n *\n * In addition to the base fields exposed by {@link SchemaBuilder.introspect},\n * the following fields are included:\n *\n * - `parameters` — an array of {@link SchemaBuilder} instances accumulated via\n * {@link addParameter}. Each element describes one positional parameter of the\n * function in the order they were added.\n * - `returnType` — the {@link SchemaBuilder} set via {@link hasReturnType}, or\n * `undefined` when no return-type schema has been configured.\n *\n * @example\n * ```ts\n * const schema = func()\n * .addParameter(string())\n * .addParameter(number())\n * .hasReturnType(boolean());\n *\n * const info = schema.introspect();\n * // info.parameters.length === 2\n * // info.returnType instanceof BooleanSchemaBuilder\n * ```\n */\n public introspect() {\n return {\n ...super.introspect(),\n /** List of parameter schemas added via {@link addParameter}. */\n parameters: [...this.#parameters],\n /** Return type schema set via {@link hasReturnType}, or `undefined` if not set. */\n returnType: this.#returnType\n };\n }\n\n #buildResult(\n superResult: ReturnType<FunctionSchemaBuilder['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 if (\n (typeof objToValidate === 'undefined' && !this.isRequired) ||\n (objToValidate === null && (!this.isRequired || this.isNullable))\n ) {\n return {\n valid: true,\n object: objToValidate\n };\n }\n\n if (typeof objToValidate !== 'function') {\n return {\n valid: false,\n errors: [\n {\n message: `expected type function, but saw ${typeof objToValidate}`\n }\n ]\n };\n }\n\n return {\n valid: true,\n object: objToValidate\n };\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: FunctionSchemaBuilderCreateProps<TReq>\n ): this {\n return FunctionSchemaBuilder.create(props as any) as any;\n }\n\n /**\n * @hidden\n */\n public required(\n errorMessage?: ValidationErrorMessageProvider\n ): FunctionSchemaBuilder<\n true,\n TNullable,\n TExplicitType,\n THasDefault,\n TExtensions,\n TParameters,\n TReturnTypeSchema\n > &\n TExtensions {\n return super.required(errorMessage);\n }\n\n /**\n * @hidden\n */\n public optional(): FunctionSchemaBuilder<\n false,\n TNullable,\n TExplicitType,\n THasDefault,\n TExtensions,\n TParameters,\n TReturnTypeSchema\n > &\n TExtensions {\n return super.optional();\n }\n\n /**\n * @hidden\n */\n public default(\n value: TResult | (() => TResult)\n ): FunctionSchemaBuilder<\n true,\n TNullable,\n TExplicitType,\n true,\n TExtensions,\n TParameters,\n TReturnTypeSchema\n > &\n TExtensions {\n return super.default(value) as any;\n }\n\n /**\n * @hidden\n */\n public clearDefault(): FunctionSchemaBuilder<\n TRequired,\n TNullable,\n TExplicitType,\n false,\n TExtensions,\n TParameters,\n TReturnTypeSchema\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 ): FunctionSchemaBuilder<\n TRequired,\n TNullable,\n TResult & { readonly [K in BRAND]: TBrand },\n THasDefault,\n TExtensions,\n TParameters,\n TReturnTypeSchema\n > &\n TExtensions {\n return super.brand(_name);\n }\n\n /**\n * Marks the inferred type as `Readonly<Function>`. Sets the\n * `isReadonly` introspection flag for tooling consistency.\n *\n * @see {@link SchemaBuilder.readonly}\n */\n public readonly(): FunctionSchemaBuilder<\n TRequired,\n TNullable,\n Readonly<TResult>,\n THasDefault,\n TExtensions,\n TParameters,\n TReturnTypeSchema\n > &\n TExtensions {\n return super.readonly();\n }\n\n /**\n * @hidden\n */\n public nullable(): FunctionSchemaBuilder<\n TRequired,\n true,\n TExplicitType,\n THasDefault,\n TExtensions,\n TParameters,\n TReturnTypeSchema\n > &\n TExtensions {\n return super.nullable() as any;\n }\n\n /**\n * Appends a positional parameter schema to the function schema.\n *\n * Each call extends the inferred function signature by one parameter.\n * The full list of parameter schemas is available at runtime via\n * `introspect().parameters`.\n *\n * Parameter order matches the call order — the first `addParameter()` call\n * defines the type of the first argument, the second call defines the second\n * argument, and so on.\n *\n * @param schema - The schema describing the parameter. Pass an optional schema\n * (e.g. `string().optional()`) to make the corresponding argument optional.\n *\n * @example\n * ```ts\n * const fn = func()\n * .addParameter(string()) // (a: string, ...) => any\n * .addParameter(number().optional()) // (..., b?: number) => any\n * .addParameter(boolean()); // (..., c: boolean) => any\n *\n * type Fn = InferType<typeof fn>;\n * // → (a: string, b: number | undefined, c: boolean) => any\n * ```\n */\n public addParameter<TSchema extends SchemaBuilder<any, any, any, any, any>>(\n schema: TSchema\n ): FunctionSchemaBuilder<\n TRequired,\n TNullable,\n TExplicitType,\n THasDefault,\n TExtensions,\n [...TParameters, TSchema],\n TReturnTypeSchema\n > &\n TExtensions {\n return this.derive({\n ...this.introspect(),\n parameters: [...this.#parameters, schema]\n } as any) as any;\n }\n\n /**\n * Sets the return type schema for the function schema.\n *\n * Replaces any previously set return type. The inferred function signature\n * gains a concrete return type instead of `any`. The schema is accessible at\n * runtime via `introspect().returnType`.\n *\n * @param schema - The schema describing the return type of the function.\n *\n * @example\n * ```ts\n * const fn = func()\n * .addParameter(string())\n * .hasReturnType(number());\n *\n * type Fn = InferType<typeof fn>;\n * // → (param0: string) => number\n *\n * fn.introspect().returnType; // NumberSchemaBuilder\n * ```\n */\n public hasReturnType<\n TSchema extends SchemaBuilder<any, any, any, any, any>\n >(\n schema: TSchema\n ): FunctionSchemaBuilder<\n TRequired,\n TNullable,\n TExplicitType,\n THasDefault,\n TExtensions,\n TParameters,\n TSchema\n > &\n TExtensions {\n return this.derive({\n ...this.introspect(),\n returnType: schema\n } as any) as any;\n }\n\n /**\n * @hidden\n */\n public notNullable(): FunctionSchemaBuilder<\n TRequired,\n false,\n TExplicitType,\n THasDefault,\n TExtensions,\n TParameters,\n TReturnTypeSchema\n > &\n TExtensions {\n return super.notNullable() as any;\n }\n}\n\n/**\n * Creates a `function` schema that validates the value is a JavaScript function.\n *\n * The returned builder is immutable and fully chainable. Use\n * {@link FunctionSchemaBuilder.addParameter} to annotate the expected parameter\n * types and {@link FunctionSchemaBuilder.hasReturnType} to annotate the return\n * type — the inferred TypeScript function signature is updated automatically.\n *\n * @returns A new {@link FunctionSchemaBuilder} with `isRequired` set to `true`.\n *\n * @example\n * ```ts\n * import { func, string, number, InferType } from '@cleverbrush/schema';\n *\n * const schema = func()\n * .addParameter(string())\n * .addParameter(number().optional())\n * .hasReturnType(string());\n *\n * type Fn = InferType<typeof schema>;\n * // → (param0: string, param1?: number) => string\n *\n * schema.validate(() => 'hello'); // { valid: true }\n * schema.validate('not a fn'); // { valid: false }\n * ```\n *\n * @see {@link FunctionSchemaBuilder}\n */\nexport const func = () =>\n FunctionSchemaBuilder.create({\n isRequired: true\n }) as FunctionSchemaBuilder<true>;\n"],"mappings":"wCA+DO,IAAMA,EAAN,MAAMC,UAmBHC,CAMR,CAaEC,GAAwD,CAAC,EACzDC,GAKA,OAAc,OAAOC,EAA8C,CAC/D,OAAO,IAAIJ,EAAsB,CAC7B,KAAM,WACN,GAAGI,CACP,CAAC,CACL,CAEU,YAAYA,EAAoD,CACtE,MAAMA,CAAY,EAEd,MAAM,QAAQA,EAAM,UAAU,IAC9B,KAAKF,GAAcE,EAAM,WAAW,OAChCC,GAAKA,aAAaJ,CACtB,GAGAG,EAAM,sBAAsBH,IAC5B,KAAKE,GAAcC,EAAM,WAEjC,CAKO,QACHE,EAUY,CACZ,OAAO,KAAK,OACR,CACI,GAAG,KAAK,WAAW,CACvB,EACA,EACJ,CACJ,CAKO,cASS,CACZ,OAAO,KAAK,OACR,CACI,GAAG,KAAK,WAAW,CACvB,EACA,EACJ,CACJ,CA0BO,YAAa,CAChB,MAAO,CACH,GAAG,MAAM,WAAW,EAEpB,WAAY,CAAC,GAAG,KAAKJ,EAAW,EAEhC,WAAY,KAAKC,EACrB,CACJ,CAEAI,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,OACK,OAAOE,EAAkB,KAAe,CAAC,KAAK,YAC9CA,IAAkB,OAAS,CAAC,KAAK,YAAc,KAAK,YAE9C,CACH,MAAO,GACP,OAAQA,CACZ,EAGA,OAAOA,GAAkB,WAClB,CACH,MAAO,GACP,OAAQ,CACJ,CACI,QAAS,mCAAmC,OAAOA,CAAa,EACpE,CACJ,CACJ,EAGG,CACH,MAAO,GACP,OAAQA,CACZ,CACJ,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,gBACNV,EACI,CACJ,OAAOJ,EAAsB,OAAOI,CAAY,CACpD,CAKO,SACHW,EAUY,CACZ,OAAO,MAAM,SAASA,CAAY,CACtC,CAKO,UASS,CACZ,OAAO,MAAM,SAAS,CAC1B,CAKO,QACHC,EAUY,CACZ,OAAO,MAAM,QAAQA,CAAK,CAC9B,CAKO,cASS,CACZ,OAAO,MAAM,aAAa,CAC9B,CAKO,MACHC,EAUY,CACZ,OAAO,MAAM,MAAMA,CAAK,CAC5B,CAQO,UASS,CACZ,OAAO,MAAM,SAAS,CAC1B,CAKO,UASS,CACZ,OAAO,MAAM,SAAS,CAC1B,CA2BO,aACHC,EAUY,CACZ,OAAO,KAAK,OAAO,CACf,GAAG,KAAK,WAAW,EACnB,WAAY,CAAC,GAAG,KAAKhB,GAAagB,CAAM,CAC5C,CAAQ,CACZ,CAuBO,cAGHA,EAUY,CACZ,OAAO,KAAK,OAAO,CACf,GAAG,KAAK,WAAW,EACnB,WAAYA,CAChB,CAAQ,CACZ,CAKO,aASS,CACZ,OAAO,MAAM,YAAY,CAC7B,CACJ,EA8BaC,EAAO,IAChBpB,EAAsB,OAAO,CACzB,WAAY,EAChB,CAAC","names":["FunctionSchemaBuilder","_FunctionSchemaBuilder","SchemaBuilder","#parameters","#returnType","props","p","_notUsed","#buildResult","superResult","valid","preValidationTransaction","errors","objToValidate","object","context","errorMessage","value","_name","schema","func"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{f as l}from"./chunk-2BKBVVZ3.js";var n=class t extends l{#e;#b=function(){return`expected to be at least ${this.#e}`};#a=this.#b;#r;#N=function(){return`expected to be no more than or equal to ${this.#r}`};#u=this.#N;#s;#E=function(){return`expected to be equal to ${this.#s}`};#n=this.#E;#i=!0;#l=function(){return"is not expected to be NaN"};#o=this.#l;#d=!0;#T=function(){return"is expected to be a finite number"};#m=this.#T;#h=!0;#t=function(){return"is expected to be an integer"};#c=this.#t;static create(e){return new t({type:"number",...e})}constructor(e){super(e),typeof e.min=="number"&&(this.#e=e.min),this.#a=this.assureValidationErrorMessageProvider(e.minValidationErrorMessageProvider,this.#b),typeof e.max=="number"&&(this.#r=e.max),this.#u=this.assureValidationErrorMessageProvider(e.maxValidationErrorMessageProvider,this.#N),typeof e.ensureNotNaN=="boolean"&&(this.#i=e.ensureNotNaN),this.#o=this.assureValidationErrorMessageProvider(e.ensureNotNaNErrorMessageProvider,this.#l),typeof e.ensureIsFinite=="boolean"&&(this.#d=e.ensureIsFinite),this.#m=this.assureValidationErrorMessageProvider(e.ensureIsFiniteErrorMessageProvider,this.#T),typeof e.isInteger=="boolean"&&(this.#h=e.isInteger),this.#c=this.assureValidationErrorMessageProvider(e.ensureIsIntegerErrorMessageProvider,this.#t),(typeof e.equalsTo=="number"||typeof e.equalsTo>"u")&&(this.#s=e.equalsTo),this.#n=this.assureValidationErrorMessageProvider(e.equalsToValidationErrorMessageProvider,this.#E)}introspect(){return{...super.introspect(),min:this.#e,minValidationErrorMessageProvider:this.#a,max:this.#r,maxValidationErrorMessageProvider:this.#u,ensureNotNaN:this.#i,ensureNotNaNErrorMessageProvider:this.#o,ensureIsFinite:this.#d,ensureIsFiniteErrorMessageProvider:this.#m,equalsTo:this.#s,equalsToValidationErrorMessageProvider:this.#n,isInteger:this.#h,ensureIsIntegerErrorMessageProvider:this.#c,preprocessors:this.preprocessors,validators:this.validators}}hasType(e){return this.derive({...this.introspect()},!0)}clearHasType(){return this.derive({...this.introspect()},!0)}#f(e){return typeof e!="number"?{message:`expected type number, but saw ${typeof e}`}:typeof this.#s<"u"&&e!==this.#s?{provider:this.#n}:this.#i&&Number.isNaN(e)?{provider:this.#o}:this.#d&&!Number.isFinite(e)&&this.#i&&!Number.isNaN(e)?{provider:this.#m}:this.#h&&!Number.isNaN(e)&&Number.isFinite(e)&&!Number.isInteger(e)?{provider:this.#c}:typeof this.#e<"u"&&e<this.#e?{provider:this.#a}:typeof this.#r<"u"&&e>this.#r?{provider:this.#u}:null}#R(e){let{valid:r,transaction:s,errors:i}=e;if(!r)return{done:!0,result:{valid:r,errors:i}};let{object:{validatedObject:a}}=s;if(typeof a>"u"&&!this.isRequired||a===null&&(!this.isRequired||this.isNullable))return{done:!0,result:{valid:!0,object:a}};let u=this.#f(a);return u?"message"in u?{done:!0,result:{valid:!1,errors:[{message:u.message}]}}:{done:!1,provider:u.provider,objToValidate:a}:{done:!0,result:{valid:!0,object:s.commit().validatedObject}}}validate(e,r){return super.validate(e,r)}async validateAsync(e,r){return super.validateAsync(e,r)}_validate(e,r){if(this.canSkipPreValidation){if(typeof e>"u"||e===null)if(typeof e>"u"&&this.hasDefault)e=this.resolveDefaultValue();else return!this.isRequired||e===null&&this.isNullable?{valid:!0,object:e}:{valid:!1,errors:[{message:this.getValidationErrorMessageSync(this.requiredErrorMessage,e)}]};let i=this.#f(e);return i?"message"in i?{valid:!1,errors:[{message:i.message}]}:{valid:!1,errors:[{message:this.getValidationErrorMessageSync(i.provider,e)}]}:{valid:!0,object:e}}let s=this.#R(this.preValidateSync(e,r));return s.done?s.result:{valid:!1,errors:[{message:this.getValidationErrorMessageSync(s.provider,s.objToValidate)}]}}async _validateAsync(e,r){let s=this.#R(await super.preValidateAsync(e,r));return s.done?s.result:{valid:!1,errors:[{message:await this.getValidationErrorMessage(s.provider,s.objToValidate)}]}}createFromProps(e){return t.create(e)}equals(e,r){if(typeof e!="number")throw new Error("number expected");return this.derive({...this.introspect(),equalsTo:e,equalsToValidationErrorMessageProvider:r})}clearEquals(){return this.derive({...this.introspect(),equalsTo:void 0})}isFloat(){return this.derive({...this.introspect(),isInteger:!1,ensureIsIntegerErrorMessageProvider:this.#t})}clearIsInteger(){return this.derive({...this.introspect(),isInteger:!1,ensureIsIntegerErrorMessageProvider:this.#t})}isInteger(e){return this.derive({...this.introspect(),isInteger:!0,ensureIsIntegerErrorMessageProvider: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()}notNaN(e){return this.derive({...this.introspect(),ensureNotNaN:!0,ensureNotNaNErrorMessageProvider:e})}canBeNaN(){return this.derive({...this.introspect(),ensureNotNaN:!1,ensureNotNaNErrorMessageProvider:this.#l})}isFinite(e){return this.derive({...this.introspect(),ensureIsFinite:!0,ensureIsFiniteErrorMessageProvider:e})}canBeInfinite(){return this.derive({...this.introspect(),ensureIsFinite:!1,ensureIsFiniteErrorMessageProvider:this.#T})}coerce(){return this.addPreprocessor((e=>typeof e=="string"?Number(e):e),{mutates:!0})}min(e,r){if(typeof e!="number")throw new Error("minValue must be a number");return this.derive({...this.introspect(),min:e,minValidationErrorMessageProvider:r})}clearMin(){let e=this.introspect();return delete e.min,this.derive({...e})}max(e,r){if(typeof e!="number")throw new Error("maxValue must be a number");return this.derive({...this.introspect(),max:e,maxValidationErrorMessageProvider:r})}clearMax(){let e=this.introspect();return delete e.max,this.derive({...e})}nullable(){return super.nullable()}notNullable(){return super.notNullable()}};function d(t){return typeof t=="number"?n.create({isRequired:!0,equalsTo:t}):n.create({isRequired:!0})}export{n as a,d as b};
|
|
2
|
+
//# sourceMappingURL=chunk-BTR3ZGES.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/builders/NumberSchemaBuilder.ts"],"sourcesContent":["import {\n type BRAND,\n type PreprocessorEntry,\n SchemaBuilder,\n type ValidationContext,\n type ValidationErrorMessageProvider,\n type ValidationResult,\n type ValidatorEntry\n} from './SchemaBuilder.js';\n\ntype NumberSchemaBuilderCreateProps<\n T = number,\n R extends boolean = true\n> = Partial<ReturnType<NumberSchemaBuilder<T, R, any>['introspect']>>;\n\n/**\n * Number schema builder class. Allows to create Number schemas.\n * Can be required or optional, can be restricted to be equal to a certain value,\n * can be restricted to be in a certain range, can be restricted to be integer.\n *\n * **NOTE** this class is exported for type annotations and advanced use.\n * Customize via extensions rather than subclassing. Avoid instantiating it\n * directly. Use {@link number | number()} function instead.\n *\n * @example\n * ```ts\n * const schema = number().equals(42);\n * const result = schema.validate(42);\n * // result.valid === true\n * // result.object === 42\n * ```\n * @example\n * ```ts\n * const schema = number();\n * const result = schema.validate('42');\n * // result.valid === false\n * // result.errors[0].message === 'is expected to be a number'\n * ```\n * @example\n * ```ts\n * const schema = number().min(0).max(100);\n * const result = schema.validate(42);\n * // result.valid === true\n * // result.object === 42\n * ```\n *\n * @example\n * ```ts\n * const schema = number().min(0).max(100);\n * const result = schema.validate(142.5);\n * // result.valid === false\n * // result.errors[0].message === 'is expected to be less than or equal to 100'\n * ```\n *\n * @see {@link number}\n */\nexport class NumberSchemaBuilder<\n TResult = number,\n TRequired extends boolean = true,\n TNullable extends boolean = false,\n THasDefault extends boolean = false,\n TExtensions = {}\n> extends SchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n> {\n /** Native type parameters for extension rebinding; never emitted at runtime. @internal */\n declare readonly __cleverbrush_builder_type__: readonly [\n 'number',\n TResult,\n TRequired,\n TNullable,\n THasDefault\n ];\n\n #min?: number;\n #defaultMinErrorMessageProvider: ValidationErrorMessageProvider<\n NumberSchemaBuilder<TResult, TRequired>\n > = function (this: NumberSchemaBuilder) {\n return `expected to be at least ${this.#min}`;\n } as any;\n #minErrorMessageProvider: ValidationErrorMessageProvider<\n NumberSchemaBuilder<TResult, TRequired>\n > = this.#defaultMinErrorMessageProvider;\n\n #max?: number;\n #defaultMaxErrorMessageProvider: ValidationErrorMessageProvider<\n NumberSchemaBuilder<TResult, TRequired>\n > = function (this: NumberSchemaBuilder) {\n return `expected to be no more than or equal to ${this.#max}`;\n };\n #maxErrorMessageProvider: ValidationErrorMessageProvider<\n NumberSchemaBuilder<TResult, TRequired>\n > = this.#defaultMaxErrorMessageProvider;\n\n #equalsTo?: number;\n #defaultEqualsToErrorMessageProvider: ValidationErrorMessageProvider<\n NumberSchemaBuilder<TResult, TRequired>\n > = function (this: NumberSchemaBuilder) {\n return `expected to be equal to ${this.#equalsTo}`;\n };\n #equalsToErrorMessageProvider: ValidationErrorMessageProvider<\n NumberSchemaBuilder<TResult, TRequired>\n > = this.#defaultEqualsToErrorMessageProvider;\n\n #ensureNotNaN = true;\n #defaultEnsureNotNaNErrorMessageProvider: ValidationErrorMessageProvider<\n NumberSchemaBuilder<TResult, TRequired>\n > = function (this: NumberSchemaBuilder) {\n return 'is not expected to be NaN';\n };\n #ensureNotNaNErrorMessageProvider: ValidationErrorMessageProvider<\n NumberSchemaBuilder<TResult, TRequired>\n > = this.#defaultEnsureNotNaNErrorMessageProvider;\n\n #ensureIsFinite = true;\n #defaultEnsureIsFiniteErrorMessageProvider: ValidationErrorMessageProvider<\n NumberSchemaBuilder<TResult, TRequired>\n > = function (this: NumberSchemaBuilder) {\n return 'is expected to be a finite number';\n };\n #ensureIsFiniteErrorMessageProvider: ValidationErrorMessageProvider<\n NumberSchemaBuilder<TResult, TRequired>\n > = this.#defaultEnsureIsFiniteErrorMessageProvider;\n\n #isInteger = true;\n #defaultEnsureIsIntegerErrorMessageProvider: ValidationErrorMessageProvider<\n NumberSchemaBuilder<TResult, TRequired>\n > = function (this: NumberSchemaBuilder) {\n return 'is expected to be an integer';\n };\n #ensureIsIntegerErrorMessageProvider: ValidationErrorMessageProvider<\n NumberSchemaBuilder<TResult, TRequired>\n > = this.#defaultEnsureIsIntegerErrorMessageProvider;\n\n /**\n * @hidden\n */\n public static create(props: NumberSchemaBuilderCreateProps) {\n return new NumberSchemaBuilder({\n type: 'number',\n ...props\n });\n }\n\n protected constructor(props: NumberSchemaBuilderCreateProps) {\n super(props as any);\n\n if (typeof props.min === 'number') {\n this.#min = props.min;\n }\n\n this.#minErrorMessageProvider =\n this.assureValidationErrorMessageProvider(\n props.minValidationErrorMessageProvider as any,\n this.#defaultMinErrorMessageProvider\n );\n\n if (typeof props.max === 'number') {\n this.#max = props.max;\n }\n\n this.#maxErrorMessageProvider =\n this.assureValidationErrorMessageProvider(\n props.maxValidationErrorMessageProvider as any,\n this.#defaultMaxErrorMessageProvider\n );\n\n if (typeof props.ensureNotNaN === 'boolean') {\n this.#ensureNotNaN = props.ensureNotNaN;\n }\n\n this.#ensureNotNaNErrorMessageProvider =\n this.assureValidationErrorMessageProvider(\n props.ensureNotNaNErrorMessageProvider as any,\n this.#defaultEnsureNotNaNErrorMessageProvider\n );\n\n if (typeof props.ensureIsFinite === 'boolean') {\n this.#ensureIsFinite = props.ensureIsFinite;\n }\n\n this.#ensureIsFiniteErrorMessageProvider =\n this.assureValidationErrorMessageProvider(\n props.ensureIsFiniteErrorMessageProvider as any,\n this.#defaultEnsureIsFiniteErrorMessageProvider\n );\n\n if (typeof props.isInteger === 'boolean') {\n this.#isInteger = props.isInteger;\n }\n\n this.#ensureIsIntegerErrorMessageProvider =\n this.assureValidationErrorMessageProvider(\n props.ensureIsIntegerErrorMessageProvider as any,\n this.#defaultEnsureIsIntegerErrorMessageProvider\n );\n\n if (\n typeof props.equalsTo === 'number' ||\n typeof props.equalsTo === 'undefined'\n ) {\n this.#equalsTo = props.equalsTo;\n }\n\n this.#equalsToErrorMessageProvider =\n this.assureValidationErrorMessageProvider(\n props.equalsToValidationErrorMessageProvider as any,\n this.#defaultEqualsToErrorMessageProvider\n );\n }\n\n public introspect() {\n return {\n ...super.introspect(),\n /**\n * Min valid value (if defined).\n */\n min: this.#min,\n /**\n * Min valid value error message provider.\n * If not provided, default error message will be used.\n */\n minValidationErrorMessageProvider: this.#minErrorMessageProvider,\n\n /**\n * Max valid value (if defined).\n */\n max: this.#max,\n /**\n * Max valid value error message provider.\n * If not provided, default error message will be used.\n */\n maxValidationErrorMessageProvider: this.#maxErrorMessageProvider,\n\n /**\n * Make sure that object is not `NaN`. `true` by default.\n */\n ensureNotNaN: this.#ensureNotNaN,\n /**\n * EnsureNotNaN error message provider.\n * If not provided, default error message will be used.\n */\n ensureNotNaNErrorMessageProvider:\n this.#ensureNotNaNErrorMessageProvider,\n\n /**\n * Make sure that object is not different kinds of `infinity`. `true` by default.\n */\n ensureIsFinite: this.#ensureIsFinite,\n /**\n * EnsureIsFinite error message provider.\n */\n ensureIsFiniteErrorMessageProvider:\n this.#ensureIsFiniteErrorMessageProvider,\n\n /**\n * If set, restrict object to be equal to a certain value.\n */\n\n equalsTo: this.#equalsTo,\n /**\n * EqualsTo error message provider.\n * If not provided, default error message will be used.\n */\n equalsToValidationErrorMessageProvider:\n this.#equalsToErrorMessageProvider,\n\n /**\n * Allow only integer values (floating point values will be rejected\n * as invalid)\n */\n isInteger: this.#isInteger,\n /**\n * EnsureIsInteger error message provider.\n */\n ensureIsIntegerErrorMessageProvider:\n this.#ensureIsIntegerErrorMessageProvider,\n\n /**\n * Array of preprocessor functions\n */\n preprocessors: this.preprocessors as PreprocessorEntry<TResult>[],\n /**\n * Array of validator functions\n */\n validators: this.validators as ValidatorEntry<TResult>[]\n };\n }\n\n /**\n * @inheritdoc\n */\n public hasType<T>(\n _notUsed?: T\n ): NumberSchemaBuilder<T, true, TNullable, THasDefault, TExtensions> &\n TExtensions {\n return this.derive(\n {\n ...this.introspect()\n } as any,\n true\n ) as any;\n }\n\n /**\n * @inheritdoc\n */\n public clearHasType(): NumberSchemaBuilder<\n number,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.derive(\n {\n ...this.introspect()\n } as any,\n true\n ) as any;\n }\n\n #getConstraintViolation(\n objToValidate: any\n ): { message: string } | { provider: any } | null {\n if (typeof objToValidate !== 'number') {\n return {\n message: `expected type number, but saw ${typeof objToValidate}`\n };\n }\n\n if (\n typeof this.#equalsTo !== 'undefined' &&\n objToValidate !== this.#equalsTo\n ) {\n return { provider: this.#equalsToErrorMessageProvider };\n }\n\n if (this.#ensureNotNaN && Number.isNaN(objToValidate)) {\n return { provider: this.#ensureNotNaNErrorMessageProvider };\n }\n\n if (\n this.#ensureIsFinite &&\n !Number.isFinite(objToValidate) &&\n this.#ensureNotNaN &&\n !Number.isNaN(objToValidate)\n ) {\n return { provider: this.#ensureIsFiniteErrorMessageProvider };\n }\n\n if (\n this.#isInteger &&\n !Number.isNaN(objToValidate) &&\n Number.isFinite(objToValidate) &&\n !Number.isInteger(objToValidate)\n ) {\n return { provider: this.#ensureIsIntegerErrorMessageProvider };\n }\n\n if (typeof this.#min !== 'undefined') {\n if (objToValidate < this.#min)\n return { provider: this.#minErrorMessageProvider };\n }\n\n if (typeof this.#max !== 'undefined') {\n if (objToValidate > this.#max)\n return { provider: this.#maxErrorMessageProvider };\n }\n\n return null;\n }\n\n #buildResult(\n superResult: ReturnType<NumberSchemaBuilder['preValidateSync']>\n ):\n | { done: true; result: ValidationResult<TResult> }\n | {\n done: false;\n provider: any;\n objToValidate: any;\n } {\n const {\n valid,\n transaction: preValidationTransaction,\n errors\n } = superResult;\n\n if (!valid) {\n return { done: true, result: { valid, errors } };\n }\n\n const {\n object: { validatedObject: objToValidate }\n } = preValidationTransaction!;\n\n if (\n (typeof objToValidate === 'undefined' && !this.isRequired) ||\n (objToValidate === null && (!this.isRequired || this.isNullable))\n ) {\n return {\n done: true,\n result: { valid: true, object: objToValidate }\n };\n }\n\n const violation = this.#getConstraintViolation(objToValidate);\n\n if (!violation) {\n return {\n done: true,\n result: {\n valid: true,\n object: preValidationTransaction!.commit().validatedObject\n }\n };\n }\n\n if ('message' in violation) {\n return {\n done: true,\n result: {\n valid: false,\n errors: [{ message: violation.message }]\n }\n };\n }\n\n return {\n done: false,\n provider: violation.provider,\n objToValidate\n };\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 number 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 // Fast path: no preprocessors or custom validators\n if (this.canSkipPreValidation) {\n if (typeof object === 'undefined' || object === null) {\n if (typeof object === 'undefined' && this.hasDefault) {\n object = this.resolveDefaultValue();\n } else if (\n !this.isRequired ||\n (object === null && this.isNullable)\n ) {\n return { valid: true, object: object };\n } else {\n return {\n valid: false,\n errors: [\n {\n message: this.getValidationErrorMessageSync(\n this.requiredErrorMessage,\n object\n )\n }\n ]\n };\n }\n }\n\n const violation = this.#getConstraintViolation(object);\n\n if (!violation) {\n return { valid: true, object: object as TResult };\n }\n\n if ('message' in violation) {\n return {\n valid: false,\n errors: [{ message: violation.message }]\n };\n }\n\n return {\n valid: false,\n errors: [\n {\n message: this.getValidationErrorMessageSync(\n violation.provider,\n object as TResult\n )\n }\n ]\n };\n }\n\n const r = this.#buildResult(this.preValidateSync(object, context));\n if (r.done) return r.result;\n return {\n valid: false,\n errors: [\n {\n message: this.getValidationErrorMessageSync(\n r.provider,\n r.objToValidate as TResult\n )\n }\n ]\n };\n }\n\n /**\n * Performs async validation of number 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 const r = this.#buildResult(\n await super.preValidateAsync(object, context)\n );\n if (r.done) return r.result;\n return {\n valid: false,\n errors: [\n {\n message: await this.getValidationErrorMessage(\n r.provider,\n r.objToValidate as TResult\n )\n }\n ]\n };\n }\n\n protected createFromProps<T, TReq extends boolean>(\n props: NumberSchemaBuilderCreateProps<T, TReq>\n ): this {\n return NumberSchemaBuilder.create(props as any) as any;\n }\n\n /**\n * Restricts number to be equal to `value`.\n */\n public equals<T extends number>(\n value: T,\n /**\n * Custom error message provider.\n */\n errorMessage?: ValidationErrorMessageProvider<\n NumberSchemaBuilder<TResult, TRequired>\n >\n ) {\n if (typeof value !== 'number') throw new Error('number expected');\n return this.derive({\n ...this.introspect(),\n equalsTo: value,\n equalsToValidationErrorMessageProvider: errorMessage\n }) as any as NumberSchemaBuilder<\n T,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions;\n }\n\n /**\n * Clear `equals()` call.\n */\n public clearEquals(): NumberSchemaBuilder<\n number,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.derive({\n ...this.introspect(),\n equalsTo: undefined\n }) as any;\n }\n\n /**\n * @deprecated Use {@link clearIsInteger} instead.\n * Float values will be considered as valid after this call.\n */\n public isFloat(): NumberSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.derive({\n ...this.introspect(),\n isInteger: false,\n ensureIsIntegerErrorMessageProvider:\n this.#defaultEnsureIsIntegerErrorMessageProvider\n }) as any;\n }\n\n /**\n * Clear `isInteger()` call.\n */\n public clearIsInteger(): NumberSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.derive({\n ...this.introspect(),\n isInteger: false,\n ensureIsIntegerErrorMessageProvider:\n this.#defaultEnsureIsIntegerErrorMessageProvider\n }) as any;\n }\n\n /**\n * Only integer values will be considered as valid after this call.\n */\n public isInteger(\n /**\n * Custom error message provider.\n */\n errorMessage?: ValidationErrorMessageProvider<\n NumberSchemaBuilder<TResult, TRequired>\n >\n ): NumberSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.derive({\n ...this.introspect(),\n isInteger: true,\n ensureIsIntegerErrorMessageProvider: errorMessage\n }) as any;\n }\n\n /**\n * @hidden\n */\n public required(\n errorMessage?: ValidationErrorMessageProvider\n ): NumberSchemaBuilder<TResult, true, TNullable, THasDefault, TExtensions> &\n TExtensions {\n return super.required(errorMessage);\n }\n\n /**\n * @hidden\n */\n public optional(): NumberSchemaBuilder<\n TResult,\n false,\n TNullable,\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 ): NumberSchemaBuilder<TResult, true, TNullable, true, TExtensions> &\n TExtensions {\n return super.default(value) as any;\n }\n\n /**\n * @hidden\n */\n public clearDefault(): NumberSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\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 ): NumberSchemaBuilder<\n TResult & { readonly [K in BRAND]: TBrand },\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.brand(_name);\n }\n\n /**\n * Marks the inferred type as `Readonly<number>`. Since numbers are\n * already immutable this is an identity operation, but it sets the\n * `isReadonly` introspection flag for tooling consistency.\n *\n * @see {@link SchemaBuilder.readonly}\n */\n public readonly(): NumberSchemaBuilder<\n Readonly<TResult>,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.readonly();\n }\n\n /**\n * Do not accept NaN value\n */\n public notNaN(\n /**\n * Custom error message provider.\n */\n errorMessage?: ValidationErrorMessageProvider<\n NumberSchemaBuilder<TResult, TRequired>\n >\n ): NumberSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.derive({\n ...this.introspect(),\n ensureNotNaN: true,\n ensureNotNaNErrorMessageProvider: errorMessage\n }) as any;\n }\n\n /**\n * Consider NaN value as valid\n */\n public canBeNaN(): NumberSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.derive({\n ...this.introspect(),\n ensureNotNaN: false,\n ensureNotNaNErrorMessageProvider:\n this.#defaultEnsureNotNaNErrorMessageProvider\n }) as any;\n }\n\n /**\n * Do not accept `Infinity`.\n */\n public isFinite(\n /**\n * Custom error message provider.\n */\n errorMessage?: ValidationErrorMessageProvider<\n NumberSchemaBuilder<TResult, TRequired>\n >\n ): NumberSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.derive({\n ...this.introspect(),\n ensureIsFinite: true,\n ensureIsFiniteErrorMessageProvider: errorMessage\n }) as any;\n }\n\n /**\n * Consider `Infinity` as valid.\n */\n public canBeInfinite(): NumberSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.derive({\n ...this.introspect(),\n ensureIsFinite: false,\n ensureIsFiniteErrorMessageProvider:\n this.#defaultEnsureIsFiniteErrorMessageProvider\n }) as any;\n }\n\n /**\n * Adds a preprocessor that coerces a string value to a number\n * using `Number(value)`. Useful when the input is captured from\n * a string source (e.g. a parse-string schema, URL parameter,\n * or form input).\n *\n * @example\n * ```ts\n * const schema = number().coerce();\n * const result = schema.validate('42');\n * // result.valid === true\n * // result.object === 42\n * ```\n */\n public coerce(): NumberSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.addPreprocessor(\n ((v: any) => (typeof v === 'string' ? Number(v) : v)) as any,\n { mutates: true }\n ) as any;\n }\n\n /**\n * Restrict number to be at least `minValue`.\n */\n public min(\n minValue: number,\n /**\n * Custom error message provider.\n */\n errorMessage?: ValidationErrorMessageProvider<\n NumberSchemaBuilder<TResult, TRequired>\n >\n ): NumberSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n if (typeof minValue !== 'number')\n throw new Error('minValue must be a number');\n return this.derive({\n ...this.introspect(),\n min: minValue,\n minValidationErrorMessageProvider: errorMessage\n }) as any;\n }\n\n /**\n * Clear `min()` call.\n */\n public clearMin(): NumberSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n const schema = this.introspect();\n delete schema.min;\n return this.derive({\n ...schema\n }) as any;\n }\n\n /**\n * Restrict number to be no more than `maxValue`.\n */\n public max(\n maxValue: number,\n /**\n * Custom error message provider.\n */\n errorMessage?: ValidationErrorMessageProvider<\n NumberSchemaBuilder<TResult, TRequired>\n >\n ): NumberSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n if (typeof maxValue !== 'number')\n throw new Error('maxValue must be a number');\n return this.derive({\n ...this.introspect(),\n max: maxValue,\n maxValidationErrorMessageProvider: errorMessage\n }) as any;\n }\n\n /**\n * Clear `max()` call.\n */\n public clearMax(): NumberSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n const schema = this.introspect();\n delete schema.max;\n return this.derive({\n ...schema\n }) as any;\n }\n\n /**\n * @hidden\n */\n public nullable(): NumberSchemaBuilder<\n TResult,\n TRequired,\n true,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.nullable() as any;\n }\n\n /**\n * @hidden\n */\n public notNullable(): NumberSchemaBuilder<\n TResult,\n TRequired,\n false,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.notNullable() as any;\n }\n}\n\n/**\n * Creates a number schema restricted to `equals` value.\n * @param equals string value\n */\nexport function number<T extends number>(\n equals: T\n): NumberSchemaBuilder<T, true>;\n\n/**\n * Creates a number schema.\n */\nexport function number(): NumberSchemaBuilder<number, true>;\n\n/**\n * Creates a number schema.\n */\nexport function number(equals?: number) {\n if (typeof equals === 'number') {\n return NumberSchemaBuilder.create({\n isRequired: true,\n equalsTo: equals\n });\n }\n return NumberSchemaBuilder.create({\n isRequired: true\n });\n}\n"],"mappings":"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","names":["NumberSchemaBuilder","_NumberSchemaBuilder","SchemaBuilder","#min","#defaultMinErrorMessageProvider","#minErrorMessageProvider","#max","#defaultMaxErrorMessageProvider","#maxErrorMessageProvider","#equalsTo","#defaultEqualsToErrorMessageProvider","#equalsToErrorMessageProvider","#ensureNotNaN","#defaultEnsureNotNaNErrorMessageProvider","#ensureNotNaNErrorMessageProvider","#ensureIsFinite","#defaultEnsureIsFiniteErrorMessageProvider","#ensureIsFiniteErrorMessageProvider","#isInteger","#defaultEnsureIsIntegerErrorMessageProvider","#ensureIsIntegerErrorMessageProvider","props","_notUsed","#getConstraintViolation","objToValidate","#buildResult","superResult","valid","preValidationTransaction","errors","violation","object","context","r","value","errorMessage","_name","v","minValue","schema","maxValue","number","equals"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{f as o}from"./chunk-2BKBVVZ3.js";var i=class n extends o{#e;#t=function(){return`is expected to be equal ${this.#e}`};#a=this.#t;static create(e){return new n({type:"boolean",...e})}constructor(e){super(e),(typeof e.equalsTo=="boolean"||typeof e.equalsTo>"u")&&(this.#e=e.equalsTo),this.#a=this.assureValidationErrorMessageProvider(e.equalsToValidationErrorMessageProvider,this.#t)}introspect(){return{...super.introspect(),equalsTo:this.#e,equalsToValidationErrorMessageProvider:this.#a}}hasType(e){return this.derive({...this.introspect()},!0)}clearHasType(){return this.derive({...this.introspect()},!0)}#s(e){return typeof e!="boolean"?{message:"expected to be boolean"}:typeof this.#e<"u"&&e!==this.#e?{provider:this.#a}:null}#l(e){let{valid:a,transaction:t,errors:s}=e;if(!a)return{done:!0,result:{valid:a,errors:s}};let{object:{validatedObject:l}}=t;if(typeof l>"u"&&!this.isRequired||l===null&&(!this.isRequired||this.isNullable))return{done:!0,result:{valid:!0,object:l}};let r=this.#s(l);return r?"message"in r?{done:!0,result:{valid:!1,errors:[{message:r.message}]}}:{done:!1,provider:r.provider,objToValidate:l}:{done:!0,result:{valid:!0,object:l}}}validate(e,a){return super.validate(e,a)}async validateAsync(e,a){return super.validateAsync(e,a)}_validate(e,a){if(this.canSkipPreValidation){if(typeof e>"u"||e===null)if(typeof e>"u"&&this.hasDefault)e=this.resolveDefaultValue();else return!this.isRequired||e===null&&this.isNullable?{valid:!0,object:e}:{valid:!1,errors:[{message:this.getValidationErrorMessageSync(this.requiredErrorMessage,e)}]};let s=this.#s(e);return s?"message"in s?{valid:!1,errors:[{message:s.message}]}:{valid:!1,errors:[{message:this.getValidationErrorMessageSync(s.provider,e)}]}:{valid:!0,object:e}}let t=this.#l(this.preValidateSync(e,a));return t.done?t.result:{valid:!1,errors:[{message:this.getValidationErrorMessageSync(t.provider,t.objToValidate)}]}}async _validateAsync(e,a){let t=this.#l(await super.preValidateAsync(e,a));return t.done?t.result:{valid:!1,errors:[{message:await this.getValidationErrorMessage(t.provider,t.objToValidate)}]}}createFromProps(e){return n.create(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()}equals(e,a){if(typeof e!="boolean")throw new Error("boolean expected");return this.derive({...this.introspect(),equalsTo:e,equalsToValidationErrorMessageProvider:a})}clearEquals(){return this.derive({...this.introspect(),equalsTo:void 0})}coerce(){return this.addPreprocessor((e=>e==="true"?!0:e==="false"?!1:e),{mutates:!0})}nullable(){return super.nullable()}notNullable(){return super.notNullable()}},d=()=>i.create({isRequired:!0});export{i as a,d as b};
|
|
2
|
+
//# sourceMappingURL=chunk-D7RXO2FA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/builders/BooleanSchemaBuilder.ts"],"sourcesContent":["import {\n type BRAND,\n SchemaBuilder,\n type ValidationContext,\n type ValidationErrorMessageProvider,\n type ValidationResult\n} from './SchemaBuilder.js';\n\ntype BooleanSchemaBuilderCreateProps<R extends boolean = true> = Partial<\n ReturnType<BooleanSchemaBuilder<R>['introspect']>\n>;\n\n/**\n * Similar to `boolean` type in TypeScript.\n * Allows to define a schema for a boolean value. It can be required or optional.\n * It can be restricted to be equal to a certain value.\n *\n * **NOTE** this class is exported for type annotations and advanced use.\n * Customize via extensions rather than subclassing. Avoid instantiating it\n * directly. Use {@link boolean | boolean()} function instead.\n *\n * @example\n * ```ts\n * const schema = boolean().equals(true);\n * const result = schema.validate(true);\n * // result.valid === true\n * // result.object === true\n * ```\n * @example\n * ```ts\n * const schema = boolean().equals(false);\n * const result = schema.validate(true);\n * // result.valid === false\n * // result.errors[0].message === 'is expected to be equal to 'false''\n * ```\n * @example\n * ```ts\n * const schema = boolean().equals(true).optional();\n * const result = schema.validate(undefined);\n * // result.valid === true\n * // result.object === undefined\n * ```\n *\n * @see {@link boolean}\n */\nexport class BooleanSchemaBuilder<\n TResult = boolean,\n TRequired extends boolean = true,\n TNullable extends boolean = false,\n TExplicitType = undefined,\n THasDefault extends boolean = false,\n TExtensions = {},\n TFinalResult = TExplicitType extends undefined ? TResult : TExplicitType\n> extends SchemaBuilder<\n TFinalResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n> {\n /** Native type parameters for extension rebinding; never emitted at runtime. @internal */\n declare readonly __cleverbrush_builder_type__: readonly [\n 'boolean',\n TResult,\n TRequired,\n TNullable,\n TExplicitType,\n THasDefault,\n TFinalResult\n ];\n\n #equalsTo?: boolean;\n #defaultEqualsToErrorMessageProvider: ValidationErrorMessageProvider<\n BooleanSchemaBuilder<TResult, TRequired>\n > = function (this: BooleanSchemaBuilder) {\n return `is expected to be equal ${this.#equalsTo}`;\n };\n #equalsToErrorMessageProvider: ValidationErrorMessageProvider<\n BooleanSchemaBuilder<TResult, TRequired>\n > = this.#defaultEqualsToErrorMessageProvider;\n\n /**\n * @hidden\n */\n public static create(props: BooleanSchemaBuilderCreateProps<any>) {\n return new BooleanSchemaBuilder({\n type: 'boolean',\n ...props\n });\n }\n\n protected constructor(props: BooleanSchemaBuilderCreateProps<TRequired>) {\n super(props as any);\n\n if (\n typeof props.equalsTo === 'boolean' ||\n typeof props.equalsTo === 'undefined'\n ) {\n this.#equalsTo = props.equalsTo;\n }\n\n this.#equalsToErrorMessageProvider =\n this.assureValidationErrorMessageProvider(\n props.equalsToValidationErrorMessageProvider,\n this.#defaultEqualsToErrorMessageProvider\n );\n }\n\n public introspect() {\n return {\n ...super.introspect(),\n /**\n * If set, restrict object to be equal to a certain value.\n */\n equalsTo: this.#equalsTo,\n /**\n * Equals to validation error message provider.\n * If not provided, default error message will be used.\n */\n equalsToValidationErrorMessageProvider:\n this.#equalsToErrorMessageProvider\n };\n }\n\n /**\n * @inheritdoc\n */\n public hasType<T>(\n _notUsed?: T\n ): BooleanSchemaBuilder<\n TResult,\n true,\n TNullable,\n T,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.derive(\n {\n ...this.introspect()\n } as any,\n true\n ) as any;\n }\n\n /**\n * @inheritdoc\n */\n public clearHasType(): BooleanSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n undefined,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.derive(\n {\n ...this.introspect()\n } as any,\n true\n ) as any;\n }\n\n #getConstraintViolation(\n objToValidate: any\n ): { message: string } | { provider: any } | null {\n if (typeof objToValidate !== 'boolean') {\n return { message: 'expected to be boolean' };\n }\n\n if (\n typeof this.#equalsTo !== 'undefined' &&\n objToValidate !== this.#equalsTo\n ) {\n return { provider: this.#equalsToErrorMessageProvider };\n }\n\n return null;\n }\n\n #buildResult(\n superResult: ReturnType<BooleanSchemaBuilder['preValidateSync']>\n ):\n | { done: true; result: ValidationResult<TResult> }\n | {\n done: false;\n provider: any;\n objToValidate: any;\n } {\n const {\n valid,\n transaction: preValidationTransaction,\n errors\n } = superResult;\n\n if (!valid) {\n return { done: true, result: { valid, errors } };\n }\n\n const {\n object: { validatedObject: objToValidate }\n } = preValidationTransaction!;\n\n if (\n (typeof objToValidate === 'undefined' && !this.isRequired) ||\n (objToValidate === null && (!this.isRequired || this.isNullable))\n ) {\n return {\n done: true,\n result: { valid: true, object: objToValidate }\n };\n }\n\n const violation = this.#getConstraintViolation(objToValidate);\n\n if (!violation) {\n return {\n done: true,\n result: { valid: true, object: objToValidate as TResult }\n };\n }\n\n if ('message' in violation) {\n return {\n done: true,\n result: {\n valid: false,\n errors: [{ message: violation.message }]\n }\n };\n }\n\n return {\n done: false,\n provider: violation.provider,\n objToValidate\n };\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 // Fast path: no preprocessors or custom validators\n if (this.canSkipPreValidation) {\n if (typeof object === 'undefined' || object === null) {\n if (typeof object === 'undefined' && this.hasDefault) {\n object = this.resolveDefaultValue() as typeof object;\n } else if (\n !this.isRequired ||\n (object === null && this.isNullable)\n ) {\n return { valid: true, object: object };\n } else {\n return {\n valid: false,\n errors: [\n {\n message: this.getValidationErrorMessageSync(\n this.requiredErrorMessage,\n object as TFinalResult\n )\n }\n ]\n };\n }\n }\n\n const violation = this.#getConstraintViolation(object);\n\n if (!violation) {\n return { valid: true, object: object as TResult };\n }\n\n if ('message' in violation) {\n return {\n valid: false,\n errors: [{ message: violation.message }]\n };\n }\n\n return {\n valid: false,\n errors: [\n {\n message: this.getValidationErrorMessageSync(\n violation.provider,\n object as unknown as TFinalResult\n )\n }\n ]\n };\n }\n\n const r = this.#buildResult(this.preValidateSync(object, context));\n if (r.done) return r.result;\n return {\n valid: false,\n errors: [\n {\n message: this.getValidationErrorMessageSync(\n r.provider,\n r.objToValidate as TFinalResult\n )\n }\n ]\n };\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 const r = this.#buildResult(\n await super.preValidateAsync(object, context)\n );\n if (r.done) return r.result;\n return {\n valid: false,\n errors: [\n {\n message: await this.getValidationErrorMessage(\n r.provider,\n r.objToValidate as TFinalResult\n )\n }\n ]\n };\n }\n\n protected createFromProps<TReq extends boolean>(\n props: BooleanSchemaBuilderCreateProps<TReq>\n ): this {\n return BooleanSchemaBuilder.create(props as any) as any;\n }\n\n /**\n * @hidden\n */\n public required(\n errorMessage?: ValidationErrorMessageProvider\n ): BooleanSchemaBuilder<\n TResult,\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(): BooleanSchemaBuilder<\n TResult,\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: TFinalResult | (() => TFinalResult)\n ): BooleanSchemaBuilder<\n TResult,\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(): BooleanSchemaBuilder<\n TResult,\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 ): BooleanSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n TFinalResult & { 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<boolean>`. Since booleans are\n * already immutable this is an identity operation, but it sets the\n * `isReadonly` introspection flag for tooling consistency.\n *\n * @see {@link SchemaBuilder.readonly}\n */\n public readonly(): BooleanSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n Readonly<TFinalResult>,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.readonly();\n }\n\n /**\n * Restricts object to be equal to `value`.\n */\n public equals<T extends boolean>(\n value: T,\n /**\n * Custom error message provider.\n */\n errorMessage?: ValidationErrorMessageProvider<\n BooleanSchemaBuilder<TResult, TRequired>\n >\n ) {\n if (typeof value !== 'boolean') throw new Error('boolean expected');\n return this.derive({\n ...this.introspect(),\n equalsTo: value,\n equalsToValidationErrorMessageProvider: errorMessage\n } as any) as any as BooleanSchemaBuilder<\n T,\n TRequired,\n TNullable,\n TExplicitType,\n THasDefault,\n TExtensions\n > &\n TExtensions;\n }\n\n /**\n * Removes a `value` defined by `equals()` call.\n */\n public clearEquals(): BooleanSchemaBuilder<\n boolean,\n TRequired,\n TNullable,\n TExplicitType,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.derive({\n ...this.introspect(),\n equalsTo: undefined\n } as any) as any;\n }\n\n /**\n * Adds a preprocessor that coerces a string value to a boolean.\n * Accepts `\"true\"` → `true` and `\"false\"` → `false`; other values are\n * left unchanged so the boolean schema rejects them.\n *\n * @example\n * ```ts\n * const schema = boolean().coerce();\n * const result = schema.validate('true');\n * // result.valid === true\n * // result.object === true\n * ```\n */\n public coerce(): BooleanSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n TExplicitType,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.addPreprocessor(\n ((v: any) => {\n if (v === 'true') return true;\n if (v === 'false') return false;\n return v;\n }) as any,\n { mutates: true }\n ) as any;\n }\n\n /**\n * @hidden\n */\n public nullable(): BooleanSchemaBuilder<\n TResult,\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(): BooleanSchemaBuilder<\n TResult,\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 `boolean` schema.\n */\nexport const boolean = () =>\n BooleanSchemaBuilder.create({\n isRequired: true\n }) as BooleanSchemaBuilder<boolean, true>;\n"],"mappings":"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","names":["BooleanSchemaBuilder","_BooleanSchemaBuilder","SchemaBuilder","#equalsTo","#defaultEqualsToErrorMessageProvider","#equalsToErrorMessageProvider","props","_notUsed","#getConstraintViolation","objToValidate","#buildResult","superResult","valid","preValidationTransaction","errors","violation","object","context","r","errorMessage","value","_name","v","boolean"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{f as u}from"./chunk-2BKBVVZ3.js";var l=class a extends u{#t;#T=function(){return`is expected to have a length of at least ${this.#t} characters`};#n=this.#T;#i;#g=function(){return`is expected to have a length of no more than ${this.#i} characters`};#l=this.#g;#s;#c=function(e){return`is expected to be equal to "${this.#s}" but saw "${e}"`};#u=this.#c;#e;#m=function(){return`is expected to start with "${this.#e}"`};#o=this.#m;#r;#f=function(){return`is expected to end with "${this.#r}"`};#d=this.#f;#a;#E=function(){return`is expected to match the pattern ${this.#a}`};#h=this.#E;static create(e){return new a({type:"string",...e})}constructor(e){super(e),typeof e.minLength=="number"&&(this.#t=e.minLength),this.#n=this.assureValidationErrorMessageProvider(e.minLengthValidationErrorMessageProvider,this.#T),typeof e.maxLength=="number"&&(this.#i=e.maxLength),this.#l=this.assureValidationErrorMessageProvider(e.maxLengthValidationErrorMessageProvider,this.#g),(typeof e.equalsTo=="string"||typeof e.equalsTo>"u")&&(this.#s=e.equalsTo),this.#u=this.assureValidationErrorMessageProvider(e.equalsToValidationErrorMessageProvider,this.#c),typeof e.startsWith=="string"&&e.startsWith.length>0&&(this.#e=e.startsWith),this.#o=this.assureValidationErrorMessageProvider(e.startsWithValidationErrorMessageProvider,this.#m),typeof e.endsWith=="string"&&e.endsWith.length>0&&(this.#r=e.endsWith),this.#d=this.assureValidationErrorMessageProvider(e.endsWithValidationErrorMessageProvider,this.#f),e.matches instanceof RegExp&&(this.#a=e.matches),this.#h=this.assureValidationErrorMessageProvider(e.matchesValidationErrorMessageProvider,this.#E)}introspect(){return{...super.introspect(),minLength:this.#t,minLengthValidationErrorMessageProvider:this.#n,maxLength:this.#i,maxLengthValidationErrorMessageProvider:this.#l,equalsTo:this.#s,equalsToValidationErrorMessageProvider:this.#u,startsWith:this.#e,startsWithValidationErrorMessageProvider:this.#o,endsWith:this.#r,endsWithValidationErrorMessageProvider:this.#d,matches:this.#a,matchesValidationErrorMessageProvider:this.#h,preprocessors:this.preprocessors,validators:this.validators}}hasType(e){return this.derive({...this.introspect()},!0)}clearHasType(){return this.derive({...this.introspect()},!0)}#R(e){return typeof e!="string"?{message:`expected type string, but saw ${typeof e}`}:typeof this.#s<"u"&&e!==this.#s?{provider:this.#u}:typeof this.#e=="string"&&this.#e.length>0&&!e.startsWith(this.#e)?{provider:this.#o}:typeof this.#r=="string"&&this.#r.length>0&&!e.endsWith(this.#r)?{provider:this.#d}:typeof this.#t<"u"&&e.length<this.#t?{provider:this.#n}:typeof this.#i<"u"&&e.length>this.#i?{provider:this.#l}:this.#a instanceof RegExp&&!this.#a.test(e)?{provider:this.#h}:null}#S(e){let{valid:r,transaction:t,errors:i}=e;if(!r)return{done:!0,result:{valid:r,errors:i}};let{object:{validatedObject:s}}=t;if(typeof s>"u"&&!this.isRequired||s===null&&(!this.isRequired||this.isNullable))return{done:!0,result:{valid:!0,object:s}};let n=this.#R(s);return n?"message"in n?{done:!0,result:{valid:!1,errors:[{message:n.message}]}}:{done:!1,provider:n.provider,objToValidate:s}:{done:!0,result:{valid:!0,object:s}}}validate(e,r){return super.validate(e,r)}async validateAsync(e,r){return super.validateAsync(e,r)}_validate(e,r){if(this.canSkipPreValidation){if(typeof e>"u"||e===null)if(typeof e>"u"&&this.hasDefault)e=this.resolveDefaultValue();else return!this.isRequired||e===null&&this.isNullable?{valid:!0,object:e}:{valid:!1,errors:[{message:this.getValidationErrorMessageSync(this.requiredErrorMessage,e)}]};let i=this.#R(e);return i?"message"in i?{valid:!1,errors:[{message:i.message}]}:{valid:!1,errors:[{message:this.getValidationErrorMessageSync(i.provider,e)}]}:{valid:!0,object:e}}let t=this.#S(this.preValidateSync(e,r));return t.done?t.result:{valid:!1,errors:[{message:this.getValidationErrorMessageSync(t.provider,t.objToValidate)}]}}async _validateAsync(e,r){let t=this.#S(await super.preValidateAsync(e,r));return t.done?t.result:{valid:!1,errors:[{message:await this.getValidationErrorMessage(t.provider,t.objToValidate)}]}}createFromProps(e){return a.create(e)}equals(e,r){if(typeof e!="string")throw new Error("string expected");return this.derive({...this.introspect(),equalsTo:e,equalsToValidationErrorMessageProvider:r})}clearEquals(){return this.derive({...this.introspect(),equalsTo:void 0})}nullable(){return super.nullable()}notNullable(){return super.notNullable()}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()}minLength(e,r){if(typeof e!="number")throw new Error("length must be a number");return this.derive({...this.introspect(),minLength:e,minLengthValidationErrorMessageProvider:r})}clearMinLength(){let e=this.introspect();return delete e.minLength,this.derive({...e})}maxLength(e,r){if(typeof e!="number")throw new Error("length must be a number");return this.derive({...this.introspect(),maxLength:e,maxLengthValidationErrorMessageProvider:r})}clearMaxLength(){let e=this.introspect();return delete e.maxLength,this.derive({...e})}startsWith(e,r){if(typeof e!="string"||!e)throw new Error("non empty string expected");return this.derive({...this.introspect(),startsWith:e,startsWithValidationErrorMessageProvider:r})}clearStartsWith(){let e=this.introspect();return delete e.startsWith,this.derive({...e})}endsWith(e,r){if(typeof e!="string"||!e)throw new Error("non empty string expected");return this.derive({...this.introspect(),endsWith:e,endsWithValidationErrorMessageProvider:r})}clearEndsWith(){let e=this.introspect();return delete e.endsWith,this.derive({...e})}matches(e,r){if(!(e instanceof RegExp))throw new Error("regexp expected");return this.derive({...this.introspect(),matches:e,matchesValidationErrorMessageProvider:r})}clearMatches(){let e=this.introspect();return delete e.matches,this.derive({...e})}};function d(a,e){return typeof a=="string"?l.create({isRequired:!0,equalsTo:a,equalsToValidationErrorMessageProvider:e}):l.create({isRequired:!0})}export{l as a,d as b};
|
|
2
|
+
//# sourceMappingURL=chunk-JH7VLA6C.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/builders/StringSchemaBuilder.ts"],"sourcesContent":["import {\n type BRAND,\n type PreprocessorEntry,\n SchemaBuilder,\n type ValidationContext,\n type ValidationErrorMessageProvider,\n type ValidationResult,\n type ValidatorEntry\n} from './SchemaBuilder.js';\n\ntype StringSchemaBuilderCreateProps<\n T = string,\n R extends boolean = true\n> = Partial<ReturnType<StringSchemaBuilder<T, R>['introspect']>>;\n\n/**\n * Allows to define a schema for a string. It can be: required or optional,\n * restricted to be equal to a certain value, restricted to have a certain\n * length, restricted to start with a certain value, restricted to end with\n * a certain value, restricted to match a certain regular expression.\n *\n * **NOTE** this class is exported for type annotations and advanced use.\n * Customize via extensions rather than subclassing. Avoid instantiating it\n * directly. Use {@link string | string()} function instead.\n *\n * @example\n * ```ts\n * const schema = string().equals('hello');\n * const result = schema.validate('hello');\n * // result.valid === true\n * // result.object === 'hello'\n * ```\n *\n * @example\n * ```ts\n * const schema = string().equals('hello');\n * const result = schema.validate('world');\n * // result.valid === false\n * // result.errors[0].message === \"is expected to be equal to 'hello'\"\n * ```\n *\n * @example\n * ```ts\n * const schema = string().minLength(5);\n * const result = schema.validate('hello');\n * // result.valid === true\n * // result.object === 'hello'\n * ```\n *\n * @example\n * ```ts\n * const schema = string().minLength(5);\n * const result = schema.validate('hi');\n * // result.valid === false\n * // result.errors[0].message === 'is expected to have a length of at least 5'\n * ```\n *\n * @example\n * ```ts\n * const schema = string().minLength(2).maxLength(5);\n * const result = schema.validate('yes');\n * // result.valid === true\n * // result.object === 'yes'\n * ```\n *\n * @example\n * ```ts\n * const schema = string('no');\n * const result = schema.validate('yes');\n * // result.valid === false\n * // result.errors[0].message === \"is expected to be equal to 'no'\"\n * ```\n *\n * @see {@link string}\n */\nexport class StringSchemaBuilder<\n TResult = string,\n TRequired extends boolean = true,\n TNullable extends boolean = false,\n THasDefault extends boolean = false,\n TExtensions = {}\n> extends SchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n> {\n /** Native type parameters for extension rebinding; never emitted at runtime. @internal */\n declare readonly __cleverbrush_builder_type__: readonly [\n 'string',\n TResult,\n TRequired,\n TNullable,\n THasDefault\n ];\n\n #minLength?: number;\n #defaultMinLengthErrorMessageProvider: ValidationErrorMessageProvider<\n StringSchemaBuilder<TResult, TRequired>\n > = function (this: StringSchemaBuilder) {\n return `is expected to have a length of at least ${this.#minLength} characters`;\n };\n #minLengthErrorMessageProvider: ValidationErrorMessageProvider<\n StringSchemaBuilder<TResult, TRequired>\n > = this.#defaultMinLengthErrorMessageProvider;\n\n #maxLength?: number;\n #defaultMaxLengthErrorMessageProvider: ValidationErrorMessageProvider<\n StringSchemaBuilder<TResult, TRequired>\n > = function (this: StringSchemaBuilder) {\n return `is expected to have a length of no more than ${this.#maxLength} characters`;\n };\n #maxLengthErrorMessageProvider: ValidationErrorMessageProvider<\n StringSchemaBuilder<TResult, TRequired>\n > = this.#defaultMaxLengthErrorMessageProvider;\n\n #equalsTo?: string;\n #defaultEqualsToErrorMessageProvider: ValidationErrorMessageProvider<\n StringSchemaBuilder<TResult, TRequired>\n > = function (this: StringSchemaBuilder, seenValue?: TResult) {\n return `is expected to be equal to \"${this.#equalsTo}\" but saw \"${seenValue}\"`;\n };\n #equalsToErrorMessageProvider: ValidationErrorMessageProvider<\n StringSchemaBuilder<TResult, TRequired>\n > = this.#defaultEqualsToErrorMessageProvider;\n\n #startsWith?: string;\n #defaultStartsWithErrorMessageProvider: ValidationErrorMessageProvider<\n StringSchemaBuilder<TResult, TRequired>\n > = function (this: StringSchemaBuilder) {\n return `is expected to start with \"${this.#startsWith}\"`;\n };\n #startsWithErrorMessageProvider: ValidationErrorMessageProvider<\n StringSchemaBuilder<TResult, TRequired>\n > = this.#defaultStartsWithErrorMessageProvider;\n\n #endsWith?: string;\n #defaultEndsWithErrorMessageProvider: ValidationErrorMessageProvider<\n StringSchemaBuilder<TResult, TRequired>\n > = function (this: StringSchemaBuilder) {\n return `is expected to end with \"${this.#endsWith}\"`;\n };\n #endsWithErrorMessageProvider: ValidationErrorMessageProvider<\n StringSchemaBuilder<TResult, TRequired>\n > = this.#defaultEndsWithErrorMessageProvider;\n\n #matches?: RegExp;\n #defaultMatchesErrorMessageProvider: ValidationErrorMessageProvider<\n StringSchemaBuilder<TResult, TRequired>\n > = function (this: StringSchemaBuilder) {\n return `is expected to match the pattern ${this.#matches}`;\n };\n #matchesErrorMessageProvider: ValidationErrorMessageProvider<\n StringSchemaBuilder<TResult, TRequired>\n > = this.#defaultMatchesErrorMessageProvider;\n\n /**\n * @hidden\n */\n public static create(props: StringSchemaBuilderCreateProps) {\n return new StringSchemaBuilder({\n type: 'string',\n ...props\n });\n }\n\n protected constructor(props: StringSchemaBuilderCreateProps) {\n super(props as any);\n\n if (typeof props.minLength === 'number') {\n this.#minLength = props.minLength;\n }\n\n this.#minLengthErrorMessageProvider =\n this.assureValidationErrorMessageProvider(\n props.minLengthValidationErrorMessageProvider,\n this.#defaultMinLengthErrorMessageProvider\n );\n\n if (typeof props.maxLength === 'number') {\n this.#maxLength = props.maxLength;\n }\n\n this.#maxLengthErrorMessageProvider =\n this.assureValidationErrorMessageProvider(\n props.maxLengthValidationErrorMessageProvider,\n this.#defaultMaxLengthErrorMessageProvider\n );\n\n if (\n typeof props.equalsTo === 'string' ||\n typeof props.equalsTo === 'undefined'\n ) {\n this.#equalsTo = props.equalsTo;\n }\n\n this.#equalsToErrorMessageProvider =\n this.assureValidationErrorMessageProvider(\n props.equalsToValidationErrorMessageProvider,\n this.#defaultEqualsToErrorMessageProvider\n );\n\n if (\n typeof props.startsWith === 'string' &&\n props.startsWith.length > 0\n ) {\n this.#startsWith = props.startsWith;\n }\n\n this.#startsWithErrorMessageProvider =\n this.assureValidationErrorMessageProvider(\n props.startsWithValidationErrorMessageProvider,\n this.#defaultStartsWithErrorMessageProvider\n );\n\n if (typeof props.endsWith === 'string' && props.endsWith.length > 0) {\n this.#endsWith = props.endsWith;\n }\n\n this.#endsWithErrorMessageProvider =\n this.assureValidationErrorMessageProvider(\n props.endsWithValidationErrorMessageProvider,\n this.#defaultEndsWithErrorMessageProvider\n );\n\n if (props.matches instanceof RegExp) {\n this.#matches = props.matches;\n }\n\n this.#matchesErrorMessageProvider =\n this.assureValidationErrorMessageProvider(\n props.matchesValidationErrorMessageProvider,\n this.#defaultMatchesErrorMessageProvider\n );\n }\n\n public introspect() {\n return {\n ...super.introspect(),\n /**\n * Min length of the string (if defined).\n */\n minLength: this.#minLength,\n\n /**\n * Min length validation error message provider.\n * If not provided, default error message will be used.\n */\n minLengthValidationErrorMessageProvider:\n this.#minLengthErrorMessageProvider,\n\n /**\n * Max length of the string (if defined).\n */\n maxLength: this.#maxLength,\n\n /**\n * Max length validation error message provider.\n * If not provided, default error message will be used.\n */\n maxLengthValidationErrorMessageProvider:\n this.#maxLengthErrorMessageProvider,\n\n /**\n * If set, restrict object to be equal to a certain value.\n */\n equalsTo: this.#equalsTo,\n\n /**\n * Equals validation error message provider.\n * If not provided, default error message will be used.\n */\n equalsToValidationErrorMessageProvider:\n this.#equalsToErrorMessageProvider,\n\n /**\n * If set, restrict string to start with a certain value.\n */\n startsWith: this.#startsWith,\n\n /**\n * Starts with validation error message provider.\n * If not provided, default error message will be used.\n */\n startsWithValidationErrorMessageProvider:\n this.#startsWithErrorMessageProvider,\n\n /**\n * If set, restrict string to end with a certain value.\n */\n endsWith: this.#endsWith,\n\n /**\n * Ends with validation error message provider.\n * If not provided, default error message will be used.\n */\n endsWithValidationErrorMessageProvider:\n this.#endsWithErrorMessageProvider,\n\n /**\n * If set, restrict string to match a certain regular expression.\n */\n matches: this.#matches,\n\n /**\n * Matches validation error message provider.\n * If not provided, default error message will be used.\n */\n matchesValidationErrorMessageProvider:\n this.#matchesErrorMessageProvider,\n\n /**\n * Array of preprocessor functions\n */\n preprocessors: this.preprocessors as PreprocessorEntry<TResult>[],\n\n /**\n * Array of validator functions\n */\n validators: this.validators as ValidatorEntry<TResult>[]\n };\n }\n\n /**\n * @inheritdoc\n */\n public hasType<T>(\n _notUsed?: T\n ): StringSchemaBuilder<T, true, TNullable, THasDefault, TExtensions> &\n TExtensions {\n return this.derive(\n {\n ...this.introspect()\n } as any,\n true\n ) as any;\n }\n\n /**\n * @inheritdoc\n */\n public clearHasType(): StringSchemaBuilder<\n string,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.derive(\n {\n ...this.introspect()\n } as any,\n true\n ) as any;\n }\n\n #getConstraintViolation(\n objToValidate: any\n ): { message: string } | { provider: any } | null {\n if (typeof objToValidate !== 'string') {\n return {\n message: `expected type string, but saw ${typeof objToValidate}`\n };\n }\n\n if (\n typeof this.#equalsTo !== 'undefined' &&\n objToValidate !== this.#equalsTo\n ) {\n return { provider: this.#equalsToErrorMessageProvider };\n }\n\n if (\n typeof this.#startsWith === 'string' &&\n this.#startsWith.length > 0 &&\n !objToValidate.startsWith(this.#startsWith)\n ) {\n return { provider: this.#startsWithErrorMessageProvider };\n }\n\n if (\n typeof this.#endsWith === 'string' &&\n this.#endsWith.length > 0 &&\n !objToValidate.endsWith(this.#endsWith)\n ) {\n return { provider: this.#endsWithErrorMessageProvider };\n }\n\n if (typeof this.#minLength !== 'undefined') {\n if (objToValidate.length < this.#minLength)\n return { provider: this.#minLengthErrorMessageProvider };\n }\n\n if (typeof this.#maxLength !== 'undefined') {\n if (objToValidate.length > this.#maxLength)\n return { provider: this.#maxLengthErrorMessageProvider };\n }\n\n if (this.#matches instanceof RegExp) {\n if (!this.#matches.test(objToValidate)) {\n return { provider: this.#matchesErrorMessageProvider };\n }\n }\n\n return null;\n }\n\n #buildResult(\n superResult: ReturnType<StringSchemaBuilder['preValidateSync']>\n ):\n | { done: true; result: ValidationResult<TResult> }\n | {\n done: false;\n provider: any;\n objToValidate: any;\n } {\n const {\n valid,\n transaction: preValidationTransaction,\n errors\n } = superResult;\n\n if (!valid) {\n return { done: true, result: { valid, errors } };\n }\n\n const {\n object: { validatedObject: objToValidate }\n } = preValidationTransaction!;\n\n if (\n (typeof objToValidate === 'undefined' && !this.isRequired) ||\n (objToValidate === null && (!this.isRequired || this.isNullable))\n ) {\n return {\n done: true,\n result: { valid: true, object: objToValidate }\n };\n }\n\n const violation = this.#getConstraintViolation(objToValidate);\n\n if (!violation) {\n return {\n done: true,\n result: { valid: true, object: objToValidate as TResult }\n };\n }\n\n if ('message' in violation) {\n return {\n done: true,\n result: {\n valid: false,\n errors: [{ message: violation.message }]\n }\n };\n }\n\n return {\n done: false,\n provider: violation.provider,\n objToValidate\n };\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 string 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 // Fast path: no preprocessors or custom validators — skip preValidateSync entirely\n if (this.canSkipPreValidation) {\n // Required / optional check\n if (typeof object === 'undefined' || object === null) {\n if (typeof object === 'undefined' && this.hasDefault) {\n object = this.resolveDefaultValue();\n } else if (\n !this.isRequired ||\n (object === null && this.isNullable)\n ) {\n return { valid: true, object: object };\n } else {\n return {\n valid: false,\n errors: [\n {\n message: this.getValidationErrorMessageSync(\n this.requiredErrorMessage,\n object\n )\n }\n ]\n };\n }\n }\n\n const violation = this.#getConstraintViolation(object);\n\n if (!violation) {\n return { valid: true, object: object as TResult };\n }\n\n if ('message' in violation) {\n return {\n valid: false,\n errors: [{ message: violation.message }]\n };\n }\n\n return {\n valid: false,\n errors: [\n {\n message: this.getValidationErrorMessageSync(\n violation.provider,\n object as TResult\n )\n }\n ]\n };\n }\n\n const r = this.#buildResult(this.preValidateSync(object, context));\n if (r.done) return r.result;\n return {\n valid: false,\n errors: [\n {\n message: this.getValidationErrorMessageSync(\n r.provider,\n r.objToValidate as TResult\n )\n }\n ]\n };\n }\n\n /**\n * Performs async validation of string 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 const r = this.#buildResult(\n await super.preValidateAsync(object, context)\n );\n if (r.done) return r.result;\n return {\n valid: false,\n errors: [\n {\n message: await this.getValidationErrorMessage(\n r.provider,\n r.objToValidate as TResult\n )\n }\n ]\n };\n }\n\n protected createFromProps<T, TReq extends boolean>(\n props: StringSchemaBuilderCreateProps<T, TReq>\n ): this {\n return StringSchemaBuilder.create(props as any) as any;\n }\n\n /**\n * Restricts string to be equal to `value`.\n */\n public equals<T extends string>(\n value: T,\n /**\n * Custom error message provider.\n */\n errorMessage?: ValidationErrorMessageProvider<\n StringSchemaBuilder<TResult, TRequired>\n >\n ) {\n if (typeof value !== 'string') throw new Error('string expected');\n return this.derive({\n ...this.introspect(),\n equalsTo: value,\n equalsToValidationErrorMessageProvider: errorMessage\n }) as any as StringSchemaBuilder<\n T,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions;\n }\n\n /**\n * Cancels `equals()` call.\n */\n public clearEquals(): StringSchemaBuilder<\n string,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.derive({\n ...this.introspect(),\n equalsTo: undefined\n }) as any;\n }\n\n /**\n * @hidden\n */\n public nullable(): StringSchemaBuilder<\n TResult,\n TRequired,\n true,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.nullable() as any;\n }\n\n /**\n * @hidden\n */\n public notNullable(): StringSchemaBuilder<\n TResult,\n TRequired,\n false,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.notNullable() as any;\n }\n\n /**\n * @hidden\n */\n public required(\n errorMessage?: ValidationErrorMessageProvider\n ): StringSchemaBuilder<TResult, true, TNullable, THasDefault, TExtensions> &\n TExtensions {\n return super.required(errorMessage);\n }\n\n /**\n * @hidden\n */\n public optional(): StringSchemaBuilder<\n TResult,\n false,\n TNullable,\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 ): StringSchemaBuilder<TResult, true, TNullable, true, TExtensions> &\n TExtensions {\n return super.default(value) as any;\n }\n\n /**\n * @hidden\n */\n public clearDefault(): StringSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\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 ): StringSchemaBuilder<\n TResult & { readonly [K in BRAND]: TBrand },\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.brand(_name);\n }\n\n /**\n * Marks the inferred type as `Readonly<string>`. Since strings are\n * already immutable this is an identity operation, but it sets the\n * `isReadonly` introspection flag for tooling consistency.\n *\n * @see {@link SchemaBuilder.readonly}\n */\n public readonly(): StringSchemaBuilder<\n Readonly<TResult>,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.readonly();\n }\n\n /**\n * Set minimal length of the valid value for schema.\n * @param length minimum string length\n */\n public minLength(\n length: number,\n /**\n * Custom error message provider.\n */\n errorMessage?: ValidationErrorMessageProvider<\n StringSchemaBuilder<TResult, TRequired>\n >\n ): StringSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n if (typeof length !== 'number')\n throw new Error('length must be a number');\n return this.derive({\n ...this.introspect(),\n minLength: length,\n minLengthValidationErrorMessageProvider: errorMessage\n }) as any;\n }\n\n /**\n * Cancel `minLength()` call.\n */\n public clearMinLength(): StringSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n const schema = this.introspect();\n delete schema.minLength;\n return this.derive({\n ...schema\n }) as any;\n }\n\n /**\n * Set maximal length of the valid value for schema.\n * @param length maximum string length\n */\n public maxLength(\n length: number,\n /**\n * Custom error message provider.\n */\n errorMessage?: ValidationErrorMessageProvider<\n StringSchemaBuilder<TResult, TRequired>\n >\n ): StringSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n if (typeof length !== 'number')\n throw new Error('length must be a number');\n return this.derive({\n ...this.introspect(),\n maxLength: length,\n maxLengthValidationErrorMessageProvider: errorMessage\n }) as any;\n }\n\n /**\n * Cancel `maxLength()` call.\n */\n public clearMaxLength(): StringSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n const schema = this.introspect();\n delete schema.maxLength;\n return this.derive({\n ...schema\n }) as any;\n }\n\n /**\n * Restricts string to start with `val`.\n */\n public startsWith<T extends string>(\n val: T,\n /**\n * Custom error message provider.\n */\n errorMessage?: ValidationErrorMessageProvider<\n StringSchemaBuilder<TResult, TRequired>\n >\n ): StringSchemaBuilder<\n TResult extends string ? `${T}${TResult}` : TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n if (typeof val !== 'string' || !val)\n throw new Error('non empty string expected');\n return this.derive({\n ...this.introspect(),\n startsWith: val,\n startsWithValidationErrorMessageProvider: errorMessage\n }) as any;\n }\n\n /**\n * Cancels `startsWith()` call.\n */\n public clearStartsWith(): StringSchemaBuilder<\n string,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n const schema = this.introspect();\n delete schema.startsWith;\n return this.derive({\n ...schema\n }) as any;\n }\n\n /**\n * Restricts string to end with `val`.\n */\n public endsWith<T extends string>(\n val: T,\n /**\n * Custom error message provider.\n */\n errorMessage?: ValidationErrorMessageProvider<\n StringSchemaBuilder<TResult, TRequired>\n >\n ): StringSchemaBuilder<\n TResult extends string ? `${TResult}${T}` : TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n if (typeof val !== 'string' || !val)\n throw new Error('non empty string expected');\n return this.derive({\n ...this.introspect(),\n endsWith: val,\n endsWithValidationErrorMessageProvider: errorMessage\n }) as any;\n }\n\n /**\n * Cancels `endsWith()` call.\n */\n public clearEndsWith(): StringSchemaBuilder<\n string,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n const schema = this.introspect();\n delete schema.endsWith;\n return this.derive({\n ...schema\n }) as any;\n }\n\n /**\n * Restricts string to match `regexp`.\n * @param regexp regular expression pattern to match against\n */\n public matches(\n regexp: RegExp,\n /**\n * Custom error message provider.\n */\n errorMessage?: ValidationErrorMessageProvider<\n StringSchemaBuilder<TResult, TRequired>\n >\n ): StringSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n if (!(regexp instanceof RegExp)) throw new Error('regexp expected');\n return this.derive({\n ...this.introspect(),\n matches: regexp,\n matchesValidationErrorMessageProvider: errorMessage\n }) as any;\n }\n\n /**\n * Cancels `matches()` call.\n */\n public clearMatches(): StringSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n const schema = this.introspect();\n delete schema.matches;\n return this.derive({\n ...schema\n }) as any;\n }\n}\n\n/**\n * Creates a string schema restricted to be equal to `equals`.\n * @param equals string value the schema is restricted to\n */\nexport function string<T extends string>(\n equals: T\n): StringSchemaBuilder<T, true>;\n\n/**\n * Creates a string schema restricted to be equal to `equals` with a custom error message.\n * @param equals string value the schema is restricted to\n */\nexport function string<T extends string>(\n equals: T,\n errorMessage: ValidationErrorMessageProvider<StringSchemaBuilder<T, true>>\n): StringSchemaBuilder<T, true>;\n\nexport function string(): StringSchemaBuilder<string, true>;\n\n/**\n * Creates a string schema.\n */\nexport function string(\n equals?: string,\n errorMessage?: ValidationErrorMessageProvider<\n StringSchemaBuilder<string, true>\n >\n) {\n if (typeof equals === 'string') {\n return StringSchemaBuilder.create({\n isRequired: true,\n equalsTo: equals,\n equalsToValidationErrorMessageProvider: errorMessage\n });\n }\n return StringSchemaBuilder.create({\n isRequired: true\n });\n}\n"],"mappings":"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","names":["StringSchemaBuilder","_StringSchemaBuilder","SchemaBuilder","#minLength","#defaultMinLengthErrorMessageProvider","#minLengthErrorMessageProvider","#maxLength","#defaultMaxLengthErrorMessageProvider","#maxLengthErrorMessageProvider","#equalsTo","#defaultEqualsToErrorMessageProvider","seenValue","#equalsToErrorMessageProvider","#startsWith","#defaultStartsWithErrorMessageProvider","#startsWithErrorMessageProvider","#endsWith","#defaultEndsWithErrorMessageProvider","#endsWithErrorMessageProvider","#matches","#defaultMatchesErrorMessageProvider","#matchesErrorMessageProvider","props","_notUsed","#getConstraintViolation","objToValidate","#buildResult","superResult","valid","preValidationTransaction","errors","violation","object","context","r","value","errorMessage","_name","length","schema","val","regexp","string","equals"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{d as p,f as h}from"./chunk-2BKBVVZ3.js";function m(s){return typeof s=="object"&&s!==null&&"key"in s?String(s.key):String(s)}function S(s){return s.map(m).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.derive({...this.introspect()},!0)}clearHasType(){return this.derive({...this.introspect()},!0)}#a(e){return e.map(t=>({message:t.path&&t.path.length>0?`${S(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=m(r.path[0]),d=r.path.slice(1),c=d.length>0?`${S(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-K7TDPKGQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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 for type annotations and advanced use.\n * Customize via extensions rather than subclassing. Avoid instantiating it\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.derive(\n {\n ...this.introspect()\n } as any,\n true\n ) 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.derive(\n {\n ...this.introspect()\n } as any,\n true\n ) 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"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{f as n}from"./chunk-2BKBVVZ3.js";var a=class l extends n{static create(e){return new l({type:"any",...e})}constructor(e){super(e)}hasType(e){return this.derive({...this.introspect()},!0)}clearHasType(){return this.derive({...this.introspect()},!0)}#e(e){let{valid:t,transaction:s,errors:i}=e;if(!t)return{valid:t,errors:i};let{object:{validatedObject:r}}=s;return{valid:!0,object:r}}validate(e,t){return super.validate(e,t)}async validateAsync(e,t){return super.validateAsync(e,t)}_validate(e,t){return this.#e(this.preValidateSync(e,t))}async _validateAsync(e,t){return this.#e(await super.preValidateAsync(e,t))}createFromProps(e){return l.create(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()}},T=()=>a.create({isRequired:!0});export{a,T as b};
|
|
2
|
+
//# sourceMappingURL=chunk-NDESVCWI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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 for type annotations and advanced use.\n * Customize via extensions rather than subclassing. Avoid instantiating it\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 /** Native type parameters for extension rebinding; never emitted at runtime. @internal */\n declare readonly __cleverbrush_builder_type__: readonly [\n 'any',\n TRequired,\n TNullable,\n TExplicitType,\n THasDefault,\n TResult\n ];\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.derive(\n {\n ...this.introspect()\n } as any,\n true\n ) 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.derive(\n {\n ...this.introspect()\n } as any,\n true\n ) 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,CAcE,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,OACR,CACI,GAAG,KAAK,WAAW,CACvB,EACA,EACJ,CACJ,CAKO,cAOS,CACZ,OAAO,KAAK,OACR,CACI,GAAG,KAAK,WAAW,CACvB,EACA,EACJ,CACJ,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"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{c as p,e as f,f as T}from"./chunk-2BKBVVZ3.js";var m=class c extends T{#e;#t;static create(e){return new c({type:"tuple",...e})}constructor(e){super(e),Array.isArray(e.elements)?this.#e=e.elements:this.#e=[],e.restSchema instanceof T&&(this.#t=e.restSchema)}hasType(e){return this.derive({...this.introspect()},!0)}clearHasType(){return this.derive({...this.introspect()},!0)}#a(e){if(e.length<this.#e.length){let l=this.#e.length;return`expected a tuple with at least ${l} element${l===1?"":"s"}, got ${e.length}`}if(!(this.#t instanceof T)&&e.length!==this.#e.length){let l=this.#e.length;return`expected a tuple of exactly ${l} element${l===1?"":"s"}, got ${e.length}`}return null}#n(e,l){let{valid:o,context:r,errors:a,transaction:n}=l,i={[p]:{setValue:()=>!1,getValue:t=>({success:!0,value:t}),getSchema:()=>this,parent:void 0,propertyName:void 0,toJsonPointer:()=>""}},d=[],y=f([],()=>e,()=>d,()=>i[p]),h=(()=>y);if(!o)return d.push(...(a||[]).map(t=>t.message||String(t))),{needsElementValidation:!1,result:{valid:o,errors:a,getNestedErrors:h}};let{object:{validatedObject:u}}=n;return typeof u>"u"&&!this.isRequired||u===null&&(!this.isRequired||this.isNullable)?{needsElementValidation:!1,result:{valid:!0,object:u,getNestedErrors:h}}:Array.isArray(u)?{needsElementValidation:!0,objToValidate:u,prevalidationContext:r,getNestedErrors:h,elementResults:y,rootErrors:d}:(d.push("array expected"),{needsElementValidation:!1,result:{valid:!1,errors:[{message:"array expected"}],getNestedErrors:h}})}#r(e,l,o){let r=!0;for(let a=0;a<e.length;a++)e[a]?.valid||(r=!1),l[a]=e[a];return Object.assign({valid:r,getNestedErrors:o},r?{}:{errors:e.map(a=>a?.errors).filter(a=>a).flatMap(a=>a?.map(n=>({...n})))},r?{object:e.map(a=>a?.object)}:{})}validate(e,l){return super.validate(e,l)}async validateAsync(e,l){return super.validateAsync(e,l)}_validate(e,l){if(this.canSkipPreValidation&&!l?.doNotStopOnFirstError){if(typeof e>"u"||e===null)if(typeof e>"u"&&this.hasDefault)e=this.resolveDefaultValue();else if(!this.isRequired||e===null&&this.isNullable){let n=this;return{valid:!0,object:e,getNestedErrors(){return n.#s(e,l).getNestedErrors()}}}else return this.#s(e,l);if(!Array.isArray(e))return this.#s(e,l);let o=this.#a(e);if(o){let n=this;return{valid:!1,errors:[{message:o}],getNestedErrors(){return n.#s(e,l).getNestedErrors()}}}let r=new Array(e.length);for(let n=0;n<this.#e.length;n++){let i=this.#e[n].validate(e[n]);if(!i.valid){let d=this;return{valid:!1,errors:i.errors&&i.errors.length>0?[i.errors[0]]:[],getNestedErrors(){return d.#s(e,l).getNestedErrors()}}}r[n]=i.object}if(this.#t instanceof T)for(let n=this.#e.length;n<e.length;n++){let i=this.#t.validate(e[n]);if(!i.valid){let d=this;return{valid:!1,errors:i.errors&&i.errors.length>0?[i.errors[0]]:[],getNestedErrors(){return d.#s(e,l).getNestedErrors()}}}r[n]=i.object}let a=this;return{valid:!0,object:r,getNestedErrors(){return a.#s(e,l).getNestedErrors()}}}return this.#s(e,l)}#s(e,l){let o=this.#n(e,this.preValidateSync(e,l));if(!o.needsElementValidation)return o.result;let{objToValidate:r,prevalidationContext:a,getNestedErrors:n,elementResults:i,rootErrors:d}=o,y=this.#a(r);if(y)return d.push(y),{valid:!1,errors:[{message:y}],getNestedErrors:n};let h=this.#t instanceof T?r.length:this.#e.length;if(a.doNotStopOnFirstError){let u=new Array(h);for(let t=0;t<this.#e.length;t++)u[t]=this.#e[t].validate(r[t],{...a});if(this.#t instanceof T)for(let t=this.#e.length;t<r.length;t++)u[t]=this.#t.validate(r[t],{...a});return this.#r(u,i,n)}else{let u=new Array(h);for(let t=0;t<this.#e.length;t++){let s=this.#e[t].validate(r[t],{...a});if(i[t]=s,s.valid)u[t]=s.object;else return{valid:!1,errors:Array.isArray(s.errors)&&s.errors.length>0?[s.errors[0]]:[],getNestedErrors:n}}if(this.#t instanceof T)for(let t=this.#e.length;t<r.length;t++){let s=this.#t.validate(r[t],{...a});if(i[t]=s,s.valid)u[t]=s.object;else return{valid:!1,errors:Array.isArray(s.errors)&&s.errors.length>0?[s.errors[0]]:[],getNestedErrors:n}}return{valid:!0,object:u,getNestedErrors:n}}}async _validateAsync(e,l){let o=this.#n(e,await super.preValidateAsync(e,l));if(!o.needsElementValidation)return o.result;let{objToValidate:r,prevalidationContext:a,getNestedErrors:n,elementResults:i,rootErrors:d}=o,y=this.#a(r);if(y)return d.push(y),{valid:!1,errors:[{message:y}],getNestedErrors:n};let h=this.#t instanceof T?r.length:this.#e.length;if(a.doNotStopOnFirstError){let u=new Array(h);for(let s=0;s<this.#e.length;s++)u[s]=this.#e[s].validateAsync(r[s],{...a});if(this.#t instanceof T)for(let s=this.#e.length;s<r.length;s++)u[s]=this.#t.validateAsync(r[s],{...a});let t=await Promise.all(u);return this.#r(t,i,n)}else{let u=new Array(h);for(let t=0;t<this.#e.length;t++){let s=await this.#e[t].validateAsync(r[t],{...a});if(i[t]=s,s.valid)u[t]=s.object;else return{valid:!1,errors:Array.isArray(s.errors)&&s.errors.length>0?[s.errors[0]]:[],getNestedErrors:n}}if(this.#t instanceof T)for(let t=this.#e.length;t<r.length;t++){let s=await this.#t.validateAsync(r[t],{...a});if(i[t]=s,s.valid)u[t]=s.object;else return{valid:!1,errors:Array.isArray(s.errors)&&s.errors.length>0?[s.errors[0]]:[],getNestedErrors:n}}return{valid:!0,object:u,getNestedErrors:n}}}createFromProps(e){return c.create(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)}introspect(){return{...super.introspect(),elements:this.#e,restSchema:this.#t}}rest(e){return this.derive({...this.introspect(),restSchema:e})}clearRest(){return this.derive({...this.introspect(),restSchema:void 0})}nullable(){return super.nullable()}notNullable(){return super.notNullable()}},R=c=>m.create({isRequired:!0,elements:c});export{m as a,R as b};
|
|
2
|
+
//# sourceMappingURL=chunk-VBPZRO7L.js.map
|