Skip to content

Commit e5c5440

Browse files
author
jquense
committed
feat: pass options to default(options => value)
closes #1984
1 parent 1fadba1 commit e5c5440

12 files changed

+47
-35
lines changed

src/array.ts

+11-6
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,19 @@ import isSchema from './util/isSchema';
22
import printValue from './util/printValue';
33
import parseJson from './util/parseJson';
44
import { array as locale } from './locale';
5-
import type { AnyObject, InternalOptions, Message, ISchema } from './types';
5+
import type {
6+
AnyObject,
7+
InternalOptions,
8+
Message,
9+
ISchema,
10+
DefaultThunk,
11+
} from './types';
612
import type Reference from './Reference';
713
import type {
814
Defined,
915
Flags,
1016
NotNull,
1117
SetFlag,
12-
Thunk,
1318
Maybe,
1419
Optionals,
1520
ToggleDefault,
@@ -39,7 +44,7 @@ export function create<C extends Maybe<AnyObject> = AnyObject, T = any>(
3944
}
4045

4146
interface ArraySchemaSpec<TIn, TContext> extends SchemaSpec<any> {
42-
types?: ISchema<InnerType<TIn>, TContext>
47+
types?: ISchema<InnerType<TIn>, TContext>;
4348
}
4449

4550
export default class ArraySchema<
@@ -191,8 +196,8 @@ export default class ArraySchema<
191196

192197
next.spec = {
193198
...next.spec,
194-
types: schema as ISchema<InnerType<TIn>, TContext>
195-
}
199+
types: schema as ISchema<InnerType<TIn>, TContext>,
200+
};
196201

