@nmtjs/type 0.4.7 → 0.5.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.
Files changed (69) hide show
  1. package/dist/compiler.js +84 -38
  2. package/dist/compiler.js.map +1 -1
  3. package/dist/formats.js +1 -1
  4. package/dist/formats.js.map +1 -1
  5. package/dist/index.js +53 -22
  6. package/dist/index.js.map +1 -1
  7. package/dist/schemas/discriminated-union.js +9 -0
  8. package/dist/schemas/discriminated-union.js.map +1 -0
  9. package/dist/schemas/nullable.js +1 -6
  10. package/dist/schemas/nullable.js.map +1 -1
  11. package/dist/temporal.js +7 -7
  12. package/dist/temporal.js.map +1 -1
  13. package/dist/types/any.js +3 -43
  14. package/dist/types/any.js.map +1 -1
  15. package/dist/types/array.js +17 -63
  16. package/dist/types/array.js.map +1 -1
  17. package/dist/types/base.js +78 -41
  18. package/dist/types/base.js.map +1 -1
  19. package/dist/types/boolean.js +3 -43
  20. package/dist/types/boolean.js.map +1 -1
  21. package/dist/types/custom.js +8 -48
  22. package/dist/types/custom.js.map +1 -1
  23. package/dist/types/date.js +8 -0
  24. package/dist/types/date.js.map +1 -0
  25. package/dist/types/enum.js +10 -94
  26. package/dist/types/enum.js.map +1 -1
  27. package/dist/types/literal.js +3 -43
  28. package/dist/types/literal.js.map +1 -1
  29. package/dist/types/never.js +3 -26
  30. package/dist/types/never.js.map +1 -1
  31. package/dist/types/number.js +52 -186
  32. package/dist/types/number.js.map +1 -1
  33. package/dist/types/object.js +10 -131
  34. package/dist/types/object.js.map +1 -1
  35. package/dist/types/string.js +25 -65
  36. package/dist/types/string.js.map +1 -1
  37. package/dist/types/temporal.js +23 -328
  38. package/dist/types/temporal.js.map +1 -1
  39. package/dist/types/union.js +16 -90
  40. package/dist/types/union.js.map +1 -1
  41. package/dist/utils.js.map +1 -1
  42. package/package.json +3 -3
  43. package/src/compiler.ts +124 -41
  44. package/src/formats.ts +1 -1
  45. package/src/index.ts +145 -63
  46. package/src/schemas/discriminated-union.ts +49 -0
  47. package/src/schemas/nullable.ts +7 -13
  48. package/src/temporal.ts +8 -7
  49. package/src/types/any.ts +6 -46
  50. package/src/types/array.ts +38 -86
  51. package/src/types/base.ts +205 -81
  52. package/src/types/boolean.ts +13 -47
  53. package/src/types/custom.ts +21 -79
  54. package/src/types/date.ts +10 -0
  55. package/src/types/enum.ts +18 -107
  56. package/src/types/literal.ts +7 -63
  57. package/src/types/never.ts +6 -36
  58. package/src/types/number.ts +52 -188
  59. package/src/types/object.ts +61 -202
  60. package/src/types/string.ts +25 -61
  61. package/src/types/temporal.ts +53 -410
  62. package/src/types/union.ts +98 -138
  63. package/src/utils.ts +8 -0
  64. package/dist/constants.js +0 -2
  65. package/dist/constants.js.map +0 -1
  66. package/dist/types/datetime.js +0 -53
  67. package/dist/types/datetime.js.map +0 -1
  68. package/src/constants.ts +0 -5
  69. package/src/types/datetime.ts +0 -65
package/dist/compiler.js CHANGED
@@ -1,72 +1,118 @@
1
1
  import { TypeCompiler } from '@sinclair/typebox/compiler';
2
- import { Value } from '@sinclair/typebox/value';
3
- import { getTypeSchema } from "./types/base.js";
2
+ import { TransformDecode, TransformEncode, Value } from '@sinclair/typebox/value';
3
+ import { IsDiscriminatedUnion } from "./schemas/discriminated-union.js";
4
4
  function _parse(schema, value) {
5
5
  return Value.Convert(schema, Value.Default(schema, Value.Clean(schema, Value.Clone(value))));
6
6
  }
7
+ function _errors(errors) {
8
+ const result = [];
9
+ for (const error of errors){
10
+ if (IsDiscriminatedUnion(error.schema)) {
11
+ const discriminator = error.schema.discriminator;
12
+ const discriminatorValue = error.value?.[discriminator];
13
+ if (discriminatorValue !== undefined) {
14
+ const variantSchema = error.schema.anyOf.find((schema)=>schema.properties[discriminator].const === discriminatorValue);
15
+ if (variantSchema) {
16
+ const propertiesSchemas = [];
17
+ for(const element in variantSchema.properties){
18
+ const propertySchema = variantSchema.properties[element];
19
+ if (propertySchema !== variantSchema.properties[discriminator]) {
20
+ propertiesSchemas.push(propertySchema);
21
+ }
22
+ }
23
+ for (const iter of error.errors){
24
+ for (const err of iter){
25
+ if (!propertiesSchemas.includes(err.schema)) continue;
26
+ result.push({
27
+ path: err.path,
28
+ message: err.message,
29
+ value: err.value
30
+ });
31
+ }
32
+ }
33
+ continue;
34
+ }
35
+ }
36
+ }
37
+ result.push({
38
+ path: error.path,
39
+ message: error.message,
40
+ value: error.value
41
+ });
42
+ for (const nestedError of error.errors){
43
+ result.push(..._errors(nestedError));
44
+ }
45
+ }
46
+ return result;
47
+ }
7
48
  function compileType(type) {
8
- const schema = getTypeSchema(type);
49
+ const { final: schema } = type;
9
50
  const compiled = TypeCompiler.Compile(schema);
51
+ const errors = (value)=>{
52
+ return _errors(compiled.Errors(value));
53
+ };
10
54
  return {
11
55
  check: compiled.Check.bind(compiled),
12
- errors: compiled.Errors.bind(compiled),
13
- decode: compiled.Decode.bind(compiled),
14
- encode: compiled.Encode.bind(compiled),
15
- parse: _parse.bind(null, schema)
56
+ parse: _parse.bind(null, schema),
57
+ errors,
58
+ decode: TransformDecode.bind(null, schema, compiled.References()),
59
+ encode: TransformEncode.bind(null, schema, compiled.References())
16
60
  };
17
61
  }
