@sinclair/typebox 0.34.0 → 0.34.1

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 (146) hide show
  1. package/build/cjs/syntax/runtime.d.ts +4 -1
  2. package/build/cjs/syntax/runtime.js +3 -1
  3. package/build/cjs/syntax/static.d.ts +3 -3
  4. package/build/cjs/type/array/array.d.ts +1 -1
  5. package/build/cjs/type/awaited/awaited.d.ts +8 -3
  6. package/build/cjs/type/awaited/awaited.js +20 -20
  7. package/build/cjs/type/computed/computed.d.ts +9 -0
  8. package/build/cjs/type/computed/computed.js +10 -0
  9. package/build/cjs/type/computed/index.d.ts +1 -0
  10. package/build/cjs/type/computed/index.js +18 -0
  11. package/build/cjs/type/guard/kind.d.ts +9 -4
  12. package/build/cjs/type/guard/kind.js +10 -0
  13. package/build/cjs/type/guard/type.d.ts +6 -3
  14. package/build/cjs/type/guard/type.js +6 -0
  15. package/build/cjs/type/indexed/indexed-from-mapped-key.d.ts +6 -6
  16. package/build/cjs/type/indexed/indexed-from-mapped-key.js +10 -10
  17. package/build/cjs/type/indexed/indexed-from-mapped-result.d.ts +5 -5
  18. package/build/cjs/type/indexed/indexed-from-mapped-result.js +11 -10
  19. package/build/cjs/type/indexed/indexed-property-keys.d.ts +6 -6
  20. package/build/cjs/type/indexed/indexed-property-keys.js +14 -14
  21. package/build/cjs/type/indexed/indexed.d.ts +34 -20
  22. package/build/cjs/type/indexed/indexed.js +59 -46
  23. package/build/cjs/type/intersect/intersect-evaluated.d.ts +6 -6
  24. package/build/cjs/type/intersect/intersect-evaluated.js +16 -16
  25. package/build/cjs/type/intersect/intersect.d.ts +2 -2
  26. package/build/cjs/type/intersect/intersect.js +6 -6
  27. package/build/cjs/type/keyof/keyof-from-mapped-result.d.ts +6 -6
  28. package/build/cjs/type/keyof/keyof-from-mapped-result.js +10 -10
  29. package/build/cjs/type/keyof/keyof-property-keys.d.ts +7 -7
  30. package/build/cjs/type/keyof/keyof-property-keys.js +22 -22
  31. package/build/cjs/type/keyof/keyof.d.ts +11 -6
  32. package/build/cjs/type/keyof/keyof.js +22 -13
  33. package/build/cjs/type/module/compute.d.ts +54 -0
  34. package/build/cjs/type/module/compute.js +154 -0
  35. package/build/cjs/type/module/infer.d.ts +43 -0
  36. package/build/cjs/type/module/infer.js +3 -0
  37. package/build/cjs/type/module/module.d.ts +8 -52
  38. package/build/cjs/type/module/module.js +14 -11
  39. package/build/cjs/type/not/not.d.ts +1 -1
  40. package/build/cjs/type/not/not.js +2 -2
  41. package/build/cjs/type/omit/omit-from-mapped-key.d.ts +6 -6
  42. package/build/cjs/type/omit/omit-from-mapped-key.js +10 -12
  43. package/build/cjs/type/omit/omit-from-mapped-result.d.ts +5 -5
  44. package/build/cjs/type/omit/omit-from-mapped-result.js +10 -10
  45. package/build/cjs/type/omit/omit.d.ts +26 -14
  46. package/build/cjs/type/omit/omit.js +46 -35
  47. package/build/cjs/type/partial/partial.d.ts +11 -7
  48. package/build/cjs/type/partial/partial.js +36 -24
  49. package/build/cjs/type/pick/pick-from-mapped-key.d.ts +6 -6
  50. package/build/cjs/type/pick/pick-from-mapped-key.js +10 -10
  51. package/build/cjs/type/pick/pick-from-mapped-result.d.ts +5 -5
  52. package/build/cjs/type/pick/pick-from-mapped-result.js +10 -10
  53. package/build/cjs/type/pick/pick.d.ts +25 -15
  54. package/build/cjs/type/pick/pick.js +47 -36
  55. package/build/cjs/type/record/record.d.ts +4 -2
  56. package/build/cjs/type/record/record.js +31 -28
  57. package/build/cjs/type/required/required.d.ts +12 -8
  58. package/build/cjs/type/required/required.js +37 -25
  59. package/build/cjs/type/tuple/tuple.d.ts +1 -1
  60. package/build/cjs/type/tuple/tuple.js +4 -4
  61. package/build/cjs/type/type/javascript.d.ts +10 -10
  62. package/build/cjs/type/type/javascript.js +6 -6
  63. package/build/cjs/type/type/json.d.ts +41 -51
  64. package/build/cjs/type/type/json.js +40 -40
  65. package/build/cjs/type/union/union-evaluated.d.ts +6 -6
  66. package/build/cjs/type/union/union-evaluated.js +11 -10
  67. package/build/cjs/type/union/union.d.ts +1 -1
  68. package/build/cjs/type/union/union.js +4 -4
  69. package/build/cjs/value/check/check.js +3 -3
  70. package/build/cjs/value/transform/decode.js +7 -7
  71. package/build/cjs/value/transform/encode.js +7 -7
  72. package/build/cjs/value/transform/has.js +18 -18
  73. package/build/esm/syntax/runtime.d.mts +4 -1
  74. package/build/esm/syntax/runtime.mjs +3 -1
  75. package/build/esm/syntax/static.d.mts +3 -3
  76. package/build/esm/type/array/array.d.mts +1 -1
  77. package/build/esm/type/awaited/awaited.d.mts +8 -3
  78. package/build/esm/type/awaited/awaited.mjs +20 -20
  79. package/build/esm/type/computed/computed.d.mts +9 -0
  80. package/build/esm/type/computed/computed.mjs +6 -0
  81. package/build/esm/type/computed/index.d.mts +1 -0
  82. package/build/esm/type/computed/index.mjs +1 -0
  83. package/build/esm/type/guard/kind.d.mts +9 -4
  84. package/build/esm/type/guard/kind.mjs +8 -0
  85. package/build/esm/type/guard/type.d.mts +6 -3
  86. package/build/esm/type/guard/type.mjs +5 -0
  87. package/build/esm/type/indexed/indexed-from-mapped-key.d.mts +6 -6
  88. package/build/esm/type/indexed/indexed-from-mapped-key.mjs +10 -10
  89. package/build/esm/type/indexed/indexed-from-mapped-result.d.mts +5 -5
  90. package/build/esm/type/indexed/indexed-from-mapped-result.mjs +11 -10
  91. package/build/esm/type/indexed/indexed-property-keys.d.mts +6 -6
  92. package/build/esm/type/indexed/indexed-property-keys.mjs +14 -14
  93. package/build/esm/type/indexed/indexed.d.mts +34 -20
  94. package/build/esm/type/indexed/indexed.mjs +55 -42
  95. package/build/esm/type/intersect/intersect-evaluated.d.mts +6 -6
  96. package/build/esm/type/intersect/intersect-evaluated.mjs +16 -16
  97. package/build/esm/type/intersect/intersect.d.mts +2 -2
  98. package/build/esm/type/intersect/intersect.mjs +6 -6
  99. package/build/esm/type/keyof/keyof-from-mapped-result.d.mts +6 -6
  100. package/build/esm/type/keyof/keyof-from-mapped-result.mjs +10 -10
  101. package/build/esm/type/keyof/keyof-property-keys.d.mts +7 -7
  102. package/build/esm/type/keyof/keyof-property-keys.mjs +22 -22
  103. package/build/esm/type/keyof/keyof.d.mts +11 -6
  104. package/build/esm/type/keyof/keyof.mjs +22 -13
  105. package/build/esm/type/module/compute.d.mts +54 -0
  106. package/build/esm/type/module/compute.mjs +148 -0
  107. package/build/esm/type/module/infer.d.mts +43 -0
  108. package/build/esm/type/module/infer.mjs +1 -0
  109. package/build/esm/type/module/module.d.mts +8 -52
  110. package/build/esm/type/module/module.mjs +14 -11
  111. package/build/esm/type/not/not.d.mts +1 -1
  112. package/build/esm/type/not/not.mjs +2 -2
  113. package/build/esm/type/omit/omit-from-mapped-key.d.mts +6 -6
  114. package/build/esm/type/omit/omit-from-mapped-key.mjs +10 -12
  115. package/build/esm/type/omit/omit-from-mapped-result.d.mts +5 -5
  116. package/build/esm/type/omit/omit-from-mapped-result.mjs +10 -10
  117. package/build/esm/type/omit/omit.d.mts +26 -14
  118. package/build/esm/type/omit/omit.mjs +43 -32
  119. package/build/esm/type/partial/partial.d.mts +11 -7
  120. package/build/esm/type/partial/partial.mjs +29 -17
  121. package/build/esm/type/pick/pick-from-mapped-key.d.mts +6 -6
  122. package/build/esm/type/pick/pick-from-mapped-key.mjs +10 -10
  123. package/build/esm/type/pick/pick-from-mapped-result.d.mts +5 -5
  124. package/build/esm/type/pick/pick-from-mapped-result.mjs +10 -10
  125. package/build/esm/type/pick/pick.d.mts +25 -15
  126. package/build/esm/type/pick/pick.mjs +43 -32
  127. package/build/esm/type/record/record.d.mts +4 -2
  128. package/build/esm/type/record/record.mjs +15 -12
  129. package/build/esm/type/required/required.d.mts +12 -8
  130. package/build/esm/type/required/required.mjs +33 -21
  131. package/build/esm/type/tuple/tuple.d.mts +1 -1
  132. package/build/esm/type/tuple/tuple.mjs +4 -4
  133. package/build/esm/type/type/javascript.d.mts +10 -10
  134. package/build/esm/type/type/javascript.mjs +6 -6
  135. package/build/esm/type/type/json.d.mts +41 -51
  136. package/build/esm/type/type/json.mjs +40 -40
  137. package/build/esm/type/union/union-evaluated.d.mts +6 -6
  138. package/build/esm/type/union/union-evaluated.mjs +11 -10
  139. package/build/esm/type/union/union.d.mts +1 -1
  140. package/build/esm/type/union/union.mjs +4 -4
  141. package/build/esm/value/check/check.mjs +2 -2
  142. package/build/esm/value/transform/decode.mjs +2 -2
  143. package/build/esm/value/transform/encode.mjs +2 -2
  144. package/build/esm/value/transform/has.mjs +2 -2
  145. package/package.json +1 -1
  146. package/readme.md +30 -19
