@cleverbrush/schema 1.1.11 → 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.
Files changed (98) hide show
  1. package/README.md +1721 -104
  2. package/dist/builders/AnySchemaBuilder.d.ts +54 -14
  3. package/dist/builders/AnySchemaBuilder.js +2 -112
  4. package/dist/builders/AnySchemaBuilder.js.map +1 -0
  5. package/dist/builders/ArraySchemaBuilder.d.ts +126 -23
  6. package/dist/builders/ArraySchemaBuilder.js +2 -284
  7. package/dist/builders/ArraySchemaBuilder.js.map +1 -0
  8. package/dist/builders/BooleanSchemaBuilder.d.ts +109 -19
  9. package/dist/builders/BooleanSchemaBuilder.js +2 -150
  10. package/dist/builders/BooleanSchemaBuilder.js.map +1 -0
  11. package/dist/builders/DateSchemaBuilder.d.ts +154 -34
  12. package/dist/builders/DateSchemaBuilder.js +2 -433
  13. package/dist/builders/DateSchemaBuilder.js.map +1 -0
  14. package/dist/builders/ExternSchemaBuilder.d.ts +202 -0
  15. package/dist/builders/ExternSchemaBuilder.js +2 -0
  16. package/dist/builders/ExternSchemaBuilder.js.map +1 -0
  17. package/dist/builders/FunctionSchemaBuilder.d.ts +205 -18
  18. package/dist/builders/FunctionSchemaBuilder.js +2 -113
  19. package/dist/builders/FunctionSchemaBuilder.js.map +1 -0
  20. package/dist/builders/GenericSchemaBuilder.d.ts +294 -0
  21. package/dist/builders/LazySchemaBuilder.d.ts +169 -0
  22. package/dist/builders/NullSchemaBuilder.d.ts +162 -0
  23. package/dist/builders/NumberSchemaBuilder.d.ts +159 -31
  24. package/dist/builders/NumberSchemaBuilder.js +2 -386
  25. package/dist/builders/NumberSchemaBuilder.js.map +1 -0
  26. package/dist/builders/ObjectSchemaBuilder.d.ts +486 -61
  27. package/dist/builders/ObjectSchemaBuilder.js +2 -589
  28. package/dist/builders/ObjectSchemaBuilder.js.map +1 -0
  29. package/dist/builders/ParseStringSchemaBuilder.d.ts +204 -0
  30. package/dist/builders/ParseStringSchemaBuilder.js +2 -0
  31. package/dist/builders/ParseStringSchemaBuilder.js.map +1 -0
  32. package/dist/builders/PromiseSchemaBuilder.d.ts +213 -0
  33. package/dist/builders/PromiseSchemaBuilder.js +2 -0
  34. package/dist/builders/PromiseSchemaBuilder.js.map +1 -0
  35. package/dist/builders/PropertyValidationResult.d.ts +68 -0
  36. package/dist/builders/RecordSchemaBuilder.d.ts +343 -0
  37. package/dist/builders/RecordSchemaBuilder.js +2 -0
  38. package/dist/builders/RecordSchemaBuilder.js.map +1 -0
  39. package/dist/builders/SchemaBuilder.d.ts +907 -30
  40. package/dist/builders/StringSchemaBuilder.d.ts +154 -37
  41. package/dist/builders/StringSchemaBuilder.js +2 -414
  42. package/dist/builders/StringSchemaBuilder.js.map +1 -0
  43. package/dist/builders/TupleSchemaBuilder.d.ts +250 -0
  44. package/dist/builders/TupleSchemaBuilder.js +2 -0
  45. package/dist/builders/TupleSchemaBuilder.js.map +1 -0
  46. package/dist/builders/UnionSchemaBuilder.d.ts +141 -39
  47. package/dist/builders/UnionSchemaBuilder.js +2 -216
  48. package/dist/builders/UnionSchemaBuilder.js.map +1 -0
  49. package/dist/chunk-3JMDGYDT.js +2 -0
  50. package/dist/chunk-3JMDGYDT.js.map +1 -0
  51. package/dist/chunk-BUEVZ3KA.js +2 -0
  52. package/dist/chunk-BUEVZ3KA.js.map +1 -0
  53. package/dist/chunk-CFIJQ4GP.js +2 -0
  54. package/dist/chunk-CFIJQ4GP.js.map +1 -0
  55. package/dist/chunk-DY7J6RNN.js +2 -0
  56. package/dist/chunk-DY7J6RNN.js.map +1 -0
  57. package/dist/chunk-EIVZX4ZO.js +2 -0
  58. package/dist/chunk-EIVZX4ZO.js.map +1 -0
  59. package/dist/chunk-GXPV6UQK.js +2 -0
  60. package/dist/chunk-GXPV6UQK.js.map +1 -0
  61. package/dist/chunk-HN774HD7.js +2 -0
  62. package/dist/chunk-HN774HD7.js.map +1 -0
  63. package/dist/chunk-K6Z47OQY.js +2 -0
  64. package/dist/chunk-K6Z47OQY.js.map +1 -0
  65. package/dist/chunk-NUW3VXZV.js +2 -0
  66. package/dist/chunk-NUW3VXZV.js.map +1 -0
  67. package/dist/chunk-PHE4LIAN.js +2 -0
  68. package/dist/chunk-PHE4LIAN.js.map +1 -0
  69. package/dist/chunk-QARCEYGO.js +2 -0
  70. package/dist/chunk-QARCEYGO.js.map +1 -0
  71. package/dist/chunk-WDMJBGBD.js +2 -0
  72. package/dist/chunk-WDMJBGBD.js.map +1 -0
  73. package/dist/chunk-WQDYWDOE.js +2 -0
  74. package/dist/chunk-WQDYWDOE.js.map +1 -0
  75. package/dist/chunk-YQZHDMRF.js +2 -0
  76. package/dist/chunk-YQZHDMRF.js.map +1 -0
  77. package/dist/chunk-ZC6YBKCP.js +2 -0
  78. package/dist/chunk-ZC6YBKCP.js.map +1 -0
  79. package/dist/chunk-ZFI27R3L.js +2 -0
  80. package/dist/chunk-ZFI27R3L.js.map +1 -0
  81. package/dist/core.d.ts +28 -0
  82. package/dist/core.js +2 -0
  83. package/dist/core.js.map +1 -0
  84. package/dist/extension.d.ts +421 -0
  85. package/dist/extensions/array.d.ts +112 -0
  86. package/dist/extensions/enum.d.ts +190 -0
  87. package/dist/extensions/index.d.ts +112 -0
  88. package/dist/extensions/nullable.d.ts +26 -0
  89. package/dist/extensions/number.d.ts +228 -0
  90. package/dist/extensions/string.d.ts +332 -0
  91. package/dist/extensions/util.d.ts +45 -0
  92. package/dist/index.d.ts +10 -20
  93. package/dist/index.js +2 -19
  94. package/dist/index.js.map +1 -0
  95. package/dist/utils/transaction.d.ts +27 -4
  96. package/package.json +83 -7
  97. package/dist/builders/SchemaBuilder.js +0 -275
  98. package/dist/utils/transaction.js +0 -178
