@nmtjs/type 0.1.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/LICENSE.md +7 -0
- package/README.md +9 -0
- package/dist/compiler.js +57 -0
- package/dist/compiler.js.map +1 -0
- package/dist/formats.js +127 -0
- package/dist/formats.js.map +1 -0
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas/native-enum.js +14 -0
- package/dist/schemas/native-enum.js.map +1 -0
- package/dist/schemas/nullable.js +5 -0
- package/dist/schemas/nullable.js.map +1 -0
- package/dist/schemas/union-enum.js +13 -0
- package/dist/schemas/union-enum.js.map +1 -0
- package/dist/temporal.js +15 -0
- package/dist/temporal.js.map +1 -0
- package/dist/types/any.js +16 -0
- package/dist/types/any.js.map +1 -0
- package/dist/types/array.js +42 -0
- package/dist/types/array.js.map +1 -0
- package/dist/types/base.js +77 -0
- package/dist/types/base.js.map +1 -0
- package/dist/types/boolean.js +16 -0
- package/dist/types/boolean.js.map +1 -0
- package/dist/types/custom.js +23 -0
- package/dist/types/custom.js.map +1 -0
- package/dist/types/datetime.js +34 -0
- package/dist/types/datetime.js.map +1 -0
- package/dist/types/enum.js +41 -0
- package/dist/types/enum.js.map +1 -0
- package/dist/types/literal.js +21 -0
- package/dist/types/literal.js.map +1 -0
- package/dist/types/never.js +16 -0
- package/dist/types/never.js.map +1 -0
- package/dist/types/number.js +94 -0
- package/dist/types/number.js.map +1 -0
- package/dist/types/object.js +49 -0
- package/dist/types/object.js.map +1 -0
- package/dist/types/string.js +55 -0
- package/dist/types/string.js.map +1 -0
- package/dist/types/temporal.js +144 -0
- package/dist/types/temporal.js.map +1 -0
- package/dist/types/union.js +40 -0
- package/dist/types/union.js.map +1 -0
- package/dist/utils.js +1 -0
- package/dist/utils.js.map +1 -0
- package/package.json +43 -0
- package/src/compiler.ts +68 -0
- package/src/formats.ts +182 -0
- package/src/index.ts +79 -0
- package/src/schemas/native-enum.ts +29 -0
- package/src/schemas/nullable.ts +13 -0
- package/src/schemas/union-enum.ts +43 -0
- package/src/temporal.ts +34 -0
- package/src/types/any.ts +27 -0
- package/src/types/array.ts +66 -0
- package/src/types/base.ts +158 -0
- package/src/types/boolean.ts +27 -0
- package/src/types/custom.ts +36 -0
- package/src/types/datetime.ts +60 -0
- package/src/types/enum.ts +62 -0
- package/src/types/literal.ts +31 -0
- package/src/types/never.ts +30 -0
- package/src/types/number.ts +124 -0
- package/src/types/object.ts +83 -0
- package/src/types/string.ts +87 -0
- package/src/types/temporal.ts +227 -0
- package/src/types/union.ts +79 -0
- package/src/utils.ts +16 -0
- package/tsconfig.json +3 -0
package/LICENSE.md
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
Copyright (c) 2024 Denis Ilchyshyn
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
4
|
+
|
|
5
|
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
6
|
+
|
|
7
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# NeemataJS - RPC application server for real-time applications (proof of concept)
|
|
2
|
+
|
|
3
|
+
### Built with following in mind:
|
|
4
|
+
- transport-agnostic (like WebSockets, WebTransport, .etc)
|
|
5
|
+
- format-agnostic (like JSON, MessagePack, BSON, .etc)
|
|
6
|
+
- binary data streaming and event subscriptions
|
|
7
|
+
- contract-based API
|
|
8
|
+
- end-to-end type safety
|
|
9
|
+
- CPU-intensive task execution on separate workers
|
package/dist/compiler.js
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { TypeCompiler } from '@sinclair/typebox/compiler';
|
|
2
|
+
import { Value } from '@sinclair/typebox/value';
|
|
3
|
+
import { typeFinalSchema } from "./types/base.js";
|
|
4
|
+
const compileType = (type)=>{
|
|
5
|
+
const schema = type[typeFinalSchema];
|
|
6
|
+
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
|
+
return {
|
|
18
|
+
check: compiled.Check.bind(compiled),
|
|
19
|
+
errors: compiled.Errors.bind(compiled),
|
|
20
|
+
decode: compiled.Decode.bind(compiled),
|
|
21
|
+
encode: compiled.Encode.bind(compiled),
|
|
22
|
+
prepare,
|
|
23
|
+
convert
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
export const compile = (schema)=>{
|
|
27
|
+
const compiled = compileType(schema);
|
|
28
|
+
return {
|
|
29
|
+
...compiled,
|
|
30
|
+
decode: (val)=>{
|
|
31
|
+
try {
|
|
32
|
+
return {
|
|
33
|
+
success: true,
|
|
34
|
+
value: compiled.decode(compiled.prepare(val))
|
|
35
|
+
};
|
|
36
|
+
} catch (error) {
|
|
37
|
+
return {
|
|
38
|
+
success: false,
|
|
39
|
+
error
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
encode: (val)=>{
|
|
44
|
+
try {
|
|
45
|
+
return {
|
|
46
|
+
success: true,
|
|
47
|
+
value: compiled.encode(compiled.prepare(val))
|
|
48
|
+
};
|
|
49
|
+
} catch (error) {
|
|
50
|
+
return {
|
|
51
|
+
success: false,
|
|
52
|
+
error
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
};
|
|
@@ -0,0 +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, typeFinalSchema } 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 ) => { success: true; value: unknown } | { success: false; error: any }\n encode: (\n val: unknown,\n ) => { success: true; value: unknown } | { success: false; error: any }\n}\n\nconst compileType = (type: BaseType) => {\n const schema = type[typeFinalSchema]\n const compiled = TypeCompiler.Compile(schema)\n const prepare = (value: any) => {\n for (const fn of [Value.Clean, Value.Default]) {\n value = fn(schema, value)\n }\n return value\n }\n const convert = (value: any) => Value.Convert(schema, value)\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,\n convert,\n }\n}\n\nexport const compile = (schema: BaseType): Compiled => {\n const compiled = compileType(schema)\n\n // TODO: custom error handling/shaping\n return {\n ...compiled,\n decode: (val) => {\n try {\n return {\n success: true as const,\n value: compiled.decode(compiled.prepare(val)),\n }\n } catch (error) {\n return { success: false as const, error }\n }\n },\n encode: (val) => {\n try {\n return {\n success: true as const,\n value: compiled.encode(compiled.prepare(val)),\n }\n } catch (error) {\n return { success: false as const, error }\n }\n },\n }\n}\n"],"names":["TypeCompiler","Value","typeFinalSchema","compileType","type","schema","compiled","Compile","prepare","value","fn","Clean","Default","convert","Convert","check","Check","bind","errors","Errors","decode","Decode","encode","Encode","compile","val","success","error"],"mappings":"AAAA,SACEA,YAAY,QAEP,6BAA4B;AACnC,SAASC,KAAK,QAAQ,0BAAyB;AAC/C,SAAwBC,eAAe,QAAQ,kBAAiB;AAehE,MAAMC,cAAc,CAACC;IACnB,MAAMC,SAASD,IAAI,CAACF,gBAAgB;IACpC,MAAMI,WAAWN,aAAaO,OAAO,CAACF;IACtC,MAAMG,UAAU,CAACC;QACf,KAAK,MAAMC,MAAM;YAACT,MAAMU,KAAK;YAAEV,MAAMW,OAAO;SAAC,CAAE;YAC7CH,QAAQC,GAAGL,QAAQI;QACrB;QACA,OAAOA;IACT;IACA,MAAMI,UAAU,CAACJ,QAAeR,MAAMa,OAAO,CAACT,QAAQI;IACtD,OAAO;QACLM,OAAOT,SAASU,KAAK,CAACC,IAAI,CAACX;QAC3BY,QAAQZ,SAASa,MAAM,CAACF,IAAI,CAACX;QAC7Bc,QAAQd,SAASe,MAAM,CAACJ,IAAI,CAACX;QAC7BgB,QAAQhB,SAASiB,MAAM,CAACN,IAAI,CAACX;QAC7BE;QACAK;IACF;AACF;AAEA,OAAO,MAAMW,UAAU,CAACnB;IACtB,MAAMC,WAAWH,YAAYE;IAG7B,OAAO;QACL,GAAGC,QAAQ;QACXc,QAAQ,CAACK;YACP,IAAI;gBACF,OAAO;oBACLC,SAAS;oBACTjB,OAAOH,SAASc,MAAM,CAACd,SAASE,OAAO,CAACiB;gBAC1C;YACF,EAAE,OAAOE,OAAO;gBACd,OAAO;oBAAED,SAAS;oBAAgBC;gBAAM;YAC1C;QACF;QACAL,QAAQ,CAACG;YACP,IAAI;gBACF,OAAO;oBACLC,SAAS;oBACTjB,OAAOH,SAASgB,MAAM,CAAChB,SAASE,OAAO,CAACiB;gBAC1C;YACF,EAAE,OAAOE,OAAO;gBACd,OAAO;oBAAED,SAAS;oBAAgBC;gBAAM;YAC1C;QACF;IACF;AACF,EAAC"}
|
package/dist/formats.js
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { FormatRegistry } from '@sinclair/typebox/type';
|
|
2
|
+
export const register = ()=>{
|
|
3
|
+
for (const [name, format] of Object.entries(fullFormats)){
|
|
4
|
+
if (format === true) {
|
|
5
|
+
FormatRegistry.Set(name, ()=>true);
|
|
6
|
+
continue;
|
|
7
|
+
}
|
|
8
|
+
if (typeof format === 'function') {
|
|
9
|
+
FormatRegistry.Set(name, format);
|
|
10
|
+
continue;
|
|
11
|
+
}
|
|
12
|
+
FormatRegistry.Set(name, (value)=>format.test(value));
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
export const fullFormats = {
|
|
16
|
+
date,
|
|
17
|
+
time: getTime(true),
|
|
18
|
+
'date-time': getDateTime(true),
|
|
19
|
+
'iso-time': getTime(),
|
|
20
|
+
'iso-date-time': getDateTime(),
|
|
21
|
+
duration: /^P(?!$)((\d+Y)?(\d+M)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+S)?)?|(\d+W)?)$/,
|
|
22
|
+
uri,
|
|
23
|
+
'uri-reference': /^(?:[a-z][a-z0-9+\-.]*:)?(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'"()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?(?:\?(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i,
|
|
24
|
+
'uri-template': /^(?:(?:[^\x00-\x20"'<>%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i,
|
|
25
|
+
url: /^(?:https?|ftp):\/\/(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u{00a1}-\u{ffff}]+-)*[a-z0-9\u{00a1}-\u{ffff}]+)(?:\.(?:[a-z0-9\u{00a1}-\u{ffff}]+-)*[a-z0-9\u{00a1}-\u{ffff}]+)*(?:\.(?:[a-z\u{00a1}-\u{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/iu,
|
|
26
|
+
email: /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i,
|
|
27
|
+
hostname: /^(?=.{1,253}\.?$)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[-0-9a-z]{0,61}[0-9a-z])?)*\.?$/i,
|
|
28
|
+
ipv4: /^(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)$/,
|
|
29
|
+
ipv6: /^((([0-9a-f]{1,4}:){7}([0-9a-f]{1,4}|:))|(([0-9a-f]{1,4}:){6}(:[0-9a-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){5}(((:[0-9a-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){4}(((:[0-9a-f]{1,4}){1,3})|((:[0-9a-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){3}(((:[0-9a-f]{1,4}){1,4})|((:[0-9a-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){2}(((:[0-9a-f]{1,4}){1,5})|((:[0-9a-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){1}(((:[0-9a-f]{1,4}){1,6})|((:[0-9a-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9a-f]{1,4}){1,7})|((:[0-9a-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))$/i,
|
|
30
|
+
regex,
|
|
31
|
+
uuid: /^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i,
|
|
32
|
+
'json-pointer': /^(?:\/(?:[^~/]|~0|~1)*)*$/,
|
|
33
|
+
'json-pointer-uri-fragment': /^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i,
|
|
34
|
+
'relative-json-pointer': /^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/,
|
|
35
|
+
byte,
|
|
36
|
+
int32: validateInt32,
|
|
37
|
+
int64: validateInt64,
|
|
38
|
+
float: validateNumber,
|
|
39
|
+
double: validateNumber,
|
|
40
|
+
password: true,
|
|
41
|
+
binary: true
|
|
42
|
+
};
|
|
43
|
+
function isLeapYear(year) {
|
|
44
|
+
return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
|
|
45
|
+
}
|
|
46
|
+
const DATE = /^(\d\d\d\d)-(\d\d)-(\d\d)$/;
|
|
47
|
+
const DAYS = [
|
|
48
|
+
0,
|
|
49
|
+
31,
|
|
50
|
+
28,
|
|
51
|
+
31,
|
|
52
|
+
30,
|
|
53
|
+
31,
|
|
54
|
+
30,
|
|
55
|
+
31,
|
|
56
|
+
31,
|
|
57
|
+
30,
|
|
58
|
+
31,
|
|
59
|
+
30,
|
|
60
|
+
31
|
|
61
|
+
];
|
|
62
|
+
function date(str) {
|
|
63
|
+
const matches = DATE.exec(str);
|
|
64
|
+
if (!matches) return false;
|
|
65
|
+
const year = +matches[1];
|
|
66
|
+
const month = +matches[2];
|
|
67
|
+
const day = +matches[3];
|
|
68
|
+
return month >= 1 && month <= 12 && day >= 1 && day <= (month === 2 && isLeapYear(year) ? 29 : DAYS[month]);
|
|
69
|
+
}
|
|
70
|
+
const TIME = /^(\d\d):(\d\d):(\d\d(?:\.\d+)?)(z|([+-])(\d\d)(?::?(\d\d))?)?$/i;
|
|
71
|
+
function getTime(strictTimeZone) {
|
|
72
|
+
return function time(str) {
|
|
73
|
+
const matches = TIME.exec(str);
|
|
74
|
+
if (!matches) return false;
|
|
75
|
+
const hr = +matches[1];
|
|
76
|
+
const min = +matches[2];
|
|
77
|
+
const sec = +matches[3];
|
|
78
|
+
const tz = matches[4];
|
|
79
|
+
const tzSign = matches[5] === '-' ? -1 : 1;
|
|
80
|
+
const tzH = +(matches[6] || 0);
|
|
81
|
+
const tzM = +(matches[7] || 0);
|
|
82
|
+
if (tzH > 23 || tzM > 59 || strictTimeZone && !tz) return false;
|
|
83
|
+
if (hr <= 23 && min <= 59 && sec < 60) return true;
|
|
84
|
+
const utcMin = min - tzM * tzSign;
|
|
85
|
+
const utcHr = hr - tzH * tzSign - (utcMin < 0 ? 1 : 0);
|
|
86
|
+
return (utcHr === 23 || utcHr === -1) && (utcMin === 59 || utcMin === -1) && sec < 61;
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
const DATE_TIME_SEPARATOR = /t|\s/i;
|
|
90
|
+
function getDateTime(strictTimeZone) {
|
|
91
|
+
const time = getTime(strictTimeZone);
|
|
92
|
+
return function date_time(str) {
|
|
93
|
+
const dateTime = str.split(DATE_TIME_SEPARATOR);
|
|
94
|
+
return dateTime.length === 2 && date(dateTime[0]) && time(dateTime[1]);
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
const NOT_URI_FRAGMENT = /\/|:/;
|
|
98
|
+
const URI = /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)(?:\?(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i;
|
|
99
|
+
function uri(str) {
|
|
100
|
+
return NOT_URI_FRAGMENT.test(str) && URI.test(str);
|
|
101
|
+
}
|
|
102
|
+
const BYTE = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/gm;
|
|
103
|
+
function byte(str) {
|
|
104
|
+
BYTE.lastIndex = 0;
|
|
105
|
+
return BYTE.test(str);
|
|
106
|
+
}
|
|
107
|
+
const MIN_INT32 = -(2 ** 31);
|
|
108
|
+
const MAX_INT32 = 2 ** 31 - 1;
|
|
109
|
+
function validateInt32(value) {
|
|
110
|
+
return Number.isInteger(value) && value <= MAX_INT32 && value >= MIN_INT32;
|
|
111
|
+
}
|
|
112
|
+
function validateInt64(value) {
|
|
113
|
+
return Number.isInteger(value);
|
|
114
|
+
}
|
|
115
|
+
function validateNumber() {
|
|
116
|
+
return true;
|
|
117
|
+
}
|
|
118
|
+
const Z_ANCHOR = /[^\\]\\Z/;
|
|
119
|
+
function regex(str) {
|
|
120
|
+
if (Z_ANCHOR.test(str)) return false;
|
|
121
|
+
try {
|
|
122
|
+
new RegExp(str);
|
|
123
|
+
return true;
|
|
124
|
+
} catch (e) {
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/formats.ts"],"sourcesContent":["// Source: https://gist.github.com/ChuckJonas/74d9cfb6ba46244ef4eaa5818c06987b\n// TODO: review all of this\n\nimport { FormatRegistry } from '@sinclair/typebox/type'\n\nexport const register = () => {\n for (const [name, format] of Object.entries(fullFormats)) {\n if (format === true) {\n FormatRegistry.Set(name, () => true)\n continue\n }\n\n if (typeof format === 'function') {\n FormatRegistry.Set(name, format)\n continue\n }\n\n FormatRegistry.Set(name, (value) => format.test(value))\n }\n}\n\nexport const fullFormats: Record<\n string,\n RegExp | ((v: any) => boolean) | true\n> = {\n // date: http://tools.ietf.org/html/rfc3339#section-5.6\n date,\n // date-time: http://tools.ietf.org/html/rfc3339#section-5.6\n time: getTime(true),\n 'date-time': getDateTime(true),\n 'iso-time': getTime(),\n 'iso-date-time': getDateTime(),\n // duration: https://tools.ietf.org/html/rfc3339#appendix-A\n duration:\n /^P(?!$)((\\d+Y)?(\\d+M)?(\\d+D)?(T(?=\\d)(\\d+H)?(\\d+M)?(\\d+S)?)?|(\\d+W)?)$/,\n uri,\n 'uri-reference':\n /^(?:[a-z][a-z0-9+\\-.]*:)?(?:\\/?\\/(?:(?:[a-z0-9\\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\\.[a-z0-9\\-._~!$&'()*+,;=:]+)\\]|(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)|(?:[a-z0-9\\-._~!$&'\"()*+,;=]|%[0-9a-f]{2})*)(?::\\d*)?(?:\\/(?:[a-z0-9\\-._~!$&'\"()*+,;=:@]|%[0-9a-f]{2})*)*|\\/(?:(?:[a-z0-9\\-._~!$&'\"()*+,;=:@]|%[0-9a-f]{2})+(?:\\/(?:[a-z0-9\\-._~!$&'\"()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\\-._~!$&'\"()*+,;=:@]|%[0-9a-f]{2})+(?:\\/(?:[a-z0-9\\-._~!$&'\"()*+,;=:@]|%[0-9a-f]{2})*)*)?(?:\\?(?:[a-z0-9\\-._~!$&'\"()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\\-._~!$&'\"()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i,\n // uri-template: https://tools.ietf.org/html/rfc6570\n 'uri-template':\n // biome-ignore lint/suspicious/noControlCharactersInRegex:\n /^(?:(?:[^\\x00-\\x20\"'<>%\\\\^`{|}]|%[0-9a-f]{2})|\\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\\*)?)*\\})*$/i,\n // For the source: https://gist.github.com/dperini/729294\n // For test cases: https://mathiasbynens.be/demo/url-regex\n url: /^(?:https?|ftp):\\/\\/(?:\\S+(?::\\S*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z0-9\\u{00a1}-\\u{ffff}]+-)*[a-z0-9\\u{00a1}-\\u{ffff}]+)(?:\\.(?:[a-z0-9\\u{00a1}-\\u{ffff}]+-)*[a-z0-9\\u{00a1}-\\u{ffff}]+)*(?:\\.(?:[a-z\\u{00a1}-\\u{ffff}]{2,})))(?::\\d{2,5})?(?:\\/[^\\s]*)?$/iu,\n email:\n /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i,\n hostname:\n /^(?=.{1,253}\\.?$)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\\.[a-z0-9](?:[-0-9a-z]{0,61}[0-9a-z])?)*\\.?$/i,\n // optimized https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html\n ipv4: /^(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)$/,\n ipv6: /^((([0-9a-f]{1,4}:){7}([0-9a-f]{1,4}|:))|(([0-9a-f]{1,4}:){6}(:[0-9a-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9a-f]{1,4}:){5}(((:[0-9a-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9a-f]{1,4}:){4}(((:[0-9a-f]{1,4}){1,3})|((:[0-9a-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9a-f]{1,4}:){3}(((:[0-9a-f]{1,4}){1,4})|((:[0-9a-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9a-f]{1,4}:){2}(((:[0-9a-f]{1,4}){1,5})|((:[0-9a-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9a-f]{1,4}:){1}(((:[0-9a-f]{1,4}){1,6})|((:[0-9a-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9a-f]{1,4}){1,7})|((:[0-9a-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))$/i,\n regex,\n // uuid: http://tools.ietf.org/html/rfc4122\n uuid: /^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i,\n // JSON-pointer: https://tools.ietf.org/html/rfc6901\n // uri fragment: https://tools.ietf.org/html/rfc3986#appendix-A\n 'json-pointer': /^(?:\\/(?:[^~/]|~0|~1)*)*$/,\n 'json-pointer-uri-fragment':\n /^#(?:\\/(?:[a-z0-9_\\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i,\n // relative JSON-pointer: http://tools.ietf.org/html/draft-luff-relative-json-pointer-00\n 'relative-json-pointer': /^(?:0|[1-9][0-9]*)(?:#|(?:\\/(?:[^~/]|~0|~1)*)*)$/,\n // the following formats are used by the openapi specification: https://spec.openapis.org/oas/v3.0.0#data-types\n // byte: https://github.com/miguelmota/is-base64\n byte,\n // signed 32 bit integer\n int32: validateInt32,\n // signed 64 bit integer\n int64: validateInt64,\n // C-type float\n float: validateNumber,\n // C-type double\n double: validateNumber,\n // hint to the UI to hide input strings\n password: true,\n // unchecked string payload\n binary: true,\n}\n\nfunction isLeapYear(year: number): boolean {\n // https://tools.ietf.org/html/rfc3339#appendix-C\n return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0)\n}\n\nconst DATE = /^(\\d\\d\\d\\d)-(\\d\\d)-(\\d\\d)$/\nconst DAYS = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]\n\nfunction date(str: string): boolean {\n // full-date from http://tools.ietf.org/html/rfc3339#section-5.6\n const matches: string[] | null = DATE.exec(str)\n if (!matches) return false\n const year: number = +matches[1]\n const month: number = +matches[2]\n const day: number = +matches[3]\n return (\n month >= 1 &&\n month <= 12 &&\n day >= 1 &&\n day <= (month === 2 && isLeapYear(year) ? 29 : DAYS[month])\n )\n}\n\nconst TIME = /^(\\d\\d):(\\d\\d):(\\d\\d(?:\\.\\d+)?)(z|([+-])(\\d\\d)(?::?(\\d\\d))?)?$/i\n\nfunction getTime(strictTimeZone?: boolean): (str: string) => boolean {\n return function time(str: string): boolean {\n const matches: string[] | null = TIME.exec(str)\n if (!matches) return false\n const hr: number = +matches[1]\n const min: number = +matches[2]\n const sec: number = +matches[3]\n const tz: string | undefined = matches[4]\n const tzSign: number = matches[5] === '-' ? -1 : 1\n const tzH: number = +(matches[6] || 0)\n const tzM: number = +(matches[7] || 0)\n if (tzH > 23 || tzM > 59 || (strictTimeZone && !tz)) return false\n if (hr <= 23 && min <= 59 && sec < 60) return true\n // leap second\n const utcMin = min - tzM * tzSign\n const utcHr = hr - tzH * tzSign - (utcMin < 0 ? 1 : 0)\n return (\n (utcHr === 23 || utcHr === -1) &&\n (utcMin === 59 || utcMin === -1) &&\n sec < 61\n )\n }\n}\n\nconst DATE_TIME_SEPARATOR = /t|\\s/i\nfunction getDateTime(strictTimeZone?: boolean): (str: string) => boolean {\n const time = getTime(strictTimeZone)\n\n return function date_time(str: string): boolean {\n // http://tools.ietf.org/html/rfc3339#section-5.6\n const dateTime: string[] = str.split(DATE_TIME_SEPARATOR)\n return dateTime.length === 2 && date(dateTime[0]) && time(dateTime[1])\n }\n}\n\nconst NOT_URI_FRAGMENT = /\\/|:/\nconst URI =\n /^(?:[a-z][a-z0-9+\\-.]*:)(?:\\/?\\/(?:(?:[a-z0-9\\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\\.[a-z0-9\\-._~!$&'()*+,;=:]+)\\]|(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)|(?:[a-z0-9\\-._~!$&'()*+,;=]|%[0-9a-f]{2})*)(?::\\d*)?(?:\\/(?:[a-z0-9\\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*|\\/(?:(?:[a-z0-9\\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\\/(?:[a-z0-9\\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\\/(?:[a-z0-9\\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)(?:\\?(?:[a-z0-9\\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i\n\nfunction uri(str: string): boolean {\n // http://jmrware.com/articles/2009/uri_regexp/URI_regex.html + optional protocol + required \".\"\n return NOT_URI_FRAGMENT.test(str) && URI.test(str)\n}\n\nconst BYTE =\n /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/gm\n\nfunction byte(str: string): boolean {\n BYTE.lastIndex = 0\n return BYTE.test(str)\n}\n\nconst MIN_INT32 = -(2 ** 31)\nconst MAX_INT32 = 2 ** 31 - 1\n\nfunction validateInt32(value: number): boolean {\n return Number.isInteger(value) && value <= MAX_INT32 && value >= MIN_INT32\n}\n\nfunction validateInt64(value: number): boolean {\n // JSON and javascript max Int is 2**53, so any int that passes isInteger is valid for Int64\n return Number.isInteger(value)\n}\n\nfunction validateNumber(): boolean {\n return true\n}\n\nconst Z_ANCHOR = /[^\\\\]\\\\Z/\nfunction regex(str: string): boolean {\n if (Z_ANCHOR.test(str)) return false\n try {\n new RegExp(str)\n return true\n } catch (e) {\n return false\n }\n}\n"],"names":["FormatRegistry","register","name","format","Object","entries","fullFormats","Set","value","test","date","time","getTime","getDateTime","duration","uri","url","email","hostname","ipv4","ipv6","regex","uuid","byte","int32","validateInt32","int64","validateInt64","float","validateNumber","double","password","binary","isLeapYear","year","DATE","DAYS","str","matches","exec","month","day","TIME","strictTimeZone","hr","min","sec","tz","tzSign","tzH","tzM","utcMin","utcHr","DATE_TIME_SEPARATOR","date_time","dateTime","split","length","NOT_URI_FRAGMENT","URI","BYTE","lastIndex","MIN_INT32","MAX_INT32","Number","isInteger","Z_ANCHOR","RegExp","e"],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { ArrayType } from "./types/array.js";
|
|
2
|
+
import { BooleanType } from "./types/boolean.js";
|
|
3
|
+
import { CustomType } from "./types/custom.js";
|
|
4
|
+
import { DateTimeType, DateType } from "./types/datetime.js";
|
|
5
|
+
import { EnumType, NativeEnumType } from "./types/enum.js";
|
|
6
|
+
import { LiteralType } from "./types/literal.js";
|
|
7
|
+
import { IntegerType, NumberType } from "./types/number.js";
|
|
8
|
+
import { ObjectType } from "./types/object.js";
|
|
9
|
+
import { StringType } from "./types/string.js";
|
|
10
|
+
import { IntersactionType, UnionType } from "./types/union.js";
|
|
11
|
+
import { register } from "./formats.js";
|
|
12
|
+
import { AnyType } from "./types/any.js";
|
|
13
|
+
import { NeverType } from "./types/never.js";
|
|
14
|
+
register();
|
|
15
|
+
export * from "./schemas/native-enum.js";
|
|
16
|
+
export * from "./schemas/union-enum.js";
|
|
17
|
+
export * from "./schemas/nullable.js";
|
|
18
|
+
export { BaseType, getTypeSchema } from "./types/base.js";
|
|
19
|
+
export { ArrayType, BooleanType, CustomType, DateTimeType, DateType, EnumType, LiteralType, IntegerType, NumberType, ObjectType, StringType, IntersactionType, UnionType, AnyType, NeverType, };
|
|
20
|
+
export var t;
|
|
21
|
+
(function(t) {
|
|
22
|
+
t.never = ()=>new NeverType();
|
|
23
|
+
t.boolean = ()=>new BooleanType();
|
|
24
|
+
t.string = ()=>new StringType();
|
|
25
|
+
t.number = ()=>new NumberType();
|
|
26
|
+
t.integer = ()=>new IntegerType();
|
|
27
|
+
t.literal = (value)=>new LiteralType(value);
|
|
28
|
+
t.nativeEnum = (enumLike)=>new NativeEnumType(enumLike);
|
|
29
|
+
t.arrayEnum = (enumLike)=>new EnumType(enumLike);
|
|
30
|
+
t.date = ()=>new DateType();
|
|
31
|
+
t.datetime = ()=>new DateTimeType();
|
|
32
|
+
t.array = (element)=>new ArrayType(element);
|
|
33
|
+
t.object = (properties)=>new ObjectType(properties);
|
|
34
|
+
t.any = ()=>new AnyType();
|
|
35
|
+
t.or = (...types)=>new UnionType(types);
|
|
36
|
+
t.and = (...types)=>new IntersactionType(types);
|
|
37
|
+
t.custom = (decode, encode)=>new CustomType(decode, encode);
|
|
38
|
+
})(t || (t = {}));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts"],"sourcesContent":["import type { TLiteralValue } from '@sinclair/typebox'\nimport { ArrayType } from './types/array.ts'\nimport type { BaseType, staticType } from './types/base.ts'\nimport { BooleanType } from './types/boolean.ts'\nimport { CustomType } from './types/custom.ts'\nimport { DateTimeType, DateType } from './types/datetime.ts'\nimport { EnumType, NativeEnumType } from './types/enum.ts'\nimport { LiteralType } from './types/literal.ts'\nimport { IntegerType, NumberType } from './types/number.ts'\nimport { ObjectType } from './types/object.ts'\nimport { StringType } from './types/string.ts'\nimport { IntersactionType, UnionType } from './types/union.ts'\n\n// register ajv formats\nimport { register } from './formats.ts'\nimport { AnyType } from './types/any.ts'\nimport { NeverType } from './types/never.ts'\nregister()\n\nexport * from './schemas/native-enum.ts'\nexport * from './schemas/union-enum.ts'\nexport * from './schemas/nullable.ts'\nexport {\n BaseType,\n getTypeSchema,\n} from './types/base.ts'\nexport { type TSchema } from '@sinclair/typebox'\nexport {\n ArrayType,\n BooleanType,\n CustomType,\n DateTimeType,\n DateType,\n EnumType,\n LiteralType,\n IntegerType,\n NumberType,\n ObjectType,\n StringType,\n IntersactionType,\n UnionType,\n AnyType,\n NeverType,\n}\n\nexport namespace t {\n export namespace infer {\n export type decoded<T extends BaseType> = T[staticType]['decoded']\n export type encoded<T extends BaseType> = T[staticType]['encoded']\n }\n export const never = () => new NeverType()\n export const boolean = () => new BooleanType()\n export const string = () => new StringType()\n export const number = () => new NumberType()\n export const integer = () => new IntegerType()\n export const literal = <T extends TLiteralValue>(value: T) =>\n new LiteralType(value)\n export const nativeEnum = <T extends { [K in string]: K }>(enumLike: T) =>\n new NativeEnumType(enumLike)\n export const arrayEnum = <T extends (string | number)[]>(enumLike: [...T]) =>\n new EnumType(enumLike)\n export const date = () => new DateType()\n export const datetime = () => new DateTimeType()\n export const array = <T extends BaseType>(element: T) =>\n new ArrayType(element)\n export const object = <T extends Record<string, BaseType>>(properties: T) =>\n new ObjectType(properties)\n export const any = () => new AnyType()\n export const or = <T extends [BaseType, BaseType, ...BaseType[]]>(\n ...types: T\n ) => new UnionType(types)\n export const and = <T extends [BaseType, BaseType, ...BaseType[]]>(\n ...types: T\n ) => new IntersactionType(types)\n export const custom = <T>(\n decode: (value: any) => T,\n encode: (value: T) => any,\n ) => new CustomType<T>(decode, encode)\n}\n"],"names":["ArrayType","BooleanType","CustomType","DateTimeType","DateType","EnumType","NativeEnumType","LiteralType","IntegerType","NumberType","ObjectType","StringType","IntersactionType","UnionType","register","AnyType","NeverType","BaseType","getTypeSchema","t","never","boolean","string","number","integer","literal","value","nativeEnum","enumLike","arrayEnum","date","datetime","array","element","object","properties","any","or","types","and","custom","decode","encode"],"mappings":"AACA,SAASA,SAAS,QAAQ,mBAAkB;AAE5C,SAASC,WAAW,QAAQ,qBAAoB;AAChD,SAASC,UAAU,QAAQ,oBAAmB;AAC9C,SAASC,YAAY,EAAEC,QAAQ,QAAQ,sBAAqB;AAC5D,SAASC,QAAQ,EAAEC,cAAc,QAAQ,kBAAiB;AAC1D,SAASC,WAAW,QAAQ,qBAAoB;AAChD,SAASC,WAAW,EAAEC,UAAU,QAAQ,oBAAmB;AAC3D,SAASC,UAAU,QAAQ,oBAAmB;AAC9C,SAASC,UAAU,QAAQ,oBAAmB;AAC9C,SAASC,gBAAgB,EAAEC,SAAS,QAAQ,mBAAkB;AAG9D,SAASC,QAAQ,QAAQ,eAAc;AACvC,SAASC,OAAO,QAAQ,iBAAgB;AACxC,SAASC,SAAS,QAAQ,mBAAkB;AAC5CF;AAEA,cAAc,2BAA0B;AACxC,cAAc,0BAAyB;AACvC,cAAc,wBAAuB;AACrC,SACEG,QAAQ,EACRC,aAAa,QACR,kBAAiB;AAExB,SACElB,SAAS,EACTC,WAAW,EACXC,UAAU,EACVC,YAAY,EACZC,QAAQ,EACRC,QAAQ,EACRE,WAAW,EACXC,WAAW,EACXC,UAAU,EACVC,UAAU,EACVC,UAAU,EACVC,gBAAgB,EAChBC,SAAS,EACTE,OAAO,EACPC,SAAS,KACV;;UAEgBG;MAKFC,QAAQ,IAAM,IAAIJ;MAClBK,UAAU,IAAM,IAAIpB;MACpBqB,SAAS,IAAM,IAAIX;MACnBY,SAAS,IAAM,IAAId;MACnBe,UAAU,IAAM,IAAIhB;MACpBiB,UAAU,CAA0BC,QAC/C,IAAInB,YAAYmB;MACLC,aAAa,CAAiCC,WACzD,IAAItB,eAAesB;MACRC,YAAY,CAAgCD,WACvD,IAAIvB,SAASuB;MACFE,OAAO,IAAM,IAAI1B;MACjB2B,WAAW,IAAM,IAAI5B;MACrB6B,QAAQ,CAAqBC,UACxC,IAAIjC,UAAUiC;MACHC,SAAS,CAAqCC,aACzD,IAAIzB,WAAWyB;MACJC,MAAM,IAAM,IAAIrB;MAChBsB,KAAK,CAChB,GAAGC,QACA,IAAIzB,UAAUyB;MACNC,MAAM,CACjB,GAAGD,QACA,IAAI1B,iBAAiB0B;MACbE,SAAS,CACpBC,QACAC,SACG,IAAIxC,WAAcuC,QAAQC;AACjC,GAjCiBvB,MAAAA"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Kind, TypeRegistry } from '@sinclair/typebox/type';
|
|
2
|
+
export const NativeEnumKind = 'NativeEnum';
|
|
3
|
+
export function NativeEnum(value, options = {}) {
|
|
4
|
+
const values = Object.values(value);
|
|
5
|
+
function NativeEnumCheck(schema, value) {
|
|
6
|
+
return typeof value === 'string' && schema.enum.includes(value);
|
|
7
|
+
}
|
|
8
|
+
if (!TypeRegistry.Has(NativeEnumKind)) TypeRegistry.Set(NativeEnumKind, NativeEnumCheck);
|
|
9
|
+
return {
|
|
10
|
+
...options,
|
|
11
|
+
[Kind]: NativeEnumKind,
|
|
12
|
+
enum: values
|
|
13
|
+
};
|
|
14
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/schemas/native-enum.ts"],"sourcesContent":["import {\n Kind,\n type SchemaOptions,\n type TSchema,\n TypeRegistry,\n} from '@sinclair/typebox/type'\n\nexport const NativeEnumKind = 'NativeEnum'\nexport interface TNativeEnum<T extends Record<string, string>> extends TSchema {\n [Kind]: typeof NativeEnumKind\n static: T[keyof T][]\n enum: T[keyof T][]\n}\n\nexport function NativeEnum<T extends Record<string, string>>(\n value: T,\n options: SchemaOptions = {},\n) {\n const values = Object.values(value)\n\n function NativeEnumCheck(schema: TNativeEnum<T>, value: unknown) {\n return typeof value === 'string' && schema.enum.includes(value as any)\n }\n\n if (!TypeRegistry.Has(NativeEnumKind))\n TypeRegistry.Set(NativeEnumKind, NativeEnumCheck)\n\n return { ...options, [Kind]: NativeEnumKind, enum: values } as TNativeEnum<T>\n}\n"],"names":["Kind","TypeRegistry","NativeEnumKind","NativeEnum","value","options","values","Object","NativeEnumCheck","schema","enum","includes","Has","Set"],"mappings":"AAAA,SACEA,IAAI,EAGJC,YAAY,QACP,yBAAwB;AAE/B,OAAO,MAAMC,iBAAiB,aAAY;AAO1C,OAAO,SAASC,WACdC,KAAQ,EACRC,UAAyB,CAAC,CAAC;IAE3B,MAAMC,SAASC,OAAOD,MAAM,CAACF;IAE7B,SAASI,gBAAgBC,MAAsB,EAAEL,KAAc;QAC7D,OAAO,OAAOA,UAAU,YAAYK,OAAOC,IAAI,CAACC,QAAQ,CAACP;IAC3D;IAEA,IAAI,CAACH,aAAaW,GAAG,CAACV,iBACpBD,aAAaY,GAAG,CAACX,gBAAgBM;IAEnC,OAAO;QAAE,GAAGH,OAAO;QAAE,CAACL,KAAK,EAAEE;QAAgBQ,MAAMJ;IAAO;AAC5D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/schemas/nullable.ts"],"sourcesContent":["import {\n type SchemaOptions,\n type TNull,\n type TSchema,\n type TUnion,\n Type,\n} from '@sinclair/typebox/type'\n\nexport type TNullable<T extends TSchema> = TUnion<[T, TNull]>\nexport const Nullable = <T extends TSchema>(\n schema: T,\n options: SchemaOptions = {},\n) => Type.Union([schema, Type.Null()], options)\n"],"names":["Type","Nullable","schema","options","Union","Null"],"mappings":"AAAA,SAKEA,IAAI,QACC,yBAAwB;AAG/B,OAAO,MAAMC,WAAW,CACtBC,QACAC,UAAyB,CAAC,CAAC,GACxBH,KAAKI,KAAK,CAAC;QAACF;QAAQF,KAAKK,IAAI;KAAG,EAAEF,SAAQ"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Kind, TypeRegistry } from '@sinclair/typebox/type';
|
|
2
|
+
export const UnionEnumKind = 'UnionEnum';
|
|
3
|
+
export function UnionEnum(values, options = {}) {
|
|
4
|
+
function UnionEnumCheck(schema, value) {
|
|
5
|
+
return (typeof value === 'string' || typeof value === 'number') && schema.enum.includes(value);
|
|
6
|
+
}
|
|
7
|
+
if (!TypeRegistry.Has(UnionEnumKind)) TypeRegistry.Set(UnionEnumKind, UnionEnumCheck);
|
|
8
|
+
return {
|
|
9
|
+
...options,
|
|
10
|
+
[Kind]: UnionEnumKind,
|
|
11
|
+
enum: values
|
|
12
|
+
};
|
|
13
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/schemas/union-enum.ts"],"sourcesContent":["import {\n Kind,\n type SchemaOptions,\n type TSchema,\n TypeRegistry,\n} from '@sinclair/typebox/type'\n\nexport const UnionEnumKind = 'UnionEnum'\n\n// Ref: https://github.com/sinclairzx81/typebox/blob/master/example/prototypes/union-enum.ts\n\n// -------------------------------------------------------------------------------------\n// TUnionEnum\n// -------------------------------------------------------------------------------------\nexport interface TUnionEnum<T extends (string | number)[]> extends TSchema {\n [Kind]: typeof UnionEnumKind\n static: T[number]\n enum: T\n}\n\n// -------------------------------------------------------------------------------------\n// UnionEnum\n// -------------------------------------------------------------------------------------\n/** `[Experimental]` Creates a Union type with a `enum` schema representation */\nexport function UnionEnum<T extends (string | number)[]>(\n values: [...T],\n options: SchemaOptions = {},\n) {\n function UnionEnumCheck(\n schema: TUnionEnum<(string | number)[]>,\n value: unknown,\n ) {\n return (\n (typeof value === 'string' || typeof value === 'number') &&\n schema.enum.includes(value)\n )\n }\n\n if (!TypeRegistry.Has(UnionEnumKind))\n TypeRegistry.Set(UnionEnumKind, UnionEnumCheck)\n\n return { ...options, [Kind]: UnionEnumKind, enum: values } as TUnionEnum<T>\n}\n"],"names":["Kind","TypeRegistry","UnionEnumKind","UnionEnum","values","options","UnionEnumCheck","schema","value","enum","includes","Has","Set"],"mappings":"AAAA,SACEA,IAAI,EAGJC,YAAY,QACP,yBAAwB;AAE/B,OAAO,MAAMC,gBAAgB,YAAW;AAiBxC,OAAO,SAASC,UACdC,MAAc,EACdC,UAAyB,CAAC,CAAC;IAE3B,SAASC,eACPC,MAAuC,EACvCC,KAAc;QAEd,OACE,AAAC,CAAA,OAAOA,UAAU,YAAY,OAAOA,UAAU,QAAO,KACtDD,OAAOE,IAAI,CAACC,QAAQ,CAACF;IAEzB;IAEA,IAAI,CAACP,aAAaU,GAAG,CAACT,gBACpBD,aAAaW,GAAG,CAACV,eAAeI;IAElC,OAAO;QAAE,GAAGD,OAAO;QAAE,CAACL,KAAK,EAAEE;QAAeO,MAAML;IAAO;AAC3D"}
|
package/dist/temporal.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { DurationType, PlainDateTimeType, PlainDateType, PlainMonthDayType, PlainTimeType, PlainYearMonthType, ZonedDateTimeType } from "./types/temporal.js";
|
|
2
|
+
export function extend(value) {
|
|
3
|
+
return Object.assign({}, value, {
|
|
4
|
+
temporal: {
|
|
5
|
+
plainDate: ()=>new PlainDateType(),
|
|
6
|
+
plainDatetime: ()=>new PlainDateTimeType(),
|
|
7
|
+
plainTime: ()=>new PlainTimeType(),
|
|
8
|
+
zonedDatetime: ()=>new ZonedDateTimeType(),
|
|
9
|
+
duration: ()=>new DurationType(),
|
|
10
|
+
plainYearMonth: ()=>new PlainYearMonthType(),
|
|
11
|
+
plainMonthDay: ()=>new PlainMonthDayType()
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
export { DurationType, PlainDateTimeType, PlainDateType, PlainMonthDayType, PlainTimeType, PlainYearMonthType, ZonedDateTimeType, };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/temporal.ts"],"sourcesContent":["import type { t } from './index.ts'\nimport {\n DurationType,\n PlainDateTimeType,\n PlainDateType,\n PlainMonthDayType,\n PlainTimeType,\n PlainYearMonthType,\n ZonedDateTimeType,\n} from './types/temporal.ts'\n\nexport function extend<T extends typeof t>(value: T) {\n return Object.assign({}, value, {\n temporal: {\n plainDate: () => new PlainDateType(),\n plainDatetime: () => new PlainDateTimeType(),\n plainTime: () => new PlainTimeType(),\n zonedDatetime: () => new ZonedDateTimeType(),\n duration: () => new DurationType(),\n plainYearMonth: () => new PlainYearMonthType(),\n plainMonthDay: () => new PlainMonthDayType(),\n },\n })\n}\n\nexport {\n DurationType,\n PlainDateTimeType,\n PlainDateType,\n PlainMonthDayType,\n PlainTimeType,\n PlainYearMonthType,\n ZonedDateTimeType,\n}\n"],"names":["DurationType","PlainDateTimeType","PlainDateType","PlainMonthDayType","PlainTimeType","PlainYearMonthType","ZonedDateTimeType","extend","value","Object","assign","temporal","plainDate","plainDatetime","plainTime","zonedDatetime","duration","plainYearMonth","plainMonthDay"],"mappings":"AACA,SACEA,YAAY,EACZC,iBAAiB,EACjBC,aAAa,EACbC,iBAAiB,EACjBC,aAAa,EACbC,kBAAkB,EAClBC,iBAAiB,QACZ,sBAAqB;AAE5B,OAAO,SAASC,OAA2BC,KAAQ;IACjD,OAAOC,OAAOC,MAAM,CAAC,CAAC,GAAGF,OAAO;QAC9BG,UAAU;YACRC,WAAW,IAAM,IAAIV;YACrBW,eAAe,IAAM,IAAIZ;YACzBa,WAAW,IAAM,IAAIV;YACrBW,eAAe,IAAM,IAAIT;YACzBU,UAAU,IAAM,IAAIhB;YACpBiB,gBAAgB,IAAM,IAAIZ;YAC1Ba,eAAe,IAAM,IAAIf;QAC3B;IACF;AACF;AAEA,SACEH,YAAY,EACZC,iBAAiB,EACjBC,aAAa,EACbC,iBAAiB,EACjBC,aAAa,EACbC,kBAAkB,EAClBC,iBAAiB,KAClB"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Type } from '@sinclair/typebox';
|
|
2
|
+
import { BaseType } from "./base.js";
|
|
3
|
+
export class AnyType extends BaseType {
|
|
4
|
+
constructor(schema = Type.Any(), nullable = false, optional = false){
|
|
5
|
+
super(schema, nullable, optional);
|
|
6
|
+
}
|
|
7
|
+
nullable() {
|
|
8
|
+
return new AnyType(...this._nullable());
|
|
9
|
+
}
|
|
10
|
+
optional() {
|
|
11
|
+
return new AnyType(...this._optional());
|
|
12
|
+
}
|
|
13
|
+
nullish() {
|
|
14
|
+
return new AnyType(...this._nullish());
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/types/any.ts"],"sourcesContent":["import { type TAny, Type } from '@sinclair/typebox'\nimport { BaseType } from './base.ts'\n\nexport class AnyType<\n N extends boolean = false,\n O extends boolean = false,\n> extends BaseType<TAny, N, O> {\n constructor(\n schema = Type.Any(),\n nullable: N = false as N,\n optional: O = false as O,\n ) {\n super(schema, nullable, optional)\n }\n\n nullable() {\n return new AnyType(...this._nullable())\n }\n\n optional() {\n return new AnyType(...this._optional())\n }\n\n nullish() {\n return new AnyType(...this._nullish())\n }\n}\n"],"names":["Type","BaseType","AnyType","constructor","schema","Any","nullable","optional","_nullable","_optional","nullish","_nullish"],"mappings":"AAAA,SAAoBA,IAAI,QAAQ,oBAAmB;AACnD,SAASC,QAAQ,QAAQ,YAAW;AAEpC,OAAO,MAAMC,gBAGHD;IACRE,YACEC,SAASJ,KAAKK,GAAG,EAAE,EACnBC,WAAc,KAAU,EACxBC,WAAc,KAAU,CACxB;QACA,KAAK,CAACH,QAAQE,UAAUC;IAC1B;IAEAD,WAAW;QACT,OAAO,IAAIJ,WAAW,IAAI,CAACM,SAAS;IACtC;IAEAD,WAAW;QACT,OAAO,IAAIL,WAAW,IAAI,CAACO,SAAS;IACtC;IAEAC,UAAU;QACR,OAAO,IAAIR,WAAW,IAAI,CAACS,QAAQ;IACrC;AACF"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Type } from '@sinclair/typebox';
|
|
2
|
+
import { BaseType, typeFinalSchema } from "./base.js";
|
|
3
|
+
export class ArrayType extends BaseType {
|
|
4
|
+
element;
|
|
5
|
+
options;
|
|
6
|
+
constructor(element, options = {}, nullable = false, optional = false){
|
|
7
|
+
super(Type.Array(element[typeFinalSchema]), nullable, optional);
|
|
8
|
+
this.element = element;
|
|
9
|
+
this.options = options;
|
|
10
|
+
}
|
|
11
|
+
nullable() {
|
|
12
|
+
const [_, ...args] = this._nullable();
|
|
13
|
+
return new ArrayType(this.element, this.options, ...args);
|
|
14
|
+
}
|
|
15
|
+
optional() {
|
|
16
|
+
const [_, ...args] = this._optional();
|
|
17
|
+
return new ArrayType(this.element, this.options, ...args);
|
|
18
|
+
}
|
|
19
|
+
nullish() {
|
|
20
|
+
const [_, ...args] = this._nullish();
|
|
21
|
+
return new ArrayType(this.element, this.options, ...args);
|
|
22
|
+
}
|
|
23
|
+
min(value) {
|
|
24
|
+
return new ArrayType(this.element, {
|
|
25
|
+
...this.options,
|
|
26
|
+
minItems: value
|
|
27
|
+
}, ...this._isNullableOptional);
|
|
28
|
+
}
|
|
29
|
+
max(value) {
|
|
30
|
+
return new ArrayType(this.element, {
|
|
31
|
+
...this.options,
|
|
32
|
+
maxItems: value
|
|
33
|
+
}, ...this._isNullableOptional);
|
|
34
|
+
}
|
|
35
|
+
length(value) {
|
|
36
|
+
return new ArrayType(this.element, {
|
|
37
|
+
...this.options,
|
|
38
|
+
minItems: value,
|
|
39
|
+
maxItems: value
|
|
40
|
+
}, ...this._isNullableOptional);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/types/array.ts"],"sourcesContent":["import { type ArrayOptions, type TArray, Type } from '@sinclair/typebox'\nimport { BaseType, typeFinalSchema } from './base.ts'\n\nexport class ArrayType<\n T extends BaseType = BaseType,\n N extends boolean = false,\n O extends boolean = false,\n> extends BaseType<TArray<T[typeFinalSchema]>, N, O> {\n constructor(\n readonly element: T,\n readonly options: ArrayOptions = {},\n nullable: N = false as N,\n optional: O = false as O,\n ) {\n super(Type.Array(element[typeFinalSchema]), nullable, optional)\n }\n\n nullable() {\n const [_, ...args] = this._nullable()\n return new ArrayType(this.element, this.options, ...args)\n }\n\n optional() {\n const [_, ...args] = this._optional()\n return new ArrayType(this.element, this.options, ...args)\n }\n\n nullish() {\n const [_, ...args] = this._nullish()\n return new ArrayType(this.element, this.options, ...args)\n }\n\n min(value: number) {\n return new ArrayType(\n this.element,\n {\n ...this.options,\n minItems: value,\n },\n ...this._isNullableOptional,\n )\n }\n\n max(value: number) {\n return new ArrayType(\n this.element,\n {\n ...this.options,\n maxItems: value,\n },\n ...this._isNullableOptional,\n )\n }\n\n length(value: number) {\n return new ArrayType(\n this.element,\n {\n ...this.options,\n minItems: value,\n maxItems: value,\n },\n ...this._isNullableOptional,\n )\n }\n}\n"],"names":["Type","BaseType","typeFinalSchema","ArrayType","constructor","element","options","nullable","optional","Array","_","args","_nullable","_optional","nullish","_nullish","min","value","minItems","_isNullableOptional","max","maxItems","length"],"mappings":"AAAA,SAAyCA,IAAI,QAAQ,oBAAmB;AACxE,SAASC,QAAQ,EAAEC,eAAe,QAAQ,YAAW;AAErD,OAAO,MAAMC,kBAIHF;;;IACRG,YACE,AAASC,OAAU,EACnB,AAASC,UAAwB,CAAC,CAAC,EACnCC,WAAc,KAAU,EACxBC,WAAc,KAAU,CACxB;QACA,KAAK,CAACR,KAAKS,KAAK,CAACJ,OAAO,CAACH,gBAAgB,GAAGK,UAAUC;aAL7CH,UAAAA;aACAC,UAAAA;IAKX;IAEAC,WAAW;QACT,MAAM,CAACG,GAAG,GAAGC,KAAK,GAAG,IAAI,CAACC,SAAS;QACnC,OAAO,IAAIT,UAAU,IAAI,CAACE,OAAO,EAAE,IAAI,CAACC,OAAO,KAAKK;IACtD;IAEAH,WAAW;QACT,MAAM,CAACE,GAAG,GAAGC,KAAK,GAAG,IAAI,CAACE,SAAS;QACnC,OAAO,IAAIV,UAAU,IAAI,CAACE,OAAO,EAAE,IAAI,CAACC,OAAO,KAAKK;IACtD;IAEAG,UAAU;QACR,MAAM,CAACJ,GAAG,GAAGC,KAAK,GAAG,IAAI,CAACI,QAAQ;QAClC,OAAO,IAAIZ,UAAU,IAAI,CAACE,OAAO,EAAE,IAAI,CAACC,OAAO,KAAKK;IACtD;IAEAK,IAAIC,KAAa,EAAE;QACjB,OAAO,IAAId,UACT,IAAI,CAACE,OAAO,EACZ;YACE,GAAG,IAAI,CAACC,OAAO;YACfY,UAAUD;QACZ,MACG,IAAI,CAACE,mBAAmB;IAE/B;IAEAC,IAAIH,KAAa,EAAE;QACjB,OAAO,IAAId,UACT,IAAI,CAACE,OAAO,EACZ;YACE,GAAG,IAAI,CAACC,OAAO;YACfe,UAAUJ;QACZ,MACG,IAAI,CAACE,mBAAmB;IAE/B;IAEAG,OAAOL,KAAa,EAAE;QACpB,OAAO,IAAId,UACT,IAAI,CAACE,OAAO,EACZ;YACE,GAAG,IAAI,CAACC,OAAO;YACfY,UAAUD;YACVI,UAAUJ;QACZ,MACG,IAAI,CAACE,mBAAmB;IAE/B;AACF"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { Type } from '@sinclair/typebox';
|
|
2
|
+
import { Nullable } from "../schemas/nullable.js";
|
|
3
|
+
export const typeSchema = Symbol();
|
|
4
|
+
export const typeOptions = Symbol();
|
|
5
|
+
export const typeOptional = Symbol();
|
|
6
|
+
export const typeNullable = Symbol();
|
|
7
|
+
export const staticType = Symbol();
|
|
8
|
+
export const typeFinalSchema = Symbol();
|
|
9
|
+
export class BaseType {
|
|
10
|
+
[typeSchema];
|
|
11
|
+
[typeNullable];
|
|
12
|
+
[typeOptional];
|
|
13
|
+
[staticType];
|
|
14
|
+
constructor(schema, nullable = false, optional = false){
|
|
15
|
+
this[typeSchema] = schema;
|
|
16
|
+
this[typeNullable] = nullable;
|
|
17
|
+
this[typeOptional] = optional;
|
|
18
|
+
}
|
|
19
|
+
get [typeFinalSchema]() {
|
|
20
|
+
let schema = this._schema;
|
|
21
|
+
if (this._isNullable) {
|
|
22
|
+
schema = Nullable(schema);
|
|
23
|
+
}
|
|
24
|
+
if (this._isOptional) {
|
|
25
|
+
schema = Type.Optional(schema);
|
|
26
|
+
}
|
|
27
|
+
return schema;
|
|
28
|
+
}
|
|
29
|
+
get _schema() {
|
|
30
|
+
return this[typeSchema];
|
|
31
|
+
}
|
|
32
|
+
get _isNullable() {
|
|
33
|
+
return this[typeNullable];
|
|
34
|
+
}
|
|
35
|
+
get _isOptional() {
|
|
36
|
+
return this[typeOptional];
|
|
37
|
+
}
|
|
38
|
+
get _isNullableOptional() {
|
|
39
|
+
return [
|
|
40
|
+
this._isNullable,
|
|
41
|
+
this._isOptional
|
|
42
|
+
];
|
|
43
|
+
}
|
|
44
|
+
_contructSelf(...args) {
|
|
45
|
+
return args;
|
|
46
|
+
}
|
|
47
|
+
_nullable() {
|
|
48
|
+
return this._contructSelf(this._schema, true, this[typeOptional]);
|
|
49
|
+
}
|
|
50
|
+
_optional() {
|
|
51
|
+
return this._contructSelf(this._schema, this[typeNullable], true);
|
|
52
|
+
}
|
|
53
|
+
_nullish() {
|
|
54
|
+
return this._contructSelf(this._schema, true, true);
|
|
55
|
+
}
|
|
56
|
+
default(value) {
|
|
57
|
+
return this._contructSelf({
|
|
58
|
+
...this._schema,
|
|
59
|
+
default: value
|
|
60
|
+
}, this[typeNullable], this[typeOptional]);
|
|
61
|
+
}
|
|
62
|
+
description(description) {
|
|
63
|
+
return this._contructSelf({
|
|
64
|
+
...this._schema,
|
|
65
|
+
description
|
|
66
|
+
}, this[typeNullable], this[typeOptional]);
|
|
67
|
+
}
|
|
68
|
+
examples(...examples) {
|
|
69
|
+
return this._contructSelf({
|
|
70
|
+
...this._schema,
|
|
71
|
+
examples
|
|
72
|
+
}, this[typeNullable], this[typeOptional]);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
export function getTypeSchema(type) {
|
|
76
|
+
return type[typeFinalSchema];
|
|
77
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/types/base.ts"],"sourcesContent":["import {\n type StaticDecode,\n type StaticEncode,\n type TAny,\n type TOptional,\n type TSchema,\n Type,\n} from '@sinclair/typebox'\nimport { Nullable, type TNullable } from '../schemas/nullable.ts'\n\nexport const typeSchema: unique symbol = Symbol()\nexport type typeSchema = typeof typeSchema\n\nexport const typeOptions: unique symbol = Symbol()\nexport type typeOptions = typeof typeOptions\n\nexport const typeOptional: unique symbol = Symbol()\nexport type typeOptional = typeof typeOptional\n\nexport const typeNullable: unique symbol = Symbol()\nexport type typeNullable = typeof typeNullable\n\nexport const staticType: unique symbol = Symbol()\nexport type staticType = typeof staticType\n\nexport const typeFinalSchema: unique symbol = Symbol()\nexport type typeFinalSchema = typeof typeFinalSchema\n\ntype ResolveNullable<T extends TSchema, Is extends boolean> = Is extends true\n ? T | TNullable<T>\n : T\n\ntype ResolveOptional<T extends TSchema, Is extends boolean> = Is extends true\n ? T | TOptional<T>\n : T\n\ntype Resolve<\n Schema extends TSchema,\n IsNullable extends boolean,\n IsOptional extends boolean,\n> = ResolveOptional<ResolveNullable<Schema, IsNullable>, IsOptional>\n\nexport abstract class BaseType<\n Schema extends TSchema = any,\n IsNullable extends boolean = boolean,\n IsOptional extends boolean = boolean,\n Final extends Resolve<Schema, IsNullable, IsOptional> = Resolve<\n Schema,\n IsNullable,\n IsOptional\n >,\n> {\n [typeSchema]: Schema;\n [typeNullable]: IsNullable;\n [typeOptional]: IsOptional;\n\n [staticType]!: {\n final: Final\n isOptional: IsOptional\n isNullable: IsNullable\n encoded: StaticEncode<Final>\n decoded: StaticDecode<Final>\n }\n\n constructor(\n schema: Schema,\n nullable: IsNullable = false as IsNullable,\n optional: IsOptional = false as IsOptional,\n ) {\n this[typeSchema] = schema\n this[typeNullable] = nullable\n this[typeOptional] = optional\n }\n\n get [typeFinalSchema](): Final {\n let schema: TSchema = this._schema\n if (this._isNullable) {\n schema = Nullable(schema)\n }\n if (this._isOptional) {\n schema = Type.Optional(schema)\n }\n return schema as Final\n }\n\n protected get _schema() {\n return this[typeSchema]\n }\n\n protected get _isNullable(): IsNullable {\n return this[typeNullable]\n }\n\n protected get _isOptional(): IsOptional {\n return this[typeOptional]\n }\n\n protected get _isNullableOptional(): [IsNullable, IsOptional] {\n return [this._isNullable, this._isOptional]\n }\n\n protected _contructSelf<T extends any[]>(...args: T) {\n return args\n }\n\n protected _nullable() {\n return this._contructSelf(this._schema, true as const, this[typeOptional])\n }\n\n protected _optional() {\n return this._contructSelf(this._schema, this[typeNullable], true as const)\n }\n\n protected _nullish() {\n return this._contructSelf(this._schema, true as const, true as const)\n }\n\n abstract nullable(): BaseType<Schema, true, IsOptional>\n abstract optional(): BaseType<Schema, IsNullable, true>\n abstract nullish(): BaseType<Schema, true, true>\n\n default(value: StaticDecode<Schema>): this {\n return this._contructSelf(\n {\n ...this._schema,\n default: value,\n },\n this[typeNullable],\n this[typeOptional],\n ) as unknown as this\n }\n\n description(description: string): this {\n return this._contructSelf(\n {\n ...this._schema,\n description,\n },\n this[typeNullable],\n this[typeOptional],\n ) as unknown as this\n }\n\n examples(...examples: StaticDecode<Schema>[]): this {\n return this._contructSelf(\n {\n ...this._schema,\n examples,\n },\n this[typeNullable],\n this[typeOptional],\n ) as unknown as this\n }\n}\n\nexport function getTypeSchema<T extends BaseType>(type: T): T[typeFinalSchema] {\n return type[typeFinalSchema]\n}\n"],"names":["Type","Nullable","typeSchema","Symbol","typeOptions","typeOptional","typeNullable","staticType","typeFinalSchema","BaseType","constructor","schema","nullable","optional","_schema","_isNullable","_isOptional","Optional","_isNullableOptional","_contructSelf","args","_nullable","_optional","_nullish","default","value","description","examples","getTypeSchema","type"],"mappings":"AAAA,SAMEA,IAAI,QACC,oBAAmB;AAC1B,SAASC,QAAQ,QAAwB,yBAAwB;AAEjE,OAAO,MAAMC,aAA4BC,SAAQ;AAGjD,OAAO,MAAMC,cAA6BD,SAAQ;AAGlD,OAAO,MAAME,eAA8BF,SAAQ;AAGnD,OAAO,MAAMG,eAA8BH,SAAQ;AAGnD,OAAO,MAAMI,aAA4BJ,SAAQ;AAGjD,OAAO,MAAMK,kBAAiCL,SAAQ;AAiBtD,OAAO,MAAeM;IAUpB,CAACP,WAAW,CAAS;IACrB,CAACI,aAAa,CAAa;IAC3B,CAACD,aAAa,CAAa;IAE3B,CAACE,WAAW,CAMX;IAEDG,YACEC,MAAc,EACdC,WAAuB,KAAmB,EAC1CC,WAAuB,KAAmB,CAC1C;QACA,IAAI,CAACX,WAAW,GAAGS;QACnB,IAAI,CAACL,aAAa,GAAGM;QACrB,IAAI,CAACP,aAAa,GAAGQ;IACvB;IAEA,IAAI,CAACL,gBAAgB,GAAU;QAC7B,IAAIG,SAAkB,IAAI,CAACG,OAAO;QAClC,IAAI,IAAI,CAACC,WAAW,EAAE;YACpBJ,SAASV,SAASU;QACpB;QACA,IAAI,IAAI,CAACK,WAAW,EAAE;YACpBL,SAASX,KAAKiB,QAAQ,CAACN;QACzB;QACA,OAAOA;IACT;IAEA,IAAcG,UAAU;QACtB,OAAO,IAAI,CAACZ,WAAW;IACzB;IAEA,IAAca,cAA0B;QACtC,OAAO,IAAI,CAACT,aAAa;IAC3B;IAEA,IAAcU,cAA0B;QACtC,OAAO,IAAI,CAACX,aAAa;IAC3B;IAEA,IAAca,sBAAgD;QAC5D,OAAO;YAAC,IAAI,CAACH,WAAW;YAAE,IAAI,CAACC,WAAW;SAAC;IAC7C;IAEUG,cAA+B,GAAGC,IAAO,EAAE;QACnD,OAAOA;IACT;IAEUC,YAAY;QACpB,OAAO,IAAI,CAACF,aAAa,CAAC,IAAI,CAACL,OAAO,EAAE,MAAe,IAAI,CAACT,aAAa;IAC3E;IAEUiB,YAAY;QACpB,OAAO,IAAI,CAACH,aAAa,CAAC,IAAI,CAACL,OAAO,EAAE,IAAI,CAACR,aAAa,EAAE;IAC9D;IAEUiB,WAAW;QACnB,OAAO,IAAI,CAACJ,aAAa,CAAC,IAAI,CAACL,OAAO,EAAE,MAAe;IACzD;IAMAU,QAAQC,KAA2B,EAAQ;QACzC,OAAO,IAAI,CAACN,aAAa,CACvB;YACE,GAAG,IAAI,CAACL,OAAO;YACfU,SAASC;QACX,GACA,IAAI,CAACnB,aAAa,EAClB,IAAI,CAACD,aAAa;IAEtB;IAEAqB,YAAYA,WAAmB,EAAQ;QACrC,OAAO,IAAI,CAACP,aAAa,CACvB;YACE,GAAG,IAAI,CAACL,OAAO;YACfY;QACF,GACA,IAAI,CAACpB,aAAa,EAClB,IAAI,CAACD,aAAa;IAEtB;IAEAsB,SAAS,GAAGA,QAAgC,EAAQ;QAClD,OAAO,IAAI,CAACR,aAAa,CACvB;YACE,GAAG,IAAI,CAACL,OAAO;YACfa;QACF,GACA,IAAI,CAACrB,aAAa,EAClB,IAAI,CAACD,aAAa;IAEtB;AACF;AAEA,OAAO,SAASuB,cAAkCC,IAAO;IACvD,OAAOA,IAAI,CAACrB,gBAAgB;AAC9B"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Type } from '@sinclair/typebox';
|
|
2
|
+
import { BaseType } from "./base.js";
|
|
3
|
+
export class BooleanType extends BaseType {
|
|
4
|
+
constructor(schema = Type.Boolean(), nullable = false, optional = false){
|
|
5
|
+
super(schema, nullable, optional);
|
|
6
|
+
}
|
|
7
|
+
nullable() {
|
|
8
|
+
return new BooleanType(...this._nullable());
|
|
9
|
+
}
|
|
10
|
+
optional() {
|
|
11
|
+
return new BooleanType(...this._optional());
|
|
12
|
+
}
|
|
13
|
+
nullish() {
|
|
14
|
+
return new BooleanType(...this._nullish());
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/types/boolean.ts"],"sourcesContent":["import { type TBoolean, Type } from '@sinclair/typebox'\nimport { BaseType } from './base.ts'\n\nexport class BooleanType<\n N extends boolean = false,\n O extends boolean = false,\n> extends BaseType<TBoolean, N, O> {\n constructor(\n schema: TBoolean = Type.Boolean(),\n nullable: N = false as N,\n optional: O = false as O,\n ) {\n super(schema, nullable, optional)\n }\n\n nullable() {\n return new BooleanType(...this._nullable())\n }\n\n optional() {\n return new BooleanType(...this._optional())\n }\n\n nullish() {\n return new BooleanType(...this._nullish())\n }\n}\n"],"names":["Type","BaseType","BooleanType","constructor","schema","Boolean","nullable","optional","_nullable","_optional","nullish","_nullish"],"mappings":"AAAA,SAAwBA,IAAI,QAAQ,oBAAmB;AACvD,SAASC,QAAQ,QAAQ,YAAW;AAEpC,OAAO,MAAMC,oBAGHD;IACRE,YACEC,SAAmBJ,KAAKK,OAAO,EAAE,EACjCC,WAAc,KAAU,EACxBC,WAAc,KAAU,CACxB;QACA,KAAK,CAACH,QAAQE,UAAUC;IAC1B;IAEAD,WAAW;QACT,OAAO,IAAIJ,eAAe,IAAI,CAACM,SAAS;IAC1C;IAEAD,WAAW;QACT,OAAO,IAAIL,eAAe,IAAI,CAACO,SAAS;IAC1C;IAEAC,UAAU;QACR,OAAO,IAAIR,eAAe,IAAI,CAACS,QAAQ;IACzC;AACF"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Type } from '@sinclair/typebox';
|
|
2
|
+
import { BaseType } from "./base.js";
|
|
3
|
+
export class CustomType extends BaseType {
|
|
4
|
+
decode;
|
|
5
|
+
encode;
|
|
6
|
+
constructor(decode, encode, nullable = false, optional = false){
|
|
7
|
+
super(Type.Optional(Type.Transform(Type.Any()).Decode(decode).Encode(encode)), nullable, optional);
|
|
8
|
+
this.decode = decode;
|
|
9
|
+
this.encode = encode;
|
|
10
|
+
}
|
|
11
|
+
nullable() {
|
|
12
|
+
const [_, ...args] = this._nullable();
|
|
13
|
+
return new CustomType(this.decode, this.encode, ...args);
|
|
14
|
+
}
|
|
15
|
+
optional() {
|
|
16
|
+
const [_, ...args] = this._optional();
|
|
17
|
+
return new CustomType(this.decode, this.encode, ...args);
|
|
18
|
+
}
|
|
19
|
+
nullish() {
|
|
20
|
+
const [_, ...args] = this._nullish();
|
|
21
|
+
return new CustomType(this.decode, this.encode, ...args);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/types/custom.ts"],"sourcesContent":["import { type TAny, type TTransform, Type } from '@sinclair/typebox'\nimport { BaseType } from './base.ts'\n\nexport class CustomType<\n T,\n N extends boolean = false,\n O extends boolean = false,\n> extends BaseType<TTransform<TAny, T>, N, O> {\n constructor(\n protected readonly decode: (value: any) => T,\n protected readonly encode: (value: T) => any,\n nullable: N = false as N,\n optional: O = false as O,\n ) {\n super(\n Type.Optional(Type.Transform(Type.Any()).Decode(decode).Encode(encode)),\n nullable,\n optional,\n )\n }\n\n nullable() {\n const [_, ...args] = this._nullable()\n return new CustomType(this.decode, this.encode, ...args)\n }\n\n optional() {\n const [_, ...args] = this._optional()\n return new CustomType(this.decode, this.encode, ...args)\n }\n\n nullish() {\n const [_, ...args] = this._nullish()\n return new CustomType(this.decode, this.encode, ...args)\n }\n}\n"],"names":["Type","BaseType","CustomType","constructor","decode","encode","nullable","optional","Optional","Transform","Any","Decode","Encode","_","args","_nullable","_optional","nullish","_nullish"],"mappings":"AAAA,SAAqCA,IAAI,QAAQ,oBAAmB;AACpE,SAASC,QAAQ,QAAQ,YAAW;AAEpC,OAAO,MAAMC,mBAIHD;;;IACRE,YACE,AAAmBC,MAAyB,EAC5C,AAAmBC,MAAyB,EAC5CC,WAAc,KAAU,EACxBC,WAAc,KAAU,CACxB;QACA,KAAK,CACHP,KAAKQ,QAAQ,CAACR,KAAKS,SAAS,CAACT,KAAKU,GAAG,IAAIC,MAAM,CAACP,QAAQQ,MAAM,CAACP,UAC/DC,UACAC;aARiBH,SAAAA;aACAC,SAAAA;IASrB;IAEAC,WAAW;QACT,MAAM,CAACO,GAAG,GAAGC,KAAK,GAAG,IAAI,CAACC,SAAS;QACnC,OAAO,IAAIb,WAAW,IAAI,CAACE,MAAM,EAAE,IAAI,CAACC,MAAM,KAAKS;IACrD;IAEAP,WAAW;QACT,MAAM,CAACM,GAAG,GAAGC,KAAK,GAAG,IAAI,CAACE,SAAS;QACnC,OAAO,IAAId,WAAW,IAAI,CAACE,MAAM,EAAE,IAAI,CAACC,MAAM,KAAKS;IACrD;IAEAG,UAAU;QACR,MAAM,CAACJ,GAAG,GAAGC,KAAK,GAAG,IAAI,CAACI,QAAQ;QAClC,OAAO,IAAIhB,WAAW,IAAI,CAACE,MAAM,EAAE,IAAI,CAACC,MAAM,KAAKS;IACrD;AACF"}
|