typebox 1.0.49 → 1.0.51
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/build/compile/validator.d.mts +9 -4
- package/build/compile/validator.mjs +37 -15
- package/build/schema/engine/additionalProperties.mjs +5 -1
- package/build/type/engine/instantiate.d.mts +2 -1
- package/build/type/engine/instantiate.mjs +7 -5
- package/build/type/types/base.d.mts +2 -0
- package/build/type/types/base.mjs +17 -16
- package/package.json +1 -1
|
@@ -7,14 +7,17 @@ export declare class Validator<Context extends TProperties = TProperties, Type e
|
|
|
7
7
|
private readonly hasCodec;
|
|
8
8
|
private readonly code;
|
|
9
9
|
private readonly check;
|
|
10
|
+
/** Constructs a Validator with the given Context and Type. */
|
|
10
11
|
constructor(context: Context, type: Type);
|
|
11
|
-
/**
|
|
12
|
+
/** Constructs a Validator with the given arguments. */
|
|
13
|
+
constructor(context: Context, type: Type, isEvaluated: boolean, hasCodec: boolean, code: string, check: (value: unknown) => boolean);
|
|
14
|
+
/** Returns true if this validator is using runtime eval optimizations. */
|
|
12
15
|
IsEvaluated(): boolean;
|
|
13
|
-
/** Returns the Context for this validator */
|
|
16
|
+
/** Returns the Context for this validator. */
|
|
14
17
|
Context(): Context;
|
|
15
|
-
/** Returns the Type for this validator */
|
|
18
|
+
/** Returns the Type for this validator. */
|
|
16
19
|
Type(): Type;
|
|
17
|
-
/** Returns the generated code for this validator */
|
|
20
|
+
/** Returns the generated code for this validator. */
|
|
18
21
|
Code(): string;
|
|
19
22
|
/** Checks a value matches the Validator type. */
|
|
20
23
|
Check(value: unknown): value is StaticEncode<Type, Context>;
|
|
@@ -28,6 +31,8 @@ export declare class Validator<Context extends TProperties = TProperties, Type e
|
|
|
28
31
|
Create(): StaticEncode<Type, Context>;
|
|
29
32
|
/** Creates defaults using the Validator type. */
|
|
30
33
|
Default(value: unknown): unknown;
|
|
34
|
+
/** Clones this validator. */
|
|
35
|
+
Clone(): Validator<Context, Type>;
|
|
31
36
|
/** Parses a value */
|
|
32
37
|
Parse(value: unknown): StaticDecode<Type, Context>;
|
|
33
38
|
/** Decodes a value */
|
|
@@ -1,44 +1,62 @@
|
|
|
1
1
|
// deno-fmt-ignore-file
|
|
2
|
+
import { Arguments } from '../system/arguments/index.mjs';
|
|
2
3
|
import { Environment } from '../system/environment/index.mjs';
|
|
3
4
|
import { Base } from '../type/index.mjs';
|
|
4
5
|
import { Errors, Clean, Convert, Create, Default, Decode, Encode, HasCodec, Parser } from '../value/index.mjs';
|
|
5
6
|
import { Build } from '../schema/index.mjs';
|
|
6
7
|
// ------------------------------------------------------------------
|
|
7
|
-
//
|
|
8
|
+
// Validator<...>
|
|
8
9
|
// ------------------------------------------------------------------
|
|
9
10
|
export class Validator extends Base {
|
|
10
|
-
|
|
11
|
+
/** Constructs a Validator. */
|
|
12
|
+
constructor(...args) {
|
|
11
13
|
super();
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
14
|
+
const matched = Arguments.Match(args, {
|
|
15
|
+
6: (context, type, isEvalulated, hasCodec, code, check) => [context, type, isEvalulated, hasCodec, code, check],
|
|
16
|
+
2: (context, type) => [context, type]
|
|
17
|
+
});
|
|
18
|
+
if (matched.length === 6) {
|
|
19
|
+
const [context, type, isEvaluated, hasCodec, code, check] = matched;
|
|
20
|
+
this.context = context;
|
|
21
|
+
this.type = type;
|
|
22
|
+
this.isEvaluated = isEvaluated;
|
|
23
|
+
this.hasCodec = hasCodec;
|
|
24
|
+
this.code = code;
|
|
25
|
+
this.check = check;
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
const [context, type] = matched;
|
|
29
|
+
const result = Build(context, type).Evaluate();
|
|
30
|
+
this.hasCodec = HasCodec(context, type);
|
|
31
|
+
this.context = context;
|
|
32
|
+
this.type = type;
|
|
33
|
+
this.isEvaluated = result.IsEvaluated;
|
|
34
|
+
this.code = result.Code;
|
|
35
|
+
this.check = result.Check;
|
|
36
|
+
}
|
|
19
37
|
}
|
|
20
38
|
// ----------------------------------------------------------------
|
|
21
|
-
//
|
|
39
|
+
// IsEvaluated
|
|
22
40
|
// ----------------------------------------------------------------
|
|
23
|
-
/** Returns true if this validator is using runtime eval optimizations */
|
|
41
|
+
/** Returns true if this validator is using runtime eval optimizations. */
|
|
24
42
|
IsEvaluated() {
|
|
25
43
|
return this.isEvaluated;
|
|
26
44
|
}
|
|
27
45
|
// ----------------------------------------------------------------
|
|
28
|
-
//
|
|
46
|
+
// Context | Type
|
|
29
47
|
// ----------------------------------------------------------------
|
|
30
|
-
/** Returns the Context for this validator */
|
|
48
|
+
/** Returns the Context for this validator. */
|
|
31
49
|
Context() {
|
|
32
50
|
return this.context;
|
|
33
51
|
}
|
|
34
|
-
/** Returns the Type for this validator */
|
|
52
|
+
/** Returns the Type for this validator. */
|
|
35
53
|
Type() {
|
|
36
54
|
return this.type;
|
|
37
55
|
}
|
|
38
56
|
// ----------------------------------------------------------------
|
|
39
57
|
// Code
|
|
40
58
|
// ----------------------------------------------------------------
|
|
41
|
-
/** Returns the generated code for this validator */
|
|
59
|
+
/** Returns the generated code for this validator. */
|
|
42
60
|
Code() {
|
|
43
61
|
return this.code;
|
|
44
62
|
}
|
|
@@ -71,6 +89,10 @@ export class Validator extends Base {
|
|
|
71
89
|
Default(value) {
|
|
72
90
|
return Default(this.context, this.type, value);
|
|
73
91
|
}
|
|
92
|
+
/** Clones this validator. */
|
|
93
|
+
Clone() {
|
|
94
|
+
return new Validator(this.context, this.type, this.isEvaluated, this.hasCodec, this.code, this.check);
|
|
95
|
+
}
|
|
74
96
|
// ----------------------------------------------------------------
|
|
75
97
|
// Parse | Decode | Encode
|
|
76
98
|
// ----------------------------------------------------------------
|
|
@@ -16,12 +16,16 @@ import { BuildSchema, CheckSchema, ErrorSchema } from './schema.mjs';
|
|
|
16
16
|
// matches nothing: '(?!)'.
|
|
17
17
|
//
|
|
18
18
|
// ------------------------------------------------------------------
|
|
19
|
+
function GetPropertyKeyAsPattern(key) {
|
|
20
|
+
const escaped = key.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
21
|
+
return `^${escaped}$`;
|
|
22
|
+
}
|
|
19
23
|
function GetPropertiesPattern(schema) {
|
|
20
24
|
const patterns = [];
|
|
21
25
|
if (S.IsPatternProperties(schema))
|
|
22
26
|
patterns.push(...G.Keys(schema.patternProperties));
|
|
23
27
|
if (S.IsProperties(schema))
|
|
24
|
-
patterns.push(...G.Keys(schema.properties));
|
|
28
|
+
patterns.push(...G.Keys(schema.properties).map(GetPropertyKeyAsPattern));
|
|
25
29
|
return G.IsEqual(patterns.length, 0) ? '(?!)' : `(${patterns.join('|')})`;
|
|
26
30
|
}
|
|
27
31
|
// ------------------------------------------------------------------
|
|
@@ -156,7 +156,8 @@ type TInstantiateDeferred<Context extends TProperties, State extends TState, Act
|
|
|
156
156
|
Action,
|
|
157
157
|
Parameters
|
|
158
158
|
] extends ['Uppercase', [infer Type extends TSchema]] ? TUppercaseInstantiate<Context, State, Type> : TDeferred<Action, Parameters>);
|
|
159
|
-
export type TInstantiateType<Context extends TProperties, State extends TState, Input extends TSchema,
|
|
159
|
+
export type TInstantiateType<Context extends TProperties, State extends TState, Input extends TSchema, Cloned extends TSchema = Input, // symmetry only
|
|
160
|
+
Immutable extends boolean = Cloned extends TImmutable ? true : false, Modifiers extends [TSchema, ModifierAction, ModifierAction] = TModifierActions<Cloned, Cloned extends TReadonly<Cloned> ? 'add' : 'none', Cloned extends TOptional<Cloned> ? 'add' : 'none'>, Type extends TSchema = Modifiers[0], Instantiated extends TSchema = (Type extends TRef<infer Ref extends string> ? TRefInstantiate<Context, State, Ref> : Type extends TArray<infer Type extends TSchema> ? TArray<TInstantiateType<Context, State, Type>> : Type extends TAsyncIterator<infer Type extends TSchema> ? TAsyncIterator<TInstantiateType<Context, State, Type>> : Type extends TCall<infer Target extends TSchema, infer Parameters extends TSchema[]> ? TCallInstantiate<Context, State, Target, Parameters> : Type extends TConstructor<infer Parameters extends TSchema[], infer InstanceType extends TSchema> ? TConstructor<TInstantiateTypes<Context, State, Parameters>, TInstantiateType<Context, State, InstanceType>> : Type extends TDeferred<infer Action extends string, infer Types extends TSchema[]> ? TInstantiateDeferred<Context, State, Action, Types> : Type extends TFunction<infer Parameters extends TSchema[], infer ReturnType extends TSchema> ? TFunction<TInstantiateTypes<Context, State, Parameters>, TInstantiateType<Context, State, ReturnType>> : Type extends TIntersect<infer Types extends TSchema[]> ? TIntersect<TInstantiateTypes<Context, State, Types>> : Type extends TIterator<infer Type extends TSchema> ? TIterator<TInstantiateType<Context, State, Type>> : Type extends TObject<infer Properties extends TProperties> ? TObject<TInstantiateProperties<Context, State, Properties>> : Type extends TPromise<infer Type extends TSchema> ? TPromise<TInstantiateType<Context, State, Type>> : Type extends TRecord<infer Key extends string, infer Type extends TSchema> ? TRecord<Key, TInstantiateType<Context, State, Type>> : Type extends TRest<infer Type extends TSchema> ? TRest<TInstantiateType<Context, State, Type>> : Type extends TTuple<infer Types extends TSchema[]> ? TTuple<TInstantiateElements<Context, State, Types>> : Type extends TUnion<infer Types extends TSchema[]> ? TUnion<TInstantiateTypes<Context, State, Types>> : Type), WithImmutable extends TSchema = Immutable extends true ? TImmutable<Instantiated> : Instantiated, WithModifiers extends TSchema = TApplyReadonly<Modifiers[1], TApplyOptional<Modifiers[2], WithImmutable>>> = WithModifiers;
|
|
160
161
|
export declare function InstantiateType<Context extends TProperties, State extends TState, Type extends TSchema>(context: Context, state: State, input: Type): TInstantiateType<Context, State, Type>;
|
|
161
162
|
/** Instantiates computed schematics using the given context and type. */
|
|
162
163
|
export type TInstantiate<Context extends TProperties, Type extends TSchema> = (TInstantiateType<Context, {
|
|
@@ -13,6 +13,7 @@ import { IsReadonly, ReadonlyAdd, ReadonlyRemove } from '../types/_readonly.mjs'
|
|
|
13
13
|
import { IsSchema } from '../types/schema.mjs';
|
|
14
14
|
import { Array, IsArray, ArrayOptions } from '../types/array.mjs';
|
|
15
15
|
import { AsyncIterator, IsAsyncIterator, AsyncIteratorOptions } from '../types/async-iterator.mjs';
|
|
16
|
+
import { IsBase } from '../types/base.mjs';
|
|
16
17
|
import { Constructor, IsConstructor, ConstructorOptions } from '../types/constructor.mjs';
|
|
17
18
|
import { Deferred, IsDeferred } from '../types/deferred.mjs';
|
|
18
19
|
import { Function as _Function, IsFunction, FunctionOptions } from '../types/function.mjs';
|
|
@@ -142,9 +143,10 @@ function InstantiateDeferred(context, state, action, parameters, options) {
|
|
|
142
143
|
Deferred(action, parameters, options));
|
|
143
144
|
}
|
|
144
145
|
export function InstantiateType(context, state, input) {
|
|
145
|
-
const
|
|
146
|
-
const
|
|
147
|
-
const
|
|
146
|
+
const cloned = IsBase(input) ? input.Clone() : input;
|
|
147
|
+
const immutable = IsImmutable(cloned);
|
|
148
|
+
const modifiers = ModifierActions(cloned, IsReadonly(cloned) ? 'add' : 'none', IsOptional(cloned) ? 'add' : 'none');
|
|
149
|
+
const type = modifiers[0];
|
|
148
150
|
const instantiated = (IsRef(type) ? RefInstantiate(context, state, type.$ref) :
|
|
149
151
|
IsArray(type) ? Array(InstantiateType(context, state, type.items), ArrayOptions(type)) :
|
|
150
152
|
IsAsyncIterator(type) ? AsyncIterator(InstantiateType(context, state, type.iteratorItems), AsyncIteratorOptions(type)) :
|
|
@@ -161,8 +163,8 @@ export function InstantiateType(context, state, input) {
|
|
|
161
163
|
IsTuple(type) ? Tuple(InstantiateElements(context, state, type.items), TupleOptions(type)) :
|
|
162
164
|
IsUnion(type) ? Union(InstantiateTypes(context, state, type.anyOf), UnionOptions(type)) :
|
|
163
165
|
type);
|
|
164
|
-
const withImmutable =
|
|
165
|
-
const withModifiers = ApplyReadonly(
|
|
166
|
+
const withImmutable = immutable ? Immutable(instantiated) : instantiated;
|
|
167
|
+
const withModifiers = ApplyReadonly(modifiers[1], ApplyOptional(modifiers[2], withImmutable));
|
|
166
168
|
return withModifiers;
|
|
167
169
|
}
|
|
168
170
|
/** Instantiates computed schematics using the given context and type. */
|
|
@@ -18,6 +18,8 @@ export declare class Base<Value extends unknown = unknown> implements TSchema, X
|
|
|
18
18
|
Default(value: unknown): unknown;
|
|
19
19
|
/** Creates a new instance of this type */
|
|
20
20
|
Create(): Value;
|
|
21
|
+
/** Clones this type */
|
|
22
|
+
Clone(): Base;
|
|
21
23
|
}
|
|
22
24
|
/** Returns true if the given value is a Base type. */
|
|
23
25
|
export declare function IsBase(value: unknown): value is Base;
|
|
@@ -4,25 +4,22 @@ import { IsKind } from './schema.mjs';
|
|
|
4
4
|
// ------------------------------------------------------------------
|
|
5
5
|
// Type.Base<...>
|
|
6
6
|
// ------------------------------------------------------------------
|
|
7
|
+
function BaseProperty(value) {
|
|
8
|
+
return {
|
|
9
|
+
enumerable: Settings.Get().enumerableKind,
|
|
10
|
+
writable: false,
|
|
11
|
+
configurable: false,
|
|
12
|
+
value
|
|
13
|
+
};
|
|
14
|
+
}
|
|
7
15
|
/** Base class for creating extension types. */
|
|
8
16
|
export class Base {
|
|
9
17
|
constructor() {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
};
|
|
15
|
-
globalThis.Object.defineProperty(this, '~kind', {
|
|
16
|
-
...configuration,
|
|
17
|
-
value: 'Base'
|
|
18
|
-
});
|
|
19
|
-
globalThis.Object.defineProperty(this, '~guard', {
|
|
20
|
-
...configuration,
|
|
21
|
-
value: {
|
|
22
|
-
check: (value) => this.Check(value),
|
|
23
|
-
errors: (value) => this.Errors(value)
|
|
24
|
-
}
|
|
25
|
-
});
|
|
18
|
+
globalThis.Object.defineProperty(this, '~kind', BaseProperty('Base'));
|
|
19
|
+
globalThis.Object.defineProperty(this, '~guard', BaseProperty({
|
|
20
|
+
check: (value) => this.Check(value),
|
|
21
|
+
errors: (value) => this.Errors(value)
|
|
22
|
+
}));
|
|
26
23
|
}
|
|
27
24
|
/** Checks a value or returns false if invalid */
|
|
28
25
|
Check(value) {
|
|
@@ -48,6 +45,10 @@ export class Base {
|
|
|
48
45
|
Create() {
|
|
49
46
|
throw new Error('Create not implemented');
|
|
50
47
|
}
|
|
48
|
+
/** Clones this type */
|
|
49
|
+
Clone() {
|
|
50
|
+
throw Error('Clone not implemented');
|
|
51
|
+
}
|
|
51
52
|
}
|
|
52
53
|
// ------------------------------------------------------------------
|
|
53
54
|
// Guard
|