@@ -0,0 +1,169 @@
1
+ import { type BRAND, SchemaBuilder, type ValidationContext, type ValidationErrorMessageProvider, type ValidationResult } from './SchemaBuilder.js';
2
+ type LazySchemaBuilderCreateProps<R extends boolean = true> = Partial<ReturnType<LazySchemaBuilder<any, R>['introspect']>>;
3
+ /**
4
+ * Lazy schema builder class. Allows defining recursive/self-referential schemas
5
+ * by wrapping a getter function that returns the target schema. The getter is
6
+ * called once on first validation and the result is cached.
7
+ *
8
+ * This is the primary mechanism for building recursive data structures such as
9
+ * tree nodes, nested menus, and threaded comments.
10
+ *
11
+ * **NOTE** TypeScript cannot infer recursive types automatically, so you must
12
+ * provide an explicit type annotation on the variable holding the schema:
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * type TreeNode = { value: number; children: TreeNode[] };
17
+ *
18
+ * const treeNode: SchemaBuilder<TreeNode, true> = object({
19
+ * value: number(),
20
+ * children: array(lazy(() => treeNode))
21
+ * });
22
+ *
23
+ * treeNode.validate({ value: 1, children: [{ value: 2, children: [] }] });
24
+ * // { valid: true, object: { value: 1, children: [{ value: 2, children: [] }] } }
25
+ * ```
26
+ *
27
+ * @example
28
+ * ```ts
29
+ * type Comment = { text: string; replies: Comment[] };
30
+ *
31
+ * const commentSchema: SchemaBuilder<Comment, true> = object({
32
+ * text: string(),
33
+ * replies: array(lazy(() => commentSchema))
34
+ * });
35
+ * ```
36
+ */
37
+ export declare class LazySchemaBuilder<TResult = any, TRequired extends boolean = true, TNullable extends boolean = false, THasDefault extends boolean = false, TExtensions = {}> extends SchemaBuilder<TResult, TRequired, TNullable, THasDefault, TExtensions> {
38
+ #private;
39
+ /**
40
+ * @hidden
41
+ */
42
+ static create(props: LazySchemaBuilderCreateProps<any>): LazySchemaBuilder<any, true, false, false, {}>;
43
+ protected constructor(props: LazySchemaBuilderCreateProps<TRequired>);
44
+ /**
45
+ * Resolves the lazy schema by calling the getter (once; result is cached).
46
+ * After the first call subsequent calls return the cached schema instance.
47
+ */
48
+ resolve(): SchemaBuilder<TResult, any, any>;
49
+ /**
50
+ * @inheritdoc
51
+ */
52
+ introspect(): {
53
+ /**
54
+ * The getter function that returns the lazily-resolved schema.
55
+ * Call {@link LazySchemaBuilder.resolve} to obtain the schema instance.
56
+ */
57
+ getter: () => SchemaBuilder<TResult, any, any>;
58
+ type: string;
59
+ isRequired: boolean;
60
+ isNullable: boolean;
61
+ isReadonly: boolean;
62
+ preprocessors: readonly import("./SchemaBuilder.js").PreprocessorEntry<TResult>[];
63
+ validators: readonly import("./SchemaBuilder.js").ValidatorEntry<TResult>[];
64
+ requiredValidationErrorMessageProvider: ValidationErrorMessageProvider<SchemaBuilder<any, any, any, any, any>>;
65
+ extensions: {
66
+ [x: string]: unknown;
67
+ };
68
+ hasDefault: boolean;
69
+ defaultValue: TResult | (() => TResult) | undefined;
70
+ description: string | undefined;
71
+ schemaName: string | undefined;
72
+ hasCatch: boolean;
73
+ catchValue: TResult | (() => TResult) | undefined;
74
+ example: unknown;
75
+ };
76
+ /** {@inheritDoc SchemaBuilder.validate} */
77
+ validate(object: TResult, context?: ValidationContext): ValidationResult<TResult>;
78
+ /** {@inheritDoc SchemaBuilder.validateAsync} */
79
+ validateAsync(object: TResult, context?: ValidationContext): Promise<ValidationResult<TResult>>;
80
+ /**
81
+ * Performs synchronous validation of the schema over `object`.
82
+ * Throws if any preprocessor, validator, or error message provider returns a Promise.
83
+ * @param context Optional `ValidationContext` settings.
84
+ */
85
+ protected _validate(object: TResult, context?: ValidationContext): ValidationResult<TResult>;
86
+ /**
87
+ * Performs async validation of the schema over `object`.
88
+ * Supports async preprocessors, validators, and error message providers.
89
+ * @param context Optional `ValidationContext` settings.
90
+ */
91
+ protected _validateAsync(object: TResult, context?: ValidationContext): Promise<ValidationResult<TResult>>;
92
+ protected createFromProps<TReq extends boolean>(props: LazySchemaBuilderCreateProps<TReq>): this;
93
+ /**
94
+ * @inheritdoc
95
+ */
96
+ hasType<T>(_notUsed?: T): LazySchemaBuilder<T, true, TNullable, THasDefault, TExtensions> & TExtensions;
97
+ /**
98
+ * @inheritdoc
99
+ */
100
+ clearHasType(): LazySchemaBuilder<TResult, TRequired, TNullable, THasDefault, TExtensions> & TExtensions;
101
+ /**
102
+ * @hidden
103
+ */
104
+ required(errorMessage?: ValidationErrorMessageProvider): LazySchemaBuilder<TResult, true, TNullable, THasDefault, TExtensions> & TExtensions;
105
+ /**
106
+ * @hidden
107
+ */
108
+ optional(): LazySchemaBuilder<TResult, false, TNullable, THasDefault, TExtensions> & TExtensions;
109
+ /**
110
+ * @hidden
111
+ */
112
+ default(value: TResult | (() => TResult)): LazySchemaBuilder<TResult, true, TNullable, true, TExtensions> & TExtensions;
113
+ /**
114
+ * @hidden
115
+ */
116
+ clearDefault(): LazySchemaBuilder<TResult, TRequired, TNullable, false, TExtensions> & TExtensions;
117
+ /**
118
+ * @hidden
119
+ */
120
+ brand<TBrand extends string | symbol>(_name?: TBrand): LazySchemaBuilder<TResult & {
121
+ readonly [K in BRAND]: TBrand;
122
+ }, TRequired, TNullable, THasDefault, TExtensions> & TExtensions;
123
+ /**
124
+ * @hidden
125
+ */
126
+ readonly(): LazySchemaBuilder<Readonly<TResult>, TRequired, TNullable, THasDefault, TExtensions> & TExtensions;
127
+ /**
128
+ * @hidden
129
+ */
130
+ nullable(): LazySchemaBuilder<TResult, TRequired, true, THasDefault, TExtensions> & TExtensions;
131
+ /**
132
+ * @hidden
133
+ */
134
+ notNullable(): LazySchemaBuilder<TResult, TRequired, false, THasDefault, TExtensions> & TExtensions;
135
+ }
136
+ /**
137
+ * Creates a lazy schema that defers the schema definition until first validation.
138
+ * Use this to define recursive/self-referential schemas.
139
+ *
140
+ * The getter function is called **once** on first use and the result is cached.
141
+ * You **must** provide an explicit TypeScript type annotation on the variable
142
+ * holding the outer schema — TypeScript cannot infer recursive types automatically.
143
+ *
144
+ * @param getter - A function that returns the schema to use for validation.
145
+ *
146
+ * @example
147
+ * ```ts
148
+ * // Tree structure
149
+ * type TreeNode = { value: number; children: TreeNode[] };
150
+ *
151
+ * const treeNode: SchemaBuilder<TreeNode, true> = object({
152
+ * value: number(),
153
+ * children: array(lazy(() => treeNode))
154
+ * });
155
+ * ```
156
+ *
157
+ * @example
158
+ * ```ts
159
+ * // Optional recursive field (submenu)
160
+ * type MenuItem = { label: string; submenu?: MenuItem[] };
161
+ *
162
+ * const menuItem: SchemaBuilder<MenuItem, true> = object({
163
+ * label: string(),
164
+ * submenu: array(lazy(() => menuItem)).optional()
165
+ * });
166
+ * ```
167
+ */
168
+ export declare function lazy<TResult>(getter: () => SchemaBuilder<TResult, any, any>): LazySchemaBuilder<TResult, true, false, false, {}>;
169
+ export {};
@@ -0,0 +1,162 @@
1
+ import { type BRAND, SchemaBuilder, type ValidationContext, type ValidationErrorMessageProvider, type ValidationResult } from './SchemaBuilder.js';
2
+ type NullSchemaBuilderCreateProps<R extends boolean = true> = Partial<ReturnType<NullSchemaBuilder<R>['introspect']>>;
3
+ /**
4
+ * Schema builder for `null` values. Validates that the input is exactly `null`.
5
+ *
6
+ * When required (the default), only `null` is accepted. When optional (via
7
+ * `.optional()`), both `null` and `undefined` are accepted; any other value
8
+ * is rejected.
9
+ *
10
+ * This builder is useful when you need to represent an explicitly-null field
11
+ * in a typed schema, for example in discriminated-union branches or when
12
+ * modelling a JSON payload that may carry a JSON `null` value.
13
+ *
14
+ * **NOTE** this class is exported only to give opportunity to extend it
15
+ * by inheriting. It is not recommended to create an instance of this class
16
+ * directly. Use {@link nul | nul()} function instead.
17
+ *
18
+ * @example
19
+ * ```ts
20
+ * import { nul } from '@cleverbrush/schema';
21
+ *
22
+ * const schema = nul();
23
+ *
24
+ * schema.validate(null); // { valid: true, object: null }
25
+ * schema.validate(undefined); // { valid: false }
26
+ * schema.validate(0); // { valid: false }
27
+ * schema.validate(''); // { valid: false }
28
+ * ```
29
+ *
30
+ * @example
31
+ * ```ts
32
+ * // Optional — accepts null or undefined
33
+ * const schema = nul().optional();
34
+ *
35
+ * schema.validate(null); // { valid: true, object: null }
36
+ * schema.validate(undefined); // { valid: true, object: undefined }
37
+ * schema.validate(false); // { valid: false }
38
+ * ```
39
+ *
40
+ * @example
41
+ * ```ts
42
+ * // Use inside a union to model a nullable string field
43
+ * import { union, string, nul, InferType } from '@cleverbrush/schema';
44
+ *
45
+ * const NullableString = union(string()).or(nul());
46
+ * type NullableString = InferType<typeof NullableString>;
47
+ * // string | null
48
+ *
49
+ * NullableString.validate('hello'); // valid
50
+ * NullableString.validate(null); // valid
51
+ * NullableString.validate(42); // invalid
52
+ * ```
53
+ *
54
+ * @see {@link nul}
55
+ */
56
+ export declare class NullSchemaBuilder<TRequired extends boolean = true, TNullable extends boolean = false, TExplicitType = undefined, THasDefault extends boolean = false, TExtensions = {}> extends SchemaBuilder<null, TRequired, TNullable, THasDefault, TExtensions> {
57
+ #private;
58
+ /**
59
+ * @hidden
60
+ */
61
+ static create(props: NullSchemaBuilderCreateProps<any>): NullSchemaBuilder<true, false, undefined, false, {}>;
62
+ protected constructor(props: NullSchemaBuilderCreateProps<TRequired>);
63
+ /**
64
+ * @hidden
65
+ */
66
+ hasType<T>(_notUsed?: T): NullSchemaBuilder<true, TNullable, T, THasDefault, TExtensions> & TExtensions;
67
+ /**
68
+ * @hidden
69
+ */
70
+ clearHasType(): NullSchemaBuilder<TRequired, TNullable, undefined, THasDefault, TExtensions> & TExtensions;
71
+ /** {@inheritDoc SchemaBuilder.validate} */
72
+ validate(object: null, context?: ValidationContext): ValidationResult<null>;
73
+ /** {@inheritDoc SchemaBuilder.validateAsync} */
74
+ validateAsync(object: null, context?: ValidationContext): Promise<ValidationResult<null>>;
75
+ /**
76
+ * Performs synchronous validation of the schema over `object`.
77
+ * @param context Optional `ValidationContext` settings.
78
+ */
79
+ protected _validate(object: null, _context?: ValidationContext): ValidationResult<null>;
80
+ /**
81
+ * Performs async validation of the schema over `object`.
82
+ * @param context Optional `ValidationContext` settings.
83
+ */
84
+ protected _validateAsync(object: null, _context?: ValidationContext): Promise<ValidationResult<null>>;
85
+ protected createFromProps<TReq extends boolean>(props: NullSchemaBuilderCreateProps<TReq>): this;
86
+ /**
87
+ * @hidden
88
+ */
89
+ required(errorMessage?: ValidationErrorMessageProvider): NullSchemaBuilder<true, TNullable, TExplicitType, THasDefault, TExtensions> & TExtensions;
90
+ /**
91
+ * @hidden
92
+ */
93
+ optional(): NullSchemaBuilder<false, TNullable, TExplicitType, THasDefault, TExtensions> & TExtensions;
94
+ /**
95
+ * @hidden
96
+ */
97
+ default(value: null | (() => null)): NullSchemaBuilder<true, TNullable, TExplicitType, true, TExtensions> & TExtensions;
98
+ /**
99
+ * @hidden
100
+ */
101
+ clearDefault(): NullSchemaBuilder<TRequired, TNullable, TExplicitType, false, TExtensions> & TExtensions;
102
+ /**
103
+ * @hidden
104
+ */
105
+ brand<TBrand extends string | symbol>(_name?: TBrand): NullSchemaBuilder<TRequired, TNullable, null & {
106
+ readonly [K in BRAND]: TBrand;
107
+ }, THasDefault, TExtensions> & TExtensions;
108
+ /**
109
+ * Marks the inferred type as `Readonly<null>`. Since `null` is already
110
+ * immutable this is an identity operation, but it sets the `isReadonly`
111
+ * introspection flag for tooling consistency.
112
+ *
113
+ * @see {@link SchemaBuilder.readonly}
114
+ */
115
+ readonly(): NullSchemaBuilder<TRequired, TNullable, Readonly<null>, THasDefault, TExtensions> & TExtensions;
116
+ /**
117
+ * @hidden
118
+ */
119
+ nullable(): NullSchemaBuilder<TRequired, true, TExplicitType, THasDefault, TExtensions> & TExtensions;
120
+ /**
121
+ * @hidden
122
+ */
123
+ notNullable(): NullSchemaBuilder<TRequired, false, TExplicitType, THasDefault, TExtensions> & TExtensions;
124
+ }
125
+ /**
126
+ * Creates a schema that validates the value is exactly `null`.
127
+ *
128
+ * By default the schema is **required** — only `null` is accepted.
129
+ * Call `.optional()` to also allow `undefined`.
130
+ *
131
+ * @example
132
+ * ```ts
133
+ * import { nul } from '@cleverbrush/schema';
134
+ *
135
+ * nul().validate(null); // { valid: true, object: null }
136
+ * nul().validate(undefined); // { valid: false }
137
+ * nul().validate(0); // { valid: false }
138
+ * ```
139
+ *
140
+ * @example
141
+ * ```ts
142
+ * nul().optional().validate(null); // { valid: true, object: null }
143
+ * nul().optional().validate(undefined); // { valid: true, object: undefined }
144
+ * nul().optional().validate(false); // { valid: false }
145
+ * ```
146
+ *
147
+ * @example
148
+ * ```ts
149
+ * // Nullable field in an object schema
150
+ * import { object, string, nul, union, InferType } from '@cleverbrush/schema';
151
+ *
152
+ * const Schema = object({
153
+ * name: string(),
154
+ * deleted: union(nul()).or(string()), // null | string
155
+ * });
156
+ *
157
+ * type T = InferType<typeof Schema>;
158
+ * // { name: string; deleted: null | string }
159
+ * ```
160
+ */
161
+ export declare const nul: () => NullSchemaBuilder<true>;
162
+ export {};
@@ -1,5 +1,5 @@
1
- import { Preprocessor, SchemaBuilder, ValidationResult, ValidationContext, Validator } from './SchemaBuilder.js';
2
- type NumberSchemaBuilderCreateProps<T = number, R extends boolean = true> = Partial<ReturnType<NumberSchemaBuilder<T, R>['introspect']>>;
1
+ import { type BRAND, type PreprocessorEntry, SchemaBuilder, type ValidationContext, type ValidationErrorMessageProvider, type ValidationResult, type ValidatorEntry } from './SchemaBuilder.js';
2
+ type NumberSchemaBuilderCreateProps<T = number, R extends boolean = true> = Partial<ReturnType<NumberSchemaBuilder<T, R, any>['introspect']>>;
3
3
  /**
4
4
  * Number schema builder class. Allows to create Number schemas.
5
5
  * Can be required or optional, can be restricted to be equal to a certain value,
@@ -11,143 +11,271 @@ type NumberSchemaBuilderCreateProps<T = number, R extends boolean = true> = Part
11
11
  *
12
12
  * @example ```ts
13
13
  * const schema = number().equals(42);
14
- * const result = await schema.validate(42);
14
+ * const result = schema.validate(42);
15
15
  * // result.valid === true
16
16
  * // result.object === 42
17
17
  * ```
18
18
  * @example ```ts
19
19
  * const schema = number();
20
- * const result = await schema.validate('42');
20
+ * const result = schema.validate('42');
21
21
  * // result.valid === false
22
22
  * // result.errors[0].message === 'is expected to be a number'
23
23
  * ```
24
24
  * @example ```ts
25
25
  * const schema = number().min(0).max(100);
26
- * const result = await schema.validate(42);
26
+ * const result = schema.validate(42);
27
27
  * // result.valid === true
28
28
  * // result.object === 42
29
29
  * ```
30
30
  *
31
31
  * @example ```ts
32
32
  * const schema = number().min(0).max(100);
33
- * const result = await schema.validate(142.5);
33
+ * const result = schema.validate(142.5);
34
34
  * // result.valid === false
35
35
  * // result.errors[0].message === 'is expected to be less than or equal to 100'
36
36
  * ```
37
37
  *
38
38
  * @see {@link number}
39
39
  */
