@sinclair/typebox 0.34.23 → 0.34.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,8 @@
1
1
  import { Runtime } from '../parser/index';
2
2
  import * as t from '../type/index';
3
3
  export declare const Module: Runtime.Module<{
4
+ GenericArgumentList: Runtime.IUnion<unknown[]>;
5
+ GenericArguments: Runtime.ITuple<{}>;
4
6
  Literal: Runtime.IUnion<t.TLiteral<string> | t.TLiteral<number> | t.TLiteral<boolean>>;
5
7
  Keyword: Runtime.IUnion<t.TAny | t.TBoolean | t.TBigInt | t.TNever | t.TString | t.TNumber | t.TInteger | t.TNull | t.TSymbol | t.TUndefined | t.TUnknown | t.TVoid>;
6
8
  KeyOf: Runtime.IUnion<boolean>;
@@ -40,6 +40,44 @@ const Dereference = (context, key) => {
40
40
  return key in context ? context[key] : t.Ref(key);
41
41
  };
42
42
  // ------------------------------------------------------------------
43
+ // GenericArgumentList
44
+ // ------------------------------------------------------------------
45
+ // prettier-ignore
46
+ const GenericArgumentListMapping = (results) => {
47
+ return (results.length === 3 ? [results[0], ...results[2]] :
48
+ results.length === 2 ? [results[0]] :
49
+ results.length === 1 ? [results[0]] :
50
+ []);
51
+ };
52
+ // prettier-ignore
53
+ const GenericArgumentList = index_1.Runtime.Union([
54
+ index_1.Runtime.Tuple([index_1.Runtime.Ident(), index_1.Runtime.Const(Comma), index_1.Runtime.Ref('GenericArgumentList')]),
55
+ index_1.Runtime.Tuple([index_1.Runtime.Ident(), index_1.Runtime.Const(Comma)]),
56
+ index_1.Runtime.Tuple([index_1.Runtime.Ident()]),
57
+ index_1.Runtime.Tuple([]),
58
+ ], (results) => GenericArgumentListMapping(results));
59
+ // ------------------------------------------------------------------
60
+ // GenericArguments
61
+ // ------------------------------------------------------------------
62
+ // prettier-ignore
63
+ const GenericArgumentsContext = (args) => {
64
+ return args.reduce((result, arg, index) => {
65
+ return { ...result, [arg]: t.Argument(index) };
66
+ }, {});
67
+ };
68
+ // prettier-ignore
69
+ const GenericArgumentsMapping = (results) => {
70
+ return results.length === 3
71
+ ? GenericArgumentsContext(results[1])
72
+ : {};
73
+ };
74
+ // prettier-ignore
75
+ const GenericArguments = index_1.Runtime.Tuple([
76
+ index_1.Runtime.Const(LAngle),
77
+ index_1.Runtime.Ref('GenericArgumentList'),
78
+ index_1.Runtime.Const(RAngle),
79
+ ], results => GenericArgumentsMapping(results));
80
+ // ------------------------------------------------------------------
43
81
  // GenericReference
44
82
  // ------------------------------------------------------------------
45
83
  function GenericReferenceMapping(results, context) {
@@ -614,6 +652,11 @@ const Uint8Array = index_1.Runtime.Const('Uint8Array', index_1.Runtime.As(t.Uint
614
652
  // ------------------------------------------------------------------
615
653
  // prettier-ignore
616
654
  exports.Module = new index_1.Runtime.Module({
655
+ // ----------------------------------------------------------------
656
+ // Generic Arguments
657
+ // ----------------------------------------------------------------
658
+ GenericArgumentList,
659
+ GenericArguments,
617
660
  // ----------------------------------------------------------------
618
661
  // Type Expressions
619
662
  // ----------------------------------------------------------------
@@ -42,6 +42,27 @@ type Delimit<Parser extends Static.IParser, Delimiter extends Static.IParser> =
42
42
  Static.Tuple<[]>
43
43
  ], DelimitMapping>);
44
44
  type Dereference<Context extends t.TProperties, Ref extends string> = (Ref extends keyof Context ? Context[Ref] : t.TRef<Ref>);
45
+ interface GenericArgumentListMapping extends Static.IMapping {
46
+ output: (this['input'] extends [infer Ident extends string, Comma, infer Rest extends unknown[]] ? [Ident, ...Rest] : this['input'] extends [infer Ident extends string, Comma] ? [Ident] : this['input'] extends [infer Ident extends string] ? [Ident] : [
47
+ ]);
48
+ }
49
+ type GenericArgumentList = Static.Union<[
50
+ Static.Tuple<[Static.Ident, Static.Const<Comma>, GenericArgumentList]>,
51
+ Static.Tuple<[Static.Ident, Static.Const<Comma>]>,
52
+ Static.Tuple<[Static.Ident]>,
53
+ Static.Tuple<[]>
54
+ ], GenericArgumentListMapping>;
55
+ type GenericArgumentsContext<Args extends string[], Result extends t.TProperties = {}> = (Args extends [...infer Left extends string[], infer Right extends string] ? GenericArgumentsContext<Left, Result & {
56
+ [_ in Right]: t.TArgument<Left['length']>;
57
+ }> : t.Evaluate<Result>);
58
+ interface GenericArgumentsMapping extends Static.IMapping {
59
+ output: this['input'] extends [LAngle, infer Args extends string[], RAngle] ? GenericArgumentsContext<Args> : never;
60
+ }
61
+ export type GenericArguments = Static.Tuple<[
62
+ Static.Const<LAngle>,
63
+ GenericArgumentList,
64
+ Static.Const<RAngle>
65
+ ], GenericArgumentsMapping>;
45
66
  interface GenericReferenceMapping extends Static.IMapping {
46
67
  output: this['context'] extends t.TProperties ? this['input'] extends [infer Reference extends string, LAngle, infer Args extends t.TSchema[], RAngle] ? t.TInstantiate<Dereference<this['context'], Reference>, Args> : never : never;
47
68
  }
@@ -1,33 +1,31 @@
1
- import * as Types from '../type/index';
1
+ import * as t from '../type/index';
2
2
  import { Static } from '../parser/index';
3
- import { Type } from './static';
4
- /** Parses a TSchema type from TypeScript syntax but does not infer schematics */
5
- export declare function NoInfer<Context extends Record<PropertyKey, Types.TSchema>, Code extends string>(context: Context, code: Code, options?: Types.SchemaOptions): Types.TSchema | undefined;
6
- /** Parses a TSchema type from TypeScript syntax but does not infer schematics */
7
- export declare function NoInfer<Code extends string>(code: Code, options?: Types.SchemaOptions): Types.TSchema | undefined;
8
- /** Infers a TSchema type from TypeScript syntax. */
9
- export type TSyntax<Context extends Record<PropertyKey, Types.TSchema>, Code extends string> = (Static.Parse<Type, Code, Context> extends [infer Type extends Types.TSchema, string] ? Type : Types.TNever);
10
- /** Parses a TSchema type from TypeScript syntax */
11
- export declare function Syntax<Context extends Record<PropertyKey, Types.TSchema>, Code extends string>(context: Context, code: Code, options?: Types.SchemaOptions): TSyntax<Context, Code>;
12
- /** Parses a TSchema type from TypeScript syntax */
13
- export declare function Syntax<Code extends string>(code: Code, options?: Types.SchemaOptions): TSyntax<{}, Code>;
3
+ import { Type, GenericArguments } from './static';
4
+ type TParseSyntax<Context extends Record<PropertyKey, t.TSchema>, Code extends string> = (Static.Parse<GenericArguments, Code, {}> extends [infer Args extends t.TProperties, infer Rest extends string] ? Static.Parse<Type, Rest, Context & Args> : Static.Parse<Type, Code, Context>);
5
+ /** `[Experimental]` Parses a TypeScript annotation into a TypeBox type but does not infer schematics */
6
+ export declare function NoInfer<Context extends Record<PropertyKey, t.TSchema>, Code extends string>(context: Context, code: Code, options?: t.SchemaOptions): t.TSchema;
7
+ /** `[Experimental]` Parses a TypeScript annotation into a TypeBox type but does not infer schematics */
8
+ export declare function NoInfer<Code extends string>(code: Code, options?: t.SchemaOptions): t.TSchema;
9
+ /** `[Experimental]` Parses a TypeScript annotation into a TypeBox type */
10
+ export type TSyntax<Context extends Record<PropertyKey, t.TSchema>, Code extends string> = (TParseSyntax<Context, Code> extends [infer Type extends t.TSchema, string] ? Type : t.TNever);
11
+ /** `[Experimental]` Parses a TypeScript annotation into a TypeBox type */
12
+ export declare function Syntax<Context extends Record<PropertyKey, t.TSchema>, Annotation extends string>(context: Context, annotation: Annotation, options?: t.SchemaOptions): TSyntax<Context, Annotation>;
13
+ /** `[Experimental]` Parses a TypeScript annotation into a TypeBox type */
14
+ export declare function Syntax<Annotation extends string>(annotation: Annotation, options?: t.SchemaOptions): TSyntax<{}, Annotation>;
14
15
  /**
15
- * Parses a TSchema type from Syntax.
16
16
  * @deprecated Use Syntax() function
17
17
  */
18
- export declare function Parse<Context extends Record<PropertyKey, Types.TSchema>, Code extends string>(context: Context, code: Code, options?: Types.SchemaOptions): TSyntax<Context, Code>;
18
+ export declare function Parse<Context extends Record<PropertyKey, t.TSchema>, Annotation extends string>(context: Context, annotation: Annotation, options?: t.SchemaOptions): TSyntax<Context, Annotation>;
19
19
  /**
20
- * Parses a TSchema type from Syntax.
21
20
  * @deprecated Use Syntax() function
22
21
  */
23
- export declare function Parse<Code extends string>(code: Code, options?: Types.SchemaOptions): TSyntax<{}, Code>;
22
+ export declare function Parse<Annotation extends string>(annotation: Annotation, options?: t.SchemaOptions): TSyntax<{}, Annotation>;
24
23
  /**
25
- * Parses a TSchema from TypeScript Syntax
26
24
  * @deprecated Use NoInfer() function
27
25
  */
28
- export declare function ParseOnly<Context extends Record<PropertyKey, Types.TSchema>, Code extends string>(context: Context, code: Code, options?: Types.SchemaOptions): Types.TSchema | undefined;
26
+ export declare function ParseOnly<Context extends Record<PropertyKey, t.TSchema>, Code extends string>(context: Context, code: Code, options?: t.SchemaOptions): t.TSchema | undefined;
29
27
  /**
30
- * Parses a TSchema from TypeScript Syntax
31
28
  * @deprecated Use NoInfer() function
32
29
  */
33
- export declare function ParseOnly<Code extends string>(code: Code, options?: Types.SchemaOptions): Types.TSchema | undefined;
30
+ export declare function ParseOnly<Code extends string>(code: Code, options?: t.SchemaOptions): t.TSchema | undefined;
31
+ export {};
@@ -5,31 +5,36 @@ exports.NoInfer = NoInfer;
5
5
  exports.Syntax = Syntax;
6
6
  exports.Parse = Parse;
7
7
  exports.ParseOnly = ParseOnly;
8
- const Types = require("../type/index");
8
+ const t = require("../type/index");
9
9
  const runtime_1 = require("./runtime");
10
- /** Parses a TSchema type from TypeScript syntax but does not infer schematics */
10
+ // prettier-ignore
11
+ function ParseSyntax(context, code) {
12
+ const results = runtime_1.Module.Parse('GenericArguments', code, {}); // [ArgumentContext, Rest]
13
+ return (results.length === 2
14
+ ? runtime_1.Module.Parse('Type', results[1], { ...context, ...results[0] })
15
+ : runtime_1.Module.Parse('Type', code, context));
16
+ }
17
+ /** `[Experimental]` Parses a TypeScript annotation into a TypeBox type but does not infer schematics */
11
18
  // prettier-ignore
12
19
  function NoInfer(...args) {
13
20
  const withContext = typeof args[0] === 'string' ? false : true;
14
21
  const [context, code, options] = withContext ? [args[0], args[1], args[2] || {}] : [{}, args[0], args[1] || {}];
15
- const type = runtime_1.Module.Parse('Type', code, context)[0];
16
- return Types.KindGuard.IsSchema(type)
17
- ? Types.CloneType(type, options)
18
- : Types.Never(options);
22
+ const result = ParseSyntax(context, code)[0];
23
+ return t.KindGuard.IsSchema(result)
24
+ ? t.CloneType(result, options)
25
+ : t.Never(options);
19
26
  }
20
- /** Parses a TSchema type from TypeScript syntax */
27
+ /** `[Experimental]` Parses a TypeScript annotation into a TypeBox type */
21
28
  function Syntax(...args) {
22
29
  return NoInfer.apply(null, args);
23
30
  }
24
31
  /**
25
- * Parses a TSchema type from Syntax.
26
32
  * @deprecated Use Syntax() function
27
33
  */
28
34
  function Parse(...args) {
29
35
  return NoInfer.apply(null, args);
30
36
  }
31
37
  /**
32
- * Parses a TSchema from TypeScript Syntax
33
38
  * @deprecated Use NoInfer() function
34
39
  */
35
40
  function ParseOnly(...args) {
@@ -1,6 +1,6 @@
1
1
  import { type TSchema } from '../schema/index';
2
2
  import { type TArgument } from '../argument/index';
3
- import { type TNever } from '../never/index';
3
+ import { type TUnknown } from '../unknown/index';
4
4
  import { type TReadonlyOptional } from '../readonly-optional/index';
5
5
  import { type TReadonly } from '../readonly/index';
6
6
  import { type TOptional } from '../optional/index';
@@ -24,9 +24,9 @@ type TFromArray<Args extends TSchema[], Type extends TSchema, Result extends TAr
24
24
  type TFromAsyncIterator<Args extends TSchema[], Type extends TSchema, Result extends TAsyncIterator = TAsyncIterator<TFromType<Args, Type>>> = Result;
25
25
  type TFromIterator<Args extends TSchema[], Type extends TSchema, Result extends TIterator = TIterator<TFromType<Args, Type>>> = Result;
26
26
  type TFromPromise<Args extends TSchema[], Type extends TSchema, Result extends TPromise = TPromise<TFromType<Args, Type>>> = Result;
27
- type TFromObject<Args extends TSchema[], Properties extends TProperties, Result extends TObject = TObject<TFromProperties<Args, Properties>>> = Result;
27
+ type TFromObject<Args extends TSchema[], Properties extends TProperties, MappedProperties extends TProperties = TFromProperties<Args, Properties>, Result extends TObject = TObject<MappedProperties>> = Result;
28
28
  type TFromRecord<Args extends TSchema[], Key extends TSchema, Value extends TSchema, MappedKey extends TSchema = TFromType<Args, Key>, MappedValue extends TSchema = TFromType<Args, Value>, Result extends TSchema = TRecordOrObject<MappedKey, MappedValue>> = Result;
29
- type TFromArgument<Args extends TSchema[], Index extends number> = (Index extends keyof Args ? Args[Index] : TNever);
29
+ type TFromArgument<Args extends TSchema[], Index extends number, Result extends TSchema = Index extends keyof Args[Index] ? Args[Index] : TUnknown> = Result;
30
30
  type TFromProperty<Args extends TSchema[], Type extends TSchema, IsReadonly extends boolean = Type extends TReadonly<Type> ? true : false, IsOptional extends boolean = Type extends TOptional<Type> ? true : false, Mapped extends TSchema = TFromType<Args, Type>, Result extends TSchema = ([
31
31
  IsReadonly,
32
32
  IsOptional
@@ -4,11 +4,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.FromTypes = FromTypes;
5
5
  exports.Instantiate = Instantiate;
6
6
  const type_1 = require("../clone/type");
7
- const index_1 = require("../never/index");
7
+ const index_1 = require("../unknown/index");
8
8
  const index_2 = require("../readonly-optional/index");
9
9
  const index_3 = require("../readonly/index");
10
10
  const index_4 = require("../optional/index");
11
- const index_5 = require("../record/index");
11
+ const index_5 = require("../object/index");
12
+ const index_6 = require("../record/index");
12
13
  const ValueGuard = require("../guard/value");
13
14
  const KindGuard = require("../guard/kind");
14
15
  // prettier-ignore
@@ -62,19 +63,19 @@ function FromPromise(args, type) {
62
63
  }
63
64
  // prettier-ignore
64
65
  function FromObject(args, type) {
65
- type.properties = FromProperties(args, type.properties);
66
- return type;
66
+ const mappedProperties = FromProperties(args, type.properties);
67
+ return { ...type, ...(0, index_5.Object)(mappedProperties) }; // retain options
67
68
  }
68
69
  // prettier-ignore
69
70
  function FromRecord(args, type) {
70
- const mappedKey = FromType(args, (0, index_5.RecordKey)(type));
71
- const mappedValue = FromType(args, (0, index_5.RecordValue)(type));
72
- const result = (0, index_5.Record)(mappedKey, mappedValue);
71
+ const mappedKey = FromType(args, (0, index_6.RecordKey)(type));
72
+ const mappedValue = FromType(args, (0, index_6.RecordValue)(type));
73
+ const result = (0, index_6.Record)(mappedKey, mappedValue);
73
74
  return { ...type, ...result }; // retain options
74
75
  }
75
76
  // prettier-ignore
76
77
  function FromArgument(args, argument) {
77
- return argument.index in args ? args[argument.index] : (0, index_1.Never)();
78
+ return argument.index in args ? args[argument.index] : (0, index_1.Unknown)();
78
79
  }
79
80
  // prettier-ignore
80
81
  function FromProperty(args, type) {
@@ -1,6 +1,8 @@
1
1
  import { Runtime } from '../parser/index.mjs';
2
2
  import * as t from '../type/index.mjs';
3
3
  export declare const Module: Runtime.Module<{
4
+ GenericArgumentList: Runtime.IUnion<unknown[]>;
5
+ GenericArguments: Runtime.ITuple<{}>;
4
6
  Literal: Runtime.IUnion<t.TLiteral<string> | t.TLiteral<number> | t.TLiteral<boolean>>;
5
7
  Keyword: Runtime.IUnion<t.TAny | t.TBoolean | t.TBigInt | t.TNever | t.TString | t.TNumber | t.TInteger | t.TNull | t.TSymbol | t.TUndefined | t.TUnknown | t.TVoid>;
6
8
  KeyOf: Runtime.IUnion<boolean>;
@@ -36,6 +36,44 @@ const Dereference = (context, key) => {
36
36
  return key in context ? context[key] : t.Ref(key);
37
37
  };
38
38
  // ------------------------------------------------------------------
39
+ // GenericArgumentList
40
+ // ------------------------------------------------------------------
41
+ // prettier-ignore
42
+ const GenericArgumentListMapping = (results) => {
43
+ return (results.length === 3 ? [results[0], ...results[2]] :
44
+ results.length === 2 ? [results[0]] :
45
+ results.length === 1 ? [results[0]] :
46
+ []);
47
+ };
48
+ // prettier-ignore
49
+ const GenericArgumentList = Runtime.Union([
50
+ Runtime.Tuple([Runtime.Ident(), Runtime.Const(Comma), Runtime.Ref('GenericArgumentList')]),
51
+ Runtime.Tuple([Runtime.Ident(), Runtime.Const(Comma)]),
52
+ Runtime.Tuple([Runtime.Ident()]),
53
+ Runtime.Tuple([]),
54
+ ], (results) => GenericArgumentListMapping(results));
55
+ // ------------------------------------------------------------------
56
+ // GenericArguments
57
+ // ------------------------------------------------------------------
58
+ // prettier-ignore
59
+ const GenericArgumentsContext = (args) => {
60
+ return args.reduce((result, arg, index) => {
61
+ return { ...result, [arg]: t.Argument(index) };
62
+ }, {});
63
+ };
64
+ // prettier-ignore
65
+ const GenericArgumentsMapping = (results) => {
66
+ return results.length === 3
67
+ ? GenericArgumentsContext(results[1])
68
+ : {};
69
+ };
70
+ // prettier-ignore
71
+ const GenericArguments = Runtime.Tuple([
72
+ Runtime.Const(LAngle),
73
+ Runtime.Ref('GenericArgumentList'),
74
+ Runtime.Const(RAngle),
75
+ ], results => GenericArgumentsMapping(results));
76
+ // ------------------------------------------------------------------
39
77
  // GenericReference
40
78
  // ------------------------------------------------------------------
41
79
  function GenericReferenceMapping(results, context) {
@@ -610,6 +648,11 @@ const Uint8Array = Runtime.Const('Uint8Array', Runtime.As(t.Uint8Array()));
610
648
  // ------------------------------------------------------------------
611
649
  // prettier-ignore
612
650
  export const Module = new Runtime.Module({
651
+ // ----------------------------------------------------------------
652
+ // Generic Arguments
653
+ // ----------------------------------------------------------------
654
+ GenericArgumentList,
655
+ GenericArguments,
613
656
  // ----------------------------------------------------------------
614
657
  // Type Expressions
615
658
  // ----------------------------------------------------------------
@@ -42,6 +42,27 @@ type Delimit<Parser extends Static.IParser, Delimiter extends Static.IParser> =
42
42
  Static.Tuple<[]>
43
43
  ], DelimitMapping>);
44
44
  type Dereference<Context extends t.TProperties, Ref extends string> = (Ref extends keyof Context ? Context[Ref] : t.TRef<Ref>);
45
+ interface GenericArgumentListMapping extends Static.IMapping {
46
+ output: (this['input'] extends [infer Ident extends string, Comma, infer Rest extends unknown[]] ? [Ident, ...Rest] : this['input'] extends [infer Ident extends string, Comma] ? [Ident] : this['input'] extends [infer Ident extends string] ? [Ident] : [
47
+ ]);
48
+ }
49
+ type GenericArgumentList = Static.Union<[
50
+ Static.Tuple<[Static.Ident, Static.Const<Comma>, GenericArgumentList]>,
51
+ Static.Tuple<[Static.Ident, Static.Const<Comma>]>,
52
+ Static.Tuple<[Static.Ident]>,
53
+ Static.Tuple<[]>
54
+ ], GenericArgumentListMapping>;
55
+ type GenericArgumentsContext<Args extends string[], Result extends t.TProperties = {}> = (Args extends [...infer Left extends string[], infer Right extends string] ? GenericArgumentsContext<Left, Result & {
56
+ [_ in Right]: t.TArgument<Left['length']>;
57
+ }> : t.Evaluate<Result>);
58
+ interface GenericArgumentsMapping extends Static.IMapping {
59
+ output: this['input'] extends [LAngle, infer Args extends string[], RAngle] ? GenericArgumentsContext<Args> : never;
60
+ }
61
+ export type GenericArguments = Static.Tuple<[
62
+ Static.Const<LAngle>,
63
+ GenericArgumentList,
64
+ Static.Const<RAngle>
65
+ ], GenericArgumentsMapping>;
45
66
  interface GenericReferenceMapping extends Static.IMapping {
46
67
  output: this['context'] extends t.TProperties ? this['input'] extends [infer Reference extends string, LAngle, infer Args extends t.TSchema[], RAngle] ? t.TInstantiate<Dereference<this['context'], Reference>, Args> : never : never;
47
68
  }
@@ -1,33 +1,31 @@
1
- import * as Types from '../type/index.mjs';
1
+ import * as t from '../type/index.mjs';
2
2
  import { Static } from '../parser/index.mjs';
3
- import { Type } from './static.mjs';
4
- /** Parses a TSchema type from TypeScript syntax but does not infer schematics */
5
- export declare function NoInfer<Context extends Record<PropertyKey, Types.TSchema>, Code extends string>(context: Context, code: Code, options?: Types.SchemaOptions): Types.TSchema | undefined;
6
- /** Parses a TSchema type from TypeScript syntax but does not infer schematics */
7
- export declare function NoInfer<Code extends string>(code: Code, options?: Types.SchemaOptions): Types.TSchema | undefined;
8
- /** Infers a TSchema type from TypeScript syntax. */
9
- export type TSyntax<Context extends Record<PropertyKey, Types.TSchema>, Code extends string> = (Static.Parse<Type, Code, Context> extends [infer Type extends Types.TSchema, string] ? Type : Types.TNever);
10
- /** Parses a TSchema type from TypeScript syntax */
11
- export declare function Syntax<Context extends Record<PropertyKey, Types.TSchema>, Code extends string>(context: Context, code: Code, options?: Types.SchemaOptions): TSyntax<Context, Code>;
12
- /** Parses a TSchema type from TypeScript syntax */
13
- export declare function Syntax<Code extends string>(code: Code, options?: Types.SchemaOptions): TSyntax<{}, Code>;
3
+ import { Type, GenericArguments } from './static.mjs';
4
+ type TParseSyntax<Context extends Record<PropertyKey, t.TSchema>, Code extends string> = (Static.Parse<GenericArguments, Code, {}> extends [infer Args extends t.TProperties, infer Rest extends string] ? Static.Parse<Type, Rest, Context & Args> : Static.Parse<Type, Code, Context>);
5
+ /** `[Experimental]` Parses a TypeScript annotation into a TypeBox type but does not infer schematics */
6
+ export declare function NoInfer<Context extends Record<PropertyKey, t.TSchema>, Code extends string>(context: Context, code: Code, options?: t.SchemaOptions): t.TSchema;
7
+ /** `[Experimental]` Parses a TypeScript annotation into a TypeBox type but does not infer schematics */
8
+ export declare function NoInfer<Code extends string>(code: Code, options?: t.SchemaOptions): t.TSchema;
9
+ /** `[Experimental]` Parses a TypeScript annotation into a TypeBox type */
10
+ export type TSyntax<Context extends Record<PropertyKey, t.TSchema>, Code extends string> = (TParseSyntax<Context, Code> extends [infer Type extends t.TSchema, string] ? Type : t.TNever);
11
+ /** `[Experimental]` Parses a TypeScript annotation into a TypeBox type */
12
+ export declare function Syntax<Context extends Record<PropertyKey, t.TSchema>, Annotation extends string>(context: Context, annotation: Annotation, options?: t.SchemaOptions): TSyntax<Context, Annotation>;
13
+ /** `[Experimental]` Parses a TypeScript annotation into a TypeBox type */
14
+ export declare function Syntax<Annotation extends string>(annotation: Annotation, options?: t.SchemaOptions): TSyntax<{}, Annotation>;
14
15
  /**
15
- * Parses a TSchema type from Syntax.
16
16
  * @deprecated Use Syntax() function
17
17
  */
18
- export declare function Parse<Context extends Record<PropertyKey, Types.TSchema>, Code extends string>(context: Context, code: Code, options?: Types.SchemaOptions): TSyntax<Context, Code>;
18
+ export declare function Parse<Context extends Record<PropertyKey, t.TSchema>, Annotation extends string>(context: Context, annotation: Annotation, options?: t.SchemaOptions): TSyntax<Context, Annotation>;
19
19
  /**
20
- * Parses a TSchema type from Syntax.
21
20
  * @deprecated Use Syntax() function
22
21
  */
23
- export declare function Parse<Code extends string>(code: Code, options?: Types.SchemaOptions): TSyntax<{}, Code>;
22
+ export declare function Parse<Annotation extends string>(annotation: Annotation, options?: t.SchemaOptions): TSyntax<{}, Annotation>;
24
23
  /**
25
- * Parses a TSchema from TypeScript Syntax
26
24
  * @deprecated Use NoInfer() function
27
25
  */
28
- export declare function ParseOnly<Context extends Record<PropertyKey, Types.TSchema>, Code extends string>(context: Context, code: Code, options?: Types.SchemaOptions): Types.TSchema | undefined;
26
+ export declare function ParseOnly<Context extends Record<PropertyKey, t.TSchema>, Code extends string>(context: Context, code: Code, options?: t.SchemaOptions): t.TSchema | undefined;
29
27
  /**
30
- * Parses a TSchema from TypeScript Syntax
31
28
  * @deprecated Use NoInfer() function
32
29
  */
33
- export declare function ParseOnly<Code extends string>(code: Code, options?: Types.SchemaOptions): Types.TSchema | undefined;
30
+ export declare function ParseOnly<Code extends string>(code: Code, options?: t.SchemaOptions): t.TSchema | undefined;
31
+ export {};
@@ -1,28 +1,33 @@
1
- import * as Types from '../type/index.mjs';
1
+ import * as t from '../type/index.mjs';
2
2
  import { Module } from './runtime.mjs';
3
- /** Parses a TSchema type from TypeScript syntax but does not infer schematics */
3
+ // prettier-ignore
4
+ function ParseSyntax(context, code) {
5
+ const results = Module.Parse('GenericArguments', code, {}); // [ArgumentContext, Rest]
6
+ return (results.length === 2
7
+ ? Module.Parse('Type', results[1], { ...context, ...results[0] })
8
+ : Module.Parse('Type', code, context));
9
+ }
10
+ /** `[Experimental]` Parses a TypeScript annotation into a TypeBox type but does not infer schematics */
4
11
  // prettier-ignore
5
12
  export function NoInfer(...args) {
6
13
  const withContext = typeof args[0] === 'string' ? false : true;
7
14
  const [context, code, options] = withContext ? [args[0], args[1], args[2] || {}] : [{}, args[0], args[1] || {}];
8
- const type = Module.Parse('Type', code, context)[0];
9
- return Types.KindGuard.IsSchema(type)
10
- ? Types.CloneType(type, options)
11
- : Types.Never(options);
15
+ const result = ParseSyntax(context, code)[0];
16
+ return t.KindGuard.IsSchema(result)
17
+ ? t.CloneType(result, options)
18
+ : t.Never(options);
12
19
  }
13
- /** Parses a TSchema type from TypeScript syntax */
20
+ /** `[Experimental]` Parses a TypeScript annotation into a TypeBox type */
14
21
  export function Syntax(...args) {
15
22
  return NoInfer.apply(null, args);
16
23
  }
17
24
  /**
18
- * Parses a TSchema type from Syntax.
19
25
  * @deprecated Use Syntax() function
20
26
  */
21
27
  export function Parse(...args) {
22
28
  return NoInfer.apply(null, args);
23
29
  }
24
30
  /**
25
- * Parses a TSchema from TypeScript Syntax
26
31
  * @deprecated Use NoInfer() function
27
32
  */
28
33
  export function ParseOnly(...args) {
@@ -1,6 +1,6 @@
1
1
  import { type TSchema } from '../schema/index.mjs';
2
2
  import { type TArgument } from '../argument/index.mjs';
3
- import { type TNever } from '../never/index.mjs';
3
+ import { type TUnknown } from '../unknown/index.mjs';
4
4
  import { type TReadonlyOptional } from '../readonly-optional/index.mjs';
5
5
  import { type TReadonly } from '../readonly/index.mjs';
6
6
  import { type TOptional } from '../optional/index.mjs';
@@ -24,9 +24,9 @@ type TFromArray<Args extends TSchema[], Type extends TSchema, Result extends TAr
24
24
  type TFromAsyncIterator<Args extends TSchema[], Type extends TSchema, Result extends TAsyncIterator = TAsyncIterator<TFromType<Args, Type>>> = Result;
25
25
  type TFromIterator<Args extends TSchema[], Type extends TSchema, Result extends TIterator = TIterator<TFromType<Args, Type>>> = Result;
26
26
  type TFromPromise<Args extends TSchema[], Type extends TSchema, Result extends TPromise = TPromise<TFromType<Args, Type>>> = Result;
27
- type TFromObject<Args extends TSchema[], Properties extends TProperties, Result extends TObject = TObject<TFromProperties<Args, Properties>>> = Result;
27
+ type TFromObject<Args extends TSchema[], Properties extends TProperties, MappedProperties extends TProperties = TFromProperties<Args, Properties>, Result extends TObject = TObject<MappedProperties>> = Result;
28
28
  type TFromRecord<Args extends TSchema[], Key extends TSchema, Value extends TSchema, MappedKey extends TSchema = TFromType<Args, Key>, MappedValue extends TSchema = TFromType<Args, Value>, Result extends TSchema = TRecordOrObject<MappedKey, MappedValue>> = Result;
29
- type TFromArgument<Args extends TSchema[], Index extends number> = (Index extends keyof Args ? Args[Index] : TNever);
29
+ type TFromArgument<Args extends TSchema[], Index extends number, Result extends TSchema = Index extends keyof Args[Index] ? Args[Index] : TUnknown> = Result;
30
30
  type TFromProperty<Args extends TSchema[], Type extends TSchema, IsReadonly extends boolean = Type extends TReadonly<Type> ? true : false, IsOptional extends boolean = Type extends TOptional<Type> ? true : false, Mapped extends TSchema = TFromType<Args, Type>, Result extends TSchema = ([
31
31
  IsReadonly,
32
32
  IsOptional
@@ -1,8 +1,9 @@
1
1
  import { CloneType } from '../clone/type.mjs';
2
- import { Never } from '../never/index.mjs';
2
+ import { Unknown } from '../unknown/index.mjs';
3
3
  import { ReadonlyOptional } from '../readonly-optional/index.mjs';
4
4
  import { Readonly } from '../readonly/index.mjs';
5
5
  import { Optional } from '../optional/index.mjs';
6
+ import { Object } from '../object/index.mjs';
6
7
  import { Record, RecordKey, RecordValue } from '../record/index.mjs';
7
8
  import * as ValueGuard from '../guard/value.mjs';
8
9
  import * as KindGuard from '../guard/kind.mjs';
@@ -57,8 +58,8 @@ function FromPromise(args, type) {
57
58
  }
58
59
  // prettier-ignore
59
60
  function FromObject(args, type) {
60
- type.properties = FromProperties(args, type.properties);
61
- return type;
61
+ const mappedProperties = FromProperties(args, type.properties);
62
+ return { ...type, ...Object(mappedProperties) }; // retain options
62
63
  }
63
64
  // prettier-ignore
64
65
  function FromRecord(args, type) {
@@ -69,7 +70,7 @@ function FromRecord(args, type) {
69
70
  }
70
71
  // prettier-ignore
71
72
  function FromArgument(args, argument) {
72
- return argument.index in args ? args[argument.index] : Never();
73
+ return argument.index in args ? args[argument.index] : Unknown();
73
74
  }
74
75
  // prettier-ignore
75
76
  function FromProperty(args, type) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sinclair/typebox",
3
- "version": "0.34.23",
3
+ "version": "0.34.25",
4
4
  "description": "Json Schema Type Builder with Static Type Resolution for TypeScript",
5
5
  "keywords": [
6
6
  "typescript",
package/readme.md CHANGED
@@ -98,8 +98,9 @@ License MIT
98
98
  - [Syntax](#syntax)
99
99
  - [Create](#syntax-create)
100
100
  - [Parameters](#syntax-parameters)
101
- - [Options](#syntax-options)
102
101
  - [Generics](#syntax-generics)
102
+ - [Options](#syntax-options)
103
+ - [NoInfer](#syntax-no-infer)
103
104
  - [TypeRegistry](#typeregistry)
104
105
  - [Type](#typeregistry-type)
105
106
  - [Format](#typeregistry-format)
@@ -1306,9 +1307,9 @@ ValuePointer.Set(A, '/z', 1) // A' = { x: 1, y: 1, z: 1
1306
1307
 
1307
1308
  ## Syntax Types
1308
1309
 
1309
- TypeBox has support for parsing TypeScript syntax at runtime as well as statically in the type system. This feature offers a syntactical frontend to the TypeBox type builder.
1310
+ TypeBox provides experimental support for parsing TypeScript annotation syntax into TypeBox types.
1310
1311
 
1311
- Syntax types are available via optional import.
1312
+ This feature is provided via optional import.
1312
1313
 
1313
1314
  ```typescript
1314
1315
  import { Syntax } from '@sinclair/typebox/syntax'
@@ -1318,20 +1319,25 @@ import { Syntax } from '@sinclair/typebox/syntax'
1318
1319
 
1319
1320
  ### Create
1320
1321
 
1321
- Use the Syntax function to create TypeBox types from TypeScript syntax
1322
+ Use the Syntax function to create TypeBox types from TypeScript syntax ([Example](https://www.typescriptlang.org/play/?moduleResolution=99&module=199&ts=5.8.0-beta#code/JYWwDg9gTgLgBAbzgZQJ4DsYEMAecC+cAZlBCHAOQACAzsOgMYA2WwUA9DKmAKYBGEHOxoZsOCgChQkWIhTYYwBgWKly1OoxZtO3foMkSGEdDXgAVOAF4Uo3AAoABkhwAuOOgCuIPjygAaOFR3Lx8-AkcASjgY2Jj2djhjUwt3cwB5PgArHgYYAB4ECTiS0rLyisrYhNi3OHMAOW9fAOKq9o7OuBqY4PqmsKg2rpHR+MT8AD4JCS5eeut5LEUGfLmeCCJ6ybHKmvWFmyLdk86euDrQlv9h07uy876rv1v7t-GCIA))
1322
1323
 
1323
1324
  ```typescript
1324
1325
  const T = Syntax(`{ x: number, y: number }`) // const T: TObject<{
1325
1326
  // x: TNumber,
1326
1327
  // y: TNumber
1327
1328
  // }>
1329
+
1330
+ type T = Static<typeof T> // type T = {
1331
+ // x: number,
1332
+ // y: number
1333
+ // }
1328
1334
  ```
1329
1335
 
1330
1336
  <a name="syntax-parameters"></a>
1331
1337
 
1332
1338
  ### Parameters
1333
1339
 
1334
- Syntax types can be parameterized to receive exterior types.
1340
+ Syntax types can be parameterized to receive exterior types ([Example](https://www.typescriptlang.org/play/?moduleResolution=99&module=199&ts=5.8.0-beta#code/JYWwDg9gTgLgBAbzgZQJ4DsYEMAecC+cAZlBCHAOQACAzsOgMYA2WwUA9DKmAKYBGEHOxoZsOCgCgJDCOhrwAKnAC8KUbgAUAAyQ4AXHHQBXEHx5QANHFQHjp8wS0BKOK7ev27ODLmKDCgHk+ACseBhgAHgQJd1i4+ITEpLdPN304BQA5EzNLGOSCwqK4VNcbDOz7KHzi2rqPL3wAPikfeRQVNUxNJCV8Ky0ABSxYYCwmCIUm52LUtvhkfyDQ8Kia+o2C0rh0wLAYYFlxycrcpot1zav47fK9g6OJrJzzFuv3m8amoA))
1335
1341
 
1336
1342
  ```typescript
1337
1343
  const T = Syntax(`{ x: number, y: number }`) // const T: TObject<{
@@ -1345,35 +1351,19 @@ const S = Syntax({ T }, `Partial<T>`) // const S: TObject<{
1345
1351
  // }>
1346
1352
  ```
1347
1353
 
1348
- <a name='syntax-options'></a>
1349
1354
 
1350
- ### Options
1351
-
1352
- Options can be passed via the last parameter
1353
-
1354
- ```typescript
1355
- const T = Syntax(`number`, { // const T = {
1356
- minimum: 0, // type: 'number',
1357
- maximum: 10 // minimum: 0,
1358
- }) // maximum: 10
1359
- // }
1360
- ```
1361
1355
 
1362
1356
  <a name="syntax-generics"></a>
1363
1357
 
1364
1358
  ### Generics
1365
1359
 
1366
- Generic types can be created using positional argument types ([Example](https://www.typescriptlang.org/play/?moduleResolution=99&module=199&ts=5.8.0-beta#code/JYWwDg9gTgLgBAbzgZQJ4DsYEMAecC+cAZlBCHAOQACAzsOgMYA2WwUA9DKmAKYBGEHOxoZsOCgChQkWIhTYYwBgWKly1OoxZtO3foMkSGEdDXgAVAAxwAvClG4AFBQCCUAOYBXED0wAeSwA+CgBKIxMzOHMARlt7TCdXD29fGD9o4LDjUwsAJji0BJxnNy8ff1zMiXCcuAA1HgYYaAKHYqQrABoo6O7zfPxugAMECTg4HAAuKMtOsbhUaZi58YAvJdyJfCGwmsiAISw6Ggam6BpWosckU+aoAmHR8an6xrv07tm4IJWF6dvoAFur1voFfutXmcoEDvsCwVsdtUuLw4IdjgCoBc7MgFEo-MieBAiKijsATm9zoFxtT2Ow4ASSeiKZi4k9qeyOZyudyeTzadSXkgXiDFrC4BDrIN5ryZbK5ez+eNRULpl9RSCJQ9pfKdbqFXS1tMVWLRV8IbF8Nq9da5fzCEA))
1360
+ Syntax types support generic parameters in the following way ([Example](https://www.typescriptlang.org/play/?moduleResolution=99&module=199&ts=5.8.0-beta#code/JYWwDg9gTgLgBAbzgZQJ4DsYEMAecC+cAZlBCHAOQACAzsOgMYA2WwUA9DKmAKYBGEHOxoZsOCgChQkWIhTYYwBgWKly1OoxZtO3foMkSGEdDXgA1HgxjQ4AXhSjcACgAGAHgAaAGjgBNXwAtAD45CTg4HAAuOB84cLhUGID4iIAvGMD4-FcASgkjEzM4ACEsOhpLa2gae0dMFyQqmygCX1cEBOi4Zuh3AEZfAAZh4O8EpJ6rFvcRuEG4IbGEjKnqqFnh337lnPyJLl5S8uBK6Zq65AUld0OeCCJjit6oGlCIiPZ2ODun05fag5Oh8QaCweCIZCoV8Pt0kN0FpM5qshm0ElCMZisSCYRFJvCYnNJgsUWjseSKeDcXBVgTFr4kb5Vv0COjKezsTD8EA))
1367
1361
 
1368
1362
  ```typescript
1369
- const T0 = Syntax('Argument<0>')
1370
- const T1 = Syntax('Argument<1>')
1371
- const T2 = Syntax('Argument<2>')
1372
-
1373
- const Vector = Syntax({ T0, T1, T2 }, `{
1374
- x: T0,
1375
- y: T1,
1376
- z: T2
1363
+ const Vector = Syntax(`<X, Y, Z> {
1364
+ x: X,
1365
+ y: Y,
1366
+ z: Z
1377
1367
  }`)
1378
1368
 
1379
1369
  const BasisVectors = Syntax({ Vector }, `{
@@ -1386,7 +1376,37 @@ type BasisVectors = Static<typeof BasisVectors> // type BasisVectors = {
1386
1376
  // x: { x: 1, y: 0, z: 0 },
1387
1377
  // y: { x: 0, y: 1, z: 0 },
1388
1378
  // z: { x: 0, y: 0, z: 1 }
1389
- // }
1379
+ // }
1380
+ ```
1381
+
1382
+ <a name='syntax-options'></a>
1383
+
1384
+ ### Options
1385
+
1386
+ Options can be passed via the last parameter
1387
+
1388
+ ```typescript
1389
+ const T = Syntax(`number`, { minimum: 42 }) // const T = {
1390
+ // type: 'number',
1391
+ // minimum: 42
1392
+ // }
1393
+ ```
1394
+
1395
+ <a name='syntax-no-infer'></a>
1396
+
1397
+ ### NoInfer
1398
+
1399
+ Syntax parsing is an expensive type level operation and can impact on language service performance. Use the NoInfer function parse syntax at runtime only.
1400
+
1401
+ ```typescript
1402
+ import { NoInfer } from '@sinclair/typebox/syntax'
1403
+
1404
+ const T = NoInfer(`number | string`) // const T: TSchema = {
1405
+ // anyOf: [
1406
+ // { type: 'number' },
1407
+ // { type: 'string' }
1408
+ // ]
1409
+ // }
1390
1410
  ```
1391
1411
 
1392
1412
  <a name='typeregistry'></a>