@nmtjs/type 0.3.10 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/compiler.js +45 -20
- package/dist/compiler.js.map +1 -1
- package/dist/types/enum.js.map +1 -1
- package/dist/types/object.js +10 -2
- package/dist/types/object.js.map +1 -1
- package/package.json +3 -3
- package/src/compiler.ts +63 -20
- package/src/types/enum.ts +2 -2
- package/src/types/object.ts +21 -3
package/dist/compiler.js
CHANGED
|
@@ -1,37 +1,35 @@
|
|
|
1
1
|
import { TypeCompiler } from '@sinclair/typebox/compiler';
|
|
2
2
|
import { Value } from '@sinclair/typebox/value';
|
|
3
3
|
import { getTypeSchema } from "./types/base.js";
|
|
4
|
-
|
|
4
|
+
function _prepare(schema, value) {
|
|
5
|
+
return Value.Default(schema, Value.Clean(schema, value));
|
|
6
|
+
}
|
|
7
|
+
function _convert(schema, value) {
|
|
8
|
+
return Value.Convert(schema, value);
|
|
9
|
+
}
|
|
10
|
+
function compileType(type) {
|
|
5
11
|
const schema = getTypeSchema(type);
|
|
6
12
|
const compiled = TypeCompiler.Compile(schema);
|
|
7
|
-
const prepare = (value)=>{
|
|
8
|
-
for (const fn of [
|
|
9
|
-
Value.Clean,
|
|
10
|
-
Value.Default
|
|
11
|
-
]){
|
|
12
|
-
value = fn(schema, value);
|
|
13
|
-
}
|
|
14
|
-
return value;
|
|
15
|
-
};
|
|
16
|
-
const convert = (value)=>Value.Convert(schema, value);
|
|
17
13
|
return {
|
|
18
14
|
check: compiled.Check.bind(compiled),
|
|
19
15
|
errors: compiled.Errors.bind(compiled),
|
|
20
16
|
decode: compiled.Decode.bind(compiled),
|
|
21
17
|
encode: compiled.Encode.bind(compiled),
|
|
22
|
-
prepare,
|
|
23
|
-
convert
|
|
18
|
+
prepare: _prepare.bind(null, schema),
|
|
19
|
+
convert: _convert.bind(null, schema)
|
|
24
20
|
};
|
|
25
|
-
}
|
|
26
|
-
export
|
|
21
|
+
}
|
|
22
|
+
export function compile(schema) {
|
|
27
23
|
const compiled = compileType(schema);
|
|
28
24
|
return {
|
|
29
25
|
...compiled,
|
|
30
|
-
decode: (val)=>
|
|
26
|
+
decode: (val)=>compiled.decode(val),
|
|
27
|
+
encode: (val)=>compiled.encode(val),
|
|
28
|
+
decodeSafe: (val)=>{
|
|
31
29
|
try {
|
|
32
30
|
return {
|
|
33
31
|
success: true,
|
|
34
|
-
value: compiled.decode(
|
|
32
|
+
value: compiled.decode(val)
|
|
35
33
|
};
|
|
36
34
|
} catch (error) {
|
|
37
35
|
return {
|
|
@@ -40,11 +38,11 @@ export const compile = (schema)=>{
|
|
|
40
38
|
};
|
|
41
39
|
}
|
|
42
40
|
},
|
|
43
|
-
|
|
41
|
+
encodeSafe: (val)=>{
|
|
44
42
|
try {
|
|
45
43
|
return {
|
|
46
44
|
success: true,
|
|
47
|
-
value: compiled.encode(
|
|
45
|
+
value: compiled.encode(val)
|
|
48
46
|
};
|
|
49
47
|
} catch (error) {
|
|
50
48
|
return {
|
|
@@ -54,4 +52,31 @@ export const compile = (schema)=>{
|
|
|
54
52
|
}
|
|
55
53
|
}
|
|
56
54
|
};
|
|
57
|
-
}
|
|
55
|
+
}
|
|
56
|
+
export var runtime;
|
|
57
|
+
(function(runtime) {
|
|
58
|
+
function prepare(type, value) {
|
|
59
|
+
return _prepare(getTypeSchema(type), value);
|
|
60
|
+
}
|
|
61
|
+
runtime.prepare = prepare;
|
|
62
|
+
function convert(type, value) {
|
|
63
|
+
return _convert(getTypeSchema(type), value);
|
|
64
|
+
}
|
|
65
|
+
runtime.convert = convert;
|
|
66
|
+
function errors(type, value) {
|
|
67
|
+
return Value.Errors(getTypeSchema(type), value);
|
|
68
|
+
}
|
|
69
|
+
runtime.errors = errors;
|
|
70
|
+
function check(type, value) {
|
|
71
|
+
return Value.Check(getTypeSchema(type), value);
|
|
72
|
+
}
|
|
73
|
+
runtime.check = check;
|
|
74
|
+
function decode(type, value) {
|
|
75
|
+
return Value.Decode(getTypeSchema(type), value);
|
|
76
|
+
}
|
|
77
|
+
runtime.decode = decode;
|
|
78
|
+
function encode(type, value) {
|
|
79
|
+
return Value.Encode(getTypeSchema(type), value);
|
|
80
|
+
}
|
|
81
|
+
runtime.encode = encode;
|
|
82
|
+
})(runtime || (runtime = {}));
|
package/dist/compiler.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/compiler.ts"],"sourcesContent":["import {\n TypeCompiler,\n type ValueErrorIterator,\n} from '@sinclair/typebox/compiler'\nimport { Value } from '@sinclair/typebox/value'\nimport { type BaseType, getTypeSchema } from './types/base.ts'\n\nexport type Compiled = {\n check: (val: unknown) => boolean\n errors: (val: unknown) => ValueErrorIterator\n prepare: (val: unknown) => unknown\n convert: (val: unknown) => unknown\n decode: (\n val: unknown,\n )
|
|
1
|
+
{"version":3,"sources":["../../src/compiler.ts"],"sourcesContent":["import type { TSchema } from '@sinclair/typebox'\nimport {\n TypeCompiler,\n type ValueErrorIterator,\n} from '@sinclair/typebox/compiler'\nimport { Value } from '@sinclair/typebox/value'\nimport type { typeStatic } from './constants.ts'\nimport { type BaseType, getTypeSchema } from './types/base.ts'\n\nexport type Compiled<T extends BaseType = BaseType> = {\n check: (val: unknown) => boolean\n errors: (val: unknown) => ValueErrorIterator\n prepare: (val: unknown) => unknown\n convert: (val: unknown) => unknown\n decode: (val: unknown) => T[typeStatic]['decoded']\n encode: (val: unknown) => T[typeStatic]['encoded']\n decodeSafe: (\n val: unknown,\n ) =>\n | { success: true; value: T[typeStatic]['decoded'] }\n | { success: false; error: any }\n encodeSafe: (\n val: unknown,\n ) =>\n | { success: true; value: T[typeStatic]['encoded'] }\n | { success: false; error: any }\n}\n\nfunction _prepare(schema: TSchema, value: any) {\n return Value.Default(schema, Value.Clean(schema, value))\n}\n\nfunction _convert(schema: TSchema, value: any) {\n return Value.Convert(schema, value)\n}\n\nfunction compileType(type: BaseType) {\n const schema = getTypeSchema(type)\n const compiled = TypeCompiler.Compile(schema)\n return {\n check: compiled.Check.bind(compiled),\n errors: compiled.Errors.bind(compiled),\n decode: compiled.Decode.bind(compiled),\n encode: compiled.Encode.bind(compiled),\n prepare: _prepare.bind(null, schema),\n convert: _convert.bind(null, schema),\n }\n}\n\nexport function compile<T extends BaseType>(schema: T): Compiled<T> {\n const compiled = compileType(schema)\n\n // TODO: custom error handling/shaping\n return {\n ...compiled,\n decode: (val) => compiled.decode(val),\n encode: (val) => compiled.encode(val),\n decodeSafe: (val) => {\n try {\n return {\n success: true as const,\n value: compiled.decode(val),\n }\n } catch (error) {\n return { success: false as const, error }\n }\n },\n encodeSafe: (val) => {\n try {\n return {\n success: true as const,\n value: compiled.encode(val),\n }\n } catch (error) {\n return { success: false as const, error }\n }\n },\n }\n}\n\nexport namespace runtime {\n export function prepare(type: BaseType, value: any) {\n return _prepare(getTypeSchema(type), value)\n }\n\n export function convert(type: BaseType, value: any) {\n return _convert(getTypeSchema(type), value)\n }\n\n export function errors(type: BaseType, value: any): ValueErrorIterator {\n return Value.Errors(getTypeSchema(type), value)\n }\n\n export function check(type: BaseType, value: any): boolean {\n return Value.Check(getTypeSchema(type), value)\n }\n\n export function decode<T extends BaseType>(\n type: BaseType,\n value: any,\n ): T[typeStatic]['decoded'] {\n return Value.Decode(getTypeSchema(type), value)\n }\n\n export function encode<T extends BaseType>(\n type: T,\n value: any,\n ): T[typeStatic]['encoded'] {\n return Value.Encode(getTypeSchema(type), value)\n }\n}\n"],"names":["TypeCompiler","Value","getTypeSchema","_prepare","schema","value","Default","Clean","_convert","Convert","compileType","type","compiled","Compile","check","Check","bind","errors","Errors","decode","Decode","encode","Encode","prepare","convert","compile","val","decodeSafe","success","error","encodeSafe","runtime"],"mappings":"AACA,SACEA,YAAY,QAEP,6BAA4B;AACnC,SAASC,KAAK,QAAQ,0BAAyB;AAE/C,SAAwBC,aAAa,QAAQ,kBAAiB;AAqB9D,SAASC,SAASC,MAAe,EAAEC,KAAU;IAC3C,OAAOJ,MAAMK,OAAO,CAACF,QAAQH,MAAMM,KAAK,CAACH,QAAQC;AACnD;AAEA,SAASG,SAASJ,MAAe,EAAEC,KAAU;IAC3C,OAAOJ,MAAMQ,OAAO,CAACL,QAAQC;AAC/B;AAEA,SAASK,YAAYC,IAAc;IACjC,MAAMP,SAASF,cAAcS;IAC7B,MAAMC,WAAWZ,aAAaa,OAAO,CAACT;IACtC,OAAO;QACLU,OAAOF,SAASG,KAAK,CAACC,IAAI,CAACJ;QAC3BK,QAAQL,SAASM,MAAM,CAACF,IAAI,CAACJ;QAC7BO,QAAQP,SAASQ,MAAM,CAACJ,IAAI,CAACJ;QAC7BS,QAAQT,SAASU,MAAM,CAACN,IAAI,CAACJ;QAC7BW,SAASpB,SAASa,IAAI,CAAC,MAAMZ;QAC7BoB,SAAShB,SAASQ,IAAI,CAAC,MAAMZ;IAC/B;AACF;AAEA,OAAO,SAASqB,QAA4BrB,MAAS;IACnD,MAAMQ,WAAWF,YAAYN;IAG7B,OAAO;QACL,GAAGQ,QAAQ;QACXO,QAAQ,CAACO,MAAQd,SAASO,MAAM,CAACO;QACjCL,QAAQ,CAACK,MAAQd,SAASS,MAAM,CAACK;QACjCC,YAAY,CAACD;YACX,IAAI;gBACF,OAAO;oBACLE,SAAS;oBACTvB,OAAOO,SAASO,MAAM,CAACO;gBACzB;YACF,EAAE,OAAOG,OAAO;gBACd,OAAO;oBAAED,SAAS;oBAAgBC;gBAAM;YAC1C;QACF;QACAC,YAAY,CAACJ;YACX,IAAI;gBACF,OAAO;oBACLE,SAAS;oBACTvB,OAAOO,SAASS,MAAM,CAACK;gBACzB;YACF,EAAE,OAAOG,OAAO;gBACd,OAAO;oBAAED,SAAS;oBAAgBC;gBAAM;YAC1C;QACF;IACF;AACF;;UAEiBE;IACR,SAASR,QAAQZ,IAAc,EAAEN,KAAU;QAChD,OAAOF,SAASD,cAAcS,OAAON;IACvC;YAFgBkB,UAAAA;IAIT,SAASC,QAAQb,IAAc,EAAEN,KAAU;QAChD,OAAOG,SAASN,cAAcS,OAAON;IACvC;YAFgBmB,UAAAA;IAIT,SAASP,OAAON,IAAc,EAAEN,KAAU;QAC/C,OAAOJ,MAAMiB,MAAM,CAAChB,cAAcS,OAAON;IAC3C;YAFgBY,SAAAA;IAIT,SAASH,MAAMH,IAAc,EAAEN,KAAU;QAC9C,OAAOJ,MAAMc,KAAK,CAACb,cAAcS,OAAON;IAC1C;YAFgBS,QAAAA;IAIT,SAASK,OACdR,IAAc,EACdN,KAAU;QAEV,OAAOJ,MAAMmB,MAAM,CAAClB,cAAcS,OAAON;IAC3C;YALgBc,SAAAA;IAOT,SAASE,OACdV,IAAO,EACPN,KAAU;QAEV,OAAOJ,MAAMqB,MAAM,CAACpB,cAAcS,OAAON;IAC3C;YALgBgB,SAAAA;AAMlB,GA9BiBU,YAAAA"}
|
package/dist/types/enum.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/types/enum.ts"],"sourcesContent":["import type { SchemaOptions } from '@sinclair/typebox'\nimport type { TNativeEnum } from '../schemas/native-enum.ts'\nimport { NativeEnum } from '../schemas/native-enum.ts'\nimport { type TUnionEnum, UnionEnum } from '../schemas/union-enum.ts'\nimport { BaseType } from './base.ts'\n\nexport type AnyObjectEnumType<T extends { [K in string]: K } = any> =\n ObjectEnumType<T, boolean, boolean, boolean>\nexport class ObjectEnumType<\n T extends { [K in string]: K },\n N extends boolean = false,\n O extends boolean = false,\n D extends boolean = false,\n> extends BaseType<TNativeEnum<T>, N, O, D> {\n constructor(\n
|
|
1
|
+
{"version":3,"sources":["../../../src/types/enum.ts"],"sourcesContent":["import type { SchemaOptions } from '@sinclair/typebox'\nimport type { TNativeEnum } from '../schemas/native-enum.ts'\nimport { NativeEnum } from '../schemas/native-enum.ts'\nimport { type TUnionEnum, UnionEnum } from '../schemas/union-enum.ts'\nimport { BaseType } from './base.ts'\n\nexport type AnyObjectEnumType<T extends { [K in string]: K } = any> =\n ObjectEnumType<T, boolean, boolean, boolean>\nexport class ObjectEnumType<\n T extends { [K in string]: K },\n N extends boolean = false,\n O extends boolean = false,\n D extends boolean = false,\n> extends BaseType<TNativeEnum<T>, N, O, D> {\n constructor(\n readonly values: T,\n options: SchemaOptions = {},\n isNullable: N = false as N,\n isOptional: O = false as O,\n hasDefault: D = false as D,\n ) {\n super(options, isNullable, isOptional, hasDefault, values)\n }\n\n protected _constructSchema(\n options: SchemaOptions,\n values: T,\n ): TNativeEnum<T> {\n return NativeEnum(values, options)\n }\n\n nullable() {\n return new ObjectEnumType(this.values, ...this._with({ isNullable: true }))\n }\n\n optional() {\n return new ObjectEnumType(this.values, ...this._with({ isOptional: true }))\n }\n\n nullish() {\n return new ObjectEnumType(\n this.values,\n ...this._with({ isNullable: true, isOptional: true }),\n )\n }\n\n default(value: keyof T) {\n return new ObjectEnumType(\n this.values,\n ...this._with({ options: { default: value }, hasDefault: true }),\n )\n }\n\n description(description: string) {\n return new ObjectEnumType(\n this.values,\n ...this._with({ options: { description } }),\n )\n }\n\n examples(...examples: (keyof T)[]) {\n return new ObjectEnumType(\n this.values,\n ...this._with({ options: { examples } }),\n )\n }\n}\n\nexport type AnyEnumType = EnumType<any[], boolean, boolean, boolean>\nexport class EnumType<\n T extends (string | number)[] = (string | number)[],\n N extends boolean = false,\n O extends boolean = false,\n D extends boolean = false,\n> extends BaseType<TUnionEnum<T>, N, O, D> {\n constructor(\n readonly values: [...T],\n options: SchemaOptions = {},\n isNullable: N = false as N,\n isOptional: O = false as O,\n hasDefault: D = false as D,\n ) {\n super(options, isNullable, isOptional, hasDefault, values)\n }\n\n protected _constructSchema(\n options: SchemaOptions,\n values: [...T],\n ): TUnionEnum<T> {\n return UnionEnum(values, options)\n }\n\n nullable() {\n return new EnumType(this.values, ...this._with({ isNullable: true }))\n }\n\n optional() {\n return new EnumType(this.values, ...this._with({ isOptional: true }))\n }\n\n nullish() {\n return new EnumType(\n this.values,\n ...this._with({ isNullable: true, isOptional: true }),\n )\n }\n\n default(value: T[number]) {\n return new EnumType(\n this.values,\n ...this._with({ options: { default: value }, hasDefault: true }),\n )\n }\n\n description(description: string) {\n return new EnumType(\n this.values,\n ...this._with({ options: { description } }),\n )\n }\n\n examples(...examples: [T[number], ...T[number][]]) {\n return new EnumType(this.values, ...this._with({ options: { examples } }))\n }\n}\n"],"names":["NativeEnum","UnionEnum","BaseType","ObjectEnumType","constructor","values","options","isNullable","isOptional","hasDefault","_constructSchema","nullable","_with","optional","nullish","default","value","description","examples","EnumType"],"mappings":"AAEA,SAASA,UAAU,QAAQ,4BAA2B;AACtD,SAA0BC,SAAS,QAAQ,2BAA0B;AACrE,SAASC,QAAQ,QAAQ,YAAW;AAIpC,OAAO,MAAMC,uBAKHD;;IACRE,YACE,AAASC,MAAS,EAClBC,UAAyB,CAAC,CAAC,EAC3BC,aAAgB,KAAU,EAC1BC,aAAgB,KAAU,EAC1BC,aAAgB,KAAU,CAC1B;QACA,KAAK,CAACH,SAASC,YAAYC,YAAYC,YAAYJ;aAN1CA,SAAAA;IAOX;IAEUK,iBACRJ,OAAsB,EACtBD,MAAS,EACO;QAChB,OAAOL,WAAWK,QAAQC;IAC5B;IAEAK,WAAW;QACT,OAAO,IAAIR,eAAe,IAAI,CAACE,MAAM,KAAK,IAAI,CAACO,KAAK,CAAC;YAAEL,YAAY;QAAK;IAC1E;IAEAM,WAAW;QACT,OAAO,IAAIV,eAAe,IAAI,CAACE,MAAM,KAAK,IAAI,CAACO,KAAK,CAAC;YAAEJ,YAAY;QAAK;IAC1E;IAEAM,UAAU;QACR,OAAO,IAAIX,eACT,IAAI,CAACE,MAAM,KACR,IAAI,CAACO,KAAK,CAAC;YAAEL,YAAY;YAAMC,YAAY;QAAK;IAEvD;IAEAO,QAAQC,KAAc,EAAE;QACtB,OAAO,IAAIb,eACT,IAAI,CAACE,MAAM,KACR,IAAI,CAACO,KAAK,CAAC;YAAEN,SAAS;gBAAES,SAASC;YAAM;YAAGP,YAAY;QAAK;IAElE;IAEAQ,YAAYA,WAAmB,EAAE;QAC/B,OAAO,IAAId,eACT,IAAI,CAACE,MAAM,KACR,IAAI,CAACO,KAAK,CAAC;YAAEN,SAAS;gBAAEW;YAAY;QAAE;IAE7C;IAEAC,SAAS,GAAGA,QAAqB,EAAE;QACjC,OAAO,IAAIf,eACT,IAAI,CAACE,MAAM,KACR,IAAI,CAACO,KAAK,CAAC;YAAEN,SAAS;gBAAEY;YAAS;QAAE;IAE1C;AACF;AAGA,OAAO,MAAMC,iBAKHjB;;IACRE,YACE,AAASC,MAAc,EACvBC,UAAyB,CAAC,CAAC,EAC3BC,aAAgB,KAAU,EAC1BC,aAAgB,KAAU,EAC1BC,aAAgB,KAAU,CAC1B;QACA,KAAK,CAACH,SAASC,YAAYC,YAAYC,YAAYJ;aAN1CA,SAAAA;IAOX;IAEUK,iBACRJ,OAAsB,EACtBD,MAAc,EACC;QACf,OAAOJ,UAAUI,QAAQC;IAC3B;IAEAK,WAAW;QACT,OAAO,IAAIQ,SAAS,IAAI,CAACd,MAAM,KAAK,IAAI,CAACO,KAAK,CAAC;YAAEL,YAAY;QAAK;IACpE;IAEAM,WAAW;QACT,OAAO,IAAIM,SAAS,IAAI,CAACd,MAAM,KAAK,IAAI,CAACO,KAAK,CAAC;YAAEJ,YAAY;QAAK;IACpE;IAEAM,UAAU;QACR,OAAO,IAAIK,SACT,IAAI,CAACd,MAAM,KACR,IAAI,CAACO,KAAK,CAAC;YAAEL,YAAY;YAAMC,YAAY;QAAK;IAEvD;IAEAO,QAAQC,KAAgB,EAAE;QACxB,OAAO,IAAIG,SACT,IAAI,CAACd,MAAM,KACR,IAAI,CAACO,KAAK,CAAC;YAAEN,SAAS;gBAAES,SAASC;YAAM;YAAGP,YAAY;QAAK;IAElE;IAEAQ,YAAYA,WAAmB,EAAE;QAC/B,OAAO,IAAIE,SACT,IAAI,CAACd,MAAM,KACR,IAAI,CAACO,KAAK,CAAC;YAAEN,SAAS;gBAAEW;YAAY;QAAE;IAE7C;IAEAC,SAAS,GAAGA,QAAqC,EAAE;QACjD,OAAO,IAAIC,SAAS,IAAI,CAACd,MAAM,KAAK,IAAI,CAACO,KAAK,CAAC;YAAEN,SAAS;gBAAEY;YAAS;QAAE;IACzE;AACF"}
|
package/dist/types/object.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Type } from '@sinclair/typebox';
|
|
2
2
|
import { BaseType, getTypeSchema } from "./base.js";
|
|
3
|
-
import { EnumType } from "./enum.js";
|
|
3
|
+
import { EnumType, ObjectEnumType } from "./enum.js";
|
|
4
4
|
export class ObjectType extends BaseType {
|
|
5
5
|
properties;
|
|
6
6
|
constructor(properties = {}, options = {}, isNullable = false, isOptional = false, hasDefault = false){
|
|
@@ -97,7 +97,15 @@ export class RecordType extends BaseType {
|
|
|
97
97
|
this.element = element;
|
|
98
98
|
}
|
|
99
99
|
_constructSchema(options, key, element) {
|
|
100
|
-
|
|
100
|
+
let keySchema;
|
|
101
|
+
if (key instanceof EnumType) {
|
|
102
|
+
keySchema = Type.Union(key.values.map((value)=>Type.Literal(value)));
|
|
103
|
+
} else if (key instanceof ObjectEnumType) {
|
|
104
|
+
keySchema = Type.Union(Object.values(key.values).map((value)=>Type.Literal(value)));
|
|
105
|
+
} else {
|
|
106
|
+
keySchema = getTypeSchema(key);
|
|
107
|
+
}
|
|
108
|
+
return Type.Record(keySchema, getTypeSchema(element), options);
|
|
101
109
|
}
|
|
102
110
|
nullable() {
|
|
103
111
|
return new RecordType(this.key, this.element, ...this._with({
|
package/dist/types/object.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/types/object.ts"],"sourcesContent":["import {\n type ObjectOptions,\n type TObject,\n type TRecord,\n Type,\n} from '@sinclair/typebox'\nimport type { typeStatic } from '../constants.ts'\nimport type { UnionToTupleString } from '../utils.ts'\nimport { BaseType, getTypeSchema } from './base.ts'\nimport { type AnyEnumType, type AnyObjectEnumType, EnumType } from './enum.ts'\nimport type { AnyLiteralType } from './literal.ts'\nimport type { AnyStringType } from './string.ts'\nimport type { AnyUnionType } from './union.ts'\n\nexport class ObjectType<\n T extends Record<string, BaseType>,\n N extends boolean = false,\n O extends boolean = false,\n D extends boolean = false,\n> extends BaseType<\n TObject<{ [K in keyof T]: T[K][typeStatic]['schema'] }>,\n N,\n O,\n D\n> {\n constructor(\n protected readonly properties: T = {} as T,\n options: ObjectOptions = {},\n isNullable: N = false as N,\n isOptional: O = false as O,\n hasDefault: D = false as D,\n ) {\n super(options, isNullable, isOptional, hasDefault, properties)\n }\n\n protected _constructSchema(\n options: ObjectOptions,\n properties: T,\n ): TObject<{ [K in keyof T]: T[K][typeStatic]['schema'] }> {\n const schemaProperties = {} as {\n [K in keyof T]: T[K][typeStatic]['schema']\n }\n\n for (const [key, value] of Object.entries(properties)) {\n // @ts-expect-error\n schemaProperties[key] = getTypeSchema(value)\n }\n return Type.Object(schemaProperties, options)\n }\n\n nullable() {\n return new ObjectType(this.properties, ...this._with({ isNullable: true }))\n }\n\n optional() {\n return new ObjectType(this.properties, ...this._with({ isOptional: true }))\n }\n\n nullish() {\n return new ObjectType(\n this.properties,\n ...this._with({ isNullable: true, isOptional: true }),\n )\n }\n\n default(value: this[typeStatic]['encoded']) {\n return new ObjectType(\n this.properties,\n ...this._with({ options: { default: value }, hasDefault: true }),\n )\n }\n\n description(description: string) {\n return new ObjectType(\n this.properties,\n ...this._with({ options: { description } }),\n )\n }\n\n examples(\n ...examples: [this[typeStatic]['encoded'], ...this[typeStatic]['encoded'][]]\n ) {\n return new ObjectType(\n this.properties,\n ...this._with({ options: { examples } }),\n )\n }\n\n pick<P extends { [K in keyof T]?: true }>(pick: P) {\n const properties = Object.fromEntries(\n Object.entries(this.properties).filter(([key]) => pick[key]),\n )\n const [_, ...args] = this._with()\n return new ObjectType(\n properties as Pick<T, Extract<keyof P, keyof T>>,\n {},\n ...args,\n )\n }\n\n omit<P extends { [K in keyof T]?: true }>(omit: P) {\n const properties = Object.fromEntries(\n Object.entries(this.properties).filter(([key]) => !omit[key]),\n )\n const [_, ...args] = this._with()\n return new ObjectType(\n properties as Omit<T, Extract<keyof P, keyof T>>,\n {},\n ...args,\n )\n }\n\n extend<P extends Record<string, BaseType>>(properties: P) {\n const [_, ...args] = this._with()\n return new ObjectType({ ...this.properties, ...properties }, {}, ...args)\n }\n\n merge<T extends ObjectType<Record<string, BaseType>>>(object: T) {\n const [_, ...args] = this._with()\n return new ObjectType(\n { ...this.properties, ...object.properties },\n {},\n ...args,\n )\n }\n\n partial() {\n const properties: { [K in keyof T]: ReturnType<T[K]['optional']> } =\n {} as any\n for (const [key, value] of Object.entries(this.properties)) {\n // @ts-expect-error\n properties[key] = value.optional()\n }\n const [_, ...args] = this._with()\n return new ObjectType(properties, {}, ...args)\n }\n\n keyof(): EnumType<UnionToTupleString<keyof T>> {\n return new EnumType(Object.keys(this.properties) as any)\n }\n}\n\nexport class RecordType<\n K extends\n | AnyLiteralType\n | AnyEnumType\n | AnyObjectEnumType\n | AnyStringType\n | AnyUnionType,\n E extends BaseType,\n N extends boolean = false,\n O extends boolean = false,\n D extends boolean = false,\n> extends BaseType<\n TRecord<K[typeStatic]['schema'], E[typeStatic]['schema']>,\n N,\n O,\n D,\n ObjectOptions\n> {\n constructor(\n protected readonly key: K,\n protected readonly element: E,\n options: ObjectOptions = {},\n isNullable: N = false as N,\n isOptional: O = false as O,\n hasDefault: D = false as D,\n ) {\n super(options, isNullable, isOptional, hasDefault, key, element)\n }\n\n protected _constructSchema(options: ObjectOptions, key: K, element: E) {\n return Type.Record(\n getTypeSchema(key),\n getTypeSchema(element),\n options,\n ) as TRecord<K[typeStatic]['schema'], E[typeStatic]['schema']>\n }\n\n nullable() {\n return new RecordType(\n this.key,\n this.element,\n ...this._with({ isNullable: true }),\n )\n }\n\n optional() {\n return new RecordType(\n this.key,\n this.element,\n ...this._with({ isOptional: true }),\n )\n }\n\n nullish() {\n return new RecordType(\n this.key,\n this.element,\n ...this._with({ isNullable: true, isOptional: true }),\n )\n }\n\n default(value: this[typeStatic]['encoded']) {\n return new RecordType(\n this.key,\n this.element,\n ...this._with({ options: { default: value }, hasDefault: true }),\n )\n }\n\n description(description: string) {\n return new RecordType(\n this.key,\n this.element,\n ...this._with({ options: { description } }),\n )\n }\n\n examples(\n ...examples: [this[typeStatic]['encoded'], ...this[typeStatic]['encoded'][]]\n ) {\n return new RecordType(\n this.key,\n this.element,\n ...this._with({ options: { examples } }),\n )\n }\n}\n"],"names":["Type","BaseType","getTypeSchema","EnumType","ObjectType","constructor","properties","options","isNullable","isOptional","hasDefault","_constructSchema","schemaProperties","key","value","Object","entries","nullable","_with","optional","nullish","default","description","examples","pick","fromEntries","filter","_","args","omit","extend","merge","object","partial","keyof","keys","RecordType","element","Record"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/types/object.ts"],"sourcesContent":["import {\n type ObjectOptions,\n type TObject,\n type TRecord,\n type TSchema,\n Type,\n} from '@sinclair/typebox'\nimport type { typeStatic } from '../constants.ts'\nimport type { UnionToTupleString } from '../utils.ts'\nimport { BaseType, getTypeSchema } from './base.ts'\nimport {\n type AnyEnumType,\n type AnyObjectEnumType,\n EnumType,\n ObjectEnumType,\n} from './enum.ts'\nimport type { AnyLiteralType } from './literal.ts'\nimport type { AnyStringType } from './string.ts'\nimport type { AnyUnionType } from './union.ts'\n\nexport class ObjectType<\n T extends Record<string, BaseType>,\n N extends boolean = false,\n O extends boolean = false,\n D extends boolean = false,\n> extends BaseType<\n TObject<{ [K in keyof T]: T[K][typeStatic]['schema'] }>,\n N,\n O,\n D\n> {\n constructor(\n protected readonly properties: T = {} as T,\n options: ObjectOptions = {},\n isNullable: N = false as N,\n isOptional: O = false as O,\n hasDefault: D = false as D,\n ) {\n super(options, isNullable, isOptional, hasDefault, properties)\n }\n\n protected _constructSchema(\n options: ObjectOptions,\n properties: T,\n ): TObject<{ [K in keyof T]: T[K][typeStatic]['schema'] }> {\n const schemaProperties = {} as {\n [K in keyof T]: T[K][typeStatic]['schema']\n }\n\n for (const [key, value] of Object.entries(properties)) {\n // @ts-expect-error\n schemaProperties[key] = getTypeSchema(value)\n }\n return Type.Object(schemaProperties, options)\n }\n\n nullable() {\n return new ObjectType(this.properties, ...this._with({ isNullable: true }))\n }\n\n optional() {\n return new ObjectType(this.properties, ...this._with({ isOptional: true }))\n }\n\n nullish() {\n return new ObjectType(\n this.properties,\n ...this._with({ isNullable: true, isOptional: true }),\n )\n }\n\n default(value: this[typeStatic]['encoded']) {\n return new ObjectType(\n this.properties,\n ...this._with({ options: { default: value }, hasDefault: true }),\n )\n }\n\n description(description: string) {\n return new ObjectType(\n this.properties,\n ...this._with({ options: { description } }),\n )\n }\n\n examples(\n ...examples: [this[typeStatic]['encoded'], ...this[typeStatic]['encoded'][]]\n ) {\n return new ObjectType(\n this.properties,\n ...this._with({ options: { examples } }),\n )\n }\n\n pick<P extends { [K in keyof T]?: true }>(pick: P) {\n const properties = Object.fromEntries(\n Object.entries(this.properties).filter(([key]) => pick[key]),\n )\n const [_, ...args] = this._with()\n return new ObjectType(\n properties as Pick<T, Extract<keyof P, keyof T>>,\n {},\n ...args,\n )\n }\n\n omit<P extends { [K in keyof T]?: true }>(omit: P) {\n const properties = Object.fromEntries(\n Object.entries(this.properties).filter(([key]) => !omit[key]),\n )\n const [_, ...args] = this._with()\n return new ObjectType(\n properties as Omit<T, Extract<keyof P, keyof T>>,\n {},\n ...args,\n )\n }\n\n extend<P extends Record<string, BaseType>>(properties: P) {\n const [_, ...args] = this._with()\n return new ObjectType({ ...this.properties, ...properties }, {}, ...args)\n }\n\n merge<T extends ObjectType<Record<string, BaseType>>>(object: T) {\n const [_, ...args] = this._with()\n return new ObjectType(\n { ...this.properties, ...object.properties },\n {},\n ...args,\n )\n }\n\n partial() {\n const properties: { [K in keyof T]: ReturnType<T[K]['optional']> } =\n {} as any\n for (const [key, value] of Object.entries(this.properties)) {\n // @ts-expect-error\n properties[key] = value.optional()\n }\n const [_, ...args] = this._with()\n return new ObjectType(properties, {}, ...args)\n }\n\n keyof(): EnumType<UnionToTupleString<keyof T>> {\n return new EnumType(Object.keys(this.properties) as any)\n }\n}\n\nexport class RecordType<\n K extends\n | AnyLiteralType\n | AnyEnumType\n | AnyObjectEnumType\n | AnyStringType\n | AnyUnionType,\n E extends BaseType,\n N extends boolean = false,\n O extends boolean = false,\n D extends boolean = false,\n> extends BaseType<\n TRecord<K[typeStatic]['schema'], E[typeStatic]['schema']>,\n N,\n O,\n D,\n ObjectOptions\n> {\n constructor(\n protected readonly key: K,\n protected readonly element: E,\n options: ObjectOptions = {},\n isNullable: N = false as N,\n isOptional: O = false as O,\n hasDefault: D = false as D,\n ) {\n super(options, isNullable, isOptional, hasDefault, key, element)\n }\n\n protected _constructSchema(options: ObjectOptions, key: K, element: E) {\n let keySchema: TSchema\n\n if (key instanceof EnumType) {\n keySchema = Type.Union(key.values.map((value) => Type.Literal(value)))\n } else if (key instanceof ObjectEnumType) {\n keySchema = Type.Union(\n Object.values(key.values).map((value) => Type.Literal(value as string)),\n )\n } else {\n keySchema = getTypeSchema(key)\n }\n\n return Type.Record(\n keySchema,\n getTypeSchema(element),\n options,\n ) as unknown as TRecord<K[typeStatic]['schema'], E[typeStatic]['schema']>\n }\n\n nullable() {\n return new RecordType(\n this.key,\n this.element,\n ...this._with({ isNullable: true }),\n )\n }\n\n optional() {\n return new RecordType(\n this.key,\n this.element,\n ...this._with({ isOptional: true }),\n )\n }\n\n nullish() {\n return new RecordType(\n this.key,\n this.element,\n ...this._with({ isNullable: true, isOptional: true }),\n )\n }\n\n default(value: this[typeStatic]['encoded']) {\n return new RecordType(\n this.key,\n this.element,\n ...this._with({ options: { default: value }, hasDefault: true }),\n )\n }\n\n description(description: string) {\n return new RecordType(\n this.key,\n this.element,\n ...this._with({ options: { description } }),\n )\n }\n\n examples(\n ...examples: [this[typeStatic]['encoded'], ...this[typeStatic]['encoded'][]]\n ) {\n return new RecordType(\n this.key,\n this.element,\n ...this._with({ options: { examples } }),\n )\n }\n}\n"],"names":["Type","BaseType","getTypeSchema","EnumType","ObjectEnumType","ObjectType","constructor","properties","options","isNullable","isOptional","hasDefault","_constructSchema","schemaProperties","key","value","Object","entries","nullable","_with","optional","nullish","default","description","examples","pick","fromEntries","filter","_","args","omit","extend","merge","object","partial","keyof","keys","RecordType","element","keySchema","Union","values","map","Literal","Record"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -21,12 +21,12 @@
|
|
|
21
21
|
"peerDependencies": {
|
|
22
22
|
"@sinclair/typebox": "^0.33.7",
|
|
23
23
|
"temporal-polyfill": "^0.2.5",
|
|
24
|
-
"@nmtjs/common": "0.
|
|
24
|
+
"@nmtjs/common": "0.4.0"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"@sinclair/typebox": "^0.33.7",
|
|
28
28
|
"temporal-polyfill": "^0.2.5",
|
|
29
|
-
"@nmtjs/common": "0.
|
|
29
|
+
"@nmtjs/common": "0.4.0"
|
|
30
30
|
},
|
|
31
31
|
"files": [
|
|
32
32
|
"src",
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"LICENSE.md",
|
|
36
36
|
"README.md"
|
|
37
37
|
],
|
|
38
|
-
"version": "0.
|
|
38
|
+
"version": "0.4.0",
|
|
39
39
|
"scripts": {
|
|
40
40
|
"build": "neemata-build -p neutral --root=./src './**/*.ts'",
|
|
41
41
|
"type-check": "tsc --noEmit"
|
package/src/compiler.ts
CHANGED
|
@@ -1,64 +1,75 @@
|
|
|
1
|
+
import type { TSchema } from '@sinclair/typebox'
|
|
1
2
|
import {
|
|
2
3
|
TypeCompiler,
|
|
3
4
|
type ValueErrorIterator,
|
|
4
5
|
} from '@sinclair/typebox/compiler'
|
|
5
6
|
import { Value } from '@sinclair/typebox/value'
|
|
7
|
+
import type { typeStatic } from './constants.ts'
|
|
6
8
|
import { type BaseType, getTypeSchema } from './types/base.ts'
|
|
7
9
|
|
|
8
|
-
export type Compiled = {
|
|
10
|
+
export type Compiled<T extends BaseType = BaseType> = {
|
|
9
11
|
check: (val: unknown) => boolean
|
|
10
12
|
errors: (val: unknown) => ValueErrorIterator
|
|
11
13
|
prepare: (val: unknown) => unknown
|
|
12
14
|
convert: (val: unknown) => unknown
|
|
13
|
-
decode: (
|
|
15
|
+
decode: (val: unknown) => T[typeStatic]['decoded']
|
|
16
|
+
encode: (val: unknown) => T[typeStatic]['encoded']
|
|
17
|
+
decodeSafe: (
|
|
14
18
|
val: unknown,
|
|
15
|
-
) =>
|
|
16
|
-
|
|
19
|
+
) =>
|
|
20
|
+
| { success: true; value: T[typeStatic]['decoded'] }
|
|
21
|
+
| { success: false; error: any }
|
|
22
|
+
encodeSafe: (
|
|
17
23
|
val: unknown,
|
|
18
|
-
) =>
|
|
24
|
+
) =>
|
|
25
|
+
| { success: true; value: T[typeStatic]['encoded'] }
|
|
26
|
+
| { success: false; error: any }
|
|
19
27
|
}
|
|
20
28
|
|
|
21
|
-
|
|
29
|
+
function _prepare(schema: TSchema, value: any) {
|
|
30
|
+
return Value.Default(schema, Value.Clean(schema, value))
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function _convert(schema: TSchema, value: any) {
|
|
34
|
+
return Value.Convert(schema, value)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function compileType(type: BaseType) {
|
|
22
38
|
const schema = getTypeSchema(type)
|
|
23
39
|
const compiled = TypeCompiler.Compile(schema)
|
|
24
|
-
const prepare = (value: any) => {
|
|
25
|
-
for (const fn of [Value.Clean, Value.Default]) {
|
|
26
|
-
value = fn(schema, value)
|
|
27
|
-
}
|
|
28
|
-
return value
|
|
29
|
-
}
|
|
30
|
-
const convert = (value: any) => Value.Convert(schema, value)
|
|
31
40
|
return {
|
|
32
41
|
check: compiled.Check.bind(compiled),
|
|
33
42
|
errors: compiled.Errors.bind(compiled),
|
|
34
43
|
decode: compiled.Decode.bind(compiled),
|
|
35
44
|
encode: compiled.Encode.bind(compiled),
|
|
36
|
-
prepare,
|
|
37
|
-
convert,
|
|
45
|
+
prepare: _prepare.bind(null, schema),
|
|
46
|
+
convert: _convert.bind(null, schema),
|
|
38
47
|
}
|
|
39
48
|
}
|
|
40
49
|
|
|
41
|
-
export
|
|
50
|
+
export function compile<T extends BaseType>(schema: T): Compiled<T> {
|
|
42
51
|
const compiled = compileType(schema)
|
|
43
52
|
|
|
44
53
|
// TODO: custom error handling/shaping
|
|
45
54
|
return {
|
|
46
55
|
...compiled,
|
|
47
|
-
decode: (val) =>
|
|
56
|
+
decode: (val) => compiled.decode(val),
|
|
57
|
+
encode: (val) => compiled.encode(val),
|
|
58
|
+
decodeSafe: (val) => {
|
|
48
59
|
try {
|
|
49
60
|
return {
|
|
50
61
|
success: true as const,
|
|
51
|
-
value: compiled.decode(
|
|
62
|
+
value: compiled.decode(val),
|
|
52
63
|
}
|
|
53
64
|
} catch (error) {
|
|
54
65
|
return { success: false as const, error }
|
|
55
66
|
}
|
|
56
67
|
},
|
|
57
|
-
|
|
68
|
+
encodeSafe: (val) => {
|
|
58
69
|
try {
|
|
59
70
|
return {
|
|
60
71
|
success: true as const,
|
|
61
|
-
value: compiled.encode(
|
|
72
|
+
value: compiled.encode(val),
|
|
62
73
|
}
|
|
63
74
|
} catch (error) {
|
|
64
75
|
return { success: false as const, error }
|
|
@@ -66,3 +77,35 @@ export const compile = (schema: BaseType): Compiled => {
|
|
|
66
77
|
},
|
|
67
78
|
}
|
|
68
79
|
}
|
|
80
|
+
|
|
81
|
+
export namespace runtime {
|
|
82
|
+
export function prepare(type: BaseType, value: any) {
|
|
83
|
+
return _prepare(getTypeSchema(type), value)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export function convert(type: BaseType, value: any) {
|
|
87
|
+
return _convert(getTypeSchema(type), value)
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export function errors(type: BaseType, value: any): ValueErrorIterator {
|
|
91
|
+
return Value.Errors(getTypeSchema(type), value)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export function check(type: BaseType, value: any): boolean {
|
|
95
|
+
return Value.Check(getTypeSchema(type), value)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export function decode<T extends BaseType>(
|
|
99
|
+
type: BaseType,
|
|
100
|
+
value: any,
|
|
101
|
+
): T[typeStatic]['decoded'] {
|
|
102
|
+
return Value.Decode(getTypeSchema(type), value)
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export function encode<T extends BaseType>(
|
|
106
|
+
type: T,
|
|
107
|
+
value: any,
|
|
108
|
+
): T[typeStatic]['encoded'] {
|
|
109
|
+
return Value.Encode(getTypeSchema(type), value)
|
|
110
|
+
}
|
|
111
|
+
}
|
package/src/types/enum.ts
CHANGED
|
@@ -13,7 +13,7 @@ export class ObjectEnumType<
|
|
|
13
13
|
D extends boolean = false,
|
|
14
14
|
> extends BaseType<TNativeEnum<T>, N, O, D> {
|
|
15
15
|
constructor(
|
|
16
|
-
|
|
16
|
+
readonly values: T,
|
|
17
17
|
options: SchemaOptions = {},
|
|
18
18
|
isNullable: N = false as N,
|
|
19
19
|
isOptional: O = false as O,
|
|
@@ -74,7 +74,7 @@ export class EnumType<
|
|
|
74
74
|
D extends boolean = false,
|
|
75
75
|
> extends BaseType<TUnionEnum<T>, N, O, D> {
|
|
76
76
|
constructor(
|
|
77
|
-
|
|
77
|
+
readonly values: [...T],
|
|
78
78
|
options: SchemaOptions = {},
|
|
79
79
|
isNullable: N = false as N,
|
|
80
80
|
isOptional: O = false as O,
|
package/src/types/object.ts
CHANGED
|
@@ -2,12 +2,18 @@ import {
|
|
|
2
2
|
type ObjectOptions,
|
|
3
3
|
type TObject,
|
|
4
4
|
type TRecord,
|
|
5
|
+
type TSchema,
|
|
5
6
|
Type,
|
|
6
7
|
} from '@sinclair/typebox'
|
|
7
8
|
import type { typeStatic } from '../constants.ts'
|
|
8
9
|
import type { UnionToTupleString } from '../utils.ts'
|
|
9
10
|
import { BaseType, getTypeSchema } from './base.ts'
|
|
10
|
-
import {
|
|
11
|
+
import {
|
|
12
|
+
type AnyEnumType,
|
|
13
|
+
type AnyObjectEnumType,
|
|
14
|
+
EnumType,
|
|
15
|
+
ObjectEnumType,
|
|
16
|
+
} from './enum.ts'
|
|
11
17
|
import type { AnyLiteralType } from './literal.ts'
|
|
12
18
|
import type { AnyStringType } from './string.ts'
|
|
13
19
|
import type { AnyUnionType } from './union.ts'
|
|
@@ -170,11 +176,23 @@ export class RecordType<
|
|
|
170
176
|
}
|
|
171
177
|
|
|
172
178
|
protected _constructSchema(options: ObjectOptions, key: K, element: E) {
|
|
179
|
+
let keySchema: TSchema
|
|
180
|
+
|
|
181
|
+
if (key instanceof EnumType) {
|
|
182
|
+
keySchema = Type.Union(key.values.map((value) => Type.Literal(value)))
|
|
183
|
+
} else if (key instanceof ObjectEnumType) {
|
|
184
|
+
keySchema = Type.Union(
|
|
185
|
+
Object.values(key.values).map((value) => Type.Literal(value as string)),
|
|
186
|
+
)
|
|
187
|
+
} else {
|
|
188
|
+
keySchema = getTypeSchema(key)
|
|
189
|
+
}
|
|
190
|
+
|
|
173
191
|
return Type.Record(
|
|
174
|
-
|
|
192
|
+
keySchema,
|
|
175
193
|
getTypeSchema(element),
|
|
176
194
|
options,
|
|
177
|
-
) as TRecord<K[typeStatic]['schema'], E[typeStatic]['schema']>
|
|
195
|
+
) as unknown as TRecord<K[typeStatic]['schema'], E[typeStatic]['schema']>
|
|
178
196
|
}
|
|
179
197
|
|
|
180
198
|
nullable() {
|