typebox 1.1.38 → 1.2.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 (104) hide show
  1. package/build/guard/guard.d.mts +2 -2
  2. package/build/guard/guard.mjs +2 -2
  3. package/build/type/action/index.d.mts +1 -1
  4. package/build/type/action/index.mjs +1 -1
  5. package/build/type/action/with.d.mts +21 -0
  6. package/build/type/action/with.mjs +19 -0
  7. package/build/type/engine/enum/index.d.mts +0 -1
  8. package/build/type/engine/enum/index.mjs +0 -1
  9. package/build/type/engine/evaluate/evaluate.d.mts +15 -3
  10. package/build/type/engine/evaluate/evaluate.mjs +30 -6
  11. package/build/type/engine/exclude/operation.d.mts +5 -6
  12. package/build/type/engine/exclude/operation.mjs +11 -12
  13. package/build/type/engine/extract/operation.d.mts +5 -6
  14. package/build/type/engine/extract/operation.mjs +11 -12
  15. package/build/type/engine/index.d.mts +1 -1
  16. package/build/type/engine/index.mjs +1 -1
  17. package/build/type/engine/indexable/from_dependent.d.mts +5 -0
  18. package/build/type/engine/indexable/from_dependent.mjs +8 -0
  19. package/build/type/engine/indexable/from_enum.d.mts +3 -3
  20. package/build/type/engine/indexable/from_enum.mjs +4 -4
  21. package/build/type/engine/indexable/from_template_literal.d.mts +2 -2
  22. package/build/type/engine/indexable/from_template_literal.mjs +3 -3
  23. package/build/type/engine/indexable/from_type.d.mts +3 -1
  24. package/build/type/engine/indexable/from_type.mjs +9 -6
  25. package/build/type/engine/indexed/instantiate.d.mts +2 -1
  26. package/build/type/engine/indexed/instantiate.mjs +2 -1
  27. package/build/type/engine/instantiate.d.mts +7 -6
  28. package/build/type/engine/instantiate.mjs +23 -21
  29. package/build/type/engine/intrinsics/from_template_literal.d.mts +2 -2
  30. package/build/type/engine/intrinsics/from_template_literal.mjs +3 -3
  31. package/build/type/engine/keyof/instantiate.d.mts +2 -1
  32. package/build/type/engine/keyof/instantiate.mjs +2 -1
  33. package/build/type/engine/mapped/mapped_operation.d.mts +4 -4
  34. package/build/type/engine/mapped/mapped_operation.mjs +3 -3
  35. package/build/type/engine/mapped/mapped_variants.d.mts +5 -4
  36. package/build/type/engine/mapped/mapped_variants.mjs +10 -5
  37. package/build/type/engine/object/from_dependent.d.mts +5 -0
  38. package/build/type/engine/object/from_dependent.mjs +8 -0
  39. package/build/type/engine/object/from_type.d.mts +3 -1
  40. package/build/type/engine/object/from_type.mjs +8 -5
  41. package/build/type/engine/partial/from_dependent.d.mts +5 -0
  42. package/build/type/engine/partial/from_dependent.mjs +8 -0
  43. package/build/type/engine/partial/from_intersect.d.mts +1 -1
  44. package/build/type/engine/partial/from_intersect.mjs +3 -2
  45. package/build/type/engine/partial/from_type.d.mts +3 -1
  46. package/build/type/engine/partial/from_type.mjs +7 -4
  47. package/build/type/engine/readonly_object/from_dependent.d.mts +5 -0
  48. package/build/type/engine/readonly_object/from_dependent.mjs +8 -0
  49. package/build/type/engine/readonly_object/from_intersect.d.mts +1 -1
  50. package/build/type/engine/readonly_object/from_intersect.mjs +3 -2
  51. package/build/type/engine/readonly_object/from_type.d.mts +3 -1
  52. package/build/type/engine/readonly_object/from_type.mjs +8 -5
  53. package/build/type/engine/record/from_key_enum.d.mts +2 -2
  54. package/build/type/engine/record/from_key_enum.mjs +2 -2
  55. package/build/type/engine/record/from_key_template_literal.d.mts +2 -2
  56. package/build/type/engine/record/from_key_template_literal.mjs +2 -2
  57. package/build/type/engine/required/from_dependent.d.mts +5 -0
  58. package/build/type/engine/required/from_dependent.mjs +8 -0
  59. package/build/type/engine/required/from_intersect.d.mts +1 -1
  60. package/build/type/engine/required/from_intersect.mjs +3 -2
  61. package/build/type/engine/required/from_type.d.mts +3 -1
  62. package/build/type/engine/required/from_type.mjs +7 -4
  63. package/build/type/engine/template_literal/encode.d.mts +2 -2
  64. package/build/type/engine/template_literal/encode.mjs +4 -4
  65. package/build/type/engine/with/instantiate.d.mts +8 -0
  66. package/build/type/engine/{options → with}/instantiate.mjs +5 -5
  67. package/build/type/extends/dependent.d.mts +6 -0
  68. package/build/type/extends/dependent.mjs +6 -0
  69. package/build/type/extends/enum.d.mts +4 -4
  70. package/build/type/extends/enum.mjs +3 -2
  71. package/build/type/extends/extends_left.d.mts +3 -1
  72. package/build/type/extends/extends_left.mjs +23 -20
  73. package/build/type/extends/extends_right.d.mts +7 -5
  74. package/build/type/extends/extends_right.mjs +18 -13
  75. package/build/type/extends/template_literal.d.mts +3 -3
  76. package/build/type/extends/template_literal.mjs +3 -3
  77. package/build/type/script/mapping.d.mts +7 -7
  78. package/build/type/script/mapping.mjs +30 -23
  79. package/build/type/script/parser.d.mts +6 -4
  80. package/build/type/script/parser.mjs +4 -3
  81. package/build/type/types/dependent.d.mts +17 -0
  82. package/build/type/types/dependent.mjs +24 -0
  83. package/build/type/types/enum.d.mts +1 -1
  84. package/build/type/types/index.d.mts +1 -0
  85. package/build/type/types/index.mjs +1 -0
  86. package/build/type/types/static.d.mts +2 -1
  87. package/build/typebox.d.mts +2 -1
  88. package/build/typebox.mjs +2 -1
  89. package/build/value/clean/from_intersect.mjs +2 -2
  90. package/build/value/clone/clone.mjs +17 -3
  91. package/build/value/convert/from_enum.mjs +3 -4
  92. package/build/value/convert/from_template_literal.d.mts +1 -1
  93. package/build/value/convert/from_template_literal.mjs +2 -3
  94. package/build/value/create/from_enum.mjs +2 -2
  95. package/build/value/repair/from_enum.mjs +2 -3
  96. package/package.json +29 -29
  97. package/readme.md +51 -20
  98. package/build/type/action/options.d.mts +0 -11
  99. package/build/type/action/options.mjs +0 -11
  100. package/build/type/engine/enum/enum_to_union.d.mts +0 -14
  101. package/build/type/engine/enum/enum_to_union.mjs +0 -24
  102. package/build/type/engine/options/instantiate.d.mts +0 -8
  103. /package/build/type/engine/{options → with}/index.d.mts +0 -0
  104. /package/build/type/engine/{options → with}/index.mjs +0 -0
@@ -1,17 +1,20 @@
1
1
  // deno-lint-ignore-file ban-types
2
2
  // deno-fmt-ignore-file
3
3
  import { IsCyclic } from '../../types/cyclic.mjs';
4
+ import { IsDependent } from '../../types/dependent.mjs';
4
5
  import { IsIntersect } from '../../types/intersect.mjs';
5
6
  import { Object, IsObject } from '../../types/object.mjs';
6
7
  import { IsUnion } from '../../types/union.mjs';
7
8
  import { FromCyclic } from './from_cyclic.mjs';
9
+ import { FromDependent } from './from_dependent.mjs';
8
10
  import { FromIntersect } from './from_intersect.mjs';
9
11
  import { FromUnion } from './from_union.mjs';
10
12
  import { FromObject } from './from_object.mjs';
11
13
  export function FromType(type) {
12
14
  return (IsCyclic(type) ? FromCyclic(type.$defs, type.$ref) :
13
- IsIntersect(type) ? FromIntersect(type.allOf) :
14
- IsUnion(type) ? FromUnion(type.anyOf) :
15
- IsObject(type) ? FromObject(type.properties) :
16
- Object({}));
15
+ IsDependent(type) ? FromDependent(type.if, type.then, type.else) :
16
+ IsIntersect(type) ? FromIntersect(type.allOf) :
17
+ IsUnion(type) ? FromUnion(type.anyOf) :
18
+ IsObject(type) ? FromObject(type.properties) :
19
+ Object({}));
17
20
  }
@@ -9,7 +9,7 @@ import { type TNumber, NumberPattern } from '../../types/number.mjs';
9
9
  import { type TInteger, IntegerPattern } from '../../types/integer.mjs';
10
10
  import { type TBoolean } from '../../types/boolean.mjs';
11
11
  import { NeverPattern } from '../../types/never.mjs';
12
- import { type TEnumValuesToVariants } from '../enum/enum_to_union.mjs';
12
+ import { type TEvaluateEnum } from '../evaluate/evaluate.mjs';
13
13
  import { type TTemplateLiteralAction } from './instantiate.mjs';