197202
return next as any;
198203
}
@@ -289,7 +294,7 @@ export default interface ArraySchema<
289294
TFlags extends Flags = '',
290295
> extends Schema<TIn, TContext, TDefault, TFlags> {
291296
default<D extends Maybe<TIn>>(
292-
def: Thunk<D>,
297+
def: DefaultThunk<D, TContext>,
293298
): ArraySchema<TIn, TContext, D, ToggleDefault<TFlags, D>>;
294299

295300
defined(msg?: Message): ArraySchema<Defined<TIn>, TContext, TDefault, TFlags>;

src/boolean.ts

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
import Schema from './schema';
2-
import type { AnyObject, Message } from './types';
2+
import type { AnyObject, DefaultThunk, Message } from './types';
33
import type {
44
Defined,
55
Flags,
66
NotNull,
77
SetFlag,
8-
Thunk,
98
ToggleDefault,
109
UnsetFlag,
1110
Maybe,
@@ -79,7 +78,7 @@ export default class BooleanSchema<
7978
}
8079

8180
override default<D extends Maybe<TType>>(
82-
def: Thunk<D>,
81+
def: DefaultThunk<D, TContext>,
8382
): BooleanSchema<TType, TContext, D, ToggleDefault<TFlags, D>> {
8483
return super.default(def);
8584
}

src/date.ts

+2-3
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,12 @@
22
import isoParse from './util/isodate';
33
import { date as locale } from './locale';
44
import Ref from './Reference';
5-
import type { AnyObject, Message } from './types';
5+
import type { AnyObject, DefaultThunk, Message } from './types';
66
import type {
77
Defined,
88
Flags,
99
NotNull,
1010
SetFlag,
11-
Thunk,
1211
Maybe,
1312
ToggleDefault,
1413
UnsetFlag,
@@ -120,7 +119,7 @@ export default interface DateSchema<
120119
TFlags extends Flags = '',
121120
> extends Schema<TType, TContext, TDefault, TFlags> {
122121
default<D extends Maybe<TType>>(
123-
def: Thunk<D>,
122+
def: DefaultThunk<D, TContext>,
124123
): DateSchema<TType, TContext, D, ToggleDefault<TFlags, D>>;
125124

126125
concat<TOther extends DateSchema<any, any>>(schema: TOther): TOther;

src/index.ts

+8-2
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,13 @@ import Schema, {
2828
SchemaFieldDescription,
2929
SchemaDescription,
3030
} from './schema';
31-
import type { InferType, ISchema, Message, ValidateOptions } from './types';
31+
import type {
32+
InferType,
33+
ISchema,
34+
Message,
35+
ValidateOptions,
36+
DefaultThunk,
37+
} from './types';
3238

3339
function addMethod<T extends ISchema<any>>(
3440
schemaType: (...arg: any[]) => T,
@@ -73,6 +79,7 @@ export type {
7379
SchemaDescription,
7480
LocaleObject,
7581
ValidateOptions,
82+
DefaultThunk,
7683
};
7784

7885
export {
@@ -128,7 +135,6 @@ export type {
128135
Maybe,
129136
Flags,
130137
Optionals,
131-
Thunk,
132138
ToggleDefault,
133139
Defined,
134140
NotNull,

src/mixed.ts

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
import { AnyObject, Message } from './types';
1+
import { AnyObject, DefaultThunk, Message } from './types';
22
import type {
33
Concat,
44
Defined,
55
Flags,
66
SetFlag,
7-
Thunk,
87
Maybe,
98
ToggleDefault,
109
UnsetFlag,
@@ -49,7 +48,7 @@ export default interface MixedSchema<
4948
TFlags extends Flags = '',
5049
> extends Schema<TType, TContext, TDefault, TFlags> {
5150
default<D extends Maybe<TType>>(
52-
def: Thunk<D>,
51+
def: DefaultThunk<D, TContext>,
5352
): MixedSchema<TType, TContext, D, ToggleDefault<TFlags, D>>;
5453

5554
concat<IT, IC, ID, IF extends Flags>(

src/number.ts

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
import { number as locale } from './locale';
22
import isAbsent from './util/isAbsent';
3-
import type { AnyObject, Message } from './types';
3+
import type { AnyObject, DefaultThunk, Message } from './types';
44
import type Reference from './Reference';
55
import type {
66
Concat,
77
Defined,
88
Flags,
99
NotNull,
1010
SetFlag,
11-
Thunk,
1211
Maybe,
1312
ToggleDefault,
1413
UnsetFlag,
@@ -167,7 +166,7 @@ export default interface NumberSchema<
167166
TFlags extends Flags = '',
168167
> extends Schema<TType, TContext, TDefault, TFlags> {
169168
default<D extends Maybe<TType>>(
170-
def: Thunk<D>,
169+
def: DefaultThunk<D, TContext>,
171170
): NumberSchema<TType, TContext, D, ToggleDefault<TFlags, D>>;
172171

173172
concat<UType extends Maybe<number>, UContext, UFlags extends Flags, UDefault>(

src/object.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ import { Flags, Maybe, SetFlag, ToggleDefault, UnsetFlag } from './util/types';
66
import { object as locale } from './locale';
77
import sortFields from './util/sortFields';
88
import sortByKeyOrder from './util/sortByKeyOrder';
9-
import { InternalOptions, ISchema, Message } from './types';
10-
import type { Defined, Thunk, NotNull, _ } from './util/types';
9+
import { DefaultThunk, InternalOptions, ISchema, Message } from './types';
10+
import type { Defined, NotNull, _ } from './util/types';
1111
import Reference from './Reference';
1212
import Schema, { SchemaObjectDescription, SchemaSpec } from './schema';
1313
import { ResolveOptions } from './Condition';
@@ -98,7 +98,7 @@ export default interface ObjectSchema<
9898
TFlags extends Flags = '',
9999
> extends Schema<MakeKeysOptional<TIn>, TContext, TDefault, TFlags> {
100100
default<D extends Maybe<AnyObject>>(
101-
def: Thunk<D>,
101+
def: DefaultThunk<D, TContext>,
102102
): ObjectSchema<TIn, TContext, D, ToggleDefault<TFlags, 'd'>>;
103103

104104
defined(

src/schema.ts

+5-4
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,14 @@ import {
2323
ExtraParams,
2424
ISchema,
2525
NestedTestConfig,
26+
DefaultThunk,
2627
} from './types';
2728

2829
import ValidationError from './ValidationError';
2930
import ReferenceSet from './util/ReferenceSet';
3031
import Reference from './Reference';
3132
import isAbsent from './util/isAbsent';
32-
import type { Flags, Maybe, ResolveFlags, Thunk, _ } from './util/types';
33+
import type { Flags, Maybe, ResolveFlags, _ } from './util/types';
3334
import toArray from './util/toArray';
3435
import cloneDeep from './util/cloneDeep';
3536

@@ -607,15 +608,15 @@ export default abstract class Schema<
607608
}
608609
}
609610

610-
protected _getDefault(_options?: ResolveOptions<TContext>) {
611+
protected _getDefault(options?: ResolveOptions<TContext>) {
611612
let defaultValue = this.spec.default;
612613

613614
if (defaultValue == null) {
614615
return defaultValue;
615616
}
616617

617618
return typeof defaultValue === 'function'
618-
? defaultValue.call(this)
619+
? defaultValue.call(this, options)
619620
: cloneDeep(defaultValue);
620621
}
621622

@@ -627,7 +628,7 @@ export default abstract class Schema<
627628
return schema._getDefault(options);
628629
}
629630

630-
default(def: Thunk<any>): any {
631+
default(def: DefaultThunk<any>): any {
631632
if (arguments.length === 0) {
632633
return this._getDefault();
633634
}

src/string.ts

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
import { MixedLocale, mixed as mixedLocale, string as locale } from './locale';
22
import isAbsent from './util/isAbsent';
33
import type Reference from './Reference';
4-
import type { Message, AnyObject } from './types';
4+
import type { Message, AnyObject, DefaultThunk } from './types';
55
import type {
66
Concat,
77
Defined,
88
Flags,
99
NotNull,
1010
SetFlag,
11-
Thunk,
1211
ToggleDefault,
1312
UnsetFlag,
1413
Maybe,
@@ -256,7 +255,7 @@ export default interface StringSchema<
256255
TFlags extends Flags = '',
257256
> extends Schema<TType, TContext, TDefault, TFlags> {
258257
default<D extends Maybe<TType>>(
259-
def: Thunk<D>,
258+
def: DefaultThunk<D, TContext>,
260259
): StringSchema<TType, TContext, D, ToggleDefault<TFlags, D>>;
261260

262261
oneOf<U extends TType>(

src/tuple.ts

+8-3
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
11
// @ts-ignore
22

3-
import type { AnyObject, InternalOptions, ISchema, Message } from './types';
3+
import type {
4+
AnyObject,
5+
DefaultThunk,
6+
InternalOptions,
7+
ISchema,
8+
Message,
9+
} from './types';
410
import type {
511
Defined,
612
Flags,
713
NotNull,
814
SetFlag,
9-
Thunk,
1015
ToggleDefault,
1116
UnsetFlag,
1217
Maybe,
@@ -35,7 +40,7 @@ export default interface TupleSchema<
3540
TFlags extends Flags = '',
3641
> extends Schema<TType, TContext, TDefault, TFlags> {
3742
default<D extends Maybe<TType>>(
38-
def: Thunk<D>,
43+
def: DefaultThunk<D, TContext>,
3944
): TupleSchema<TType, TContext, D, ToggleDefault<TFlags, D>>;
4045

4146
concat<TOther extends TupleSchema<any, any>>(schema: TOther): TOther;

src/types.ts

+2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ export interface ISchema<T, C = any, F extends Flags = any, D = any> {
2929
resolve(options: ResolveOptions<C>): ISchema<T, C, F>;
3030
}
3131

32+
export type DefaultThunk<T, C = any> = T | ((options?: ResolveOptions<C>) => T);
33+
3234
export type InferType<T extends ISchema<any, any>> = T['__outputType'];
3335

3436
export type TransformFunction<T extends AnySchema> = (

src/util/types.ts

-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@ export type Defined<T> = T extends undefined ? never : T;
1010

1111
export type NotNull<T> = T extends null ? never : T;
1212

13-
export type Thunk<T> = T | (() => T);
14-
1513
/* this seems to force TS to show the full type instead of all the wrapped generics */
1614
export type _<T> = T extends {} ? { [k in keyof T]: T[k] } : T;
1715

0 commit comments

Comments
 (0)