@cleverbrush/schema 0.0.0-beta-20260410073748

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.
Files changed (85) hide show
  1. package/README.md +1409 -0
  2. package/dist/builders/AnySchemaBuilder.d.ts +116 -0
  3. package/dist/builders/AnySchemaBuilder.js +2 -0
  4. package/dist/builders/AnySchemaBuilder.js.map +1 -0
  5. package/dist/builders/ArraySchemaBuilder.d.ts +214 -0
  6. package/dist/builders/ArraySchemaBuilder.js +2 -0
  7. package/dist/builders/ArraySchemaBuilder.js.map +1 -0
  8. package/dist/builders/BooleanSchemaBuilder.d.ts +146 -0
  9. package/dist/builders/BooleanSchemaBuilder.js +2 -0
  10. package/dist/builders/BooleanSchemaBuilder.js.map +1 -0
  11. package/dist/builders/DateSchemaBuilder.d.ts +277 -0
  12. package/dist/builders/DateSchemaBuilder.js +2 -0
  13. package/dist/builders/DateSchemaBuilder.js.map +1 -0
  14. package/dist/builders/ExternSchemaBuilder.d.ts +200 -0
  15. package/dist/builders/ExternSchemaBuilder.js +2 -0
  16. package/dist/builders/ExternSchemaBuilder.js.map +1 -0
  17. package/dist/builders/FunctionSchemaBuilder.d.ts +246 -0
  18. package/dist/builders/FunctionSchemaBuilder.js +2 -0
  19. package/dist/builders/FunctionSchemaBuilder.js.map +1 -0
  20. package/dist/builders/LazySchemaBuilder.d.ts +167 -0
  21. package/dist/builders/NullSchemaBuilder.d.ts +162 -0
  22. package/dist/builders/NumberSchemaBuilder.d.ts +273 -0
  23. package/dist/builders/NumberSchemaBuilder.js +2 -0
  24. package/dist/builders/NumberSchemaBuilder.js.map +1 -0
  25. package/dist/builders/ObjectSchemaBuilder.d.ts +517 -0
  26. package/dist/builders/ObjectSchemaBuilder.js +2 -0
  27. package/dist/builders/ObjectSchemaBuilder.js.map +1 -0
  28. package/dist/builders/PropertyValidationResult.d.ts +68 -0
  29. package/dist/builders/RecordSchemaBuilder.d.ts +341 -0
  30. package/dist/builders/RecordSchemaBuilder.js +2 -0
  31. package/dist/builders/RecordSchemaBuilder.js.map +1 -0
  32. package/dist/builders/SchemaBuilder.d.ts +947 -0
  33. package/dist/builders/StringSchemaBuilder.d.ts +291 -0
  34. package/dist/builders/StringSchemaBuilder.js +2 -0
  35. package/dist/builders/StringSchemaBuilder.js.map +1 -0
  36. package/dist/builders/TupleSchemaBuilder.d.ts +248 -0
  37. package/dist/builders/TupleSchemaBuilder.js +2 -0
  38. package/dist/builders/TupleSchemaBuilder.js.map +1 -0
  39. package/dist/builders/UnionSchemaBuilder.d.ts +227 -0
  40. package/dist/builders/UnionSchemaBuilder.js +2 -0
  41. package/dist/builders/UnionSchemaBuilder.js.map +1 -0
  42. package/dist/chunk-CTP4RHDG.js +2 -0
  43. package/dist/chunk-CTP4RHDG.js.map +1 -0
  44. package/dist/chunk-FWUEUW2N.js +2 -0
  45. package/dist/chunk-FWUEUW2N.js.map +1 -0
  46. package/dist/chunk-IJ6FO37G.js +2 -0
  47. package/dist/chunk-IJ6FO37G.js.map +1 -0
  48. package/dist/chunk-KESLT5EE.js +2 -0
  49. package/dist/chunk-KESLT5EE.js.map +1 -0
  50. package/dist/chunk-KFTO7TMB.js +2 -0
  51. package/dist/chunk-KFTO7TMB.js.map +1 -0
  52. package/dist/chunk-MKAYFPAR.js +2 -0
  53. package/dist/chunk-MKAYFPAR.js.map +1 -0
  54. package/dist/chunk-NXPH3ZUW.js +2 -0
  55. package/dist/chunk-NXPH3ZUW.js.map +1 -0
  56. package/dist/chunk-OOPF7RXS.js +2 -0
  57. package/dist/chunk-OOPF7RXS.js.map +1 -0
  58. package/dist/chunk-S5TC6NSU.js +2 -0
  59. package/dist/chunk-S5TC6NSU.js.map +1 -0
  60. package/dist/chunk-YWBNVHR6.js +2 -0
  61. package/dist/chunk-YWBNVHR6.js.map +1 -0
  62. package/dist/chunk-Z72HXYKX.js +2 -0
  63. package/dist/chunk-Z72HXYKX.js.map +1 -0
  64. package/dist/chunk-Z7QZ7IXT.js +2 -0
  65. package/dist/chunk-Z7QZ7IXT.js.map +1 -0
  66. package/dist/chunk-ZAN4ZHCJ.js +2 -0
  67. package/dist/chunk-ZAN4ZHCJ.js.map +1 -0
  68. package/dist/chunk-ZUPYV5TI.js +2 -0
  69. package/dist/chunk-ZUPYV5TI.js.map +1 -0
  70. package/dist/core.d.ts +23 -0
  71. package/dist/core.js +2 -0
  72. package/dist/core.js.map +1 -0
  73. package/dist/extension.d.ts +413 -0
  74. package/dist/extensions/array.d.ts +112 -0
  75. package/dist/extensions/enum.d.ts +190 -0
  76. package/dist/extensions/index.d.ts +108 -0
  77. package/dist/extensions/nullable.d.ts +26 -0
  78. package/dist/extensions/number.d.ts +228 -0
  79. package/dist/extensions/string.d.ts +332 -0
  80. package/dist/extensions/util.d.ts +45 -0
  81. package/dist/index.d.ts +7 -0
  82. package/dist/index.js +2 -0
  83. package/dist/index.js.map +1 -0
  84. package/dist/utils/transaction.d.ts +69 -0
  85. package/package.json +104 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/builders/StringSchemaBuilder.ts"],"sourcesContent":["import {\n type BRAND,\n type PreprocessorEntry,\n SchemaBuilder,\n type ValidationContext,\n type ValidationErrorMessageProvider,\n type ValidationResult,\n type ValidatorEntry\n} from './SchemaBuilder.js';\n\ntype StringSchemaBuilderCreateProps<\n T = string,\n R extends boolean = true\n> = Partial<ReturnType<StringSchemaBuilder<T, R>['introspect']>>;\n\n/**\n * Allows to define a schema for a string. It can be: required or optional,\n * restricted to be equal to a certain value, restricted to have a certain\n * length, restricted to start with a certain value, restricted to end with\n * a certain value, restricted to match a certain regular expression.\n *\n * **NOTE** this class is exported only to give opportunity to extend it\n * by inheriting. It is not recommended to create an instance of this class\n * directly. Use {@link string | string()} function instead.\n *\n * @example ```ts\n * const schema = string().equals('hello');\n * const result = schema.validate('hello');\n * // result.valid === true\n * // result.object === 'hello'\n * ```\n *\n * @example ```ts\n * const schema = string().equals('hello');\n * const result = schema.validate('world');\n * // result.valid === false\n * // result.errors[0].message === \"is expected to be equal to 'hello'\"\n * ```\n *\n * @example ```ts\n * const schema = string().minLength(5);\n * const result = schema.validate('hello');\n * // result.valid === true\n * // result.object === 'hello'\n * ```\n *\n * @example ```ts\n * const schema = string().minLength(5);\n * const result = schema.validate('hi');\n * // result.valid === false\n * // result.errors[0].message === 'is expected to have a length of at least 5'\n * ```\n *\n * @example ```ts\n * const schema = string().minLength(2).maxLength(5);\n * const result = schema.validate('yes');\n * // result.valid === true\n * // result.object === 'yes'\n * ```\n *\n * @example ```ts\n * const schema = string('no');\n * const result = schema.validate('yes');\n * // result.valid === false\n * // result.errors[0].message === \"is expected to be equal to 'no'\"\n * ```\n *\n * @see {@link string}\n */\nexport class StringSchemaBuilder<\n TResult = string,\n TRequired extends boolean = true,\n TNullable extends boolean = false,\n THasDefault extends boolean = false,\n TExtensions = {}\n> extends SchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n> {\n #minLength?: number;\n #defaultMinLengthErrorMessageProvider: ValidationErrorMessageProvider<\n StringSchemaBuilder<TResult, TRequired>\n > = function (this: StringSchemaBuilder) {\n return `is expected to have a length of at least ${this.#minLength} characters`;\n };\n #minLengthErrorMessageProvider: ValidationErrorMessageProvider<\n StringSchemaBuilder<TResult, TRequired>\n > = this.#defaultMinLengthErrorMessageProvider;\n\n #maxLength?: number;\n #defaultMaxLengthErrorMessageProvider: ValidationErrorMessageProvider<\n StringSchemaBuilder<TResult, TRequired>\n > = function (this: StringSchemaBuilder) {\n return `is expected to have a length of no more than ${this.#maxLength} characters`;\n };\n #maxLengthErrorMessageProvider: ValidationErrorMessageProvider<\n StringSchemaBuilder<TResult, TRequired>\n > = this.#defaultMaxLengthErrorMessageProvider;\n\n #equalsTo?: string;\n #defaultEqualsToErrorMessageProvider: ValidationErrorMessageProvider<\n StringSchemaBuilder<TResult, TRequired>\n > = function (this: StringSchemaBuilder, seenValue?: TResult) {\n return `is expected to be equal to \"${this.#equalsTo}\" but saw \"${seenValue}\"`;\n };\n #equalsToErrorMessageProvider: ValidationErrorMessageProvider<\n StringSchemaBuilder<TResult, TRequired>\n > = this.#defaultEqualsToErrorMessageProvider;\n\n #startsWith?: string;\n #defaultStartsWithErrorMessageProvider: ValidationErrorMessageProvider<\n StringSchemaBuilder<TResult, TRequired>\n > = function (this: StringSchemaBuilder) {\n return `is expected to start with \"${this.#startsWith}\"`;\n };\n #startsWithErrorMessageProvider: ValidationErrorMessageProvider<\n StringSchemaBuilder<TResult, TRequired>\n > = this.#defaultStartsWithErrorMessageProvider;\n\n #endsWith?: string;\n #defaultEndsWithErrorMessageProvider: ValidationErrorMessageProvider<\n StringSchemaBuilder<TResult, TRequired>\n > = function (this: StringSchemaBuilder) {\n return `is expected to end with \"${this.#endsWith}\"`;\n };\n #endsWithErrorMessageProvider: ValidationErrorMessageProvider<\n StringSchemaBuilder<TResult, TRequired>\n > = this.#defaultEndsWithErrorMessageProvider;\n\n #matches?: RegExp;\n #defaultMatchesErrorMessageProvider: ValidationErrorMessageProvider<\n StringSchemaBuilder<TResult, TRequired>\n > = function (this: StringSchemaBuilder) {\n return `is expected to match the pattern ${this.#matches}`;\n };\n #matchesErrorMessageProvider: ValidationErrorMessageProvider<\n StringSchemaBuilder<TResult, TRequired>\n > = this.#defaultMatchesErrorMessageProvider;\n\n /**\n * @hidden\n */\n public static create(props: StringSchemaBuilderCreateProps) {\n return new StringSchemaBuilder({\n type: 'string',\n ...props\n });\n }\n\n protected constructor(props: StringSchemaBuilderCreateProps) {\n super(props as any);\n\n if (typeof props.minLength === 'number') {\n this.#minLength = props.minLength;\n }\n\n this.#minLengthErrorMessageProvider =\n this.assureValidationErrorMessageProvider(\n props.minLengthValidationErrorMessageProvider,\n this.#defaultMinLengthErrorMessageProvider\n );\n\n if (typeof props.maxLength === 'number') {\n this.#maxLength = props.maxLength;\n }\n\n this.#maxLengthErrorMessageProvider =\n this.assureValidationErrorMessageProvider(\n props.maxLengthValidationErrorMessageProvider,\n this.#defaultMaxLengthErrorMessageProvider\n );\n\n if (\n typeof props.equalsTo === 'string' ||\n typeof props.equalsTo === 'undefined'\n ) {\n this.#equalsTo = props.equalsTo;\n }\n\n this.#equalsToErrorMessageProvider =\n this.assureValidationErrorMessageProvider(\n props.equalsToValidationErrorMessageProvider,\n this.#defaultEqualsToErrorMessageProvider\n );\n\n if (\n typeof props.startsWith === 'string' &&\n props.startsWith.length > 0\n ) {\n this.#startsWith = props.startsWith;\n }\n\n this.#startsWithErrorMessageProvider =\n this.assureValidationErrorMessageProvider(\n props.startsWithValidationErrorMessageProvider,\n this.#defaultStartsWithErrorMessageProvider\n );\n\n if (typeof props.endsWith === 'string' && props.endsWith.length > 0) {\n this.#endsWith = props.endsWith;\n }\n\n this.#endsWithErrorMessageProvider =\n this.assureValidationErrorMessageProvider(\n props.endsWithValidationErrorMessageProvider,\n this.#defaultEndsWithErrorMessageProvider\n );\n\n if (props.matches instanceof RegExp) {\n this.#matches = props.matches;\n }\n\n this.#matchesErrorMessageProvider =\n this.assureValidationErrorMessageProvider(\n props.matchesValidationErrorMessageProvider,\n this.#defaultMatchesErrorMessageProvider\n );\n }\n\n public introspect() {\n return {\n ...super.introspect(),\n /**\n * Min length of the string (if defined).\n */\n minLength: this.#minLength,\n\n /**\n * Min length validation error message provider.\n * If not provided, default error message will be used.\n */\n minLengthValidationErrorMessageProvider:\n this.#minLengthErrorMessageProvider,\n\n /**\n * Max length of the string (if defined).\n */\n maxLength: this.#maxLength,\n\n /**\n * Max length validation error message provider.\n * If not provided, default error message will be used.\n */\n maxLengthValidationErrorMessageProvider:\n this.#maxLengthErrorMessageProvider,\n\n /**\n * If set, restrict object to be equal to a certain value.\n */\n equalsTo: this.#equalsTo,\n\n /**\n * Equals validation error message provider.\n * If not provided, default error message will be used.\n */\n equalsToValidationErrorMessageProvider:\n this.#equalsToErrorMessageProvider,\n\n /**\n * If set, restrict string to start with a certain value.\n */\n startsWith: this.#startsWith,\n\n /**\n * Starts with validation error message provider.\n * If not provided, default error message will be used.\n */\n startsWithValidationErrorMessageProvider:\n this.#startsWithErrorMessageProvider,\n\n /**\n * If set, restrict string to end with a certain value.\n */\n endsWith: this.#endsWith,\n\n /**\n * Ends with validation error message provider.\n * If not provided, default error message will be used.\n */\n endsWithValidationErrorMessageProvider:\n this.#endsWithErrorMessageProvider,\n\n /**\n * If set, restrict string to match a certain regular expression.\n */\n matches: this.#matches,\n\n /**\n * Matches validation error message provider.\n * If not provided, default error message will be used.\n */\n matchesValidationErrorMessageProvider:\n this.#matchesErrorMessageProvider,\n\n /**\n * Array of preprocessor functions\n */\n preprocessors: this.preprocessors as PreprocessorEntry<TResult>[],\n\n /**\n * Array of validator functions\n */\n validators: this.validators as ValidatorEntry<TResult>[]\n };\n }\n\n /**\n * @inheritdoc\n */\n public hasType<T>(\n _notUsed?: T\n ): StringSchemaBuilder<T, true, TNullable, THasDefault, TExtensions> &\n TExtensions {\n return this.createFromProps({\n ...this.introspect()\n } as any) as any;\n }\n\n /**\n * @inheritdoc\n */\n public clearHasType(): StringSchemaBuilder<\n string,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.createFromProps({\n ...this.introspect()\n } as any) as any;\n }\n\n #getConstraintViolation(\n objToValidate: any\n ): { message: string } | { provider: any } | null {\n if (typeof objToValidate !== 'string') {\n return {\n message: `expected type string, but saw ${typeof objToValidate}`\n };\n }\n\n if (\n typeof this.#equalsTo !== 'undefined' &&\n objToValidate !== this.#equalsTo\n ) {\n return { provider: this.#equalsToErrorMessageProvider };\n }\n\n if (\n typeof this.#startsWith === 'string' &&\n this.#startsWith.length > 0 &&\n !objToValidate.startsWith(this.#startsWith)\n ) {\n return { provider: this.#startsWithErrorMessageProvider };\n }\n\n if (\n typeof this.#endsWith === 'string' &&\n this.#endsWith.length > 0 &&\n !objToValidate.endsWith(this.#endsWith)\n ) {\n return { provider: this.#endsWithErrorMessageProvider };\n }\n\n if (typeof this.#minLength !== 'undefined') {\n if (objToValidate.length < this.#minLength)\n return { provider: this.#minLengthErrorMessageProvider };\n }\n\n if (typeof this.#maxLength !== 'undefined') {\n if (objToValidate.length > this.#maxLength)\n return { provider: this.#maxLengthErrorMessageProvider };\n }\n\n if (this.#matches instanceof RegExp) {\n if (!this.#matches.test(objToValidate)) {\n return { provider: this.#matchesErrorMessageProvider };\n }\n }\n\n return null;\n }\n\n #buildResult(\n superResult: ReturnType<StringSchemaBuilder['preValidateSync']>\n ):\n | { done: true; result: ValidationResult<TResult> }\n | {\n done: false;\n provider: any;\n objToValidate: any;\n } {\n const {\n valid,\n transaction: preValidationTransaction,\n errors\n } = superResult;\n\n if (!valid) {\n return { done: true, result: { valid, errors } };\n }\n\n const {\n object: { validatedObject: objToValidate }\n } = preValidationTransaction!;\n\n if (\n (typeof objToValidate === 'undefined' && !this.isRequired) ||\n (objToValidate === null && (!this.isRequired || this.isNullable))\n ) {\n return {\n done: true,\n result: { valid: true, object: objToValidate }\n };\n }\n\n const violation = this.#getConstraintViolation(objToValidate);\n\n if (!violation) {\n return {\n done: true,\n result: { valid: true, object: objToValidate as TResult }\n };\n }\n\n if ('message' in violation) {\n return {\n done: true,\n result: {\n valid: false,\n errors: [{ message: violation.message }]\n }\n };\n }\n\n return {\n done: false,\n provider: violation.provider,\n objToValidate\n };\n }\n\n /** {@inheritDoc SchemaBuilder.validate} */\n public validate(\n object: TResult,\n context?: ValidationContext\n ): ValidationResult<TResult> {\n return super.validate(object, context) as ValidationResult<TResult>;\n }\n\n /** {@inheritDoc SchemaBuilder.validateAsync} */\n public async validateAsync(\n object: TResult,\n context?: ValidationContext\n ): Promise<ValidationResult<TResult>> {\n return super.validateAsync(object, context) as Promise<\n ValidationResult<TResult>\n >;\n }\n\n /**\n * Performs synchronous validation of string schema over `object`.\n * Throws if any preprocessor, validator, or error message provider returns a Promise.\n * @param context Optional `ValidationContext` settings.\n */\n protected _validate(\n object: TResult,\n context?: ValidationContext\n ): ValidationResult<TResult> {\n // Fast path: no preprocessors or custom validators — skip preValidateSync entirely\n if (this.canSkipPreValidation) {\n // Required / optional check\n if (typeof object === 'undefined' || object === null) {\n if (typeof object === 'undefined' && this.hasDefault) {\n object = this.resolveDefaultValue();\n } else if (\n !this.isRequired ||\n (object === null && this.isNullable)\n ) {\n return { valid: true, object: object };\n } else {\n return {\n valid: false,\n errors: [\n {\n message: this.getValidationErrorMessageSync(\n this.requiredErrorMessage,\n object\n )\n }\n ]\n };\n }\n }\n\n const violation = this.#getConstraintViolation(object);\n\n if (!violation) {\n return { valid: true, object: object as TResult };\n }\n\n if ('message' in violation) {\n return {\n valid: false,\n errors: [{ message: violation.message }]\n };\n }\n\n return {\n valid: false,\n errors: [\n {\n message: this.getValidationErrorMessageSync(\n violation.provider,\n object as TResult\n )\n }\n ]\n };\n }\n\n const r = this.#buildResult(this.preValidateSync(object, context));\n if (r.done) return r.result;\n return {\n valid: false,\n errors: [\n {\n message: this.getValidationErrorMessageSync(\n r.provider,\n r.objToValidate as TResult\n )\n }\n ]\n };\n }\n\n /**\n * Performs async validation of string schema over `object`.\n * Supports async preprocessors, validators, and error message providers.\n * @param context Optional `ValidationContext` settings.\n */\n protected async _validateAsync(\n object: TResult,\n context?: ValidationContext\n ): Promise<ValidationResult<TResult>> {\n const r = this.#buildResult(\n await super.preValidateAsync(object, context)\n );\n if (r.done) return r.result;\n return {\n valid: false,\n errors: [\n {\n message: await this.getValidationErrorMessage(\n r.provider,\n r.objToValidate as TResult\n )\n }\n ]\n };\n }\n\n protected createFromProps<T, TReq extends boolean>(\n props: StringSchemaBuilderCreateProps<T, TReq>\n ): this {\n return StringSchemaBuilder.create(props as any) as any;\n }\n\n /**\n * Restricts string to be equal to `value`.\n */\n public equals<T extends string>(\n value: T,\n /**\n * Custom error message provider.\n */\n errorMessage?: ValidationErrorMessageProvider<\n StringSchemaBuilder<TResult, TRequired>\n >\n ) {\n if (typeof value !== 'string') throw new Error('string expected');\n return this.createFromProps({\n ...this.introspect(),\n equalsTo: value,\n equalsToValidationErrorMessageProvider: errorMessage\n }) as any as StringSchemaBuilder<\n T,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions;\n }\n\n /**\n * Cancels `equals()` call.\n */\n public clearEquals(): StringSchemaBuilder<\n string,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.createFromProps({\n ...this.introspect(),\n equalsTo: undefined\n }) as any;\n }\n\n /**\n * @hidden\n */\n public nullable(): StringSchemaBuilder<\n TResult,\n TRequired,\n true,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.nullable() as any;\n }\n\n /**\n * @hidden\n */\n public notNullable(): StringSchemaBuilder<\n TResult,\n TRequired,\n false,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.notNullable() as any;\n }\n\n /**\n * @hidden\n */\n public required(\n errorMessage?: ValidationErrorMessageProvider\n ): StringSchemaBuilder<TResult, true, TNullable, THasDefault, TExtensions> &\n TExtensions {\n return super.required(errorMessage);\n }\n\n /**\n * @hidden\n */\n public optional(): StringSchemaBuilder<\n TResult,\n false,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.optional();\n }\n\n /**\n * @hidden\n */\n public default(\n value: TResult | (() => TResult)\n ): StringSchemaBuilder<TResult, true, TNullable, true, TExtensions> &\n TExtensions {\n return super.default(value) as any;\n }\n\n /**\n * @hidden\n */\n public clearDefault(): StringSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n false,\n TExtensions\n > &\n TExtensions {\n return super.clearDefault() as any;\n }\n\n /**\n * @hidden\n */\n public brand<TBrand extends string | symbol>(\n _name?: TBrand\n ): StringSchemaBuilder<\n TResult & { readonly [K in BRAND]: TBrand },\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.brand(_name);\n }\n\n /**\n * Marks the inferred type as `Readonly<string>`. Since strings are\n * already immutable this is an identity operation, but it sets the\n * `isReadonly` introspection flag for tooling consistency.\n *\n * @see {@link SchemaBuilder.readonly}\n */\n public readonly(): StringSchemaBuilder<\n Readonly<TResult>,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.readonly();\n }\n\n /**\n * Set minimal length of the valid value for schema.\n * @param length minimum string length\n */\n public minLength(\n length: number,\n /**\n * Custom error message provider.\n */\n errorMessage?: ValidationErrorMessageProvider<\n StringSchemaBuilder<TResult, TRequired>\n >\n ): StringSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n if (typeof length !== 'number')\n throw new Error('length must be a number');\n return this.createFromProps({\n ...this.introspect(),\n minLength: length,\n minLengthValidationErrorMessageProvider: errorMessage\n }) as any;\n }\n\n /**\n * Cancel `minLength()` call.\n */\n public clearMinLength(): StringSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n const schema = this.introspect();\n delete schema.minLength;\n return this.createFromProps({\n ...schema\n }) as any;\n }\n\n /**\n * Set maximal length of the valid value for schema.\n * @param length maximum string length\n */\n public maxLength(\n length: number,\n /**\n * Custom error message provider.\n */\n errorMessage?: ValidationErrorMessageProvider<\n StringSchemaBuilder<TResult, TRequired>\n >\n ): StringSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n if (typeof length !== 'number')\n throw new Error('length must be a number');\n return this.createFromProps({\n ...this.introspect(),\n maxLength: length,\n maxLengthValidationErrorMessageProvider: errorMessage\n }) as any;\n }\n\n /**\n * Cancel `maxLength()` call.\n */\n public clearMaxLength(): StringSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n const schema = this.introspect();\n delete schema.maxLength;\n return this.createFromProps({\n ...schema\n }) as any;\n }\n\n /**\n * Restricts string to start with `val`.\n */\n public startsWith<T extends string>(\n val: T,\n /**\n * Custom error message provider.\n */\n errorMessage?: ValidationErrorMessageProvider<\n StringSchemaBuilder<TResult, TRequired>\n >\n ): StringSchemaBuilder<\n TResult extends string ? `${T}${TResult}` : TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n if (typeof val !== 'string' || !val)\n throw new Error('non empty string expected');\n return this.createFromProps({\n ...this.introspect(),\n startsWith: val,\n startsWithValidationErrorMessageProvider: errorMessage\n }) as any;\n }\n\n /**\n * Cancels `startsWith()` call.\n */\n public clearStartsWith(): StringSchemaBuilder<\n string,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n const schema = this.introspect();\n delete schema.startsWith;\n return this.createFromProps({\n ...schema\n }) as any;\n }\n\n /**\n * Restricts string to end with `val`.\n */\n public endsWith<T extends string>(\n val: T,\n /**\n * Custom error message provider.\n */\n errorMessage?: ValidationErrorMessageProvider<\n StringSchemaBuilder<TResult, TRequired>\n >\n ): StringSchemaBuilder<\n TResult extends string ? `${TResult}${T}` : TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n if (typeof val !== 'string' || !val)\n throw new Error('non empty string expected');\n return this.createFromProps({\n ...this.introspect(),\n endsWith: val,\n endsWithValidationErrorMessageProvider: errorMessage\n }) as any;\n }\n\n /**\n * Cancels `endsWith()` call.\n */\n public clearEndsWith(): StringSchemaBuilder<\n string,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n const schema = this.introspect();\n delete schema.endsWith;\n return this.createFromProps({\n ...schema\n }) as any;\n }\n\n /**\n * Restricts string to match `regexp`.\n * @param regexp regular expression pattern to match against\n */\n public matches(\n regexp: RegExp,\n /**\n * Custom error message provider.\n */\n errorMessage?: ValidationErrorMessageProvider<\n StringSchemaBuilder<TResult, TRequired>\n >\n ): StringSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n if (!(regexp instanceof RegExp)) throw new Error('regexp expected');\n return this.createFromProps({\n ...this.introspect(),\n matches: regexp,\n matchesValidationErrorMessageProvider: errorMessage\n }) as any;\n }\n\n /**\n * Cancels `matches()` call.\n */\n public clearMatches(): StringSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n const schema = this.introspect();\n delete schema.matches;\n return this.createFromProps({\n ...schema\n }) as any;\n }\n}\n\n/**\n * Creates a string schema restricted to be equal to `equals`.\n * @param equals string value the schema is restricted to\n */\nexport function string<T extends string>(\n equals: T\n): StringSchemaBuilder<T, true>;\n\n/**\n * Creates a string schema restricted to be equal to `equals` with a custom error message.\n * @param equals string value the schema is restricted to\n */\nexport function string<T extends string>(\n equals: T,\n errorMessage: ValidationErrorMessageProvider<StringSchemaBuilder<T, true>>\n): StringSchemaBuilder<T, true>;\n\nexport function string(): StringSchemaBuilder<string, true>;\n\n/**\n * Creates a string schema.\n */\nexport function string(\n equals?: string,\n errorMessage?: ValidationErrorMessageProvider<\n StringSchemaBuilder<string, true>\n >\n) {\n if (typeof equals === 'string') {\n return StringSchemaBuilder.create({\n isRequired: true,\n equalsTo: equals,\n equalsToValidationErrorMessageProvider: errorMessage\n });\n }\n return StringSchemaBuilder.create({\n isRequired: true\n });\n}\n"],"mappings":"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","names":["StringSchemaBuilder","_StringSchemaBuilder","SchemaBuilder","#minLength","#defaultMinLengthErrorMessageProvider","#minLengthErrorMessageProvider","#maxLength","#defaultMaxLengthErrorMessageProvider","#maxLengthErrorMessageProvider","#equalsTo","#defaultEqualsToErrorMessageProvider","seenValue","#equalsToErrorMessageProvider","#startsWith","#defaultStartsWithErrorMessageProvider","#startsWithErrorMessageProvider","#endsWith","#defaultEndsWithErrorMessageProvider","#endsWithErrorMessageProvider","#matches","#defaultMatchesErrorMessageProvider","#matchesErrorMessageProvider","props","_notUsed","#getConstraintViolation","objToValidate","#buildResult","superResult","valid","preValidationTransaction","errors","violation","object","context","r","value","errorMessage","_name","length","schema","val","regexp","string","equals"]}
@@ -0,0 +1,2 @@
1
+ import{f as m}from"./chunk-CTP4RHDG.js";var p=class R extends m{#a;#e;static create(e){return new R({type:"record",...e})}constructor(e){super(e),e.keySchema instanceof m&&(this.#a=e.keySchema),e.valueSchema instanceof m&&(this.#e=e.valueSchema)}hasType(e){return this.createFromProps({...this.introspect()})}clearHasType(){return this.createFromProps({...this.introspect()})}createFromProps(e){return R.create(e)}required(e){return super.required(e)}optional(){return super.optional()}default(e){return super.default(e)}clearDefault(){return super.clearDefault()}brand(e){return super.brand(e)}introspect(){return{...super.introspect(),keySchema:this.#a,valueSchema:this.#e}}#s(e){let t={};for(let[n,o]of e)t[n]=o;return t}#r(e,t,n){let o=this.#e;return{errors:t,isValid:t.length===0,seenValue:n!==null&&typeof n=="object"?n[e]:void 0,descriptor:{key:e,getSchema:()=>o,getValue:r=>r!==null&&typeof r=="object"&&Object.hasOwn(r,e)?{success:!0,value:r[e]}:{success:!1},setValue:(r,d)=>r!==null&&typeof r=="object"?(r[e]=d,!0):!1}}}#n(e,t){let{valid:n,errors:o}=t,r=[],d=new Map,y=()=>this.#s(d),u=l=>{if(typeof l>"u")return{errors:r,isValid:r.length===0,seenValue:e};let i=d.get(l),s=i&&!i.valid?(i.errors??[]).map(T=>T.message):[];return this.#r(l,s,e)};if(!n){for(let l of o??[])r.push(l.message);return{earlyReturn:!0,result:{valid:n,errors:o,getNestedErrors:y,getErrorsFor:u}}}let a=t.transaction.object.validatedObject;return typeof a>"u"&&!this.isRequired||a===null&&(!this.isRequired||this.isNullable)?{earlyReturn:!0,result:{valid:!0,object:a,getNestedErrors:y,getErrorsFor:u}}:typeof a!="object"||Array.isArray(a)||a===null?(r.push("object expected"),{earlyReturn:!0,result:{valid:!1,errors:[{message:"object expected"}],getNestedErrors:y,getErrorsFor:u}}):{earlyReturn:!1,objToValidate:a,nestedKeyResults:d,getNestedErrors:y,getErrorsFor:u}}#l(e,t,n,o,r,d){return e?{valid:!0,object:n,getNestedErrors:r,getErrorsFor:d}:{valid:!1,errors:o?t:[t[0]],getNestedErrors:r,getErrorsFor:d}}validate(e,t){return super.validate(e,t)}async validateAsync(e,t){return super.validateAsync(e,t)}_validate(e,t){if(this.canSkipPreValidation&&!t?.doNotStopOnFirstError){if(typeof e>"u"||e===null)if(typeof e>"u"&&this.hasDefault)e=this.resolveDefaultValue();else if(!this.isRequired||e===null&&this.isNullable){let a=e;return{valid:!0,object:e,getNestedErrors(){return{}},getErrorsFor:l=>typeof l>"u"?{errors:[],isValid:!0,seenValue:a}:this.#r(l,[],a)}}else return this.#t(e,t);if(typeof e!="object"||Array.isArray(e)||e===null)return this.#t(e,t);let n=new Map,o={},r=null;for(let a of Object.keys(e)){let l=this.#a.validate(a);if(!l.valid){let s=l.errors&&l.errors.length>0?l.errors:[{message:`key "${a}" is invalid`}];n.set(a,{valid:!1,errors:s}),r=s[0];break}let i=this.#e.validate(e[a]);if(n.set(a,i),i.valid)o[a]=i.object;else{let s=i.errors&&i.errors.length>0?i.errors:[{message:`value for key "${a}" is invalid`}];n.set(a,{valid:!1,errors:s}),r=s[0];break}}let d=e,y=()=>this.#s(n),u=a=>{if(typeof a>"u")return{errors:[],isValid:!0,seenValue:d};let l=n.get(a),i=l&&!l.valid?(l.errors??[]).map(s=>s.message):[];return this.#r(a,i,d)};return r!==null?{valid:!1,errors:[r],getNestedErrors:y,getErrorsFor:u}:{valid:!0,object:o,getNestedErrors:y,getErrorsFor:u}}return this.#t(e,t)}#t(e,t){let n=this.#n(e,this.preValidateSync(e,t));if(n.earlyReturn)return n.result;let{objToValidate:o,nestedKeyResults:r,getNestedErrors:d,getErrorsFor:y}=n,u=t?.doNotStopOnFirstError??!1,a=!0,l={},i=[];for(let s of Object.keys(o)){let T=this.#a.validate(s);if(!T.valid){a=!1;let h=T.errors&&T.errors.length>0?T.errors:[{message:`key "${s}" is invalid`}];if(r.set(s,{valid:!1,errors:h}),i.push(...h),!u)break;continue}let c=this.#e.validate(o[s],u?{doNotStopOnFirstError:!0}:void 0);if(r.set(s,c),c.valid)l[s]=c.object;else{a=!1;let h=c.errors&&c.errors.length>0?c.errors:[{message:`value for key "${s}" is invalid`}];if(i.push(...h),!u)break}}return this.#l(a,i,l,u,d,y)}async _validateAsync(e,t){let n=this.#n(e,await this.preValidateAsync(e,t));if(n.earlyReturn)return n.result;let{objToValidate:o,nestedKeyResults:r,getNestedErrors:d,getErrorsFor:y}=n,u=t?.doNotStopOnFirstError??!1,a=!0,l={},i=[];for(let s of Object.keys(o)){let T=await this.#a.validateAsync(s);if(!T.valid){a=!1;let h=T.errors&&T.errors.length>0?T.errors:[{message:`key "${s}" is invalid`}];if(r.set(s,{valid:!1,errors:h}),i.push(...h),!u)break;continue}let c=await this.#e.validateAsync(o[s],u?{doNotStopOnFirstError:!0}:void 0);if(r.set(s,c),c.valid)l[s]=c.object;else{a=!1;let h=c.errors&&c.errors.length>0?c.errors:[{message:`value for key "${s}" is invalid`}];if(i.push(...h),!u)break}}return this.#l(a,i,l,u,d,y)}nullable(){return super.nullable()}notNullable(){return super.notNullable()}};function f(R,e){return p.create({type:"record",keySchema:R,valueSchema:e})}export{p as a,f as b};
2
+ //# sourceMappingURL=chunk-IJ6FO37G.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/builders/RecordSchemaBuilder.ts"],"sourcesContent":["/**\n * Schema builder for objects with dynamic string keys, where every value\n * must satisfy the same value schema.\n *\n * Equivalent to TypeScript's `Record<string, V>` (or a more constrained key\n * set when using a string-literal key schema) and Zod's `z.record()`.\n *\n * Unlike `ObjectSchemaBuilder` — which validates objects with a **known,\n * fixed set of property names** — `RecordSchemaBuilder` validates objects\n * whose keys are not known at schema-definition time (look-up tables, i18n\n * bundles, caches, etc.).\n *\n * @module\n */\nimport {\n type BRAND,\n type InferType,\n type PreValidationResult,\n SchemaBuilder,\n type ValidationContext,\n type ValidationError,\n type ValidationErrorMessageProvider,\n type ValidationResult\n} from './SchemaBuilder.js';\nimport type { StringSchemaBuilder } from './StringSchemaBuilder.js';\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\n/**\n * Descriptor for a single key-value entry within a validated record.\n * Provides `getValue`, `setValue`, and `getSchema` operations for the entry.\n *\n * Returned as part of {@link RecordKeyValidationResult}.\n */\nexport type RecordKeyDescriptor<\n TRecord,\n TValueSchema extends SchemaBuilder<any, any, any, any, any>\n> = {\n /** The key within the record this descriptor refers to. */\n readonly key: string;\n /** Returns the value schema every record entry must satisfy. */\n getSchema(): TValueSchema;\n /**\n * Retrieves the value at `key` from the given record object.\n * Returns `{ success: false }` when the key is not present.\n */\n getValue(obj: TRecord): {\n value?: InferType<TValueSchema>;\n success: boolean;\n };\n /**\n * Sets the value at `key` on the given record object.\n * Returns `false` when `obj` is not a non-null object.\n */\n setValue(obj: TRecord, value: InferType<TValueSchema>): boolean;\n};\n\n/**\n * Validation result for a single key-value entry in a record.\n * Returned by {@link RecordSchemaValidationResult.getErrorsFor | getErrorsFor(key)}.\n */\nexport type RecordKeyValidationResult<\n TRecord,\n TValueSchema extends SchemaBuilder<any, any, any, any, any>\n> = {\n /** Validation error messages for this entry; empty array when valid. */\n readonly errors: ReadonlyArray<string>;\n /** `true` when there are no validation errors for this entry. */\n readonly isValid: boolean;\n /** The value that was seen at this key during validation. */\n readonly seenValue: InferType<TValueSchema> | undefined;\n /** Descriptor for reading/writing the value at this key. */\n readonly descriptor: RecordKeyDescriptor<TRecord, TValueSchema>;\n};\n\n/**\n * Root-level validation result for the record object itself.\n * Returned by {@link RecordSchemaValidationResult.getErrorsFor | getErrorsFor()} (no argument).\n */\nexport type RecordRootValidationResult<TResult> = {\n /** Root-level error messages (e.g. `\"object expected\"`); empty when valid. */\n readonly errors: ReadonlyArray<string>;\n /** `true` when there are no root-level errors. */\n readonly isValid: boolean;\n /** The value that was being validated. */\n readonly seenValue: TResult | undefined;\n};\n\n/**\n * Validation result type returned by `RecordSchemaBuilder.validate()`.\n *\n * Extends `ValidationResult` with:\n * - `getNestedErrors()` — a per-key map of `ValidationResult` objects.\n * - `getErrorsFor()` — root-level errors for the record container itself.\n * - `getErrorsFor(key)` — errors, seen value, and descriptor for a specific key.\n */\nexport type RecordSchemaValidationResult<\n TResult,\n TValueSchema extends SchemaBuilder<any, any, any, any, any>\n> = ValidationResult<TResult> & {\n /**\n * Returns per-key validation results as a plain object.\n *\n * Each key in the returned object corresponds to a key in the input that\n * **failed** validation (in `doNotStopOnFirstError` mode) or the single\n * first failing key (in the default stop-on-first-error mode). Keys that\n * passed are not included.\n *\n * @deprecated Prefer {@link getErrorsFor} for a richer per-entry result\n * that also includes a descriptor and `seenValue`.\n *\n * @example\n * ```ts\n * const schema = record(string(), number().positive());\n * const result = schema.validate(\n * { a: 1, b: -2, c: 'oops' },\n * { doNotStopOnFirstError: true }\n * );\n *\n * if (!result.valid) {\n * const nested = result.getNestedErrors();\n * console.log(nested['b']); // ValidationResult for key 'b'\n * console.log(nested['c']); // ValidationResult for key 'c'\n * }\n * ```\n */\n getNestedErrors(): Record<\n string,\n ValidationResult<InferType<TValueSchema>>\n >;\n /**\n * Returns root-level errors for the record container itself\n * (e.g. `\"object expected\"` when a non-object value is passed,\n * or errors from custom validators added to the record schema).\n *\n * @example\n * ```ts\n * const schema = record(string(), number());\n * const root = schema.validate(42 as any).getErrorsFor();\n * // root.errors[0] === 'object expected'\n * // root.isValid === false\n * ```\n */\n getErrorsFor(): RecordRootValidationResult<TResult>;\n /**\n * Returns the validation result for the entry with the given key,\n * including error messages, the seen value, and a descriptor for\n * accessing and modifying the value at that key.\n *\n * If the key was not reached during validation (e.g. an earlier key\n * already failed in stop-on-first-error mode), an empty result with\n * `isValid: true` and no errors is returned.\n *\n * @param key - the key whose validation result to retrieve\n *\n * @example\n * ```ts\n * const schema = record(string(), number().min(0));\n * const result = schema.validate(\n * { a: 5, b: -2 },\n * { doNotStopOnFirstError: true }\n * );\n *\n * const bErrors = result.getErrorsFor('b');\n * // bErrors.isValid === false\n * // bErrors.errors[0] === 'the value must be >= 0'\n * // bErrors.seenValue === -2\n * // bErrors.descriptor.key === 'b'\n * // bErrors.descriptor.getSchema() === valueSchema\n * ```\n */\n getErrorsFor(key: string): RecordKeyValidationResult<TResult, TValueSchema>;\n};\n\ntype RecordSchemaBuilderCreateProps<\n TKeySchema extends StringSchemaBuilder<any, any, any, any>,\n TValueSchema extends SchemaBuilder<any, any, any, any, any>,\n R extends boolean = true\n> = Partial<\n ReturnType<RecordSchemaBuilder<TKeySchema, TValueSchema, R>['introspect']>\n>;\n\n// ---------------------------------------------------------------------------\n// Builder class\n// ---------------------------------------------------------------------------\n\n/**\n * Schema builder for objects with dynamic string keys.\n *\n * Every key in the validated object must be accepted by `keySchema` (a\n * `StringSchemaBuilder`) and every value must satisfy `valueSchema`.\n *\n * The inferred TypeScript type mirrors `Record<K, V>` where `K` is the\n * string type produced by `keySchema` and `V` is the type produced by\n * `valueSchema`.\n *\n * **NOTE** — this class is exported to allow extension by inheritance. Use\n * the {@link record | record()} factory function instead of instantiating it\n * directly.\n *\n * @example\n * ```ts\n * import { record, string, number } from '@cleverbrush/schema';\n *\n * // Basic: string keys, number values\n * const scores = record(string(), number().min(0));\n * // InferType<typeof scores> → Record<string, number>\n *\n * scores.validate({ alice: 95, bob: 87 }); // valid\n * scores.validate({ alice: 95, bob: -1 }); // invalid (negative)\n * ```\n *\n * @example\n * ```ts\n * // Restrict keys to a specific set of literals with .equals()\n * const locales = record(\n * string().matches(/^[a-z]{2}(-[A-Z]{2})?$/),\n * string().nonempty()\n * );\n * // accepts: { en: 'Hello', fr: 'Bonjour' }\n * // rejects: { 123: 'oops' } ← key doesn't match pattern\n * ```\n *\n * @see {@link record}\n */\nexport class RecordSchemaBuilder<\n TKeySchema extends StringSchemaBuilder<any, any, any, any>,\n TValueSchema extends 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 ? Record<InferType<TKeySchema>, InferType<TValueSchema>>\n : TExplicitType\n> extends SchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n> {\n #keySchema!: TKeySchema;\n #valueSchema!: TValueSchema;\n\n /**\n * @hidden\n */\n public static create(props: RecordSchemaBuilderCreateProps<any, any, any>) {\n return new RecordSchemaBuilder({\n type: 'record',\n ...props\n } as any);\n }\n\n protected constructor(\n props: RecordSchemaBuilderCreateProps<\n TKeySchema,\n TValueSchema,\n TRequired\n >\n ) {\n super(props as any);\n\n if (props.keySchema instanceof SchemaBuilder) {\n this.#keySchema = props.keySchema as TKeySchema;\n }\n if (props.valueSchema instanceof SchemaBuilder) {\n this.#valueSchema = props.valueSchema as TValueSchema;\n }\n }\n\n /**\n * @inheritdoc\n */\n public hasType<T>(\n _notUsed?: T\n ): RecordSchemaBuilder<\n TKeySchema,\n TValueSchema,\n true,\n TNullable,\n T,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.createFromProps({\n ...this.introspect()\n } as any) as any;\n }\n\n /**\n * @inheritdoc\n */\n public clearHasType(): RecordSchemaBuilder<\n TKeySchema,\n TValueSchema,\n TRequired,\n TNullable,\n undefined,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.createFromProps({\n ...this.introspect()\n } as any) as any;\n }\n\n /**\n * @hidden\n */\n protected createFromProps<TReq extends boolean>(\n props: RecordSchemaBuilderCreateProps<TKeySchema, TValueSchema, TReq>\n ): this {\n return RecordSchemaBuilder.create(props as any) as any;\n }\n\n /**\n * @hidden\n */\n public required(\n errorMessage?: ValidationErrorMessageProvider\n ): RecordSchemaBuilder<\n TKeySchema,\n TValueSchema,\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(): RecordSchemaBuilder<\n TKeySchema,\n TValueSchema,\n false,\n TNullable,\n TExplicitType,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.optional();\n }\n\n /**\n * @hidden\n */\n public default(\n value: TResult | (() => TResult)\n ): RecordSchemaBuilder<\n TKeySchema,\n TValueSchema,\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(): RecordSchemaBuilder<\n TKeySchema,\n TValueSchema,\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 ): RecordSchemaBuilder<\n TKeySchema,\n TValueSchema,\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 * Returns an introspection object describing the record schema.\n */\n public introspect() {\n return {\n ...super.introspect(),\n /**\n * The schema every key must satisfy (a `StringSchemaBuilder`).\n */\n keySchema: this.#keySchema,\n /**\n * The schema every value must satisfy.\n */\n valueSchema: this.#valueSchema\n };\n }\n\n // -----------------------------------------------------------------------\n // Validation helpers\n // -----------------------------------------------------------------------\n\n #buildNestedErrors(\n keyResults: Map<string, ValidationResult<any>>\n ): Record<string, ValidationResult<InferType<TValueSchema>>> {\n const out: Record<string, ValidationResult<any>> = {};\n for (const [k, v] of keyResults) {\n out[k] = v;\n }\n return out;\n }\n\n /**\n * Creates a {@link RecordKeyValidationResult} for `key` with the given\n * error message strings. Captures `rootObject` so the returned descriptor\n * can lazily read/write the value at that key.\n */\n #makeKeyResult(\n key: string,\n errors: string[],\n rootObject: TResult\n ): RecordKeyValidationResult<TResult, TValueSchema> {\n const valueSchema = this.#valueSchema;\n return {\n errors: errors as ReadonlyArray<string>,\n isValid: errors.length === 0,\n seenValue:\n rootObject !== null && typeof rootObject === 'object'\n ? (rootObject as any)[key]\n : undefined,\n descriptor: {\n key,\n getSchema: () => valueSchema,\n getValue: (obj: TResult) => {\n if (\n obj !== null &&\n typeof obj === 'object' &&\n Object.hasOwn(obj as any, key)\n ) {\n return { success: true, value: (obj as any)[key] };\n }\n return { success: false };\n },\n setValue: (obj: TResult, val: InferType<TValueSchema>) => {\n if (obj !== null && typeof obj === 'object') {\n (obj as any)[key] = val;\n return true;\n }\n return false;\n }\n }\n };\n }\n\n /**\n * Shared setup for {@link #validateFull} and {@link _validateAsync}.\n * Runs pre-validation guards (null / undefined / type checks) and\n * builds the `getNestedErrors` / `getErrorsFor` closures.\n *\n * Returns either an early result (when validation can short-circuit)\n * or the data needed for the per-entry loop.\n */\n #createValidationSetup(\n object: TResult,\n superResult: PreValidationResult<any, { validatedObject: any }>\n ):\n | {\n earlyReturn: true;\n result: RecordSchemaValidationResult<TResult, TValueSchema>;\n }\n | {\n earlyReturn: false;\n objToValidate: any;\n nestedKeyResults: Map<\n string,\n ValidationResult<InferType<TValueSchema>>\n >;\n getNestedErrors: () => Record<\n string,\n ValidationResult<InferType<TValueSchema>>\n >;\n getErrorsFor: (key?: string) => any;\n } {\n const { valid, errors } = superResult;\n\n const rootErrorMsgs: string[] = [];\n const nestedKeyResults = new Map<\n string,\n ValidationResult<InferType<TValueSchema>>\n >();\n const getNestedErrors = () => this.#buildNestedErrors(nestedKeyResults);\n const getErrorsFor = (key?: string): any => {\n if (typeof key === 'undefined') {\n return {\n errors: rootErrorMsgs as ReadonlyArray<string>,\n isValid: rootErrorMsgs.length === 0,\n seenValue: object\n };\n }\n const nestedResult = nestedKeyResults.get(key);\n const errMsgs =\n nestedResult && !nestedResult.valid\n ? (nestedResult.errors ?? []).map(\n (e: ValidationError) => e.message\n )\n : [];\n return this.#makeKeyResult(key, errMsgs, object);\n };\n\n if (!valid) {\n for (const e of errors ?? []) rootErrorMsgs.push(e.message);\n return {\n earlyReturn: true,\n result: {\n valid,\n errors,\n getNestedErrors,\n getErrorsFor\n } as any\n };\n }\n\n const objToValidate = superResult.transaction!.object\n .validatedObject as any;\n\n if (\n (typeof objToValidate === 'undefined' && !this.isRequired) ||\n (objToValidate === null && (!this.isRequired || this.isNullable))\n ) {\n return {\n earlyReturn: true,\n result: {\n valid: true,\n object: objToValidate,\n getNestedErrors,\n getErrorsFor\n } as any\n };\n }\n\n if (\n typeof objToValidate !== 'object' ||\n Array.isArray(objToValidate) ||\n objToValidate === null\n ) {\n rootErrorMsgs.push('object expected');\n return {\n earlyReturn: true,\n result: {\n valid: false,\n errors: [{ message: 'object expected' }],\n getNestedErrors,\n getErrorsFor\n } as any\n };\n }\n\n return {\n earlyReturn: false,\n objToValidate,\n nestedKeyResults,\n getNestedErrors,\n getErrorsFor\n };\n }\n\n /**\n * Builds the final validation result from the per-entry loop outcome.\n */\n #buildEntryResult(\n allValid: boolean,\n allErrors: ValidationError[],\n result: Record<string, any>,\n doNotStop: boolean,\n getNestedErrors: () => Record<\n string,\n ValidationResult<InferType<TValueSchema>>\n >,\n getErrorsFor: (key?: string) => any\n ): RecordSchemaValidationResult<TResult, TValueSchema> {\n if (!allValid) {\n return {\n valid: false,\n errors: doNotStop ? allErrors : [allErrors[0]],\n getNestedErrors,\n getErrorsFor\n } as any;\n }\n\n return {\n valid: true,\n object: result as TResult,\n getNestedErrors,\n getErrorsFor\n } as any;\n }\n\n /**\n * Core sync validation. {@inheritDoc SchemaBuilder.validate}\n */\n public validate(\n object: TResult,\n context?: ValidationContext\n ): RecordSchemaValidationResult<TResult, TValueSchema> {\n return super.validate(object, context) as RecordSchemaValidationResult<\n TResult,\n TValueSchema\n >;\n }\n\n /**\n * Core async validation. {@inheritDoc SchemaBuilder.validateAsync}\n */\n public async validateAsync(\n object: TResult,\n context?: ValidationContext\n ): Promise<RecordSchemaValidationResult<TResult, TValueSchema>> {\n return super.validateAsync(object, context) as Promise<\n RecordSchemaValidationResult<TResult, TValueSchema>\n >;\n }\n\n /**\n * Core sync validation. Returns `{ valid, object, errors, getNestedErrors, getErrorsFor }`.\n */\n protected _validate(\n object: TResult,\n context?: ValidationContext\n ): RecordSchemaValidationResult<TResult, TValueSchema> {\n // Fast path: skip pre-validation when no preprocessors/validators.\n if (this.canSkipPreValidation && !context?.doNotStopOnFirstError) {\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 const capturedObj = object;\n return {\n valid: true,\n object,\n getNestedErrors() {\n return {};\n },\n getErrorsFor: (key?: string): any => {\n if (typeof key === 'undefined') {\n return {\n errors: [] as ReadonlyArray<string>,\n isValid: true,\n seenValue: capturedObj\n };\n }\n return this.#makeKeyResult(\n key,\n [],\n capturedObj as TResult\n );\n }\n } as any;\n } else {\n return this.#validateFull(object, context);\n }\n }\n\n if (\n typeof object !== 'object' ||\n Array.isArray(object) ||\n object === null\n ) {\n return this.#validateFull(object, context);\n }\n\n // Validate every entry inline, collecting per-key results as we go.\n const nestedKeyResults = new Map<string, ValidationResult<any>>();\n const result: Record<string, any> = {};\n let firstError: ValidationError | null = null;\n\n for (const key of Object.keys(object as any)) {\n const keyResult = this.#keySchema.validate(key);\n if (!keyResult.valid) {\n const keyErrors =\n keyResult.errors && keyResult.errors.length > 0\n ? keyResult.errors\n : [{ message: `key \"${key}\" is invalid` }];\n nestedKeyResults.set(key, {\n valid: false,\n errors: keyErrors\n });\n firstError = keyErrors[0];\n break;\n }\n\n const valueResult = this.#valueSchema.validate(\n (object as any)[key]\n );\n nestedKeyResults.set(key, valueResult as any);\n\n if (!valueResult.valid) {\n const valErrors =\n valueResult.errors && valueResult.errors.length > 0\n ? valueResult.errors\n : [\n {\n message: `value for key \"${key}\" is invalid`\n }\n ];\n nestedKeyResults.set(key, {\n valid: false,\n errors: valErrors\n });\n firstError = valErrors[0];\n break;\n } else {\n result[key] = valueResult.object;\n }\n }\n\n const capturedInput = object;\n const getNestedErrors = () =>\n this.#buildNestedErrors(nestedKeyResults);\n const getErrorsFor = (key?: string): any => {\n if (typeof key === 'undefined') {\n return {\n errors: [] as ReadonlyArray<string>,\n isValid: true,\n seenValue: capturedInput\n };\n }\n const nestedResult = nestedKeyResults.get(key);\n const errMsgs =\n nestedResult && !nestedResult.valid\n ? (nestedResult.errors ?? []).map(\n (e: ValidationError) => e.message\n )\n : [];\n return this.#makeKeyResult(key, errMsgs, capturedInput);\n };\n\n if (firstError !== null) {\n return {\n valid: false,\n errors: [firstError],\n getNestedErrors,\n getErrorsFor\n } as any;\n }\n\n return {\n valid: true,\n object: result as TResult,\n getNestedErrors,\n getErrorsFor\n } as any;\n }\n\n return this.#validateFull(object, context);\n }\n\n /**\n * Full validation path — processes preprocessors, validators, and collects\n * all per-entry results.\n */\n #validateFull(\n object: TResult,\n context?: ValidationContext\n ): RecordSchemaValidationResult<TResult, TValueSchema> {\n const setup = this.#createValidationSetup(\n object,\n this.preValidateSync(object, context)\n );\n if (setup.earlyReturn) return setup.result;\n\n const {\n objToValidate,\n nestedKeyResults,\n getNestedErrors,\n getErrorsFor\n } = setup;\n const doNotStop = context?.doNotStopOnFirstError ?? false;\n let allValid = true;\n const result: Record<string, any> = {};\n const allErrors: ValidationError[] = [];\n\n for (const key of Object.keys(objToValidate)) {\n const keyResult = this.#keySchema.validate(key);\n if (!keyResult.valid) {\n allValid = false;\n const keyErrors =\n keyResult.errors && keyResult.errors.length > 0\n ? keyResult.errors\n : [{ message: `key \"${key}\" is invalid` }];\n nestedKeyResults.set(key, {\n valid: false,\n errors: keyErrors\n });\n allErrors.push(...keyErrors);\n if (!doNotStop) break;\n continue;\n }\n\n const valueResult = this.#valueSchema.validate(\n objToValidate[key],\n doNotStop ? { doNotStopOnFirstError: true } : undefined\n );\n nestedKeyResults.set(key, valueResult as any);\n\n if (!valueResult.valid) {\n allValid = false;\n const valueErrors =\n valueResult.errors && valueResult.errors.length > 0\n ? valueResult.errors\n : [{ message: `value for key \"${key}\" is invalid` }];\n allErrors.push(...valueErrors);\n if (!doNotStop) break;\n } else {\n result[key] = valueResult.object;\n }\n }\n\n return this.#buildEntryResult(\n allValid,\n allErrors,\n result,\n doNotStop,\n getNestedErrors,\n getErrorsFor\n );\n }\n\n /**\n * Performs async validation of the record schema.\n *\n * Supports async preprocessors, validators, and error message providers.\n *\n * @param object - the value to validate\n * @param context - optional `ValidationContext` settings\n */\n protected async _validateAsync(\n object: TResult,\n context?: ValidationContext\n ): Promise<RecordSchemaValidationResult<TResult, TValueSchema>> {\n const setup = this.#createValidationSetup(\n object,\n await this.preValidateAsync(object, context)\n );\n if (setup.earlyReturn) return setup.result;\n\n const {\n objToValidate,\n nestedKeyResults,\n getNestedErrors,\n getErrorsFor\n } = setup;\n const doNotStop = context?.doNotStopOnFirstError ?? false;\n let allValid = true;\n const result: Record<string, any> = {};\n const allErrors: ValidationError[] = [];\n\n for (const key of Object.keys(objToValidate)) {\n const keyResult = await this.#keySchema.validateAsync(key);\n if (!keyResult.valid) {\n allValid = false;\n const keyErrors =\n keyResult.errors && keyResult.errors.length > 0\n ? keyResult.errors\n : [{ message: `key \"${key}\" is invalid` }];\n nestedKeyResults.set(key, {\n valid: false,\n errors: keyErrors\n });\n allErrors.push(...keyErrors);\n if (!doNotStop) break;\n continue;\n }\n\n const valueResult = await this.#valueSchema.validateAsync(\n objToValidate[key],\n doNotStop ? { doNotStopOnFirstError: true } : undefined\n );\n nestedKeyResults.set(key, valueResult as any);\n\n if (!valueResult.valid) {\n allValid = false;\n const valueErrors =\n valueResult.errors && valueResult.errors.length > 0\n ? valueResult.errors\n : [{ message: `value for key \"${key}\" is invalid` }];\n allErrors.push(...valueErrors);\n if (!doNotStop) break;\n } else {\n result[key] = valueResult.object;\n }\n }\n\n return this.#buildEntryResult(\n allValid,\n allErrors,\n result,\n doNotStop,\n getNestedErrors,\n getErrorsFor\n );\n }\n\n /**\n * @hidden\n */\n public nullable(): RecordSchemaBuilder<\n TKeySchema,\n TValueSchema,\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(): RecordSchemaBuilder<\n TKeySchema,\n TValueSchema,\n TRequired,\n false,\n TExplicitType,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.notNullable() as any;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory function\n// ---------------------------------------------------------------------------\n\n/**\n * Creates a schema for objects with dynamic string keys, where every key\n * must satisfy `keySchema` and every value must satisfy `valueSchema`.\n *\n * The inferred TypeScript type is `Record<K, V>` where `K` is derived from\n * `keySchema` and `V` from `valueSchema`.\n *\n * @param keySchema - a `StringSchemaBuilder` that each key must satisfy\n * @param valueSchema - a `SchemaBuilder` that each value must satisfy\n *\n * @example\n * ```ts\n * import { record, string, number } from '@cleverbrush/schema';\n *\n * // Look-up table: string keys → number scores\n * const scores = record(string(), number().min(0).max(100));\n * // InferType<typeof scores> → Record<string, number>\n *\n * scores.validate({ alice: 95, bob: 87 }); // { valid: true }\n * scores.validate({ alice: 95, bob: -1 }); // { valid: false }\n * ```\n *\n * @example\n * ```ts\n * // i18n bundle: locale code keys → non-empty strings\n * const bundle = record(\n * string().matches(/^[a-z]{2}(-[A-Z]{2})?$/),\n * string().nonempty()\n * );\n *\n * bundle.validate({ en: 'Hello', 'fr-FR': 'Bonjour' }); // valid\n * bundle.validate({ en: '' }); // invalid (empty value)\n * bundle.validate({ '123': 'hi' }); // invalid (bad key)\n * ```\n *\n * @example\n * ```ts\n * // Optional record with a factory default\n * const cache = record(string(), number())\n * .optional()\n * .default(() => ({}));\n * ```\n *\n * @example\n * ```ts\n * // Nested record — values are objects\n * import { record, string, object, number } from '@cleverbrush/schema';\n *\n * const userMap = record(\n * string(),\n * object({ name: string(), age: number() })\n * );\n * ```\n */\nexport function record<\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): RecordSchemaBuilder<TKeySchema, TValueSchema> {\n return RecordSchemaBuilder.create({\n type: 'record',\n keySchema,\n valueSchema\n } as any) as any;\n}\n"],"mappings":"wCAmOO,IAAMA,EAAN,MAAMC,UAWHC,CAMR,CACEC,GACAC,GAKA,OAAc,OAAOC,EAAsD,CACvE,OAAO,IAAIJ,EAAoB,CAC3B,KAAM,SACN,GAAGI,CACP,CAAQ,CACZ,CAEU,YACNA,EAKF,CACE,MAAMA,CAAY,EAEdA,EAAM,qBAAqBH,IAC3B,KAAKC,GAAaE,EAAM,WAExBA,EAAM,uBAAuBH,IAC7B,KAAKE,GAAeC,EAAM,YAElC,CAKO,QACHC,EAUY,CACZ,OAAO,KAAK,gBAAgB,CACxB,GAAG,KAAK,WAAW,CACvB,CAAQ,CACZ,CAKO,cASS,CACZ,OAAO,KAAK,gBAAgB,CACxB,GAAG,KAAK,WAAW,CACvB,CAAQ,CACZ,CAKU,gBACND,EACI,CACJ,OAAOJ,EAAoB,OAAOI,CAAY,CAClD,CAKO,SACHE,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,CAKO,YAAa,CAChB,MAAO,CACH,GAAG,MAAM,WAAW,EAIpB,UAAW,KAAKN,GAIhB,YAAa,KAAKC,EACtB,CACJ,CAMAM,GACIC,EACyD,CACzD,IAAMC,EAA6C,CAAC,EACpD,OAAW,CAACC,EAAGC,CAAC,IAAKH,EACjBC,EAAIC,CAAC,EAAIC,EAEb,OAAOF,CACX,CAOAG,GACIC,EACAC,EACAC,EACgD,CAChD,IAAMC,EAAc,KAAKf,GACzB,MAAO,CACH,OAAQa,EACR,QAASA,EAAO,SAAW,EAC3B,UACIC,IAAe,MAAQ,OAAOA,GAAe,SACtCA,EAAmBF,CAAG,EACvB,OACV,WAAY,CACR,IAAAA,EACA,UAAW,IAAMG,EACjB,SAAWC,GAEHA,IAAQ,MACR,OAAOA,GAAQ,UACf,OAAO,OAAOA,EAAYJ,CAAG,EAEtB,CAAE,QAAS,GAAM,MAAQI,EAAYJ,CAAG,CAAE,EAE9C,CAAE,QAAS,EAAM,EAE5B,SAAU,CAACI,EAAcC,IACjBD,IAAQ,MAAQ,OAAOA,GAAQ,UAC9BA,EAAYJ,CAAG,EAAIK,EACb,IAEJ,EAEf,CACJ,CACJ,CAUAC,GACIC,EACAC,EAkBI,CACJ,GAAM,CAAE,MAAAC,EAAO,OAAAR,CAAO,EAAIO,EAEpBE,EAA0B,CAAC,EAC3BC,EAAmB,IAAI,IAIvBC,EAAkB,IAAM,KAAKlB,GAAmBiB,CAAgB,EAChEE,EAAgBb,GAAsB,CACxC,GAAI,OAAOA,EAAQ,IACf,MAAO,CACH,OAAQU,EACR,QAASA,EAAc,SAAW,EAClC,UAAWH,CACf,EAEJ,IAAMO,EAAeH,EAAiB,IAAIX,CAAG,EACvCe,EACFD,GAAgB,CAACA,EAAa,OACvBA,EAAa,QAAU,CAAC,GAAG,IACvBE,GAAuBA,EAAE,OAC9B,EACA,CAAC,EACX,OAAO,KAAKjB,GAAeC,EAAKe,EAASR,CAAM,CACnD,EAEA,GAAI,CAACE,EAAO,CACR,QAAWO,KAAKf,GAAU,CAAC,EAAGS,EAAc,KAAKM,EAAE,OAAO,EAC1D,MAAO,CACH,YAAa,GACb,OAAQ,CACJ,MAAAP,EACA,OAAAR,EACA,gBAAAW,EACA,aAAAC,CACJ,CACJ,CACJ,CAEA,IAAMI,EAAgBT,EAAY,YAAa,OAC1C,gBAEL,OACK,OAAOS,EAAkB,KAAe,CAAC,KAAK,YAC9CA,IAAkB,OAAS,CAAC,KAAK,YAAc,KAAK,YAE9C,CACH,YAAa,GACb,OAAQ,CACJ,MAAO,GACP,OAAQA,EACR,gBAAAL,EACA,aAAAC,CACJ,CACJ,EAIA,OAAOI,GAAkB,UACzB,MAAM,QAAQA,CAAa,GAC3BA,IAAkB,MAElBP,EAAc,KAAK,iBAAiB,EAC7B,CACH,YAAa,GACb,OAAQ,CACJ,MAAO,GACP,OAAQ,CAAC,CAAE,QAAS,iBAAkB,CAAC,EACvC,gBAAAE,EACA,aAAAC,CACJ,CACJ,GAGG,CACH,YAAa,GACb,cAAAI,EACA,iBAAAN,EACA,gBAAAC,EACA,aAAAC,CACJ,CACJ,CAKAK,GACIC,EACAC,EACAC,EACAC,EACAV,EAIAC,EACmD,CACnD,OAAKM,EASE,CACH,MAAO,GACP,OAAQE,EACR,gBAAAT,EACA,aAAAC,CACJ,EAbW,CACH,MAAO,GACP,OAAQS,EAAYF,EAAY,CAACA,EAAU,CAAC,CAAC,EAC7C,gBAAAR,EACA,aAAAC,CACJ,CASR,CAKO,SACHN,EACAgB,EACmD,CACnD,OAAO,MAAM,SAAShB,EAAQgB,CAAO,CAIzC,CAKA,MAAa,cACThB,EACAgB,EAC4D,CAC5D,OAAO,MAAM,cAAchB,EAAQgB,CAAO,CAG9C,CAKU,UACNhB,EACAgB,EACmD,CAEnD,GAAI,KAAK,sBAAwB,CAACA,GAAS,sBAAuB,CAC9D,GAAI,OAAOhB,EAAW,KAAeA,IAAW,KAC5C,GAAI,OAAOA,EAAW,KAAe,KAAK,WACtCA,EAAS,KAAK,oBAAoB,UAElC,CAAC,KAAK,YACLA,IAAW,MAAQ,KAAK,WAC3B,CACE,IAAMiB,EAAcjB,EACpB,MAAO,CACH,MAAO,GACP,OAAAA,EACA,iBAAkB,CACd,MAAO,CAAC,CACZ,EACA,aAAeP,GACP,OAAOA,EAAQ,IACR,CACH,OAAQ,CAAC,EACT,QAAS,GACT,UAAWwB,CACf,EAEG,KAAKzB,GACRC,EACA,CAAC,EACDwB,CACJ,CAER,CACJ,KACI,QAAO,KAAKC,GAAclB,EAAQgB,CAAO,EAIjD,GACI,OAAOhB,GAAW,UAClB,MAAM,QAAQA,CAAM,GACpBA,IAAW,KAEX,OAAO,KAAKkB,GAAclB,EAAQgB,CAAO,EAI7C,IAAMZ,EAAmB,IAAI,IACvBU,EAA8B,CAAC,EACjCK,EAAqC,KAEzC,QAAW1B,KAAO,OAAO,KAAKO,CAAa,EAAG,CAC1C,IAAMoB,EAAY,KAAKxC,GAAW,SAASa,CAAG,EAC9C,GAAI,CAAC2B,EAAU,MAAO,CAClB,IAAMC,EACFD,EAAU,QAAUA,EAAU,OAAO,OAAS,EACxCA,EAAU,OACV,CAAC,CAAE,QAAS,QAAQ3B,CAAG,cAAe,CAAC,EACjDW,EAAiB,IAAIX,EAAK,CACtB,MAAO,GACP,OAAQ4B,CACZ,CAAC,EACDF,EAAaE,EAAU,CAAC,EACxB,KACJ,CAEA,IAAMC,EAAc,KAAKzC,GAAa,SACjCmB,EAAeP,CAAG,CACvB,EAGA,GAFAW,EAAiB,IAAIX,EAAK6B,CAAkB,EAEvCA,EAAY,MAgBbR,EAAOrB,CAAG,EAAI6B,EAAY,WAhBN,CACpB,IAAMC,EACFD,EAAY,QAAUA,EAAY,OAAO,OAAS,EAC5CA,EAAY,OACZ,CACI,CACI,QAAS,kBAAkB7B,CAAG,cAClC,CACJ,EACVW,EAAiB,IAAIX,EAAK,CACtB,MAAO,GACP,OAAQ8B,CACZ,CAAC,EACDJ,EAAaI,EAAU,CAAC,EACxB,KACJ,CAGJ,CAEA,IAAMC,EAAgBxB,EAChBK,EAAkB,IACpB,KAAKlB,GAAmBiB,CAAgB,EACtCE,EAAgBb,GAAsB,CACxC,GAAI,OAAOA,EAAQ,IACf,MAAO,CACH,OAAQ,CAAC,EACT,QAAS,GACT,UAAW+B,CACf,EAEJ,IAAMjB,EAAeH,EAAiB,IAAIX,CAAG,EACvCe,EACFD,GAAgB,CAACA,EAAa,OACvBA,EAAa,QAAU,CAAC,GAAG,IACvBE,GAAuBA,EAAE,OAC9B,EACA,CAAC,EACX,OAAO,KAAKjB,GAAeC,EAAKe,EAASgB,CAAa,CAC1D,EAEA,OAAIL,IAAe,KACR,CACH,MAAO,GACP,OAAQ,CAACA,CAAU,EACnB,gBAAAd,EACA,aAAAC,CACJ,EAGG,CACH,MAAO,GACP,OAAQQ,EACR,gBAAAT,EACA,aAAAC,CACJ,CACJ,CAEA,OAAO,KAAKY,GAAclB,EAAQgB,CAAO,CAC7C,CAMAE,GACIlB,EACAgB,EACmD,CACnD,IAAMS,EAAQ,KAAK1B,GACfC,EACA,KAAK,gBAAgBA,EAAQgB,CAAO,CACxC,EACA,GAAIS,EAAM,YAAa,OAAOA,EAAM,OAEpC,GAAM,CACF,cAAAf,EACA,iBAAAN,EACA,gBAAAC,EACA,aAAAC,CACJ,EAAImB,EACEV,EAAYC,GAAS,uBAAyB,GAChDJ,EAAW,GACTE,EAA8B,CAAC,EAC/BD,EAA+B,CAAC,EAEtC,QAAWpB,KAAO,OAAO,KAAKiB,CAAa,EAAG,CAC1C,IAAMU,EAAY,KAAKxC,GAAW,SAASa,CAAG,EAC9C,GAAI,CAAC2B,EAAU,MAAO,CAClBR,EAAW,GACX,IAAMS,EACFD,EAAU,QAAUA,EAAU,OAAO,OAAS,EACxCA,EAAU,OACV,CAAC,CAAE,QAAS,QAAQ3B,CAAG,cAAe,CAAC,EAMjD,GALAW,EAAiB,IAAIX,EAAK,CACtB,MAAO,GACP,OAAQ4B,CACZ,CAAC,EACDR,EAAU,KAAK,GAAGQ,CAAS,EACvB,CAACN,EAAW,MAChB,QACJ,CAEA,IAAMO,EAAc,KAAKzC,GAAa,SAClC6B,EAAcjB,CAAG,EACjBsB,EAAY,CAAE,sBAAuB,EAAK,EAAI,MAClD,EAGA,GAFAX,EAAiB,IAAIX,EAAK6B,CAAkB,EAEvCA,EAAY,MASbR,EAAOrB,CAAG,EAAI6B,EAAY,WATN,CACpBV,EAAW,GACX,IAAMc,EACFJ,EAAY,QAAUA,EAAY,OAAO,OAAS,EAC5CA,EAAY,OACZ,CAAC,CAAE,QAAS,kBAAkB7B,CAAG,cAAe,CAAC,EAE3D,GADAoB,EAAU,KAAK,GAAGa,CAAW,EACzB,CAACX,EAAW,KACpB,CAGJ,CAEA,OAAO,KAAKJ,GACRC,EACAC,EACAC,EACAC,EACAV,EACAC,CACJ,CACJ,CAUA,MAAgB,eACZN,EACAgB,EAC4D,CAC5D,IAAMS,EAAQ,KAAK1B,GACfC,EACA,MAAM,KAAK,iBAAiBA,EAAQgB,CAAO,CAC/C,EACA,GAAIS,EAAM,YAAa,OAAOA,EAAM,OAEpC,GAAM,CACF,cAAAf,EACA,iBAAAN,EACA,gBAAAC,EACA,aAAAC,CACJ,EAAImB,EACEV,EAAYC,GAAS,uBAAyB,GAChDJ,EAAW,GACTE,EAA8B,CAAC,EAC/BD,EAA+B,CAAC,EAEtC,QAAWpB,KAAO,OAAO,KAAKiB,CAAa,EAAG,CAC1C,IAAMU,EAAY,MAAM,KAAKxC,GAAW,cAAca,CAAG,EACzD,GAAI,CAAC2B,EAAU,MAAO,CAClBR,EAAW,GACX,IAAMS,EACFD,EAAU,QAAUA,EAAU,OAAO,OAAS,EACxCA,EAAU,OACV,CAAC,CAAE,QAAS,QAAQ3B,CAAG,cAAe,CAAC,EAMjD,GALAW,EAAiB,IAAIX,EAAK,CACtB,MAAO,GACP,OAAQ4B,CACZ,CAAC,EACDR,EAAU,KAAK,GAAGQ,CAAS,EACvB,CAACN,EAAW,MAChB,QACJ,CAEA,IAAMO,EAAc,MAAM,KAAKzC,GAAa,cACxC6B,EAAcjB,CAAG,EACjBsB,EAAY,CAAE,sBAAuB,EAAK,EAAI,MAClD,EAGA,GAFAX,EAAiB,IAAIX,EAAK6B,CAAkB,EAEvCA,EAAY,MASbR,EAAOrB,CAAG,EAAI6B,EAAY,WATN,CACpBV,EAAW,GACX,IAAMc,EACFJ,EAAY,QAAUA,EAAY,OAAO,OAAS,EAC5CA,EAAY,OACZ,CAAC,CAAE,QAAS,kBAAkB7B,CAAG,cAAe,CAAC,EAE3D,GADAoB,EAAU,KAAK,GAAGa,CAAW,EACzB,CAACX,EAAW,KACpB,CAGJ,CAEA,OAAO,KAAKJ,GACRC,EACAC,EACAC,EACAC,EACAV,EACAC,CACJ,CACJ,CAKO,UASS,CACZ,OAAO,MAAM,SAAS,CAC1B,CAKO,aASS,CACZ,OAAO,MAAM,YAAY,CAC7B,CACJ,EA4DO,SAASqB,EAIZC,EACAhC,EAC6C,CAC7C,OAAOnB,EAAoB,OAAO,CAC9B,KAAM,SACN,UAAAmD,EACA,YAAAhC,CACJ,CAAQ,CACZ","names":["RecordSchemaBuilder","_RecordSchemaBuilder","SchemaBuilder","#keySchema","#valueSchema","props","_notUsed","errorMessage","value","_name","#buildNestedErrors","keyResults","out","k","v","#makeKeyResult","key","errors","rootObject","valueSchema","obj","val","#createValidationSetup","object","superResult","valid","rootErrorMsgs","nestedKeyResults","getNestedErrors","getErrorsFor","nestedResult","errMsgs","e","objToValidate","#buildEntryResult","allValid","allErrors","result","doNotStop","context","capturedObj","#validateFull","firstError","keyResult","keyErrors","valueResult","valErrors","capturedInput","setup","valueErrors","record","keySchema"]}
@@ -0,0 +1,2 @@
1
+ import{f as l}from"./chunk-CTP4RHDG.js";var n=class i 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;#t=!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;#i=function(){return"is expected to be an integer"};#c=this.#i;static create(e){return new i({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.#t=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.#i),(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.#t,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.createFromProps({...this.introspect()})}clearHasType(){return this.createFromProps({...this.introspect()})}#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.#t&&Number.isNaN(e)?{provider:this.#o}:this.#d&&!Number.isFinite(e)&&this.#t&&!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:t}=e;if(!r)return{done:!0,result:{valid:r,errors:t}};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 t=this.#f(e);return t?"message"in t?{valid:!1,errors:[{message:t.message}]}:{valid:!1,errors:[{message:this.getValidationErrorMessageSync(t.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 i.create(e)}equals(e,r){if(typeof e!="number")throw new Error("number expected");return this.createFromProps({...this.introspect(),equalsTo:e,equalsToValidationErrorMessageProvider:r})}clearEquals(){return this.createFromProps({...this.introspect(),equalsTo:void 0})}isFloat(){return this.createFromProps({...this.introspect(),isInteger:!1,ensureIsIntegerErrorMessageProvider:this.#i})}clearIsInteger(){return this.createFromProps({...this.introspect(),isInteger:!1,ensureIsIntegerErrorMessageProvider:this.#i})}isInteger(e){return this.createFromProps({...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.createFromProps({...this.introspect(),ensureNotNaN:!0,ensureNotNaNErrorMessageProvider:e})}canBeNaN(){return this.createFromProps({...this.introspect(),ensureNotNaN:!1,ensureNotNaNErrorMessageProvider:this.#l})}isFinite(e){return this.createFromProps({...this.introspect(),ensureIsFinite:!0,ensureIsFiniteErrorMessageProvider:e})}canBeInfinite(){return this.createFromProps({...this.introspect(),ensureIsFinite:!1,ensureIsFiniteErrorMessageProvider:this.#T})}min(e,r){if(typeof e!="number")throw new Error("minValue must be a number");return this.createFromProps({...this.introspect(),min:e,minValidationErrorMessageProvider:r})}clearMin(){let e=this.introspect();return delete e.min,this.createFromProps({...e})}max(e,r){if(typeof e!="number")throw new Error("maxValue must be a number");return this.createFromProps({...this.introspect(),max:e,maxValidationErrorMessageProvider:r})}clearMax(){let e=this.introspect();return delete e.max,this.createFromProps({...e})}nullable(){return super.nullable()}notNullable(){return super.notNullable()}};function d(i){return typeof i=="number"?n.create({isRequired:!0,equalsTo:i}):n.create({isRequired:!0})}export{n as a,d as b};
2
+ //# sourceMappingURL=chunk-KESLT5EE.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 only to give opportunity to extend it\n * by inheriting. It is not recommended to create an instance of this class\n * directly. Use {@link number | number()} function instead.\n *\n * @example ```ts\n * const schema = number().equals(42);\n * const result = schema.validate(42);\n * // result.valid === true\n * // result.object === 42\n * ```\n * @example ```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 ```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 ```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 #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.createFromProps({\n ...this.introspect()\n } as any) 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.createFromProps({\n ...this.introspect()\n } as any) 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.createFromProps({\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.createFromProps({\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.createFromProps({\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.createFromProps({\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.createFromProps({\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.createFromProps({\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.createFromProps({\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.createFromProps({\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.createFromProps({\n ...this.introspect(),\n ensureIsFinite: false,\n ensureIsFiniteErrorMessageProvider:\n this.#defaultEnsureIsFiniteErrorMessageProvider\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.createFromProps({\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.createFromProps({\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.createFromProps({\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.createFromProps({\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","minValue","schema","maxValue","number","equals"]}
@@ -0,0 +1,2 @@
1
+ import{f as o}from"./chunk-CTP4RHDG.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.createFromProps({...this.introspect()})}clearHasType(){return this.createFromProps({...this.introspect()})}#s(e){return typeof e!="boolean"?{message:"expected to be boolean"}:typeof this.#e<"u"&&e!==this.#e?{provider:this.#a}:null}#r(e){let{valid:a,transaction:t,errors:s}=e;if(!a)return{done:!0,result:{valid:a,errors:s}};let{object:{validatedObject:r}}=t;if(typeof r>"u"&&!this.isRequired||r===null&&(!this.isRequired||this.isNullable))return{done:!0,result:{valid:!0,object:r}};let l=this.#s(r);return l?"message"in l?{done:!0,result:{valid:!1,errors:[{message:l.message}]}}:{done:!1,provider:l.provider,objToValidate:r}:{done:!0,result:{valid:!0,object:r}}}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.#r(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.#r(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.createFromProps({...this.introspect(),equalsTo:e,equalsToValidationErrorMessageProvider:a})}clearEquals(){return this.createFromProps({...this.introspect(),equalsTo:void 0})}nullable(){return super.nullable()}notNullable(){return super.notNullable()}},d=()=>i.create({isRequired:!0});export{i as a,d as b};
2
+ //# sourceMappingURL=chunk-KFTO7TMB.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 only to give opportunity to extend it\n * by inheriting. It is not recommended to create an instance of this class\n * directly. Use {@link boolean | boolean()} function instead.\n *\n * @example ```ts\n * const schema = boolean().equals(true);\n * const result = schema.validate(true);\n * // result.valid === true\n * // result.object === true\n * ```\n * @example ```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 ```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 #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.createFromProps({\n ...this.introspect()\n } as any) 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.createFromProps({\n ...this.introspect()\n } as any) 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.createFromProps({\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.createFromProps({\n ...this.introspect(),\n equalsTo: undefined\n } as any) 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":"wCA0CO,IAAMA,EAAN,MAAMC,UAQHC,CAMR,CACEC,GACAC,GAEI,UAAsC,CACtC,MAAO,2BAA2B,KAAKD,EAAS,EACpD,EACAE,GAEI,KAAKD,GAKT,OAAc,OAAOE,EAA6C,CAC9D,OAAO,IAAIL,EAAqB,CAC5B,KAAM,UACN,GAAGK,CACP,CAAC,CACL,CAEU,YAAYA,EAAmD,CACrE,MAAMA,CAAY,GAGd,OAAOA,EAAM,UAAa,WAC1B,OAAOA,EAAM,SAAa,OAE1B,KAAKH,GAAYG,EAAM,UAG3B,KAAKD,GACD,KAAK,qCACDC,EAAM,uCACN,KAAKF,EACT,CACR,CAEO,YAAa,CAChB,MAAO,CACH,GAAG,MAAM,WAAW,EAIpB,SAAU,KAAKD,GAKf,uCACI,KAAKE,EACb,CACJ,CAKO,QACHE,EASY,CACZ,OAAO,KAAK,gBAAgB,CACxB,GAAG,KAAK,WAAW,CACvB,CAAQ,CACZ,CAKO,cAQS,CACZ,OAAO,KAAK,gBAAgB,CACxB,GAAG,KAAK,WAAW,CACvB,CAAQ,CACZ,CAEAC,GACIC,EAC8C,CAC9C,OAAI,OAAOA,GAAkB,UAClB,CAAE,QAAS,wBAAyB,EAI3C,OAAO,KAAKN,GAAc,KAC1BM,IAAkB,KAAKN,GAEhB,CAAE,SAAU,KAAKE,EAA8B,EAGnD,IACX,CAEAK,GACIC,EAOI,CACJ,GAAM,CACF,MAAAC,EACA,YAAaC,EACb,OAAAC,CACJ,EAAIH,EAEJ,GAAI,CAACC,EACD,MAAO,CAAE,KAAM,GAAM,OAAQ,CAAE,MAAAA,EAAO,OAAAE,CAAO,CAAE,EAGnD,GAAM,CACF,OAAQ,CAAE,gBAAiBL,CAAc,CAC7C,EAAII,EAEJ,GACK,OAAOJ,EAAkB,KAAe,CAAC,KAAK,YAC9CA,IAAkB,OAAS,CAAC,KAAK,YAAc,KAAK,YAErD,MAAO,CACH,KAAM,GACN,OAAQ,CAAE,MAAO,GAAM,OAAQA,CAAc,CACjD,EAGJ,IAAMM,EAAY,KAAKP,GAAwBC,CAAa,EAE5D,OAAKM,EAOD,YAAaA,EACN,CACH,KAAM,GACN,OAAQ,CACJ,MAAO,GACP,OAAQ,CAAC,CAAE,QAASA,EAAU,OAAQ,CAAC,CAC3C,CACJ,EAGG,CACH,KAAM,GACN,SAAUA,EAAU,SACpB,cAAAN,CACJ,EApBW,CACH,KAAM,GACN,OAAQ,CAAE,MAAO,GAAM,OAAQA,CAAyB,CAC5D,CAkBR,CAGO,SACHO,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,CAEzB,GAAI,KAAK,qBAAsB,CAC3B,GAAI,OAAOD,EAAW,KAAeA,IAAW,KAC5C,GAAI,OAAOA,EAAW,KAAe,KAAK,WACtCA,EAAS,KAAK,oBAAoB,MAC/B,OACH,CAAC,KAAK,YACLA,IAAW,MAAQ,KAAK,WAElB,CAAE,MAAO,GAAM,OAAQA,CAAO,EAE9B,CACH,MAAO,GACP,OAAQ,CACJ,CACI,QAAS,KAAK,8BACV,KAAK,qBACLA,CACJ,CACJ,CACJ,CACJ,EAIR,IAAMD,EAAY,KAAKP,GAAwBQ,CAAM,EAErD,OAAKD,EAID,YAAaA,EACN,CACH,MAAO,GACP,OAAQ,CAAC,CAAE,QAASA,EAAU,OAAQ,CAAC,CAC3C,EAGG,CACH,MAAO,GACP,OAAQ,CACJ,CACI,QAAS,KAAK,8BACVA,EAAU,SACVC,CACJ,CACJ,CACJ,CACJ,EApBW,CAAE,MAAO,GAAM,OAAQA,CAAkB,CAqBxD,CAEA,IAAME,EAAI,KAAKR,GAAa,KAAK,gBAAgBM,EAAQC,CAAO,CAAC,EACjE,OAAIC,EAAE,KAAaA,EAAE,OACd,CACH,MAAO,GACP,OAAQ,CACJ,CACI,QAAS,KAAK,8BACVA,EAAE,SACFA,EAAE,aACN,CACJ,CACJ,CACJ,CACJ,CAOA,MAAgB,eACZF,EACAC,EACkC,CAClC,IAAMC,EAAI,KAAKR,GACX,MAAM,MAAM,iBAAiBM,EAAQC,CAAO,CAChD,EACA,OAAIC,EAAE,KAAaA,EAAE,OACd,CACH,MAAO,GACP,OAAQ,CACJ,CACI,QAAS,MAAM,KAAK,0BAChBA,EAAE,SACFA,EAAE,aACN,CACJ,CACJ,CACJ,CACJ,CAEU,gBACNZ,EACI,CACJ,OAAOL,EAAqB,OAAOK,CAAY,CACnD,CAKO,SACHa,EASY,CACZ,OAAO,MAAM,SAASA,CAAY,CACtC,CAKO,UAQS,CACZ,OAAO,MAAM,SAAS,CAC1B,CAKO,QACHC,EASY,CACZ,OAAO,MAAM,QAAQA,CAAK,CAC9B,CAKO,cAQS,CACZ,OAAO,MAAM,aAAa,CAC9B,CAKO,MACHC,EASY,CACZ,OAAO,MAAM,MAAMA,CAAK,CAC5B,CASO,UAQS,CACZ,OAAO,MAAM,SAAS,CAC1B,CAKO,OACHD,EAIAD,EAGF,CACE,GAAI,OAAOC,GAAU,UAAW,MAAM,IAAI,MAAM,kBAAkB,EAClE,OAAO,KAAK,gBAAgB,CACxB,GAAG,KAAK,WAAW,EACnB,SAAUA,EACV,uCAAwCD,CAC5C,CAAQ,CASZ,CAKO,aAQS,CACZ,OAAO,KAAK,gBAAgB,CACxB,GAAG,KAAK,WAAW,EACnB,SAAU,MACd,CAAQ,CACZ,CAKO,UAQS,CACZ,OAAO,MAAM,SAAS,CAC1B,CAKO,aAQS,CACZ,OAAO,MAAM,YAAY,CAC7B,CACJ,EAKaG,EAAU,IACnBtB,EAAqB,OAAO,CACxB,WAAY,EAChB,CAAC","names":["BooleanSchemaBuilder","_BooleanSchemaBuilder","SchemaBuilder","#equalsTo","#defaultEqualsToErrorMessageProvider","#equalsToErrorMessageProvider","props","_notUsed","#getConstraintViolation","objToValidate","#buildResult","superResult","valid","preValidationTransaction","errors","violation","object","context","r","errorMessage","value","_name","boolean"]}
@@ -0,0 +1,2 @@
1
+ import{d as p,f as h}from"./chunk-CTP4RHDG.js";function S(s){return typeof s=="object"&&s!==null&&"key"in s?String(s.key):String(s)}function m(s){return s.map(S).join(".")}var T=class s extends h{#e;[p]=!0;static create(e){return new s({type:"extern",...e})}constructor(e){super(e),this.#e=e.standardSchema}get standardSchema(){return this.#e}hasType(e){return this.createFromProps({...this.introspect()})}clearHasType(){return this.createFromProps({...this.introspect()})}#a(e){return e.map(t=>({message:t.path&&t.path.length>0?`${m(t.path)}: ${t.message}`:t.message}))}#t(e,t){let i=new Map,o=[];for(let r of e)if(r.path&&r.path.length>0){let a=S(r.path[0]),d=r.path.slice(1),c=d.length>0?`${m(d)}: ${r.message}`:r.message;i.has(a)||(i.set(a,[]),o.push(a)),i.get(a).push(c)}let l=new WeakMap,n=t?.currentPropertyDescriptor;if(n)for(let r of o){let a=n[r];a&&typeof a=="object"&&l.set(a,r)}return{fn:r=>{let a;if(typeof r=="function"?a=r(n):a=n,!a||typeof a!="object")return{isValid:!0,errors:[]};let d=l.get(a),c=d?i.get(d)||[]:[];return{isValid:c.length===0,errors:c}},errorPropertyNames:o}}validate(e,t){return super.validate(e,t)}async validateAsync(e,t){return super.validateAsync(e,t)}_validate(e,t){let i=this.preValidateSync(e,t);if(!i.valid)return{valid:!1,errors:i.errors};let{transaction:o}=i,l=o.object.validatedObject;if(l==null)return{valid:!0,object:l};let n=this.#e["~standard"].validate(l);if(n instanceof Promise)throw new Error("The external Standard Schema returned a Promise from validate(). Use validateAsync() for schemas with async validation.");if("value"in n){let{fn:a}=this.#t([],t);return{valid:!0,object:n.value,getErrorsFor:a}}let{fn:u,errorPropertyNames:r}=this.#t(n.issues,t);return{valid:!1,errors:this.#a(n.issues),getErrorsFor:u,__externErrorPropertyNames:r}}async _validateAsync(e,t){let i=await this.preValidateAsync(e,t);if(!i.valid)return{valid:!1,errors:i.errors};let{transaction:o}=i,l=o.object.validatedObject;if(l==null)return{valid:!0,object:l};let n=await this.#e["~standard"].validate(l);if("value"in n){let{fn:a}=this.#t([],t);return{valid:!0,object:n.value,getErrorsFor:a}}let{fn:u,errorPropertyNames:r}=this.#t(n.issues,t);return{valid:!1,errors:this.#a(n.issues),getErrorsFor:u,__externErrorPropertyNames:r}}createFromProps(e){return s.create(e)}introspect(){return{...super.introspect(),standardSchema:this.#e}}required(e){return super.required(e)}optional(){return super.optional()}default(e){return super.default(e)}clearDefault(){return super.clearDefault()}brand(e){return super.brand(e)}readonly(){return super.readonly()}nullable(){return super.nullable()}notNullable(){return super.notNullable()}},f=s=>T.create({isRequired:!0,standardSchema:s});export{T as a,f as b};
2
+ //# sourceMappingURL=chunk-MKAYFPAR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/builders/ExternSchemaBuilder.ts"],"sourcesContent":["import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport {\n type BRAND,\n SchemaBuilder,\n SYMBOL_HAS_PROPERTIES,\n type ValidationContext,\n type ValidationErrorMessageProvider,\n type ValidationResult\n} from './SchemaBuilder.js';\n\ntype ExternSchemaBuilderCreateProps<R extends boolean = true> = Partial<\n ReturnType<ExternSchemaBuilder<any, R>['introspect']>\n> & {\n standardSchema: StandardSchemaV1;\n};\n\n/**\n * Extracts the first path segment from a Standard Schema issue path entry\n * as a string.\n */\nfunction firstPathSegmentStr(\n segment: PropertyKey | StandardSchemaV1.PathSegment\n): string {\n return typeof segment === 'object' && segment !== null && 'key' in segment\n ? String(segment.key)\n : String(segment);\n}\n\n/**\n * Formats a Standard Schema issue path into a dotted string.\n *\n * Standard Schema paths may contain bare `PropertyKey` values (string, number,\n * symbol) or `PathSegment` objects with a `.key` property.\n *\n * @example\n * ```\n * formatIssuePath(['address', 'city']) // → 'address.city'\n * formatIssuePath([{ key: 'items' }, 0]) // → 'items.0'\n * ```\n */\nfunction formatIssuePath(\n path: ReadonlyArray<PropertyKey | StandardSchemaV1.PathSegment>\n): string {\n return path.map(firstPathSegmentStr).join('.');\n}\n\n/**\n * Schema builder that wraps an external\n * [Standard Schema v1](https://standardschema.dev/) compatible schema\n * (e.g. Zod, Valibot, ArkType) into a `@cleverbrush/schema` builder.\n *\n * This enables cross-library schema composition — you can use a Zod schema\n * as a property inside a `@cleverbrush/schema` object schema, and the\n * inferred TypeScript type will be correct.\n *\n * Validation is delegated entirely to the external schema's\n * `['~standard'].validate()` method. Standard Schema issues are mapped to\n * `@cleverbrush/schema` `ValidationError` objects, with any issue paths\n * formatted as dotted prefixes (e.g. `\"address.city: must be a string\"`).\n *\n * When used inside an `object()` schema, the property descriptor tree is\n * built dynamically (via Proxy) from the external schema's output type,\n * so `getErrorsFor(t => t.order.id)` works without any additional\n * configuration.\n *\n * **NOTE** this class is exported only to give opportunity to extend it\n * by inheriting. It is not recommended to create an instance of this class\n * directly. Use the {@link extern | extern()} factory function instead.\n *\n * @example\n * ```ts\n * import { z } from 'zod';\n * import { object, date, extern, InferType } from '@cleverbrush/schema';\n *\n * const zodUser = z.object({ first: z.string(), last: z.string() });\n *\n * const order = object({\n * user: extern(zodUser),\n * date: date(),\n * });\n *\n * type Order = InferType<typeof order>;\n * // { user: { first: string; last: string }; date: Date }\n * ```\n *\n * @see {@link extern}\n */\nexport class ExternSchemaBuilder<\n TStandardSchema extends StandardSchemaV1 = StandardSchemaV1,\n TRequired extends boolean = true,\n TNullable extends boolean = false,\n TExplicitType = undefined,\n THasDefault extends boolean = false,\n TExtensions = {},\n TResult = TExplicitType extends undefined\n ? StandardSchemaV1.InferOutput<TStandardSchema>\n : TExplicitType\n> extends SchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n> {\n #standardSchema: TStandardSchema;\n\n /**\n * Always `true` for extern schemas — enables Proxy-based property\n * descriptor trees and nested error propagation in\n * `ObjectSchemaBuilder`.\n */\n readonly [SYMBOL_HAS_PROPERTIES] = true;\n\n /**\n * @hidden\n */\n public static create(props: ExternSchemaBuilderCreateProps<any>) {\n return new ExternSchemaBuilder({\n type: 'extern',\n ...props\n });\n }\n\n protected constructor(props: ExternSchemaBuilderCreateProps<TRequired>) {\n super(props as any);\n this.#standardSchema = props.standardSchema as TStandardSchema;\n }\n\n /**\n * Returns the wrapped Standard Schema instance.\n */\n public get standardSchema(): TStandardSchema {\n return this.#standardSchema;\n }\n\n /**\n * @inheritdoc\n */\n public hasType<T>(\n _notUsed?: T\n ): ExternSchemaBuilder<\n TStandardSchema,\n true,\n TNullable,\n T,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.createFromProps({\n ...this.introspect()\n } as any) as any;\n }\n\n /**\n * @inheritdoc\n */\n public clearHasType(): ExternSchemaBuilder<\n TStandardSchema,\n TRequired,\n TNullable,\n undefined,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.createFromProps({\n ...this.introspect()\n } as any) as any;\n }\n\n /**\n * Maps a Standard Schema failure result into the library's\n * `ValidationError[]` format.\n */\n #mapIssues(\n issues: ReadonlyArray<StandardSchemaV1.Issue>\n ): { message: string }[] {\n return issues.map(issue => ({\n message:\n issue.path && issue.path.length > 0\n ? `${formatIssuePath(issue.path)}: ${issue.message}`\n : issue.message\n }));\n }\n\n /**\n * Builds a `getErrorsFor` function that maps Standard Schema issue\n * paths to per-property error lists via the Proxy-based property\n * descriptor tree.\n *\n * The function groups issues by their first path segment, then builds\n * a WeakMap from each Proxy-created child descriptor to its property\n * name so that `getErrorsFor(() => descriptor)` can look up errors.\n */\n #buildGetErrorsFor(\n issues: ReadonlyArray<StandardSchemaV1.Issue>,\n context?: ValidationContext\n ): {\n fn: (selector?: Function) => { isValid: boolean; errors: string[] };\n errorPropertyNames: string[];\n } {\n const errorsByProperty = new Map<string, string[]>();\n const errorPropertyNames: string[] = [];\n\n for (const issue of issues) {\n if (issue.path && issue.path.length > 0) {\n const firstName = firstPathSegmentStr(issue.path[0]);\n\n const restPath = issue.path.slice(1);\n const message =\n restPath.length > 0\n ? `${formatIssuePath(restPath)}: ${issue.message}`\n : issue.message;\n\n if (!errorsByProperty.has(firstName)) {\n errorsByProperty.set(firstName, []);\n errorPropertyNames.push(firstName);\n }\n errorsByProperty.get(firstName)!.push(message);\n }\n }\n\n // Build reverse map: access each error property on the Proxy\n // descriptor to create (and cache) the child, then map it back\n // to the property name.\n const descriptorToName = new WeakMap<object, string>();\n const currentPropertyDescriptor = context?.currentPropertyDescriptor;\n if (currentPropertyDescriptor) {\n for (const name of errorPropertyNames) {\n const desc = (currentPropertyDescriptor as any)[name];\n if (desc && typeof desc === 'object') {\n descriptorToName.set(desc, name);\n }\n }\n }\n\n const fn = (selector?: Function) => {\n let descriptor: any;\n if (typeof selector === 'function') {\n descriptor = selector(currentPropertyDescriptor);\n } else {\n descriptor = currentPropertyDescriptor;\n }\n\n if (!descriptor || typeof descriptor !== 'object') {\n return { isValid: true, errors: [] };\n }\n\n const propName = descriptorToName.get(descriptor);\n const errors = propName ? errorsByProperty.get(propName) || [] : [];\n\n return {\n isValid: errors.length === 0,\n errors\n };\n };\n\n return { fn, errorPropertyNames };\n }\n\n /** {@inheritDoc SchemaBuilder.validate} */\n public validate(\n object: TResult,\n context?: ValidationContext\n ): ValidationResult<TResult> {\n return super.validate(object, context) as ValidationResult<TResult>;\n }\n\n /** {@inheritDoc SchemaBuilder.validateAsync} */\n public async validateAsync(\n object: TResult,\n context?: ValidationContext\n ): Promise<ValidationResult<TResult>> {\n return super.validateAsync(object, context) as Promise<\n ValidationResult<TResult>\n >;\n }\n\n /**\n * Performs synchronous validation by delegating to the external\n * Standard Schema's `validate()` method.\n *\n * If the external schema returns a `Promise` (async validation),\n * this method throws — use {@link validateAsync} instead.\n */\n protected _validate(\n object: TResult,\n context?: ValidationContext\n ): ValidationResult<TResult> {\n const superResult = this.preValidateSync(object, context);\n\n if (!superResult.valid) {\n return { valid: false, errors: superResult.errors };\n }\n\n const { transaction: preValidationTransaction } = superResult;\n\n const objToValidate = preValidationTransaction!.object.validatedObject;\n\n // When the value is null/undefined and preValidation accepted it\n // (optional or nullable), return early without calling the external\n // schema — it would likely reject these sentinel values.\n if (objToValidate === undefined || objToValidate === null) {\n return { valid: true, object: objToValidate };\n }\n\n const result =\n this.#standardSchema['~standard'].validate(objToValidate);\n\n if (result instanceof Promise) {\n throw new Error(\n 'The external Standard Schema returned a Promise from validate(). ' +\n 'Use validateAsync() for schemas with async validation.'\n );\n }\n\n if ('value' in result) {\n const { fn } = this.#buildGetErrorsFor([], context);\n return {\n valid: true,\n object: result.value as TResult,\n getErrorsFor: fn\n } as any;\n }\n\n const { fn, errorPropertyNames } = this.#buildGetErrorsFor(\n result.issues,\n context\n );\n return {\n valid: false,\n errors: this.#mapIssues(result.issues),\n getErrorsFor: fn,\n __externErrorPropertyNames: errorPropertyNames\n } as any;\n }\n\n /**\n * Performs async validation by delegating to the external\n * Standard Schema's `validate()` method. Supports external schemas\n * that return a `Promise` from their `validate()`.\n */\n protected async _validateAsync(\n object: TResult,\n context?: ValidationContext\n ): Promise<ValidationResult<TResult>> {\n const superResult = await this.preValidateAsync(object, context);\n\n if (!superResult.valid) {\n return { valid: false, errors: superResult.errors };\n }\n\n const { transaction: preValidationTransaction } = superResult;\n\n const objToValidate = preValidationTransaction!.object.validatedObject;\n\n if (objToValidate === undefined || objToValidate === null) {\n return { valid: true, object: objToValidate };\n }\n\n const result =\n await this.#standardSchema['~standard'].validate(objToValidate);\n\n if ('value' in result) {\n const { fn } = this.#buildGetErrorsFor([], context);\n return {\n valid: true,\n object: result.value as TResult,\n getErrorsFor: fn\n } as any;\n }\n\n const { fn, errorPropertyNames } = this.#buildGetErrorsFor(\n result.issues,\n context\n );\n return {\n valid: false,\n errors: this.#mapIssues(result.issues),\n getErrorsFor: fn,\n __externErrorPropertyNames: errorPropertyNames\n } as any;\n }\n\n protected createFromProps<TReq extends boolean>(\n props: ExternSchemaBuilderCreateProps<TReq>\n ): this {\n return ExternSchemaBuilder.create(props as any) as any;\n }\n\n /**\n * Returns a snapshot of the builder's internal state.\n * Includes the wrapped `standardSchema` reference.\n */\n public introspect() {\n return {\n ...super.introspect(),\n standardSchema: this.#standardSchema\n };\n }\n\n /**\n * @hidden\n */\n public required(\n errorMessage?: ValidationErrorMessageProvider\n ): ExternSchemaBuilder<\n TStandardSchema,\n true,\n TNullable,\n TExplicitType,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.required(errorMessage);\n }\n\n /**\n * @hidden\n */\n public optional(): ExternSchemaBuilder<\n TStandardSchema,\n false,\n TNullable,\n TExplicitType,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.optional();\n }\n\n /**\n * @hidden\n */\n public default(\n value: TResult | (() => TResult)\n ): ExternSchemaBuilder<\n TStandardSchema,\n true,\n TNullable,\n TExplicitType,\n true,\n TExtensions\n > &\n TExtensions {\n return super.default(value) as any;\n }\n\n /**\n * @hidden\n */\n public clearDefault(): ExternSchemaBuilder<\n TStandardSchema,\n TRequired,\n TNullable,\n TExplicitType,\n false,\n TExtensions\n > &\n TExtensions {\n return super.clearDefault() as any;\n }\n\n /**\n * @hidden\n */\n public brand<TBrand extends string | symbol>(\n _name?: TBrand\n ): ExternSchemaBuilder<\n TStandardSchema,\n TRequired,\n TNullable,\n TResult & { readonly [K in BRAND]: TBrand },\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.brand(_name);\n }\n\n /**\n * Marks the inferred type as `Readonly<T>`. Sets the `isReadonly`\n * introspection flag for tooling consistency.\n *\n * @see {@link SchemaBuilder.readonly}\n */\n public readonly(): ExternSchemaBuilder<\n TStandardSchema,\n TRequired,\n TNullable,\n Readonly<TResult>,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.readonly();\n }\n\n /**\n * @hidden\n */\n public nullable(): ExternSchemaBuilder<\n TStandardSchema,\n TRequired,\n true,\n TExplicitType,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.nullable() as any;\n }\n\n /**\n * @hidden\n */\n public notNullable(): ExternSchemaBuilder<\n TStandardSchema,\n TRequired,\n false,\n TExplicitType,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.notNullable() as any;\n }\n}\n\n/**\n * Wraps an external [Standard Schema v1](https://standardschema.dev/)\n * compatible schema into a `@cleverbrush/schema` builder.\n *\n * This enables cross-library schema composition — use schemas from Zod,\n * Valibot, ArkType, or any Standard Schema v1 compliant library as\n * properties inside `@cleverbrush/schema` object schemas with full type\n * inference.\n *\n * @param standardSchema - A Standard Schema v1 compliant schema instance\n * (any object that exposes a `['~standard']` property with `version: 1`\n * and a `validate` function).\n *\n * @example\n * ```ts\n * import { z } from 'zod';\n * import { object, date, extern, InferType } from '@cleverbrush/schema';\n *\n * const zodUser = z.object({ first: z.string(), last: z.string() });\n *\n * const order = object({\n * user: extern(zodUser),\n * date: date(),\n * });\n *\n * type Order = InferType<typeof order>;\n * // { user: { first: string; last: string }; date: Date }\n *\n * order.validate({\n * user: { first: 'Alice', last: 'Smith' },\n * date: new Date(),\n * }); // { valid: true, object: { user: …, date: … } }\n * ```\n *\n * @example\n * ```ts\n * // Optional external schema\n * const schema = extern(zodUser).optional();\n * schema.validate(undefined); // valid\n * ```\n *\n * @example\n * ```ts\n * // Inside an array\n * import { array, extern } from '@cleverbrush/schema';\n * const users = array(extern(zodUser));\n * ```\n */\nexport const extern = <T extends StandardSchemaV1>(standardSchema: T) =>\n ExternSchemaBuilder.create({\n isRequired: true,\n standardSchema\n }) as ExternSchemaBuilder<T, true>;\n"],"mappings":"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","names":["firstPathSegmentStr","segment","formatIssuePath","path","ExternSchemaBuilder","_ExternSchemaBuilder","SchemaBuilder","#standardSchema","SYMBOL_HAS_PROPERTIES","props","_notUsed","#mapIssues","issues","issue","#buildGetErrorsFor","context","errorsByProperty","errorPropertyNames","firstName","restPath","message","descriptorToName","currentPropertyDescriptor","name","desc","selector","descriptor","propName","errors","object","superResult","preValidationTransaction","objToValidate","result","fn","errorMessage","value","_name","extern","standardSchema"]}
@@ -0,0 +1,2 @@
1
+ import{c as f,d as j,f as R}from"./chunk-CTP4RHDG.js";var E=class{#e;#r;#t=[];#n=[];get seenValue(){let e=this.#e[f].getValue(this.#r);return e.success?e.value:void 0}get errors(){return this.#t}get isValid(){return this.#t.length===0&&this.getChildErrors().length===0}getChildErrors(){return this.#n}get descriptor(){return this.#e[f]}constructor(e,r,t){if(!x.isValidPropertyDescriptor(e))throw new Error("Invalid property descriptor");this.#e=e,this.#t=Array.isArray(t)?[...t]:[],this.#r=r}addError(e){this.#t.push(e)}addChildError(e){this.#n.push(e)}toJSON(){return{isValid:this.isValid,errors:this.errors}}};var B="must be an object",x=class c extends R{#e={};#r=!1;#t=[];[j]=!0;#n=new WeakMap;static create(e){return new c({type:"object",...e})}createFromProps(e){return c.create(e)}constructor(e){super(e),typeof e.properties=="object"&&e.properties&&(this.#e=e.properties,this.#t=Object.keys(e.properties)),typeof e.acceptUnknownProps=="boolean"&&(this.#r=e.acceptUnknownProps)}introspect(){return{...super.introspect(),properties:{...this.#e},acceptUnknownProps:this.#r}}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()}#a(e){c.isValidPropertyDescriptor(e?.context?.rootPropertyDescriptor)||(e.context.rootPropertyDescriptor=c.getPropertiesFor(this)),c.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.#a(t),t}async preValidateAsync(e,r){let t=await super.preValidateAsync(e,r);return this.#a(t),t}#s(e){let{valid:r,context:t,transaction:n,errors:o}=e,i=new WeakMap,{doNotStopOnFirstError:p,rootValidationObject:y}=t,a=t.rootPropertyDescriptor,s=t.currentPropertyDescriptor,T=(h,m,b)=>{if(!c.isValidPropertyDescriptor(h))throw new Error("invalid property descriptor");let S=i.has(h)?i.get(h):null;if(S||(S=new E(h,y),i.set(h,S)),S.addError(m),b&&c.isValidPropertyDescriptor(b)){let D=i.has(b)?i.get(b):null;D||(D=new E(b,y),i.set(b,D)),D.addChildError(S)}},d=(h=>{let m=typeof h=="function"?h(s):s;if(!c.isValidPropertyDescriptor(m))throw new Error("invalid property descriptor");return i.has(m)||i.set(m,new E(m,y)),i.get(m)}),l=e.errors||[];if(!r&&!p&&o){if(c.isValidPropertyDescriptor(s))for(let h of o)T(s,h.message);return{earlyReturn:!0,result:{valid:r,errors:o,getErrorsFor:d}}}let{object:{validatedObject:u}}=n;if(typeof u>"u"&&!this.isRequired||u===null&&(!this.isRequired||this.isNullable))return{earlyReturn:!0,result:{valid:!0,object:n.commit().validatedObject,getErrorsFor:d}};if(typeof u!="object"&&(l.push({message:B}),T(s,B),!p))return n&&n.rollback(),{earlyReturn:!0,result:{valid:!1,errors:[l[0]],getErrorsFor:d}};let P=this.#t,g=Object.keys(u);if(P.length===0){if(g.length===0)return p&&l.length>0?{earlyReturn:!0,result:{valid:!1,errors:l,getErrorsFor:d}}:(n&&n.commit().validatedObject,{earlyReturn:!0,result:{valid:!0,object:{},getErrorsFor:d}});if(!this.#r){for(let h=0;h<g.length;h++){let m=`unknown property '${g[h]}'`;if(l.push({message:m}),!p)break}return n&&n.rollback(),{earlyReturn:!0,result:{valid:!1,errors:p?l:[l[0]],getErrorsFor:d}}}return n&&n.commit(),{earlyReturn:!0,result:{valid:!0,object:{...u},getErrorsFor:d}}}return{earlyReturn:!1,errors:l,objToValidate:u,propKeys:P,objKeys:g,addErrorFor:T,getErrorsFor:d,doNotStopOnFirstError:!!p,rootPropertyDescriptor:a,currentPropertyDescriptor:s,validationTransaction:n}}#o(e,r){let{objToValidate:t,objKeys:n,addErrorFor:o,getErrorsFor:i,doNotStopOnFirstError:p,currentPropertyDescriptor:y,validationTransaction:a}=e,s=e.errors,T=!1;for(let{result:d}of r)if(!d.valid&&(T=!0,Array.isArray(d.errors)))for(let l of d.errors)s.push(l);for(let d=0;d<n.length;d++){let l=n[d];if(!(l in this.#e)&&!this.#r){let u=`unknown property '${l}'`;if(s.push({message:u}),o(y,u),!p)return a&&a.rollback(),{valid:!1,errors:[s[0]],getErrorsFor:i}}}if(!T&&s.length===0){let d={};for(let{key:l,result:u}of r)d[l]=u.object;if(this.#r)for(let l of n)l in this.#e||(d[l]=t[l]);return{valid:!0,object:d,getErrorsFor:i}}for(let{key:d,result:l}of r)if(!l.valid){let u=y[d];if(typeof l.getErrorsFor=="function"&&c.isValidPropertyDescriptor(u)){if(c.#y(l,u,o),Array.isArray(l.__externErrorPropertyNames)&&Array.isArray(l.errors))for(let P of l.errors)o(u,P.message,y)}else if(Array.isArray(l.errors)&&c.isValidPropertyDescriptor(u))for(let P of l.errors)o(u,P.message)}return a.rollback(),{valid:!1,errors:p?s:s[0]?[s[0]]:[],getErrorsFor:i}}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.#i(e,r).getErrorsFor(n)}}}else{let t=this;return{valid:!1,errors:[{message:this.getValidationErrorMessageSync(this.requiredErrorMessage,e)}],getErrorsFor(n){return t.#i(e,r).getErrorsFor(n)}}}else if(typeof e=="object"){let t=this.#t;if(!this.#r){let i=Object.keys(e);for(let p=0;p<i.length;p++)if(!(i[p]in this.#e)){let y=this;return{valid:!1,errors:[{message:`unknown property '${i[p]}'`}],getErrorsFor(a){return y.#i(e,r).getErrorsFor(a)}}}}let n={};for(let i=0;i<t.length;i++){let p=t[i],y=this.#e[p].validate(e[p]);if(!y.valid){let a=this;return{valid:!1,errors:y.errors&&y.errors.length>0?[y.errors[0]]:[],getErrorsFor(s){return a.#i(e,r).getErrorsFor(s)}}}n[p]=y.object}if(this.#r){let i=Object.keys(e);for(let p=0;p<i.length;p++)i[p]in this.#e||(n[i[p]]=e[i[p]])}let o=this;return{valid:!0,object:n,getErrorsFor(i){return o.#i(e,r).getErrorsFor(i)}}}}return this.#i(e,r)}#i(e,r){let t=this.#s(this.preValidateSync(e,r));if(t.earlyReturn)return t.result;let{propKeys:n,objToValidate:o,doNotStopOnFirstError:i,rootPropertyDescriptor:p,currentPropertyDescriptor:y}=t,a=[];for(let s of n){let T=this.#e[s].validate(o[s],{...r,rootPropertyDescriptor:p,currentPropertyDescriptor:y[s]});if(a.push({key:s,result:T}),!T.valid&&!i)break}return this.#o(t,a)}async _validateAsync(e,r){let t=this.#s(await this.preValidateAsync(e,r));if(t.earlyReturn)return t.result;let{propKeys:n,objToValidate:o,doNotStopOnFirstError:i,rootPropertyDescriptor:p,currentPropertyDescriptor:y}=t,a=[];if(i){let s=await Promise.all(n.map(async T=>{let d=await this.#e[T].validateAsync(o[T],{...r,rootPropertyDescriptor:p,currentPropertyDescriptor:y[T]});return{key:T,result:d}}));a.push(...s)}else for(let s of n){let T=await this.#e[s].validateAsync(o[s],{...r,rootPropertyDescriptor:p,currentPropertyDescriptor:y[s]});if(a.push({key:s,result:T}),!T.valid)break}return this.#o(t,a)}acceptUnknownProps(){return this.createFromProps({...this.introspect(),acceptUnknownProps:!0})}notAcceptUnknownProps(){return this.createFromProps({...this.introspect(),acceptUnknownProps:!1})}hasType(e){return this.createFromProps({...this.introspect()})}clearHasType(){return this.createFromProps({...this.introspect()})}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 R))throw new Error("schema must be an instance of the SchemaBuilder class");return this.createFromProps({...this.introspect(),properties:{...this.introspect().properties,[e]:r}})}optimize(){return this.createFromProps({...this.introspect()})}addProps(e){if(e instanceof c)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 R))throw new Error(`${t} is not a SchemaBuilder`);r[t]=e[t]}return this.createFromProps({...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.createFromProps({...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(o=>{if(typeof o!="string"||!o)throw new Error("property name must be a string");if(!(o in this.#e))throw new Error(`property ${o.toString()} does not exists in the schema`);t.set(o.toString(),!0)}),t.size===0)throw new Error("please provide at least one property to omit");let n={...this.introspect()};for(let o of t.keys())delete n.properties[o];return this.createFromProps(n)}else if(e instanceof c){let r={...e.introspect().properties},t={...this.introspect()};for(let n in r)n in t.properties&&delete t.properties[n];return this.createFromProps(t)}throw new Error("this parameter type is not supported")}intersect(e){if(!(e instanceof c))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((o,i)=>(o[i]=i in r?r[i]:t.properties[i],o),{});return this.createFromProps({...this.introspect(),properties:n})}partial(e){if(typeof e>"u"||e===null)return this.createFromProps({...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.createFromProps(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 c?e[r]=t.deepPartial().optional():e[r]=t.optional()}return this.createFromProps({...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.createFromProps({...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.createFromProps({...this.introspect(),properties:r})}if(e instanceof c){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 R))throw new Error("callback must return a SchemaBuilder object");let n={...this.introspect()};return n.properties={...n.properties,[e]:t},this.createFromProps(n)}makePropOptional(e){return this.modifyPropSchema(e,r=>r.optional())}makePropRequired(e){return this.modifyPropSchema(e,r=>r.required())}makeAllPropsOptional(){return this.createFromProps({...this.introspect(),properties:Object.keys(this.#e).reduce((e,r)=>(e[r]=this.#e[r].optional(),e),{})})}makeAllPropsRequired(){return this.createFromProps({...this.introspect(),properties:Object.keys(this.#e).reduce((e,r)=>(e[r]=this.#e[r].required(),e),{})})}static#p(e,r,t,n,o){let i=e.introspect();if(!i.properties)return{};let p=Object.keys(i.properties);if(p.length===0)return{};typeof r!="function"&&(r=a=>a);let y=O((a,s)=>(t||r)(a,s),n,e,o);for(let a of p){let s=i.properties[a];if(s instanceof c){let T=s.introspect().properties;T&&typeof T=="object"&&Object.keys(T).length>0?y[a]=c.#p(s,(d,l)=>{let u=r(d,l);return u?(l&&!u[a]&&(u[a]={}),u[a]):null},r,a,y[f]):y[a]=O(r,a,s,y[f])}else if(s[j]===!0){let T=O(r,a,s,y[f]),d=(l,u)=>{let P=r(l,u);return P?(u&&!P[a]&&(P[a]={}),P[a]):null};y[a]=w(T,d)}else y[a]=O(r,a,s,y[f])}return y}static getPropertiesFor(e){if(!(e instanceof c))throw new Error("schema must be an instance of the ObjectSchemaBuilder class");if(e.#n.has(e))return e.#n.get(e);let r=c.#p(e);return e.#n.set(e,r),r}static isValidPropertyDescriptor(e){return typeof e=="object"&&e!==null&&typeof e[f]=="object"}static#y(e,r,t){let o=c.#c(r).introspect().properties,i;if(o)i=Object.keys(o);else if(Array.isArray(e.__externErrorPropertyNames))i=e.__externErrorPropertyNames;else return;for(let p of i){let y=r[p];if(!c.isValidPropertyDescriptor(y))continue;let a=e.getErrorsFor(()=>y);if(!a.isValid)for(let s of a.errors)t(y,s,r);if(o){let s=o[p];(s instanceof c||s[j]===!0)&&typeof e.getErrorsFor=="function"&&c.isValidPropertyDescriptor(y)&&c.#y(e,y,t)}}}static#c(e){if(!c.isValidPropertyDescriptor(e))throw new Error("descriptor is not a valid property descriptor");return e[f].getSchema()}nullable(){return super.nullable()}notNullable(){return super.notNullable()}},k=(c=>x.create({isRequired:!0,properties:c})),O=(c,e,r,t)=>({[f]:{setValue:(n,o,i)=>{let p=c(n,!!i?.createMissingStructure);return p?(typeof e=="string"&&(p[e]=o),!0):!1},getValue:n=>{let o=c(n,!1);return o?typeof e!="string"?{success:!0,value:o}:Object.hasOwn(o,e)?{success:!0,value:o[e]}:{success:!1}:{success:!1}},getSchema:()=>r,parent:t}}),w=(c,e)=>new Proxy(c,{get(r,t,n){if(t===f)return r[f];if(typeof t=="string"&&!(t in r)){let o=O(e,t,void 0,r[f]),i=(p,y)=>{let a=e(p,y);return a!=null&&typeof a=="object"?(y&&!(t in a)&&(a[t]={}),a[t]):null};r[t]=w(o,i)}return Reflect.get(r,t,n)}});k.getPropertiesFor=c=>x.getPropertiesFor(c);k.isValidPropertyDescriptor=x.isValidPropertyDescriptor;export{x as a,k as b};
2
+ //# sourceMappingURL=chunk-NXPH3ZUW.js.map