14
14
  type TJoinString<Input extends string[], Result extends string = ''> = (Input extends [infer Left extends string, ...infer Right extends string[]] ? Result extends '' ? TJoinString<Right, Left> : TJoinString<Right, `${Result}|${Left}`> : Result);
15
15
  type TUnwrapTemplateLiteralPattern<Pattern extends string> = (Pattern extends `^${infer Pattern extends string}$` ? Pattern : never);
@@ -21,7 +21,7 @@ type TEncodeBoolean<Right extends TSchema[], Pattern extends string> = (TEncodeT
21
21
  type TEncodeString<Right extends TSchema[], Pattern extends string> = (TEncodeTypes<Right, `${Pattern}${typeof StringPattern}`>);
22
22
  type TEncodeTemplateLiteral<TemplatePattern extends string, Right extends TSchema[], Pattern extends string> = (TEncodeTypes<Right, `${Pattern}${TUnwrapTemplateLiteralPattern<TemplatePattern>}`>);
23
23
  type TEncodeTemplateLiteralDeferred<Types extends TSchema[], Right extends TSchema[], Pattern extends string, TemplateLiteral extends TSchema = TTemplateLiteralAction<Types>, Result extends TSchema = TEncodeType<TemplateLiteral, Right, Pattern>> = Result;
24
- type TEncodeEnum<Types extends TEnumValue[], Right extends TSchema[], Pattern extends string, Variants extends TSchema[] = TEnumValuesToVariants<Types>> = TEncodeUnion<Variants, Right, Pattern>;
24
+ type TEncodeEnum<Values extends TEnumValue[], Right extends TSchema[], Pattern extends string, Evaluated extends TSchema = TEvaluateEnum<Values>> = TEncodeType<Evaluated, Right, Pattern>;
25
25
  type TEncodeUnion<Types extends TSchema[], Right extends TSchema[], Pattern extends string, Result extends string[] = []> = Types extends [infer Head extends TSchema, ...infer Tail extends TSchema[]] ? TEncodeUnion<Tail, Right, Pattern, [...Result, TEncodeType<Head, [], ''>]> : TEncodeTypes<Right, `${Pattern}(${TJoinString<Result>})`>;
26
26
  type TEncodeType<Type extends TSchema, Right extends TSchema[], Pattern extends string> = (Type extends TEnum<infer Values extends TEnumValue[]> ? TEncodeEnum<Values, Right, Pattern> : Type extends TInteger ? TEncodeInteger<Right, Pattern> : Type extends TLiteral<infer Value extends TLiteralValue> ? TEncodeLiteral<Value, Right, Pattern> : Type extends TBigInt ? TEncodeBigInt<Right, Pattern> : Type extends TBoolean ? TEncodeBoolean<Right, Pattern> : Type extends TNumber ? TEncodeNumber<Right, Pattern> : Type extends TString ? TEncodeString<Right, Pattern> : Type extends TTemplateLiteral<infer TemplatePattern extends string> ? TEncodeTemplateLiteral<TemplatePattern, Right, Pattern> : Type extends TTemplateLiteralDeferred<infer Types extends TSchema[]> ? TEncodeTemplateLiteralDeferred<Types, Right, Pattern> : Type extends TUnion<infer Types extends TSchema[]> ? TEncodeUnion<Types, Right, Pattern> : typeof NeverPattern);
27
27
  type TEncodeTypes<Types extends TSchema[], Pattern extends string> = (Types extends [infer Left extends TSchema, ...infer Right extends TSchema[]] ? TEncodeType<Left, Right, Pattern> : Pattern);
@@ -11,7 +11,7 @@ import { IsInteger, IntegerPattern } from '../../types/integer.mjs';
11
11
  import { IsBoolean } from '../../types/boolean.mjs';
12
12
  import { NeverPattern } from '../../types/never.mjs';
13
13
  import { TemplateLiteralCreate } from './create.mjs';
14
- import { EnumValuesToVariants } from '../enum/enum_to_union.mjs';
14
+ import { EvaluateEnum } from '../evaluate/evaluate.mjs';
15
15
  import { TemplateLiteralAction } from './instantiate.mjs';
16
16
  function JoinString(input) {
17
17
  return input.join('|');
@@ -45,9 +45,9 @@ function EncodeTemplateLiteralDeferred(types, right, pattern) {
45
45
  const result = EncodeType(templateLiteral, right, pattern);
46
46
  return result;
47
47
  }
48
- function EncodeEnum(types, right, pattern) {
49
- const variants = EnumValuesToVariants(types);
50
- return EncodeUnion(variants, right, pattern);
48
+ function EncodeEnum(values, right, pattern) {
49
+ const evaluated = EvaluateEnum(values);
50
+ return EncodeType(evaluated, right, pattern);
51
51
  }
52
52
  function EncodeUnion(types, right, pattern, result = []) {
53
53
  return Guard.TakeLeft(types, (head, tail) => EncodeUnion(tail, right, pattern, [...result, EncodeType(head, [], '')]), () => EncodeTypes(right, `${pattern}(${JoinString(result)})`));
@@ -0,0 +1,8 @@
1
+ import { type TProperties } from '../../types/properties.mjs';
2
+ import { type TSchema } from '../../types/schema.mjs';
3
+ import { type TState, type TInstantiateType, type TCanInstantiate } from '../instantiate.mjs';
4
+ import { type TWithDeferred, type TWith } from '../../action/with.mjs';
5
+ export type TWithAction<Type extends TSchema, Options extends TSchema, Result extends TSchema = TCanInstantiate<[Type]> extends true ? TWith<Type, Options> : TWithDeferred<Type, Options>> = Result;
6
+ export declare function WithAction<Type extends TSchema, Options extends TSchema>(type: Type, options: Options): TWithAction<Type, Options>;
7
+ export type TWithInstantiate<Context extends TProperties, State extends TState, Type extends TSchema, Options extends TSchema, InstantiatedType extends TSchema = TInstantiateType<Context, State, Type>> = TWithAction<InstantiatedType, Options>;
8
+ export declare function WithInstantiate<Context extends TProperties, State extends TState, Type extends TSchema, Options extends TSchema>(context: Context, state: State, type: Type, options: Options): TWithInstantiate<Context, State, Type, Options>;
@@ -1,14 +1,14 @@
1
1
  // deno-fmt-ignore-file
2
2
  import { Memory } from '../../../system/memory/index.mjs';
3
3
  import { InstantiateType, CanInstantiate } from '../instantiate.mjs';
4
- import { OptionsDeferred } from '../../action/options.mjs';
5
- export function OptionsAction(type, options) {
4
+ import { WithDeferred } from '../../action/with.mjs';
5
+ export function WithAction(type, options) {
6
6
  const result = CanInstantiate([type])
7
7
  ? Memory.Update(type, {}, options)
8
- : OptionsDeferred(type, options);
8
+ : WithDeferred(type, options);
9
9
  return result;
10
10
  }
11
- export function OptionsInstantiate(context, state, type, options) {
11
+ export function WithInstantiate(context, state, type, options) {
12
12
  const instaniatedType = InstantiateType(context, state, type);
13
- return OptionsAction(instaniatedType, options);
13
+ return WithAction(instaniatedType, options);
14
14
  }
@@ -0,0 +1,6 @@
1
+ import { type TProperties } from '../types/properties.mjs';
2
+ import { type TSchema } from '../types/schema.mjs';
3
+ import { type TExtendsLeft } from './extends_left.mjs';
4
+ import * as Result from './result.mjs';
5
+ export type TExtendsDependent<Inferred extends TProperties, If extends TSchema, Then extends TSchema, Else extends TSchema, Right extends TSchema> = (TExtendsLeft<Inferred, If, Right> extends Result.TExtendsTrueLike<infer Inferred extends TProperties> ? TExtendsLeft<Inferred, Then, Right> : TExtendsLeft<Inferred, Else, Right>);
6
+ export declare function ExtendsDependent<Inferred extends TProperties, If extends TSchema, Then extends TSchema, Else extends TSchema, Right extends TSchema>(inferred: Inferred, if_: If, then_: Then, else_: Else, right: Right): TExtendsDependent<Inferred, If, Then, Else, Right>;
@@ -0,0 +1,6 @@
1
+ // deno-fmt-ignore-file
2
+ import { ExtendsLeft } from './extends_left.mjs';
3
+ import * as Result from './result.mjs';
4
+ export function ExtendsDependent(inferred, if_, then_, else_, right) {
5
+ return Result.Match(ExtendsLeft(inferred, if_, right), () => ExtendsLeft(inferred, then_, right), () => ExtendsLeft(inferred, else_, right));
6
+ }
@@ -1,7 +1,7 @@
1
1
  import { type TSchema } from '../types/schema.mjs';
2
2
  import { type TProperties } from '../types/properties.mjs';
3
- import { type TEnum } from '../types/enum.mjs';
3
+ import { type TEnumValue } from '../types/enum.mjs';
4
4
  import { type TExtendsLeft } from './extends_left.mjs';
5
- import { type TEnumToUnion } from '../engine/enum/index.mjs';
6
- export type TExtendsEnum<Inferred extends TProperties, Left extends TEnum, Right extends TSchema> = (TExtendsLeft<Inferred, TEnumToUnion<Left>, Right>);
7
- export declare function ExtendsEnum<Inferred extends TProperties, Left extends TEnum, Right extends TSchema>(inferred: Inferred, left: Left, right: Right): TExtendsEnum<Inferred, Left, Right>;
5
+ import { type TEvaluateEnum } from '../engine/evaluate/evaluate.mjs';
6
+ export type TExtendsEnum<Inferred extends TProperties, Left extends TEnumValue[], Right extends TSchema, Evaluated extends TSchema = TEvaluateEnum<Left>> = TExtendsLeft<Inferred, Evaluated, Right>;
7
+ export declare function ExtendsEnum<Inferred extends TProperties, Left extends TEnumValue[], Right extends TSchema>(inferred: Inferred, left: Left, right: Right): TExtendsEnum<Inferred, Left, Right>;
@@ -1,6 +1,7 @@
1
1
  // deno-fmt-ignore-file
2
2
  import { ExtendsLeft } from './extends_left.mjs';
3
- import { EnumToUnion } from '../engine/enum/index.mjs';
3
+ import { EvaluateEnum } from '../engine/evaluate/evaluate.mjs';
4
4
  export function ExtendsEnum(inferred, left, right) {
5
- return ExtendsLeft(inferred, EnumToUnion(left), right);
5
+ const evaluated = EvaluateEnum(left);
6
+ return ExtendsLeft(inferred, evaluated, right);
6
7
  }
@@ -4,6 +4,7 @@ import { type TExtendsAsyncIterator } from './async_iterator.mjs';
4
4
  import { type TExtendsBigInt } from './bigint.mjs';
5
5
  import { type TExtendsBoolean } from './boolean.mjs';
6
6
  import { type TExtendsConstructor } from './constructor.mjs';
7
+ import { type TExtendsDependent } from './dependent.mjs';
7
8
  import { type TExtendsEnum } from './enum.mjs';
8
9
  import { type TExtendsFunction } from './function.mjs';
9
10
  import { type TExtendsInteger } from './integer.mjs';
@@ -29,6 +30,7 @@ import { type TAsyncIterator } from '../types/async_iterator.mjs';
29
30
  import { type TBigInt } from '../types/bigint.mjs';
30
31
  import { type TBoolean } from '../types/boolean.mjs';
31
32
  import { type TConstructor } from '../types/constructor.mjs';
33
+ import { type TDependent } from '../types/dependent.mjs';
32
34
  import { type TEnum, type TEnumValue } from '../types/enum.mjs';
33
35
  import { type TFunction } from '../types/function.mjs';
34
36
  import { type TInteger } from '../types/integer.mjs';
@@ -51,5 +53,5 @@ import { type TProperties } from '../types/properties.mjs';
51
53
  import { type TUnion } from '../types/union.mjs';
52
54
  import { type TVoid } from '../types/void.mjs';
53
55
  import * as Result from './result.mjs';
54
- export type TExtendsLeft<Inferred extends TProperties, Left extends TSchema, Right extends TSchema> = (Left extends TAny ? TExtendsAny<Inferred, Left, Right> : Left extends TArray<infer Items extends TSchema> ? TExtendsArray<Inferred, Left, Items, Right> : Left extends TAsyncIterator<infer Type extends TSchema> ? TExtendsAsyncIterator<Inferred, Type, Right> : Left extends TBigInt ? TExtendsBigInt<Inferred, Left, Right> : Left extends TBoolean ? TExtendsBoolean<Inferred, Left, Right> : Left extends TConstructor<infer Parameters extends TSchema[], infer InstanceType extends TSchema> ? TExtendsConstructor<Inferred, Parameters, InstanceType, Right> : Left extends TEnum<infer Values extends TEnumValue[]> ? TExtendsEnum<Inferred, TEnum<Values>, Right> : Left extends TFunction<infer Parameters extends TSchema[], infer ReturnType extends TSchema> ? TExtendsFunction<Inferred, Parameters, ReturnType, Right> : Left extends TInteger ? TExtendsInteger<Inferred, Left, Right> : Left extends TIntersect<infer Types extends TSchema[]> ? TExtendsIntersect<Inferred, Types, Right> : Left extends TIterator<infer Type extends TSchema> ? TExtendsIterator<Inferred, Type, Right> : Left extends TLiteral ? TExtendsLiteral<Inferred, Left, Right> : Left extends TNever ? TExtendsNever<Inferred, Left, Right> : Left extends TNull ? TExtendsNull<Inferred, Left, Right> : Left extends TNumber ? TExtendsNumber<Inferred, Left, Right> : Left extends TObject<infer Properties extends TProperties> ? TExtendsObject<Inferred, Properties, Right> : Left extends TPromise<infer Type extends TSchema> ? TExtendsPromise<Inferred, Type, Right> : Left extends TString ? TExtendsString<Inferred, Left, Right> : Left extends TSymbol ? TExtendsSymbol<Inferred, Left, Right> : Left extends TTemplateLiteral<infer Pattern extends string> ? TExtendsTemplateLiteral<Inferred, Pattern, Right> : Left extends TTuple<infer Types extends TSchema[]> ? TExtendsTuple<Inferred, Types, Right> : Left extends TUndefined ? TExtendsUndefined<Inferred, Left, Right> : Left extends TUnion<infer Types extends TSchema[]> ? TExtendsUnion<Inferred, Types, Right> : Left extends TUnknown ? TExtendsUnknown<Inferred, Left, Right> : Left extends TVoid ? TExtendsVoid<Inferred, Left, Right> : Result.TExtendsFalse);
56
+ export type TExtendsLeft<Inferred extends TProperties, Left extends TSchema, Right extends TSchema> = (Left extends TAny ? TExtendsAny<Inferred, Left, Right> : Left extends TArray<infer Items extends TSchema> ? TExtendsArray<Inferred, Left, Items, Right> : Left extends TAsyncIterator<infer Type extends TSchema> ? TExtendsAsyncIterator<Inferred, Type, Right> : Left extends TBigInt ? TExtendsBigInt<Inferred, Left, Right> : Left extends TBoolean ? TExtendsBoolean<Inferred, Left, Right> : Left extends TConstructor<infer Parameters extends TSchema[], infer InstanceType extends TSchema> ? TExtendsConstructor<Inferred, Parameters, InstanceType, Right> : Left extends TDependent<infer If extends TSchema, infer Then extends TSchema, infer Else extends TSchema> ? TExtendsDependent<Inferred, If, Then, Else, Right> : Left extends TEnum<infer Values extends TEnumValue[]> ? TExtendsEnum<Inferred, Values, Right> : Left extends TFunction<infer Parameters extends TSchema[], infer ReturnType extends TSchema> ? TExtendsFunction<Inferred, Parameters, ReturnType, Right> : Left extends TInteger ? TExtendsInteger<Inferred, Left, Right> : Left extends TIntersect<infer Types extends TSchema[]> ? TExtendsIntersect<Inferred, Types, Right> : Left extends TIterator<infer Type extends TSchema> ? TExtendsIterator<Inferred, Type, Right> : Left extends TLiteral ? TExtendsLiteral<Inferred, Left, Right> : Left extends TNever ? TExtendsNever<Inferred, Left, Right> : Left extends TNull ? TExtendsNull<Inferred, Left, Right> : Left extends TNumber ? TExtendsNumber<Inferred, Left, Right> : Left extends TObject<infer Properties extends TProperties> ? TExtendsObject<Inferred, Properties, Right> : Left extends TPromise<infer Type extends TSchema> ? TExtendsPromise<Inferred, Type, Right> : Left extends TString ? TExtendsString<Inferred, Left, Right> : Left extends TSymbol ? TExtendsSymbol<Inferred, Left, Right> : Left extends TTemplateLiteral<infer Pattern extends string> ? TExtendsTemplateLiteral<Inferred, Pattern, Right> : Left extends TTuple<infer Types extends TSchema[]> ? TExtendsTuple<Inferred, Types, Right> : Left extends TUndefined ? TExtendsUndefined<Inferred, Left, Right> : Left extends TUnion<infer Types extends TSchema[]> ? TExtendsUnion<Inferred, Types, Right> : Left extends TUnknown ? TExtendsUnknown<Inferred, Left, Right> : Left extends TVoid ? TExtendsVoid<Inferred, Left, Right> : Result.TExtendsFalse);
55
57
  export declare function ExtendsLeft<Inferred extends TProperties, Left extends TSchema, Right extends TSchema>(inferred: Inferred, left: Left, right: Right): TExtendsLeft<Inferred, Left, Right>;
@@ -5,6 +5,7 @@ import { ExtendsAsyncIterator } from './async_iterator.mjs';
5
5
  import { ExtendsBigInt } from './bigint.mjs';
6
6
  import { ExtendsBoolean } from './boolean.mjs';
7
7
  import { ExtendsConstructor } from './constructor.mjs';
8
+ import { ExtendsDependent } from './dependent.mjs';
8
9
  import { ExtendsEnum } from './enum.mjs';
9
10
  import { ExtendsFunction } from './function.mjs';
10
11
  import { ExtendsInteger } from './integer.mjs';
@@ -33,6 +34,7 @@ import { IsAsyncIterator } from '../types/async_iterator.mjs';
33
34
  import { IsBigInt } from '../types/bigint.mjs';
34
35
  import { IsBoolean } from '../types/boolean.mjs';
35
36
  import { IsConstructor } from '../types/constructor.mjs';
37
+ import { IsDependent } from '../types/dependent.mjs';
36
38
  import { IsEnum } from '../types/enum.mjs';
37
39
  import { IsFunction } from '../types/function.mjs';
38
40
  import { IsInteger } from '../types/integer.mjs';
@@ -60,24 +62,25 @@ export function ExtendsLeft(inferred, left, right) {
60
62
  IsBigInt(left) ? ExtendsBigInt(inferred, left, right) :
61
63
  IsBoolean(left) ? ExtendsBoolean(inferred, left, right) :
62
64
  IsConstructor(left) ? ExtendsConstructor(inferred, left.parameters, left.instanceType, right) :
63
- IsEnum(left) ? ExtendsEnum(inferred, left, right) :
64
- IsFunction(left) ? ExtendsFunction(inferred, left.parameters, left.returnType, right) :
65
- IsInteger(left) ? ExtendsInteger(inferred, left, right) :
66
- IsIntersect(left) ? ExtendsIntersect(inferred, left.allOf, right) :
67
- IsIterator(left) ? ExtendsIterator(inferred, left.iteratorItems, right) :
68
- IsLiteral(left) ? ExtendsLiteral(inferred, left, right) :
69
- IsNever(left) ? ExtendsNever(inferred, left, right) :
70
- IsNull(left) ? ExtendsNull(inferred, left, right) :
71
- IsNumber(left) ? ExtendsNumber(inferred, left, right) :
72
- IsObject(left) ? ExtendsObject(inferred, left.properties, right) :
73
- IsPromise(left) ? ExtendsPromise(inferred, left.item, right) :
74
- IsString(left) ? ExtendsString(inferred, left, right) :
75
- IsSymbol(left) ? ExtendsSymbol(inferred, left, right) :
76
- IsTemplateLiteral(left) ? ExtendsTemplateLiteral(inferred, left.pattern, right) :
77
- IsTuple(left) ? ExtendsTuple(inferred, left.items, right) :
78
- IsUndefined(left) ? ExtendsUndefined(inferred, left, right) :
79
- IsUnion(left) ? ExtendsUnion(inferred, left.anyOf, right) :
80
- IsUnknown(left) ? ExtendsUnknown(inferred, left, right) :
81
- IsVoid(left) ? ExtendsVoid(inferred, left, right) :
82
- Result.ExtendsFalse());
65
+ IsDependent(left) ? ExtendsDependent(inferred, left.if, left.then, left.else, right) :
66
+ IsEnum(left) ? ExtendsEnum(inferred, left.enum, right) :
67
+ IsFunction(left) ? ExtendsFunction(inferred, left.parameters, left.returnType, right) :
68
+ IsInteger(left) ? ExtendsInteger(inferred, left, right) :
69
+ IsIntersect(left) ? ExtendsIntersect(inferred, left.allOf, right) :
70
+ IsIterator(left) ? ExtendsIterator(inferred, left.iteratorItems, right) :
71
+ IsLiteral(left) ? ExtendsLiteral(inferred, left, right) :
72
+ IsNever(left) ? ExtendsNever(inferred, left, right) :
73
+ IsNull(left) ? ExtendsNull(inferred, left, right) :
74
+ IsNumber(left) ? ExtendsNumber(inferred, left, right) :
75
+ IsObject(left) ? ExtendsObject(inferred, left.properties, right) :
76
+ IsPromise(left) ? ExtendsPromise(inferred, left.item, right) :
77
+ IsString(left) ? ExtendsString(inferred, left, right) :
78
+ IsSymbol(left) ? ExtendsSymbol(inferred, left, right) :
79
+ IsTemplateLiteral(left) ? ExtendsTemplateLiteral(inferred, left.pattern, right) :
80
+ IsTuple(left) ? ExtendsTuple(inferred, left.items, right) :
81
+ IsUndefined(left) ? ExtendsUndefined(inferred, left, right) :
82
+ IsUnion(left) ? ExtendsUnion(inferred, left.anyOf, right) :
83
+ IsUnknown(left) ? ExtendsUnknown(inferred, left, right) :
84
+ IsVoid(left) ? ExtendsVoid(inferred, left, right) :
85
+ Result.ExtendsFalse());
83
86
  }
@@ -2,6 +2,7 @@ import { Memory } from '../../system/memory/index.mjs';
2
2
  import { type TSchema } from '../types/schema.mjs';
3
3
  import { type TProperties } from '../types/properties.mjs';
4
4
  import { type TAny } from '../types/any.mjs';
5
+ import { type TDependent } from '../types/dependent.mjs';
5
6
  import { type TEnum, type TEnumValue } from '../types/enum.mjs';
6
7
  import { type TInfer } from '../types/infer.mjs';
7
8
  import { type TIntersect } from '../types/intersect.mjs';
@@ -10,16 +11,17 @@ import { type TUnion } from '../types/union.mjs';
10
11
  import { type TUnknown } from '../types/unknown.mjs';
11
12
  import { type TExtendsLeft } from './extends_left.mjs';
12
13
  import * as Result from './result.mjs';
13
- import { type TTemplateLiteralDecode } from '../engine/template_literal/decode.mjs';
14
- import { type TEnumValuesToUnion } from '../engine/enum/index.mjs';
14
+ import { type TEvaluateEnum } from '../engine/evaluate/evaluate.mjs';
15
+ import { type TEvaluateTemplateLiteral } from '../engine/evaluate/evaluate.mjs';
15
16
  type TExtendsRightInfer<Inferred extends TProperties, Name extends string, Left extends TSchema, Right extends TSchema, Result extends Result.TResult = (TExtendsLeft<Inferred, Left, Right> extends Result.TExtendsTrueLike<infer CheckInferred extends TProperties> ? Result.TExtendsTrue<Memory.TAssign<Memory.TAssign<Inferred, CheckInferred>, {
16
17
  [_ in Name]: Left;
17
18
  }>> : Result.TExtendsFalse)> = Result;
18
19
  type TExtendsRightAny<Inferred extends TProperties, _Left extends TSchema, Result extends Result.TResult = Result.TExtendsTrue<Inferred>> = Result;
19
- type TExtendsRightEnum<Inferred extends TProperties, Left extends TSchema, Right extends TEnumValue[], Union extends TSchema = TEnumValuesToUnion<Right>> = TExtendsLeft<Inferred, Left, Union>;
20
+ type TExtendsRightDependent<Inferred extends TProperties, Left extends TSchema, If extends TSchema, Then extends TSchema, Else extends TSchema, Result extends Result.TResult = TExtendsLeft<Inferred, Left, If> extends Result.TExtendsTrueLike<infer Inferred extends TProperties> ? (TExtendsLeft<Inferred, Left, Then> extends Result.TExtendsTrueLike<infer Inferred extends TProperties> ? Result.TExtendsTrue<Inferred> : Result.TExtendsFalse) : (TExtendsLeft<Inferred, Left, Else> extends Result.TExtendsTrueLike<infer Inferred extends TProperties> ? Result.TExtendsTrue<Inferred> : Result.TExtendsFalse)> = Result;
21
+ type TExtendsRightEnum<Inferred extends TProperties, Left extends TSchema, Right extends TEnumValue[], Evaluated extends TSchema = TEvaluateEnum<Right>> = TExtendsLeft<Inferred, Left, Evaluated>;
20
22
  type TExtendsRightIntersect<Inferred extends TProperties, Left extends TSchema, Right extends TSchema[]> = (Right extends [infer Head extends TSchema, ...infer Tail extends TSchema[]] ? TExtendsLeft<Inferred, Left, Head> extends Result.TExtendsTrueLike<infer Inferred extends TProperties> ? TExtendsRightIntersect<Inferred, Left, Tail> : Result.TExtendsFalse : Result.TExtendsTrue<Inferred>);
21
- type TExtendsRightTemplateLiteral<Inferred extends TProperties, Left extends TSchema, Right extends string, Decoded extends TSchema = TTemplateLiteralDecode<Right>> = TExtendsLeft<Inferred, Left, Decoded>;
23
+ type TExtendsRightTemplateLiteral<Inferred extends TProperties, Left extends TSchema, Right extends string, Evaluated extends TSchema = TEvaluateTemplateLiteral<Right>> = TExtendsLeft<Inferred, Left, Evaluated>;
22
24
  type TExtendsRightUnion<Inferred extends TProperties, Left extends TSchema, Right extends TSchema[]> = (Right extends [infer Head extends TSchema, ...infer Tail extends TSchema[]] ? TExtendsLeft<Inferred, Left, Head> extends Result.TExtendsTrueLike<infer Inferred extends TProperties> ? Result.TExtendsTrue<Inferred> : TExtendsRightUnion<Inferred, Left, Tail> : Result.TExtendsFalse);
23
- export type TExtendsRight<Inferred extends TProperties, Left extends TSchema, Right extends TSchema> = (Right extends TAny ? TExtendsRightAny<Inferred, Left> : Right extends TEnum<infer Values extends TEnumValue[]> ? TExtendsRightEnum<Inferred, Left, Values> : Right extends TInfer<infer Name extends string, infer Type extends TSchema> ? TExtendsRightInfer<Inferred, Name, Left, Type> : Right extends TTemplateLiteral<infer Pattern extends string> ? TExtendsRightTemplateLiteral<Inferred, Left, Pattern> : Right extends TIntersect<infer Types extends TSchema[]> ? TExtendsRightIntersect<Inferred, Left, Types> : Right extends TUnion<infer Types extends TSchema[]> ? TExtendsRightUnion<Inferred, Left, Types> : Right extends TUnknown ? Result.TExtendsTrue<Inferred> : Result.TExtendsFalse);
25
+ export type TExtendsRight<Inferred extends TProperties, Left extends TSchema, Right extends TSchema> = (Right extends TAny ? TExtendsRightAny<Inferred, Left> : Right extends TDependent<infer If extends TSchema, infer Then extends TSchema, infer Else extends TSchema> ? TExtendsRightDependent<Inferred, Left, If, Then, Else> : Right extends TEnum<infer Values extends TEnumValue[]> ? TExtendsRightEnum<Inferred, Left, Values> : Right extends TInfer<infer Name extends string, infer Type extends TSchema> ? TExtendsRightInfer<Inferred, Name, Left, Type> : Right extends TTemplateLiteral<infer Pattern extends string> ? TExtendsRightTemplateLiteral<Inferred, Left, Pattern> : Right extends TIntersect<infer Types extends TSchema[]> ? TExtendsRightIntersect<Inferred, Left, Types> : Right extends TUnion<infer Types extends TSchema[]> ? TExtendsRightUnion<Inferred, Left, Types> : Right extends TUnknown ? Result.TExtendsTrue<Inferred> : Result.TExtendsFalse);
24
26
  export declare function ExtendsRight<Inferred extends TProperties, Left extends TSchema, Right extends TSchema>(inferred: Inferred, left: Left, right: Right): TExtendsRight<Inferred, Left, Right>;
25
27
  export {};
@@ -2,6 +2,7 @@
2
2
  import { Guard } from '../../guard/index.mjs';
3
3
  import { Memory } from '../../system/memory/index.mjs';
4
4
  import { IsAny } from '../types/any.mjs';
5
+ import { IsDependent } from '../types/dependent.mjs';
5
6
  import { IsEnum } from '../types/enum.mjs';
6
7
  import { IsInfer } from '../types/infer.mjs';
7
8
  import { IsIntersect } from '../types/intersect.mjs';
@@ -10,35 +11,39 @@ import { IsUnion } from '../types/union.mjs';
10
11
  import { IsUnknown } from '../types/unknown.mjs';
11
12
  import { ExtendsLeft } from './extends_left.mjs';
12
13
  import * as Result from './result.mjs';
13
- import { TemplateLiteralDecode } from '../engine/template_literal/decode.mjs';
14
- import { EnumValuesToUnion } from '../engine/enum/index.mjs';
14
+ import { EvaluateEnum } from '../engine/evaluate/evaluate.mjs';
15
+ import { EvaluateTemplateLiteral } from '../engine/evaluate/evaluate.mjs';
15
16
  function ExtendsRightInfer(inferred, name, left, right) {
16
17
  return Result.Match(ExtendsLeft(inferred, left, right), checkInferred => Result.ExtendsTrue(Memory.Assign(Memory.Assign(inferred, checkInferred), { [name]: left })), () => Result.ExtendsFalse());
17
18
  }
18
19
  function ExtendsRightAny(inferred, _left) {
19
20
  return Result.ExtendsTrue(inferred);
20
21
  }
22
+ function ExtendsRightDependent(inferred, left, if_, then_, else_) {
23
+ return Result.Match(ExtendsLeft(inferred, left, if_), inferred => Result.Match(ExtendsLeft(inferred, left, then_), inferred => Result.ExtendsTrue(inferred), () => Result.ExtendsFalse()), () => Result.Match(ExtendsLeft(inferred, left, else_), inferred => Result.ExtendsTrue(inferred), () => Result.ExtendsFalse()));
24
+ }
21
25
  function ExtendsRightEnum(inferred, left, right) {
22
- const union = EnumValuesToUnion(right);
23
- return ExtendsLeft(inferred, left, union);
26
+ const evaluated = EvaluateEnum(right);
27
+ return ExtendsLeft(inferred, left, evaluated);
24
28
  }
25
29
  function ExtendsRightIntersect(inferred, left, right) {
26
30
  return Guard.TakeLeft(right, (head, tail) => Result.Match(ExtendsLeft(inferred, left, head), inferred => ExtendsRightIntersect(inferred, left, tail), () => Result.ExtendsFalse()), () => Result.ExtendsTrue(inferred));
27
31
  }
28
32
  function ExtendsRightTemplateLiteral(inferred, left, right) {
29
- const decoded = TemplateLiteralDecode(right);
30
- return ExtendsLeft(inferred, left, decoded);
33
+ const evaluated = EvaluateTemplateLiteral(right);
34
+ return ExtendsLeft(inferred, left, evaluated);
31
35
  }
32
36
  function ExtendsRightUnion(inferred, left, right) {
33
37
  return Guard.TakeLeft(right, (head, tail) => Result.Match(ExtendsLeft(inferred, left, head), inferred => Result.ExtendsTrue(inferred), () => ExtendsRightUnion(inferred, left, tail)), () => Result.ExtendsFalse());
34
38
  }
35
39
  export function ExtendsRight(inferred, left, right) {
36
40
  return (IsAny(right) ? ExtendsRightAny(inferred, left) :
37
- IsEnum(right) ? ExtendsRightEnum(inferred, left, right.enum) :
38
- IsInfer(right) ? ExtendsRightInfer(inferred, right.name, left, right.extends) :
39
- IsIntersect(right) ? ExtendsRightIntersect(inferred, left, right.allOf) :
40
- IsTemplateLiteral(right) ? ExtendsRightTemplateLiteral(inferred, left, right.pattern) :
41
- IsUnion(right) ? ExtendsRightUnion(inferred, left, right.anyOf) :
42
- IsUnknown(right) ? Result.ExtendsTrue(inferred) :
43
- Result.ExtendsFalse());
41
+ IsDependent(right) ? ExtendsRightDependent(inferred, left, right.if, right.then, right.else) :
42
+ IsEnum(right) ? ExtendsRightEnum(inferred, left, right.enum) :
43
+ IsInfer(right) ? ExtendsRightInfer(inferred, right.name, left, right.extends) :
44
+ IsIntersect(right) ? ExtendsRightIntersect(inferred, left, right.allOf) :
45
+ IsTemplateLiteral(right) ? ExtendsRightTemplateLiteral(inferred, left, right.pattern) :
46
+ IsUnion(right) ? ExtendsRightUnion(inferred, left, right.anyOf) :
47
+ IsUnknown(right) ? Result.ExtendsTrue(inferred) :
48
+ Result.ExtendsFalse());
44
49
  }
@@ -1,6 +1,6 @@
1
1
  import { type TSchema } from '../types/schema.mjs';
2
2
  import { type TProperties } from '../types/properties.mjs';
3
3
  import { type TExtendsLeft } from './extends_left.mjs';
4
- import { type TTemplateLiteralDecode } from '../engine/template_literal/decode.mjs';
5
- export type TExtendsTemplateLiteral<Inferred extends TProperties, Left extends string, Right extends TSchema, Decoded extends TSchema = TTemplateLiteralDecode<Left>> = TExtendsLeft<Inferred, Decoded, Right>;
6
- export declare function ExtendsTemplateLiteral<Inferred extends TProperties, Left extends string, Right extends TSchema>(inferred: Inferred, left: Left, right: Right): TExtendsTemplateLiteral<Inferred, Left, Right>;
4
+ import { type TEvaluateTemplateLiteral } from '../engine/evaluate/evaluate.mjs';
5
+ export type TExtendsTemplateLiteral<Inferred extends TProperties, Pattern extends string, Right extends TSchema, Evaluated extends TSchema = TEvaluateTemplateLiteral<Pattern>> = TExtendsLeft<Inferred, Evaluated, Right>;
6
+ export declare function ExtendsTemplateLiteral<Inferred extends TProperties, Pattern extends string, Right extends TSchema>(inferred: Inferred, left: Pattern, right: Right): TExtendsTemplateLiteral<Inferred, Pattern, Right>;
@@ -1,7 +1,7 @@
1
1
  // deno-fmt-ignore-file
2
2
  import { ExtendsLeft } from './extends_left.mjs';
3
- import { TemplateLiteralDecode } from '../engine/template_literal/decode.mjs';
3
+ import { EvaluateTemplateLiteral } from '../engine/evaluate/evaluate.mjs';
4
4
  export function ExtendsTemplateLiteral(inferred, left, right) {
5
- const decoded = TemplateLiteralDecode(left);
6
- return ExtendsLeft(inferred, decoded, right);
5
+ const evaluated = EvaluateTemplateLiteral(left);
6
+ return ExtendsLeft(inferred, evaluated, right);
7
7
  }
@@ -52,9 +52,6 @@ type TIntrinsicOrCall<Target extends string, Parameters extends T.TSchema[]> = (
52
52
  ] extends ['Omit', [infer Type extends T.TSchema, infer Indexer extends T.TSchema]] ? C.TOmitDeferred<Type, Indexer> : [
53
53
  Target,
54
54
  Parameters
55
- ] extends ['Options', [infer Type extends T.TSchema, infer Options extends T.TSchema]] ? C.TOptionsDeferred<Type, Options> : [
56
- Target,
57
- Parameters
58
55
  ] extends ['Parameters', [infer Type extends T.TSchema]] ? C.TParametersDeferred<Type> : [
59
56
  Target,
60
57
  Parameters
@@ -164,10 +161,13 @@ export type TExtendsMapping<Input extends [unknown, unknown, unknown, unknown, u
164
161
  export declare function ExtendsMapping(input: [unknown, unknown, unknown, unknown, unknown, unknown] | []): unknown;
165
162
  export type TBaseMapping<Input extends [unknown, unknown, unknown] | unknown> = (Input extends ['(', infer Type extends T.TSchema, ')'] ? Type : Input extends infer Type extends T.TSchema ? Type : never);
166
163
  export declare function BaseMapping(input: [unknown, unknown, unknown] | unknown): unknown;
164
+ export type TWithMapping<Input extends [unknown, unknown] | []> = (Input extends ['with', infer JsonObject extends Record<PropertyKey, unknown>] ? JsonObject : []);
165
+ export declare function WithMapping(input: [unknown, unknown] | []): unknown;
167
166
  type TFactorIndexArray<Type extends T.TSchema, IndexArray extends unknown[]> = (IndexArray extends [infer Left extends T.TSchema[], ...infer Right extends unknown[]] ? (Left extends [infer Indexer extends T.TSchema] ? TFactorIndexArray<C.TIndexDeferred<Type, Indexer>, Right> : Left extends [] ? TFactorIndexArray<T.TArray<Type>, Right> : T.TNever) : Type);
168
167
  type TFactorExtends<Type extends T.TSchema, Extends extends unknown[]> = (Extends extends [infer Right extends T.TSchema, infer True extends T.TSchema, infer False extends T.TSchema] ? C.TConditionalDeferred<Type, Right, True, False> : Type);
169
- export type TFactorMapping<Input extends [unknown, unknown, unknown, unknown]> = (Input extends [infer KeyOf extends boolean, infer Type extends T.TSchema, infer IndexArray extends unknown[], infer Extend extends unknown[]] ? KeyOf extends true ? TFactorExtends<C.TKeyOfDeferred<TFactorIndexArray<Type, IndexArray>>, Extend> : TFactorExtends<TFactorIndexArray<Type, IndexArray>, Extend> : never);
170
- export declare function FactorMapping(input: [unknown, unknown, unknown, unknown]): unknown;
168
+ type TFactorWith<Type extends T.TSchema, With extends unknown> = (With extends Record<PropertyKey, unknown> ? C.TWithDeferred<Type, With> : Type);
169
+ export type TFactorMapping<Input extends [unknown, unknown, unknown, unknown, unknown]> = (Input extends [infer KeyOf extends boolean, infer Type extends T.TSchema, infer IndexArray extends unknown[], infer Extend extends unknown[], infer WithClause extends unknown] ? TFactorWith<KeyOf extends true ? TFactorExtends<C.TKeyOfDeferred<TFactorIndexArray<Type, IndexArray>>, Extend> : TFactorExtends<TFactorIndexArray<Type, IndexArray>, Extend>, WithClause> : never);
170
+ export declare function FactorMapping(input: [unknown, unknown, unknown, unknown, unknown]): unknown;
171
171
  type TExprBinaryMapping<Left extends T.TSchema, Rest extends unknown[]> = (Rest extends [infer Operator extends unknown, infer Right extends T.TSchema, infer Next extends unknown[]] ? (TExprBinaryMapping<Right, Next> extends infer Schema extends T.TSchema ? (Operator extends '&' ? (Schema extends T.TIntersect<infer Types extends T.TSchema[]> ? T.TIntersect<[Left, ...Types]> : T.TIntersect<[Left, Schema]>) : Operator extends '|' ? (Schema extends T.TUnion<infer Types extends T.TSchema[]> ? T.TUnion<[Left, ...Types]> : T.TUnion<[Left, Schema]>) : never) : never) : Left);
172
172
  export type TExprTermTailMapping<Input extends [unknown, unknown, unknown] | []> = (Input);
173
173
  export declare function ExprTermTailMapping(input: [unknown, unknown, unknown] | []): unknown;
@@ -276,10 +276,10 @@ export type TMappedAsMapping<Input extends [unknown, unknown] | []> = (Input ext
276
276
  export declare function MappedAsMapping(input: [unknown, unknown] | []): unknown;
277
277
  export type TMappedMapping<Input extends [unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown]> = (Input extends ['{', infer Readonly extends TModifierOperation, '[', infer Key extends string, 'in', infer Type extends T.TSchema, infer As extends T.TSchema[], ']', infer Optional extends TModifierOperation, ':', infer Property extends T.TSchema, null, '}'] ? (As extends [infer As extends T.TSchema] ? C.TMappedDeferred<T.TIdentifier<Key>, Type, As, TApplyReadonly<Readonly, TApplyOptional<Optional, Property>>> : C.TMappedDeferred<T.TIdentifier<Key>, Type, T.TRef<Key>, TApplyReadonly<Readonly, TApplyOptional<Optional, Property>>>) : never);
278
278
  export declare function MappedMapping(input: [unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown]): unknown;
279
+ export type TDependentMapping<Input extends [unknown, unknown, unknown, unknown, unknown, unknown] | [unknown, unknown, unknown, unknown]> = (Input extends ['if', infer If extends T.TSchema, 'then', infer Then extends T.TSchema, 'else', infer Else extends T.TSchema] ? T.TDependent<If, Then, Else> : Input extends ['if', infer If extends T.TSchema, 'then', infer Then extends T.TSchema] ? T.TDependent<If, Then, T.TUnknown> : never);
280
+ export declare function DependentMapping(input: [unknown, unknown, unknown, unknown, unknown, unknown] | [unknown, unknown, unknown, unknown]): unknown;
279
281
  export type TReferenceMapping<Input extends string, Result extends T.TSchema = T.TRef<Input>> = Result;
280
282
  export declare function ReferenceMapping(input: string): unknown;
281
- export type TOptionsMapping<Input extends [unknown, unknown, unknown, unknown, unknown, unknown]> = (Input extends ['Options', '<', infer Type extends T.TSchema, ',', infer Options extends T.TSchemaOptions, '>'] ? C.TOptionsDeferred<Type, Options> : never);
282
- export declare function OptionsMapping(input: [unknown, unknown, unknown, unknown, unknown, unknown]): unknown;
283
283
  export type TJsonNumberMapping<Input extends string> = (Input extends `${infer Value extends number}` ? Value : never);
284
284
  export declare function JsonNumberMapping(input: string): unknown;
285
285
  export type TJsonBooleanMapping<Input extends 'true' | 'false'> = (Input extends 'true' ? true : false);
@@ -23,18 +23,17 @@ function IntrinsicOrCall(ref, parameters) {
23
23
  Guard.IsEqual(ref, 'Lowercase') ? C.LowercaseDeferred(parameters[0]) :
24
24
  Guard.IsEqual(ref, 'NonNullable') ? C.NonNullableDeferred(parameters[0]) :
25
25
  Guard.IsEqual(ref, 'Omit') ? C.OmitDeferred(parameters[0], parameters[1]) :
26
- Guard.IsEqual(ref, 'Options') ? C.OptionsDeferred(parameters[0], parameters[1]) :
27
- Guard.IsEqual(ref, 'Parameters') ? C.ParametersDeferred(parameters[0]) :
28
- Guard.IsEqual(ref, 'Partial') ? C.PartialDeferred(parameters[0]) :
29
- Guard.IsEqual(ref, 'Pick') ? C.PickDeferred(parameters[0], parameters[1]) :
30
- Guard.IsEqual(ref, 'Readonly') ? C.ReadonlyObjectDeferred(parameters[0]) :
31
- Guard.IsEqual(ref, 'KeyOf') ? C.KeyOfDeferred(parameters[0]) :
32
- Guard.IsEqual(ref, 'Record') ? T.RecordDeferred(parameters[0], parameters[1]) :
33
- Guard.IsEqual(ref, 'Required') ? C.RequiredDeferred(parameters[0]) :
34
- Guard.IsEqual(ref, 'ReturnType') ? C.ReturnTypeDeferred(parameters[0]) :
35
- Guard.IsEqual(ref, 'Uncapitalize') ? C.UncapitalizeDeferred(parameters[0]) :
36
- Guard.IsEqual(ref, 'Uppercase') ? C.UppercaseDeferred(parameters[0]) :
37
- T.CallConstruct(T.Ref(ref), parameters));
26
+ Guard.IsEqual(ref, 'Parameters') ? C.ParametersDeferred(parameters[0]) :
27
+ Guard.IsEqual(ref, 'Partial') ? C.PartialDeferred(parameters[0]) :
28
+ Guard.IsEqual(ref, 'Pick') ? C.PickDeferred(parameters[0], parameters[1]) :
29
+ Guard.IsEqual(ref, 'Readonly') ? C.ReadonlyObjectDeferred(parameters[0]) :
30
+ Guard.IsEqual(ref, 'KeyOf') ? C.KeyOfDeferred(parameters[0]) :
31
+ Guard.IsEqual(ref, 'Record') ? T.RecordDeferred(parameters[0], parameters[1]) :
32
+ Guard.IsEqual(ref, 'Required') ? C.RequiredDeferred(parameters[0]) :
33
+ Guard.IsEqual(ref, 'ReturnType') ? C.ReturnTypeDeferred(parameters[0]) :
34
+ Guard.IsEqual(ref, 'Uncapitalize') ? C.UncapitalizeDeferred(parameters[0]) :
35
+ Guard.IsEqual(ref, 'Uppercase') ? C.UppercaseDeferred(parameters[0]) :
36
+ T.CallConstruct(T.Ref(ref), parameters));
38
37
  // deno-coverage-ignore-stop
39
38
  }
40
39
  // ------------------------------------------------------------------
@@ -185,27 +184,34 @@ export function BaseMapping(input) {
185
184
  ? input[1]
186
185
  : input;
187
186
  }
187
+ export function WithMapping(input) {
188
+ return Guard.IsEqual(input.length, 2) ? input[1] : [];
189
+ }
188
190
  // deno-coverage-ignore-start
189
- // ...
190
- const FactorIndexArray = (Type, indexArray) => {
191
+ function FactorIndexArray(Type, indexArray) {
191
192
  return indexArray.reduce((result, left) => {
192
193
  const _left = left;
193
194
  return (Guard.IsEqual(_left.length, 1) ? C.IndexDeferred(result, _left[0]) :
194
195
  Guard.IsEqual(_left.length, 0) ? T.Array(result) :
195
196
  Unreachable());
196
197
  }, Type);
197
- };
198
+ }
198
199
  // deno-coverage-ignore-stop
199
- const FactorExtends = (type, extend) => {
200
+ function FactorExtends(type, extend) {
200
201
  return Guard.IsEqual(extend.length, 3)
201
202
  ? C.ConditionalDeferred(type, extend[0], extend[1], extend[2])
202
203
  : type;
203
- };
204
+ }
205
+ function FactorWith(type, withClause) {
206
+ return Guard.IsArray(withClause) && Guard.IsEqual(withClause.length, 0)
207
+ ? type
208
+ : C.WithDeferred(type, withClause);
209
+ }
204
210
  export function FactorMapping(input) {
205
- const [keyOf, type, indexArray, extend] = input;
206
- return keyOf
211
+ const [keyOf, type, indexArray, extend, withClause] = input;
212
+ return FactorWith(keyOf
207
213
  ? FactorExtends(C.KeyOfDeferred(FactorIndexArray(type, indexArray)), extend)
208
- : FactorExtends(FactorIndexArray(type, indexArray), extend);
214
+ : FactorExtends(FactorIndexArray(type, indexArray), extend), withClause);
209
215
  }
210
216
  // deno-coverage-ignore-start
211
217
  function ExprBinaryMapping(left, rest) {
@@ -406,12 +412,13 @@ export function MappedMapping(input) {
406
412
  ? C.MappedDeferred(T.Identifier(input[3]), input[5], input[6][0], ApplyReadonly(input[1], ApplyOptional(input[8], input[10])))
407
413
  : C.MappedDeferred(T.Identifier(input[3]), input[5], T.Ref(input[3]), ApplyReadonly(input[1], ApplyOptional(input[8], input[10]))));
408
414
  }
415
+ export function DependentMapping(input) {
416
+ return (Guard.IsEqual(input.length, 6) ? T.Dependent(input[1], input[3], input[5]) :
417
+ T.Dependent(input[1], input[3], T.Unknown()));
418
+ }
409
419
  export function ReferenceMapping(input) {
410
420
  return T.Ref(input);
411
421
  }
412
- export function OptionsMapping(input) {
413
- return C.OptionsDeferred(input[2], input[4]);
414
- }
415
422
  export function JsonNumberMapping(input) {
416
423
  return parseFloat(input);
417
424
  }
@@ -42,8 +42,9 @@ export type TKeyOf<Input extends string> = ((Token.TConst<'keyof', Input> extend
42
42
  export type TIndexArray_0<Input extends string, Result extends unknown[] = []> = ((Token.TConst<'[', Input> extends [infer _0, infer Input extends string] ? (TType<Input> extends [infer _1, infer Input extends string] ? (Token.TConst<']', Input> extends [infer _2, infer Input extends string] ? [[_0, _1, _2], Input] : []) : []) : []) extends [infer _0, infer Input extends string] ? [_0, Input] : (Token.TConst<'[', Input> extends [infer _0, infer Input extends string] ? (Token.TConst<']', Input> extends [infer _1, infer Input extends string] ? [[_0, _1], Input] : []) : []) extends [infer _0, infer Input extends string] ? [_0, Input] : []) extends [infer _0, infer Input extends string] ? TIndexArray_0<Input, [...Result, _0]> : [Result, Input];
43
43
  export type TIndexArray<Input extends string> = TIndexArray_0<Input> extends [infer _0 extends ([unknown, unknown, unknown] | [unknown, unknown])[], infer Input extends string] ? [S.TIndexArrayMapping<_0>, Input] : [];
44
44
  export type TExtends<Input extends string> = ((Token.TConst<'extends', Input> extends [infer _0, infer Input extends string] ? (TType<Input> extends [infer _1, infer Input extends string] ? (Token.TConst<'?', Input> extends [infer _2, infer Input extends string] ? (TType<Input> extends [infer _3, infer Input extends string] ? (Token.TConst<':', Input> extends [infer _4, infer Input extends string] ? (TType<Input> extends [infer _5, infer Input extends string] ? [[_0, _1, _2, _3, _4, _5], Input] : []) : []) : []) : []) : []) : []) extends [infer _0, infer Input extends string] ? [_0, Input] : [[], Input] extends [infer _0, infer Input extends string] ? [_0, Input] : []) extends [infer _0 extends [unknown, unknown, unknown, unknown, unknown, unknown] | [], infer Input extends string] ? [S.TExtendsMapping<_0>, Input] : [];
45
- export type TBase<Input extends string> = ((Token.TConst<'(', Input> extends [infer _0, infer Input extends string] ? (TType<Input> extends [infer _1, infer Input extends string] ? (Token.TConst<')', Input> extends [infer _2, infer Input extends string] ? [[_0, _1, _2], Input] : []) : []) : []) extends [infer _0, infer Input extends string] ? [_0, Input] : TKeyword<Input> extends [infer _0, infer Input extends string] ? [_0, Input] : T_Object_<Input> extends [infer _0, infer Input extends string] ? [_0, Input] : TTuple<Input> extends [infer _0, infer Input extends string] ? [_0, Input] : TTemplateLiteral<Input> extends [infer _0, infer Input extends string] ? [_0, Input] : TLiteral<Input> extends [infer _0, infer Input extends string] ? [_0, Input] : TConstructor<Input> extends [infer _0, infer Input extends string] ? [_0, Input] : T_Function_<Input> extends [infer _0, infer Input extends string] ? [_0, Input] : TMapped<Input> extends [infer _0, infer Input extends string] ? [_0, Input] : TOptions<Input> extends [infer _0, infer Input extends string] ? [_0, Input] : TGenericCall<Input> extends [infer _0, infer Input extends string] ? [_0, Input] : TReference<Input> extends [infer _0, infer Input extends string] ? [_0, Input] : []) extends [infer _0 extends [unknown, unknown, unknown] | unknown, infer Input extends string] ? [S.TBaseMapping<_0>, Input] : [];
46
- export type TFactor<Input extends string> = (TKeyOf<Input> extends [infer _0, infer Input extends string] ? (TBase<Input> extends [infer _1, infer Input extends string] ? (TIndexArray<Input> extends [infer _2, infer Input extends string] ? (TExtends<Input> extends [infer _3, infer Input extends string] ? [[_0, _1, _2, _3], Input] : []) : []) : []) : []) extends [infer _0 extends [unknown, unknown, unknown, unknown], infer Input extends string] ? [S.TFactorMapping<_0>, Input] : [];
45
+ export type TBase<Input extends string> = ((Token.TConst<'(', Input> extends [infer _0, infer Input extends string] ? (TType<Input> extends [infer _1, infer Input extends string] ? (Token.TConst<')', Input> extends [infer _2, infer Input extends string] ? [[_0, _1, _2], Input] : []) : []) : []) extends [infer _0, infer Input extends string] ? [_0, Input] : TKeyword<Input> extends [infer _0, infer Input extends string] ? [_0, Input] : T_Object_<Input> extends [infer _0, infer Input extends string] ? [_0, Input] : TTuple<Input> extends [infer _0, infer Input extends string] ? [_0, Input] : TTemplateLiteral<Input> extends [infer _0, infer Input extends string] ? [_0, Input] : TLiteral<Input> extends [infer _0, infer Input extends string] ? [_0, Input] : TConstructor<Input> extends [infer _0, infer Input extends string] ? [_0, Input] : T_Function_<Input> extends [infer _0, infer Input extends string] ? [_0, Input] : TMapped<Input> extends [infer _0, infer Input extends string] ? [_0, Input] : TDependent<Input> extends [infer _0, infer Input extends string] ? [_0, Input] : TGenericCall<Input> extends [infer _0, infer Input extends string] ? [_0, Input] : TReference<Input> extends [infer _0, infer Input extends string] ? [_0, Input] : []) extends [infer _0 extends [unknown, unknown, unknown] | unknown, infer Input extends string] ? [S.TBaseMapping<_0>, Input] : [];
46
+ export type TWith<Input extends string> = ((Token.TConst<'with', Input> extends [infer _0, infer Input extends string] ? (TJsonObject<Input> extends [infer _1, infer Input extends string] ? [[_0, _1], Input] : []) : []) extends [infer _0, infer Input extends string] ? [_0, Input] : [[], Input] extends [infer _0, infer Input extends string] ? [_0, Input] : []) extends [infer _0 extends [unknown, unknown] | [], infer Input extends string] ? [S.TWithMapping<_0>, Input] : [];
47
+ export type TFactor<Input extends string> = (TKeyOf<Input> extends [infer _0, infer Input extends string] ? (TBase<Input> extends [infer _1, infer Input extends string] ? (TIndexArray<Input> extends [infer _2, infer Input extends string] ? (TExtends<Input> extends [infer _3, infer Input extends string] ? (TWith<Input> extends [infer _4, infer Input extends string] ? [[_0, _1, _2, _3, _4], Input] : []) : []) : []) : []) : []) extends [infer _0 extends [unknown, unknown, unknown, unknown, unknown], infer Input extends string] ? [S.TFactorMapping<_0>, Input] : [];
47
48
  export type TExprTermTail<Input extends string> = ((Token.TConst<'&', Input> extends [infer _0, infer Input extends string] ? (TFactor<Input> extends [infer _1, infer Input extends string] ? (TExprTermTail<Input> extends [infer _2, infer Input extends string] ? [[_0, _1, _2], Input] : []) : []) : []) extends [infer _0, infer Input extends string] ? [_0, Input] : [[], Input] extends [infer _0, infer Input extends string] ? [_0, Input] : []) extends [infer _0 extends [unknown, unknown, unknown] | [], infer Input extends string] ? [S.TExprTermTailMapping<_0>, Input] : [];
48
49
  export type TExprTerm<Input extends string> = (TFactor<Input> extends [infer _0, infer Input extends string] ? (TExprTermTail<Input> extends [infer _1, infer Input extends string] ? [[_0, _1], Input] : []) : []) extends [infer _0 extends [unknown, unknown], infer Input extends string] ? [S.TExprTermMapping<_0>, Input] : [];
49
50
  export type TExprTail<Input extends string> = ((Token.TConst<'|', Input> extends [infer _0, infer Input extends string] ? (TExprTerm<Input> extends [infer _1, infer Input extends string] ? (TExprTail<Input> extends [infer _2, infer Input extends string] ? [[_0, _1, _2], Input] : []) : []) : []) extends [infer _0, infer Input extends string] ? [_0, Input] : [[], Input] extends [infer _0, infer Input extends string] ? [_0, Input] : []) extends [infer _0 extends [unknown, unknown, unknown] | [], infer Input extends string] ? [S.TExprTailMapping<_0>, Input] : [];
@@ -89,8 +90,8 @@ export type TMappedReadonly<Input extends string> = ((Token.TConst<'+', Input> e
89
90
  export type TMappedOptional<Input extends string> = ((Token.TConst<'+', Input> extends [infer _0, infer Input extends string] ? (Token.TConst<'?', Input> extends [infer _1, infer Input extends string] ? [[_0, _1], Input] : []) : []) extends [infer _0, infer Input extends string] ? [_0, Input] : (Token.TConst<'-', Input> extends [infer _0, infer Input extends string] ? (Token.TConst<'?', Input> extends [infer _1, infer Input extends string] ? [[_0, _1], Input] : []) : []) extends [infer _0, infer Input extends string] ? [_0, Input] : (Token.TConst<'?', Input> extends [infer _0, infer Input extends string] ? [[_0], Input] : []) extends [infer _0, infer Input extends string] ? [_0, Input] : [[], Input] extends [infer _0, infer Input extends string] ? [_0, Input] : []) extends [infer _0 extends [unknown, unknown] | [unknown] | [], infer Input extends string] ? [S.TMappedOptionalMapping<_0>, Input] : [];
90
91
  export type TMappedAs<Input extends string> = ((Token.TConst<'as', Input> extends [infer _0, infer Input extends string] ? (TType<Input> extends [infer _1, infer Input extends string] ? [[_0, _1], Input] : []) : []) extends [infer _0, infer Input extends string] ? [_0, Input] : [[], Input] extends [infer _0, infer Input extends string] ? [_0, Input] : []) extends [infer _0 extends [unknown, unknown] | [], infer Input extends string] ? [S.TMappedAsMapping<_0>, Input] : [];
91
92
  export type TMapped<Input extends string> = (Token.TConst<'{', Input> extends [infer _0, infer Input extends string] ? (TMappedReadonly<Input> extends [infer _1, infer Input extends string] ? (Token.TConst<'[', Input> extends [infer _2, infer Input extends string] ? (Token.TIdent<Input> extends [infer _3, infer Input extends string] ? (Token.TConst<'in', Input> extends [infer _4, infer Input extends string] ? (TType<Input> extends [infer _5, infer Input extends string] ? (TMappedAs<Input> extends [infer _6, infer Input extends string] ? (Token.TConst<']', Input> extends [infer _7, infer Input extends string] ? (TMappedOptional<Input> extends [infer _8, infer Input extends string] ? (Token.TConst<':', Input> extends [infer _9, infer Input extends string] ? (TType<Input> extends [infer _10, infer Input extends string] ? (TOptionalSemiColon<Input> extends [infer _11, infer Input extends string] ? (Token.TConst<'}', Input> extends [infer _12, infer Input extends string] ? [[_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12], Input] : []) : []) : []) : []) : []) : []) : []) : []) : []) : []) : []) : []) : []) extends [infer _0 extends [unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown], infer Input extends string] ? [S.TMappedMapping<_0>, Input] : [];
93
+ export type TDependent<Input extends string> = ((Token.TConst<'if', Input> extends [infer _0, infer Input extends string] ? (TType<Input> extends [infer _1, infer Input extends string] ? (Token.TConst<'then', Input> extends [infer _2, infer Input extends string] ? (TType<Input> extends [infer _3, infer Input extends string] ? (Token.TConst<'else', Input> extends [infer _4, infer Input extends string] ? (TType<Input> extends [infer _5, infer Input extends string] ? [[_0, _1, _2, _3, _4, _5], Input] : []) : []) : []) : []) : []) : []) extends [infer _0, infer Input extends string] ? [_0, Input] : (Token.TConst<'if', Input> extends [infer _0, infer Input extends string] ? (TType<Input> extends [infer _1, infer Input extends string] ? (Token.TConst<'then', Input> extends [infer _2, infer Input extends string] ? (TType<Input> extends [infer _3, infer Input extends string] ? [[_0, _1, _2, _3], Input] : []) : []) : []) : []) extends [infer _0, infer Input extends string] ? [_0, Input] : []) extends [infer _0 extends [unknown, unknown, unknown, unknown, unknown, unknown] | [unknown, unknown, unknown, unknown], infer Input extends string] ? [S.TDependentMapping<_0>, Input] : [];
92
94
  export type TReference<Input extends string> = Token.TIdent<Input> extends [infer _0 extends string, infer Input extends string] ? [S.TReferenceMapping<_0>, Input] : [];
93
- export type TOptions<Input extends string> = (Token.TConst<'Options', Input> extends [infer _0, infer Input extends string] ? (Token.TConst<'<', Input> extends [infer _1, infer Input extends string] ? (TType<Input> extends [infer _2, infer Input extends string] ? (Token.TConst<',', Input> extends [infer _3, infer Input extends string] ? (TJsonObject<Input> extends [infer _4, infer Input extends string] ? (Token.TConst<'>', Input> extends [infer _5, infer Input extends string] ? [[_0, _1, _2, _3, _4, _5], Input] : []) : []) : []) : []) : []) : []) extends [infer _0 extends [unknown, unknown, unknown, unknown, unknown, unknown], infer Input extends string] ? [S.TOptionsMapping<_0>, Input] : [];
94
95
  export type TJsonNumber<Input extends string> = Token.TNumber<Input> extends [infer _0 extends string, infer Input extends string] ? [S.TJsonNumberMapping<_0>, Input] : [];
95
96
  export type TJsonBoolean<Input extends string> = (Token.TConst<'true', Input> extends [infer _0, infer Input extends string] ? [_0, Input] : Token.TConst<'false', Input> extends [infer _0, infer Input extends string] ? [_0, Input] : []) extends [infer _0 extends 'true' | 'false', infer Input extends string] ? [S.TJsonBooleanMapping<_0>, Input] : [];
96
97
  export type TJsonString<Input extends string> = Token.TString<['\"', '\''], Input> extends [infer _0 extends string, infer Input extends string] ? [S.TJsonStringMapping<_0>, Input] : [];
@@ -172,6 +173,7 @@ export declare const IndexArray_0: (input: string, result?: unknown[]) => [unkno
172
173
  export declare const IndexArray: (input: string) => [unknown, string] | [];
173
174
  export declare const Extends: (input: string) => [unknown, string] | [];
174
175
  export declare const Base: (input: string) => [unknown, string] | [];
176
+ export declare const With: (input: string) => [unknown, string] | [];
175
177
  export declare const Factor: (input: string) => [unknown, string] | [];
176
178
  export declare const ExprTermTail: (input: string) => [unknown, string] | [];
177
179
  export declare const ExprTerm: (input: string) => [unknown, string] | [];
@@ -218,8 +220,8 @@ export declare const MappedReadonly: (input: string) => [unknown, string] | [];
218
220
  export declare const MappedOptional: (input: string) => [unknown, string] | [];
219
221
  export declare const MappedAs: (input: string) => [unknown, string] | [];
220
222
  export declare const Mapped: (input: string) => [unknown, string] | [];
223
+ export declare const Dependent: (input: string) => [unknown, string] | [];
221
224
  export declare const Reference: (input: string) => [unknown, string] | [];
222
- export declare const Options: (input: string) => [unknown, string] | [];
223
225
  export declare const JsonNumber: (input: string) => [unknown, string] | [];
224
226
  export declare const JsonBoolean: (input: string) => [unknown, string] | [];
225
227
  export declare const JsonString: (input: string) => [unknown, string] | [];