@@ -2,21 +2,25 @@ import type { TSchema, SchemaOptions } from '../schema/index';
2
2
  import type { Evaluate, Ensure } from '../helpers/index';
3
3
  import type { TMappedResult } from '../mapped/index';
4
4
  import { type TReadonlyOptional } from '../readonly-optional/index';
5
+ import { type TComputed } from '../computed/index';
5
6
  import { type TOptional } from '../optional/index';
6
7
  import { type TReadonly } from '../readonly/index';
7
8
  import { type TRecursive } from '../recursive/index';
8
9
  import { type TObject, type TProperties } from '../object/index';
9
10
  import { type TIntersect } from '../intersect/index';
10
11
  import { type TUnion } from '../union/index';
12
+ import { type TRef } from '../ref/index';
11
13
  import { type TPartialFromMappedResult } from './partial-from-mapped-result';
12
- type TFromRest<T extends TSchema[], Acc extends TSchema[] = []> = (T extends [infer L extends TSchema, ...infer R extends TSchema[]] ? TFromRest<R, [...Acc, TPartial<L>]> : Acc);
13
- type TFromProperties<T extends TProperties> = Evaluate<{
14
- [K in keyof T]: T[K] extends (TReadonlyOptional<infer S>) ? TReadonlyOptional<S> : T[K] extends (TReadonly<infer S>) ? TReadonlyOptional<S> : T[K] extends (TOptional<infer S>) ? TOptional<S> : TOptional<T[K]>;
14
+ type TFromComputed<Target extends string, Parameters extends TSchema[]> = Ensure<TComputed<'Partial', [TComputed<Target, Parameters>]>>;
15
+ type TFromRef<Ref extends string> = Ensure<TComputed<'Partial', [TRef<Ref>]>>;
16
+ type TFromProperties<Properties extends TProperties> = Evaluate<{
17
+ [K in keyof Properties]: Properties[K] extends (TReadonlyOptional<infer S>) ? TReadonlyOptional<S> : Properties[K] extends (TReadonly<infer S>) ? TReadonlyOptional<S> : Properties[K] extends (TOptional<infer S>) ? TOptional<S> : TOptional<Properties[K]>;
15
18
  }>;
16
- type TFromObject<T extends TObject, Properties extends TProperties = T['properties']> = Ensure<TObject<(TFromProperties<Properties>)>>;
17
- export type TPartial<T extends TSchema> = (T extends TRecursive<infer S extends TSchema> ? TRecursive<TPartial<S>> : T extends TIntersect<infer S extends TSchema[]> ? TIntersect<TFromRest<S>> : T extends TUnion<infer S extends TSchema[]> ? TUnion<TFromRest<S>> : T extends TObject<infer S extends TProperties> ? TFromObject<TObject<S>> : TObject<{}>);
19
+ type TFromObject<Type extends TObject, Properties extends TProperties = Type['properties']> = Ensure<TObject<(TFromProperties<Properties>)>>;
20
+ type TFromRest<Types extends TSchema[], Result extends TSchema[] = []> = (Types extends [infer L extends TSchema, ...infer R extends TSchema[]] ? TFromRest<R, [...Result, TPartial<L>]> : Result);
21
+ export type TPartial<T extends TSchema> = (T extends TRecursive<infer Type extends TSchema> ? TRecursive<TPartial<Type>> : T extends TComputed<infer Target extends string, infer Parameters extends TSchema[]> ? TFromComputed<Target, Parameters> : T extends TRef<infer Ref extends string> ? TFromRef<Ref> : T extends TIntersect<infer Types extends TSchema[]> ? TIntersect<TFromRest<Types>> : T extends TUnion<infer Types extends TSchema[]> ? TUnion<TFromRest<Types>> : T extends TObject<infer Properties extends TProperties> ? TFromObject<TObject<Properties>> : TObject<{}>);
18
22
  /** `[Json]` Constructs a type where all properties are optional */
19
- export declare function Partial<T extends TMappedResult>(T: T, options?: SchemaOptions): TPartialFromMappedResult<T>;
23
+ export declare function Partial<MappedResult extends TMappedResult>(type: MappedResult, options?: SchemaOptions): TPartialFromMappedResult<MappedResult>;
20
24
  /** `[Json]` Constructs a type where all properties are optional */
21
- export declare function Partial<T extends TSchema>(T: T, options?: SchemaOptions): TPartial<T>;
25
+ export declare function Partial<Type extends TSchema>(type: Type, options?: SchemaOptions): TPartial<Type>;
22
26
  export {};
@@ -3,51 +3,63 @@
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.Partial = Partial;
5
5
  const type_1 = require("../create/type");
6
- const index_1 = require("../optional/index");
7
- const index_2 = require("../object/index");
8
- const index_3 = require("../intersect/index");
9
- const index_4 = require("../union/index");
10
- const index_5 = require("../discard/index");
11
- const index_6 = require("../symbols/index");
6
+ const index_1 = require("../computed/index");
7
+ const index_2 = require("../optional/index");
8
+ const index_3 = require("../object/index");
9
+ const index_4 = require("../intersect/index");
10
+ const index_5 = require("../union/index");
11
+ const index_6 = require("../ref/index");
12
+ const index_7 = require("../discard/index");
13
+ const index_8 = require("../symbols/index");
12
14
  const partial_from_mapped_result_1 = require("./partial-from-mapped-result");
13
15
  // ------------------------------------------------------------------
14
16
  // TypeGuard
15
17
  // ------------------------------------------------------------------
16
18
  const kind_1 = require("../guard/kind");
17
19
  // prettier-ignore
18
- function FromRest(T) {
19
- return T.map(L => PartialResolve(L));
20
+ function FromComputed(target, parameters) {
21
+ return (0, index_1.Computed)('Partial', [(0, index_1.Computed)(target, parameters)]);
20
22
  }
21
23
  // prettier-ignore
22
- function FromProperties(T) {
23
- const Acc = {};
24
- for (const K of globalThis.Object.getOwnPropertyNames(T))
25
- Acc[K] = (0, index_1.Optional)(T[K]);
26
- return Acc;
24
+ function FromRef($ref) {
25
+ return (0, index_1.Computed)('Partial', [(0, index_6.Ref)($ref)]);
26
+ }
27
+ // prettier-ignore
28
+ function FromProperties(properties) {
29
+ const partialProperties = {};
30
+ for (const K of globalThis.Object.getOwnPropertyNames(properties))
31
+ partialProperties[K] = (0, index_2.Optional)(properties[K]);
32
+ return partialProperties;
27
33
  }
28
34
  // prettier-ignore
29
35
  function FromObject(T) {
30
- const options = (0, index_5.Discard)(T, [index_6.TransformKind, '$id', 'required', 'properties']);
36
+ const options = (0, index_7.Discard)(T, [index_8.TransformKind, '$id', 'required', 'properties']);
31
37
  const properties = FromProperties(T['properties']);
32
- return (0, index_2.Object)(properties, options);
38
+ return (0, index_3.Object)(properties, options);
39
+ }
40
+ // prettier-ignore
41
+ function FromRest(types) {
42
+ return types.map(type => PartialResolve(type));
33
43
  }
34
44
  // ------------------------------------------------------------------
35
45
  // PartialResolve
36
46
  // ------------------------------------------------------------------
37
47
  // prettier-ignore
38
- function PartialResolve(T) {
39
- return ((0, kind_1.IsIntersect)(T) ? (0, index_3.Intersect)(FromRest(T.allOf)) :
40
- (0, kind_1.IsUnion)(T) ? (0, index_4.Union)(FromRest(T.anyOf)) :
41
- (0, kind_1.IsObject)(T) ? FromObject(T) :
42
- (0, index_2.Object)({}));
48
+ function PartialResolve(type) {
49
+ return ((0, kind_1.IsComputed)(type) ? FromComputed(type.target, type.parameters) :
50
+ (0, kind_1.IsRef)(type) ? FromRef(type.$ref) :
51
+ (0, kind_1.IsIntersect)(type) ? (0, index_4.Intersect)(FromRest(type.allOf)) :
52
+ (0, kind_1.IsUnion)(type) ? (0, index_5.Union)(FromRest(type.anyOf)) :
53
+ (0, kind_1.IsObject)(type) ? FromObject(type) :
54
+ (0, index_3.Object)({}));
43
55
  }
44
56
  /** `[Json]` Constructs a type where all properties are optional */
45
- function Partial(T, options) {
46
- if ((0, kind_1.IsMappedResult)(T)) {
47
- return (0, partial_from_mapped_result_1.PartialFromMappedResult)(T, options);
57
+ function Partial(type, options) {
58
+ if ((0, kind_1.IsMappedResult)(type)) {
59
+ return (0, partial_from_mapped_result_1.PartialFromMappedResult)(type, options);
48
60
  }
49
61
  else {
50
62
  // special: mapping types require overridable options
51
- return (0, type_1.CreateType)({ ...PartialResolve(T), ...options });
63
+ return (0, type_1.CreateType)({ ...PartialResolve(type), ...options });
52
64
  }
53
65
  }
@@ -2,11 +2,11 @@ import type { TSchema, SchemaOptions } from '../schema/index';
2
2
  import type { TProperties } from '../object/index';
3
3
  import { type TMappedResult, type TMappedKey } from '../mapped/index';
4
4
  import { type TPick } from './pick';
5
- type TFromPropertyKey<T extends TSchema, K extends PropertyKey> = {
6
- [_ in K]: TPick<T, [K]>;
5
+ type TFromPropertyKey<Type extends TSchema, Key extends PropertyKey> = {
6
+ [_ in Key]: TPick<Type, [Key]>;
7
7
  };
8
- type TFromPropertyKeys<T extends TSchema, K extends PropertyKey[], Acc extends TProperties = {}> = (K extends [infer LK extends PropertyKey, ...infer RK extends PropertyKey[]] ? TFromPropertyKeys<T, RK, Acc & TFromPropertyKey<T, LK>> : Acc);
9
- type TFromMappedKey<T extends TSchema, K extends TMappedKey> = (TFromPropertyKeys<T, K['keys']>);
10
- export type TPickFromMappedKey<T extends TSchema, K extends TMappedKey, P extends TProperties = TFromMappedKey<T, K>> = (TMappedResult<P>);
11
- export declare function PickFromMappedKey<T extends TSchema, K extends TMappedKey, P extends TProperties = TFromMappedKey<T, K>>(T: T, K: K, options?: SchemaOptions): TMappedResult<P>;
8
+ type TFromPropertyKeys<Type extends TSchema, PropertyKeys extends PropertyKey[], Result extends TProperties = {}> = (PropertyKeys extends [infer LeftKey extends PropertyKey, ...infer RightKeys extends PropertyKey[]] ? TFromPropertyKeys<Type, RightKeys, Result & TFromPropertyKey<Type, LeftKey>> : Result);
9
+ type TFromMappedKey<Type extends TSchema, MappedKey extends TMappedKey> = (TFromPropertyKeys<Type, MappedKey['keys']>);
10
+ export type TPickFromMappedKey<Type extends TSchema, MappedKey extends TMappedKey, Properties extends TProperties = TFromMappedKey<Type, MappedKey>> = (TMappedResult<Properties>);
11
+ export declare function PickFromMappedKey<Type extends TSchema, MappedKey extends TMappedKey, Properties extends TProperties = TFromMappedKey<Type, MappedKey>>(type: Type, mappedKey: MappedKey, options?: SchemaOptions): TMappedResult<Properties>;
12
12
  export {};
@@ -6,23 +6,23 @@ const index_1 = require("../mapped/index");
6
6
  const pick_1 = require("./pick");
7
7
  const value_1 = require("../clone/value");
8
8
  // prettier-ignore
9
- function FromPropertyKey(T, K, options) {
9
+ function FromPropertyKey(type, key, options) {
10
10
  return {
11
- [K]: (0, pick_1.Pick)(T, [K], (0, value_1.Clone)(options))
11
+ [key]: (0, pick_1.Pick)(type, [key], (0, value_1.Clone)(options))
12
12
  };
13
13
  }
14
14
  // prettier-ignore
15
- function FromPropertyKeys(T, K, options) {
16
- return K.reduce((Acc, LK) => {
17
- return { ...Acc, ...FromPropertyKey(T, LK, options) };
15
+ function FromPropertyKeys(type, propertyKeys, options) {
16
+ return propertyKeys.reduce((result, leftKey) => {
17
+ return { ...result, ...FromPropertyKey(type, leftKey, options) };
18
18
  }, {});
19
19
  }
20
20
  // prettier-ignore
21
- function FromMappedKey(T, K, options) {
22
- return FromPropertyKeys(T, K.keys, options);
21
+ function FromMappedKey(type, mappedKey, options) {
22
+ return FromPropertyKeys(type, mappedKey.keys, options);
23
23
  }
24
24
  // prettier-ignore
25
- function PickFromMappedKey(T, K, options) {
26
- const P = FromMappedKey(T, K, options);
27
- return (0, index_1.MappedResult)(P);
25
+ function PickFromMappedKey(type, mappedKey, options) {
26
+ const properties = FromMappedKey(type, mappedKey, options);
27
+ return (0, index_1.MappedResult)(properties);
28
28
  }
@@ -3,10 +3,10 @@ import type { Ensure, Evaluate } from '../helpers/index';
3
3
  import type { TProperties } from '../object/index';
4
4
  import { type TMappedResult } from '../mapped/index';
5
5
  import { type TPick } from './pick';
6
- type TFromProperties<P extends TProperties, K extends PropertyKey[]> = ({
7
- [K2 in keyof P]: TPick<P[K2], K>;
6
+ type TFromProperties<Properties extends TProperties, PropertyKeys extends PropertyKey[]> = ({
7
+ [K2 in keyof Properties]: TPick<Properties[K2], PropertyKeys>;
8
8
  });
9
- type TFromMappedResult<R extends TMappedResult, K extends PropertyKey[]> = (Evaluate<TFromProperties<R['properties'], K>>);
10
- export type TPickFromMappedResult<T extends TMappedResult, K extends PropertyKey[], P extends TProperties = TFromMappedResult<T, K>> = (Ensure<TMappedResult<P>>);
11
- export declare function PickFromMappedResult<R extends TMappedResult, K extends PropertyKey[], P extends TProperties = TFromMappedResult<R, K>>(R: R, K: [...K], options?: SchemaOptions): TMappedResult<P>;
9
+ type TFromMappedResult<MappedResult extends TMappedResult, PropertyKeys extends PropertyKey[]> = (Evaluate<TFromProperties<MappedResult['properties'], PropertyKeys>>);
10
+ export type TPickFromMappedResult<MappedResult extends TMappedResult, PropertyKeys extends PropertyKey[], Properties extends TProperties = TFromMappedResult<MappedResult, PropertyKeys>> = (Ensure<TMappedResult<Properties>>);
11
+ export declare function PickFromMappedResult<MappedResult extends TMappedResult, PropertyKeys extends PropertyKey[], Properties extends TProperties = TFromMappedResult<MappedResult, PropertyKeys>>(mappedResult: MappedResult, propertyKeys: [...PropertyKeys], options?: SchemaOptions): TMappedResult<Properties>;
12
12
  export {};
@@ -6,18 +6,18 @@ const index_1 = require("../mapped/index");
6
6
  const pick_1 = require("./pick");
7
7
  const value_1 = require("../clone/value");
8
8
  // prettier-ignore
9
- function FromProperties(P, K, options) {
10
- const Acc = {};
11
- for (const K2 of globalThis.Object.getOwnPropertyNames(P))
12
- Acc[K2] = (0, pick_1.Pick)(P[K2], K, (0, value_1.Clone)(options));
13
- return Acc;
9
+ function FromProperties(properties, propertyKeys, options) {
10
+ const result = {};
11
+ for (const K2 of globalThis.Object.getOwnPropertyNames(properties))
12
+ result[K2] = (0, pick_1.Pick)(properties[K2], propertyKeys, (0, value_1.Clone)(options));
13
+ return result;
14
14
  }
15
15
  // prettier-ignore
16
- function FromMappedResult(R, K, options) {
17
- return FromProperties(R.properties, K, options);
16
+ function FromMappedResult(mappedResult, propertyKeys, options) {
17
+ return FromProperties(mappedResult.properties, propertyKeys, options);
18
18
  }
19
19
  // prettier-ignore
20
- function PickFromMappedResult(R, K, options) {
21
- const P = FromMappedResult(R, K, options);
22
- return (0, index_1.MappedResult)(P);
20
+ function PickFromMappedResult(mappedResult, propertyKeys, options) {
21
+ const properties = FromMappedResult(mappedResult, propertyKeys, options);
22
+ return (0, index_1.MappedResult)(properties);
23
23
  }
@@ -1,26 +1,36 @@
1
1
  import type { TSchema, SchemaOptions } from '../schema/index';
2
2
  import type { TupleToUnion, Evaluate, Ensure } from '../helpers/index';
3
3
  import { type TRecursive } from '../recursive/index';
4
+ import { type TComputed } from '../computed/index';
4
5
  import { type TIntersect } from '../intersect/index';
5
- import { type TUnion } from '../union/index';
6
+ import { type TLiteral, type TLiteralValue } from '../literal/index';
6
7
  import { type TObject, type TProperties } from '../object/index';
7
- import type { TMappedKey, TMappedResult } from '../mapped/index';
8
+ import { type TUnion } from '../union/index';
9
+ import { type TMappedKey, type TMappedResult } from '../mapped/index';
10
+ import { type TRef } from '../ref/index';
8
11
  import { type TIndexPropertyKeys } from '../indexed/index';
9
12
  import { type TPickFromMappedKey } from './pick-from-mapped-key';
10
13
  import { type TPickFromMappedResult } from './pick-from-mapped-result';
11
- type FromIntersect<T extends TSchema[], K extends PropertyKey[], Acc extends TSchema[] = []> = T extends [infer L extends TSchema, ...infer R extends TSchema[]] ? FromIntersect<R, K, [...Acc, TPick<L, K>]> : Acc;
12
- declare function FromIntersect<T extends TSchema[], K extends PropertyKey[]>(T: T, K: K): FromIntersect<T, K>;
13
- type FromUnion<T extends TSchema[], K extends PropertyKey[], Acc extends TSchema[] = []> = T extends [infer L extends TSchema, ...infer R extends TSchema[]] ? FromUnion<R, K, [...Acc, TPick<L, K>]> : Acc;
14
- declare function FromUnion<T extends TSchema[], K extends PropertyKey[]>(T: T, K: K): FromUnion<T, K>;
15
- type TFromProperties<T extends TProperties, K extends PropertyKey[], I extends PropertyKey = TupleToUnion<K>> = Evaluate<Pick<T, I & keyof T>>;
16
- type TFromObject<T extends TObject, K extends PropertyKey[], Properties extends TProperties = T['properties']> = Ensure<TObject<(TFromProperties<Properties, K>)>>;
17
- export type TPick<T extends TProperties, K extends PropertyKey[]> = T extends TRecursive<infer S extends TSchema> ? TRecursive<TPick<S, K>> : T extends TIntersect<infer S extends TSchema[]> ? TIntersect<FromIntersect<S, K>> : T extends TUnion<infer S extends TSchema[]> ? TUnion<FromUnion<S, K>> : T extends TObject<infer S extends TProperties> ? TFromObject<TObject<S>, K> : TObject<{}>;
18
- /** `[Json]` Constructs a type whose keys are picked from the given type */
19
- export declare function Pick<T extends TMappedResult, K extends PropertyKey[]>(T: T, K: [...K], options?: SchemaOptions): TPickFromMappedResult<T, K>;
20
- /** `[Json]` Constructs a type whose keys are picked from the given type */
21
- export declare function Pick<T extends TSchema, K extends TMappedKey>(T: T, K: K, options?: SchemaOptions): TPickFromMappedKey<T, K>;
14
+ type TFromIntersect<Types extends TSchema[], PropertyKeys extends PropertyKey[], Result extends TSchema[] = []> = Types extends [infer L extends TSchema, ...infer R extends TSchema[]] ? TFromIntersect<R, PropertyKeys, [...Result, TPick<L, PropertyKeys>]> : Result;
15
+ type TFromUnion<Types extends TSchema[], PropertyKeys extends PropertyKey[], Result extends TSchema[] = []> = Types extends [infer L extends TSchema, ...infer R extends TSchema[]] ? TFromUnion<R, PropertyKeys, [...Result, TPick<L, PropertyKeys>]> : Result;
16
+ type TFromProperties<Properties extends TProperties, PropertyKeys extends PropertyKey[], UnionKeys extends PropertyKey = TupleToUnion<PropertyKeys>> = (Evaluate<Pick<Properties, UnionKeys & keyof Properties>>);
17
+ type TFromObject<Type extends TObject, Key extends PropertyKey[], Properties extends TProperties = Type['properties']> = Ensure<TObject<(TFromProperties<Properties, Key>)>>;
18
+ type TUnionFromPropertyKeys<PropertyKeys extends PropertyKey[], Result extends TLiteral[] = []> = (PropertyKeys extends [infer Key extends PropertyKey, ...infer Rest extends PropertyKey[]] ? Key extends TLiteralValue ? TUnionFromPropertyKeys<Rest, [...Result, TLiteral<Key>]> : TUnionFromPropertyKeys<Rest, [...Result]> : TUnion<Result>);
19
+ export type TPickResolve<Properties extends TProperties, PropertyKeys extends PropertyKey[]> = (Properties extends TRecursive<infer Types extends TSchema> ? TRecursive<TPickResolve<Types, PropertyKeys>> : Properties extends TIntersect<infer Types extends TSchema[]> ? TIntersect<TFromIntersect<Types, PropertyKeys>> : Properties extends TUnion<infer Types extends TSchema[]> ? TUnion<TFromUnion<Types, PropertyKeys>> : Properties extends TObject<infer Types extends TProperties> ? TFromObject<TObject<Types>, PropertyKeys> : TObject<{}>);
20
+ type TResolvePropertyKeys<Key extends TSchema | PropertyKey[]> = Key extends TSchema ? TIndexPropertyKeys<Key> : Key;
21
+ type TResolveTypeKey<Key extends TSchema | PropertyKey[]> = Key extends PropertyKey[] ? TUnionFromPropertyKeys<Key> : Key;
22
+ export type TPick<Type extends TSchema, Key extends TSchema | PropertyKey[], IsTypeRef extends boolean = Type extends TRef ? true : false, IsKeyRef extends boolean = Key extends TRef ? true : false> = (Type extends TMappedResult ? TPickFromMappedResult<Type, TResolvePropertyKeys<Key>> : Key extends TMappedKey ? TPickFromMappedKey<Type, Key> : [
23
+ IsTypeRef,
24
+ IsKeyRef
25
+ ] extends [true, true] ? TComputed<'Pick', [Type, TResolveTypeKey<Key>]> : [
26
+ IsTypeRef,
27
+ IsKeyRef
28
+ ] extends [false, true] ? TComputed<'Pick', [Type, TResolveTypeKey<Key>]> : [
29
+ IsTypeRef,
30
+ IsKeyRef
31
+ ] extends [true, false] ? TComputed<'Pick', [Type, TResolveTypeKey<Key>]> : TPickResolve<Type, TResolvePropertyKeys<Key>>);
22
32
  /** `[Json]` Constructs a type whose keys are picked from the given type */
23
- export declare function Pick<T extends TSchema, K extends TSchema, I extends PropertyKey[] = TIndexPropertyKeys<K>>(T: T, K: K, options?: SchemaOptions): TPick<T, I>;
33
+ export declare function Pick<Type extends TSchema, Key extends PropertyKey[]>(type: Type, key: readonly [...Key], options?: SchemaOptions): TPick<Type, Key>;
24
34
  /** `[Json]` Constructs a type whose keys are picked from the given type */
25
- export declare function Pick<T extends TSchema, K extends PropertyKey[]>(T: T, K: readonly [...K], options?: SchemaOptions): TPick<T, K>;
35
+ export declare function Pick<Type extends TSchema, Key extends TSchema>(type: Type, key: Key, options?: SchemaOptions): TPick<Type, Key>;
26
36
  export {};
@@ -4,56 +4,67 @@ Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.Pick = Pick;
5
5
  const type_1 = require("../create/type");
6
6
  const discard_1 = require("../discard/discard");
7
- const index_1 = require("../intersect/index");
8
- const index_2 = require("../union/index");
9
- const index_3 = require("../object/index");
10
- const index_4 = require("../indexed/index");
11
- const pick_from_mapped_key_1 = require("./pick-from-mapped-key");
12
- const pick_from_mapped_result_1 = require("./pick-from-mapped-result");
7
+ const index_1 = require("../computed/index");
8
+ const index_2 = require("../intersect/index");
9
+ const index_3 = require("../literal/index");
10
+ const index_4 = require("../object/index");
11
+ const index_5 = require("../union/index");
12
+ const index_6 = require("../indexed/index");
13
13
  const symbols_1 = require("../symbols/symbols");
14
14
  // ------------------------------------------------------------------
15
- // TypeGuard
15
+ // Guards
16
16
  // ------------------------------------------------------------------
17
17
  const kind_1 = require("../guard/kind");
18
- function FromIntersect(T, K) {
19
- return T.map((T) => PickResolve(T, K));
18
+ const guard_1 = require("src/value/guard");
19
+ // ------------------------------------------------------------------
20
+ // Infrastructure
21
+ // ------------------------------------------------------------------
22
+ const pick_from_mapped_key_1 = require("./pick-from-mapped-key");
23
+ const pick_from_mapped_result_1 = require("./pick-from-mapped-result");
24
+ function FromIntersect(types, propertyKeys) {
25
+ return types.map((type) => PickResolve(type, propertyKeys));
20
26
  }
21
27
  // prettier-ignore
22
- function FromUnion(T, K) {
23
- return T.map((T) => PickResolve(T, K));
28
+ function FromUnion(types, propertyKeys) {
29
+ return types.map((type) => PickResolve(type, propertyKeys));
24
30
  }
25
31
  // prettier-ignore
26
- function FromProperties(T, K) {
27
- const Acc = {};
28
- for (const K2 of K)
29
- if (K2 in T)
30
- Acc[K2] = T[K2];
31
- return Acc;
32
+ function FromProperties(properties, propertyKeys) {
33
+ const result = {};
34
+ for (const K2 of propertyKeys)
35
+ if (K2 in properties)
36
+ result[K2] = properties[K2];
37
+ return result;
32
38
  }
33
39
  // prettier-ignore
34
40
  function FromObject(T, K) {
35
41
  const options = (0, discard_1.Discard)(T, [symbols_1.TransformKind, '$id', 'required', 'properties']);
36
42
  const properties = FromProperties(T['properties'], K);
37
- return (0, index_3.Object)(properties, options);
43
+ return (0, index_4.Object)(properties, options);
38
44
  }
39
- // ------------------------------------------------------------------
40
- // PickResolve
41
- // ------------------------------------------------------------------
42
45
  // prettier-ignore
43
- function PickResolve(T, K) {
44
- return ((0, kind_1.IsIntersect)(T) ? (0, index_1.Intersect)(FromIntersect(T.allOf, K)) :
45
- (0, kind_1.IsUnion)(T) ? (0, index_2.Union)(FromUnion(T.anyOf, K)) :
46
- (0, kind_1.IsObject)(T) ? FromObject(T, K) :
47
- (0, index_3.Object)({}));
46
+ function UnionFromPropertyKeys(propertyKeys) {
47
+ const result = propertyKeys.reduce((result, key) => (0, kind_1.IsLiteralValue)(key) ? [...result, (0, index_3.Literal)(key)] : result, []);
48
+ return (0, index_5.Union)(result);
48
49
  }
49
- function Pick(T, K, options) {
50
- // mapped
51
- if ((0, kind_1.IsMappedKey)(K))
52
- return (0, pick_from_mapped_key_1.PickFromMappedKey)(T, K, options);
53
- if ((0, kind_1.IsMappedResult)(T))
54
- return (0, pick_from_mapped_result_1.PickFromMappedResult)(T, K, options);
55
- // non-mapped
56
- const I = (0, kind_1.IsSchema)(K) ? (0, index_4.IndexPropertyKeys)(K) : K;
57
- // special: mapping types require overridable options
58
- return (0, type_1.CreateType)({ ...PickResolve(T, I), ...options });
50
+ // prettier-ignore
51
+ function PickResolve(properties, propertyKeys) {
52
+ return ((0, kind_1.IsIntersect)(properties) ? (0, index_2.Intersect)(FromIntersect(properties.allOf, propertyKeys)) :
53
+ (0, kind_1.IsUnion)(properties) ? (0, index_5.Union)(FromUnion(properties.anyOf, propertyKeys)) :
54
+ (0, kind_1.IsObject)(properties) ? FromObject(properties, propertyKeys) :
55
+ (0, index_4.Object)({}));
56
+ }
57
+ /** `[Json]` Constructs a type whose keys are picked from the given type */
58
+ // prettier-ignore
59
+ function Pick(type, key, options) {
60
+ const typeKey = (0, guard_1.IsArray)(key) ? UnionFromPropertyKeys(key) : key;
61
+ const propertyKeys = (0, kind_1.IsSchema)(key) ? (0, index_6.IndexPropertyKeys)(key) : key;
62
+ const isTypeRef = (0, kind_1.IsRef)(type);
63
+ const isKeyRef = (0, kind_1.IsRef)(key);
64
+ return ((0, kind_1.IsMappedResult)(type) ? (0, pick_from_mapped_result_1.PickFromMappedResult)(type, propertyKeys, options) :
65
+ (0, kind_1.IsMappedKey)(key) ? (0, pick_from_mapped_key_1.PickFromMappedKey)(type, key, options) :
66
+ (isTypeRef && isKeyRef) ? (0, index_1.Computed)('Pick', [type, typeKey], options) :
67
+ (!isTypeRef && isKeyRef) ? (0, index_1.Computed)('Pick', [type, typeKey], options) :
68
+ (isTypeRef && !isKeyRef) ? (0, index_1.Computed)('Pick', [type, typeKey], options) :
69
+ (0, type_1.CreateType)({ ...PickResolve(type, propertyKeys), ...options }));
59
70
  }
@@ -2,6 +2,7 @@ import type { TSchema } from '../schema/index';
2
2
  import type { Static } from '../static/index';
3
3
  import type { Evaluate, Ensure, Assert } from '../helpers/index';
4
4
  import { type TAny } from '../any/index';
5
+ import { type TComputed } from '../computed/index';
5
6
  import { type TObject, type TProperties, type TAdditionalProperties, type ObjectOptions } from '../object/index';
6
7
  import { type TLiteral, type TLiteralValue } from '../literal/index';
7
8
  import { type TNever } from '../never/index';
@@ -11,6 +12,7 @@ import { type TString } from '../string/index';
11
12
  import { type TInteger } from '../integer/index';
12
13
  import { type TNumber } from '../number/index';
13
14
  import { type TEnum } from '../enum/index';
15
+ import { type TRef } from '../ref/index';
14
16
  import { TIsTemplateLiteralFinite, type TTemplateLiteral } from '../template-literal/index';
15
17
  import { Kind } from '../symbols/index';
16
18
  type TFromTemplateLiteralKeyInfinite<K extends TTemplateLiteral, T extends TSchema> = Ensure<TRecord<K, T>>;
@@ -50,7 +52,7 @@ export interface TRecord<K extends TSchema = TSchema, T extends TSchema = TSchem
50
52
  };
51
53
  additionalProperties: TAdditionalProperties;
52
54
  }
53
- export type TRecordOrObject<K extends TSchema, T extends TSchema> = K extends TTemplateLiteral ? TFromTemplateLiteralKey<K, T> : K extends TEnum<infer S> ? TFromEnumKey<S, T> : K extends TUnion<infer S> ? TFromUnionKey<S, T> : K extends TLiteral<infer S> ? TFromLiteralKey<S, T> : K extends TInteger ? TFromIntegerKey<K, T> : K extends TNumber ? TFromNumberKey<K, T> : K extends TRegExp ? TFromRegExpKey<K, T> : K extends TString ? TFromStringKey<K, T> : K extends TAny ? TFromAnyKey<K, T> : K extends TNever ? TFromNeverKey<K, T> : TNever;
55
+ export type TRecordOrObject<Key extends TSchema, Type extends TSchema> = Type extends TRef ? TComputed<'Record', [Key, Type]> : Key extends TRef ? TComputed<'Record', [Key, Type]> : Key extends TTemplateLiteral ? TFromTemplateLiteralKey<Key, Type> : Key extends TEnum<infer S> ? TFromEnumKey<S, Type> : Key extends TUnion<infer S> ? TFromUnionKey<S, Type> : Key extends TLiteral<infer S> ? TFromLiteralKey<S, Type> : Key extends TInteger ? TFromIntegerKey<Key, Type> : Key extends TNumber ? TFromNumberKey<Key, Type> : Key extends TRegExp ? TFromRegExpKey<Key, Type> : Key extends TString ? TFromStringKey<Key, Type> : Key extends TAny ? TFromAnyKey<Key, Type> : Key extends TNever ? TFromNeverKey<Key, Type> : TNever;
54
56
  /** `[Json]` Creates a Record type */
55
- export declare function Record<K extends TSchema, T extends TSchema>(K: K, T: T, options?: ObjectOptions): TRecordOrObject<K, T>;
57
+ export declare function Record<Key extends TSchema, Type extends TSchema>(key: Key, type: Type, options?: ObjectOptions): TRecordOrObject<Key, Type>;
56
58
  export {};
@@ -3,13 +3,14 @@
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.Record = Record;
5
5
  const type_1 = require("../create/type");
6
- const index_1 = require("../object/index");
7
- const index_2 = require("../never/index");
8
- const index_3 = require("../union/index");
9
- const index_4 = require("../template-literal/index");
10
- const index_5 = require("../patterns/index");
11
- const index_6 = require("../indexed/index");
12
- const index_7 = require("../symbols/index");
6
+ const index_1 = require("../computed/index");
7
+ const index_2 = require("../object/index");
8
+ const index_3 = require("../never/index");
9
+ const index_4 = require("../union/index");
10
+ const index_5 = require("../template-literal/index");
11
+ const index_6 = require("../patterns/index");
12
+ const index_7 = require("../indexed/index");
13
+ const index_8 = require("../symbols/index");
13
14
  // ------------------------------------------------------------------
14
15
  // ValueGuard
15
16
  // ------------------------------------------------------------------
@@ -24,7 +25,7 @@ const kind_1 = require("../guard/kind");
24
25
  // prettier-ignore
25
26
  function RecordCreateFromPattern(pattern, T, options) {
26
27
  return (0, type_1.CreateType)({
27
- [index_7.Kind]: 'Record',
28
+ [index_8.Kind]: 'Record',
28
29
  type: 'object',
29
30
  patternProperties: { [pattern]: T }
30
31
  }, options);
@@ -37,17 +38,17 @@ function RecordCreateFromKeys(K, T, options) {
37
38
  const Acc = {};
38
39
  for (const K2 of K)
39
40
  Acc[K2] = T;
40
- return (0, index_1.Object)(Acc, { ...options, [index_7.Hint]: 'Record' });
41
+ return (0, index_2.Object)(Acc, { ...options, [index_8.Hint]: 'Record' });
41
42
  }
42
43
  // prettier-ignore
43
44
  function FromTemplateLiteralKey(K, T, options) {
44
- return ((0, index_4.IsTemplateLiteralFinite)(K)
45
- ? RecordCreateFromKeys((0, index_6.IndexPropertyKeys)(K), T, options)
45
+ return ((0, index_5.IsTemplateLiteralFinite)(K)
46
+ ? RecordCreateFromKeys((0, index_7.IndexPropertyKeys)(K), T, options)
46
47
  : RecordCreateFromPattern(K.pattern, T, options));
47
48
  }
48
49
  // prettier-ignore
49
50
  function FromUnionKey(K, T, options) {
50
- return RecordCreateFromKeys((0, index_6.IndexPropertyKeys)((0, index_3.Union)(K)), T, options);
51
+ return RecordCreateFromKeys((0, index_7.IndexPropertyKeys)((0, index_4.Union)(K)), T, options);
51
52
  }
52
53
  // prettier-ignore
53
54
  function FromLiteralKey(K, T, options) {
@@ -59,39 +60,41 @@ function FromRegExpKey(K, T, options) {
59
60
  }
60
61
  // prettier-ignore
61
62
  function FromStringKey(K, T, options) {
62
- const pattern = (0, value_1.IsUndefined)(K.pattern) ? index_5.PatternStringExact : K.pattern;
63
+ const pattern = (0, value_1.IsUndefined)(K.pattern) ? index_6.PatternStringExact : K.pattern;
63
64
  return RecordCreateFromPattern(pattern, T, options);
64
65
  }
65
66
  // prettier-ignore
66
67
  function FromAnyKey(K, T, options) {
67
- return RecordCreateFromPattern(index_5.PatternStringExact, T, options);
68
+ return RecordCreateFromPattern(index_6.PatternStringExact, T, options);
68
69
  }
69
70
  // prettier-ignore
70
71
  function FromNeverKey(K, T, options) {
71
- return RecordCreateFromPattern(index_5.PatternNeverExact, T, options);
72
+ return RecordCreateFromPattern(index_6.PatternNeverExact, T, options);
72
73
  }
73
74
  // prettier-ignore
74
75
  function FromIntegerKey(_, T, options) {
75
- return RecordCreateFromPattern(index_5.PatternNumberExact, T, options);
76
+ return RecordCreateFromPattern(index_6.PatternNumberExact, T, options);
76
77
  }
77
78
  // prettier-ignore
78
79
  function FromNumberKey(_, T, options) {
79
- return RecordCreateFromPattern(index_5.PatternNumberExact, T, options);
80
+ return RecordCreateFromPattern(index_6.PatternNumberExact, T, options);
80
81
  }
81
82
  // ------------------------------------------------------------------
82
83
  // TRecordOrObject
83
84
  // ------------------------------------------------------------------
84
85
  /** `[Json]` Creates a Record type */
85
- function Record(K, T, options = {}) {
86
+ function Record(key, type, options = {}) {
86
87
  // prettier-ignore
87
- return ((0, kind_1.IsUnion)(K) ? FromUnionKey(K.anyOf, T, options) :
88
- (0, kind_1.IsTemplateLiteral)(K) ? FromTemplateLiteralKey(K, T, options) :
89
- (0, kind_1.IsLiteral)(K) ? FromLiteralKey(K.const, T, options) :
90
- (0, kind_1.IsInteger)(K) ? FromIntegerKey(K, T, options) :
91
- (0, kind_1.IsNumber)(K) ? FromNumberKey(K, T, options) :
92
- (0, kind_1.IsRegExp)(K) ? FromRegExpKey(K, T, options) :
93
- (0, kind_1.IsString)(K) ? FromStringKey(K, T, options) :
94
- (0, kind_1.IsAny)(K) ? FromAnyKey(K, T, options) :
95
- (0, kind_1.IsNever)(K) ? FromNeverKey(K, T, options) :
96
- (0, index_2.Never)(options));
88
+ return ((0, kind_1.IsRef)(type) ? (0, index_1.Computed)('Record', [key, type]) :
89
+ (0, kind_1.IsRef)(key) ? (0, index_1.Computed)('Record', [key, type]) :
90
+ (0, kind_1.IsUnion)(key) ? FromUnionKey(key.anyOf, type, options) :
91
+ (0, kind_1.IsTemplateLiteral)(key) ? FromTemplateLiteralKey(key, type, options) :
92
+ (0, kind_1.IsLiteral)(key) ? FromLiteralKey(key.const, type, options) :
93
+ (0, kind_1.IsInteger)(key) ? FromIntegerKey(key, type, options) :
94
+ (0, kind_1.IsNumber)(key) ? FromNumberKey(key, type, options) :
95
+ (0, kind_1.IsRegExp)(key) ? FromRegExpKey(key, type, options) :
96
+ (0, kind_1.IsString)(key) ? FromStringKey(key, type, options) :
97
+ (0, kind_1.IsAny)(key) ? FromAnyKey(key, type, options) :
98
+ (0, kind_1.IsNever)(key) ? FromNeverKey(key, type, options) :
99
+ (0, index_3.Never)(options));
97
100
  }
@@ -2,21 +2,25 @@ import type { TSchema, SchemaOptions } from '../schema/index';
2
2
  import type { Evaluate, Ensure } from '../helpers/index';
3
3
  import type { TMappedResult } from '../mapped/index';
4
4
  import { type TReadonlyOptional } from '../readonly-optional/index';
5
+ import { type TComputed } from '../computed/index';
5
6
  import { type TOptional } from '../optional/index';
6
7
  import { type TReadonly } from '../readonly/index';
7
8
  import { type TRecursive } from '../recursive/index';
9
+ import { type TObject, type TProperties } from '../object/index';
8
10
  import { type TIntersect } from '../intersect/index';
9
11
  import { type TUnion } from '../union/index';
10
- import { type TObject, type TProperties } from '../object/index';
12
+ import { type TRef } from '../ref/index';
11
13
  import { type TRequiredFromMappedResult } from './required-from-mapped-result';
12
- type TFromRest<T extends TSchema[], Acc extends TSchema[] = []> = (T extends [infer L extends TSchema, ...infer R extends TSchema[]] ? TFromRest<R, [...Acc, TRequired<L>]> : Acc);
13
- type TFromProperties<T extends TProperties> = Evaluate<{
14
- [K in keyof T]: T[K] extends (TReadonlyOptional<infer S>) ? TReadonly<S> : T[K] extends (TReadonly<infer S>) ? TReadonly<S> : T[K] extends (TOptional<infer S>) ? S : T[K];
14
+ type TFromComputed<Target extends string, Parameters extends TSchema[]> = Ensure<TComputed<'Required', [TComputed<Target, Parameters>]>>;
15
+ type TFromRef<Ref extends string> = Ensure<TComputed<'Required', [TRef<Ref>]>>;
16
+ type TFromProperties<Properties extends TProperties> = Evaluate<{
17
+ [K in keyof Properties]: Properties[K] extends (TReadonlyOptional<infer S>) ? TReadonly<S> : Properties[K] extends (TReadonly<infer S>) ? TReadonly<S> : Properties[K] extends (TOptional<infer S>) ? S : Properties[K];
15
18
  }>;
16
- type TFromObject<T extends TObject, Properties extends TProperties = T['properties']> = Ensure<TObject<(TFromProperties<Properties>)>>;
17
- export type TRequired<T extends TSchema> = (T extends TRecursive<infer S extends TSchema> ? TRecursive<TRequired<S>> : T extends TIntersect<infer S extends TSchema[]> ? TIntersect<TFromRest<S>> : T extends TUnion<infer S extends TSchema[]> ? TUnion<TFromRest<S>> : T extends TObject<infer S extends TProperties> ? TFromObject<TObject<S>> : TObject<{}>);
19
+ type TFromObject<Type extends TObject, Properties extends TProperties = Type['properties']> = Ensure<TObject<(TFromProperties<Properties>)>>;
20
+ type TFromRest<Types extends TSchema[], Result extends TSchema[] = []> = (Types extends [infer L extends TSchema, ...infer R extends TSchema[]] ? TFromRest<R, [...Result, TRequired<L>]> : Result);
21
+ export type TRequired<Type extends TSchema> = (Type extends TRecursive<infer Type extends TSchema> ? TRecursive<TRequired<Type>> : Type extends TComputed<infer Target extends string, infer Parameters extends TSchema[]> ? TFromComputed<Target, Parameters> : Type extends TRef<infer Ref extends string> ? TFromRef<Ref> : Type extends TIntersect<infer Types extends TSchema[]> ? TIntersect<TFromRest<Types>> : Type extends TUnion<infer Types extends TSchema[]> ? TUnion<TFromRest<Types>> : Type extends TObject<infer Properties extends TProperties> ? TFromObject<TObject<Properties>> : TObject<{}>);
18
22
  /** `[Json]` Constructs a type where all properties are required */
19
- export declare function Required<T extends TMappedResult>(T: T, options?: SchemaOptions): TRequiredFromMappedResult<T>;
23
+ export declare function Required<MappedResult extends TMappedResult>(type: MappedResult, options?: SchemaOptions): TRequiredFromMappedResult<MappedResult>;
20
24
  /** `[Json]` Constructs a type where all properties are required */
21
- export declare function Required<T extends TSchema>(T: T, options?: SchemaOptions): TRequired<T>;
25
+ export declare function Required<Type extends TSchema>(type: Type, options?: SchemaOptions): TRequired<Type>;
22
26
  export {};