18
62
  export function compile(schema) {
19
63
  const compiled = compileType(schema);
64
+ function decodeSafe(val) {
65
+ try {
66
+ return {
67
+ success: true,
68
+ value: compiled.decode(val)
69
+ };
70
+ } catch (error) {
71
+ return {
72
+ success: false,
73
+ error
74
+ };
75
+ }
76
+ }
77
+ function encodeSafe(val) {
78
+ try {
79
+ return {
80
+ success: true,
81
+ value: compiled.encode(val)
82
+ };
83
+ } catch (error) {
84
+ return {
85
+ success: false,
86
+ error
87
+ };
88
+ }
89
+ }
20
90
  return {
21
91
  ...compiled,
22
- decodeSafe: (val)=>{
23
- try {
24
- return {
25
- success: true,
26
- value: compiled.decode(val)
27
- };
28
- } catch (error) {
29
- return {
30
- success: false,
31
- error
32
- };
33
- }
34
- },
35
- encodeSafe: (val)=>{
36
- try {
37
- return {
38
- success: true,
39
- value: compiled.encode(val)
40
- };
41
- } catch (error) {
42
- return {
43
- success: false,
44
- error
45
- };
46
- }
47
- }
92
+ decodeSafe,
93
+ encodeSafe
48
94
  };
49
95
  }
50
96
  export var runtime;
51
97
  (function(runtime) {
52
98
  function parse(type, value) {
53
- return _parse(getTypeSchema(type), value);
99
+ return _parse(type.schema, value);
54
100
  }
55
101
  runtime.parse = parse;
56
102
  function errors(type, value) {
57
- return Value.Errors(getTypeSchema(type), value);
103
+ return _errors(Value.Errors(type.schema, value));
58
104
  }
59
105
  runtime.errors = errors;
60
106
  function check(type, value) {
61
- return Value.Check(getTypeSchema(type), value);
107
+ return Value.Check(type.schema, value);
62
108
  }
63
109
  runtime.check = check;
64
110
  function decode(type, value) {
65
- return Value.Decode(getTypeSchema(type), value);
111
+ return TransformDecode(type.schema, [], value);
66
112
  }
67
113
  runtime.decode = decode;
68
114
  function encode(type, value) {
69
- return Value.Encode(getTypeSchema(type), value);
115
+ return TransformEncode(type.schema, [], value);
70
116
  }
71
117
  runtime.encode = encode;
72
118
  })(runtime || (runtime = {}));
