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.
@@ -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<Types extends TSchema[], Result extends TSchema[][] = [[]]> = (Types extends [infer Left extends TSchema, ...infer Right extends TSchema[]] ? TDistribute<Right, TCross<Result, TExpand<Left>>> : Result);
8
- export type TDistributeArguments<Arguments extends TSchema[], Expression extends TSchema, Result extends TSchema[][] = Expression extends TDeferred<'Conditional', TSchema[]> ? TDistribute<Arguments> : [Arguments]> = Result;
9
- export declare function DistributedArguments<Arguments extends TSchema[], Expression extends TSchema>(arguments_: [...Arguments], expression: Expression): TDistributeArguments<Arguments, Expression>;
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(types) {
19
- return types.reduce((result, type) => {
20
- return Cross(result, Expand(type));
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 DistributedArguments(arguments_, expression) {
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(arguments_)
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 { DistributedArguments } from './distribute-arguments.mjs';
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 = DistributedArguments(arguments_, expression);
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, extends: extends_, received: type };
14
+ const cause = { parameter: name, expect: extends_, actual: type };
15
15
  // @ts-ignore - no definition for { cause } options
16
- throw new Error('Generic argument does not satify constraint', { cause });
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);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "typebox",
3
3
  "description": "Json Schema Type Builder with Static Type Resolution for TypeScript",
4
- "version": "1.1.8",
4
+ "version": "1.1.9",
5
5
  "keywords": [
6
6
  "typescript",
7
7
  "jsonschema"