@cleverbrush/schema 2.0.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +412 -8
- package/dist/builders/AnySchemaBuilder.js +1 -1
- package/dist/builders/ArraySchemaBuilder.d.ts +2 -0
- package/dist/builders/ArraySchemaBuilder.js +1 -1
- package/dist/builders/BooleanSchemaBuilder.d.ts +15 -0
- package/dist/builders/BooleanSchemaBuilder.js +1 -1
- package/dist/builders/DateSchemaBuilder.d.ts +20 -0
- package/dist/builders/DateSchemaBuilder.js +1 -1
- package/dist/builders/ExternSchemaBuilder.d.ts +2 -0
- package/dist/builders/ExternSchemaBuilder.js +1 -1
- package/dist/builders/FunctionSchemaBuilder.d.ts +162 -18
- package/dist/builders/FunctionSchemaBuilder.js +1 -1
- package/dist/builders/GenericSchemaBuilder.d.ts +294 -0
- package/dist/builders/LazySchemaBuilder.d.ts +2 -0
- package/dist/builders/NumberSchemaBuilder.d.ts +16 -0
- package/dist/builders/NumberSchemaBuilder.js +1 -1
- package/dist/builders/ObjectSchemaBuilder.d.ts +262 -42
- package/dist/builders/ObjectSchemaBuilder.js +1 -1
- package/dist/builders/ParseStringSchemaBuilder.d.ts +204 -0
- package/dist/builders/ParseStringSchemaBuilder.js +2 -0
- package/dist/builders/ParseStringSchemaBuilder.js.map +1 -0
- package/dist/builders/PromiseSchemaBuilder.d.ts +213 -0
- package/dist/builders/PromiseSchemaBuilder.js +2 -0
- package/dist/builders/PromiseSchemaBuilder.js.map +1 -0
- package/dist/builders/RecordSchemaBuilder.d.ts +2 -0
- package/dist/builders/RecordSchemaBuilder.js +1 -1
- package/dist/builders/SchemaBuilder.d.ts +89 -0
- package/dist/builders/StringSchemaBuilder.d.ts +2 -0
- package/dist/builders/StringSchemaBuilder.js +1 -1
- package/dist/builders/TupleSchemaBuilder.d.ts +2 -0
- package/dist/builders/TupleSchemaBuilder.js +1 -1
- package/dist/builders/UnionSchemaBuilder.d.ts +8 -0
- package/dist/builders/UnionSchemaBuilder.js +1 -1
- package/dist/chunk-3JMDGYDT.js +2 -0
- package/dist/chunk-3JMDGYDT.js.map +1 -0
- package/dist/{chunk-KESLT5EE.js → chunk-BUEVZ3KA.js} +2 -2
- package/dist/{chunk-KESLT5EE.js.map → chunk-BUEVZ3KA.js.map} +1 -1
- package/dist/{chunk-KFTO7TMB.js → chunk-CFIJQ4GP.js} +2 -2
- package/dist/{chunk-KFTO7TMB.js.map → chunk-CFIJQ4GP.js.map} +1 -1
- package/dist/chunk-DY7J6RNN.js +2 -0
- package/dist/chunk-DY7J6RNN.js.map +1 -0
- package/dist/{chunk-YWBNVHR6.js → chunk-EIVZX4ZO.js} +2 -2
- package/dist/{chunk-YWBNVHR6.js.map → chunk-EIVZX4ZO.js.map} +1 -1
- package/dist/chunk-GXPV6UQK.js +2 -0
- package/dist/chunk-GXPV6UQK.js.map +1 -0
- package/dist/{chunk-ZAN4ZHCJ.js → chunk-HN774HD7.js} +2 -2
- package/dist/chunk-K6Z47OQY.js +2 -0
- package/dist/chunk-K6Z47OQY.js.map +1 -0
- package/dist/chunk-NUW3VXZV.js +2 -0
- package/dist/chunk-NUW3VXZV.js.map +1 -0
- package/dist/{chunk-MKAYFPAR.js → chunk-PHE4LIAN.js} +2 -2
- package/dist/chunk-QARCEYGO.js +2 -0
- package/dist/chunk-QARCEYGO.js.map +1 -0
- package/dist/chunk-WDMJBGBD.js +2 -0
- package/dist/chunk-WDMJBGBD.js.map +1 -0
- package/dist/chunk-WQDYWDOE.js +2 -0
- package/dist/chunk-WQDYWDOE.js.map +1 -0
- package/dist/{chunk-FWUEUW2N.js → chunk-YQZHDMRF.js} +2 -2
- package/dist/chunk-ZC6YBKCP.js +2 -0
- package/dist/chunk-ZC6YBKCP.js.map +1 -0
- package/dist/{chunk-IJ6FO37G.js → chunk-ZFI27R3L.js} +2 -2
- package/dist/core.d.ts +7 -2
- package/dist/core.js +1 -1
- package/dist/extension.d.ts +10 -2
- package/dist/extensions/index.d.ts +5 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +12 -4
- package/dist/chunk-BFCMDDTX.js +0 -2
- package/dist/chunk-BFCMDDTX.js.map +0 -1
- package/dist/chunk-CTP4RHDG.js +0 -2
- package/dist/chunk-CTP4RHDG.js.map +0 -1
- package/dist/chunk-EUQ5AE3H.js +0 -2
- package/dist/chunk-EUQ5AE3H.js.map +0 -1
- package/dist/chunk-NXPH3ZUW.js +0 -2
- package/dist/chunk-NXPH3ZUW.js.map +0 -1
- package/dist/chunk-S5TC6NSU.js +0 -2
- package/dist/chunk-S5TC6NSU.js.map +0 -1
- package/dist/chunk-Z7QZ7IXT.js +0 -2
- package/dist/chunk-Z7QZ7IXT.js.map +0 -1
- package/dist/chunk-ZUPYV5TI.js +0 -2
- package/dist/chunk-ZUPYV5TI.js.map +0 -1
- /package/dist/{chunk-ZAN4ZHCJ.js.map → chunk-HN774HD7.js.map} +0 -0
- /package/dist/{chunk-MKAYFPAR.js.map → chunk-PHE4LIAN.js.map} +0 -0
- /package/dist/{chunk-FWUEUW2N.js.map → chunk-YQZHDMRF.js.map} +0 -0
- /package/dist/{chunk-IJ6FO37G.js.map → chunk-ZFI27R3L.js.map} +0 -0
|
@@ -1 +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":"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","names":["BooleanSchemaBuilder","_BooleanSchemaBuilder","SchemaBuilder","#equalsTo","#defaultEqualsToErrorMessageProvider","#equalsToErrorMessageProvider","props","_notUsed","#getConstraintViolation","objToValidate","#buildResult","superResult","valid","preValidationTransaction","errors","violation","object","context","r","errorMessage","value","_name","boolean"]}
|
|
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 * Adds a preprocessor that coerces a string value to a boolean.\n * Accepts `\"true\"` → `true` and `\"false\"` → `false`; other values are\n * left unchanged so the boolean schema rejects them.\n *\n * @example ```ts\n * const schema = boolean().coerce();\n * const result = schema.validate('true');\n * // result.valid === true\n * // result.object === true\n * ```\n */\n public coerce(): BooleanSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n TExplicitType,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.addPreprocessor(\n ((v: any) => {\n if (v === 'true') return true;\n if (v === 'false') return false;\n return v;\n }) as any,\n { mutates: true }\n ) as any;\n }\n\n /**\n * @hidden\n */\n public nullable(): BooleanSchemaBuilder<\n TResult,\n TRequired,\n true,\n TExplicitType,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.nullable() as any;\n }\n\n /**\n * @hidden\n */\n public notNullable(): BooleanSchemaBuilder<\n TResult,\n TRequired,\n false,\n TExplicitType,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.notNullable() as any;\n }\n}\n\n/**\n * Creates a `boolean` schema.\n */\nexport const boolean = () =>\n BooleanSchemaBuilder.create({\n isRequired: true\n }) as BooleanSchemaBuilder<boolean, true>;\n"],"mappings":"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","names":["BooleanSchemaBuilder","_BooleanSchemaBuilder","SchemaBuilder","#equalsTo","#defaultEqualsToErrorMessageProvider","#equalsToErrorMessageProvider","props","_notUsed","#getConstraintViolation","objToValidate","#buildResult","superResult","valid","preValidationTransaction","errors","violation","object","context","r","errorMessage","value","_name","v","boolean"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as m}from"./chunk-K6Z47OQY.js";import{c as g,f as S}from"./chunk-3JMDGYDT.js";function x(o){return o.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function P(o,e){let r=o;for(let a of e.split(".")){if(r==null)return;r=r[a]}return r}function b(o){let e=[];function r(a){return new Proxy(a,{get(t,s){if(s===g)return t[g];if(typeof s!="string")return t[s];let l=t[s];return typeof l!="object"||l===null?l:(e.push(s),r(l))}})}return{proxy:r(o),getPath:()=>e}}var R=class o extends S{#r;#e;#t=null;static create(e){return new o({type:"parseString",...e})}constructor(e){super(e),this.#r=e.objectSchema,this.#e=e.templateDefinition}#s(){if(this.#t)return this.#t;let{literals:e,segments:r}=this.#e,a="^";for(let t=0;t<r.length;t++){a+=x(e[t]);let s=t===r.length-1,l=e[t+1]??"";a+=s&&l===""?"(.*)":"(.*?)"}return a+=x(e[r.length]??""),a+="$",this.#t=new RegExp(a),this.#t}#n(){let{literals:e,segments:r}=this.#e,a="";for(let t=0;t<r.length;t++)a+=e[t]+`{${r[t].path}}`;return a+=e[r.length]??"",a}introspect(){return{...super.introspect(),objectSchema:this.#r,templateDefinition:this.#e}}serialize(e){let{literals:r,segments:a}=this.#e,t="";for(let s=0;s<a.length;s++){t+=r[s];let l=a[s].path,d=P(e,l);if(d==null)throw new Error(`Missing required parameter "${l}" for template ${this.#n()}`);t+=String(d)}return t+=r[a.length]??"",t}validate(e,r){return super.validate(e,r)}async validateAsync(e,r){return super.validateAsync(e,r)}_validate(e,r){return typeof e>"u"||e===null?typeof e>"u"&&this.hasDefault?(e=this.resolveDefaultValue(),{valid:!0,object:e}):!this.isRequired||e===null&&this.isNullable?{valid:!0,object:e}:{valid:!1,errors:[{message:this.getValidationErrorMessageSync(this.requiredErrorMessage,e)}]}:this.#a(e,r,(a,t)=>a.validate(t))}async _validateAsync(e,r){return typeof e>"u"||e===null?typeof e>"u"&&this.hasDefault?(e=this.resolveDefaultValue(),{valid:!0,object:e}):!this.isRequired||e===null&&this.isNullable?{valid:!0,object:e}:{valid:!1,errors:[{message:await this.getValidationErrorMessage(this.requiredErrorMessage,e)}]}:this.#a(e,r,(a,t)=>a.validateAsync(t))}#a(e,r,a){if(typeof e!="string")return{valid:!1,errors:[{message:`expected a string to parse, but saw ${typeof e}`}]};let{segments:t}=this.#e;if(t.length===0){let n=this.#e.literals[0]??"";return e!==n?{valid:!1,errors:[{message:`expected "${n}" but saw "${e}"`}]}:{valid:!0,object:{}}}let l=this.#s().exec(e);if(!l)return{valid:!1,errors:[{message:`does not match the parse-string pattern ${this.#n()}`}]};let d=r?.doNotStopOnFirstError??!1,p=new Proxy([],{get:(n,u,c)=>{if(u==="length")return t.length;let i=typeof u=="string"?Number(u):Number.NaN;return Number.isInteger(i)&&i>=0&&i<t.length?(i in n||(n[i]=a(t[i].schema,l[i+1])),n[i]):Reflect.get(n,u,c)}});if(d)for(let n=0;n<t.length;n++)p[n];let f=p[0];if(f&&typeof f.then=="function")return(async()=>{let n=[],u={};for(let c=0;c<t.length;c++){let i=await p[c];if(!i.valid){let h=i.errors?.[0]?.message??"validation failed";if(n.push({message:`${t[c].path}: ${h}`}),!d)return{valid:!1,errors:n};continue}t[c].descriptor.setValue(u,i.object,{createMissingStructure:!0})}return n.length>0?{valid:!1,errors:n}:{valid:!0,object:u}})();let y=[],T={};for(let n=0;n<t.length;n++){let u=p[n];if(!u.valid){let c=u.errors?.[0]?.message??"validation failed";if(y.push({message:`${t[n].path}: ${c}`}),!d)return{valid:!1,errors:y};continue}t[n].descriptor.setValue(T,u.object,{createMissingStructure:!0})}return y.length>0?{valid:!1,errors:y}:{valid:!0,object:T}}hasType(e){return this.createFromProps({...this.introspect()})}clearHasType(){return this.createFromProps({...this.introspect()})}nullable(){return super.nullable()}notNullable(){return super.notNullable()}required(e){return super.required(e)}optional(){return super.optional()}default(e){return super.default(e)}clearDefault(){return super.clearDefault()}brand(e){return super.brand(e)}readonly(){return super.readonly()}createFromProps(e){return o.create(e)}};function v(o,e){if(!(o instanceof m))throw new Error("First argument must be an ObjectSchemaBuilder instance");let r=m.getPropertiesFor(o),t=e(((s,...l)=>{let d=new Set,p=[];for(let f of l){if(typeof f!="function")throw new Error("Template expressions must be property selector functions (e.g. t => t.id)");let{proxy:y,getPath:T}=b(r),n=f(y);if(!n||typeof n!="object"||!(g in n))throw new Error("Template expression must select a property from the schema (e.g. t => t.id)");let u=n[g],c=u.getSchema(),i=T();if(i.length===0)throw new Error("Template expression must select a specific property (e.g. t => t.id), not the root object");let h=i.join(".");if(d.has(h))throw new Error(`Duplicate template parameter: "${h}" is already used in this template`);d.add(h),p.push({schema:c,path:h,descriptor:u})}return{literals:[...s],segments:p}}));return R.create({isRequired:!0,objectSchema:o,templateDefinition:t})}export{R as a,v as b};
|
|
2
|
+
//# sourceMappingURL=chunk-DY7J6RNN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/builders/ParseStringSchemaBuilder.ts"],"sourcesContent":["import { ObjectSchemaBuilder } from './ObjectSchemaBuilder.js';\nimport {\n type BRAND,\n type InferType,\n type PropertyDescriptor,\n type PropertyDescriptorInner,\n type PropertyDescriptorTree,\n SchemaBuilder,\n SYMBOL_SCHEMA_PROPERTY_DESCRIPTOR,\n type ValidationContext,\n type ValidationErrorMessageProvider,\n type ValidationResult\n} from './SchemaBuilder.js';\n\n// ---------------------------------------------------------------------------\n// Internal types\n// ---------------------------------------------------------------------------\n\n/** Descriptor for a single interpolation segment captured at creation time. */\ntype SegmentDef = {\n /** The property schema for this segment. */\n schema: SchemaBuilder<any, any, any, any, any>;\n /** Dot-separated property path (e.g. `'order.id'`) — used in error messages. */\n path: string;\n /** The property descriptor inner — used to set parsed values on the result object. */\n descriptor: PropertyDescriptorInner<any, any, any>;\n};\n\n/** Internal data captured by the `$template` tagged-template invocation. */\ntype ParseStringTemplateDefinition = {\n /** Literal string fragments from the tagged template. */\n literals: readonly string[];\n /** One segment per interpolation expression, in order. */\n segments: readonly SegmentDef[];\n};\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\n/**\n * The typed tagged-template function passed to the `parseString`\n * callback. Template expressions must be property-selector lambdas that\n * navigate the {@link PropertyDescriptorTree} of the object schema.\n *\n * Only properties whose inferred type extends `string | number | boolean | Date`\n * are selectable — nested `ObjectSchemaBuilder` children are navigable but\n * not themselves endpoints.\n */\nexport type ParseStringTemplateTag<\n TSchema extends ObjectSchemaBuilder<any, any, any, any, any, any, any>\n> = (\n strings: TemplateStringsArray,\n ...selectors: Array<\n (\n tree: PropertyDescriptorTree<\n TSchema,\n TSchema,\n string | number | boolean | Date\n >\n ) => PropertyDescriptor<TSchema, any, any>\n >\n) => ParseStringTemplateDefinition;\n\ntype ParseStringSchemaBuilderCreateProps<\n T = any,\n R extends boolean = true\n> = Partial<ReturnType<ParseStringSchemaBuilder<T, R>['introspect']>>;\n\n// ---------------------------------------------------------------------------\n// Regex helper\n// ---------------------------------------------------------------------------\n\n/** Escapes characters that have special meaning in a regular expression. */\nfunction escapeRegex(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Resolves a dot-separated property path on a (possibly nested) object.\n *\n * For flat paths like `'id'` this is equivalent to `obj['id']`.\n * For nested paths like `'order.id'` it traverses `obj.order.id`.\n */\nfunction resolvePath(obj: any, path: string): unknown {\n let current: any = obj;\n for (const part of path.split('.')) {\n if (current == null) return undefined;\n current = current[part];\n }\n return current;\n}\n\n// ---------------------------------------------------------------------------\n// Path-tracking Proxy (used at schema creation time)\n// ---------------------------------------------------------------------------\n\n/**\n * Wraps a `PropertyDescriptorTree` in a Proxy that records the traversed\n * property path. When the result is accessed via\n * `SYMBOL_SCHEMA_PROPERTY_DESCRIPTOR` we know we've reached a leaf, so we\n * return the real descriptor. All other property accesses are captured as\n * path segments and the proxy recurses.\n *\n * @returns A proxy that looks identical to the tree from TypeScript's\n * perspective but captures `[propName, propName, …]` as the user\n * navigates via `t => t.order.id`.\n */\nfunction createPathTrackingProxy(tree: any): {\n proxy: any;\n getPath: () => string[];\n} {\n // Shared mutable array — child proxy pushes propagate to parent's getPath\n const pathSegments: string[] = [];\n\n function wrapProxy(target: any): any {\n return new Proxy(target, {\n get(t, prop) {\n // Property descriptor access — return real descriptor\n if (prop === SYMBOL_SCHEMA_PROPERTY_DESCRIPTOR) {\n return t[SYMBOL_SCHEMA_PROPERTY_DESCRIPTOR];\n }\n\n // Symbol / non-string — pass through\n if (typeof prop !== 'string') {\n return t[prop];\n }\n\n const child = t[prop];\n if (typeof child !== 'object' || child === null) {\n return child;\n }\n\n // Record this segment and recurse\n pathSegments.push(prop);\n return wrapProxy(child);\n }\n });\n }\n\n return {\n proxy: wrapProxy(tree),\n getPath: () => pathSegments\n };\n}\n\n// ---------------------------------------------------------------------------\n// Builder\n// ---------------------------------------------------------------------------\n\n/**\n * Validates a string against a template pattern and parses it\n * into a strongly-typed object.\n *\n * Created via the {@link parseString} factory:\n *\n * ```ts\n * const RouteSchema = parseString(\n * object({ userId: string().uuid(), id: number() }),\n * $t => $t`/orders/${t => t.id}/${t => t.userId}`\n * );\n *\n * const result = RouteSchema.validate('/orders/42/550e8400-...');\n * // result.object === { id: 42, userId: '550e8400-...' }\n * ```\n *\n * @see {@link parseString}\n */\nexport class ParseStringSchemaBuilder<\n TResult = any,\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 #objectSchema: ObjectSchemaBuilder<any, any, any, any, any, any, any>;\n #templateDef: ParseStringTemplateDefinition;\n #compiledRegex: RegExp | null = null;\n\n /**\n * @hidden\n */\n public static create(props: ParseStringSchemaBuilderCreateProps) {\n return new ParseStringSchemaBuilder({\n type: 'parseString',\n ...props\n });\n }\n\n protected constructor(props: ParseStringSchemaBuilderCreateProps) {\n super(props as any);\n\n this.#objectSchema = props.objectSchema!;\n this.#templateDef = props.templateDefinition!;\n }\n\n // -- Regex ---------------------------------------------------------------\n\n #buildRegex(): RegExp {\n if (this.#compiledRegex) return this.#compiledRegex;\n const { literals, segments } = this.#templateDef;\n let pattern = '^';\n for (let i = 0; i < segments.length; i++) {\n pattern += escapeRegex(literals[i]);\n // Use non-greedy unless this is the last capture AND the\n // trailing literal is empty (nothing to anchor to).\n const isLast = i === segments.length - 1;\n const trailingLiteral = literals[i + 1] ?? '';\n pattern += isLast && trailingLiteral === '' ? '(.*)' : '(.*?)';\n }\n // Append the trailing literal (after all segments)\n pattern += escapeRegex(literals[segments.length] ?? '');\n pattern += '$';\n this.#compiledRegex = new RegExp(pattern);\n return this.#compiledRegex;\n }\n\n /** Builds a human-readable pattern like `/orders/{id}/{userId}` for error messages. */\n #humanPattern(): string {\n const { literals, segments } = this.#templateDef;\n let result = '';\n for (let i = 0; i < segments.length; i++) {\n result += literals[i] + `{${segments[i].path}}`;\n }\n result += literals[segments.length] ?? '';\n return result;\n }\n\n // -- Introspect ----------------------------------------------------------\n\n /**\n * Return a snapshot of this builder's configuration.\n *\n * Includes all base-class fields plus:\n * - `objectSchema` — the object schema defining the result shape.\n * - `templateDefinition` — the parsed template (literals and selector segments).\n */\n public introspect() {\n return {\n ...super.introspect(),\n /** The object schema defining the result shape. */\n objectSchema: this.#objectSchema,\n /** The template definition (literals + segments). */\n templateDefinition: this.#templateDef\n };\n }\n\n // -- Serialize -----------------------------------------------------------\n\n /**\n * Builds a string from the template by substituting parameter values.\n *\n * This is the reverse of {@link validate}: where `validate` parses a\n * string into a typed object, `serialize` takes a params object and\n * produces the string.\n *\n * @param params - An object matching the template's parsed result type.\n * Nested properties are resolved via dot-paths (e.g. `order.id`).\n * Values are coerced to strings via `String()`.\n * @returns The reconstructed string with all segments replaced.\n * @throws {Error} If a required parameter is missing (`undefined`).\n *\n * @example\n * ```ts\n * const Route = parseString(\n * object({ id: number().coerce() }),\n * $t => $t`/todos/${t => t.id}`\n * );\n *\n * Route.serialize({ id: 42 }); // '/todos/42'\n * ```\n */\n public serialize(params: TResult): string {\n const { literals, segments } = this.#templateDef;\n let result = '';\n for (let i = 0; i < segments.length; i++) {\n result += literals[i];\n const key = segments[i].path;\n const value = resolvePath(params, key);\n if (value === undefined || value === null) {\n throw new Error(\n `Missing required parameter \"${key}\" for template ${this.#humanPattern()}`\n );\n }\n result += String(value);\n }\n result += literals[segments.length] ?? '';\n return result;\n }\n\n // -- Validate (sync) -----------------------------------------------------\n\n /** {@inheritDoc SchemaBuilder.validate} */\n public validate(\n object: string,\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: string,\n context?: ValidationContext\n ): Promise<ValidationResult<TResult>> {\n return super.validateAsync(object, context) as Promise<\n ValidationResult<TResult>\n >;\n }\n\n protected _validate(\n object: any,\n context?: ValidationContext\n ): ValidationResult<TResult> {\n // Handle optional / nullable / default at the top\n if (typeof object === 'undefined' || object === null) {\n if (typeof object === 'undefined' && this.hasDefault) {\n object = this.resolveDefaultValue();\n return { valid: true, object: object as TResult };\n }\n if (!this.isRequired || (object === null && this.isNullable)) {\n return { valid: true, object: object as any };\n }\n return {\n valid: false,\n errors: [\n {\n message: this.getValidationErrorMessageSync(\n this.requiredErrorMessage,\n object\n )\n }\n ]\n };\n }\n\n return this.#matchAndValidate(object, context, (schema, raw) =>\n schema.validate(raw)\n );\n }\n\n // -- Validate (async) ----------------------------------------------------\n\n protected async _validateAsync(\n object: any,\n context?: ValidationContext\n ): Promise<ValidationResult<TResult>> {\n // Handle optional / nullable / default\n if (typeof object === 'undefined' || object === null) {\n if (typeof object === 'undefined' && this.hasDefault) {\n object = this.resolveDefaultValue();\n return { valid: true, object: object as TResult };\n }\n if (!this.isRequired || (object === null && this.isNullable)) {\n return { valid: true, object: object as any };\n }\n return {\n valid: false,\n errors: [\n {\n message: await this.getValidationErrorMessage(\n this.requiredErrorMessage,\n object\n )\n }\n ]\n };\n }\n\n return this.#matchAndValidate(object, context, (schema, raw) =>\n schema.validateAsync(raw)\n );\n }\n\n /**\n * Shared regex-match + per-segment validation logic used by both\n * `_validate` (sync) and `_validateAsync` (async).\n *\n * The caller supplies `validateSegment` which is either the sync\n * `schema.validate` or async `schema.validateAsync`.\n */\n #matchAndValidate<\n R extends ValidationResult<unknown> | Promise<ValidationResult<unknown>>\n >(\n object: any,\n context: ValidationContext | undefined,\n validateSegment: (\n schema: SchemaBuilder<any, any, any, any, any>,\n raw: string\n ) => R\n ): R extends Promise<any>\n ? Promise<ValidationResult<TResult>>\n : ValidationResult<TResult> {\n if (typeof object !== 'string') {\n return {\n valid: false,\n errors: [\n {\n message: `expected a string to parse, but saw ${typeof object}`\n }\n ]\n } as any;\n }\n\n const { segments } = this.#templateDef;\n\n // Degenerate case: no segments — just compare literals\n if (segments.length === 0) {\n const expected = this.#templateDef.literals[0] ?? '';\n if (object !== expected) {\n return {\n valid: false,\n errors: [\n {\n message: `expected \"${expected}\" but saw \"${object}\"`\n }\n ]\n } as any;\n }\n return { valid: true, object: {} as TResult } as any;\n }\n\n const regex = this.#buildRegex();\n const match = regex.exec(object);\n\n if (!match) {\n return {\n valid: false,\n errors: [\n {\n message: `does not match the parse-string pattern ${this.#humanPattern()}`\n }\n ]\n } as any;\n }\n\n const doNotStop = context?.doNotStopOnFirstError ?? false;\n\n // Compute segment validation results lazily so fail-fast mode can\n // short-circuit without eagerly validating later segments. When\n // doNotStopOnFirstError is enabled, prestart all validations to\n // preserve the existing eager/parallel behavior.\n const segResults = new Proxy([] as R[], {\n get: (target, prop, receiver) => {\n if (prop === 'length') return segments.length;\n\n const index =\n typeof prop === 'string' ? Number(prop) : Number.NaN;\n if (\n Number.isInteger(index) &&\n index >= 0 &&\n index < segments.length\n ) {\n if (!(index in target)) {\n target[index] = validateSegment(\n segments[index].schema,\n match[index + 1]\n );\n }\n return target[index];\n }\n\n return Reflect.get(target, prop, receiver);\n }\n }) as R[];\n\n if (doNotStop) {\n for (let i = 0; i < segments.length; i++) {\n void segResults[i];\n }\n }\n\n // If first result is a promise, the whole pipeline is async\n const firstResult = segResults[0];\n if (firstResult && typeof (firstResult as any).then === 'function') {\n return (async () => {\n const errors: { message: string }[] = [];\n const resultObj = {} as any;\n for (let i = 0; i < segments.length; i++) {\n const segResult = (await segResults[\n i\n ]) as ValidationResult<unknown>;\n if (!segResult.valid) {\n const inner =\n segResult.errors?.[0]?.message ??\n 'validation failed';\n errors.push({\n message: `${segments[i].path}: ${inner}`\n });\n if (!doNotStop) return { valid: false, errors };\n continue;\n }\n segments[i].descriptor.setValue(\n resultObj,\n segResult.object,\n { createMissingStructure: true }\n );\n }\n if (errors.length > 0) return { valid: false, errors };\n return { valid: true, object: resultObj as TResult };\n })() as any;\n }\n\n // Sync path\n const errors: { message: string }[] = [];\n const resultObj = {} as any;\n for (let i = 0; i < segments.length; i++) {\n const segResult = segResults[i] as ValidationResult<unknown>;\n if (!segResult.valid) {\n const inner =\n segResult.errors?.[0]?.message ?? 'validation failed';\n errors.push({\n message: `${segments[i].path}: ${inner}`\n });\n if (!doNotStop) return { valid: false, errors } as any;\n continue;\n }\n segments[i].descriptor.setValue(resultObj, segResult.object, {\n createMissingStructure: true\n });\n }\n if (errors.length > 0) return { valid: false, errors } as any;\n return { valid: true, object: resultObj as TResult } as any;\n }\n\n // -- Fluent overrides (return type narrowing) ----------------------------\n\n /**\n * @inheritdoc\n */\n public hasType<T>(\n _notUsed?: T\n ): ParseStringSchemaBuilder<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(): ParseStringSchemaBuilder<\n any,\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 /**\n * @hidden\n */\n public nullable(): ParseStringSchemaBuilder<\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(): ParseStringSchemaBuilder<\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 ): ParseStringSchemaBuilder<\n TResult,\n true,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.required(errorMessage);\n }\n\n /**\n * @hidden\n */\n public optional(): ParseStringSchemaBuilder<\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 ): ParseStringSchemaBuilder<TResult, true, TNullable, true, TExtensions> &\n TExtensions {\n return super.default(value) as any;\n }\n\n /**\n * @hidden\n */\n public clearDefault(): ParseStringSchemaBuilder<\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 ): ParseStringSchemaBuilder<\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 * @hidden\n */\n public readonly(): ParseStringSchemaBuilder<\n Readonly<TResult>,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.readonly();\n }\n\n protected createFromProps<T, TReq extends boolean>(\n props: ParseStringSchemaBuilderCreateProps<T, TReq>\n ): this {\n return ParseStringSchemaBuilder.create(props as any) as any;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Creates a parse-string schema that validates a string against a\n * template pattern and parses it into a strongly-typed object.\n *\n * The first argument defines the result shape via `object(...)`, and the\n * second argument is a callback receiving a typed `$template` tagged-template\n * function whose template expressions are type-safe property selectors.\n *\n * @example\n * ```ts\n * const RouteSchema = parseString(\n * object({\n * userId: string().uuid(),\n * id: number()\n * }),\n * $t => $t`/orders/${t => t.id}/${t => t.userId}`\n * );\n *\n * const result = RouteSchema.validate('/orders/42/550e8400-e29b-41d4-a716-446655440000');\n * // result.valid === true\n * // result.object === { id: 42, userId: '550e8400-e29b-41d4-a716-446655440000' }\n *\n * type Route = InferType<typeof RouteSchema>;\n * // { id: number; userId: string }\n * ```\n *\n * @example Nested objects\n * ```ts\n * const schema = parseString(\n * object({\n * order: object({ id: number() }),\n * user: object({ name: string() })\n * }),\n * $t => $t`/orders/${t => t.order.id}/by/${t => t.user.name}`\n * );\n * ```\n *\n * @param objectSchema - An `ObjectSchemaBuilder` defining the result type and\n * per-property validation schemas.\n * @param templateBuilder - Callback receiving the typed `$template`\n * tagged-template function. Must return the result of invoking `$template`.\n * @returns A `ParseStringSchemaBuilder` whose `validate()` accepts a\n * string and whose `InferType` is the object schema's inferred type.\n */\nexport function parseString<\n TSchema extends ObjectSchemaBuilder<any, any, any, any, any, any, any>\n>(\n objectSchema: TSchema,\n templateBuilder: (\n $template: ParseStringTemplateTag<TSchema>\n ) => ParseStringTemplateDefinition\n): ParseStringSchemaBuilder<InferType<TSchema>> {\n if (!(objectSchema instanceof ObjectSchemaBuilder)) {\n throw new Error(\n 'First argument must be an ObjectSchemaBuilder instance'\n );\n }\n\n // Get the PropertyDescriptorTree for the object schema\n const tree = ObjectSchemaBuilder.getPropertiesFor(objectSchema as any);\n\n // Build the $template tagged-template function\n const $template = ((\n strings: TemplateStringsArray,\n ...selectors: Array<(t: any) => any>\n ): ParseStringTemplateDefinition => {\n const seenPaths = new Set<string>();\n const segments: SegmentDef[] = [];\n\n for (const selector of selectors) {\n if (typeof selector !== 'function') {\n throw new Error(\n 'Template expressions must be property selector functions (e.g. t => t.id)'\n );\n }\n\n // Create a path-tracking proxy for this selector invocation\n const { proxy, getPath } = createPathTrackingProxy(tree);\n const descriptor = selector(proxy);\n\n if (\n !descriptor ||\n typeof descriptor !== 'object' ||\n !(SYMBOL_SCHEMA_PROPERTY_DESCRIPTOR in descriptor)\n ) {\n throw new Error(\n 'Template expression must select a property from the schema (e.g. t => t.id)'\n );\n }\n\n const inner: PropertyDescriptorInner<any, any, any> =\n descriptor[SYMBOL_SCHEMA_PROPERTY_DESCRIPTOR];\n const schema = inner.getSchema();\n const path = getPath();\n\n if (path.length === 0) {\n throw new Error(\n 'Template expression must select a specific property (e.g. t => t.id), not the root object'\n );\n }\n\n const pathStr = path.join('.');\n\n if (seenPaths.has(pathStr)) {\n throw new Error(\n `Duplicate template parameter: \"${pathStr}\" is already used in this template`\n );\n }\n seenPaths.add(pathStr);\n\n segments.push({\n schema,\n path: pathStr,\n descriptor: inner\n });\n }\n\n return {\n literals: [...strings],\n segments\n };\n }) as ParseStringTemplateTag<TSchema>;\n\n const templateDef = templateBuilder($template);\n\n return ParseStringSchemaBuilder.create({\n isRequired: true,\n objectSchema: objectSchema as any,\n templateDefinition: templateDef\n }) as any;\n}\n"],"mappings":"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","names":["escapeRegex","s","resolvePath","obj","path","current","part","createPathTrackingProxy","tree","pathSegments","wrapProxy","target","prop","SYMBOL_SCHEMA_PROPERTY_DESCRIPTOR","child","ParseStringSchemaBuilder","_ParseStringSchemaBuilder","SchemaBuilder","#objectSchema","#templateDef","#compiledRegex","props","#buildRegex","literals","segments","pattern","i","isLast","trailingLiteral","#humanPattern","result","params","key","value","object","context","#matchAndValidate","schema","raw","validateSegment","expected","match","doNotStop","segResults","receiver","index","firstResult","errors","resultObj","segResult","inner","_notUsed","errorMessage","_name","parseString","objectSchema","templateBuilder","ObjectSchemaBuilder","templateDef","strings","selectors","seenPaths","selector","proxy","getPath","descriptor","pathStr"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as u,f as l}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{a as u,f as l}from"./chunk-3JMDGYDT.js";var d=t=>{if(typeof t>"u")return t;if(typeof t=="string"){let e=Date.parse(t);return Number.isNaN(e)?t:new Date(e)}return t},T=t=>{if(typeof t>"u")return t;if(typeof t=="number"){let e=new Date(t);return Number.isNaN(e.getTime())?t:e}return t},o=class t extends l{#e;#c=function(){return`is expected to be after ${this.#e} (${this.#e?.getTime()})`};#i=this.#c;#r;#h=function(){return`is expected to be before ${this.#r} (${this.#r?.getTime()})`};#n=this.#h;#t;#m=function(){return`is expected to be equal ${this.#t} (${this.#t?.getTime()})`};#u=this.#m;#o=!1;#f=function(){return"is expected to be in future"};#l=this.#f;#d=!1;#p=function(){return"is expected to be in past"};#T=this.#p;#s=!1;#a=!1;#E=!0;static create(e){return new t({type:"date",...e})}constructor(e){super(e),e.min instanceof Date&&(this.#e=e.min),this.#i=this.assureValidationErrorMessageProvider(e.minValidationErrorMessageProvider,this.#c),e.max instanceof Date&&(this.#r=e.max),this.#n=this.assureValidationErrorMessageProvider(e.maxValidationErrorMessageProvider,this.#h),typeof e.ensureIsInFuture=="boolean"&&(this.#o=e.ensureIsInFuture),this.#l=this.assureValidationErrorMessageProvider(e.ensureIsInFutureValidationErrorMessageProvider,this.#f),typeof e.ensureIsInPast=="boolean"&&(this.#d=e.ensureIsInPast),this.#T=this.assureValidationErrorMessageProvider(e.ensureIsInPastValidationErrorMessageProvider,this.#p),typeof e.parseFromJson=="boolean"&&(this.#s=e.parseFromJson),typeof e.parseFromEpoch=="boolean"&&(this.#a=e.parseFromEpoch),(e.equalsTo instanceof Date||typeof e.equalsTo>"u")&&(this.#t=e.equalsTo),this.#u=this.assureValidationErrorMessageProvider(e.equalsToValidationErrorMessageProvider,this.#m),this.#E=this.canSkipPreValidation&&!this.#s&&!this.#a}introspect(){return{...super.introspect(),min:this.#e,minValidationErrorMessageProvider:this.#i,max:this.#r,maxValidationErrorMessageProvider:this.#n,ensureIsInFuture:this.#o,ensureIsInFutureValidationErrorMessageProvider:this.#l,ensureIsInPast:this.#d,ensureIsInPastValidationErrorMessageProvider:this.#T,equalsTo:this.#t,equalsToValidationErrorMessageProvider:this.#u,parseFromEpoch:this.#a,parseFromJson:this.#s,preprocessors:this.preprocessors,validators:this.validators}}hasType(e){return this.createFromProps({...this.introspect()})}clearHasType(){return this.createFromProps({...this.introspect()})}#R(e){return e instanceof Date?typeof this.#t<"u"&&e.getTime()!==this.#t.getTime()?{provider:this.#u}:this.#o&&e<=new Date?{provider:this.#l}:this.#d&&e>=new Date?{provider:this.#T}:typeof this.#e<"u"&&e<this.#e?{provider:this.#i}:typeof this.#r<"u"&&e>this.#r?{provider:this.#n}:null:{message:`expected instance of Date, but saw ${typeof e}`}}#D(e){let{valid:r,errors:s}=e;if(!r)return{done:!0,result:{valid:r,errors:s}};let{transaction:a}=e,{object:{validatedObject:i}}=a;if(typeof i>"u"&&!this.isRequired||i===null&&(!this.isRequired||this.isNullable))return{done:!0,result:{valid:!0,object:i}};this.#s&&(a=u({validatedObject:d(i)}),i=a.object.validatedObject),this.#a&&(a=u({validatedObject:T(i)}),i=a.object.validatedObject);let n=this.#R(i);return n?"message"in n?{done:!0,result:{valid:!1,errors:[{message:n.message}]}}:{done:!1,provider:n.provider,objToValidate:i}:{done:!0,result:{valid:!0,object:a.commit().validatedObject}}}validate(e,r){return super.validate(e,r)}async validateAsync(e,r){return super.validateAsync(e,r)}_validate(e,r){if(this.#E){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 a=this.#R(e);return a?"message"in a?{valid:!1,errors:[{message:a.message}]}:{valid:!1,errors:[{message:this.getValidationErrorMessageSync(a.provider,e)}]}:{valid:!0,object:e}}let s=this.#D(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.#D(await super.preValidateAsync(e,r));return s.done?s.result:{valid:!1,errors:[{message:await this.getValidationErrorMessage(s.provider,s.objToValidate)}]}}createFromProps(e){return t.create(e)}equals(e,r){if(!(e instanceof Date))throw new Error("Date expected");return this.createFromProps({...this.introspect(),equalsTo:e,equalsToValidationErrorMessageProvider:r})}clearEquals(){return this.createFromProps({...this.introspect(),equalsTo:void 0})}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()}isInFuture(e){return this.createFromProps({...this.introspect(),ensureIsInFuture:!0,ensureIsInFutureValidationErrorMessageProvider:e})}clearIsInFuture(){return this.createFromProps({...this.introspect(),ensureIsInFuture:!1})}isInPast(e){return this.createFromProps({...this.introspect(),ensureIsInPast:!0,ensureIsInPastValidationErrorMessageProvider:e})}clearIsInPast(){return this.createFromProps({...this.introspect(),ensureIsInPast:!1})}min(e,r){if(!(e instanceof Date))throw new Error("minValue must be a Date");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(!(e instanceof Date))throw new Error("maxValue must be a Date");return this.createFromProps({...this.introspect(),max:e,maxValidationErrorMessageProvider:r})}clearMax(){let e=this.introspect();return delete e.max,this.createFromProps({...e})}coerce(){return this.addPreprocessor((e=>{if(typeof e=="string"){let r=new Date(e);return Number.isNaN(r.getTime())?e:r}return e}),{mutates:!0})}acceptJsonString(){return this.createFromProps({...this.introspect(),parseFromJson:!0})}doNotAcceptJsonString(){return this.createFromProps({...this.introspect(),parseFromJson:!1})}acceptEpoch(){return this.createFromProps({...this.introspect(),parseFromEpoch:!0})}doNotAcceptEpoch(){return this.createFromProps({...this.introspect(),parseFromEpoch:!1})}nullable(){return super.nullable()}notNullable(){return super.notNullable()}},m=()=>o.create({isRequired:!0});export{o as a,m as b};
|
|
2
|
+
//# sourceMappingURL=chunk-EIVZX4ZO.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/builders/DateSchemaBuilder.ts"],"sourcesContent":["import { transaction } from '../utils/transaction.js';\nimport {\n type BRAND,\n type PreprocessorEntry,\n SchemaBuilder,\n type ValidationContext,\n type ValidationErrorMessageProvider,\n type ValidationResult,\n type ValidatorEntry\n} from './SchemaBuilder.js';\n\ntype DateSchemaBuilderCreateProps<T = Date, R extends boolean = true> = Partial<\n ReturnType<DateSchemaBuilder<T, R, any>['introspect']>\n>;\n\nconst parseFromJsonPreprocessor = (value: any) => {\n if (typeof value === 'undefined') return value;\n if (typeof value === 'string') {\n const time = Date.parse(value);\n if (Number.isNaN(time)) return value;\n return new Date(time);\n }\n return value;\n};\n\nconst parseFromEpochPreprocessor = (value: any) => {\n if (typeof value === 'undefined') return value;\n if (typeof value === 'number') {\n const time = new Date(value);\n if (Number.isNaN(time.getTime())) return value;\n return time;\n }\n return value;\n};\n\n/**\n * Allows to create Date schema. It can be required or optional.\n * It can be restricted to be: equal to a certain value, in future, in past, in a certain range.\n * Supports parsing from JSON string and UNIX epoch (using preprocessors).\n *\n * **NOTE** this class is exported 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 date | date()} function instead.\n *\n * @example ```ts\n * const date = new Date(2020, 0, 2);\n * const schema = date().min(new Date(2020, 0, 1));\n * const result = schema.validate(date);\n * // result.valid === true\n * // result.object === date\n * ```\n *\n * @example ```ts\n * const schema = date();\n * const result = schema.validate('2020-01-01');\n * // result.valid === false\n * // result.errors[0].message === 'is expected to be a date'\n * ```\n *\n * @example ```ts\n * const schema = date().parseFromJson();\n * const result = schema.validate('2020-01-01T00:00:00.000Z');\n * // result.valid === true\n * // result.object is equal to corresponding Date object\n * ```\n *\n * @example ```ts\n * const schema = date().parseFromEpoch();\n * const result = schema.validate(1577836800000);\n * // result.valid === true\n * // result.object is equal to corresponding Date object\n * ```\n *\n * @see {@link date}\n */\nexport class DateSchemaBuilder<\n TResult = Date,\n TRequired extends boolean = true,\n TNullable extends boolean = false,\n THasDefault extends boolean = false,\n TExtensions = {}\n> extends SchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n> {\n #min?: Date;\n #defaultMinErrorMessageProvider: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n > = function (this: DateSchemaBuilder) {\n return `is expected to be after ${this.#min} (${this.#min?.getTime()})`;\n };\n #minErrorMessageProvider: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n > = this.#defaultMinErrorMessageProvider;\n\n #max?: Date;\n #defaultMaxErrorMessageProvider: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n > = function (this: DateSchemaBuilder) {\n return `is expected to be before ${this.#max} (${this.#max?.getTime()})`;\n };\n #maxErrorMessageProvider: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n > = this.#defaultMaxErrorMessageProvider;\n\n #equalsTo?: Date;\n #defaultEqualsToErrorMessageProvider: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n > = function (this: DateSchemaBuilder) {\n return `is expected to be equal ${this.#equalsTo} (${this.#equalsTo?.getTime()})`;\n };\n #equalsToErrorMessageProvider: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n > = this.#defaultEqualsToErrorMessageProvider;\n\n #ensureIsInFuture = false;\n #defaultEnsureIsInFutureErrorMessageProvider: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n > = function (this: DateSchemaBuilder) {\n return 'is expected to be in future';\n };\n #ensureIsInFutureErrorMessageProvider: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n > = this.#defaultEnsureIsInFutureErrorMessageProvider;\n\n #ensureIsInPast = false;\n #defaultEnsureIsInPastErrorMessageProvider: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n > = function (this: DateSchemaBuilder) {\n return 'is expected to be in past';\n };\n #ensureIsInPastErrorMessageProvider: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n > = this.#defaultEnsureIsInPastErrorMessageProvider;\n\n #parseFromJson = false;\n #parseFromEpoch = false;\n #canFastPath = true;\n\n /**\n * @hidden\n */\n public static create(props: DateSchemaBuilderCreateProps) {\n return new DateSchemaBuilder({\n type: 'date',\n ...props\n });\n }\n\n protected constructor(props: DateSchemaBuilderCreateProps) {\n super(props as any);\n\n if (props.min instanceof Date) {\n this.#min = props.min;\n }\n\n this.#minErrorMessageProvider =\n this.assureValidationErrorMessageProvider(\n props.minValidationErrorMessageProvider,\n this.#defaultMinErrorMessageProvider\n );\n\n if (props.max instanceof Date) {\n this.#max = props.max;\n }\n\n this.#maxErrorMessageProvider =\n this.assureValidationErrorMessageProvider(\n props.maxValidationErrorMessageProvider,\n this.#defaultMaxErrorMessageProvider\n );\n\n if (typeof props.ensureIsInFuture === 'boolean') {\n this.#ensureIsInFuture = props.ensureIsInFuture;\n }\n\n this.#ensureIsInFutureErrorMessageProvider =\n this.assureValidationErrorMessageProvider(\n props.ensureIsInFutureValidationErrorMessageProvider,\n this.#defaultEnsureIsInFutureErrorMessageProvider\n );\n\n if (typeof props.ensureIsInPast === 'boolean') {\n this.#ensureIsInPast = props.ensureIsInPast;\n }\n\n this.#ensureIsInPastErrorMessageProvider =\n this.assureValidationErrorMessageProvider(\n props.ensureIsInPastValidationErrorMessageProvider,\n this.#defaultEnsureIsInPastErrorMessageProvider\n );\n\n if (typeof props.parseFromJson === 'boolean') {\n this.#parseFromJson = props.parseFromJson;\n }\n\n if (typeof props.parseFromEpoch === 'boolean') {\n this.#parseFromEpoch = props.parseFromEpoch;\n }\n\n if (\n props.equalsTo instanceof Date ||\n typeof props.equalsTo === 'undefined'\n ) {\n this.#equalsTo = props.equalsTo;\n }\n\n this.#equalsToErrorMessageProvider =\n this.assureValidationErrorMessageProvider(\n props.equalsToValidationErrorMessageProvider,\n this.#defaultEqualsToErrorMessageProvider\n );\n\n this.#canFastPath =\n this.canSkipPreValidation &&\n !this.#parseFromJson &&\n !this.#parseFromEpoch;\n }\n\n public introspect() {\n return {\n ...super.introspect(),\n /**\n * Min valid value (if defined).\n */\n min: this.#min,\n\n /**\n * Min value validation error message provider.\n * If not provided, default error message will be used.\n */\n minValidationErrorMessageProvider: this.#minErrorMessageProvider,\n\n /**\n * Max valid value (if defined).\n */\n max: this.#max,\n\n /**\n * Max value validation error message provider.\n * If not provided, default error message will be used.\n */\n maxValidationErrorMessageProvider: this.#maxErrorMessageProvider,\n\n /**\n * Make sure that date is in future. `false` by default.\n */\n ensureIsInFuture: this.#ensureIsInFuture,\n\n /**\n * Ensure in future validation error message provider.\n * If not provided, default error message will be used.\n */\n ensureIsInFutureValidationErrorMessageProvider:\n this.#ensureIsInFutureErrorMessageProvider,\n\n /**\n * Make sure that date is in past. `false` by default.\n */\n ensureIsInPast: this.#ensureIsInPast,\n\n /**\n * Ensure in past validation error message provider.\n * If not provided, default error message will be used.\n */\n ensureIsInPastValidationErrorMessageProvider:\n this.#ensureIsInPastErrorMessageProvider,\n\n /**\n * If set, restrict date to be equal to a certain value.\n */\n equalsTo: this.#equalsTo,\n\n /**\n * Equals to validation error message provider.\n * If not provided, default error message will be used.\n */\n equalsToValidationErrorMessageProvider:\n this.#equalsToErrorMessageProvider,\n\n /**\n * If set, schema will try to parse date from the UNIX epoch (number).\n * `false` by default.\n */\n parseFromEpoch: this.#parseFromEpoch,\n /**\n * If set, schema will try to parse date from JSON string.\n * `false` by default.\n */\n parseFromJson: this.#parseFromJson,\n /**\n * Array of preprocessor functions\n */\n preprocessors: this.preprocessors as PreprocessorEntry<TResult>[],\n /**\n * Array of validator functions\n */\n validators: this.validators as ValidatorEntry<TResult>[]\n };\n }\n\n /**\n * @inheritdoc\n */\n public hasType<T>(\n _notUsed?: T\n ): DateSchemaBuilder<T, true, TNullable, THasDefault, TExtensions> &\n TExtensions {\n return this.createFromProps({\n ...this.introspect()\n } as any) as any;\n }\n\n /**\n * @inheritdoc\n */\n public clearHasType(): DateSchemaBuilder<\n Date,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.createFromProps({\n ...this.introspect()\n } as any) as any;\n }\n\n #getConstraintViolation(\n objToValidate: any\n ): { message: string } | { provider: any } | null {\n if (!(objToValidate instanceof Date)) {\n return {\n message: `expected instance of Date, but saw ${typeof objToValidate}`\n };\n }\n\n if (\n typeof this.#equalsTo !== 'undefined' &&\n objToValidate.getTime() !== this.#equalsTo.getTime()\n ) {\n return { provider: this.#equalsToErrorMessageProvider };\n }\n\n if (this.#ensureIsInFuture && objToValidate <= new Date()) {\n return { provider: this.#ensureIsInFutureErrorMessageProvider };\n }\n\n if (this.#ensureIsInPast && objToValidate >= new Date()) {\n return { provider: this.#ensureIsInPastErrorMessageProvider };\n }\n\n if (typeof this.#min !== 'undefined') {\n if (objToValidate < this.#min)\n return { provider: this.#minErrorMessageProvider };\n }\n\n if (typeof this.#max !== 'undefined') {\n if (objToValidate > this.#max)\n return { provider: this.#maxErrorMessageProvider };\n }\n\n return null;\n }\n\n #buildResult(superResult: ReturnType<DateSchemaBuilder['preValidateSync']>):\n | { done: true; result: ValidationResult<TResult> }\n | {\n done: false;\n provider: any;\n objToValidate: any;\n } {\n const { valid, errors } = superResult;\n\n if (!valid) {\n return { done: true, result: { valid, errors } };\n }\n\n let { transaction: preValidationTransaction } = superResult;\n\n let {\n object: { validatedObject: objToValidate }\n } = preValidationTransaction!;\n\n if (\n (typeof objToValidate === 'undefined' && !this.isRequired) ||\n (objToValidate === null && (!this.isRequired || this.isNullable))\n ) {\n return {\n done: true,\n result: { valid: true, object: objToValidate }\n };\n }\n\n if (this.#parseFromJson) {\n preValidationTransaction = transaction({\n validatedObject: parseFromJsonPreprocessor(objToValidate)\n });\n objToValidate = preValidationTransaction.object.validatedObject;\n }\n\n if (this.#parseFromEpoch) {\n preValidationTransaction = transaction({\n validatedObject: parseFromEpochPreprocessor(objToValidate)\n });\n objToValidate = preValidationTransaction.object.validatedObject;\n }\n\n const violation = this.#getConstraintViolation(objToValidate);\n\n if (!violation) {\n return {\n done: true,\n result: {\n valid: true,\n object: preValidationTransaction!.commit()\n .validatedObject as TResult\n }\n };\n }\n\n if ('message' in violation) {\n return {\n done: true,\n result: {\n valid: false,\n errors: [{ message: violation.message }]\n }\n };\n }\n\n return {\n done: false,\n provider: violation.provider,\n objToValidate\n };\n }\n\n /** {@inheritDoc SchemaBuilder.validate} */\n public validate(\n object: TResult,\n context?: ValidationContext\n ): ValidationResult<TResult> {\n return super.validate(object, context) as ValidationResult<TResult>;\n }\n\n /** {@inheritDoc SchemaBuilder.validateAsync} */\n public async validateAsync(\n object: TResult,\n context?: ValidationContext\n ): Promise<ValidationResult<TResult>> {\n return super.validateAsync(object, context) as Promise<\n ValidationResult<TResult>\n >;\n }\n\n /**\n * Performs synchronous validation of Date schema over `object`.\n * Throws if any preprocessor, validator, or error message provider returns a Promise.\n * @param context Optional `ValidationContext` settings.\n */\n protected _validate(\n object: TResult,\n context?: ValidationContext\n ): ValidationResult<TResult> {\n // Fast path: no preprocessors, validators, or parse-from transformations\n if (this.#canFastPath) {\n if (typeof object === 'undefined' || object === null) {\n if (typeof object === 'undefined' && this.hasDefault) {\n object = this.resolveDefaultValue();\n } else if (\n !this.isRequired ||\n (object === null && this.isNullable)\n ) {\n return { valid: true, object: object };\n } else {\n return {\n valid: false,\n errors: [\n {\n message: this.getValidationErrorMessageSync(\n this.requiredErrorMessage,\n object\n )\n }\n ]\n };\n }\n }\n\n const violation = this.#getConstraintViolation(object);\n\n if (!violation) {\n return { valid: true, object: object as TResult };\n }\n\n if ('message' in violation) {\n return {\n valid: false,\n errors: [{ message: violation.message }]\n };\n }\n\n return {\n valid: false,\n errors: [\n {\n message: this.getValidationErrorMessageSync(\n violation.provider,\n object as TResult\n )\n }\n ]\n };\n }\n\n const r = this.#buildResult(this.preValidateSync(object, context));\n if (r.done) return r.result;\n return {\n valid: false,\n errors: [\n {\n message: this.getValidationErrorMessageSync(\n r.provider,\n r.objToValidate as TResult\n )\n }\n ]\n };\n }\n\n /**\n * Performs async validation of Date schema over `object`.\n * Supports async preprocessors, validators, and error message providers.\n * @param context Optional `ValidationContext` settings.\n */\n protected async _validateAsync(\n object: TResult,\n context?: ValidationContext\n ): Promise<ValidationResult<TResult>> {\n const r = this.#buildResult(\n await super.preValidateAsync(object, context)\n );\n if (r.done) return r.result;\n return {\n valid: false,\n errors: [\n {\n message: await this.getValidationErrorMessage(\n r.provider,\n r.objToValidate as TResult\n )\n }\n ]\n };\n }\n\n /**\n * @hidden\n */\n protected createFromProps<T, TReq extends boolean>(\n props: DateSchemaBuilderCreateProps<T, TReq>\n ): this {\n return DateSchemaBuilder.create(props as any) as any;\n }\n\n /**\n * Restricts Date to be equal to `value`.\n */\n public equals<T extends Date>(\n value: T,\n /**\n * Custom error message provider.\n */\n errorMessage?: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n >\n ): DateSchemaBuilder<T, TRequired, TNullable, THasDefault, TExtensions> &\n TExtensions {\n if (!(value instanceof Date)) throw new Error('Date expected');\n return this.createFromProps({\n ...this.introspect(),\n equalsTo: value,\n equalsToValidationErrorMessageProvider: errorMessage\n }) as any as DateSchemaBuilder<\n T,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions;\n }\n\n /**\n * Clears `equals()` call.\n */\n public clearEquals(): DateSchemaBuilder<\n Date,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.createFromProps({\n ...this.introspect(),\n equalsTo: undefined\n }) as any;\n }\n\n /**\n * @hidden\n */\n public required(\n errorMessage?: ValidationErrorMessageProvider\n ): DateSchemaBuilder<TResult, true, TNullable, THasDefault, TExtensions> &\n TExtensions {\n return super.required(errorMessage);\n }\n\n /**\n * @hidden\n */\n public optional(): DateSchemaBuilder<\n TResult,\n false,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.optional();\n }\n\n /**\n * @hidden\n */\n public default(\n value: TResult | (() => TResult)\n ): DateSchemaBuilder<TResult, true, TNullable, true, TExtensions> &\n TExtensions {\n return super.default(value) as any;\n }\n\n /**\n * @hidden\n */\n public clearDefault(): DateSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n false,\n TExtensions\n > &\n TExtensions {\n return super.clearDefault() as any;\n }\n\n /**\n * @hidden\n */\n public brand<TBrand extends string | symbol>(\n _name?: TBrand\n ): DateSchemaBuilder<\n TResult & { readonly [K in BRAND]: TBrand },\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.brand(_name);\n }\n\n /**\n * Marks the inferred type as `Readonly<Date>` — prevents mutation of\n * Date methods like `setFullYear()` at the type level. Validation\n * behaviour is unchanged.\n *\n * @see {@link SchemaBuilder.readonly}\n */\n public readonly(): DateSchemaBuilder<\n Readonly<TResult>,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.readonly();\n }\n\n /**\n * Accept only dates in the future.\n */\n public isInFuture(\n /**\n * Custom error message provider.\n */\n errorMessage?: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n >\n ): DateSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.createFromProps({\n ...this.introspect(),\n ensureIsInFuture: true,\n ensureIsInFutureValidationErrorMessageProvider: errorMessage\n }) as any;\n }\n\n /**\n * Cancel `isInFuture()` call.\n */\n public clearIsInFuture(): DateSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.createFromProps({\n ...this.introspect(),\n ensureIsInFuture: false\n }) as any;\n }\n\n /**\n * Accept only dates in the past.\n */\n public isInPast(\n /**\n * Custom error message provider.\n */\n errorMessage?: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n >\n ): DateSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.createFromProps({\n ...this.introspect(),\n ensureIsInPast: true,\n ensureIsInPastValidationErrorMessageProvider: errorMessage\n }) as any;\n }\n\n /**\n * Cancel `isInPast()` call.\n */\n public clearIsInPast(): DateSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.createFromProps({\n ...this.introspect(),\n ensureIsInPast: false\n }) as any;\n }\n\n /**\n * Set minimal valid Date value for schema.\n */\n public min(\n minValue: Date,\n /**\n * Custom error message provider.\n */\n errorMessage?: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n >\n ): DateSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n if (!(minValue instanceof Date))\n throw new Error('minValue must be a Date');\n return this.createFromProps({\n ...this.introspect(),\n min: minValue,\n minValidationErrorMessageProvider: errorMessage\n }) as any;\n }\n\n /**\n * Clear `min()` call.\n */\n public clearMin(): DateSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n const schema = this.introspect();\n delete schema.min;\n return this.createFromProps({\n ...schema\n }) as any;\n }\n\n /**\n * Set maximal valid Date value for schema.\n */\n public max(\n maxValue: Date,\n /**\n * Custom error message provider.\n */\n errorMessage?: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n >\n ): DateSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n if (!(maxValue instanceof Date))\n throw new Error('maxValue must be a Date');\n return this.createFromProps({\n ...this.introspect(),\n max: maxValue,\n maxValidationErrorMessageProvider: errorMessage\n }) as any;\n }\n\n /**\n * Clear `max()` call.\n */\n public clearMax(): DateSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n const schema = this.introspect();\n delete schema.max;\n return this.createFromProps({\n ...schema\n }) as any;\n }\n\n /**\n * Accepts JSON string as a valid Date.\n * String must be in ISO format and will be parsed using `JSON.parse()`.\n */\n public acceptJsonString(): DateSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.createFromProps({\n ...this.introspect(),\n parseFromJson: true\n }) as any;\n }\n\n /**\n * Cancel `acceptJsonString()` call.\n */\n public doNotAcceptJsonString(): DateSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.createFromProps({\n ...this.introspect(),\n parseFromJson: false\n }) as any;\n }\n\n /**\n * Accepts epoch number as a valid Date.\n * Epoch number will be parsed using `new Date(epoch)`.\n */\n public acceptEpoch(): DateSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.createFromProps({\n ...this.introspect(),\n parseFromEpoch: true\n }) as any;\n }\n\n /**\n * Cancel `acceptEpoch()` call.\n */\n public doNotAcceptEpoch(): DateSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.createFromProps({\n ...this.introspect(),\n parseFromEpoch: false\n }) as any;\n }\n\n /**\n * @hidden\n */\n public nullable(): DateSchemaBuilder<\n TResult,\n TRequired,\n true,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.nullable() as any;\n }\n\n /**\n * @hidden\n */\n public notNullable(): DateSchemaBuilder<\n TResult,\n TRequired,\n false,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.notNullable() as any;\n }\n}\n\n/**\n * Creates a Date schema.\n */\nexport const date = () =>\n DateSchemaBuilder.create({\n isRequired: true\n });\n"],"mappings":"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","names":["parseFromJsonPreprocessor","value","time","parseFromEpochPreprocessor","DateSchemaBuilder","_DateSchemaBuilder","SchemaBuilder","#min","#defaultMinErrorMessageProvider","#minErrorMessageProvider","#max","#defaultMaxErrorMessageProvider","#maxErrorMessageProvider","#equalsTo","#defaultEqualsToErrorMessageProvider","#equalsToErrorMessageProvider","#ensureIsInFuture","#defaultEnsureIsInFutureErrorMessageProvider","#ensureIsInFutureErrorMessageProvider","#ensureIsInPast","#defaultEnsureIsInPastErrorMessageProvider","#ensureIsInPastErrorMessageProvider","#parseFromJson","#parseFromEpoch","#canFastPath","props","_notUsed","#getConstraintViolation","objToValidate","#buildResult","superResult","valid","errors","preValidationTransaction","transaction","violation","object","context","r","errorMessage","_name","minValue","schema","maxValue","date"]}
|
|
1
|
+
{"version":3,"sources":["../src/builders/DateSchemaBuilder.ts"],"sourcesContent":["import { transaction } from '../utils/transaction.js';\nimport {\n type BRAND,\n type PreprocessorEntry,\n SchemaBuilder,\n type ValidationContext,\n type ValidationErrorMessageProvider,\n type ValidationResult,\n type ValidatorEntry\n} from './SchemaBuilder.js';\n\ntype DateSchemaBuilderCreateProps<T = Date, R extends boolean = true> = Partial<\n ReturnType<DateSchemaBuilder<T, R, any>['introspect']>\n>;\n\nconst parseFromJsonPreprocessor = (value: any) => {\n if (typeof value === 'undefined') return value;\n if (typeof value === 'string') {\n const time = Date.parse(value);\n if (Number.isNaN(time)) return value;\n return new Date(time);\n }\n return value;\n};\n\nconst parseFromEpochPreprocessor = (value: any) => {\n if (typeof value === 'undefined') return value;\n if (typeof value === 'number') {\n const time = new Date(value);\n if (Number.isNaN(time.getTime())) return value;\n return time;\n }\n return value;\n};\n\n/**\n * Allows to create Date schema. It can be required or optional.\n * It can be restricted to be: equal to a certain value, in future, in past, in a certain range.\n * Supports parsing from JSON string and UNIX epoch (using preprocessors).\n *\n * **NOTE** this class is exported 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 date | date()} function instead.\n *\n * @example ```ts\n * const date = new Date(2020, 0, 2);\n * const schema = date().min(new Date(2020, 0, 1));\n * const result = schema.validate(date);\n * // result.valid === true\n * // result.object === date\n * ```\n *\n * @example ```ts\n * const schema = date();\n * const result = schema.validate('2020-01-01');\n * // result.valid === false\n * // result.errors[0].message === 'is expected to be a date'\n * ```\n *\n * @example ```ts\n * const schema = date().parseFromJson();\n * const result = schema.validate('2020-01-01T00:00:00.000Z');\n * // result.valid === true\n * // result.object is equal to corresponding Date object\n * ```\n *\n * @example ```ts\n * const schema = date().parseFromEpoch();\n * const result = schema.validate(1577836800000);\n * // result.valid === true\n * // result.object is equal to corresponding Date object\n * ```\n *\n * @see {@link date}\n */\nexport class DateSchemaBuilder<\n TResult = Date,\n TRequired extends boolean = true,\n TNullable extends boolean = false,\n THasDefault extends boolean = false,\n TExtensions = {}\n> extends SchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n> {\n #min?: Date;\n #defaultMinErrorMessageProvider: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n > = function (this: DateSchemaBuilder) {\n return `is expected to be after ${this.#min} (${this.#min?.getTime()})`;\n };\n #minErrorMessageProvider: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n > = this.#defaultMinErrorMessageProvider;\n\n #max?: Date;\n #defaultMaxErrorMessageProvider: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n > = function (this: DateSchemaBuilder) {\n return `is expected to be before ${this.#max} (${this.#max?.getTime()})`;\n };\n #maxErrorMessageProvider: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n > = this.#defaultMaxErrorMessageProvider;\n\n #equalsTo?: Date;\n #defaultEqualsToErrorMessageProvider: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n > = function (this: DateSchemaBuilder) {\n return `is expected to be equal ${this.#equalsTo} (${this.#equalsTo?.getTime()})`;\n };\n #equalsToErrorMessageProvider: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n > = this.#defaultEqualsToErrorMessageProvider;\n\n #ensureIsInFuture = false;\n #defaultEnsureIsInFutureErrorMessageProvider: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n > = function (this: DateSchemaBuilder) {\n return 'is expected to be in future';\n };\n #ensureIsInFutureErrorMessageProvider: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n > = this.#defaultEnsureIsInFutureErrorMessageProvider;\n\n #ensureIsInPast = false;\n #defaultEnsureIsInPastErrorMessageProvider: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n > = function (this: DateSchemaBuilder) {\n return 'is expected to be in past';\n };\n #ensureIsInPastErrorMessageProvider: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n > = this.#defaultEnsureIsInPastErrorMessageProvider;\n\n #parseFromJson = false;\n #parseFromEpoch = false;\n #canFastPath = true;\n\n /**\n * @hidden\n */\n public static create(props: DateSchemaBuilderCreateProps) {\n return new DateSchemaBuilder({\n type: 'date',\n ...props\n });\n }\n\n protected constructor(props: DateSchemaBuilderCreateProps) {\n super(props as any);\n\n if (props.min instanceof Date) {\n this.#min = props.min;\n }\n\n this.#minErrorMessageProvider =\n this.assureValidationErrorMessageProvider(\n props.minValidationErrorMessageProvider,\n this.#defaultMinErrorMessageProvider\n );\n\n if (props.max instanceof Date) {\n this.#max = props.max;\n }\n\n this.#maxErrorMessageProvider =\n this.assureValidationErrorMessageProvider(\n props.maxValidationErrorMessageProvider,\n this.#defaultMaxErrorMessageProvider\n );\n\n if (typeof props.ensureIsInFuture === 'boolean') {\n this.#ensureIsInFuture = props.ensureIsInFuture;\n }\n\n this.#ensureIsInFutureErrorMessageProvider =\n this.assureValidationErrorMessageProvider(\n props.ensureIsInFutureValidationErrorMessageProvider,\n this.#defaultEnsureIsInFutureErrorMessageProvider\n );\n\n if (typeof props.ensureIsInPast === 'boolean') {\n this.#ensureIsInPast = props.ensureIsInPast;\n }\n\n this.#ensureIsInPastErrorMessageProvider =\n this.assureValidationErrorMessageProvider(\n props.ensureIsInPastValidationErrorMessageProvider,\n this.#defaultEnsureIsInPastErrorMessageProvider\n );\n\n if (typeof props.parseFromJson === 'boolean') {\n this.#parseFromJson = props.parseFromJson;\n }\n\n if (typeof props.parseFromEpoch === 'boolean') {\n this.#parseFromEpoch = props.parseFromEpoch;\n }\n\n if (\n props.equalsTo instanceof Date ||\n typeof props.equalsTo === 'undefined'\n ) {\n this.#equalsTo = props.equalsTo;\n }\n\n this.#equalsToErrorMessageProvider =\n this.assureValidationErrorMessageProvider(\n props.equalsToValidationErrorMessageProvider,\n this.#defaultEqualsToErrorMessageProvider\n );\n\n this.#canFastPath =\n this.canSkipPreValidation &&\n !this.#parseFromJson &&\n !this.#parseFromEpoch;\n }\n\n public introspect() {\n return {\n ...super.introspect(),\n /**\n * Min valid value (if defined).\n */\n min: this.#min,\n\n /**\n * Min value validation error message provider.\n * If not provided, default error message will be used.\n */\n minValidationErrorMessageProvider: this.#minErrorMessageProvider,\n\n /**\n * Max valid value (if defined).\n */\n max: this.#max,\n\n /**\n * Max value validation error message provider.\n * If not provided, default error message will be used.\n */\n maxValidationErrorMessageProvider: this.#maxErrorMessageProvider,\n\n /**\n * Make sure that date is in future. `false` by default.\n */\n ensureIsInFuture: this.#ensureIsInFuture,\n\n /**\n * Ensure in future validation error message provider.\n * If not provided, default error message will be used.\n */\n ensureIsInFutureValidationErrorMessageProvider:\n this.#ensureIsInFutureErrorMessageProvider,\n\n /**\n * Make sure that date is in past. `false` by default.\n */\n ensureIsInPast: this.#ensureIsInPast,\n\n /**\n * Ensure in past validation error message provider.\n * If not provided, default error message will be used.\n */\n ensureIsInPastValidationErrorMessageProvider:\n this.#ensureIsInPastErrorMessageProvider,\n\n /**\n * If set, restrict date to be equal to a certain value.\n */\n equalsTo: this.#equalsTo,\n\n /**\n * Equals to validation error message provider.\n * If not provided, default error message will be used.\n */\n equalsToValidationErrorMessageProvider:\n this.#equalsToErrorMessageProvider,\n\n /**\n * If set, schema will try to parse date from the UNIX epoch (number).\n * `false` by default.\n */\n parseFromEpoch: this.#parseFromEpoch,\n /**\n * If set, schema will try to parse date from JSON string.\n * `false` by default.\n */\n parseFromJson: this.#parseFromJson,\n /**\n * Array of preprocessor functions\n */\n preprocessors: this.preprocessors as PreprocessorEntry<TResult>[],\n /**\n * Array of validator functions\n */\n validators: this.validators as ValidatorEntry<TResult>[]\n };\n }\n\n /**\n * @inheritdoc\n */\n public hasType<T>(\n _notUsed?: T\n ): DateSchemaBuilder<T, true, TNullable, THasDefault, TExtensions> &\n TExtensions {\n return this.createFromProps({\n ...this.introspect()\n } as any) as any;\n }\n\n /**\n * @inheritdoc\n */\n public clearHasType(): DateSchemaBuilder<\n Date,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.createFromProps({\n ...this.introspect()\n } as any) as any;\n }\n\n #getConstraintViolation(\n objToValidate: any\n ): { message: string } | { provider: any } | null {\n if (!(objToValidate instanceof Date)) {\n return {\n message: `expected instance of Date, but saw ${typeof objToValidate}`\n };\n }\n\n if (\n typeof this.#equalsTo !== 'undefined' &&\n objToValidate.getTime() !== this.#equalsTo.getTime()\n ) {\n return { provider: this.#equalsToErrorMessageProvider };\n }\n\n if (this.#ensureIsInFuture && objToValidate <= new Date()) {\n return { provider: this.#ensureIsInFutureErrorMessageProvider };\n }\n\n if (this.#ensureIsInPast && objToValidate >= new Date()) {\n return { provider: this.#ensureIsInPastErrorMessageProvider };\n }\n\n if (typeof this.#min !== 'undefined') {\n if (objToValidate < this.#min)\n return { provider: this.#minErrorMessageProvider };\n }\n\n if (typeof this.#max !== 'undefined') {\n if (objToValidate > this.#max)\n return { provider: this.#maxErrorMessageProvider };\n }\n\n return null;\n }\n\n #buildResult(superResult: ReturnType<DateSchemaBuilder['preValidateSync']>):\n | { done: true; result: ValidationResult<TResult> }\n | {\n done: false;\n provider: any;\n objToValidate: any;\n } {\n const { valid, errors } = superResult;\n\n if (!valid) {\n return { done: true, result: { valid, errors } };\n }\n\n let { transaction: preValidationTransaction } = superResult;\n\n let {\n object: { validatedObject: objToValidate }\n } = preValidationTransaction!;\n\n if (\n (typeof objToValidate === 'undefined' && !this.isRequired) ||\n (objToValidate === null && (!this.isRequired || this.isNullable))\n ) {\n return {\n done: true,\n result: { valid: true, object: objToValidate }\n };\n }\n\n if (this.#parseFromJson) {\n preValidationTransaction = transaction({\n validatedObject: parseFromJsonPreprocessor(objToValidate)\n });\n objToValidate = preValidationTransaction.object.validatedObject;\n }\n\n if (this.#parseFromEpoch) {\n preValidationTransaction = transaction({\n validatedObject: parseFromEpochPreprocessor(objToValidate)\n });\n objToValidate = preValidationTransaction.object.validatedObject;\n }\n\n const violation = this.#getConstraintViolation(objToValidate);\n\n if (!violation) {\n return {\n done: true,\n result: {\n valid: true,\n object: preValidationTransaction!.commit()\n .validatedObject as TResult\n }\n };\n }\n\n if ('message' in violation) {\n return {\n done: true,\n result: {\n valid: false,\n errors: [{ message: violation.message }]\n }\n };\n }\n\n return {\n done: false,\n provider: violation.provider,\n objToValidate\n };\n }\n\n /** {@inheritDoc SchemaBuilder.validate} */\n public validate(\n object: TResult,\n context?: ValidationContext\n ): ValidationResult<TResult> {\n return super.validate(object, context) as ValidationResult<TResult>;\n }\n\n /** {@inheritDoc SchemaBuilder.validateAsync} */\n public async validateAsync(\n object: TResult,\n context?: ValidationContext\n ): Promise<ValidationResult<TResult>> {\n return super.validateAsync(object, context) as Promise<\n ValidationResult<TResult>\n >;\n }\n\n /**\n * Performs synchronous validation of Date schema over `object`.\n * Throws if any preprocessor, validator, or error message provider returns a Promise.\n * @param context Optional `ValidationContext` settings.\n */\n protected _validate(\n object: TResult,\n context?: ValidationContext\n ): ValidationResult<TResult> {\n // Fast path: no preprocessors, validators, or parse-from transformations\n if (this.#canFastPath) {\n if (typeof object === 'undefined' || object === null) {\n if (typeof object === 'undefined' && this.hasDefault) {\n object = this.resolveDefaultValue();\n } else if (\n !this.isRequired ||\n (object === null && this.isNullable)\n ) {\n return { valid: true, object: object };\n } else {\n return {\n valid: false,\n errors: [\n {\n message: this.getValidationErrorMessageSync(\n this.requiredErrorMessage,\n object\n )\n }\n ]\n };\n }\n }\n\n const violation = this.#getConstraintViolation(object);\n\n if (!violation) {\n return { valid: true, object: object as TResult };\n }\n\n if ('message' in violation) {\n return {\n valid: false,\n errors: [{ message: violation.message }]\n };\n }\n\n return {\n valid: false,\n errors: [\n {\n message: this.getValidationErrorMessageSync(\n violation.provider,\n object as TResult\n )\n }\n ]\n };\n }\n\n const r = this.#buildResult(this.preValidateSync(object, context));\n if (r.done) return r.result;\n return {\n valid: false,\n errors: [\n {\n message: this.getValidationErrorMessageSync(\n r.provider,\n r.objToValidate as TResult\n )\n }\n ]\n };\n }\n\n /**\n * Performs async validation of Date schema over `object`.\n * Supports async preprocessors, validators, and error message providers.\n * @param context Optional `ValidationContext` settings.\n */\n protected async _validateAsync(\n object: TResult,\n context?: ValidationContext\n ): Promise<ValidationResult<TResult>> {\n const r = this.#buildResult(\n await super.preValidateAsync(object, context)\n );\n if (r.done) return r.result;\n return {\n valid: false,\n errors: [\n {\n message: await this.getValidationErrorMessage(\n r.provider,\n r.objToValidate as TResult\n )\n }\n ]\n };\n }\n\n /**\n * @hidden\n */\n protected createFromProps<T, TReq extends boolean>(\n props: DateSchemaBuilderCreateProps<T, TReq>\n ): this {\n return DateSchemaBuilder.create(props as any) as any;\n }\n\n /**\n * Restricts Date to be equal to `value`.\n */\n public equals<T extends Date>(\n value: T,\n /**\n * Custom error message provider.\n */\n errorMessage?: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n >\n ): DateSchemaBuilder<T, TRequired, TNullable, THasDefault, TExtensions> &\n TExtensions {\n if (!(value instanceof Date)) throw new Error('Date expected');\n return this.createFromProps({\n ...this.introspect(),\n equalsTo: value,\n equalsToValidationErrorMessageProvider: errorMessage\n }) as any as DateSchemaBuilder<\n T,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions;\n }\n\n /**\n * Clears `equals()` call.\n */\n public clearEquals(): DateSchemaBuilder<\n Date,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.createFromProps({\n ...this.introspect(),\n equalsTo: undefined\n }) as any;\n }\n\n /**\n * @hidden\n */\n public required(\n errorMessage?: ValidationErrorMessageProvider\n ): DateSchemaBuilder<TResult, true, TNullable, THasDefault, TExtensions> &\n TExtensions {\n return super.required(errorMessage);\n }\n\n /**\n * @hidden\n */\n public optional(): DateSchemaBuilder<\n TResult,\n false,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.optional();\n }\n\n /**\n * @hidden\n */\n public default(\n value: TResult | (() => TResult)\n ): DateSchemaBuilder<TResult, true, TNullable, true, TExtensions> &\n TExtensions {\n return super.default(value) as any;\n }\n\n /**\n * @hidden\n */\n public clearDefault(): DateSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n false,\n TExtensions\n > &\n TExtensions {\n return super.clearDefault() as any;\n }\n\n /**\n * @hidden\n */\n public brand<TBrand extends string | symbol>(\n _name?: TBrand\n ): DateSchemaBuilder<\n TResult & { readonly [K in BRAND]: TBrand },\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.brand(_name);\n }\n\n /**\n * Marks the inferred type as `Readonly<Date>` — prevents mutation of\n * Date methods like `setFullYear()` at the type level. Validation\n * behaviour is unchanged.\n *\n * @see {@link SchemaBuilder.readonly}\n */\n public readonly(): DateSchemaBuilder<\n Readonly<TResult>,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.readonly();\n }\n\n /**\n * Accept only dates in the future.\n */\n public isInFuture(\n /**\n * Custom error message provider.\n */\n errorMessage?: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n >\n ): DateSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.createFromProps({\n ...this.introspect(),\n ensureIsInFuture: true,\n ensureIsInFutureValidationErrorMessageProvider: errorMessage\n }) as any;\n }\n\n /**\n * Cancel `isInFuture()` call.\n */\n public clearIsInFuture(): DateSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.createFromProps({\n ...this.introspect(),\n ensureIsInFuture: false\n }) as any;\n }\n\n /**\n * Accept only dates in the past.\n */\n public isInPast(\n /**\n * Custom error message provider.\n */\n errorMessage?: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n >\n ): DateSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.createFromProps({\n ...this.introspect(),\n ensureIsInPast: true,\n ensureIsInPastValidationErrorMessageProvider: errorMessage\n }) as any;\n }\n\n /**\n * Cancel `isInPast()` call.\n */\n public clearIsInPast(): DateSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.createFromProps({\n ...this.introspect(),\n ensureIsInPast: false\n }) as any;\n }\n\n /**\n * Set minimal valid Date value for schema.\n */\n public min(\n minValue: Date,\n /**\n * Custom error message provider.\n */\n errorMessage?: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n >\n ): DateSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n if (!(minValue instanceof Date))\n throw new Error('minValue must be a Date');\n return this.createFromProps({\n ...this.introspect(),\n min: minValue,\n minValidationErrorMessageProvider: errorMessage\n }) as any;\n }\n\n /**\n * Clear `min()` call.\n */\n public clearMin(): DateSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n const schema = this.introspect();\n delete schema.min;\n return this.createFromProps({\n ...schema\n }) as any;\n }\n\n /**\n * Set maximal valid Date value for schema.\n */\n public max(\n maxValue: Date,\n /**\n * Custom error message provider.\n */\n errorMessage?: ValidationErrorMessageProvider<\n DateSchemaBuilder<TResult, TRequired>\n >\n ): DateSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n if (!(maxValue instanceof Date))\n throw new Error('maxValue must be a Date');\n return this.createFromProps({\n ...this.introspect(),\n max: maxValue,\n maxValidationErrorMessageProvider: errorMessage\n }) as any;\n }\n\n /**\n * Clear `max()` call.\n */\n public clearMax(): DateSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n const schema = this.introspect();\n delete schema.max;\n return this.createFromProps({\n ...schema\n }) as any;\n }\n\n /**\n * Adds a preprocessor that coerces a string value to a Date\n * using `new Date(value)`. If the string does not represent a\n * valid date the original value is left unchanged so the date\n * schema rejects it.\n *\n * This is a convenient alias for common string→Date coercion.\n * For more specific parsing, see {@link acceptJsonString} and\n * {@link acceptEpoch}.\n *\n * @example ```ts\n * const schema = date().coerce();\n * const result = schema.validate('2024-01-15');\n * // result.valid === true\n * // result.object instanceof Date === true\n * ```\n */\n public coerce(): DateSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.addPreprocessor(\n ((v: any) => {\n if (typeof v === 'string') {\n const d = new Date(v);\n return Number.isNaN(d.getTime()) ? v : d;\n }\n return v;\n }) as any,\n { mutates: true }\n ) as any;\n }\n\n /**\n * Accepts JSON string as a valid Date.\n * String must be in ISO format and will be parsed using `JSON.parse()`.\n */\n public acceptJsonString(): DateSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.createFromProps({\n ...this.introspect(),\n parseFromJson: true\n }) as any;\n }\n\n /**\n * Cancel `acceptJsonString()` call.\n */\n public doNotAcceptJsonString(): DateSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.createFromProps({\n ...this.introspect(),\n parseFromJson: false\n }) as any;\n }\n\n /**\n * Accepts epoch number as a valid Date.\n * Epoch number will be parsed using `new Date(epoch)`.\n */\n public acceptEpoch(): DateSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.createFromProps({\n ...this.introspect(),\n parseFromEpoch: true\n }) as any;\n }\n\n /**\n * Cancel `acceptEpoch()` call.\n */\n public doNotAcceptEpoch(): DateSchemaBuilder<\n TResult,\n TRequired,\n TNullable,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return this.createFromProps({\n ...this.introspect(),\n parseFromEpoch: false\n }) as any;\n }\n\n /**\n * @hidden\n */\n public nullable(): DateSchemaBuilder<\n TResult,\n TRequired,\n true,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.nullable() as any;\n }\n\n /**\n * @hidden\n */\n public notNullable(): DateSchemaBuilder<\n TResult,\n TRequired,\n false,\n THasDefault,\n TExtensions\n > &\n TExtensions {\n return super.notNullable() as any;\n }\n}\n\n/**\n * Creates a Date schema.\n */\nexport const date = () =>\n DateSchemaBuilder.create({\n isRequired: true\n });\n"],"mappings":"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","names":["parseFromJsonPreprocessor","value","time","parseFromEpochPreprocessor","DateSchemaBuilder","_DateSchemaBuilder","SchemaBuilder","#min","#defaultMinErrorMessageProvider","#minErrorMessageProvider","#max","#defaultMaxErrorMessageProvider","#maxErrorMessageProvider","#equalsTo","#defaultEqualsToErrorMessageProvider","#equalsToErrorMessageProvider","#ensureIsInFuture","#defaultEnsureIsInFutureErrorMessageProvider","#ensureIsInFutureErrorMessageProvider","#ensureIsInPast","#defaultEnsureIsInPastErrorMessageProvider","#ensureIsInPastErrorMessageProvider","#parseFromJson","#parseFromEpoch","#canFastPath","props","_notUsed","#getConstraintViolation","objToValidate","#buildResult","superResult","valid","errors","preValidationTransaction","transaction","violation","object","context","r","errorMessage","_name","minValue","schema","maxValue","v","d","date"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as g,b as V}from"./chunk-BUEVZ3KA.js";import{a as F,b as N}from"./chunk-K6Z47OQY.js";import{a as P,b as v}from"./chunk-WDMJBGBD.js";import{a as D,b as M}from"./chunk-ZFI27R3L.js";import{a as C,b as q}from"./chunk-YQZHDMRF.js";import{a as j,b as A}from"./chunk-QARCEYGO.js";import{a as w,b as H}from"./chunk-WQDYWDOE.js";import{a as p,b as x}from"./chunk-HN774HD7.js";import{a as m,b as h}from"./chunk-NUW3VXZV.js";import{a as f,b as E}from"./chunk-CFIJQ4GP.js";import{a as b,b as S}from"./chunk-EIVZX4ZO.js";import{a as R,b as B}from"./chunk-ZC6YBKCP.js";import{f as o}from"./chunk-3JMDGYDT.js";var u=class s extends o{#e;#t;#a;static create(e){return new s({type:"generic",...e})}constructor(e){super(e),this.#e=e.templateFn,this.#t=e.defaults,this.apply=(...t)=>{if(!this.#e)throw new Error("GenericSchemaBuilder: no template function defined");return this.#e(...t)}}introspect(){return{...super.introspect(),templateFn:this.#e,defaults:this.#t}}#n(){if(!(!this.#e||!this.#t))return this.#a||(this.#a=this.#e(...this.#t)),this.#a}#r(e,t){let{valid:r,transaction:i,errors:l}=e;if(!r)return{valid:r,errors:l};let{object:{validatedObject:n}}=i;if(typeof n>"u"&&!this.isRequired||n===null&&(!this.isRequired||this.isNullable))return{valid:!0,object:n};let a=this.#n();return a?a.validate(n,t):{valid:!1,errors:[{message:"This is a generic schema template. Call .apply() with concrete schemas to get a validatable schema, or provide default arguments to generic()."}]}}async#i(e,t){let{valid:r,transaction:i,errors:l}=e;if(!r)return{valid:r,errors:l};let{object:{validatedObject:n}}=i;if(typeof n>"u"&&!this.isRequired||n===null&&(!this.isRequired||this.isNullable))return{valid:!0,object:n};let a=this.#n();return a?await a.validateAsync(n,t):{valid:!1,errors:[{message:"This is a generic schema template. Call .apply() with concrete schemas to get a validatable schema, or provide default arguments to generic()."}]}}validate(e,t){return super.validate(e,t)}async validateAsync(e,t){return super.validateAsync(e,t)}_validate(e,t){return this.#r(this.preValidateSync(e,t),t)}async _validateAsync(e,t){return this.#i(await super.preValidateAsync(e,t),t)}createFromProps(e){return s.create(e)}hasType(e){return this.createFromProps({...this.introspect()})}clearHasType(){return this.createFromProps({...this.introspect()})}required(e){return super.required(e)}optional(){return super.optional()}nullable(){return super.nullable()}notNullable(){return super.notNullable()}default(e){return super.default(e)}clearDefault(){return super.clearDefault()}brand(e){return super.brand(e)}readonly(){return super.readonly()}};function O(s,e){let t=e!==void 0?e:s,r=e!==void 0?s:void 0;return u.create({isRequired:!0,templateFn:t,defaults:r})}var c=class s extends o{#e;#t=null;static create(e){return new s({type:"lazy",...e})}constructor(e){if(super(e),typeof e.getter!="function")throw new Error("LazySchemaBuilder: getter must be a function");this.#e=e.getter}resolve(){return this.#t===null&&(this.#t=this.#e()),this.#t}introspect(){return{...super.introspect(),getter:this.#e}}#a(e,t){let{valid:r,transaction:i,errors:l}=e;if(!r)return{valid:r,errors:l};let{object:{validatedObject:n}}=i;return n==null?{valid:!0,object:n}:this.resolve().validate(n,t)}validate(e,t){return super.validate(e,t)}async validateAsync(e,t){return super.validateAsync(e,t)}_validate(e,t){return this.#a(this.preValidateSync(e,t),t)}async _validateAsync(e,t){let r=await super.preValidateAsync(e,t),{valid:i,transaction:l,errors:n}=r;if(!i)return{valid:i,errors:n};let{object:{validatedObject:a}}=l;return a==null?{valid:!0,object:a}:this.resolve().validateAsync(a,t)}createFromProps(e){return s.create(e)}hasType(e){return this.createFromProps({...this.introspect()})}clearHasType(){return this.createFromProps({...this.introspect()})}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()}};function z(s){return c.create({type:"lazy",isRequired:!0,preprocessors:[],validators:[],getter:s})}var y=class s extends o{static create(e){return new s({type:"null",...e})}constructor(e){super(e)}hasType(e){return this.createFromProps({...this.introspect()})}clearHasType(){return this.createFromProps({...this.introspect()})}#e(e){return e===null?{valid:!0,object:null}:e===void 0&&this.hasDefault?this.resolveDefaultValue()===null?{valid:!0,object:null}:{valid:!1,errors:[{message:"must be null"}]}:e===void 0&&!this.isRequired?{valid:!0,object:void 0}:{valid:!1,errors:[{message:"must be null"}]}}validate(e,t){return super.validate(e,t)}async validateAsync(e,t){return super.validateAsync(e,t)}_validate(e,t){return this.#e(e)}async _validateAsync(e,t){return this.#e(e)}createFromProps(e){return s.create(e)}required(e){return super.required(e)}optional(){return super.optional()}default(e){return super.default(e)}clearDefault(){return super.clearDefault()}brand(e){return super.brand(e)}readonly(){return super.readonly()}nullable(){return super.nullable()}notNullable(){return super.notNullable()}},L=()=>y.create({isRequired:!0});var T={string:C,number:g,boolean:f,date:b,object:F,array:m,tuple:j,record:D,union:w,func:R,any:p,promise:P,generic:u},G={string:q,number:V,boolean:E,date:S,object:N,array:h,tuple:A,record:M,union:H,func:B,any:x,promise:v,generic:O},_=new Set(["validate","validateAsync","parse","parseAsync","safeParse","safeParseAsync","introspect","optional","required","addPreprocessor","clearPreprocessors","addValidator","clearValidators","hasType","clearHasType","createFromProps","preValidate","preValidateSync","preValidateAsync","getValidationErrorMessage","getValidationErrorMessageSync","assureValidationErrorMessageProvider","withExtension","getExtension"]);function U(s){let e={};for(let t of Object.keys(s)){if(!(t in T))throw new Error(`Unknown builder type "${t}". Valid types: ${Object.keys(T).join(", ")}`);let r=s[t];if(!r||typeof r!="object")throw new Error(`Extension config for "${t}" must be an object of methods`);e[t]={};for(let i of Object.keys(r)){if(_.has(i))throw new Error(`Cannot override reserved method "${i}" on "${t}"`);let l=r[i];if(typeof l!="function")throw new Error(`Extension method "${t}.${i}" must be a function`);e[t][i]=function(...n){let a=l.apply(this,n);return a&&typeof a=="object"&&typeof a.withExtension=="function"&&(typeof a.getExtension!="function"||a.getExtension(i)===void 0)?a.withExtension(i,n.length===1?n[0]:n.length===0?!0:n):a}}}return{config:e}}function k(...s){let e=new Map;for(let r of s)for(let i of Object.keys(r.config)){e.has(i)||e.set(i,new Map);let l=e.get(i),n=r.config[i];for(let a of Object.keys(n)){if(l.has(a))throw new Error(`Extension method collision: "${a}" is defined by multiple extensions for "${i}"`);l.set(a,n[a])}}let t={};for(let r of Object.keys(T)){let i=e.get(r);if(!i||i.size===0){t[r]=G[r];continue}let l=T[r],n=class extends l{constructor(...a){super(...a)}static create(a){return new n({...a})}createFromProps(a){return n.create(a)}};for(let[a,d]of i)Object.defineProperty(n.prototype,a,{value:d,writable:!0,configurable:!0,enumerable:!1});t[r]=(...a)=>{let d=G[r](...a);return Object.setPrototypeOf(d,n.prototype),d}}return t}export{u as a,O as b,c,z as d,y as e,L as f,U as g,k as h};
|
|
2
|
+
//# sourceMappingURL=chunk-GXPV6UQK.js.map
|