@cleverbrush/schema 4.5.0 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +28 -0
- package/README.md +176 -19
- package/dist/builders/AnySchemaBuilder.d.ts +11 -2
- package/dist/builders/AnySchemaBuilder.js +1 -1
- package/dist/builders/ArraySchemaBuilder.d.ts +15 -4
- package/dist/builders/ArraySchemaBuilder.js +1 -1
- package/dist/builders/BooleanSchemaBuilder.d.ts +21 -6
- package/dist/builders/BooleanSchemaBuilder.js +1 -1
- package/dist/builders/DateSchemaBuilder.d.ts +24 -10
- package/dist/builders/DateSchemaBuilder.js +1 -1
- package/dist/builders/ExternSchemaBuilder.d.ts +3 -2
- package/dist/builders/ExternSchemaBuilder.js +1 -1
- package/dist/builders/FunctionSchemaBuilder.d.ts +14 -2
- package/dist/builders/FunctionSchemaBuilder.js +1 -1
- package/dist/builders/GenericSchemaBuilder.d.ts +14 -3
- package/dist/builders/IntersectionSchemaBuilder.d.ts +1 -0
- package/dist/builders/LazySchemaBuilder.d.ts +1 -0
- package/dist/builders/NullSchemaBuilder.d.ts +2 -4
- package/dist/builders/NumberSchemaBuilder.d.ts +21 -7
- package/dist/builders/NumberSchemaBuilder.js +1 -1
- package/dist/builders/ObjectSchemaBuilder.d.ts +15 -4
- package/dist/builders/ObjectSchemaBuilder.js +1 -1
- package/dist/builders/ParseStringSchemaBuilder.d.ts +1 -0
- package/dist/builders/ParseStringSchemaBuilder.js +1 -1
- package/dist/builders/PromiseSchemaBuilder.d.ts +13 -2
- package/dist/builders/PromiseSchemaBuilder.js +1 -1
- package/dist/builders/RecordSchemaBuilder.d.ts +12 -0
- package/dist/builders/RecordSchemaBuilder.js +1 -1
- package/dist/builders/SchemaBuilder.d.ts +59 -10
- package/dist/builders/StringSchemaBuilder.d.ts +23 -8
- package/dist/builders/StringSchemaBuilder.js +1 -1
- package/dist/builders/TupleSchemaBuilder.d.ts +16 -4
- package/dist/builders/TupleSchemaBuilder.js +1 -1
- package/dist/builders/UnionSchemaBuilder.d.ts +12 -2
- package/dist/builders/UnionSchemaBuilder.js +1 -1
- package/dist/chunk-25KL2NBJ.js +2 -0
- package/dist/chunk-25KL2NBJ.js.map +1 -0
- package/dist/chunk-2BKBVVZ3.js +2 -0
- package/dist/chunk-2BKBVVZ3.js.map +1 -0
- package/dist/chunk-3E5M6GRR.js +2 -0
- package/dist/chunk-3E5M6GRR.js.map +1 -0
- package/dist/chunk-66U6MMJ2.js +2 -0
- package/dist/chunk-66U6MMJ2.js.map +1 -0
- package/dist/chunk-BMA2X7LI.js +2 -0
- package/dist/chunk-BMA2X7LI.js.map +1 -0
- package/dist/chunk-BTR3ZGES.js +2 -0
- package/dist/chunk-BTR3ZGES.js.map +1 -0
- package/dist/chunk-CR2QIV5I.js +2 -0
- package/dist/chunk-CR2QIV5I.js.map +1 -0
- package/dist/chunk-D7RXO2FA.js +2 -0
- package/dist/chunk-D7RXO2FA.js.map +1 -0
- package/dist/chunk-JEBLDVKG.js +2 -0
- package/dist/chunk-JEBLDVKG.js.map +1 -0
- package/dist/chunk-JH7VLA6C.js +2 -0
- package/dist/chunk-JH7VLA6C.js.map +1 -0
- package/dist/chunk-K7TDPKGQ.js +2 -0
- package/dist/chunk-K7TDPKGQ.js.map +1 -0
- package/dist/chunk-NDESVCWI.js +2 -0
- package/dist/chunk-NDESVCWI.js.map +1 -0
- package/dist/chunk-VBPZRO7L.js +2 -0
- package/dist/chunk-VBPZRO7L.js.map +1 -0
- package/dist/chunk-W5D22D4P.js +2 -0
- package/dist/chunk-W5D22D4P.js.map +1 -0
- package/dist/{chunk-XHSBY2QK.js → chunk-X6CT6I2V.js} +2 -2
- package/dist/{chunk-XHSBY2QK.js.map → chunk-X6CT6I2V.js.map} +1 -1
- package/dist/chunk-XASMTNON.js +2 -0
- package/dist/chunk-XASMTNON.js.map +1 -0
- package/dist/chunk-ZYWDTLNL.js +2 -0
- package/dist/chunk-ZYWDTLNL.js.map +1 -0
- package/dist/core.d.ts +3 -3
- package/dist/core.js +1 -1
- package/dist/extension.d.ts +4 -1
- package/dist/extension.js +1 -1
- package/dist/extensions/string.d.ts +2 -4
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/metadata-extension.d.ts +196 -0
- package/package.json +6 -3
- package/dist/chunk-54RHS4F4.js +0 -2
- package/dist/chunk-54RHS4F4.js.map +0 -1
- package/dist/chunk-6LSN7NXQ.js +0 -2
- package/dist/chunk-6LSN7NXQ.js.map +0 -1
- package/dist/chunk-C6YQOKWB.js +0 -2
- package/dist/chunk-C6YQOKWB.js.map +0 -1
- package/dist/chunk-ELPPAHNO.js +0 -2
- package/dist/chunk-ELPPAHNO.js.map +0 -1
- package/dist/chunk-G424M7GI.js +0 -2
- package/dist/chunk-G424M7GI.js.map +0 -1
- package/dist/chunk-JUFZ7PLO.js +0 -2
- package/dist/chunk-JUFZ7PLO.js.map +0 -1
- package/dist/chunk-K4ZLXLE2.js +0 -2
- package/dist/chunk-K4ZLXLE2.js.map +0 -1
- package/dist/chunk-KC45JEFL.js +0 -2
- package/dist/chunk-KC45JEFL.js.map +0 -1
- package/dist/chunk-NF4CRFMN.js +0 -2
- package/dist/chunk-NF4CRFMN.js.map +0 -1
- package/dist/chunk-ORV2G6ZL.js +0 -2
- package/dist/chunk-ORV2G6ZL.js.map +0 -1
- package/dist/chunk-PQINUGZW.js +0 -2
- package/dist/chunk-PQINUGZW.js.map +0 -1
- package/dist/chunk-REYZ7G7J.js +0 -2
- package/dist/chunk-REYZ7G7J.js.map +0 -1
- package/dist/chunk-VSU5GILY.js +0 -2
- package/dist/chunk-VSU5GILY.js.map +0 -1
- package/dist/chunk-XL723XFL.js +0 -2
- package/dist/chunk-XL723XFL.js.map +0 -1
- package/dist/chunk-XPLTW5DI.js +0 -2
- package/dist/chunk-XPLTW5DI.js.map +0 -1
- package/dist/chunk-YAOZEA2R.js +0 -2
- package/dist/chunk-YAOZEA2R.js.map +0 -1
|
@@ -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{a as j,b as w}from"./chunk-3E5M6GRR.js";import{a as S,b as B}from"./chunk-BMA2X7LI.js";import{a as b,b as R}from"./chunk-BTR3ZGES.js";import{a as M,b as g}from"./chunk-JEBLDVKG.js";import{a as N,b as A}from"./chunk-25KL2NBJ.js";import{a as _,b as D}from"./chunk-W5D22D4P.js";import{a as P,b as F}from"./chunk-JH7VLA6C.js";import{a as V,b as v}from"./chunk-VBPZRO7L.js";import{a as c,b as T}from"./chunk-NDESVCWI.js";import{a as x,b as m}from"./chunk-XASMTNON.js";import{a as h,b as p}from"./chunk-D7RXO2FA.js";import{a as f,b as E}from"./chunk-66U6MMJ2.js";import{f as u}from"./chunk-2BKBVVZ3.js";var o=class s extends u{#e;#n;#t;static create(e){return new s({type:"generic",...e})}constructor(e){super(e),this.#e=e.templateFn,this.#n=e.defaults,this.apply=(...n)=>{if(!this.#e)throw new Error("GenericSchemaBuilder: no template function defined");return this.#e(...n)}}introspect(){return{...super.introspect(),templateFn:this.#e,defaults:this.#n}}#a(){if(!(!this.#e||!this.#n))return this.#t||(this.#t=this.#e(...this.#n)),this.#t}#r(e,n){let{valid:a,transaction:r,errors:d}=e;if(!a)return{valid:a,errors:d};let{object:{validatedObject:i}}=r;if(typeof i>"u"&&!this.isRequired||i===null&&(!this.isRequired||this.isNullable))return{valid:!0,object:i};let t=this.#a();return t?t.validate(i,n):{valid:!1,errors:[{message:"This is a generic schema template. Call .apply() with concrete schemas to get a validatable schema, or provide default arguments to generic()."}]}}async#i(e,n){let{valid:a,transaction:r,errors:d}=e;if(!a)return{valid:a,errors:d};let{object:{validatedObject:i}}=r;if(typeof i>"u"&&!this.isRequired||i===null&&(!this.isRequired||this.isNullable))return{valid:!0,object:i};let t=this.#a();return t?await t.validateAsync(i,n):{valid:!1,errors:[{message:"This is a generic schema template. Call .apply() with concrete schemas to get a validatable schema, or provide default arguments to generic()."}]}}validate(e,n){return super.validate(e,n)}async validateAsync(e,n){return super.validateAsync(e,n)}_validate(e,n){return this.#r(this.preValidateSync(e,n),n)}async _validateAsync(e,n){return this.#i(await super.preValidateAsync(e,n),n)}createFromProps(e){return s.create(e)}hasType(e){return this.derive({...this.introspect()},!0)}clearHasType(){return this.derive({...this.introspect()},!0)}required(e){return super.required(e)}optional(){return super.optional()}nullable(){return super.nullable()}notNullable(){return super.notNullable()}default(e){return super.default(e)}clearDefault(){return super.clearDefault()}brand(e){return super.brand(e)}readonly(){return super.readonly()}};function C(s,e){let n=e!==void 0?e:s,a=e!==void 0?s:void 0;return o.create({isRequired:!0,templateFn:n,defaults:a})}var K=new WeakSet;function O(s){return K.has(s)}function G(s){let e=n=>{let a=function(...r){return this.withExtension(s,n(...r))};return K.add(a),a};return{argument:()=>e(n=>n),value:n=>e(()=>n),compute:e}}var y={string:P,number:b,boolean:h,date:f,object:M,array:x,tuple:V,record:_,union:j,func:S,any:c,promise:N,generic:o},H={string:F,number:R,boolean:p,date:E,object:g,array:m,tuple:v,record:D,union:w,func:B,any:T,promise:A,generic:C},ie="__cleverbrush_method_literal_brand__";var se="__cleverbrush_extra_type_brand__";var q=new Set(["validate","validateAsync","parse","parseAsync","safeParse","safeParseAsync","introspect","optional","required","addPreprocessor","clearPreprocessors","addValidator","clearValidators","hasType","clearHasType","createFromProps","preValidate","preValidateSync","preValidateAsync","getValidationErrorMessage","getValidationErrorMessageSync","assureValidationErrorMessageProvider","withExtension","getExtension"]);function de(s){let e={};for(let n of Object.keys(s)){if(!(n in y))throw new Error(`Unknown builder type "${n}". Valid types: ${Object.keys(y).join(", ")}`);let a=s[n];if(!a||typeof a!="object")throw new Error(`Extension config for "${n}" must be an object of methods`);e[n]={};for(let r of Object.keys(a)){if(q.has(r))throw new Error(`Cannot override reserved method "${r}" on "${n}"`);let d=a[r];if(typeof d!="function")throw new Error(`Extension method "${n}.${r}" must be a function`);if(O(d)){e[n][r]=d;continue}e[n][r]=function(...i){let t=d.apply(this,i);return t&&typeof t=="object"&&typeof t.withExtension=="function"&&(typeof t.getExtension!="function"||t.getExtension(r)===void 0)?t.withExtension(r,i.length===1?i[0]:i.length===0?!0:i):t}}}return{config:e}}function oe(...s){let e=new Map;for(let a of s)for(let r of Object.keys(a.config)){e.has(r)||e.set(r,new Map);let d=e.get(r),i=a.config[r];for(let t of Object.keys(i)){if(d.has(t))throw new Error(`Extension method collision: "${t}" is defined by multiple extensions for "${r}"`);d.set(t,i[t])}}let n={};for(let a of Object.keys(y)){let r=e.get(a);if(!r||r.size===0){n[a]=H[a];continue}let d=y[a],i=class extends d{constructor(...t){super(...t)}static create(t){return new i({...t})}createFromProps(t){return i.create(t)}};for(let[t,l]of r)Object.defineProperty(i.prototype,t,{value:l,writable:!0,configurable:!0,enumerable:!1});n[a]=(...t)=>{let l=H[a](...t);return Object.setPrototypeOf(l,i.prototype),l}}return n}export{o as a,C as b,G as c,ie as d,se as e,de as f,oe as g};
|
|
2
|
+
//# sourceMappingURL=chunk-CR2QIV5I.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/builders/GenericSchemaBuilder.ts","../src/metadata-extension.ts","../src/extension.ts"],"sourcesContent":["import {\n type BRAND,\n SchemaBuilder,\n type ValidationContext,\n type ValidationErrorMessageProvider,\n type ValidationResult\n} from './SchemaBuilder.js';\n\ntype GenericSchemaBuilderCreateProps<TRequired extends boolean = true> =\n Partial<ReturnType<GenericSchemaBuilder<any, TRequired>['introspect']>>;\n\n/**\n * Schema builder that wraps a generic template function, enabling reusable\n * parameterized schemas. Call {@link GenericSchemaBuilder.apply | `.apply()`}\n * with concrete schema arguments to obtain a fully typed concrete schema\n * builder whose TypeScript type is inferred from the template function's\n * generic signature.\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 generic | generic()} function instead.\n *\n * @example Single type parameter\n * ```ts\n * import { generic, object, array, number, string, InferType } from '@cleverbrush/schema';\n *\n * const PaginatedList = generic(\n * <T extends SchemaBuilder<any, any, any, any, any>>(itemSchema: T) =>\n * object({\n * items: array(itemSchema),\n * total: number(),\n * page: number(),\n * })\n * );\n *\n * const userSchema = object({ name: string(), age: number() });\n * const PaginatedUsers = PaginatedList.apply(userSchema);\n *\n * type PaginatedUsersType = InferType<typeof PaginatedUsers>;\n * // → { items: { name: string; age: number }[]; total: number; page: number }\n * ```\n *\n * @example Multiple type parameters\n * ```ts\n * const Result = generic(\n * <T extends SchemaBuilder<any, any, any, any, any>,\n * E extends SchemaBuilder<any, any, any, any, any>>(\n * valueSchema: T,\n * errorSchema: E\n * ) =>\n * object({\n * ok: boolean(),\n * value: valueSchema.optional(),\n * error: errorSchema.optional(),\n * })\n * );\n *\n * const StringResult = Result.apply(string(), number());\n * // InferType → { ok: boolean; value?: string; error?: number }\n * ```\n *\n * @example With default arguments\n * ```ts\n * const AnyList = generic(\n * [any()], // default args — one per template parameter\n * <T extends SchemaBuilder<any, any, any, any, any>>(itemSchema: T) =>\n * object({ items: array(itemSchema), total: number() })\n * );\n *\n * // Validate directly using defaults:\n * AnyList.validate({ items: [1, 'two', true], total: 3 }); // valid\n *\n * // Or apply concrete schemas first:\n * AnyList.apply(string()).validate({ items: ['a', 'b'], total: 2 }); // valid\n * ```\n *\n * @see {@link generic}\n *\n * @typeParam TFn - The generic template function type. Its return type\n * determines `TResult` (the validated value type) when no explicit type\n * override has been applied via `.hasType<T>()`.\n * @typeParam TRequired - `true` when the schema is required (default),\n * `false` after calling `.optional()`. Governs whether `undefined` is a\n * valid value.\n * @typeParam TNullable - `true` after calling `.nullable()`. Governs whether\n * `null` is a valid value.\n * @typeParam TExplicitType - Type override set via `.hasType<T>()`. When\n * `undefined` (the default), `TResult` is derived from `TFn`'s return type.\n * @typeParam THasDefault - `true` after calling `.default(value)`. Governs\n * whether `InferType` emits `T` instead of `T | undefined` for optional\n * schemas with a default.\n * @typeParam TExtensions - Object type carrying extension methods added via\n * `withExtensions()`. Defaults to `{}`.\n * @typeParam TResult - The inferred result type: `TExplicitType` when set,\n * otherwise the value type inferred from `ReturnType<TFn>`.\n */\nexport class GenericSchemaBuilder<\n TFn extends (...args: any[]) => SchemaBuilder<any, any, any, any, any>,\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 ? ReturnType<TFn> extends SchemaBuilder<infer R, any, any, any, any>\n ? R\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 'generic',\n TFn,\n TRequired,\n TNullable,\n TExplicitType,\n THasDefault,\n TResult\n ];\n\n #templateFn?: (...args: any[]) => SchemaBuilder<any, any, any, any, any>;\n #defaults?: readonly any[];\n #cachedDefaultSchema?: SchemaBuilder<any, any, any, any, any>;\n\n /**\n * Applies the template function with concrete schema arguments, returning\n * a fully typed concrete schema builder. TypeScript infers the result type\n * from the template function's own generic signature.\n *\n * The returned builder is independent of this `GenericSchemaBuilder` and\n * can be used like any other schema: `.validate()`, `.optional()`, etc.\n *\n * @example\n * ```ts\n * const Wrapper = generic(\n * <T extends SchemaBuilder<any, any, any, any, any>>(schema: T) =>\n * object({ data: schema })\n * );\n *\n * const s = Wrapper.apply(string());\n * // InferType<typeof s> → { data: string }\n * s.validate({ data: 'hello' }); // { valid: true }\n * ```\n */\n // Set to the actual function in the constructor; declared here for TypeScript.\n declare public readonly apply: TFn;\n\n /**\n * @hidden\n */\n public static create(props: GenericSchemaBuilderCreateProps<any>) {\n return new GenericSchemaBuilder({\n type: 'generic',\n ...props\n });\n }\n\n protected constructor(props: GenericSchemaBuilderCreateProps<TRequired>) {\n super(props as any);\n this.#templateFn = (props as any).templateFn;\n this.#defaults = (props as any).defaults;\n\n // Own property: typed as TFn so generic inference works at call sites.\n (this as any).apply = (...args: any[]) => {\n if (!this.#templateFn) {\n throw new Error(\n 'GenericSchemaBuilder: no template function defined'\n );\n }\n return this.#templateFn(...args);\n };\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 * - `templateFn` — the template function passed to {@link generic}.\n * - `defaults` — the default argument list passed to the two-argument\n * form of {@link generic}, or `undefined` when no defaults were provided.\n *\n * @example\n * ```ts\n * const schema = generic([string()], <T>(s: T) => object({ data: s }));\n *\n * const info = schema.introspect();\n * // info.type → 'generic'\n * // info.templateFn → [Function]\n * // info.defaults → [StringSchemaBuilder]\n * ```\n */\n public introspect() {\n return {\n ...super.introspect(),\n /** Template function passed to {@link generic}. */\n templateFn: this.#templateFn,\n /** Default positional arguments for the template function, or `undefined`. */\n defaults: this.#defaults\n };\n }\n\n #getOrCreateDefaultSchema():\n | SchemaBuilder<any, any, any, any, any>\n | undefined {\n if (!this.#templateFn || !this.#defaults) {\n return undefined;\n }\n if (!this.#cachedDefaultSchema) {\n this.#cachedDefaultSchema = this.#templateFn(...this.#defaults);\n }\n return this.#cachedDefaultSchema;\n }\n\n #buildResult(\n superResult: ReturnType<\n GenericSchemaBuilder<TFn, TRequired>['preValidateSync']\n >,\n context?: ValidationContext\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 { valid: true, object: objToValidate };\n }\n\n const defaultSchema = this.#getOrCreateDefaultSchema();\n if (!defaultSchema) {\n return {\n valid: false,\n errors: [\n {\n message:\n 'This is a generic schema template. Call .apply() with concrete schemas to get a validatable schema, or provide default arguments to generic().'\n }\n ]\n };\n }\n\n return defaultSchema.validate(\n objToValidate,\n context\n ) as ValidationResult<TResult>;\n }\n\n async #buildAsyncResult(\n superResult: Awaited<\n ReturnType<GenericSchemaBuilder<TFn, TRequired>['preValidateAsync']>\n >,\n context?: ValidationContext\n ): Promise<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 { valid: true, object: objToValidate };\n }\n\n const defaultSchema = this.#getOrCreateDefaultSchema();\n if (!defaultSchema) {\n return {\n valid: false,\n errors: [\n {\n message:\n 'This is a generic schema template. Call .apply() with concrete schemas to get a validatable schema, or provide default arguments to generic().'\n }\n ]\n };\n }\n\n return (await defaultSchema.validateAsync(\n objToValidate,\n context\n )) as ValidationResult<TResult>;\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(\n this.preValidateSync(object, context),\n context\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 return this.#buildAsyncResult(\n await super.preValidateAsync(object, context),\n context\n );\n }\n\n protected createFromProps<TReq extends boolean>(\n props: GenericSchemaBuilderCreateProps<TReq>\n ): this {\n return GenericSchemaBuilder.create(props as any) as any;\n }\n\n /**\n * @hidden\n */\n public hasType<T>(\n _notUsed?: T\n ): GenericSchemaBuilder<TFn, 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 * @hidden\n */\n public clearHasType(): GenericSchemaBuilder<\n TFn,\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 * @hidden\n */\n public required(\n errorMessage?: ValidationErrorMessageProvider\n ): GenericSchemaBuilder<\n TFn,\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(): GenericSchemaBuilder<\n TFn,\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 nullable(): GenericSchemaBuilder<\n TFn,\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(): GenericSchemaBuilder<\n TFn,\n TRequired,\n false,\n TExplicitType,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.notNullable() as any;\n }\n\n /**\n * @hidden\n */\n public default(\n value: TResult | (() => TResult)\n ): GenericSchemaBuilder<\n TFn,\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(): GenericSchemaBuilder<\n TFn,\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 ): GenericSchemaBuilder<\n TFn,\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 * @hidden\n */\n public readonly(): GenericSchemaBuilder<\n TFn,\n TRequired,\n TNullable,\n Readonly<TResult>,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.readonly();\n }\n}\n\n/**\n * Creates a generic schema template — a reusable, parameterized schema factory\n * whose TypeScript type is inferred from the template function's generic\n * signature.\n *\n * Call {@link GenericSchemaBuilder.apply | `.apply()`} on the returned builder\n * to instantiate the template with concrete schema arguments and receive a\n * fully typed concrete schema.\n *\n * There are two overloads:\n *\n * 1. **`generic(templateFn)`** — Provide only the template function. The\n * template must be called via `.apply()` before validation.\n * 2. **`generic(defaults, templateFn)`** — Provide positional default arguments\n * followed by the template function. The template can be validated directly\n * using those defaults (without calling `.apply()` first).\n *\n * @param templateFn - A (generic) function that accepts schema arguments and\n * returns a concrete schema. TypeScript infers the result type from this\n * function's generic signature when `.apply()` is called.\n *\n * @returns A new {@link GenericSchemaBuilder} with `isRequired` set to `true`.\n *\n * @example Single type parameter\n * ```ts\n * import { generic, object, array, number, string, any, InferType } from '@cleverbrush/schema';\n *\n * const PaginatedList = generic(\n * <T extends SchemaBuilder<any, any, any, any, any>>(itemSchema: T) =>\n * object({ items: array(itemSchema), total: number(), page: number() })\n * );\n *\n * const UserList = PaginatedList.apply(object({ name: string() }));\n * type UserListType = InferType<typeof UserList>;\n * // → { items: { name: string }[]; total: number; page: number }\n *\n * UserList.validate({ items: [{ name: 'Alice' }], total: 1, page: 1 }); // valid\n * ```\n *\n * @example Multiple type parameters\n * ```ts\n * const Result = generic(\n * <T extends SchemaBuilder<any, any, any, any, any>,\n * E extends SchemaBuilder<any, any, any, any, any>>(\n * valueSchema: T,\n * errorSchema: E\n * ) =>\n * union(\n * object({ ok: boolean().equalsTo(true), value: valueSchema }),\n * object({ ok: boolean().equalsTo(false), error: errorSchema })\n * )\n * );\n *\n * const StringResult = Result.apply(string(), number());\n * ```\n *\n * @example With defaults (enables direct validation on the template)\n * ```ts\n * const AnyList = generic(\n * [any()], // default args — positional, one per template parameter\n * <T extends SchemaBuilder<any, any, any, any, any>>(itemSchema: T) =>\n * object({ items: array(itemSchema), total: number() })\n * );\n *\n * // Validate directly — uses the default any() schema:\n * AnyList.validate({ items: [1, 'two'], total: 2 }); // valid\n *\n * // Or apply concrete schemas first:\n * AnyList.apply(string()).validate({ items: ['x'], total: 1 }); // valid\n * ```\n *\n * @see {@link GenericSchemaBuilder}\n */\nexport function generic<\n TFn extends (...args: any[]) => SchemaBuilder<any, any, any, any, any>\n>(\n templateFn: TFn\n): GenericSchemaBuilder<TFn, true, false, undefined, false, {}>;\nexport function generic<\n TFn extends (...args: any[]) => SchemaBuilder<any, any, any, any, any>\n>(\n defaults: readonly any[],\n templateFn: TFn\n): GenericSchemaBuilder<TFn, true, false, undefined, false, {}>;\nexport function generic<\n TFn extends (...args: any[]) => SchemaBuilder<any, any, any, any, any>\n>(\n fnOrDefaults: TFn | readonly any[],\n templateFn?: TFn\n): GenericSchemaBuilder<TFn, true, false, undefined, false, {}> {\n const fn = templateFn !== undefined ? templateFn : (fnOrDefaults as TFn);\n const defaults =\n templateFn !== undefined ? (fnOrDefaults as readonly any[]) : undefined;\n return GenericSchemaBuilder.create({\n isRequired: true,\n templateFn: fn,\n defaults\n }) as any;\n}\n","import type { AnySchemaBuilder } from './builders/AnySchemaBuilder.js';\nimport type { ArraySchemaBuilder } from './builders/ArraySchemaBuilder.js';\nimport type { BooleanSchemaBuilder } from './builders/BooleanSchemaBuilder.js';\nimport type { DateSchemaBuilder } from './builders/DateSchemaBuilder.js';\nimport type { FunctionSchemaBuilder } from './builders/FunctionSchemaBuilder.js';\nimport type { GenericSchemaBuilder } from './builders/GenericSchemaBuilder.js';\nimport type { NumberSchemaBuilder } from './builders/NumberSchemaBuilder.js';\nimport type { ObjectSchemaBuilder } from './builders/ObjectSchemaBuilder.js';\nimport type { PromiseSchemaBuilder } from './builders/PromiseSchemaBuilder.js';\nimport type { RecordSchemaBuilder } from './builders/RecordSchemaBuilder.js';\nimport type {\n PropertyDescriptorTree,\n SchemaBuilder\n} from './builders/SchemaBuilder.js';\nimport type { StringSchemaBuilder } from './builders/StringSchemaBuilder.js';\nimport type { TupleSchemaBuilder } from './builders/TupleSchemaBuilder.js';\nimport type { UnionSchemaBuilder } from './builders/UnionSchemaBuilder.js';\nimport type {\n EXTRA_TYPE_BRAND,\n HiddenExtensionMethods,\n METHOD_LITERAL_BRAND\n} from './extension.js';\n\nconst metadataMethods = new WeakSet<Function>();\n\n/** @internal Metadata helpers own their key, including explicitly undefined values. */\nexport function isMetadataMethod(method: Function): boolean {\n return metadataMethods.has(method);\n}\n\n/** Metadata recorded by typed extension methods; unannotated builders yield `{}`. */\nexport type InferExtensionMetadata<S> = S extends {\n readonly __cleverbrush_extension_metadata__: infer M;\n}\n ? M\n : {};\n\n/** @internal Description carried on a metadata method's type, not on schemas. */\nexport type MetadataMethod<K extends string, A extends any[], V, Mode> = ((\n this: SchemaBuilder<any, any, any, any, any>,\n ...args: A\n) => SchemaBuilder<any, any, any, any, any>) & {\n readonly __cleverbrush_metadata_method__: { key: K; value: V; mode: Mode };\n};\n\n/** Defines the source of a typed metadata value for an extension method. */\nexport interface MetadataMethodBuilder<K extends string> {\n /** Store the caller's argument, retaining its literal type. */\n argument<TValue = unknown>(): MetadataMethod<\n K,\n [value: TValue],\n TValue,\n 'argument'\n >;\n /** Create a zero-argument method that stores a fixed value. */\n value<const TValue>(value: TValue): MetadataMethod<K, [], TValue, 'value'>;\n /** Compute metadata from typed arguments; inference uses the callback's return type. */\n compute<TArgs extends any[], TValue>(\n compute: (...args: TArgs) => TValue\n ): MetadataMethod<K, TArgs, TValue, 'computed'>;\n}\n\n/**\n * Define an immutable metadata-only method for use inside `defineExtension()`.\n *\n * Unlike ordinary extension methods, its stored value is also available through\n * `InferExtensionMetadata<S>`. Repeated writes replace the value for that key.\n * The method does not validate input or change the schema's inferred value type.\n * Methods are installed only on factories returned by `withExtensions()`.\n *\n * @param key - Runtime introspection key, independent of the fluent method name.\n * @example\n * ```ts\n * const labels = defineExtension({\n * string: {\n * label: defineMetadataMethod('label').argument<string>(),\n * internal: defineMetadataMethod('visibility').value('internal')\n * }\n * });\n * const s = withExtensions(labels).string().label('Title').optional();\n * type Label = InferExtensionMetadata<typeof s>['label']; // 'Title'\n * ```\n */\nexport function defineMetadataMethod<const K extends string>(\n key: K\n): MetadataMethodBuilder<K> {\n const method = (compute: (...args: any[]) => unknown) => {\n const apply = function (\n this: SchemaBuilder<any, any, any, any, any>,\n ...args: any[]\n ) {\n return this.withExtension(key, compute(...args));\n };\n metadataMethods.add(apply);\n return apply;\n };\n return {\n argument: () => method(value => value),\n value: value => method(() => value),\n compute: method\n } as MetadataMethodBuilder<K>;\n}\n\n/** @internal Rebuild a native builder with new extension state, preserving its value flags. */\ntype WithExtensions<S, E> = S extends {\n readonly __cleverbrush_builder_type__: infer P;\n}\n ? P extends readonly [\n 'number',\n infer T,\n infer R extends boolean,\n infer N extends boolean,\n infer D extends boolean\n ]\n ? NumberSchemaBuilder<T, R, N, D, E>\n : P extends readonly [\n 'string',\n infer T,\n infer R extends boolean,\n infer N extends boolean,\n infer D extends boolean\n ]\n ? StringSchemaBuilder<T, R, N, D, E>\n : P extends readonly [\n 'date',\n infer T,\n infer R extends boolean,\n infer N extends boolean,\n infer D extends boolean\n ]\n ? DateSchemaBuilder<T, R, N, D, E>\n : P extends readonly [\n 'object',\n infer P extends Record<\n string,\n SchemaBuilder<any, any, any, any, any>\n >,\n infer R extends boolean,\n infer N extends boolean,\n infer T,\n infer D extends boolean,\n infer C extends SchemaBuilder<any, any, any, any, any>[]\n ]\n ? ObjectSchemaBuilder<P, R, N, T, D, E, C>\n : P extends readonly [\n 'array',\n infer P extends SchemaBuilder<any, any, any, any, any>,\n infer R extends boolean,\n infer N extends boolean,\n infer T,\n infer D extends boolean,\n infer V\n ]\n ? ArraySchemaBuilder<P, R, N, T, D, E, V>\n : P extends readonly [\n 'boolean',\n infer T,\n infer R extends boolean,\n infer N extends boolean,\n infer X,\n infer D extends boolean,\n infer V\n ]\n ? BooleanSchemaBuilder<T, R, N, X, D, E, V>\n : P extends readonly [\n 'tuple',\n infer P extends readonly SchemaBuilder<\n any,\n any,\n any,\n any,\n any\n >[],\n infer R extends boolean,\n infer N extends boolean,\n infer T,\n infer D extends boolean,\n infer Rest extends\n | SchemaBuilder<any, any, any, any, any>\n | undefined,\n infer V\n ]\n ? TupleSchemaBuilder<P, R, N, T, D, E, Rest, V>\n : P extends readonly [\n 'record',\n infer K extends StringSchemaBuilder<\n any,\n any,\n any,\n any\n >,\n infer P extends SchemaBuilder<\n any,\n any,\n any,\n any,\n any\n >,\n infer R extends boolean,\n infer N extends boolean,\n infer T,\n infer D extends boolean,\n infer V\n ]\n ? RecordSchemaBuilder<K, P, R, N, T, D, E, V>\n : P extends readonly [\n 'union',\n infer P extends readonly SchemaBuilder<\n any,\n any,\n any,\n any,\n any\n >[],\n infer R extends boolean,\n infer N extends boolean,\n infer T,\n infer D extends boolean\n ]\n ? UnionSchemaBuilder<P, R, N, T, D, E>\n : P extends readonly [\n 'func',\n infer R extends boolean,\n infer N extends boolean,\n infer T,\n infer D extends boolean,\n infer P extends SchemaBuilder<\n any,\n any,\n any,\n any,\n any\n >[],\n infer Return extends\n | SchemaBuilder<any, any, any, any, any>\n | undefined,\n infer V\n ]\n ? FunctionSchemaBuilder<R, N, T, D, E, P, Return, V>\n : P extends readonly [\n 'promise',\n infer R extends boolean,\n infer N extends boolean,\n infer T,\n infer D extends boolean,\n infer P extends\n | SchemaBuilder<any, any, any, any, any>\n | undefined,\n infer V\n ]\n ? PromiseSchemaBuilder<R, N, T, D, E, P, V>\n : P extends readonly [\n 'generic',\n infer F extends (\n ...args: any[]\n ) => SchemaBuilder<any, any, any, any, any>,\n infer R extends boolean,\n infer N extends boolean,\n infer T,\n infer D extends boolean,\n infer V\n ]\n ? GenericSchemaBuilder<F, R, N, T, D, E, V>\n : P extends readonly [\n 'any',\n infer R extends boolean,\n infer N extends boolean,\n infer T,\n infer D extends boolean,\n infer V\n ]\n ? AnySchemaBuilder<R, N, T, D, E, V>\n : never\n : never;\n\n/** @internal Named declaration support for metadata-aware fluent builders. */\nexport type MetadataState<Methods, Metadata, Extras> =\n MetadataMethods<Methods> &\n HiddenExtensionMethods &\n Extras & {\n readonly __cleverbrush_extension_metadata__: Metadata;\n };\n\n/** @internal A metadata-aware factory result; state survives native builder modifiers. */\nexport type MetadataExtended<\n S,\n Methods,\n Metadata = {},\n Extras = ExtraProperties<S, Methods>\n> = WithExtensions<S, MetadataState<Methods, Metadata, Extras>> &\n MetadataState<Methods, Metadata, Extras>;\n\n/** @internal Preserve author-defined type brands without intersecting stale metadata or methods. */\nexport type ExtraProperties<S, Methods> = Pick<\n S,\n Exclude<\n keyof S,\n | keyof WithExtensions<S, {}>\n | keyof Methods\n | '__cleverbrush_extension_metadata__'\n >\n>;\n\ntype ExtraTypes<S> = S extends { readonly [EXTRA_TYPE_BRAND]?: infer T }\n ? T\n : {};\ntype LiteralNames<S> = S extends { readonly [METHOD_LITERAL_BRAND]?: infer T }\n ? T\n : never;\ntype WithBrand<S, Methods, K extends PropertyKey, V> = MetadataExtended<\n S,\n Methods,\n InferExtensionMetadata<S>,\n Omit<ExtraProperties<S, Methods>, K> & { readonly [P in K]?: V }\n>;\n\ntype SetMetadata<S, Methods, K extends string, V> = MetadataExtended<\n S,\n Methods,\n Omit<InferExtensionMetadata<S>, K> & Record<K, V>\n>;\n\n/** Describe fields without recursively inspecting the receiver's fluent methods. */\ntype MetadataPropertyTree<S> = S extends {\n readonly __cleverbrush_builder_type__: readonly [\n 'object',\n infer P extends Record<string, SchemaBuilder<any, any, any, any, any>>,\n ...unknown[]\n ];\n}\n ? PropertyDescriptorTree<ObjectSchemaBuilder<P>, ObjectSchemaBuilder<P>>\n : never;\n\n/** @internal Named declaration support for extension method signatures. */\nexport type MetadataMethods<Methods> = {\n [M in keyof Methods]: Methods[M] extends MetadataMethod<\n infer K,\n infer A,\n infer V,\n infer Mode\n >\n ? Mode extends 'argument'\n ? <S, const Value extends A[0]>(\n this: S,\n value: Value\n ) => SetMetadata<S, Methods, K, Value>\n : <S>(this: S, ...args: A) => SetMetadata<S, Methods, K, V>\n : Methods[M] extends (this: any, ...args: infer A) => infer R\n ? typeof EXTRA_TYPE_BRAND extends keyof R\n ? <S, const Name extends string & A[0], const Key extends string>(\n this: S,\n name: Name,\n ...columns: ReadonlyArray<\n Key | ((t: MetadataPropertyTree<S>) => any)\n >\n ) => WithBrand<\n S,\n Methods,\n typeof EXTRA_TYPE_BRAND,\n ExtraTypes<S> & Record<Name, readonly Key[]>\n >\n : typeof METHOD_LITERAL_BRAND extends keyof R\n ? <S, const Name extends string & A[0]>(\n this: S,\n name: Name,\n ...rest: A extends [any, ...infer Rest] ? Rest : []\n ) => WithBrand<\n S,\n Methods,\n typeof METHOD_LITERAL_BRAND,\n LiteralNames<S> | Name\n >\n : <S>(this: S, ...args: A) => S\n : Methods[M];\n};\n","/**\n * @module extension\n *\n * The **extension system** for `@cleverbrush/schema` allows third-party and\n * first-party code to add custom methods to any schema builder type\n * (`string`, `number`, `date`, `object`, …) without modifying the core\n * library.\n *\n * ## Overview\n *\n * Extensions follow a two-step workflow:\n *\n * 1. **Define** an extension with {@link defineExtension} — declare which\n * builder types it targets and what methods it adds.\n * 2. **Apply** one or more extensions with {@link withExtensions} — get back\n * augmented factory functions (`string()`, `number()`, …) whose return\n * types include the new methods.\n *\n * ## Ergonomic authoring\n *\n * Extension methods do **not** need to call `withExtension()` manually.\n * The system automatically attaches metadata using the method name as the\n * extension key and the method arguments as the value. This keeps extension\n * definitions concise:\n *\n * ```ts\n * const slugExt = defineExtension({\n * string: {\n * slug(this: StringSchemaBuilder) {\n * return this.addValidator((val) => {\n * const valid = /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(val);\n * return { valid, errors: valid ? [] : [{ message: 'must be a valid URL slug' }] };\n * });\n * }\n * }\n * });\n * ```\n *\n * If you need **custom metadata** (e.g. a different key or a transformed\n * value), call `this.withExtension(key, value)` explicitly — the auto-infer\n * logic will detect the existing key and skip the automatic attachment.\n *\n * ## Stacking and composition\n *\n * Multiple extensions can target the same builder type. Pass them all to\n * `withExtensions()` and the methods are merged. A runtime error is thrown\n * if two extensions define the same method name on the same builder type.\n *\n * ```ts\n * const s = withExtensions(emailExt, slugExt, rangeExt);\n * const schema = s.string().email().slug(); // both methods available\n * ```\n *\n * ## Introspection\n *\n * Extension metadata is accessible via `schema.introspect().extensions`.\n * Each key corresponds to an extension method name and its value is whatever\n * was passed (or auto-inferred) as the extension data.\n *\n * @see {@link defineExtension} — define an extension\n * @see {@link withExtensions} — apply extensions to builder factories\n * @see {@link ExtensionConfig} — shape of the configuration object\n * @see {@link ExtensionDescriptor} — branded descriptor returned by `defineExtension`\n */\nimport { AnySchemaBuilder, any } from './builders/AnySchemaBuilder.js';\nimport { ArraySchemaBuilder, array } from './builders/ArraySchemaBuilder.js';\nimport {\n BooleanSchemaBuilder,\n boolean\n} from './builders/BooleanSchemaBuilder.js';\nimport { DateSchemaBuilder, date } from './builders/DateSchemaBuilder.js';\nimport {\n FunctionSchemaBuilder,\n func\n} from './builders/FunctionSchemaBuilder.js';\nimport {\n GenericSchemaBuilder,\n generic\n} from './builders/GenericSchemaBuilder.js';\nimport { NumberSchemaBuilder, number } from './builders/NumberSchemaBuilder.js';\nimport { ObjectSchemaBuilder, object } from './builders/ObjectSchemaBuilder.js';\nimport {\n PromiseSchemaBuilder,\n promise\n} from './builders/PromiseSchemaBuilder.js';\nimport { RecordSchemaBuilder, record } from './builders/RecordSchemaBuilder.js';\nimport type {\n PropertyDescriptorTree,\n SchemaBuilder\n} from './builders/SchemaBuilder.js';\nimport { StringSchemaBuilder, string } from './builders/StringSchemaBuilder.js';\nimport { TupleSchemaBuilder, tuple } from './builders/TupleSchemaBuilder.js';\nimport { UnionSchemaBuilder, union } from './builders/UnionSchemaBuilder.js';\nimport type { MetadataExtended } from './metadata-extension.js';\nimport { isMetadataMethod } from './metadata-extension.js';\n\nexport type {\n ExtraProperties,\n InferExtensionMetadata,\n MetadataExtended,\n MetadataMethod,\n MetadataMethodBuilder,\n MetadataMethods,\n MetadataState\n} from './metadata-extension.js';\nexport { defineMetadataMethod } from './metadata-extension.js';\n\n// ---------------------------------------------------------------------------\n// Builder type name mapping\n// ---------------------------------------------------------------------------\n\n/**\n * Maps each builder type name to the corresponding generic builder class.\n *\n * Used internally to type-check extension method `this` bindings — for\n * example, an extension targeting `\"string\"` receives `this: StringSchemaBuilder`.\n *\n * @internal Not exported — used only by the extension type machinery.\n */\ntype BuilderMap = {\n string: StringSchemaBuilder<any, any, any, any, any>;\n number: NumberSchemaBuilder<any, any, any, any, any>;\n boolean: BooleanSchemaBuilder<any, any, any, any, any, any, any>;\n date: DateSchemaBuilder<any, any, any, any, any>;\n object: ObjectSchemaBuilder<any, any, any, any, any, any, any>;\n array: ArraySchemaBuilder<any, any, any, any, any, any, any>;\n tuple: TupleSchemaBuilder<any, any, any, any, any, any, any>;\n record: RecordSchemaBuilder<any, any, any, any, any, any, any>;\n union: UnionSchemaBuilder<any, any, any, any, any, any>;\n func: FunctionSchemaBuilder<any, any, any, any, any>;\n any: AnySchemaBuilder<any, any, any, any, any, any>;\n promise: PromiseSchemaBuilder<any, any, any, any, any>;\n generic: GenericSchemaBuilder<any, any, any, any, any, any>;\n};\n\ntype BuilderTypeName = keyof BuilderMap;\n\n// Runtime mapping from type name to the actual class constructor\nconst builderClasses: Record<BuilderTypeName, typeof SchemaBuilder> = {\n string: StringSchemaBuilder as any,\n number: NumberSchemaBuilder as any,\n boolean: BooleanSchemaBuilder as any,\n date: DateSchemaBuilder as any,\n object: ObjectSchemaBuilder as any,\n array: ArraySchemaBuilder as any,\n tuple: TupleSchemaBuilder as any,\n record: RecordSchemaBuilder as any,\n union: UnionSchemaBuilder as any,\n func: FunctionSchemaBuilder as any,\n any: AnySchemaBuilder as any,\n promise: PromiseSchemaBuilder as any,\n generic: GenericSchemaBuilder as any\n};\n\n// Runtime mapping from type name to factory function\nconst builderFactories: Record<BuilderTypeName, (...args: any[]) => any> = {\n string,\n number,\n boolean,\n date,\n object,\n array,\n tuple,\n record,\n union,\n func,\n any,\n promise,\n generic\n};\n\n// ---------------------------------------------------------------------------\n// Extension configuration types\n// ---------------------------------------------------------------------------\n\n/**\n * Defines the shape of an extension configuration object passed to\n * {@link defineExtension}.\n *\n * Each key is a **builder type name** — one of `\"string\"`, `\"number\"`,\n * `\"boolean\"`, `\"date\"`, `\"object\"`, `\"array\"`, `\"union\"`, `\"func\"`, or\n * `\"any\"`. The value is a record of **method implementations** to add to\n * that builder type.\n *\n * Method implementations receive `this` bound to the target builder instance\n * (e.g. `StringSchemaBuilder` for the `\"string\"` key) and **must** return a\n * builder of the same type to support fluent chaining.\n *\n * @remarks\n * Extension methods that only add validators/preprocessors do not need to\n * call `this.withExtension()` — the system will auto-attach metadata using\n * the method name as the key and the arguments as the value. Call\n * `this.withExtension(key, value)` explicitly only when you need custom\n * metadata (e.g. a transformed value or a different key).\n *\n * @example\n * ```ts\n * // Minimal extension config — auto-inferred metadata\n * const config: ExtensionConfig = {\n * string: {\n * slug(this: StringSchemaBuilder) {\n * return this.addValidator((v) => ({ valid: /^[a-z0-9-]+$/.test(v), errors: [] }));\n * }\n * },\n * number: {\n * port(this: NumberSchemaBuilder) {\n * return this.isInteger().min(1).max(65535);\n * }\n * }\n * };\n * ```\n *\n * @see {@link defineExtension}\n */\nexport type ExtensionConfig = {\n [K in BuilderTypeName]?: Record<\n string,\n (this: BuilderMap[K], ...args: any[]) => any\n >;\n};\n\n/**\n * A branded descriptor returned by {@link defineExtension}.\n *\n * The descriptor captures the extension's method signatures at the **type\n * level** so that {@link withExtensions} can produce correctly-typed factory\n * functions. At runtime it holds the (possibly wrapped) configuration object.\n *\n * Extension descriptors are intentionally **opaque** — consumers should not\n * access `config` directly. Instead, pass descriptors to\n * {@link withExtensions} to obtain augmented builder factories.\n *\n * @typeParam T - The concrete {@link ExtensionConfig} shape. Inferred\n * automatically by `defineExtension`; you rarely need to specify it.\n *\n * @example\n * ```ts\n * // The type is inferred — no need to annotate\n * const myExt: ExtensionDescriptor<{ string: { slug: ... } }> = defineExtension({ ... });\n * ```\n *\n * @see {@link defineExtension}\n * @see {@link withExtensions}\n */\nexport type ExtensionDescriptor<T extends ExtensionConfig = ExtensionConfig> = {\n readonly __brand: unique symbol;\n readonly config: T;\n};\n\n// ---------------------------------------------------------------------------\n// Type-level extraction of extension methods per builder type\n// ---------------------------------------------------------------------------\n\n/** Extracts the method signatures an extension adds to a given builder type. */\ntype ExtractMethods<\n TExt extends ExtensionConfig,\n TType extends BuilderTypeName\n> =\n TExt[TType] extends Record<string, (...args: any[]) => any>\n ? TExt[TType]\n : {};\n\n/** Merges the methods from multiple extensions for a given builder type. */\ntype MergeExtensionMethods<\n TExts extends readonly ExtensionDescriptor<any>[],\n TType extends BuilderTypeName\n> = TExts extends readonly [\n ExtensionDescriptor<infer TFirst>,\n ...infer TRest extends readonly ExtensionDescriptor<any>[]\n]\n ? ExtractMethods<TFirst, TType> & MergeExtensionMethods<TRest, TType>\n : {};\n\n// ---------------------------------------------------------------------------\n// Return types for withExtensions()\n// ---------------------------------------------------------------------------\n\n/**\n * Unique string-literal brand key used by {@link FixedMethods} to detect\n * extension methods whose first-argument literal should be accumulated in the\n * return type.\n *\n * Declare the return type of any extension method as\n * `this & { readonly [METHOD_LITERAL_BRAND]?: N }` (where `N extends string`)\n * and `FixedMethods` will automatically make it generic so the literal name\n * flows through the type system and accumulates across multiple calls.\n *\n * This powers scope-name autocomplete in `SchemaQueryBuilder.scoped()`.\n */\nconst METHOD_LITERAL_BRAND = '__cleverbrush_method_literal_brand__' as const;\n\nexport { METHOD_LITERAL_BRAND };\nexport type MethodLiteralBrandSymbol = typeof METHOD_LITERAL_BRAND;\n\n/**\n * Generic accumulator brand for extension methods that want to thread\n * a `Record<name, readonly string[]>` map through the builder chain.\n *\n * Extension authors can declare a method's return type as\n * `this & { readonly [EXTRA_TYPE_BRAND]?: { [name]: TKeys } }`\n * and {@link FixedMethods} will automatically:\n * - Make the first argument const-generic (to capture the literal name).\n * - Make the second argument const-generic when it is a `readonly string[]`\n * tuple (to capture the literal key list).\n * - Accumulate both into the 4th `TExtraTypes` parameter of `FixedMethods`\n * so the information survives subsequent method calls on the same builder.\n *\n * This is deliberately projection-agnostic — any extension that follows the\n * `(name: string, data: readonly string[] | function)` signature convention\n * can use it. Projection-specific semantics (e.g. `PROJECTION_BRAND`) live\n * in the consuming library, not here.\n *\n * @see {@link FixedMethods} for how the accumulation works.\n */\nconst EXTRA_TYPE_BRAND = '__cleverbrush_extra_type_brand__' as const;\n\nexport { EXTRA_TYPE_BRAND };\nexport type ExtraTypeBrandSymbol = typeof EXTRA_TYPE_BRAND;\n\n/** @internal Drops the first element of a tuple type. */\ntype TailArgs<T> = T extends readonly [unknown, ...infer R] ? R : [];\n\n/**\n * Intersected onto consumer-facing builder types to make `withExtension`\n * and `getExtension` uncallable (`never`). Using an intersection instead\n * of `Omit` preserves the class identity so extended builders remain\n * assignable to `SchemaBuilder<any, any, any, any, any>`.\n */\nexport type HiddenExtensionMethods = {\n /** @internal Extension-author only — use inside `defineExtension()`. */\n withExtension: never;\n /** @internal Extension-author only — use inside `defineExtension()`. */\n getExtension: never;\n};\n\n/**\n * Overrides extension method return types so they always return the full\n * extended builder type. This ensures extension methods preserve all other\n * extension methods through chaining (e.g. `s.string().email().slug()`).\n *\n * The self-reference (`FixedMethods` appears in its own mapped return\n * types) is resolved lazily by TypeScript because the recursion sits\n * inside a function-return position within a conditional mapped type.\n *\n * The optional third parameter `TAccum` accumulates literal string names\n * registered by methods whose raw return type includes\n * `{ readonly [METHOD_LITERAL_BRAND]?: any }`. Those methods are rewritten\n * as `const`-generic so the literal flows through; all other methods thread\n * the accumulator unchanged.\n *\n * The optional fourth parameter `TExtraTypes` accumulates a\n * `Record<name, readonly string[]>` map contributed by methods whose raw\n * return type includes `{ readonly [EXTRA_TYPE_BRAND]?: any }`. Those\n * methods are rewritten as const-generic for both the name and the keys\n * tuple so the mapping flows through; all other methods thread it unchanged.\n *\n * For object-schema methods the accessor-form callback parameter is\n * automatically typed as `PropertyDescriptorTree<TBase, TBase>` when\n * `TBase` is an `ObjectSchemaBuilder`, giving callers IDE autocomplete over\n * the schema's own properties.\n */\nexport type FixedMethods<\n TRawMethods,\n TBase,\n TAccum extends string = never,\n TExtraTypes extends Record<string, readonly string[]> = Record<never, never>\n> = {\n [K in keyof TRawMethods]: TRawMethods[K] extends (\n this: any,\n ...args: infer A\n ) => infer R\n ? R extends { readonly [EXTRA_TYPE_BRAND]?: any }\n ? // Extra-type-brand method: rest-param shape `(name, ...columns)`.\n // Each column is a property-name string or an accessor callback.\n // The string-literal union accumulates into `TKey` and lands in\n // the `EXTRA_TYPE_BRAND` under `TName` as `readonly TKey[]`.\n // When `TBase` is an `ObjectSchemaBuilder` the callback `t` is\n // typed as `PropertyDescriptorTree<TBase, TBase>` so callers get\n // IDE autocomplete over the schema's own properties.\n <const TName extends string & A[0], const TKey extends string>(\n name: TName,\n ...columns: ReadonlyArray<\n | TKey\n | (TBase extends ObjectSchemaBuilder<\n any,\n any,\n any,\n any,\n any\n >\n ? (t: PropertyDescriptorTree<TBase, TBase>) => any\n : (t: any) => any)\n >\n ) => TBase &\n FixedMethods<\n TRawMethods,\n TBase,\n TAccum,\n TExtraTypes & Record<TName, readonly TKey[]>\n > &\n HiddenExtensionMethods & {\n readonly [EXTRA_TYPE_BRAND]?: TExtraTypes &\n Record<TName, readonly TKey[]>;\n } & ([TAccum] extends [never]\n ? {}\n : { readonly [METHOD_LITERAL_BRAND]?: TAccum })\n : R extends { readonly [METHOD_LITERAL_BRAND]?: any }\n ? // Literal-brand method: becomes const-generic so the first-arg\n // literal accumulates in TAccum and in the [METHOD_LITERAL_BRAND]\n // property of the return type.\n <const TName extends string & A[0]>(\n name: TName,\n ...rest: TailArgs<A>\n ) => TBase &\n FixedMethods<\n TRawMethods,\n TBase,\n TAccum | TName,\n TExtraTypes\n > &\n HiddenExtensionMethods & {\n readonly [METHOD_LITERAL_BRAND]?: TAccum | TName;\n } & ([keyof TExtraTypes] extends [never]\n ? {}\n : { readonly [EXTRA_TYPE_BRAND]?: TExtraTypes })\n : // Regular method: threads both accumulators through so literals\n // defined earlier in the chain are not lost.\n (\n ...args: A\n ) => TBase &\n FixedMethods<TRawMethods, TBase, TAccum, TExtraTypes> &\n HiddenExtensionMethods &\n ([TAccum] extends [never]\n ? {}\n : { readonly [METHOD_LITERAL_BRAND]?: TAccum }) &\n ([keyof TExtraTypes] extends [never]\n ? {}\n : { readonly [EXTRA_TYPE_BRAND]?: TExtraTypes })\n : TRawMethods[K];\n};\n\n/**\n * Produces the consumer-facing type for an extended builder: the base\n * builder intersected with its fixed extension methods, with\n * `withExtension` / `getExtension` overridden to `never` so they\n * don't appear as callable in consumer code.\n */\nexport type CleanExtended<TBuilder, TExt> = MetadataExtended<TBuilder, TExt>;\n\n// -- Factory types that return builders with corrected extension methods ------\n\ntype ExtendedStringFactory<TExt> = {\n (): CleanExtended<\n StringSchemaBuilder<string, true, false, false, TExt>,\n TExt\n >;\n <T extends string>(\n equals: T\n ): CleanExtended<StringSchemaBuilder<T, true, false, false, TExt>, TExt>;\n};\n\ntype ExtendedNumberFactory<TExt> = {\n (): CleanExtended<\n NumberSchemaBuilder<number, true, false, false, TExt>,\n TExt\n >;\n <T extends number>(\n equals: T\n ): CleanExtended<NumberSchemaBuilder<T, true, false, false, TExt>, TExt>;\n};\n\ntype ExtendedBooleanFactory<TExt> = () => CleanExtended<\n BooleanSchemaBuilder<boolean, true, false, undefined, false, TExt>,\n TExt\n>;\n\ntype ExtendedDateFactory<TExt> = () => CleanExtended<\n DateSchemaBuilder<Date, true, false, false, TExt>,\n TExt\n>;\n\ntype ExtendedObjectFactory<TExt> = <\n P extends Record<string, SchemaBuilder<any, any, any, any, any>>\n>(\n properties?: P\n) => CleanExtended<\n ObjectSchemaBuilder<P, true, false, undefined, false, TExt, []>,\n TExt\n>;\n\ntype ExtendedArrayFactory<TExt> = <\n TElementSchema extends SchemaBuilder<any, any, any, any, any>\n>(\n elementSchema?: TElementSchema\n) => CleanExtended<\n ArraySchemaBuilder<TElementSchema, true, false, undefined, false, TExt>,\n TExt\n>;\n\ntype ExtendedUnionFactory<TExt> = <\n T extends SchemaBuilder<any, any, any, any, any>\n>(\n schema: T\n) => CleanExtended<\n UnionSchemaBuilder<[T], true, false, undefined, false, TExt>,\n TExt\n>;\n\ntype ExtendedFuncFactory<TExt> = () => CleanExtended<\n FunctionSchemaBuilder<true, false, undefined, false, TExt>,\n TExt\n>;\n\ntype ExtendedAnyFactory<TExt> = () => CleanExtended<\n AnySchemaBuilder<true, false, undefined, false, TExt>,\n TExt\n>;\n\ntype ExtendedTupleFactory<TExt> = <\n const TElements extends readonly SchemaBuilder<any, any, any, any, any>[]\n>(\n elements: [...TElements]\n) => CleanExtended<\n TupleSchemaBuilder<TElements, true, false, undefined, false, TExt>,\n TExt\n>;\n\ntype ExtendedRecordFactory<TExt> = <\n TKeySchema extends StringSchemaBuilder<any, any, any, any>,\n TValueSchema extends SchemaBuilder<any, any, any, any, any>\n>(\n keySchema: TKeySchema,\n valueSchema: TValueSchema\n) => CleanExtended<\n RecordSchemaBuilder<\n TKeySchema,\n TValueSchema,\n true,\n false,\n undefined,\n false,\n TExt\n >,\n TExt\n>;\n\ntype ExtendedPromiseFactory<TExt> = <\n TSchema extends SchemaBuilder<any, any, any, any, any>\n>(\n resolvedTypeSchema?: TSchema\n) => CleanExtended<\n PromiseSchemaBuilder<true, false, undefined, false, TExt, TSchema>,\n TExt\n>;\n\ntype ExtendedGenericFactory<TExt> = <\n TFn extends (...args: any[]) => SchemaBuilder<any, any, any, any, any>\n>(\n templateFn: TFn\n) => CleanExtended<\n GenericSchemaBuilder<TFn, true, false, undefined, false, TExt>,\n TExt\n>;\n\n/**\n * The return type of {@link withExtensions}.\n *\n * Contains a factory function for every builder type (`string`, `number`,\n * `boolean`, `date`, `object`, `array`, `union`, `func`, `any`). Each\n * factory returns a builder whose type includes the methods contributed\n * by all provided extension descriptors.\n *\n * @typeParam TExts - Tuple of extension descriptors passed to `withExtensions`.\n *\n * @see {@link withExtensions}\n */\ntype WithExtensionsResult<TExts extends readonly ExtensionDescriptor<any>[]> = {\n string: ExtendedStringFactory<MergeExtensionMethods<TExts, 'string'>>;\n number: ExtendedNumberFactory<MergeExtensionMethods<TExts, 'number'>>;\n boolean: ExtendedBooleanFactory<MergeExtensionMethods<TExts, 'boolean'>>;\n date: ExtendedDateFactory<MergeExtensionMethods<TExts, 'date'>>;\n object: ExtendedObjectFactory<MergeExtensionMethods<TExts, 'object'>>;\n array: ExtendedArrayFactory<MergeExtensionMethods<TExts, 'array'>>;\n tuple: ExtendedTupleFactory<MergeExtensionMethods<TExts, 'tuple'>>;\n record: ExtendedRecordFactory<MergeExtensionMethods<TExts, 'record'>>;\n union: ExtendedUnionFactory<MergeExtensionMethods<TExts, 'union'>>;\n func: ExtendedFuncFactory<MergeExtensionMethods<TExts, 'func'>>;\n any: ExtendedAnyFactory<MergeExtensionMethods<TExts, 'any'>>;\n promise: ExtendedPromiseFactory<MergeExtensionMethods<TExts, 'promise'>>;\n generic: ExtendedGenericFactory<MergeExtensionMethods<TExts, 'generic'>>;\n};\n\n// ---------------------------------------------------------------------------\n// Reserved method names — cannot be overridden by extensions\n// ---------------------------------------------------------------------------\n\n/**\n * Method names on `SchemaBuilder` that extensions are **not** allowed to\n * override. An error is thrown at definition time if an extension tries\n * to use any of these names.\n *\n * @internal\n */\nconst RESERVED_METHODS = new Set([\n 'validate',\n 'validateAsync',\n 'parse',\n 'parseAsync',\n 'safeParse',\n 'safeParseAsync',\n 'introspect',\n 'optional',\n 'required',\n 'addPreprocessor',\n 'clearPreprocessors',\n 'addValidator',\n 'clearValidators',\n 'hasType',\n 'clearHasType',\n 'createFromProps',\n 'preValidate',\n 'preValidateSync',\n 'preValidateAsync',\n 'getValidationErrorMessage',\n 'getValidationErrorMessageSync',\n 'assureValidationErrorMessageProvider',\n 'withExtension',\n 'getExtension'\n]);\n\n// ---------------------------------------------------------------------------\n// defineExtension()\n// ---------------------------------------------------------------------------\n\n/**\n * Defines an extension targeting one or more schema builder types.\n *\n * Each extension is a plain object keyed by builder type name (`\"string\"`,\n * `\"number\"`, `\"date\"`, …) whose values are method implementations.\n * Methods receive `this` bound to the builder instance and must return a\n * builder to support fluent chaining.\n *\n * ## Ergonomic metadata (auto-infer)\n *\n * Extension methods **do not** have to call `this.withExtension()`. The\n * system wraps each method and automatically attaches\n * `withExtension(methodName, args)` to the returned builder when the key\n * is not already present. This eliminates the most common source of\n * duplication in extension code.\n *\n * - **Zero-arg methods** → metadata value is `true`\n * - **Single-arg methods** → metadata value is the argument itself\n * - **Multi-arg methods** → metadata value is the arguments array\n *\n * If you need **custom metadata** (e.g. a different key, a transformed\n * value, or a structured object), call `this.withExtension(key, value)`\n * explicitly inside the method — the auto-infer logic detects the existing\n * key and skips automatic attachment.\n *\n * ## Validation\n *\n * `defineExtension` validates the configuration eagerly:\n * - Unknown builder type names throw immediately.\n * - {@link RESERVED_METHODS | Reserved method names} (e.g. `validate`,\n * `introspect`) cannot be overridden.\n * - Non-function values in the method record are rejected.\n *\n * @param config - An {@link ExtensionConfig} object mapping builder type\n * names to method records.\n * @returns A branded {@link ExtensionDescriptor} ready to pass to\n * {@link withExtensions}.\n *\n * @example Simple extension (auto-inferred metadata)\n * ```ts\n * const slugExt = defineExtension({\n * string: {\n * slug(this: StringSchemaBuilder) {\n * return this.addValidator((val) => {\n * const valid = /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(val);\n * return { valid, errors: valid ? [] : [{ message: 'invalid slug' }] };\n * });\n * }\n * }\n * });\n *\n * // Usage:\n * const s = withExtensions(slugExt);\n * const schema = s.string().slug();\n * schema.introspect().extensions.slug; // true\n * ```\n *\n * @example Extension with custom metadata\n * ```ts\n * const currencyExt = defineExtension({\n * number: {\n * currency(this: NumberSchemaBuilder, opts?: { maxDecimals?: number }) {\n * const maxDec = opts?.maxDecimals ?? 2;\n * return this.withExtension('currency', { maxDecimals: maxDec })\n * .min(0)\n * .addValidator((val) => {\n * const decimals = (String(val).split('.')[1] ?? '').length;\n * const valid = decimals <= maxDec;\n * return { valid, errors: valid ? [] : [{ message: `max ${maxDec} decimals` }] };\n * });\n * }\n * }\n * });\n * ```\n *\n * @example Multi-builder extension\n * ```ts\n * const myExt = defineExtension({\n * string: {\n * email(this: StringSchemaBuilder) { return this.addValidator(...); }\n * },\n * number: {\n * port(this: NumberSchemaBuilder) { return this.isInteger().min(1).max(65535); }\n * }\n * });\n * ```\n *\n * @throws {Error} If a builder type name is unknown.\n * @throws {Error} If a method name is reserved.\n * @throws {Error} If a method value is not a function.\n *\n * @see {@link withExtensions} — apply the defined extension\n * @see {@link ExtensionConfig} — configuration shape\n */\nexport function defineExtension<T extends ExtensionConfig>(\n config: T\n): ExtensionDescriptor<T> {\n // Validate at definition time and wrap methods for auto-infer extension key\n const wrappedConfig: any = {};\n for (const builderName of Object.keys(config) as BuilderTypeName[]) {\n if (!(builderName in builderClasses)) {\n throw new Error(\n `Unknown builder type \"${builderName}\". Valid types: ${Object.keys(builderClasses).join(', ')}`\n );\n }\n\n const methods = config[builderName];\n if (!methods || typeof methods !== 'object') {\n throw new Error(\n `Extension config for \"${builderName}\" must be an object of methods`\n );\n }\n\n wrappedConfig[builderName] = {};\n for (const methodName of Object.keys(methods)) {\n if (RESERVED_METHODS.has(methodName)) {\n throw new Error(\n `Cannot override reserved method \"${methodName}\" on \"${builderName}\"`\n );\n }\n const origMethod = methods[methodName];\n if (typeof origMethod !== 'function') {\n throw new Error(\n `Extension method \"${builderName}.${methodName}\" must be a function`\n );\n }\n if (isMetadataMethod(origMethod)) {\n wrappedConfig[builderName][methodName] = origMethod;\n continue;\n }\n // Wrap the method to auto-infer extension key if not already set\n wrappedConfig[builderName][methodName] = function (\n this: any,\n ...args: any[]\n ) {\n const result = (origMethod as any).apply(this, args);\n // If result is a builder and does not have the extension key, auto-apply withExtension\n if (\n result &&\n typeof result === 'object' &&\n typeof result.withExtension === 'function' &&\n // Only auto-apply if the extension key is not already present\n (typeof result.getExtension !== 'function' ||\n result.getExtension(methodName) === undefined)\n ) {\n // Only auto-apply if the original method did not call withExtension\n return result.withExtension(\n methodName,\n args.length === 1\n ? args[0]\n : args.length === 0\n ? true\n : args\n );\n }\n return result;\n };\n }\n }\n\n return { config: wrappedConfig } as ExtensionDescriptor<T>;\n}\n\n// ---------------------------------------------------------------------------\n// withExtensions()\n// ---------------------------------------------------------------------------\n\n/**\n * Creates a set of schema factory functions with the provided extensions\n * applied.\n *\n * Each factory function (`string()`, `number()`, `date()`, …) returned by\n * `withExtensions` produces builder instances whose prototypes include the\n * extension methods. All built-in builder methods remain available and\n * fully chainable alongside the new ones.\n *\n * ## Stacking multiple extensions\n *\n * Pass any number of {@link ExtensionDescriptor}s — their methods are\n * merged per builder type. If two extensions define the **same** method\n * name on the same builder type, a runtime error is thrown to prevent\n * silent conflicts.\n *\n * ## Type safety\n *\n * The return type is fully inferred: TypeScript knows exactly which\n * extension methods are available on each builder factory. Extension\n * methods return the full extended builder type, so chaining like\n * `s.string().email().slug().minLength(3)` is fully typed.\n *\n * ## Builder types without extensions\n *\n * Builders that have no methods from any of the provided extensions\n * use the standard (unextended) factory, so there is zero overhead.\n *\n * @param extensions - One or more {@link ExtensionDescriptor}s created\n * by {@link defineExtension}.\n * @returns An object with factory functions for all builder types\n * (`string`, `number`, `boolean`, `date`, `object`, `array`, `union`,\n * `func`, `any`), each returning augmented builders.\n *\n * @example Basic usage\n * ```ts\n * const s = withExtensions(emailExt, rangeExt);\n *\n * // string() now has .email()\n * const emailSchema = s.string().email().minLength(5);\n *\n * // number() now has .range()\n * const rangeSchema = s.number().range(0, 100);\n *\n * // builders without targeted extensions work as normal\n * const dateSchema = s.date();\n * ```\n *\n * @example Stacking extensions on the same builder\n * ```ts\n * const s = withExtensions(emailExt, slugExt, trimmedExt);\n * const schema = s.string().email().slug().trimmed();\n * ```\n *\n * @example Using extensions in object schemas\n * ```ts\n * const s = withExtensions(emailExt, portExt);\n * const ServerConfig = s.object({\n * host: s.string().email(),\n * port: s.number().port()\n * });\n * ```\n *\n * @throws {Error} If two extensions define the same method name on the\n * same builder type.\n *\n * @see {@link defineExtension} — create extension descriptors\n * @see {@link ExtensionDescriptor}\n */\nexport function withExtensions<\n const TExts extends readonly ExtensionDescriptor<any>[]\n>(...extensions: TExts): WithExtensionsResult<TExts> {\n // Collect all methods per builder type and check for collisions\n const methodsByBuilder = new Map<BuilderTypeName, Map<string, Function>>();\n\n for (const ext of extensions) {\n for (const builderName of Object.keys(\n ext.config\n ) as BuilderTypeName[]) {\n if (!methodsByBuilder.has(builderName)) {\n methodsByBuilder.set(builderName, new Map());\n }\n const methods = methodsByBuilder.get(builderName)!;\n const extMethods = ext.config[builderName]!;\n\n for (const methodName of Object.keys(extMethods)) {\n if (methods.has(methodName)) {\n throw new Error(\n `Extension method collision: \"${methodName}\" is defined by multiple extensions for \"${builderName}\"`\n );\n }\n methods.set(methodName, extMethods[methodName]);\n }\n }\n }\n\n // For each builder type, create a dynamic subclass if there are extension methods\n const factories: Record<string, (...args: any[]) => any> = {};\n\n for (const builderName of Object.keys(\n builderClasses\n ) as BuilderTypeName[]) {\n const methods = methodsByBuilder.get(builderName);\n\n if (!methods || methods.size === 0) {\n // No extensions for this builder type — use the standard factory\n factories[builderName] = builderFactories[builderName];\n continue;\n }\n\n const BaseClass = builderClasses[builderName] as any;\n\n // Create a dynamic subclass\n const ExtendedClass = class extends BaseClass {\n constructor(...args: any[]) {\n super(...args);\n }\n\n static create(props: any) {\n return new ExtendedClass({\n ...props\n });\n }\n\n protected createFromProps(props: any): any {\n return ExtendedClass.create(props);\n }\n };\n\n // Add extension methods to the subclass prototype\n for (const [methodName, methodFn] of methods) {\n Object.defineProperty(ExtendedClass.prototype, methodName, {\n value: methodFn,\n writable: true,\n configurable: true,\n enumerable: false\n });\n }\n\n // Create a factory that uses the extended class\n factories[builderName] = (...args: any[]) => {\n // Delegate to the original factory to get an initialized instance,\n // then upgrade its prototype so it gains the extension methods.\n // Note: Object.setPrototypeOf can cause V8 hidden-class deoptimization\n // on the mutated object, but avoids the double allocation and\n // introspect() round-trip of the previous approach.\n const original = builderFactories[builderName](...args);\n Object.setPrototypeOf(original, ExtendedClass.prototype);\n return original;\n };\n }\n\n return factories as WithExtensionsResult<TExts>;\n}\n"],"mappings":"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","names":["GenericSchemaBuilder","_GenericSchemaBuilder","SchemaBuilder","#templateFn","#defaults","#cachedDefaultSchema","props","args","#getOrCreateDefaultSchema","#buildResult","superResult","context","valid","preValidationTransaction","errors","objToValidate","defaultSchema","#buildAsyncResult","object","_notUsed","errorMessage","value","_name","generic","fnOrDefaults","templateFn","fn","defaults","metadataMethods","isMetadataMethod","method","defineMetadataMethod","key","compute","apply","args","value","builderClasses","StringSchemaBuilder","NumberSchemaBuilder","BooleanSchemaBuilder","DateSchemaBuilder","ObjectSchemaBuilder","ArraySchemaBuilder","TupleSchemaBuilder","RecordSchemaBuilder","UnionSchemaBuilder","FunctionSchemaBuilder","AnySchemaBuilder","PromiseSchemaBuilder","GenericSchemaBuilder","builderFactories","string","number","boolean","date","object","array","tuple","record","union","func","any","promise","generic","METHOD_LITERAL_BRAND","EXTRA_TYPE_BRAND","RESERVED_METHODS","defineExtension","config","wrappedConfig","builderName","builderClasses","methods","methodName","origMethod","isMetadataMethod","args","result","withExtensions","extensions","methodsByBuilder","ext","extMethods","factories","builderFactories","BaseClass","ExtendedClass","props","methodFn","original"]}
|
|
@@ -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{c as P,d as B,f as S}from"./chunk-2BKBVVZ3.js";var O=class{#e;#t;#n=[];#i=[];get seenValue(){let e=this.#e[P].getValue(this.#t);return e.success?e.value:void 0}get errors(){return this.#n}get isValid(){return this.#n.length===0&&this.getChildErrors().length===0}getChildErrors(){return this.#i}get descriptor(){return this.#e[P]}constructor(e,r,t){if(!b.isValidPropertyDescriptor(e))throw new Error("Invalid property descriptor");this.#e=e,this.#n=Array.isArray(t)?[...t]:[],this.#t=r}addError(e){this.#n.push(e)}addChildError(e){this.#i.push(e)}toJSON(){return{isValid:this.isValid,errors:this.errors}}};var q="must be an object",b=class p extends S{#e={};#t=!1;#n=[];#i=[];[B]=!0;#a=new WeakMap;static create(e){return new p({type:"object",...e})}createFromProps(e){return p.create(e)}constructor(e){super(e),typeof e.properties=="object"&&e.properties&&(this.#e=e.properties,this.#n=Object.keys(e.properties)),typeof e.acceptUnknownProps=="boolean"&&(this.#t=e.acceptUnknownProps),Array.isArray(e.constructorSchemas)&&(this.#i=e.constructorSchemas.filter(r=>r instanceof S))}introspect(){return{...super.introspect(),properties:{...this.#e},acceptUnknownProps:this.#t,constructorSchemas:[...this.#i]}}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()}#s(e){p.isValidPropertyDescriptor(e?.context?.rootPropertyDescriptor)||(e.context.rootPropertyDescriptor=p.getPropertiesFor(this)),p.isValidPropertyDescriptor(e.context.currentPropertyDescriptor)||(e.context.currentPropertyDescriptor=e.context.rootPropertyDescriptor),!e.context.rootValidationObject&&e.transaction?.object?.validatedObject&&(e.context.rootValidationObject=e.transaction.object.validatedObject)}preValidateSync(e,r){let t=super.preValidateSync(e,r);return this.#s(t),t}async preValidateAsync(e,r){let t=await super.preValidateAsync(e,r);return this.#s(t),t}#o(e){let{valid:r,context:t,transaction:n,errors:i}=e,y=new WeakMap,c=new Set,{doNotStopOnFirstError:a,rootValidationObject:o}=t,s=t.rootPropertyDescriptor,d=t.currentPropertyDescriptor,f=(h,m,R)=>{if(!p.isValidPropertyDescriptor(h))throw new Error("invalid property descriptor");let g=y.has(h)?y.get(h):null;if(g||(g=new O(h,o),y.set(h,g)),g.addError(m),c.add(g),R&&p.isValidPropertyDescriptor(R)){let v=y.has(R)?y.get(R):null;v||(v=new O(R,o),y.set(R,v)),v.addChildError(g)}},u=(h=>{let m=typeof h=="function"?h(d):d;if(!p.isValidPropertyDescriptor(m))throw new Error("invalid property descriptor");return y.has(m)||y.set(m,new O(m,o)),y.get(m)}),l=()=>[...c].filter(h=>h.errors.length>0),T=e.errors||[],E=h=>{if(typeof h.property=="function"&&p.isValidPropertyDescriptor(d)){let m=h.property(d);if(p.isValidPropertyDescriptor(m)){f(m,h.message,d);return}}p.isValidPropertyDescriptor(d)&&f(d,h.message)};if(!r&&!a&&i){for(let h of i)E(h);return{earlyReturn:!0,result:{valid:r,errors:i,getErrorsFor:u,getInvalidProperties:l}}}if(a&&i)for(let h of i)E(h);let{object:{validatedObject:x}}=n;if(typeof x>"u"&&!this.isRequired||x===null&&(!this.isRequired||this.isNullable))return{earlyReturn:!0,result:{valid:!0,object:n.commit().validatedObject,getErrorsFor:u,getInvalidProperties:l}};if(typeof x!="object"||x===null)return T.length===0&&(T.push({message:q}),f(d,q)),n&&n.rollback(),{earlyReturn:!0,result:{valid:!1,errors:a?T:[T[0]],getErrorsFor:u,getInvalidProperties:l}};let V=this.#n,j=Object.keys(x);if(V.length===0){if(j.length===0)return a&&T.length>0?{earlyReturn:!0,result:{valid:!1,errors:T,getErrorsFor:u,getInvalidProperties:l}}:(n&&n.commit().validatedObject,{earlyReturn:!0,result:{valid:!0,object:{},getErrorsFor:u,getInvalidProperties:l}});if(!this.#t){for(let h=0;h<j.length;h++){let m=`unknown property '${j[h]}'`;if(T.push({message:m}),!a)break}return n&&n.rollback(),{earlyReturn:!0,result:{valid:!1,errors:a?T:[T[0]],getErrorsFor:u,getInvalidProperties:l}}}return n&&n.commit(),{earlyReturn:!0,result:{valid:!0,object:{...x},getErrorsFor:u,getInvalidProperties:l}}}return{earlyReturn:!1,errors:T,objToValidate:x,propKeys:V,objKeys:j,addErrorFor:f,getErrorsFor:u,getInvalidProperties:l,doNotStopOnFirstError:!!a,rootPropertyDescriptor:s,currentPropertyDescriptor:d,validationTransaction:n}}#y(e,r){let{objToValidate:t,objKeys:n,addErrorFor:i,getErrorsFor:y,getInvalidProperties:c,doNotStopOnFirstError:a,currentPropertyDescriptor:o,validationTransaction:s}=e,d=e.errors,f=!1;for(let{result:u}of r)if(!u.valid&&(f=!0,Array.isArray(u.errors)))for(let l of u.errors)d.push(l);for(let u=0;u<n.length;u++){let l=n[u];if(!(l in this.#e)&&!this.#t){let T=`unknown property '${l}'`;if(d.push({message:T}),i(o,T),!a)return s&&s.rollback(),{valid:!1,errors:[d[0]],getErrorsFor:y,getInvalidProperties:c}}}if(!f&&d.length===0){let u={};for(let{key:l,result:T}of r)u[l]=T.object;if(this.#t)for(let l of n)l in this.#e||(u[l]=t[l]);return{valid:!0,object:u,getErrorsFor:y,getInvalidProperties:c}}for(let{key:u,result:l}of r)if(!l.valid){let T=o[u];if(typeof l.getErrorsFor=="function"&&p.isValidPropertyDescriptor(T)){if(p.#c(l,T,i),Array.isArray(l.__externErrorPropertyNames)&&Array.isArray(l.errors))for(let E of l.errors)i(T,E.message,o)}else if(Array.isArray(l.errors)&&p.isValidPropertyDescriptor(T)){for(let E of l.errors)i(T,E.message);Array.isArray(l.getNestedErrors?.())&&p.#l(l,T,i)}}return s.rollback(),{valid:!1,errors:a?d:d[0]?[d[0]]:[],getErrorsFor:y,getInvalidProperties:c}}addValidator(e,r){return super.addValidator(e,r)}validate(e,r){return super.validate(e,r)}async validateAsync(e,r){return super.validateAsync(e,r)}_validate(e,r){if(this.canSkipPreValidation&&!r?.doNotStopOnFirstError&&!r?.rootPropertyDescriptor){if(typeof e>"u"||e===null)if(typeof e>"u"&&this.hasDefault)e=this.resolveDefaultValue();else if(!this.isRequired||e===null&&this.isNullable){let t=this;return{valid:!0,object:e,getErrorsFor(n){return t.#r(e,r).getErrorsFor(n)},getInvalidProperties(){return t.#r(e,r).getInvalidProperties()}}}else{let t=this;return{valid:!1,errors:[{message:this.getValidationErrorMessageSync(this.requiredErrorMessage,e)}],getErrorsFor(n){return t.#r(e,r).getErrorsFor(n)},getInvalidProperties(){return t.#r(e,r).getInvalidProperties()}}}else if(typeof e=="object"){let t=this.#n;if(!this.#t){let y=Object.keys(e);for(let c=0;c<y.length;c++)if(!(y[c]in this.#e)){let a=this;return{valid:!1,errors:[{message:`unknown property '${y[c]}'`}],getErrorsFor(o){return a.#r(e,r).getErrorsFor(o)},getInvalidProperties(){return a.#r(e,r).getInvalidProperties()}}}}let n={};for(let y=0;y<t.length;y++){let c=t[y],a=this.#e[c].validate(e[c]);if(!a.valid){let o=this;return{valid:!1,errors:a.errors&&a.errors.length>0?[a.errors[0]]:[],getErrorsFor(s){return o.#r(e,r).getErrorsFor(s)},getInvalidProperties(){return o.#r(e,r).getInvalidProperties()}}}n[c]=a.object}if(this.#t){let y=Object.keys(e);for(let c=0;c<y.length;c++)y[c]in this.#e||(n[y[c]]=e[y[c]])}let i=this;return{valid:!0,object:n,getErrorsFor(y){return i.#r(e,r).getErrorsFor(y)},getInvalidProperties(){return i.#r(e,r).getInvalidProperties()}}}}return this.#r(e,r)}#r(e,r){let t=this.#o(this.preValidateSync(e,r));if(t.earlyReturn)return t.result;let{propKeys:n,objToValidate:i,doNotStopOnFirstError:y,rootPropertyDescriptor:c,currentPropertyDescriptor:a}=t,o=[];for(let s of n){let d=this.#e[s].validate(i[s],{...r,rootPropertyDescriptor:c,currentPropertyDescriptor:a[s]});if(o.push({key:s,result:d}),!d.valid&&!y)break}return this.#y(t,o)}async _validateAsync(e,r){let t=this.#o(await this.preValidateAsync(e,r));if(t.earlyReturn)return t.result;let{propKeys:n,objToValidate:i,doNotStopOnFirstError:y,rootPropertyDescriptor:c,currentPropertyDescriptor:a}=t,o=[];if(y){let s=await Promise.all(n.map(async d=>{let f=await this.#e[d].validateAsync(i[d],{...r,rootPropertyDescriptor:c,currentPropertyDescriptor:a[d]});return{key:d,result:f}}));o.push(...s)}else for(let s of n){let d=await this.#e[s].validateAsync(i[s],{...r,rootPropertyDescriptor:c,currentPropertyDescriptor:a[s]});if(o.push({key:s,result:d}),!d.valid)break}return this.#y(t,o)}acceptUnknownProps(){return this.derive({...this.introspect(),acceptUnknownProps:!0})}notAcceptUnknownProps(){return this.derive({...this.introspect(),acceptUnknownProps:!1})}hasType(e){return this.derive({...this.introspect()},!0)}clearHasType(){return this.derive({...this.introspect()},!0)}addConstructor(e){if(!(e instanceof S))throw new Error("schema must be an instance of the SchemaBuilder class");return this.derive({...this.introspect(),constructorSchemas:[...this.#i,e]})}clearConstructors(){return this.derive({...this.introspect(),constructorSchemas:[]})}addProp(e,r){if(typeof e!="string"||!e)throw new Error("propName must be a non empty string");if(e in this.#e)throw new Error(`Property ${e} already exists`);if(!(r instanceof S))throw new Error("schema must be an instance of the SchemaBuilder class");return this.derive({...this.introspect(),properties:{...this.introspect().properties,[e]:r}})}optimize(){return this.derive({...this.introspect()},!0)}addProps(e){if(e instanceof p)return this.addProps(e.introspect().properties);if(typeof e!="object")throw new Error("props should be an object");if(e===null)throw new Error("props should not be null");let r={...this.#e};for(let t in e){if(t in this.#e)throw new Error(`property '${t}' already exists`);if(!(e[t]instanceof S))throw new Error(`${t} is not a SchemaBuilder`);r[t]=e[t]}return this.derive({...this.introspect(),properties:r})}omit(e){if(typeof e=="string"){let r=e;if(!r||!(r in this.#e))throw new Error(`property ${r.toString()} does not exists in the schema`);return this.derive({...this.introspect(),properties:(()=>{let t={...this.#e};return delete t[r],t})()})}else if(Array.isArray(e)){let r=e,t=new Map;if(r.forEach(i=>{if(typeof i!="string"||!i)throw new Error("property name must be a string");if(!(i in this.#e))throw new Error(`property ${i.toString()} does not exists in the schema`);t.set(i.toString(),!0)}),t.size===0)throw new Error("please provide at least one property to omit");let n={...this.introspect()};for(let i of t.keys())delete n.properties[i];return this.derive(n)}else if(e instanceof p){let r={...e.introspect().properties},t={...this.introspect()};for(let n in r)n in t.properties&&delete t.properties[n];return this.derive(t)}throw new Error("this parameter type is not supported")}intersect(e){if(!(e instanceof p))throw new Error("schema must be an instance of the ObjectSchemaBuilder class");let r=e.introspect().properties,t=this.introspect(),n=Object.keys(t.properties).reduce((i,y)=>(i[y]=y in r?r[y]:t.properties[y],i),{});return this.derive({...this.introspect(),properties:n})}partial(e){if(typeof e>"u"||e===null)return this.derive({...this.introspect(),properties:Object.keys(this.#e).reduce((r,t)=>(r[t]=this.#e[t].optional(),r),{})});if(Array.isArray(e)){let r=e;if(r.length===0)throw new Error("properties cannot be empty");let t={...this.introspect()};return r.forEach(n=>{if(typeof n!="string")throw new Error("each propery in property list must be as string value");if(!(n in t.properties))throw new Error(`property ${n} does not exists`);t.properties[n]=t.properties[n].optional()}),this.derive(t)}if(typeof e=="string")return this.modifyPropSchema(e,r=>r.optional());throw new Error("expecting string or string[] parameter")}deepPartial(){let e={};for(let r of Object.keys(this.#e)){let t=this.#e[r];t instanceof p?e[r]=t.deepPartial().optional():e[r]=t.optional()}return this.derive({...this.introspect(),properties:e})}pick(e){if(typeof e=="string"){let r=e;if(!r)throw new Error("property cannot be empty");if(!(r in this.#e))throw new Error(`property ${r} does not exists`);return this.derive({...this.introspect(),properties:{[r]:this.#e[r]}})}if(Array.isArray(e)){if(e.length===0)throw new Error("properties must be a non empty erray");let r=e.reduce((t,n)=>{if(typeof n!="string"||!n)throw new Error("each property name must be a non empty string");if(!(n in this.#e))throw new Error(`property ${n} does not exists`);return t[n]=this.#e[n],t},{});return this.derive({...this.introspect(),properties:r})}if(e instanceof p){let t=Object.keys(e.introspect().properties).filter(n=>typeof this.#e[n]<"u");if(t.length===0)throw new Error("there are no common properties in provided schemas");return this.pick(t)}throw new Error("string, array or ObjectSchemaBuilder is expected")}modifyPropSchema(e,r){if(typeof e!="string"||!e)throw new Error("propName must be a non empty string");if(!(e in this.#e))throw new Error(`property ${e} does not exists in the schema`);if(typeof r!="function")throw new Error("callback must be a function");let t=r(this.#e[e]);if(!(t instanceof S))throw new Error("callback must return a SchemaBuilder object");let n={...this.introspect()};return n.properties={...n.properties,[e]:t},this.derive(n)}makePropOptional(e){return this.modifyPropSchema(e,r=>r.optional())}makePropRequired(e){return this.modifyPropSchema(e,r=>r.required())}makeAllPropsOptional(){return this.derive({...this.introspect(),properties:Object.keys(this.#e).reduce((e,r)=>(e[r]=this.#e[r].optional(),e),{})})}makeAllPropsRequired(){return this.derive({...this.introspect(),properties:Object.keys(this.#e).reduce((e,r)=>(e[r]=this.#e[r].required(),e),{})})}static#p(e,r,t,n,i){let y=e.introspect();if(!y.properties)return{};let c=Object.keys(y.properties);if(c.length===0)return{};typeof r!="function"&&(r=o=>o);let a=D((o,s)=>(t||r)(o,s),n,e,i);for(let o of c){let s=y.properties[o];if(s instanceof p){let d=s.introspect().properties;d&&typeof d=="object"&&Object.keys(d).length>0?a[o]=p.#p(s,(f,u)=>{let l=r(f,u);return l?(u&&!l[o]&&(l[o]={}),l[o]):null},r,o,a[P]):a[o]=D(r,o,s,a[P])}else if(s.introspect().type==="array")a[o]=k(s,r,o,a[P]);else if(s[B]===!0){let d=D(r,o,s,a[P]),f=(u,l)=>{let T=r(u,l);return T?(l&&!T[o]&&(T[o]={}),T[o]):null};a[o]=w(d,f)}else a[o]=D(r,o,s,a[P])}return a}static getPropertiesFor(e){if(!(e instanceof p))throw new Error("schema must be an instance of the ObjectSchemaBuilder class");if(e.#a.has(e))return e.#a.get(e);let r=p.#p(e);return e.#a.set(e,r),r}static isValidPropertyDescriptor(e){return typeof e=="object"&&e!==null&&typeof e[P]=="object"}static#c(e,r,t){let i=p.#d(r).introspect().properties,y;if(i)y=Object.keys(i);else if(Array.isArray(e.__externErrorPropertyNames))y=e.__externErrorPropertyNames;else return;for(let c of y){let a=r[c];if(!p.isValidPropertyDescriptor(a))continue;let o=e.getErrorsFor(()=>a);if(!o.isValid)for(let s of o.errors)t(a,s,r);if(a[P].getSchema()?.introspect().type==="array"&&typeof e.getInvalidProperties=="function"){let s=a[P].toJsonPointer()+"/";for(let d of e.getInvalidProperties()){let f=d.descriptor.toJsonPointer();if(!f.startsWith(s))continue;let u=f.slice(s.length).split("/").reduce((l,T)=>l?.[T.replace(/~1/g,"/").replace(/~0/g,"~")],a);if(p.isValidPropertyDescriptor(u))for(let l of d.errors)t(u,l,a)}}if(i){let s=i[c];(s instanceof p||s[B]===!0)&&typeof e.getErrorsFor=="function"&&p.isValidPropertyDescriptor(a)&&p.#c(e,a,t)}}}static#l(e,r,t){let n=e.getNestedErrors?.();Array.isArray(n)&&n.forEach((i,y)=>{let c=r[y];if(!(!i||i.valid||!p.isValidPropertyDescriptor(c)))if(typeof i.getInvalidProperties=="function"){let a=c[P].toJsonPointer();for(let o of i.getInvalidProperties()){let s=o.descriptor.toJsonPointer(),d=s===a?"":s.startsWith(a+"/")?s.slice(a.length):s,f=d===""?c:d.slice(1).split("/").reduce((u,l)=>u?.[l.replace(/~1/g,"/").replace(/~0/g,"~")],c);if(p.isValidPropertyDescriptor(f))for(let u of o.errors)t(f,u,r)}}else{for(let a of i.errors??[])t(c,a.message,r);p.#l(i,c,t)}})}static#d(e){if(!p.isValidPropertyDescriptor(e))throw new Error("descriptor is not a valid property descriptor");return e[P].getSchema()}nullable(){return super.nullable()}notNullable(){return super.notNullable()}},C=(p=>b.create({isRequired:!0,properties:p})),D=(p,e,r,t)=>({[P]:{setValue:(n,i,y)=>{let c=p(n,!!y?.createMissingStructure);return c?(typeof e=="string"&&(c[e]=i),!0):!1},getValue:n=>{let i=p(n,!1);return i?typeof e!="string"?{success:!0,value:i}:Object.hasOwn(i,e)?{success:!0,value:i[e]}:{success:!1}:{success:!1}},getSchema:()=>r,parent:t,propertyName:e,toJsonPointer:()=>{let n=[];typeof e=="string"&&n.push(e.replace(/~/g,"~0").replace(/\//g,"~1"));let i=t;for(;i;)typeof i.propertyName=="string"&&n.push(i.propertyName.replace(/~/g,"~0").replace(/\//g,"~1")),i=i.parent;return n.reverse(),n.length>0?"/"+n.join("/"):""}}}),k=(p,e,r,t)=>{let n=D(e,r,p,t),i=p.introspect(),y=(a,o)=>{let s=e(a,o);return!s||typeof s!="object"?null:(o&&(!Object.hasOwn(s,r)||s[r]==null)&&Object.defineProperty(s,r,{value:i.type==="array"?[]:{},enumerable:!0,writable:!0,configurable:!0}),Object.hasOwn(s,r)?s[r]:null)},c=n[P];if(i.type==="array"){let a=new Map;return new Proxy(n,{get(o,s,d){if(typeof s!="string"||!/^(0|[1-9]\d*)$/.test(s)||Number(s)>=4294967295)return Reflect.get(o,s,d);if(i.elementSchema)return a.has(s)||a.set(s,k(i.elementSchema,(f,u)=>{let l=y(f,u);return Array.isArray(l)?l:null},s,c)),a.get(s)}})}if(i.properties)for(let[a,o]of Object.entries(i.properties))Object.defineProperty(n,a,{value:k(o,y,a,c),enumerable:!0});else if(p[B])return w(n,y);return n},w=(p,e)=>new Proxy(p,{get(r,t,n){if(t===P)return r[P];if(typeof t=="string"&&!(t in r)){let i=D(e,t,void 0,r[P]),y=(c,a)=>{let o=e(c,a);return o!=null&&typeof o=="object"?(a&&!(t in o)&&(o[t]={}),o[t]):null};r[t]=w(i,y)}return Reflect.get(r,t,n)}});C.getPropertiesFor=p=>b.getPropertiesFor(p);C.isValidPropertyDescriptor=b.isValidPropertyDescriptor;export{b as a,C as b};
|
|
2
|
+
//# sourceMappingURL=chunk-JEBLDVKG.js.map
|