typebox 1.1.39 → 1.2.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 (107) 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 +6 -9
  78. package/build/type/script/mapping.mjs +16 -16
  79. package/build/type/script/parser.d.mts +5 -5
  80. package/build/type/script/parser.mjs +4 -4
  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/number.d.mts +1 -1
  87. package/build/type/types/number.mjs +1 -1
  88. package/build/type/types/record.d.mts +1 -1
  89. package/build/type/types/static.d.mts +2 -1
  90. package/build/typebox.d.mts +2 -1
  91. package/build/typebox.mjs +2 -1
  92. package/build/value/clean/from_intersect.mjs +2 -2
  93. package/build/value/clone/clone.mjs +17 -3
  94. package/build/value/convert/from_enum.mjs +3 -4
  95. package/build/value/convert/from_template_literal.d.mts +1 -1
  96. package/build/value/convert/from_template_literal.mjs +2 -3
  97. package/build/value/create/from_enum.mjs +2 -2
  98. package/build/value/repair/from_enum.mjs +2 -3
  99. package/package.json +1 -1
  100. package/readme.md +51 -20
  101. package/build/type/action/options.d.mts +0 -11
  102. package/build/type/action/options.mjs +0 -11
  103. package/build/type/engine/enum/enum_to_union.d.mts +0 -14
  104. package/build/type/engine/enum/enum_to_union.mjs +0 -24
  105. package/build/type/engine/options/instantiate.d.mts +0 -8
  106. /package/build/type/engine/{options → with}/index.d.mts +0 -0
  107. /package/build/type/engine/{options → with}/index.mjs +0 -0
