typebox 1.1.8 → 1.1.9
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/type/engine/call/distribute-arguments.d.mts +8 -3
- package/build/type/engine/call/distribute-arguments.mjs +30 -5
- package/build/type/engine/call/instantiate.d.mts +2 -2
- package/build/type/engine/call/instantiate.mjs +2 -2
- package/build/type/engine/call/resolve-arguments.mjs +2 -2
- package/package.json +1 -1
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
import { type TSchema } from '../../types/schema.mjs';
|
|
2
2
|
import { type TUnion } from '../../types/union.mjs';
|
|
3
3
|
import { type TDeferred } from '../../types/deferred.mjs';
|
|
4
|
+
import { type TRef } from '../../types/ref.mjs';
|
|
5
|
+
import { type TParameter } from '../../types/parameter.mjs';
|
|
6
|
+
type TCollectDistributionNames<Expression extends TSchema, Result extends string[] = []> = (Expression extends TDeferred<'Conditional', [infer Left extends TSchema, infer _Right extends TSchema, infer True extends TSchema, infer False extends TSchema]> ? Left extends TRef<infer Name extends string> ? TCollectDistributionNames<True, TCollectDistributionNames<False, [...Result, Name]>> : TCollectDistributionNames<True, TCollectDistributionNames<False, Result>> : Result);
|
|
7
|
+
type TBuildDistributionArray<Parameters extends TParameter[], Names extends string[], Result extends boolean[] = []> = (Parameters extends [infer Left extends TParameter, ...infer Right extends TParameter[]] ? Left['name'] extends Names[number] ? TBuildDistributionArray<Right, Names, [...Result, true]> : TBuildDistributionArray<Right, Names, [...Result, false]> : Result);
|
|
8
|
+
type TZipDistributionArray<Arguments extends TSchema[], DistributionArray extends boolean[], Result extends [boolean, TSchema][] = []> = (Arguments extends [infer ArgumentLeft extends TSchema, ...infer ArgumentRight extends TSchema[]] ? DistributionArray extends [infer BooleanLeft extends boolean, ...infer BooleanRight extends boolean[]] ? TZipDistributionArray<ArgumentRight, BooleanRight, [...Result, [BooleanLeft, ArgumentLeft]]> : Result : Result);
|
|
4
9
|
type TExpand<Type extends TSchema> = (Type extends TUnion<infer Types extends TSchema[]> ? [...Types] : [Type]);
|
|
5
10
|
type TAppend<Current extends TSchema[][], Type extends TSchema, Result extends TSchema[][] = []> = (Current extends [infer Left extends TSchema[], ...infer Right extends TSchema[][]] ? TAppend<Right, Type, [...Result, [...Left, Type]]> : Result);
|
|
6
11
|
type TCross<Current extends TSchema[][], Variants extends TSchema[], Result extends TSchema[][] = []> = (Variants extends [infer Left extends TSchema, ...infer Right extends TSchema[]] ? TCross<Current, Right, [...Result, ...TAppend<Current, Left>]> : Result);
|
|
7
|
-
type TDistribute<
|
|
8
|
-
export type TDistributeArguments<Arguments extends TSchema[], Expression extends TSchema, Result extends TSchema[][] = Expression extends TDeferred<'Conditional', TSchema[]> ? TDistribute<
|
|
9
|
-
export declare function
|
|
12
|
+
type TDistribute<ZippedArguments extends [boolean, TSchema][], Result extends TSchema[][] = [[]]> = (ZippedArguments extends [infer Left extends [boolean, TSchema], ...infer Right extends [boolean, TSchema][]] ? Left[0] extends true ? TDistribute<Right, TCross<Result, TExpand<Left[1]>>> : TDistribute<Right, TCross<Result, [Left[1]]>> : Result);
|
|
13
|
+
export type TDistributeArguments<Parameters extends TParameter[], Arguments extends TSchema[], Expression extends TSchema, DistributionNames extends string[] = TCollectDistributionNames<Expression>, DistributionArray extends boolean[] = TBuildDistributionArray<Parameters, DistributionNames>, ZippedArguments extends [boolean, TSchema][] = TZipDistributionArray<Arguments, DistributionArray>, Result extends TSchema[][] = Expression extends TDeferred<'Conditional', TSchema[]> ? TDistribute<ZippedArguments> : [Arguments]> = Result;
|
|
14
|
+
export declare function DistributeArguments<Parameters extends TParameter[], Arguments extends TSchema[], Expression extends TSchema>(parameters: [...Parameters], arguments_: [...Arguments], expression: Expression): TDistributeArguments<Parameters, Arguments, Expression>;
|
|
10
15
|
export {};
|
|
@@ -2,6 +2,26 @@
|
|
|
2
2
|
import { Guard } from '../../../guard/index.mjs';
|
|
3
3
|
import { IsUnion } from '../../types/union.mjs';
|
|
4
4
|
import { IsDeferred } from '../../types/deferred.mjs';
|
|
5
|
+
import { IsRef } from '../../types/ref.mjs';
|
|
6
|
+
function CollectDistributionNames(expression, result = []) {
|
|
7
|
+
return (IsDeferred(expression) && Guard.IsEqual(expression.action, 'Conditional')
|
|
8
|
+
? IsRef(expression.parameters[0])
|
|
9
|
+
? CollectDistributionNames(expression.parameters[2], CollectDistributionNames(expression.parameters[3], [...result, expression.parameters[0].$ref]))
|
|
10
|
+
: CollectDistributionNames(expression.parameters[2], CollectDistributionNames(expression.parameters[3], result))
|
|
11
|
+
: result);
|
|
12
|
+
}
|
|
13
|
+
function BuildDistributionArray(parameters, names) {
|
|
14
|
+
return parameters.reduce((result, left) => [...result, names.includes(left.name)], []);
|
|
15
|
+
}
|
|
16
|
+
function ZipDistributionArray(arguments_, distributionArray, result = []) {
|
|
17
|
+
const [argumentLeft, ...argumentRight] = arguments_;
|
|
18
|
+
const [booleanLeft, ...booleanRight] = distributionArray;
|
|
19
|
+
return (Guard.IsGreaterThan(arguments_.length, 0)
|
|
20
|
+
? Guard.IsGreaterThan(distributionArray.length, 0)
|
|
21
|
+
? ZipDistributionArray(argumentRight, booleanRight, [...result, [booleanLeft, argumentLeft]])
|
|
22
|
+
: result
|
|
23
|
+
: result);
|
|
24
|
+
}
|
|
5
25
|
function Expand(type) {
|
|
6
26
|
return (IsUnion(type)
|
|
7
27
|
? [...type.anyOf]
|
|
@@ -15,13 +35,18 @@ function Cross(current, variants) {
|
|
|
15
35
|
return [...result, ...Append(current, left)];
|
|
16
36
|
}, []);
|
|
17
37
|
}
|
|
18
|
-
function Distribute(
|
|
19
|
-
return
|
|
20
|
-
return
|
|
38
|
+
function Distribute(zipped) {
|
|
39
|
+
return zipped.reduce((result, left) => {
|
|
40
|
+
return Guard.IsEqual(left[0], true)
|
|
41
|
+
? Cross(result, Expand(left[1]))
|
|
42
|
+
: Cross(result, [left[1]]); // - no-expansion
|
|
21
43
|
}, [[]]);
|
|
22
44
|
}
|
|
23
|
-
export function
|
|
45
|
+
export function DistributeArguments(parameters, arguments_, expression) {
|
|
46
|
+
const distributionNames = CollectDistributionNames(expression);
|
|
47
|
+
const distributionArray = BuildDistributionArray(parameters, distributionNames);
|
|
48
|
+
const zippedArguments = ZipDistributionArray(arguments_, distributionArray);
|
|
24
49
|
return (IsDeferred(expression) && Guard.IsEqual(expression.action, 'Conditional')
|
|
25
|
-
? Distribute(
|
|
50
|
+
? Distribute(zippedArguments)
|
|
26
51
|
: [arguments_]);
|
|
27
52
|
}
|
|
@@ -5,9 +5,9 @@ import { type TRef } from '../../types/ref.mjs';
|
|
|
5
5
|
import { type TGeneric } from '../../types/generic.mjs';
|
|
6
6
|
import { type TProperties } from '../../types/properties.mjs';
|
|
7
7
|
import { type TEvaluateUnion } from '../evaluate/index.mjs';
|
|
8
|
-
import { type TState } from '../instantiate.mjs';
|
|
9
8
|
import { type TInstantiateType } from '../instantiate.mjs';
|
|
10
9
|
import { type TInstantiateTypes } from '../instantiate.mjs';
|
|
10
|
+
import { type TState } from '../instantiate.mjs';
|
|
11
11
|
import { type TDistributeArguments } from './distribute-arguments.mjs';
|
|
12
12
|
import { type TResolveTarget } from './resolve-target.mjs';
|
|
13
13
|
import { type TResolveArgumentsContext } from './resolve-arguments.mjs';
|
|
@@ -17,7 +17,7 @@ type TCallDispatch<Context extends TProperties, State extends TState, Target ext
|
|
|
17
17
|
callstack: [...State['callstack'], Target['$ref']];
|
|
18
18
|
}, Expression>> = TInstantiateType<Context, State, ReturnType>;
|
|
19
19
|
type TCallDistributed<Context extends TProperties, State extends TState, Target extends TRef, Parameters extends TParameter[], Expression extends TSchema, DistributedArguments extends TSchema[][], Result extends TSchema[] = []> = (DistributedArguments extends [infer Arguments extends TSchema[], ...infer DistributedArguments extends TSchema[][]] ? TCallDispatch<Context, State, Target, Parameters, Expression, Arguments> extends infer ReturnType extends TSchema ? TCallDistributed<Context, State, Target, Parameters, Expression, DistributedArguments, [...Result, ReturnType]> : never : Result);
|
|
20
|
-
type TCallImmediate<Context extends TProperties, State extends TState, Target extends TRef, Parameters extends TParameter[], Expression extends TSchema, InstantiatedArguments extends TSchema[], DistributedArguments extends TSchema[][] = TDistributeArguments<InstantiatedArguments, Expression>, ReturnTypes extends TSchema[] = TCallDistributed<Context, State, Target, Parameters, Expression, DistributedArguments>, Result extends TSchema = ReturnTypes['length'] extends 1 ? ReturnTypes[0] : TEvaluateUnion<ReturnTypes>> = Result;
|
|
20
|
+
type TCallImmediate<Context extends TProperties, State extends TState, Target extends TRef, Parameters extends TParameter[], Expression extends TSchema, InstantiatedArguments extends TSchema[], DistributedArguments extends TSchema[][] = TDistributeArguments<Parameters, InstantiatedArguments, Expression>, ReturnTypes extends TSchema[] = TCallDistributed<Context, State, Target, Parameters, Expression, DistributedArguments>, Result extends TSchema = ReturnTypes['length'] extends 1 ? ReturnTypes[0] : TEvaluateUnion<ReturnTypes>> = Result;
|
|
21
21
|
export type TCallInstantiate<Context extends TProperties, State extends TState, Target extends TSchema, Arguments extends TSchema[], InstantiatedArguments extends TSchema[] = TInstantiateTypes<Context, State, Arguments>, Resolved extends [string, TSchema] = TResolveTarget<Context, Target, Arguments>, Name extends string = Resolved[0], Type extends TSchema = Resolved[1], Result extends TSchema = (Type extends TGeneric<infer Parameters extends TParameter[], infer Expression extends TSchema> ? TIsTailCall<State, Name> extends true ? TCallConstruct<TRef<Name>, InstantiatedArguments> : TCallImmediate<Context, State, TRef<Name>, Parameters, Expression, InstantiatedArguments> : TCallConstruct<Target, InstantiatedArguments>)> = Result;
|
|
22
22
|
export declare function CallInstantiate<Context extends TProperties, State extends TState, Target extends TSchema, Arguments extends TSchema[]>(context: Context, state: State, target: Target, arguments_: [...Arguments]): TCallInstantiate<Context, State, Target, Arguments>;
|
|
23
23
|
export {};
|
|
@@ -9,7 +9,7 @@ import { InstantiateTypes } from '../instantiate.mjs';
|
|
|
9
9
|
// ------------------------------------------------------------------
|
|
10
10
|
// Infrastructure
|
|
11
11
|
// ------------------------------------------------------------------
|
|
12
|
-
import {
|
|
12
|
+
import { DistributeArguments } from './distribute-arguments.mjs';
|
|
13
13
|
import { ResolveTarget } from './resolve-target.mjs';
|
|
14
14
|
import { ResolveArgumentsContext } from './resolve-arguments.mjs';
|
|
15
15
|
function Peek(state) {
|
|
@@ -29,7 +29,7 @@ function CallDistributed(context, state, target, parameters, expression, distrib
|
|
|
29
29
|
return distributedArguments.reduce((result, arguments_) => [...result, CallDispatch(context, state, target, parameters, expression, arguments_)], []);
|
|
30
30
|
}
|
|
31
31
|
function CallImmediate(context, state, target, parameters, expression, arguments_) {
|
|
32
|
-
const distributedArguments =
|
|
32
|
+
const distributedArguments = DistributeArguments(parameters, arguments_, expression);
|
|
33
33
|
const returnTypes = CallDistributed(context, state, target, parameters, expression, distributedArguments);
|
|
34
34
|
const result = returnTypes.length === 1 ? returnTypes[0] : EvaluateUnion(returnTypes);
|
|
35
35
|
return result;
|
|
@@ -11,9 +11,9 @@ import { IsCall } from '../../types/call.mjs';
|
|
|
11
11
|
function AssertArgumentExtends(name, type, extends_) {
|
|
12
12
|
if (IsInfer(type) || IsCall(type) || ExtendsResult.IsExtendsTrueLike(Extends({}, type, extends_)))
|
|
13
13
|
return;
|
|
14
|
-
const cause = { parameter: name,
|
|
14
|
+
const cause = { parameter: name, expect: extends_, actual: type };
|
|
15
15
|
// @ts-ignore - no definition for { cause } options
|
|
16
|
-
throw new Error(
|
|
16
|
+
throw new Error(`Argument for parameter ${name} does not satisfy constraint`, { cause });
|
|
17
17
|
}
|
|
18
18
|
function BindArgument(context, state, name, extends_, type) {
|
|
19
19
|
const instantiatedArgument = InstantiateType(context, state, type);
|