@@ -1 +1 @@
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 parse: (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 _parse(schema: TSchema, value: any) {\n // Clone -> Clean -> Default -> Convert\n return Value.Convert(\n schema,\n Value.Default(schema, Value.Clean(schema, Value.Clone(value))),\n )\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 parse: _parse.bind(null, schema),\n }\n}\n\nexport function compile<T extends BaseType>(schema: T): Compiled<T> {\n const compiled = compileType(schema)\n\n return {\n ...compiled,\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 parse(type: BaseType, value: any) {\n return _parse(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","_parse","schema","value","Convert","Default","Clean","Clone","compileType","type","compiled","Compile","check","Check","bind","errors","Errors","decode","Decode","encode","Encode","parse","compile","decodeSafe","val","success","error","encodeSafe","runtime"],"mappings":"AACA,SACEA,YAAY,QAEP,6BAA4B;AACnC,SAASC,KAAK,QAAQ,0BAAyB;AAE/C,SAAwBC,aAAa,QAAQ,kBAAiB;AAoB9D,SAASC,OAAOC,MAAe,EAAEC,KAAU;IAEzC,OAAOJ,MAAMK,OAAO,CAClBF,QACAH,MAAMM,OAAO,CAACH,QAAQH,MAAMO,KAAK,CAACJ,QAAQH,MAAMQ,KAAK,CAACJ;AAE1D;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,OAAOpB,OAAOa,IAAI,CAAC,MAAMZ;IAC3B;AACF;AAEA,OAAO,SAASoB,QAA4BpB,MAAS;IACnD,MAAMQ,WAAWF,YAAYN;IAE7B,OAAO;QACL,GAAGQ,QAAQ;QACXa,YAAY,CAACC;YACX,IAAI;gBACF,OAAO;oBACLC,SAAS;oBACTtB,OAAOO,SAASO,MAAM,CAACO;gBACzB;YACF,EAAE,OAAOE,OAAO;gBACd,OAAO;oBAAED,SAAS;oBAAgBC;gBAAM;YAC1C;QACF;QACAC,YAAY,CAACH;YACX,IAAI;gBACF,OAAO;oBACLC,SAAS;oBACTtB,OAAOO,SAASS,MAAM,CAACK;gBACzB;YACF,EAAE,OAAOE,OAAO;gBACd,OAAO;oBAAED,SAAS;oBAAgBC;gBAAM;YAC1C;QACF;IACF;AACF;;UAEiBE;IACR,SAASP,MAAMZ,IAAc,EAAEN,KAAU;QAC9C,OAAOF,OAAOD,cAAcS,OAAON;IACrC;YAFgBkB,QAAAA;IAIT,SAASN,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,GA1BiBS,YAAAA"}
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 {\n TransformDecode,\n TransformEncode,\n Value,\n} from '@sinclair/typebox/value'\nimport type { t } from './index.ts'\nimport { IsDiscriminatedUnion } from './schemas/discriminated-union.ts'\nimport type { BaseType } from './types/base.ts'\n\ntype ValidationError = {\n path: string\n message: string\n value: unknown\n}\n\nexport type Compiled<T extends BaseType = BaseType> = {\n check: (val: unknown) => boolean\n errors: (val: unknown) => ValidationError[]\n parse: (val: unknown) => unknown\n /**\n * Requires to `check` before calling\n */\n decode: (val: unknown) => t.infer.decoded<T>\n /**\n * Requires to `check` before calling\n */\n encode: (val: unknown) => t.infer.encoded<T>\n /**\n * Requires to `check` before calling\n */\n decodeSafe: (\n val: unknown,\n ) =>\n | { success: true; value: t.infer.decoded<T> }\n | { success: false; error: any }\n /**\n * Requires to `check` before calling\n */\n encodeSafe: (\n val: unknown,\n ) =>\n | { success: true; value: t.infer.encoded<T> }\n | { success: false; error: any }\n}\n\n// FIXME: this one is very slow\nfunction _parse(schema: TSchema, value: any) {\n // Clone -> Clean -> Default -> Convert\n return Value.Convert(\n schema,\n Value.Default(schema, Value.Clean(schema, Value.Clone(value))),\n )\n}\n\nfunction _errors(errors: ValueErrorIterator) {\n const result: ValidationError[] = []\n\n for (const error of errors) {\n if (IsDiscriminatedUnion(error.schema)) {\n const discriminator = error.schema.discriminator\n const discriminatorValue = error.value?.[discriminator]\n if (discriminatorValue !== undefined) {\n const variantSchema = error.schema.anyOf.find(\n (schema) =>\n schema.properties[discriminator].const === discriminatorValue,\n )\n if (variantSchema) {\n const propertiesSchemas: TSchema[] = []\n for (const element in variantSchema.properties) {\n const propertySchema = variantSchema.properties[element]\n if (propertySchema !== variantSchema.properties[discriminator]) {\n propertiesSchemas.push(propertySchema)\n }\n }\n\n for (const iter of error.errors) {\n for (const err of iter) {\n if (!propertiesSchemas.includes(err.schema)) continue\n result.push({\n path: err.path,\n message: err.message,\n value: err.value,\n })\n }\n }\n\n continue\n }\n }\n }\n\n result.push({\n path: error.path,\n message: error.message,\n value: error.value,\n })\n\n for (const nestedError of error.errors) {\n result.push(..._errors(nestedError))\n }\n }\n\n return result\n}\n\nfunction compileType(type: BaseType) {\n const { final: schema } = type\n const compiled = TypeCompiler.Compile(schema)\n const errors = (value) => {\n return _errors(compiled.Errors(value))\n }\n\n return {\n check: compiled.Check.bind(compiled),\n parse: _parse.bind(null, schema),\n errors,\n decode: TransformDecode.bind(null, schema, compiled.References()),\n encode: TransformEncode.bind(null, schema, compiled.References()),\n }\n}\n\nexport function compile<T extends BaseType>(schema: T): Compiled<T> {\n const compiled = compileType(schema)\n\n function decodeSafe(val: unknown) {\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\n function encodeSafe(val: unknown) {\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 return {\n ...compiled,\n decodeSafe,\n encodeSafe,\n } as any\n}\n\nexport namespace runtime {\n export function parse(type: BaseType, value: any) {\n return _parse(type.schema, value)\n }\n\n export function errors(type: BaseType, value: any): ValidationError[] {\n return _errors(Value.Errors(type.schema, value))\n }\n\n export function check(type: BaseType, value: any): boolean {\n return Value.Check(type.schema, value)\n }\n\n export function decode<T extends BaseType>(\n type: T,\n value: any,\n ): t.infer.decoded<T> {\n return TransformDecode(type.schema, [], value)\n }\n\n export function encode<T extends BaseType>(\n type: T,\n value: any,\n ): t.infer.encoded<T> {\n return TransformEncode(type.schema, [], value)\n }\n}\n"],"names":["TypeCompiler","TransformDecode","TransformEncode","Value","IsDiscriminatedUnion","_parse","schema","value","Convert","Default","Clean","Clone","_errors","errors","result","error","discriminator","discriminatorValue","undefined","variantSchema","anyOf","find","properties","const","propertiesSchemas","element","propertySchema","push","iter","err","includes","path","message","nestedError","compileType","type","final","compiled","Compile","Errors","check","Check","bind","parse","decode","References","encode","compile","decodeSafe","val","success","encodeSafe","runtime"],"mappings":"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"}
package/dist/formats.js CHANGED
@@ -18,7 +18,7 @@ export const fullFormats = {
18
18
  'date-time': getDateTime(true),
19
19
  'iso-time': getTime(),
20
20
  'iso-date-time': getDateTime(),
21
- duration: /^P(?!$)((\d+Y)?(\d+M)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?((\d+|\d\.\d+)S)?)?|(\d+W)?)$/,
21
+ duration: /^P(?!$)((\d+Y)?(\d+M)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?((\d+|\d+\.\d+)S)?)?|(\d+W)?)$/,
22
22
  uri,
23
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
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,
@@ -1 +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+|\\d\\.\\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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"}
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+|\\d+\\.\\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 CHANGED
@@ -1,37 +1,68 @@
1
+ import { AnyType } from "./types/any.js";
1
2
  import { ArrayType } from "./types/array.js";
2
3
  import { BooleanType } from "./types/boolean.js";
3
4
  import { CustomType } from "./types/custom.js";
4
- import { DateType } from "./types/datetime.js";
5
+ import { DateType } from "./types/date.js";
5
6
  import { EnumType, ObjectEnumType } from "./types/enum.js";
6
7
  import { LiteralType } from "./types/literal.js";
8
+ import { NeverType } from "./types/never.js";
7
9
  import { BigIntType, IntegerType, NumberType } from "./types/number.js";
8
10
  import { ObjectType, RecordType } from "./types/object.js";
9
11
  import { StringType } from "./types/string.js";
10
- import { IntersactionType, UnionType } from "./types/union.js";
11
- import { AnyType } from "./types/any.js";
12
- import { NeverType } from "./types/never.js";
12
+ import { DiscriminatedUnionType, IntersactionType, UnionType } from "./types/union.js";
13
13
  import { register } from "./formats.js";
14
14
  register();
15
15
  export * from "./schemas/nullable.js";
16
- export { BaseType, getTypeSchema } from "./types/base.js";
16
+ export { BaseType } from "./types/base.js";
17
17
  export { ArrayType, BooleanType, CustomType, DateType, EnumType, LiteralType, IntegerType, NumberType, ObjectType, StringType, IntersactionType, UnionType, AnyType, NeverType, };
18
18
  export var t;
19
19
  (function(t) {
20
- t.never = ()=>new NeverType();
21
- t.boolean = ()=>new BooleanType();
22
- t.string = ()=>new StringType();
23
- t.number = ()=>new NumberType();
24
- t.integer = ()=>new IntegerType();
25
- t.bitint = ()=>new BigIntType();
26
- t.literal = (value)=>new LiteralType(value);
27
- t.objectEnum = (enumLike)=>new ObjectEnumType(enumLike);
28
- t.arrayEnum = (enumLike)=>new EnumType(enumLike);
29
- t.date = ()=>new DateType();
30
- t.array = (element)=>new ArrayType(element);
31
- t.object = (properties)=>new ObjectType(properties);
32
- t.record = (key, value)=>new RecordType(key, value);
33
- t.any = ()=>new AnyType();
34
- t.or = (...types)=>new UnionType(types);
35
- t.and = (...types)=>new IntersactionType(types);
36
- t.custom = (decode, encode)=>new CustomType(decode, encode);
20
+ t.never = NeverType.factory;
21
+ t.boolean = BooleanType.factory;
22
+ t.string = StringType.factory;
23
+ t.number = NumberType.factory;
24
+ t.integer = IntegerType.factory;
25
+ t.bitint = BigIntType.factory;
26
+ t.literal = LiteralType.factory;
27
+ t.objectEnum = ObjectEnumType.factory;
28
+ t.arrayEnum = EnumType.factory;
29
+ t.date = DateType.factory;
30
+ t.array = ArrayType.factory;
31
+ t.object = ObjectType.factory;
32
+ t.record = RecordType.factory;
33
+ t.any = AnyType.factory;
34
+ t.or = UnionType.factory;
35
+ t.and = IntersactionType.factory;
36
+ t.discriminatedUnion = DiscriminatedUnionType.factory;
37
+ t.custom = CustomType.factory;
38
+ t.keyof = (type)=>{
39
+ return t.arrayEnum(Object.keys(type.props.properties));
40
+ };
41
+ t.pick = (source, pick)=>{
42
+ const properties = Object.fromEntries(Object.entries(source.props.properties).filter(([key])=>pick[key]));
43
+ return ObjectType.factory(properties);
44
+ };
45
+ t.omit = (source, omit)=>{
46
+ const properties = Object.fromEntries(Object.entries(source.props.properties).filter(([key])=>!omit[key]));
47
+ return ObjectType.factory(properties);
48
+ };
49
+ t.extend = (object1, properties)=>{
50
+ return ObjectType.factory({
51
+ ...object1.props.properties,
52
+ ...properties
53
+ });
54
+ };
55
+ t.merge = (object1, object2)=>{
56
+ return ObjectType.factory({
57
+ ...object1.props.properties,
58
+ ...object2.props.properties
59
+ });
60
+ };
61
+ t.partial = (object)=>{
62
+ const properties = {};
63
+ for (const [key, value] of Object.entries(object.props.properties)){
64
+ properties[key] = value.optional();
65
+ }
66
+ return ObjectType.factory(properties, {});
67
+ };
37
68
  })(t || (t = {}));
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts"],"sourcesContent":["import type { TLiteralValue } from '@sinclair/typebox/type'\nimport { ArrayType } from './types/array.ts'\nimport type { BaseType } from './types/base.ts'\nimport { BooleanType } from './types/boolean.ts'\nimport { CustomType } from './types/custom.ts'\nimport { DateType } from './types/datetime.ts'\nimport {\n type AnyEnumType,\n type AnyObjectEnumType,\n EnumType,\n ObjectEnumType,\n} from './types/enum.ts'\nimport { type AnyLiteralType, LiteralType } from './types/literal.ts'\nimport { BigIntType, IntegerType, NumberType } from './types/number.ts'\nimport { ObjectType, RecordType } from './types/object.ts'\nimport { type AnyStringType, StringType } from './types/string.ts'\nimport {\n type AnyUnionType,\n IntersactionType,\n UnionType,\n} from './types/union.ts'\n\nimport type { typeStatic } from './constants.ts'\nimport { AnyType } from './types/any.ts'\nimport { NeverType } from './types/never.ts'\n\n// register ajv formats\nimport { register } from './formats.ts'\nregister()\n\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 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 staticType<T extends BaseType> = T[typeStatic]\n export type decoded<T extends BaseType> = staticType<T>['decoded']\n export type encoded<T extends BaseType> = staticType<T>['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 bitint = () => new BigIntType()\n export const literal = <T extends TLiteralValue>(value: T) =>\n new LiteralType(value)\n export const objectEnum = <T extends { [K in string]: K }>(enumLike: T) =>\n new ObjectEnumType(enumLike)\n export const arrayEnum = <T extends (string | number)[]>(enumLike: [...T]) =>\n new EnumType(enumLike)\n export const date = () => new DateType()\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 record = <\n K extends\n | AnyLiteralType\n | AnyEnumType\n | AnyObjectEnumType\n | AnyStringType\n | AnyUnionType,\n E extends BaseType,\n >(\n key: K,\n value: E,\n ) => new RecordType(key, value)\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","DateType","EnumType","ObjectEnumType","LiteralType","BigIntType","IntegerType","NumberType","ObjectType","RecordType","StringType","IntersactionType","UnionType","AnyType","NeverType","register","BaseType","getTypeSchema","t","never","boolean","string","number","integer","bitint","literal","value","objectEnum","enumLike","arrayEnum","date","array","element","object","properties","record","key","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,QAAQ,QAAQ,sBAAqB;AAC9C,SAGEC,QAAQ,EACRC,cAAc,QACT,kBAAiB;AACxB,SAA8BC,WAAW,QAAQ,qBAAoB;AACrE,SAASC,UAAU,EAAEC,WAAW,EAAEC,UAAU,QAAQ,oBAAmB;AACvE,SAASC,UAAU,EAAEC,UAAU,QAAQ,oBAAmB;AAC1D,SAA6BC,UAAU,QAAQ,oBAAmB;AAClE,SAEEC,gBAAgB,EAChBC,SAAS,QACJ,mBAAkB;AAGzB,SAASC,OAAO,QAAQ,iBAAgB;AACxC,SAASC,SAAS,QAAQ,mBAAkB;AAG5C,SAASC,QAAQ,QAAQ,eAAc;AACvCA;AAEA,cAAc,wBAAuB;AACrC,SACEC,QAAQ,EACRC,aAAa,QACR,kBAAiB;AAExB,SACEnB,SAAS,EACTC,WAAW,EACXC,UAAU,EACVC,QAAQ,EACRC,QAAQ,EACRE,WAAW,EACXE,WAAW,EACXC,UAAU,EACVC,UAAU,EACVE,UAAU,EACVC,gBAAgB,EAChBC,SAAS,EACTC,OAAO,EACPC,SAAS,KACV;;UAEgBI;MAMFC,QAAQ,IAAM,IAAIL;MAClBM,UAAU,IAAM,IAAIrB;MACpBsB,SAAS,IAAM,IAAIX;MACnBY,SAAS,IAAM,IAAIf;MACnBgB,UAAU,IAAM,IAAIjB;MACpBkB,SAAS,IAAM,IAAInB;MACnBoB,UAAU,CAA0BC,QAC/C,IAAItB,YAAYsB;MACLC,aAAa,CAAiCC,WACzD,IAAIzB,eAAeyB;MACRC,YAAY,CAAgCD,WACvD,IAAI1B,SAAS0B;MACFE,OAAO,IAAM,IAAI7B;MACjB8B,QAAQ,CAAqBC,UACxC,IAAIlC,UAAUkC;MACHC,SAAS,CAAqCC,aACzD,IAAI1B,WAAW0B;MACJC,SAAS,CASpBC,KACAV,QACG,IAAIjB,WAAW2B,KAAKV;MACZW,MAAM,IAAM,IAAIxB;MAChByB,KAAK,CAChB,GAAGC,QACA,IAAI3B,UAAU2B;MACNC,MAAM,CACjB,GAAGD,QACA,IAAI5B,iBAAiB4B;MACbE,SAAS,CACpBC,QACAC,SACG,IAAI3C,WAAc0C,QAAQC;AACjC,GA9CiBzB,MAAAA"}
1
+ {"version":3,"sources":["../../src/index.ts"],"sourcesContent":["import type {\n StaticDecode,\n StaticEncode,\n TLiteralValue,\n} from '@sinclair/typebox/type'\nimport { AnyType } from './types/any.ts'\nimport { ArrayType } from './types/array.ts'\nimport type {\n BaseType,\n BaseTypeAny,\n OptionalType,\n Static,\n} from './types/base.ts'\nimport { BooleanType } from './types/boolean.ts'\nimport { CustomType } from './types/custom.ts'\nimport { DateType } from './types/date.ts'\nimport { EnumType, ObjectEnumType } from './types/enum.ts'\nimport { LiteralType } from './types/literal.ts'\nimport { NeverType } from './types/never.ts'\nimport { BigIntType, IntegerType, NumberType } from './types/number.ts'\nimport { ObjectType, type ObjectTypeProps, RecordType } from './types/object.ts'\nimport { StringType } from './types/string.ts'\nimport {\n DiscriminatedUnionType,\n IntersactionType,\n UnionType,\n} from './types/union.ts'\nimport type { UnionToTupleString } from './utils.ts'\n\n// register ajv formats\nimport { register } from './formats.ts'\nregister()\n\nexport * from './schemas/nullable.ts'\nexport { BaseType, type BaseTypeAny } from './types/base.ts'\nexport { type TSchema } from '@sinclair/typebox'\nexport {\n ArrayType,\n BooleanType,\n CustomType,\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 BaseTypeAny> = StaticDecode<\n T['_']['decoded']['output']\n >\n export type encoded<T extends BaseTypeAny> = StaticEncode<\n T['_']['encoded']['output']\n >\n export namespace input {\n export type decoded<T extends BaseTypeAny> = StaticDecode<\n T['_']['decoded']['input']\n >\n export type encoded<T extends BaseTypeAny> = StaticEncode<\n T['_']['encoded']['input']\n >\n }\n }\n\n export const never = NeverType.factory\n export const boolean = BooleanType.factory\n export const string = StringType.factory\n export const number = NumberType.factory\n export const integer = IntegerType.factory\n export const bitint = BigIntType.factory\n export const literal = LiteralType.factory\n export const objectEnum = ObjectEnumType.factory\n export const arrayEnum = EnumType.factory\n export const date = DateType.factory\n export const array = ArrayType.factory\n export const object = ObjectType.factory\n export const record = RecordType.factory\n export const any = AnyType.factory\n export const or = UnionType.factory\n export const and = IntersactionType.factory\n export const discriminatedUnion = DiscriminatedUnionType.factory\n export const custom = CustomType.factory\n\n export const keyof = <T extends ObjectType>(\n type: T,\n ): EnumType<\n UnionToTupleString<T extends ObjectType<infer Props> ? keyof Props : never>\n > => {\n return arrayEnum(Object.keys(type.props.properties) as any)\n }\n\n export const pick = <\n T extends ObjectType,\n P extends { [K in keyof T['props']['properties']]?: true },\n >(\n source: T,\n pick: P,\n ): ObjectType<{\n [K in keyof T['props']['properties'] as K extends keyof P\n ? K\n : never]: T['props']['properties'][K]\n }> => {\n const properties = Object.fromEntries(\n Object.entries(source.props.properties).filter(([key]) => pick[key]),\n )\n return ObjectType.factory(properties) as any\n }\n\n export const omit = <\n T extends ObjectType,\n P extends { [K in keyof T]?: true },\n >(\n source: T,\n omit: P,\n ): ObjectType<{\n [K in keyof T['props']['properties'] as K extends keyof P\n ? never\n : K]: T['props']['properties'][K]\n }> => {\n const properties = Object.fromEntries(\n Object.entries(source.props.properties).filter(([key]) => !omit[key]),\n )\n return ObjectType.factory(properties) as any\n }\n\n export const extend = <T extends ObjectType, P extends ObjectTypeProps>(\n object1: T,\n properties: P,\n ): ObjectType<{\n [K in keyof T['props']['properties'] | keyof P]: K extends keyof P\n ? P[K]\n : K extends keyof T['props']['properties']\n ? T['props']['properties'][K]\n : never\n }> => {\n return ObjectType.factory({\n ...object1.props.properties,\n ...properties,\n }) as any\n }\n\n export const merge = <T1 extends ObjectType, T2 extends ObjectType>(\n object1: T1,\n object2: T2,\n ): ObjectType<{\n [K in\n | keyof T1['props']['properties']\n | keyof T2['props']['properties']]: K extends keyof T2['props']['properties']\n ? T2['props']['properties'][K]\n : K extends keyof T1['props']['properties']\n ? T1['props']['properties'][K]\n : never\n }> => {\n return ObjectType.factory({\n ...object1.props.properties,\n ...object2.props.properties,\n }) as any\n }\n\n export const partial = <T extends ObjectType>(\n object: T,\n ): ObjectType<{\n [K in keyof T['props']['properties']]: OptionalType<\n T['props']['properties'][K]\n >\n }> => {\n const properties = {} as any\n\n for (const [key, value] of Object.entries(object.props.properties)) {\n properties[key] = value.optional()\n }\n\n return ObjectType.factory(properties, {}) as any\n }\n}\n"],"names":["AnyType","ArrayType","BooleanType","CustomType","DateType","EnumType","ObjectEnumType","LiteralType","NeverType","BigIntType","IntegerType","NumberType","ObjectType","RecordType","StringType","DiscriminatedUnionType","IntersactionType","UnionType","register","BaseType","t","never","factory","boolean","string","number","integer","bitint","literal","objectEnum","arrayEnum","date","array","object","record","any","or","and","discriminatedUnion","custom","keyof","type","Object","keys","props","properties","pick","source","fromEntries","entries","filter","key","omit","extend","object1","merge","object2","partial","value","optional"],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { KindGuard, Type, TypeGuard, ValueGuard } from '@sinclair/typebox';
2
+ export function IsDiscriminatedUnion(schema) {
3
+ return TypeGuard.IsUnion(schema) && 'discriminator' in schema && ValueGuard.IsString(schema.discriminator) && schema.anyOf.every((variant)=>KindGuard.IsObject(variant) && KindGuard.IsLiteralString(variant.properties[schema.discriminator]));
4
+ }
5
+ export function DiscriminatedUnion(key, types) {
6
+ return Type.Union(types, {
7
+ discriminator: key
8
+ });
9
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/schemas/discriminated-union.ts"],"sourcesContent":["import {\n KindGuard,\n type TLiteral,\n type TObject,\n type TPropertyKey,\n type TSchema,\n type TUnion,\n Type,\n TypeGuard,\n ValueGuard,\n} from '@sinclair/typebox'\n\nexport function IsDiscriminatedUnion(\n schema: TSchema,\n): schema is TDiscriminatedUnion {\n return (\n TypeGuard.IsUnion(schema) &&\n 'discriminator' in schema &&\n ValueGuard.IsString(schema.discriminator) &&\n schema.anyOf.every(\n (variant) =>\n KindGuard.IsObject(variant) &&\n KindGuard.IsLiteralString(variant.properties[schema.discriminator]),\n )\n )\n}\n\ntype DiscriminatedUnionProperties<K extends string = string> = {\n [OK in K]: TLiteral<any>\n} & {\n [OK in TPropertyKey]: any\n}\n\nexport interface TDiscriminatedUnion<\n K extends string = string,\n T extends TObject<DiscriminatedUnionProperties<K>>[] = TObject<\n DiscriminatedUnionProperties<K>\n >[],\n> extends TUnion<T> {\n discriminator: K\n anyOf: T\n}\n\nexport function DiscriminatedUnion<\n K extends string,\n T extends TObject<DiscriminatedUnionProperties<K>>[],\n>(key: K, types: T): TDiscriminatedUnion<K, T> {\n return Type.Union(types, { discriminator: key }) as any\n}\n"],"names":["KindGuard","Type","TypeGuard","ValueGuard","IsDiscriminatedUnion","schema","IsUnion","IsString","discriminator","anyOf","every","variant","IsObject","IsLiteralString","properties","DiscriminatedUnion","key","types","Union"],"mappings":"AAAA,SACEA,SAAS,EAMTC,IAAI,EACJC,SAAS,EACTC,UAAU,QACL,oBAAmB;AAE1B,OAAO,SAASC,qBACdC,MAAe;IAEf,OACEH,UAAUI,OAAO,CAACD,WAClB,mBAAmBA,UACnBF,WAAWI,QAAQ,CAACF,OAAOG,aAAa,KACxCH,OAAOI,KAAK,CAACC,KAAK,CAChB,CAACC,UACCX,UAAUY,QAAQ,CAACD,YACnBX,UAAUa,eAAe,CAACF,QAAQG,UAAU,CAACT,OAAOG,aAAa,CAAC;AAG1E;AAkBA,OAAO,SAASO,mBAGdC,GAAM,EAAEC,KAAQ;IAChB,OAAOhB,KAAKiB,KAAK,CAACD,OAAO;QAAET,eAAeQ;IAAI;AAChD"}
@@ -1,16 +1,11 @@
1
1
  import { Type } from '@sinclair/typebox/type';
2
2
  export const Nullable = (schema, options = {})=>{
3
- const { default: _default, description, examples, readOnly, title, writeOnly } = schema;
3
+ const { default: _default } = schema;
4
4
  return Type.Union([
5
5
  schema,
6
6
  Type.Null()
7
7
  ], {
8
8
  default: _default,
9
- description,
10
- examples,
11
- readOnly,
12
- title,
13
- writeOnly,
14
9
  ...options
15
10
  });
16
11
  };
@@ -1 +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) => {\n const {\n default: _default,\n description,\n examples,\n readOnly,\n title,\n writeOnly,\n } = schema\n\n return Type.Union([schema, Type.Null()], {\n default: _default,\n description,\n examples,\n readOnly,\n title,\n writeOnly,\n ...options,\n })\n}\n"],"names":["Type","Nullable","schema","options","default","_default","description","examples","readOnly","title","writeOnly","Union","Null"],"mappings":"AAAA,SAKEA,IAAI,QACC,yBAAwB;AAG/B,OAAO,MAAMC,WAAW,CACtBC,QACAC,UAAyB,CAAC,CAAC;IAE3B,MAAM,EACJC,SAASC,QAAQ,EACjBC,WAAW,EACXC,QAAQ,EACRC,QAAQ,EACRC,KAAK,EACLC,SAAS,EACV,GAAGR;IAEJ,OAAOF,KAAKW,KAAK,CAAC;QAACT;QAAQF,KAAKY,IAAI;KAAG,EAAE;QACvCR,SAASC;QACTC;QACAC;QACAC;QACAC;QACAC;QACA,GAAGP,OAAO;IACZ;AACF,EAAC"}
1
+ {"version":3,"sources":["../../../src/schemas/nullable.ts"],"sourcesContent":["import {\n type SchemaOptions,\n type TNull,\n type TOptional,\n type TSchema,\n type TUndefined,\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) => {\n const { default: _default } = schema\n\n return Type.Union([schema, Type.Null()], {\n default: _default,\n ...options,\n })\n}\n\nexport type TOptionalUndefined<T extends TSchema> = TOptional<\n TUnion<[T, TUndefined]>\n>\n"],"names":["Type","Nullable","schema","options","default","_default","Union","Null"],"mappings":"AAAA,SAOEA,IAAI,QACC,yBAAwB;AAG/B,OAAO,MAAMC,WAAW,CACtBC,QACAC,UAAyB,CAAC,CAAC;IAE3B,MAAM,EAAEC,SAASC,QAAQ,EAAE,GAAGH;IAE9B,OAAOF,KAAKM,KAAK,CAAC;QAACJ;QAAQF,KAAKO,IAAI;KAAG,EAAE;QACvCH,SAASC;QACT,GAAGF,OAAO;IACZ;AACF,EAAC"}
package/dist/temporal.js CHANGED
@@ -1,9 +1,9 @@
1
1
  import { DurationType, PlainDateTimeType, PlainDateType, PlainMonthDayType, PlainTimeType, PlainYearMonthType, ZonedDateTimeType } from "./types/temporal.js";
2
- export const plainDate = ()=>new PlainDateType();
3
- export const plainDatetime = ()=>new PlainDateTimeType();
4
- export const plainTime = ()=>new PlainTimeType();
5
- export const zonedDatetime = ()=>new ZonedDateTimeType();
6
- export const duration = ()=>new DurationType();
7
- export const plainYearMonth = ()=>new PlainYearMonthType();
8
- export const plainMonthDay = ()=>new PlainMonthDayType();
2
+ export const plainDate = PlainDateType.factory;
3
+ export const plainDatetime = PlainDateTimeType.factory;
4
+ export const plainTime = PlainTimeType.factory;
5
+ export const zonedDatetime = ZonedDateTimeType.factory;
6
+ export const duration = DurationType.factory;
7
+ export const plainYearMonth = PlainYearMonthType.factory;
8
+ export const plainMonthDay = PlainMonthDayType.factory;
9
9
  export { DurationType, PlainDateTimeType, PlainDateType, PlainMonthDayType, PlainTimeType, PlainYearMonthType, ZonedDateTimeType, };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/temporal.ts"],"sourcesContent":["import {\n DurationType,\n PlainDateTimeType,\n PlainDateType,\n PlainMonthDayType,\n PlainTimeType,\n PlainYearMonthType,\n ZonedDateTimeType,\n} from './types/temporal.ts'\n\nexport const plainDate = () => new PlainDateType()\nexport const plainDatetime = () => new PlainDateTimeType()\nexport const plainTime = () => new PlainTimeType()\nexport const zonedDatetime = () => new ZonedDateTimeType()\nexport const duration = () => new DurationType()\nexport const plainYearMonth = () => new PlainYearMonthType()\nexport const plainMonthDay = () => new PlainMonthDayType()\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","plainDate","plainDatetime","plainTime","zonedDatetime","duration","plainYearMonth","plainMonthDay"],"mappings":"AAAA,SACEA,YAAY,EACZC,iBAAiB,EACjBC,aAAa,EACbC,iBAAiB,EACjBC,aAAa,EACbC,kBAAkB,EAClBC,iBAAiB,QACZ,sBAAqB;AAE5B,OAAO,MAAMC,YAAY,IAAM,IAAIL,gBAAe;AAClD,OAAO,MAAMM,gBAAgB,IAAM,IAAIP,oBAAmB;AAC1D,OAAO,MAAMQ,YAAY,IAAM,IAAIL,gBAAe;AAClD,OAAO,MAAMM,gBAAgB,IAAM,IAAIJ,oBAAmB;AAC1D,OAAO,MAAMK,WAAW,IAAM,IAAIX,eAAc;AAChD,OAAO,MAAMY,iBAAiB,IAAM,IAAIP,qBAAoB;AAC5D,OAAO,MAAMQ,gBAAgB,IAAM,IAAIV,oBAAmB;AAE1D,SACEH,YAAY,EACZC,iBAAiB,EACjBC,aAAa,EACbC,iBAAiB,EACjBC,aAAa,EACbC,kBAAkB,EAClBC,iBAAiB,KAClB"}
1
+ {"version":3,"sources":["../../src/temporal.ts"],"sourcesContent":["import { Temporal } from 'temporal-polyfill'\nimport {\n DurationType,\n PlainDateTimeType,\n PlainDateType,\n PlainMonthDayType,\n PlainTimeType,\n PlainYearMonthType,\n ZonedDateTimeType,\n} from './types/temporal.ts'\n\nexport const plainDate = PlainDateType.factory\nexport const plainDatetime = PlainDateTimeType.factory\nexport const plainTime = PlainTimeType.factory\nexport const zonedDatetime = ZonedDateTimeType.factory\nexport const duration = DurationType.factory\nexport const plainYearMonth = PlainYearMonthType.factory\nexport const plainMonthDay = PlainMonthDayType.factory\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","plainDate","factory","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,MAAMC,YAAYL,cAAcM,OAAO,CAAA;AAC9C,OAAO,MAAMC,gBAAgBR,kBAAkBO,OAAO,CAAA;AACtD,OAAO,MAAME,YAAYN,cAAcI,OAAO,CAAA;AAC9C,OAAO,MAAMG,gBAAgBL,kBAAkBE,OAAO,CAAA;AACtD,OAAO,MAAMI,WAAWZ,aAAaQ,OAAO,CAAA;AAC5C,OAAO,MAAMK,iBAAiBR,mBAAmBG,OAAO,CAAA;AACxD,OAAO,MAAMM,gBAAgBX,kBAAkBK,OAAO,CAAA;AAEtD,SACER,YAAY,EACZC,iBAAiB,EACjBC,aAAa,EACbC,iBAAiB,EACjBC,aAAa,EACbC,kBAAkB,EAClBC,iBAAiB,KAClB"}
package/dist/types/any.js CHANGED
@@ -1,48 +1,8 @@
1
1
  import { Type } from '@sinclair/typebox';
2
2
  import { BaseType } from "./base.js";
3
3
  export class AnyType extends BaseType {
4
- constructor(options = {}, isNullable = false, isOptional = false, hasDefault = false){
5
- super(options, isNullable, isOptional, hasDefault);
6
- }
7
- _constructSchema(options) {
8
- return Type.Any(options);
9
- }
10
- nullable() {
11
- return new AnyType(...this._with({
12
- isNullable: true
13
- }));
14
- }
15
- optional() {
16
- return new AnyType(...this._with({
17
- isOptional: true
18
- }));
19
- }
20
- nullish() {
21
- return new AnyType(...this._with({
22
- isNullable: true,
23
- isOptional: true
24
- }));
25
- }
26
- default(value) {
27
- return new AnyType(...this._with({
28
- options: {
29
- default: value
30
- },
31
- hasDefault: true
32
- }));
33
- }
34
- description(description) {
35
- return new AnyType(...this._with({
36
- options: {
37
- description
38
- }
39
- }));
40
- }
41
- examples(...examples) {
42
- return new AnyType(...this._with({
43
- options: {
44
- examples
45
- }
46
- }));
4
+ _;
5
+ static factory() {
6
+ return new AnyType(Type.Any());
47
7
  }
48
8
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/types/any.ts"],"sourcesContent":["import { type SchemaOptions, 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 D extends boolean = false,\n> extends BaseType<TAny, N, O, D, SchemaOptions> {\n constructor(\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)\n }\n\n protected _constructSchema(options: SchemaOptions): TAny {\n return Type.Any(options)\n }\n\n nullable() {\n return new AnyType(...this._with({ isNullable: true }))\n }\n\n optional() {\n return new AnyType(...this._with({ isOptional: true }))\n }\n\n nullish() {\n return new AnyType(...this._with({ isNullable: true, isOptional: true }))\n }\n\n default(value: any) {\n return new AnyType(\n ...this._with({\n options: { default: value },\n hasDefault: true,\n }),\n )\n }\n\n description(description: string) {\n return new AnyType(...this._with({ options: { description } }))\n }\n\n examples(...examples: [any, ...any[]]) {\n return new AnyType(...this._with({ options: { examples } }))\n }\n}\n"],"names":["Type","BaseType","AnyType","constructor","options","isNullable","isOptional","hasDefault","_constructSchema","Any","nullable","_with","optional","nullish","default","value","description","examples"],"mappings":"AAAA,SAAwCA,IAAI,QAAQ,oBAAmB;AACvE,SAASC,QAAQ,QAAQ,YAAW;AAEpC,OAAO,MAAMC,gBAIHD;IACRE,YACEC,UAAyB,CAAC,CAAC,EAC3BC,aAAgB,KAAU,EAC1BC,aAAgB,KAAU,EAC1BC,aAAgB,KAAU,CAC1B;QACA,KAAK,CAACH,SAASC,YAAYC,YAAYC;IACzC;IAEUC,iBAAiBJ,OAAsB,EAAQ;QACvD,OAAOJ,KAAKS,GAAG,CAACL;IAClB;IAEAM,WAAW;QACT,OAAO,IAAIR,WAAW,IAAI,CAACS,KAAK,CAAC;YAAEN,YAAY;QAAK;IACtD;IAEAO,WAAW;QACT,OAAO,IAAIV,WAAW,IAAI,CAACS,KAAK,CAAC;YAAEL,YAAY;QAAK;IACtD;IAEAO,UAAU;QACR,OAAO,IAAIX,WAAW,IAAI,CAACS,KAAK,CAAC;YAAEN,YAAY;YAAMC,YAAY;QAAK;IACxE;IAEAQ,QAAQC,KAAU,EAAE;QAClB,OAAO,IAAIb,WACN,IAAI,CAACS,KAAK,CAAC;YACZP,SAAS;gBAAEU,SAASC;YAAM;YAC1BR,YAAY;QACd;IAEJ;IAEAS,YAAYA,WAAmB,EAAE;QAC/B,OAAO,IAAId,WAAW,IAAI,CAACS,KAAK,CAAC;YAAEP,SAAS;gBAAEY;YAAY;QAAE;IAC9D;IAEAC,SAAS,GAAGA,QAAyB,EAAE;QACrC,OAAO,IAAIf,WAAW,IAAI,CAACS,KAAK,CAAC;YAAEP,SAAS;gBAAEa;YAAS;QAAE;IAC3D;AACF"}
1
+ {"version":3,"sources":["../../../src/types/any.ts"],"sourcesContent":["import { type TAny, Type } from '@sinclair/typebox'\nimport { BaseType, type ConstantType } from './base.ts'\n\nexport class AnyType extends BaseType<TAny> {\n _!: ConstantType<this['schema']>\n\n static factory() {\n return new AnyType(Type.Any())\n }\n}\n"],"names":["Type","BaseType","AnyType","_","factory","Any"],"mappings":"AAAA,SAAoBA,IAAI,QAAQ,oBAAmB;AACnD,SAASC,QAAQ,QAA2B,YAAW;AAEvD,OAAO,MAAMC,gBAAgBD;IAC3BE,EAAgC;IAEhC,OAAOC,UAAU;QACf,OAAO,IAAIF,QAAQF,KAAKK,GAAG;IAC7B;AACF"}