@@ -46,7 +46,7 @@ export const KeyOf = (input) => If(If(If(Token.Const('keyof', input), ([_0, inpu
46
46
  export const IndexArray_0 = (input, result = []) => If(If(If(Token.Const('[', input), ([_0, input]) => If(Type(input), ([_1, input]) => If(Token.Const(']', input), ([_2, input]) => [[_0, _1, _2], input]))), ([_0, input]) => [_0, input], () => If(If(Token.Const('[', input), ([_0, input]) => If(Token.Const(']', input), ([_1, input]) => [[_0, _1], input])), ([_0, input]) => [_0, input], () => [])), ([_0, input]) => IndexArray_0(input, [...result, _0]), () => [result, input]);
47
47
  export const IndexArray = (input) => If(IndexArray_0(input), ([_0, input]) => [S.IndexArrayMapping(_0), input]);
48
48
  export const Extends = (input) => If(If(If(Token.Const('extends', input), ([_0, input]) => If(Type(input), ([_1, input]) => If(Token.Const('?', input), ([_2, input]) => If(Type(input), ([_3, input]) => If(Token.Const(':', input), ([_4, input]) => If(Type(input), ([_5, input]) => [[_0, _1, _2, _3, _4, _5], input])))))), ([_0, input]) => [_0, input], () => If([[], input], ([_0, input]) => [_0, input], () => [])), ([_0, input]) => [S.ExtendsMapping(_0), input]);
49
- export const Base = (input) => If(If(If(Token.Const('(', input), ([_0, input]) => If(Type(input), ([_1, input]) => If(Token.Const(')', input), ([_2, input]) => [[_0, _1, _2], input]))), ([_0, input]) => [_0, input], () => If(Keyword(input), ([_0, input]) => [_0, input], () => If(_Object_(input), ([_0, input]) => [_0, input], () => If(Tuple(input), ([_0, input]) => [_0, input], () => If(TemplateLiteral(input), ([_0, input]) => [_0, input], () => If(Literal(input), ([_0, input]) => [_0, input], () => If(Constructor(input), ([_0, input]) => [_0, input], () => If(_Function_(input), ([_0, input]) => [_0, input], () => If(Mapped(input), ([_0, input]) => [_0, input], () => If(Options(input), ([_0, input]) => [_0, input], () => If(GenericCall(input), ([_0, input]) => [_0, input], () => If(Reference(input), ([_0, input]) => [_0, input], () => [])))))))))))), ([_0, input]) => [S.BaseMapping(_0), input]);
49
+ export const Base = (input) => If(If(If(Token.Const('(', input), ([_0, input]) => If(Type(input), ([_1, input]) => If(Token.Const(')', input), ([_2, input]) => [[_0, _1, _2], input]))), ([_0, input]) => [_0, input], () => If(Keyword(input), ([_0, input]) => [_0, input], () => If(_Object_(input), ([_0, input]) => [_0, input], () => If(Tuple(input), ([_0, input]) => [_0, input], () => If(TemplateLiteral(input), ([_0, input]) => [_0, input], () => If(Literal(input), ([_0, input]) => [_0, input], () => If(Constructor(input), ([_0, input]) => [_0, input], () => If(_Function_(input), ([_0, input]) => [_0, input], () => If(Mapped(input), ([_0, input]) => [_0, input], () => If(Dependent(input), ([_0, input]) => [_0, input], () => If(GenericCall(input), ([_0, input]) => [_0, input], () => If(Reference(input), ([_0, input]) => [_0, input], () => [])))))))))))), ([_0, input]) => [S.BaseMapping(_0), input]);
50
50
  export const With = (input) => If(If(If(Token.Const('with', input), ([_0, input]) => If(JsonObject(input), ([_1, input]) => [[_0, _1], input])), ([_0, input]) => [_0, input], () => If([[], input], ([_0, input]) => [_0, input], () => [])), ([_0, input]) => [S.WithMapping(_0), input]);
51
51
  export const Factor = (input) => If(If(KeyOf(input), ([_0, input]) => If(Base(input), ([_1, input]) => If(IndexArray(input), ([_2, input]) => If(Extends(input), ([_3, input]) => If(With(input), ([_4, input]) => [[_0, _1, _2, _3, _4], input]))))), ([_0, input]) => [S.FactorMapping(_0), input]);
52
52
  export const ExprTermTail = (input) => If(If(If(Token.Const('&', input), ([_0, input]) => If(Factor(input), ([_1, input]) => If(ExprTermTail(input), ([_2, input]) => [[_0, _1, _2], input]))), ([_0, input]) => [_0, input], () => If([[], input], ([_0, input]) => [_0, input], () => [])), ([_0, input]) => [S.ExprTermTailMapping(_0), input]);
@@ -94,8 +94,8 @@ export const MappedReadonly = (input) => If(If(If(Token.Const('+', input), ([_0,
94
94
  export const MappedOptional = (input) => If(If(If(Token.Const('+', input), ([_0, input]) => If(Token.Const('?', input), ([_1, input]) => [[_0, _1], input])), ([_0, input]) => [_0, input], () => If(If(Token.Const('-', input), ([_0, input]) => If(Token.Const('?', input), ([_1, input]) => [[_0, _1], input])), ([_0, input]) => [_0, input], () => If(If(Token.Const('?', input), ([_0, input]) => [[_0], input]), ([_0, input]) => [_0, input], () => If([[], input], ([_0, input]) => [_0, input], () => [])))), ([_0, input]) => [S.MappedOptionalMapping(_0), input]);
95
95
  export const MappedAs = (input) => If(If(If(Token.Const('as', input), ([_0, input]) => If(Type(input), ([_1, input]) => [[_0, _1], input])), ([_0, input]) => [_0, input], () => If([[], input], ([_0, input]) => [_0, input], () => [])), ([_0, input]) => [S.MappedAsMapping(_0), input]);
96
96
  export const Mapped = (input) => If(If(Token.Const('{', input), ([_0, input]) => If(MappedReadonly(input), ([_1, input]) => If(Token.Const('[', input), ([_2, input]) => If(Token.Ident(input), ([_3, input]) => If(Token.Const('in', input), ([_4, input]) => If(Type(input), ([_5, input]) => If(MappedAs(input), ([_6, input]) => If(Token.Const(']', input), ([_7, input]) => If(MappedOptional(input), ([_8, input]) => If(Token.Const(':', input), ([_9, input]) => If(Type(input), ([_10, input]) => If(OptionalSemiColon(input), ([_11, input]) => If(Token.Const('}', input), ([_12, input]) => [[_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12], input]))))))))))))), ([_0, input]) => [S.MappedMapping(_0), input]);
97
+ export const Dependent = (input) => If(If(If(Token.Const('if', input), ([_0, input]) => If(Type(input), ([_1, input]) => If(Token.Const('then', input), ([_2, input]) => If(Type(input), ([_3, input]) => If(Token.Const('else', input), ([_4, input]) => If(Type(input), ([_5, input]) => [[_0, _1, _2, _3, _4, _5], input])))))), ([_0, input]) => [_0, input], () => If(If(Token.Const('if', input), ([_0, input]) => If(Type(input), ([_1, input]) => If(Token.Const('then', input), ([_2, input]) => If(Type(input), ([_3, input]) => [[_0, _1, _2, _3], input])))), ([_0, input]) => [_0, input], () => [])), ([_0, input]) => [S.DependentMapping(_0), input]);
97
98
  export const Reference = (input) => If(Token.Ident(input), ([_0, input]) => [S.ReferenceMapping(_0), input]);
98
- export const Options = (input) => If(If(Token.Const('Options', input), ([_0, input]) => If(Token.Const('<', input), ([_1, input]) => If(Type(input), ([_2, input]) => If(Token.Const(',', input), ([_3, input]) => If(JsonObject(input), ([_4, input]) => If(Token.Const('>', input), ([_5, input]) => [[_0, _1, _2, _3, _4, _5], input])))))), ([_0, input]) => [S.OptionsMapping(_0), input]);
99
99
  export const JsonNumber = (input) => If(Token.Number(input), ([_0, input]) => [S.JsonNumberMapping(_0), input]);
100
100
  export const JsonBoolean = (input) => If(If(Token.Const('true', input), ([_0, input]) => [_0, input], () => If(Token.Const('false', input), ([_0, input]) => [_0, input], () => [])), ([_0, input]) => [S.JsonBooleanMapping(_0), input]);
101
101
  export const JsonString = (input) => If(Token.String(['\"', '\''], input), ([_0, input]) => [S.JsonStringMapping(_0), input]);
@@ -110,10 +110,10 @@ export const JsonArray = (input) => If(If(Token.Const('[', input), ([_0, input])
110
110
  export const Json = (input) => If(If(JsonNumber(input), ([_0, input]) => [_0, input], () => If(JsonBoolean(input), ([_0, input]) => [_0, input], () => If(JsonString(input), ([_0, input]) => [_0, input], () => If(JsonNull(input), ([_0, input]) => [_0, input], () => If(JsonObject(input), ([_0, input]) => [_0, input], () => If(JsonArray(input), ([_0, input]) => [_0, input], () => [])))))), ([_0, input]) => [S.JsonMapping(_0), input]);
111
111
  export const PatternBigInt = (input) => If(Token.Const('-?(?:0|[1-9][0-9]*)n', input), ([_0, input]) => [S.PatternBigIntMapping(_0), input]);
112
112
  export const PatternString = (input) => If(Token.Const('.*', input), ([_0, input]) => [S.PatternStringMapping(_0), input]);
113
- export const PatternNumber = (input) => If(Token.Const('-?(?:0|[1-9][0-9]*)(?:.[0-9]+)?', input), ([_0, input]) => [S.PatternNumberMapping(_0), input]);
113
+ export const PatternNumber = (input) => If(Token.Const('-?(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?', input), ([_0, input]) => [S.PatternNumberMapping(_0), input]);
114
114
  export const PatternInteger = (input) => If(Token.Const('-?(?:0|[1-9][0-9]*)', input), ([_0, input]) => [S.PatternIntegerMapping(_0), input]);
115
115
  export const PatternNever = (input) => If(Token.Const('(?!)', input), ([_0, input]) => [S.PatternNeverMapping(_0), input]);
116
- export const PatternText = (input) => If(Token.Until_1(['-?(?:0|[1-9][0-9]*)n', '.*', '-?(?:0|[1-9][0-9]*)(?:.[0-9]+)?', '-?(?:0|[1-9][0-9]*)', '(?!)', '(', ')', '$', '|'], input), ([_0, input]) => [S.PatternTextMapping(_0), input]);
116
+ export const PatternText = (input) => If(Token.Until_1(['-?(?:0|[1-9][0-9]*)n', '.*', '-?(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?', '-?(?:0|[1-9][0-9]*)', '(?!)', '(', ')', '$', '|'], input), ([_0, input]) => [S.PatternTextMapping(_0), input]);
117
117
  export const PatternBase = (input) => If(If(PatternBigInt(input), ([_0, input]) => [_0, input], () => If(PatternString(input), ([_0, input]) => [_0, input], () => If(PatternNumber(input), ([_0, input]) => [_0, input], () => If(PatternInteger(input), ([_0, input]) => [_0, input], () => If(PatternNever(input), ([_0, input]) => [_0, input], () => If(PatternGroup(input), ([_0, input]) => [_0, input], () => If(PatternText(input), ([_0, input]) => [_0, input], () => []))))))), ([_0, input]) => [S.PatternBaseMapping(_0), input]);
118
118
  export const PatternGroup = (input) => If(If(Token.Const('(', input), ([_0, input]) => If(PatternBody(input), ([_1, input]) => If(Token.Const(')', input), ([_2, input]) => [[_0, _1, _2], input]))), ([_0, input]) => [S.PatternGroupMapping(_0), input]);
119
119
  export const PatternUnion = (input) => If(If(If(PatternTerm(input), ([_0, input]) => If(Token.Const('|', input), ([_1, input]) => If(PatternUnion(input), ([_2, input]) => [[_0, _1, _2], input]))), ([_0, input]) => [_0, input], () => If(If(PatternTerm(input), ([_0, input]) => [[_0], input]), ([_0, input]) => [_0, input], () => If([[], input], ([_0, input]) => [_0, input], () => []))), ([_0, input]) => [S.PatternUnionMapping(_0), input]);
@@ -0,0 +1,17 @@
1
+ import { type StaticType, type StaticDirection } from './static.mjs';
2
+ import { type TSchema, type TSchemaOptions } from './schema.mjs';
3
+ import { type TProperties } from './properties.mjs';
4
+ export type StaticDependent<Stack extends string[], Direction extends StaticDirection, Context extends TProperties, This extends TProperties, If extends TSchema, Then extends TSchema, Else extends TSchema, StaticIf extends unknown = StaticType<Stack, Direction, Context, This, If>, StaticThen extends unknown = StaticType<Stack, Direction, Context, This, Then>, StaticElse extends unknown = StaticType<Stack, Direction, Context, This, Else>, Result extends unknown = (StaticIf & StaticThen) | Exclude<StaticElse, StaticIf>> = Result;
5
+ /** Represents a Dependent Type */
6
+ export interface TDependent<If extends TSchema = TSchema, Then extends TSchema = TSchema, Else extends TSchema = TSchema> extends TSchema {
7
+ '~kind': 'Dependent';
8
+ if: If;
9
+ then: Then;
10
+ else: Else;
11
+ }
12
+ /** Creates a Dependent type */
13
+ export declare function Dependent<If extends TSchema, Then extends TSchema, Else extends TSchema>(if_: If, then_: Then, else_: Else, options?: TSchemaOptions): TDependent<If, Then, Else>;
14
+ /** Returns true if the given value is TDependent. */
15
+ export declare function IsDependent(value: unknown): value is TDependent;
16
+ /** Extracts options from a IsDependent. */
17
+ export declare function DependentOptions(type: TDependent): TSchemaOptions;
@@ -0,0 +1,24 @@
1
+ // deno-fmt-ignore-file
2
+ import { Memory } from '../../system/memory/index.mjs';
3
+ import { IsKind } from './schema.mjs';
4
+ // ------------------------------------------------------------------
5
+ // Factory
6
+ // ------------------------------------------------------------------
7
+ /** Creates a Dependent type */
8
+ export function Dependent(if_, then_, else_, options = {}) {
9
+ return Memory.Create({ '~kind': 'Dependent' }, { if: if_, then: then_, else: else_ }, options);
10
+ }
11
+ // ------------------------------------------------------------------
12
+ // Guard
13
+ // ------------------------------------------------------------------
14
+ /** Returns true if the given value is TDependent. */
15
+ export function IsDependent(value) {
16
+ return IsKind(value, 'Dependent');
17
+ }
18
+ // ------------------------------------------------------------------
19
+ // Options
20
+ // ------------------------------------------------------------------
21
+ /** Extracts options from a IsDependent. */
22
+ export function DependentOptions(type) {
23
+ return Memory.Discard(type, ['~kind', 'if', 'then', 'else']);
24
+ }
@@ -2,7 +2,7 @@ import { type TSchema, type TSchemaOptions } from './schema.mjs';
2
2
  import { type TTypeScriptEnumLike } from '../engine/enum/typescript_enum_to_enum_values.mjs';
3
3
  import { type TTypeScriptEnumToEnumValues } from '../engine/enum/typescript_enum_to_enum_values.mjs';
4
4
  export type StaticEnum<Values extends TEnumValue[]> = (Values[number]);
5
- export type TEnumValue = string | number | null;
5
+ export type TEnumValue = string | number;
6
6
  /** Represents an Enum type. */
7
7
  export interface TEnum<Values extends TEnumValue[] = TEnumValue[]> extends TSchema {
8
8
  '~kind': 'Enum';
@@ -17,6 +17,7 @@ export * from './enum.mjs';
17
17
  export * from './function.mjs';
18
18
  export * from './generic.mjs';
19
19
  export * from './identifier.mjs';
20
+ export * from './dependent.mjs';
20
21
  export * from './infer.mjs';
21
22
  export * from './integer.mjs';
22
23
  export * from './intersect.mjs';
@@ -23,6 +23,7 @@ export * from './enum.mjs';
23
23
  export * from './function.mjs';
24
24
  export * from './generic.mjs';
25
25
  export * from './identifier.mjs';
26
+ export * from './dependent.mjs';
26
27
  export * from './infer.mjs';
27
28
  export * from './integer.mjs';
28
29
  export * from './intersect.mjs';
@@ -1,5 +1,5 @@
1
1
  import { type TSchema, type TNumberOptions } from './schema.mjs';
2
- export declare const NumberPattern = "-?(?:0|[1-9][0-9]*)(?:.[0-9]+)?";
2
+ export declare const NumberPattern = "-?(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?";
3
3
  export type StaticNumber = number;
4
4
  /** Represents a Number type. */
5
5
  export interface TNumber extends TSchema {
@@ -4,7 +4,7 @@ import { IsKind } from './schema.mjs';
4
4
  // ------------------------------------------------------------------
5
5
  // Pattern
6
6
  // ------------------------------------------------------------------
7
- export const NumberPattern = '-?(?:0|[1-9][0-9]*)(?:\.[0-9]+)?';
7
+ export const NumberPattern = '-?(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?';
8
8
  // ------------------------------------------------------------------
9
9
  // Factory
10
10
  // ------------------------------------------------------------------
@@ -14,7 +14,7 @@ export type TStringKey = typeof StringKey;
14
14
  export type TIntegerKey = typeof IntegerKey;
15
15
  export type TNumberKey = typeof NumberKey;
16
16
  export declare const IntegerKey = "^-?(?:0|[1-9][0-9]*)$";
17
- export declare const NumberKey = "^-?(?:0|[1-9][0-9]*)(?:.[0-9]+)?$";
17
+ export declare const NumberKey = "^-?(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?$";
18
18
  export declare const StringKey = "^.*$";
19
19
  export interface TRecord<Key extends string = string, Value extends TSchema = TSchema> extends TSchema {
20
20
  '~kind': 'Record';
@@ -10,6 +10,7 @@ import type { StaticCyclic, TCyclic } from './cyclic.mjs';
10
10
  import type { StaticEnum, TEnum, TEnumValue } from './enum.mjs';
11
11
  import type { StaticFunction, TFunction } from './function.mjs';
12
12
  import type { StaticInteger, TInteger } from './integer.mjs';
13
+ import type { StaticDependent, TDependent } from './dependent.mjs';
13
14
  import type { StaticIntersect, TIntersect } from './intersect.mjs';
14
15
  import type { StaticIterator, TIterator } from './iterator.mjs';
15
16
  import type { StaticLiteral, TLiteral, TLiteralValue } from './literal.mjs';
@@ -37,7 +38,7 @@ export type StaticEvaluate<T> = {
37
38
  [K in keyof T]: T[K];
38
39
  } & {};
39
40
  export type StaticDirection = 'Encode' | 'Decode';
40
- export type StaticType<Stack extends string[], Direction extends StaticDirection, Context extends TProperties, This extends TProperties, Type extends TSchema> = (Type extends TCodec<infer Type extends TSchema, infer Decoded extends unknown> ? StaticCodec<Stack, Direction, Context, This, Type, Decoded> : Type extends TAny ? StaticAny : Type extends TArray<infer Items extends TSchema> ? StaticArray<Stack, Direction, Context, This, Type, Items> : Type extends TAsyncIterator<infer Type extends TSchema> ? StaticAsyncIterator<Stack, Direction, Context, This, Type> : Type extends Base<infer Value extends unknown> ? StaticBase<Value> : Type extends TBigInt ? StaticBigInt : Type extends TBoolean ? StaticBoolean : Type extends TConstructor<infer Parameters extends TSchema[], infer ReturnType extends TSchema> ? StaticConstructor<Stack, Direction, Context, This, Parameters, ReturnType> : Type extends TEnum<infer Values extends TEnumValue[]> ? StaticEnum<Values> : Type extends TFunction<infer Parameters extends TSchema[], infer ReturnType extends TSchema> ? StaticFunction<Stack, Direction, Context, This, Parameters, ReturnType> : Type extends TInteger ? StaticInteger : Type extends TIntersect<infer Types extends TSchema[]> ? StaticIntersect<Stack, Direction, Context, This, Types> : Type extends TIterator<infer Types extends TSchema> ? StaticIterator<Stack, Direction, Context, This, Types> : Type extends TLiteral<infer Value extends TLiteralValue> ? StaticLiteral<Value> : Type extends TNever ? StaticNever : Type extends TNull ? StaticNull : Type extends TNumber ? StaticNumber : Type extends TObject<infer Properties extends TProperties> ? StaticObject<Stack, Direction, Context, This, Properties> : Type extends TPromise<infer Type extends TSchema> ? StaticPromise<Stack, Direction, Context, This, Type> : Type extends TRecord<infer Key extends string, infer Value extends TSchema> ? StaticRecord<Stack, Direction, Context, This, Key, Value> : Type extends TCyclic<infer Defs extends TProperties, infer Ref extends string> ? StaticCyclic<Stack, Direction, Context, This, Defs, Ref> : Type extends TRef<infer Ref extends string> ? StaticRef<Stack, Direction, Context, This, Ref> : Type extends TString ? StaticString : Type extends TSymbol ? StaticSymbol : Type extends TTemplateLiteral<infer Pattern extends string> ? StaticTemplateLiteral<Pattern> : Type extends TThis ? StaticThis<Stack, Direction, Context, This> : Type extends TTuple<infer Items extends TSchema[]> ? StaticTuple<Stack, Direction, Context, This, Type, Items> : Type extends TUndefined ? StaticUndefined : Type extends TUnion<infer Types extends TSchema[]> ? StaticUnion<Stack, Direction, Context, This, Types> : Type extends TUnknown ? StaticUnknown : Type extends TUnsafe<infer Type extends unknown> ? StaticUnsafe<Type> : Type extends TVoid ? StaticVoid : XStatic<Type>);
41
+ export type StaticType<Stack extends string[], Direction extends StaticDirection, Context extends TProperties, This extends TProperties, Type extends TSchema> = (Type extends TCodec<infer Type extends TSchema, infer Decoded extends unknown> ? StaticCodec<Stack, Direction, Context, This, Type, Decoded> : Type extends TAny ? StaticAny : Type extends TArray<infer Items extends TSchema> ? StaticArray<Stack, Direction, Context, This, Type, Items> : Type extends TAsyncIterator<infer Type extends TSchema> ? StaticAsyncIterator<Stack, Direction, Context, This, Type> : Type extends Base<infer Value extends unknown> ? StaticBase<Value> : Type extends TBigInt ? StaticBigInt : Type extends TBoolean ? StaticBoolean : Type extends TConstructor<infer Parameters extends TSchema[], infer ReturnType extends TSchema> ? StaticConstructor<Stack, Direction, Context, This, Parameters, ReturnType> : Type extends TEnum<infer Values extends TEnumValue[]> ? StaticEnum<Values> : Type extends TFunction<infer Parameters extends TSchema[], infer ReturnType extends TSchema> ? StaticFunction<Stack, Direction, Context, This, Parameters, ReturnType> : Type extends TDependent<infer If extends TSchema, infer Then extends TSchema, infer Else extends TSchema> ? StaticDependent<Stack, Direction, Context, This, If, Then, Else> : Type extends TInteger ? StaticInteger : Type extends TIntersect<infer Types extends TSchema[]> ? StaticIntersect<Stack, Direction, Context, This, Types> : Type extends TIterator<infer Types extends TSchema> ? StaticIterator<Stack, Direction, Context, This, Types> : Type extends TLiteral<infer Value extends TLiteralValue> ? StaticLiteral<Value> : Type extends TNever ? StaticNever : Type extends TNull ? StaticNull : Type extends TNumber ? StaticNumber : Type extends TObject<infer Properties extends TProperties> ? StaticObject<Stack, Direction, Context, This, Properties> : Type extends TPromise<infer Type extends TSchema> ? StaticPromise<Stack, Direction, Context, This, Type> : Type extends TRecord<infer Key extends string, infer Value extends TSchema> ? StaticRecord<Stack, Direction, Context, This, Key, Value> : Type extends TCyclic<infer Defs extends TProperties, infer Ref extends string> ? StaticCyclic<Stack, Direction, Context, This, Defs, Ref> : Type extends TRef<infer Ref extends string> ? StaticRef<Stack, Direction, Context, This, Ref> : Type extends TString ? StaticString : Type extends TSymbol ? StaticSymbol : Type extends TTemplateLiteral<infer Pattern extends string> ? StaticTemplateLiteral<Pattern> : Type extends TThis ? StaticThis<Stack, Direction, Context, This> : Type extends TTuple<infer Items extends TSchema[]> ? StaticTuple<Stack, Direction, Context, This, Type, Items> : Type extends TUndefined ? StaticUndefined : Type extends TUnion<infer Types extends TSchema[]> ? StaticUnion<Stack, Direction, Context, This, Types> : Type extends TUnknown ? StaticUnknown : Type extends TUnsafe<infer Type extends unknown> ? StaticUnsafe<Type> : Type extends TVoid ? StaticVoid : XStatic<Type>);
41
42
  /** Infers a static type from a TypeBox type using Parse logic. */
42
43
  export type StaticParse<Type extends TSchema, Context extends TProperties = {}, Result extends unknown = StaticType<[], 'Encode', Context, {}, Type>> = Result;
43
44
  /** Infers a static type from a TypeBox type using Decode logic. */
@@ -17,7 +17,6 @@ export { Mapped, type TMapped, type TMappedDeferred } from './type/action/mapped
17
17
  export { Module, type TModule, type TModuleDeferred } from './type/action/module.mjs';
18
18
  export { NonNullable, type TNonNullable, type TNonNullableDeferred } from './type/action/non_nullable.mjs';
19
19
  export { Omit, type TOmit, type TOmitDeferred } from './type/action/omit.mjs';
20
- export { Options, type TOptions } from './type/action/options.mjs';
21
20
  export { Parameters, type TParameters, type TParametersDeferred } from './type/action/parameters.mjs';
22
21
  export { Partial, type TPartial, type TPartialDeferred } from './type/action/partial.mjs';
23
22
  export { Pick, type TPick, type TPickDeferred } from './type/action/pick.mjs';
@@ -26,6 +25,7 @@ export { Required, type TRequired, type TRequiredDeferred } from './type/action/
26
25
  export { ReturnType, type TReturnType, type TReturnTypeDeferred } from './type/action/return_type.mjs';
27
26
  export { type TUncapitalize, type TUncapitalizeDeferred, Uncapitalize } from './type/action/uncapitalize.mjs';
28
27
  export { type TUppercase, type TUppercaseDeferred, Uppercase } from './type/action/uppercase.mjs';
28
+ export { Options, type TOptions, type TWith, With } from './type/action/with.mjs';
29
29
  export { Codec, Decode, DecodeBuilder, Encode, EncodeBuilder, IsCodec, type TCodec } from './type/types/_codec.mjs';
30
30
  export { Immutable, IsImmutable, type TImmutable } from './type/types/_immutable.mjs';
31
31
  export { IsOptional, Optional, type TOptional } from './type/types/_optional.mjs';
@@ -44,6 +44,7 @@ export { Enum, IsEnum, type TEnum, type TEnumValue } from './type/types/enum.mjs
44
44
  export { Function, IsFunction, type TFunction } from './type/types/function.mjs';
45
45
  export { Generic, IsGeneric, type TGeneric } from './type/types/generic.mjs';
46
46
  export { Identifier, IsIdentifier, type TIdentifier } from './type/types/identifier.mjs';
47
+ export { Dependent, IsDependent, type TDependent } from './type/types/dependent.mjs';
47
48
  export { Infer, IsInfer, type TInfer } from './type/types/infer.mjs';
48
49
  export { Integer, IsInteger, type TInteger } from './type/types/integer.mjs';
49
50
  export { Intersect, IsIntersect, type TIntersect } from './type/types/intersect.mjs';
package/build/typebox.mjs CHANGED
@@ -29,7 +29,6 @@ export { Mapped } from './type/action/mapped.mjs';
29
29
  export { Module } from './type/action/module.mjs';
30
30
  export { NonNullable } from './type/action/non_nullable.mjs';
31
31
  export { Omit } from './type/action/omit.mjs';
32
- export { Options } from './type/action/options.mjs';
33
32
  export { Parameters } from './type/action/parameters.mjs';
34
33
  export { Partial } from './type/action/partial.mjs';
35
34
  export { Pick } from './type/action/pick.mjs';
@@ -38,6 +37,7 @@ export { Required } from './type/action/required.mjs';
38
37
  export { ReturnType } from './type/action/return_type.mjs';
39
38
  export { Uncapitalize } from './type/action/uncapitalize.mjs';
40
39
  export { Uppercase } from './type/action/uppercase.mjs';
40
+ export { Options, With } from './type/action/with.mjs';
41
41
  // ------------------------------------------------------------------
42
42
  // Extension
43
43
  // ------------------------------------------------------------------
@@ -62,6 +62,7 @@ export { Enum, IsEnum } from './type/types/enum.mjs';
62
62
  export { Function, IsFunction } from './type/types/function.mjs';
63
63
  export { Generic, IsGeneric } from './type/types/generic.mjs';
64
64
  export { Identifier, IsIdentifier } from './type/types/identifier.mjs';
65
+ export { Dependent, IsDependent } from './type/types/dependent.mjs';
65
66
  export { Infer, IsInfer } from './type/types/infer.mjs';
66
67
  export { Integer, IsInteger } from './type/types/integer.mjs';
67
68
  export { Intersect, IsIntersect } from './type/types/intersect.mjs';
@@ -1,5 +1,5 @@
1
1
  // deno-fmt-ignore-file
2
- import { Evaluate, Instantiate, IsObject, Options } from '../../type/index.mjs';
2
+ import { Evaluate, Instantiate, IsObject, With } from '../../type/index.mjs';
3
3
  import { Guard } from '../../guard/index.mjs';
4
4
  import { FromType } from './from_type.mjs';
5
5
  // ------------------------------------------------------------------
@@ -13,7 +13,7 @@ function EvaluateIntersection(context, type) {
13
13
  const instantiated = Instantiate(context, type);
14
14
  const evaluated = Evaluate(instantiated);
15
15
  return IsObject(evaluated)
16
- ? Options(evaluated, additionalProperties)
16
+ ? With(evaluated, additionalProperties)
17
17
  : evaluated;
18
18
  }
19
19
  // ------------------------------------------------------------------
@@ -1,5 +1,6 @@
1
1
  // deno-fmt-ignore-file
2
2
  import { Guard, GlobalsGuard } from '../../guard/index.mjs';
3
+ import { Clone as SystemClone } from '../../system/memory/clone.mjs';
3
4
  // ------------------------------------------------------------------
4
5
  // ClassInstance
5
6
  //
@@ -14,6 +15,19 @@ function FromClassInstance(value) {
14
15
  return value; // atomic
15
16
  }
16
17
  // ------------------------------------------------------------------
18
+ // TypeInstance
19
+ //
20
+ // TypeBox types have non-enumerable properties that should be
21
+ // retained on Clone. We need to use a SystemClone for this
22
+ // to ensure the non-enumerable properties are preserved.
23
+ // ------------------------------------------------------------------
24
+ function IsTypeInstance(value) {
25
+ return Guard.HasPropertyKey(value, '~kind');
26
+ }
27
+ function FromTypeInstance(value) {
28
+ return SystemClone(value);
29
+ }
30
+ // ------------------------------------------------------------------
17
31
  // ObjectInstance
18
32
  // ------------------------------------------------------------------
19
33
  function FromObjectInstance(value) {
@@ -32,9 +46,9 @@ function FromObjectInstance(value) {
32
46
  // Object
33
47
  // ------------------------------------------------------------------
34
48
  function FromObject(value) {
35
- return (Guard.IsClassInstance(value)
36
- ? FromClassInstance(value)
37
- : FromObjectInstance(value));
49
+ return (Guard.IsClassInstance(value) ? FromClassInstance(value) :
50
+ IsTypeInstance(value) ? FromTypeInstance(value) :
51
+ FromObjectInstance(value));
38
52
  }
39
53
  // ------------------------------------------------------------------
40
54
  // Array
@@ -1,7 +1,6 @@
1
1
  // deno-fmt-ignore-file
2
- import { EnumToUnion } from '../../type/engine/enum/index.mjs';
3
- import { FromUnion } from './from_union.mjs';
2
+ import { Evaluate } from '../../type/index.mjs';
3
+ import { FromType } from './from_type.mjs';
4
4
  export function FromEnum(context, type, value) {
5
- const union = EnumToUnion(type);
6
- return FromUnion(context, union, value);
5
+ return FromType(context, Evaluate(type), value);
7
6
  }
@@ -1,2 +1,2 @@
1
- import type { TTemplateLiteral, TProperties } from '../../type/index.mjs';
1
+ import { type TTemplateLiteral, type TProperties } from '../../type/index.mjs';
2
2
  export declare function FromTemplateLiteral(context: TProperties, type: TTemplateLiteral, value: unknown): unknown;
@@ -1,7 +1,6 @@
1
1
  // deno-fmt-ignore-file
2
- import { TemplateLiteralDecode } from '../../type/engine/template_literal/index.mjs';
2
+ import { Evaluate } from '../../type/index.mjs';
3
3
  import { FromType } from './from_type.mjs';
4
4
  export function FromTemplateLiteral(context, type, value) {
5
- const decoded = TemplateLiteralDecode(type.pattern);
6
- return FromType(context, decoded, value);
5
+ return FromType(context, Evaluate(type), value);
7
6
  }
@@ -1,6 +1,6 @@
1
1
  // deno-fmt-ignore-file
2
- import { EnumToUnion } from '../../type/engine/enum/index.mjs';
2
+ import { Evaluate } from '../../type/index.mjs';
3
3
  import { FromType } from './from_type.mjs';
4
4
  export function FromEnum(context, type) {
5
- return FromType(context, EnumToUnion(type));
5
+ return FromType(context, Evaluate(type));
6
6
  }
@@ -1,7 +1,6 @@
1
1
  // deno-fmt-ignore-file
2
- import { EnumToUnion } from '../../type/engine/enum/index.mjs';
2
+ import { Evaluate } from '../../type/index.mjs';
3
3
  import { FromType } from './from_type.mjs';
4
4
  export function FromEnum(context, type, value) {
5
- const union = EnumToUnion(type);
6
- return FromType(context, union, value);
5
+ return FromType(context, Evaluate(type), value);
7
6
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "typebox",
3
3
  "description": "Json Schema Type Builder with Static Type Resolution for TypeScript",
4
- "version": "1.1.39",
4
+ "version": "1.2.1",
5
5
  "keywords": [
6
6
  "typescript",
7
7
  "jsonschema"
package/readme.md CHANGED
@@ -50,7 +50,7 @@ type T = Type.Static<typeof T> // type T = {
50
50
 
51
51
  [Documentation](https://sinclairzx81.github.io/typebox/)
52
52
 
53
- TypeBox is a runtime type system that creates in-memory JSON Schema objects that infer as TypeScript types. The schematics produced by this library are designed to match the static type checking rules of the TypeScript compiler. TypeBox offers a unified type system that can be statically checked by TypeScript and validated at runtime using standard JSON Schema.
53
+ TypeBox is a runtime type system that creates in-memory JSON Schema objects that infer as TypeScript types. The schematics produced by this library are designed to match the static type checking rules of the TypeScript compiler. TypeBox offers a unified type that can be statically checked by TypeScript and validated at runtime using standard JSON Schema.
54
54
 
55
55
  This library is designed to allow JSON Schema to compose similar to how types compose within TypeScript's type system. It can be used as a simple tool to build up complex schematics or integrated into REST and RPC services to help validate data received over the wire.
56
56
 
@@ -113,11 +113,11 @@ type User = Type.Static<typeof User> // type User = {
113
113
 
114
114
  [Documentation](https://sinclairzx81.github.io/typebox/#/docs/script/overview) | [Example 1](https://www.typescriptlang.org/play/#code/JYWwDg9gTgLgBAFQJ5gKZwGZQiOByGFVAIwgA88AoSgehrgFonmXW32POvueHb6AygGMowMDH6Ne0mbLnNqQiADsAzvADecAKqrUUADQ69UbWAAmAQxjoAvnAC8iIgDpho8QAoABtThxgZRsoDEshdABRIOBCOA1Kf39gcwAuOHVRZQBzBLhbPwCg-VDw4304VDIbZXNVOCiYGKQ4uFz-ZUsQVDSMwKyjNoqQS2AAGx6YTKzW-3zcwjQy0wtrdCcIgDdLUYBXVYAeQYAFYCEAa33dfSMz1CQIDHrowgA+OAAyGcSjy1hgbf2AHkQDFLiYbncHk9Gq8Xrk4ZRvABKah0KTyDGYzGSABKqAwo1QQgkaKxZPJvEUKlUEEJLlGECyniuUCRiXZHM5XK5aPi3P5AsFgrR-gW3XwEGIACsiTA8AZBkKlcrOSK4GBsGg-qhVGk+SqDYa1UlUi0xWk8L1sng8grDfblca4B0unq4Ob8FasjbbHaHf7+U7UMMxm6PZbJn0fYqA7G4GrfTG4-61VBUABHHbANOmgDaSeT9qdeGS8q+hdjxZdqDLBYrKuLwZGoyo9cr9H8AF0622hWi5ko1LTUPTGcyTGYrDY2YXeT3ewK1eHJTLifL5wvuWqNRAtY0dXqN5vVR3Eskw0QLV6fX7jw3T+1OuKtOHr7aj3fEkGQ+MzZfPZG1p5B+n7xqeiagY6p5ppm2aoHmJbmHg3aQUq-aovQFJYdhLCSAIMDWKckg4SRFLUGKSyOM4aBuARjRCPsYpQiybxofQFEslR+qocKp7nukgH9CBoFqtWExTLePGBqeTahgJUzCZ+6GUBxE4rDYVHIDR+GEQxTGPCyk6rKxaKqfoRkaU43FSVufGml6kk2SeiTVgA-OJfSOU57JqrJozufJfSKXe6FAA) | [Example 2](https://www.typescriptlang.org/play/#code/JYWwDg9gTgLgBAFQJ5gKZwGZQiOByGFVAIwgA88AoSgehrgFonmXW32POvnb7k1ejbsJGj21AMYQAdgGd4AUWkxghOAF5ERAHQBJZaigYAhhNQAKANoBdADRwA3pThxgAEwBcWtNoDKMKGBpAHNzAEpKAF8Iyik5eABVWUMNb1Q9AyNTC0slFUI7R2c4aWMQVC9+dP9AkPDbYtQQY2AAG0qdGqDQiOjJGXk4JMMEsDdjGHRNKu0FADdjVoBXCYsZ-UmoZIkYK2KZgAVgCQBrc2GoexmAaVQkAHkMczzVJDCwhpdD41hgRfMZvcQKpzslLmltLcHk8XoR3hFrO9qHQhGI0eiMdxBAAlVAYVqoHaCTEk0mY-pyCAE7StCChC5hFxM5ks1lslkopzs7k83m8lEuQhoLx4CDEABWhJgeE+fLl8u5ArgYGwaF+qFkXi5Cp1uqVLncWrgQoq+HktWCeDgkVlurtfP1JTKpocxqIIvN3StNuK9r97MdTRa7UcbuFZoCXutvv9saZSp9caTLiVUFQAEclsA0544JYY8m-Y68O4ZXAC4W7cXSuUyxXKzri0G2lQG-6ldZ6225SjIhTZFT0rT6WDRuNJozk5yu93+fRBe78GLJTsZTPZ4r58rVYYVBqteuN2zHYbQyaPZGQt7bUee1uXDWXWHTXhPVfrTfb3OWc2Q67zxGFreoeX7xluiagQ6W5ppm2aoLmlglm4eCdpBUHRsSZJYdhnCCP4EzHJhOHEcR1AmkMYKpDM+EqBIAA8JoQBgFGGAAfPKKLkRcqTamhPJKqeb7BJ+fGskqj5eEJImicySq-pJl7BCBaG9mRRAsVAY6rFRnQwAR9GMcxFxaZM7FwJx6nGWM2maLxMliVugmKdJ9nmVuj4APwKRaLn2XJzRtF5cBCcpkG9kAA)
115
115
 
116
- The TypeBox Script function is a micro DSL for constructing JSON Schema from TypeScript syntax. It offers a full syntactic frontend to Type.* with broad support for type-level expressions including Conditional, Mapped, Infer, Generic, Distributive types and more. This feature is implemented symmetrically at both runtime and in the type system.
116
+ TypeBox includes a micro DSL for composing JSON Schema with TypeScript syntax. The DSL offers a full syntactic frontend to Type.* and supports many advanced type-level constructs such as Conditional, Mapped, Indexed, Infer, Generics, Distributed types and more. This feature is implemented symmetrically at runtime and statically via TypeScript Template Literal types.
117
117
 
118
118
  ### Example
119
119
 
120
- The following uses the Script function to parse TypeScript interfaces into JSON Schema.
120
+ The following uses Script to parse a TypeScript definition module into JSON Schema.
121
121
 
122
122
  ```typescript
123
123
  import Type from 'typebox'
@@ -189,35 +189,66 @@ type UserUpdate = Type.Static<typeof UserUpdate> // type UserUpdate = {
189
189
 
190
190
  ## Schema
191
191
 
192
- [Documentation](https://sinclairzx81.github.io/typebox/#/docs/schema/overview) | [Example 1](https://www.typescriptlang.org/play/?#code/JYWwDg9gTgLgBAZQMYAsCmICGcBmUIhwDkMAnmGgEYQAeA9AM6oaZEBQokscAKuWrnyES-ajXZs6dOAFo58hYqXKVqteo0zJ0gMIEwwADZptszeYuWr8tmyQQAdg3gBVBmihwAvImZYAdHrgRmgAFHwU-gDylABWaEgwoQDebHBwwAAmAFy8-P4IMFDADgDmoQCUADRpcA6YIGi5EWgFRSXl1bUsRs35hcVlKbjQWDC5RD2GRHAAvhVs8wum1qtr61pScAAKmFDuKxtHx6q29k7wAK7unj5uHv67+2HJ6W-vH5-vW+fOcNceXKpdJZCYANgArDgAIyYABMlAAzEgACyZCFoME4ADsmAAHJQAJxIAAMmWhRCqX2pcC2IJycGcg1KNXS9UaEwBUEpNN5fO+0jZDSajPaZVZcCmnJuAAFMgRMCV-PYQDN+by6ZKsL1RczFhV1YajR8trNvHB-JagA) | [Example 2](https://www.typescriptlang.org/play/#code/JYWwDg9gTgLgBAZQMYAsCmICGcBmUIhwDkMAnmGgEYQAeA9AM6oaZEBQbddcAtH-wMFDhI0WPESenbgGECYYABs003pPUbNW-hyQQAdg3gBVBmihwAvImZYAdHPBK0ACgDebOHDIUAXMQhKACs0JBgiABpPODB8ClhgNAZ-Dy8vYAATFO9yNH8iIyhgfQBzIjgAXyi0uH1MEDy4Nxy-YkLissrqtJYlbJ9Ggpgi0sjcaCwYfN7FcoroquioNABHAFdgZay4AG1oryJMsf3iOobjmqIZ9i8AXTYKgEoOLjVtd4+P1QAFTCgzVSfIHAyS6AxGOBrMwWaymcx2X7-VzNGqotHouCvPSGeBQ8wpaKZfIANgArDgAIyYABMlAAzEgACwZUloYk4ADsmAAHJQAJxIAAMGQpYwx6Ne6W27VK3TOgzxUDF4pVqq8ktq9UaMpK3Rm+UVAAEMgRMMU7HoQOU1SqNfq4DqHo8bS7XajXhUrHA7D6gA) | [Specification](https://sinclairzx81.github.io/typebox/#/docs/schema/1_spec)
192
+ [Documentation](https://sinclairzx81.github.io/typebox/#/docs/schema/overview) | [Example 1](https://www.typescriptlang.org/play/#code/JYWwDg9gTgLgBAZQMYAsCmICGcBmUIhwDkMAnmGgEYQAeA9AM6oaZEBQbddcAtH-wMFDhI0WPESenbgGECYYABs003pPUbNW-hyQQAdg3gBVBmihwAvImZYAdHPBK0ACgDebOHDIUAXMQhKACs0JBgiABpPODB8ClhgNAZ-Dy8vYAATFO9yNH8iIyhgfQBzIjgAXyi0uH1MEDy4Nxy-YkLissrqtJYlbJ9Ggpgi0sjcaCwYfN7FcoroquioNABHAFdgZay4AG1oryJMsf3iOobjmqIZ9i8AXTYKgEoOLjVtd4+P1QAFTCgzVSfIHAyS6AxGOBrMwWaymcx2X7-VzNGqotHouCvPSGeBQ8wpaKZfIANgArDgAIyYABMlAAzEgACwZUloYk4ADsmAAHJQAJxIAAMGQpYwx6Ne6W27VK3TOgzxUDF4pVqq8ktq9UaMpK3Rm+UVAAEMgRMMU7HoQOU1SqNfq4DqHo8bS7XajXhUrHA7D6gA) | [Example 2](https://www.typescriptlang.org/play/?#code/JYWwDg9gTgLgBAZQMYAsCmICGcBmUIhwDkMAnmGgEYQAeA9AM6oaZEBQokscAKuWrnyES-ajXZs6dOAFo58hYqXKVqteo0zJ0gMIEwwADZptszeYuWr8tmyQQAdg3gBVBmihwAvImZYAdHrgRmgAFHwU-gDylABWaEgwoQDebHBwwAAmAFy8-P4IMFDADgDmoQCUADRpcA6YIGi5EWgFRSXl1bUsRs35hcVlKbjQWDC5RD2GRHAAvhVs8wum1qtr61pScAAKmFDuKxtHx6q29k7wAK7unj5uHv67+2HJ6W-vH5-vW+fOcNceXKpdJZCYANgArDgAIyYABMlAAzEgACyZCFoME4ADsmAAHJQAJxIAAMmWhRCqX2pcC2IJycGcg1KNXS9UaEwBUEpNN5fO+0jZDSajPaZVZcCmnJuAAFMgRMCV-PYQDN+by6ZKsL1RczFhV1YajR8trNvHB-JagA)
193
193
 
194
- TypeBox includes a high-performance JSON Schema compiler with support for drafts 3 through to 2020-12. The compiler is designed to be a lightweight industry-grade alternative to Ajv and offers improved compilation and validation performance. The compiler also offers automatic fallback to dynamic checking in JIT-restricted environments such as Cloudflare Workers.
194
+ TypeBox includes a high-performance JIT compiler that supports JSON Schema Draft 3 through to 2020-12. It is designed to be a lightweight industry-grade alternative to Ajv and offers improved compilation and validation performance. It also provides automatic fallback to dynamic validation in JIT restricted environments such as Cloudflare Workers.
195
195
 
196
- ### Example
197
-
198
- The following uses the Schema submodule to compile a TypeBox type.
196
+ The compiler is available via optional sub module import.
199
197
 
200
198
  ```typescript
201
199
  import Schema from 'typebox/schema'
200
+ ```
202
201
 
203
- // Compile
202
+ ### Compile
204
203
 
205
- const User = Schema.Compile(Type.Object({ // const User = Validator<Type.TObject<{
206
- id: Type.String(), // id: Type.TString;
207
- name: Type.String(), // name: Type.TString;
208
- email: Type.String({ format: 'email' }) // email: Type.TString;
209
- })) // }>, { ... }>
204
+ The compiler accepts JSON Schema and returns Validator instances.
205
+
206
+ ```typescript
207
+ const Vector = Schema.Compile(Type.Object({ // const Vector: Validator<TObject<{
208
+ x: Type.Number(), // x: TNumber
209
+ y: Type.Number(), // y: TNumber
210
+ z: Type.Number() // z: TNumber
211
+ })) // }>>
212
+ ```
213
+ With JSON Schema
214
+ ```typescript
215
+ const Vector = Schema.Compile({ // const Vector: Validator<{
216
+ type: 'object', // type: "object";
217
+ required: ['x', 'y', 'z'], // required: ["x", "y", "z"];
218
+ properties: { // properties: { ... };
219
+ x: { type: 'number' }, // }, { ... }>
220
+ y: { type: 'number' },
221
+ z: { type: 'number' }
222
+ }
223
+ })
224
+ ```
210
225
 
211
- // Parse
226
+ ### Validate
212
227
 
213
- const user = User.Parse({ // const user: {
214
- id: '65f1a2b3c4d5e6f7a8b9c0d1', // id: string,
215
- name: 'user', // name: string,
216
- email: 'user@domain.com' // email: string
217
- }) // } = ...
228
+ Validator instances provide functions to Check and Parse values.
218
229
 
230
+ ```typescript
231
+ const Vector = Schema.Compile(Type.Script(`{
232
+ x: number
233
+ y: number
234
+ z: number
235
+ }`))
236
+
237
+ const valid = Vector.Check({ // const valid: boolean
238
+ x: 1,
239
+ y: 0,
240
+ z: 0
241
+ })
242
+
243
+ const value = Vector.Parse({ // const value: {
244
+ x: 1, // x: number
245
+ y: 0, // y: number
246
+ z: 0 // z: number
247
+ }) // }
219
248
  ```
220
249
 
250
+
251
+
221
252
  ### Coverage
222
253
 
223
254
  The following table shows specification coverage implemented by TypeBox.
@@ -1,11 +0,0 @@
1
- import { type TSchema } from '../types/schema.mjs';
2
- import { type TDeferred } from '../types/deferred.mjs';
3
- import { type TOptionsAction } from '../engine/options/instantiate.mjs';
4
- /** Creates a deferred Options action. */
5
- export type TOptionsDeferred<Type extends TSchema, Options extends TSchema> = (TDeferred<'Options', [Type, Options]>);
6
- /** Creates a deferred Options action. */
7
- export declare function OptionsDeferred<Type extends TSchema, Options extends TSchema>(type: Type, options: Options): TOptionsDeferred<Type, Options>;
8
- /** Applies an immediate Options action to the given type. */
9
- export type TOptions<Type extends TSchema, Options extends TSchema> = (Type & Options);
10
- /** Applies an immediate Options action to the given type. */
11
- export declare function Options<Type extends TSchema, const Options extends TSchema>(type: Type, options: Options): TOptionsAction<Type, Options>;
@@ -1,11 +0,0 @@
1
- // deno-fmt-ignore-file
2
- import { Deferred } from '../types/deferred.mjs';
3
- import { OptionsAction } from '../engine/options/instantiate.mjs';
4
- /** Creates a deferred Options action. */
5
- export function OptionsDeferred(type, options) {
6
- return Deferred('Options', [type, options], {});
7
- }
8
- /** Applies an immediate Options action to the given type. */
9
- export function Options(type, options) {
10
- return OptionsAction(type, options);
11
- }
@@ -1,14 +0,0 @@
1
- import { type TSchema } from '../../types/schema.mjs';
2
- import { type TEnum, type TEnumValue } from '../../types/enum.mjs';
3
- import { type TUnion } from '../../types/union.mjs';
4
- import { type TLiteral } from '../../types/literal.mjs';
5
- import { type TNull } from '../../types/null.mjs';
6
- import { type TNever } from '../../types/never.mjs';
7
- type TFromEnumValue<Value extends TEnumValue, Result extends TSchema = Value extends string | number ? TLiteral<Value> : Value extends null ? TNull : TNever> = Result;
8
- export type TEnumValuesToVariants<Values extends TEnumValue[], Result extends TSchema[] = []> = (Values extends [infer Left extends TEnumValue, ...infer Right extends TEnumValue[]] ? TEnumValuesToVariants<Right, [...Result, TFromEnumValue<Left>]> : Result);
9
- export declare function EnumValuesToVariants<Values extends TEnumValue[]>(values: [...Values]): TEnumValuesToVariants<Values>;
10
- export type TEnumValuesToUnion<Values extends TEnumValue[], Variants extends TSchema[] = TEnumValuesToVariants<Values>, Results extends TSchema = TUnion<Variants>> = Results;
11
- export declare function EnumValuesToUnion<Values extends TEnumValue[]>(values: [...Values]): TEnumValuesToUnion<Values>;
12
- export type TEnumToUnion<Type extends TEnum, Result extends TSchema = TEnumValuesToUnion<Type['enum']>> = Result;
13
- export declare function EnumToUnion<Type extends TEnum>(type: Type): TEnumToUnion<Type>;
14
- export {};
@@ -1,24 +0,0 @@
1
- // deno-fmt-ignore-file
2
- import { Guard } from '../../../guard/index.mjs';
3
- import { Union } from '../../types/union.mjs';
4
- import { Literal } from '../../types/literal.mjs';
5
- import { Null } from '../../types/null.mjs';
6
- import { Never } from '../../types/never.mjs';
7
- function FromEnumValue(value) {
8
- return (Guard.IsString(value) || Guard.IsNumber(value) ? Literal(value) :
9
- Guard.IsNull(value) ? Null() :
10
- Never());
11
- }
12
- export function EnumValuesToVariants(values) {
13
- const result = values.map(value => FromEnumValue(value));
14
- return result;
15
- }
16
- export function EnumValuesToUnion(values) {
17
- const variants = EnumValuesToVariants(values);
18
- const result = Union(variants);
19
- return result;
20
- }
21
- export function EnumToUnion(type) {
22
- const result = EnumValuesToUnion(type.enum);
23
- return result;
24
- }
@@ -1,8 +0,0 @@
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 TOptionsDeferred, type TOptions } from '../../action/options.mjs';
5
- export type TOptionsAction<Type extends TSchema, Options extends TSchema, Result extends TSchema = TCanInstantiate<[Type]> extends true ? TOptions<Type, Options> : TOptionsDeferred<Type, Options>> = Result;
6
- export declare function OptionsAction<Type extends TSchema, Options extends TSchema>(type: Type, options: Options): TOptionsAction<Type, Options>;
7
- export type TOptionsInstantiate<Context extends TProperties, State extends TState, Type extends TSchema, Options extends TSchema, InstantiatedType extends TSchema = TInstantiateType<Context, State, Type>> = TOptionsAction<InstantiatedType, Options>;
8
- export declare function OptionsInstantiate<Context extends TProperties, State extends TState, Type extends TSchema, Options extends TSchema>(context: Context, state: State, type: Type, options: Options): TOptionsInstantiate<Context, State, Type, Options>;
File without changes
File without changes