40
- export declare class NumberSchemaBuilder<TResult = number, TRequired extends boolean = true> extends SchemaBuilder<TResult, TRequired> {
40
+ export declare class NumberSchemaBuilder<TResult = number, TRequired extends boolean = true, TNullable extends boolean = false, THasDefault extends boolean = false, TExtensions = {}> extends SchemaBuilder<TResult, TRequired, TNullable, THasDefault, TExtensions> {
41
41
  #private;
42
- static create(props: NumberSchemaBuilderCreateProps): NumberSchemaBuilder<number, true>;
43
- private constructor();
42
+ /**
43
+ * @hidden
44
+ */
45
+ static create(props: NumberSchemaBuilderCreateProps): NumberSchemaBuilder<number, true, false, false, {}>;
46
+ protected constructor(props: NumberSchemaBuilderCreateProps);
44
47
  introspect(): {
45
48
  /**
46
49
  * Min valid value (if defined).
47
50
  */
48
51
  min: number | undefined;
52
+ /**
53
+ * Min valid value error message provider.
54
+ * If not provided, default error message will be used.
55
+ */
56
+ minValidationErrorMessageProvider: ValidationErrorMessageProvider<NumberSchemaBuilder<TResult, TRequired, false, false, {}>>;
49
57
  /**
50
58
  * Max valid value (if defined).
51
59
  */
52
60
  max: number | undefined;
61
+ /**
62
+ * Max valid value error message provider.
63
+ * If not provided, default error message will be used.
64
+ */
65
+ maxValidationErrorMessageProvider: ValidationErrorMessageProvider<NumberSchemaBuilder<TResult, TRequired, false, false, {}>>;
53
66
  /**
54
67
  * Make sure that object is not `NaN`. `true` by default.
55
68
  */
56
69
  ensureNotNaN: boolean;
70
+ /**
71
+ * EnsureNotNaN error message provider.
72
+ * If not provided, default error message will be used.
73
+ */
74
+ ensureNotNaNErrorMessageProvider: ValidationErrorMessageProvider<NumberSchemaBuilder<TResult, TRequired, false, false, {}>>;
57
75
  /**
58
76
  * Make sure that object is not different kinds of `infinity`. `true` by default.
59
77
  */
60
78
  ensureIsFinite: boolean;
79
+ /**
80
+ * EnsureIsFinite error message provider.
81
+ */
82
+ ensureIsFiniteErrorMessageProvider: ValidationErrorMessageProvider<NumberSchemaBuilder<TResult, TRequired, false, false, {}>>;
61
83
  /**
62
84
  * If set, restrict object to be equal to a certain value.
63
85
  */
64
86
  equalsTo: number | undefined;
87
+ /**
88
+ * EqualsTo error message provider.
89
+ * If not provided, default error message will be used.
90
+ */
91
+ equalsToValidationErrorMessageProvider: ValidationErrorMessageProvider<NumberSchemaBuilder<TResult, TRequired, false, false, {}>>;
65
92
  /**
66
93
  * Allow only integer values (floating point values will be rejected
67
94
  * as invalid)
68
95
  */
69
96
  isInteger: boolean;
97
+ /**
98
+ * EnsureIsInteger error message provider.
99
+ */
100
+ ensureIsIntegerErrorMessageProvider: ValidationErrorMessageProvider<NumberSchemaBuilder<TResult, TRequired, false, false, {}>>;
70
101
  /**
71
102
  * Array of preprocessor functions
72
103
  */
73
- preprocessors: Preprocessor<TResult>[];
104
+ preprocessors: PreprocessorEntry<TResult>[];
74
105
  /**
75
106
  * Array of validator functions
76
107
  */
77
- validators: Validator<TResult>[];
108
+ validators: ValidatorEntry<TResult>[];
78
109
  type: string;
79
110
  isRequired: boolean;
111
+ isNullable: boolean;
112
+ isReadonly: boolean;
113
+ requiredValidationErrorMessageProvider: ValidationErrorMessageProvider<SchemaBuilder<any, any, any, any, any>>;
114
+ extensions: {
115
+ [x: string]: unknown;
116
+ };
117
+ hasDefault: boolean;
118
+ defaultValue: TResult | (() => TResult) | undefined;
119
+ description: string | undefined;
120
+ schemaName: string | undefined;
121
+ hasCatch: boolean;
122
+ catchValue: TResult | (() => TResult) | undefined;
123
+ example: unknown;
80
124
  };
81
125
  /**
82
- * @hidden
126
+ * @inheritdoc
83
127
  */
84
- hasType<T>(notUsed?: T): NumberSchemaBuilder<T, true>;
128
+ hasType<T>(_notUsed?: T): NumberSchemaBuilder<T, true, TNullable, THasDefault, TExtensions> & TExtensions;
85
129
  /**
86
- * @hidden
130
+ * @inheritdoc
87
131
  */
88
- clearHasType(): NumberSchemaBuilder<number, TRequired>;
132
+ clearHasType(): NumberSchemaBuilder<number, TRequired, TNullable, THasDefault, TExtensions> & TExtensions;
133
+ /** {@inheritDoc SchemaBuilder.validate} */
134
+ validate(object: TResult, context?: ValidationContext): ValidationResult<TResult>;
135
+ /** {@inheritDoc SchemaBuilder.validateAsync} */
136
+ validateAsync(object: TResult, context?: ValidationContext): Promise<ValidationResult<TResult>>;
89
137
  /**
90
- * Performs validion of number schema over `object`.
138
+ * Performs synchronous validation of number schema over `object`.
139
+ * Throws if any preprocessor, validator, or error message provider returns a Promise.
91
140
  * @param context Optional `ValidationContext` settings.
92
141
  */
93
- validate(object: TResult, context?: ValidationContext): Promise<ValidationResult<TResult>>;
142
+ protected _validate(object: TResult, context?: ValidationContext): ValidationResult<TResult>;
143
+ /**
144
+ * Performs async validation of number schema over `object`.
145
+ * Supports async preprocessors, validators, and error message providers.
146
+ * @param context Optional `ValidationContext` settings.
147
+ */
148
+ protected _validateAsync(object: TResult, context?: ValidationContext): Promise<ValidationResult<TResult>>;
94
149
  protected createFromProps<T, TReq extends boolean>(props: NumberSchemaBuilderCreateProps<T, TReq>): this;
95
150
  /**
96
151
  * Restricts number to be equal to `value`.
97
152
  */
98
- equals<T extends number>(value: T): NumberSchemaBuilder<T, TRequired>;
153
+ equals<T extends number>(value: T,
154
+ /**
155
+ * Custom error message provider.
156
+ */
157
+ errorMessage?: ValidationErrorMessageProvider<NumberSchemaBuilder<TResult, TRequired>>): NumberSchemaBuilder<T, TRequired, TNullable, THasDefault, TExtensions> & TExtensions;
99
158
  /**
100
159
  * Clear `equals()` call.
101
160
  */
102
- clearEquals(): NumberSchemaBuilder<number, TRequired>;
161
+ clearEquals(): NumberSchemaBuilder<number, TRequired, TNullable, THasDefault, TExtensions> & TExtensions;
103
162
  /**
163
+ * @deprecated Use {@link clearIsInteger} instead.
104
164
  * Float values will be considered as valid after this call.
105
165
  */
106
- isFloat(): NumberSchemaBuilder<TResult, TRequired>;
166
+ isFloat(): NumberSchemaBuilder<TResult, TRequired, TNullable, THasDefault, TExtensions> & TExtensions;
167
+ /**
168
+ * Clear `isInteger()` call.
169
+ */
170
+ clearIsInteger(): NumberSchemaBuilder<TResult, TRequired, TNullable, THasDefault, TExtensions> & TExtensions;
107
171
  /**
108
172
  * Only integer values will be considered as valid after this call.
109
173
  */
110
- isInteger(): NumberSchemaBuilder<TResult, TRequired>;
174
+ isInteger(
175
+ /**
176
+ * Custom error message provider.
177
+ */
178
+ errorMessage?: ValidationErrorMessageProvider<NumberSchemaBuilder<TResult, TRequired>>): NumberSchemaBuilder<TResult, TRequired, TNullable, THasDefault, TExtensions> & TExtensions;
111
179
  /**
112
180
  * @hidden
113
181
  */
114
- required(): NumberSchemaBuilder<TResult, true>;
182
+ required(errorMessage?: ValidationErrorMessageProvider): NumberSchemaBuilder<TResult, true, TNullable, THasDefault, TExtensions> & TExtensions;
115
183
  /**
116
184
  * @hidden
117
185
  */
118
- optional(): NumberSchemaBuilder<TResult, false>;
186
+ optional(): NumberSchemaBuilder<TResult, false, TNullable, THasDefault, TExtensions> & TExtensions;
187
+ /**
188
+ * @hidden
189
+ */
190
+ default(value: TResult | (() => TResult)): NumberSchemaBuilder<TResult, true, TNullable, true, TExtensions> & TExtensions;
191
+ /**
192
+ * @hidden
193
+ */
194
+ clearDefault(): NumberSchemaBuilder<TResult, TRequired, TNullable, false, TExtensions> & TExtensions;
195
+ /**
196
+ * @hidden
197
+ */
198
+ brand<TBrand extends string | symbol>(_name?: TBrand): NumberSchemaBuilder<TResult & {
199
+ readonly [K in BRAND]: TBrand;
200
+ }, TRequired, TNullable, THasDefault, TExtensions> & TExtensions;
201
+ /**
202
+ * Marks the inferred type as `Readonly<number>`. Since numbers are
203
+ * already immutable this is an identity operation, but it sets the
204
+ * `isReadonly` introspection flag for tooling consistency.
205
+ *
206
+ * @see {@link SchemaBuilder.readonly}
207
+ */
208
+ readonly(): NumberSchemaBuilder<Readonly<TResult>, TRequired, TNullable, THasDefault, TExtensions> & TExtensions;
119
209
  /**
120
210
  * Do not accept NaN value
121
211
  */
122
- notNaN(): NumberSchemaBuilder<TResult, TRequired>;
212
+ notNaN(
213
+ /**
214
+ * Custom error message provider.
215
+ */
216
+ errorMessage?: ValidationErrorMessageProvider<NumberSchemaBuilder<TResult, TRequired>>): NumberSchemaBuilder<TResult, TRequired, TNullable, THasDefault, TExtensions> & TExtensions;
123
217
  /**
124
218
  * Consider NaN value as valid
125
219
  */
126
- canBeNaN(): NumberSchemaBuilder<TResult, TRequired>;
220
+ canBeNaN(): NumberSchemaBuilder<TResult, TRequired, TNullable, THasDefault, TExtensions> & TExtensions;
127
221
  /**
128
222
  * Do not accept `Infinity`.
129
223
  */
130
- isFinite(): NumberSchemaBuilder<TResult, TRequired>;
224
+ isFinite(
225
+ /**
226
+ * Custom error message provider.
227
+ */
228
+ errorMessage?: ValidationErrorMessageProvider<NumberSchemaBuilder<TResult, TRequired>>): NumberSchemaBuilder<TResult, TRequired, TNullable, THasDefault, TExtensions> & TExtensions;
131
229
  /**
132
230
  * Consider `Infinity` as valid.
133
231
  */
134
- canBeInfinite(): NumberSchemaBuilder<TResult, TRequired>;
232
+ canBeInfinite(): NumberSchemaBuilder<TResult, TRequired, TNullable, THasDefault, TExtensions> & TExtensions;
233
+ /**
234
+ * Adds a preprocessor that coerces a string value to a number
235
+ * using `Number(value)`. Useful when the input is captured from
236
+ * a string source (e.g. a parse-string schema, URL parameter,
237
+ * or form input).
238
+ *
239
+ * @example ```ts
240
+ * const schema = number().coerce();
241
+ * const result = schema.validate('42');
242
+ * // result.valid === true
243
+ * // result.object === 42
244
+ * ```
245
+ */
246
+ coerce(): NumberSchemaBuilder<TResult, TRequired, TNullable, THasDefault, TExtensions> & TExtensions;
135
247
  /**
136
248
  * Restrict number to be at least `minValue`.
137
249
  */
138
- min(minValue: number): NumberSchemaBuilder<TResult, TRequired>;
250
+ min(minValue: number,
251
+ /**
252
+ * Custom error message provider.
253
+ */
254
+ errorMessage?: ValidationErrorMessageProvider<NumberSchemaBuilder<TResult, TRequired>>): NumberSchemaBuilder<TResult, TRequired, TNullable, THasDefault, TExtensions> & TExtensions;
139
255
  /**
140
256
  * Clear `min()` call.
141
257
  */
142
- clearMin(): NumberSchemaBuilder<TResult, TRequired>;
258
+ clearMin(): NumberSchemaBuilder<TResult, TRequired, TNullable, THasDefault, TExtensions> & TExtensions;
143
259
  /**
144
260
  * Restrict number to be no more than `maxValue`.
145
261
  */
146
- max(maxValue: number): NumberSchemaBuilder<TResult, TRequired>;
262
+ max(maxValue: number,
263
+ /**
264
+ * Custom error message provider.
265
+ */
266
+ errorMessage?: ValidationErrorMessageProvider<NumberSchemaBuilder<TResult, TRequired>>): NumberSchemaBuilder<TResult, TRequired, TNullable, THasDefault, TExtensions> & TExtensions;
147
267
  /**
148
268
  * Clear `max()` call.
149
269
  */
150
- clearMax(): NumberSchemaBuilder<TResult, TRequired>;
270
+ clearMax(): NumberSchemaBuilder<TResult, TRequired, TNullable, THasDefault, TExtensions> & TExtensions;
271
+ /**
272
+ * @hidden
273
+ */
274
+ nullable(): NumberSchemaBuilder<TResult, TRequired, true, THasDefault, TExtensions> & TExtensions;
275
+ /**
276
+ * @hidden
277
+ */
278
+ notNullable(): NumberSchemaBuilder<TResult, TRequired, false, THasDefault, TExtensions> & TExtensions;
151
279
  }
152
280
  /**
153
281
  * Creates a number schema restricted to `equals` value.