@sinclair/typebox 0.30.4 → 0.31.0-dev-2
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/compiler/compiler.d.ts +22 -14
- package/compiler/compiler.js +119 -106
- package/compiler/index.d.ts +1 -1
- package/compiler/index.js +2 -1
- package/errors/errors.d.ts +56 -61
- package/errors/errors.js +222 -279
- package/package.json +5 -3
- package/readme.md +588 -507
- package/system/system.d.ts +34 -8
- package/system/system.js +214 -11
- package/typebox.d.ts +180 -106
- package/typebox.js +794 -907
- package/value/cast.d.ts +6 -12
- package/value/cast.js +81 -163
- package/value/check.d.ts +1 -5
- package/value/check.js +59 -103
- package/value/clone.js +6 -29
- package/value/convert.d.ts +2 -5
- package/value/convert.js +55 -106
- package/value/create.d.ts +6 -10
- package/value/create.js +54 -68
- package/value/delta.js +22 -22
- package/value/deref.d.ts +7 -0
- package/value/deref.js +46 -0
- package/value/equal.js +10 -10
- package/value/guard.js +1 -1
- package/value/hash.js +14 -14
- package/value/mutate.js +17 -17
- package/value/pointer.js +2 -2
- package/value/transform.d.ts +42 -0
- package/value/transform.js +512 -0
- package/value/value.d.ts +8 -0
- package/value/value.js +18 -0
package/value/convert.js
CHANGED
|
@@ -27,57 +27,51 @@ THE SOFTWARE.
|
|
|
27
27
|
|
|
28
28
|
---------------------------------------------------------------------------*/
|
|
29
29
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
-
exports.Convert = exports.
|
|
30
|
+
exports.Convert = exports.Default = exports.ValueConvertUnknownTypeError = void 0;
|
|
31
|
+
const guard_1 = require("./guard");
|
|
32
|
+
const clone_1 = require("./clone");
|
|
33
|
+
const check_1 = require("./check");
|
|
34
|
+
const deref_1 = require("./deref");
|
|
31
35
|
const Types = require("../typebox");
|
|
32
|
-
const ValueClone = require("./clone");
|
|
33
|
-
const ValueCheck = require("./check");
|
|
34
|
-
const ValueGuard = require("./guard");
|
|
35
36
|
// --------------------------------------------------------------------------
|
|
36
37
|
// Errors
|
|
37
38
|
// --------------------------------------------------------------------------
|
|
38
|
-
class ValueConvertUnknownTypeError extends
|
|
39
|
+
class ValueConvertUnknownTypeError extends Types.TypeBoxError {
|
|
39
40
|
constructor(schema) {
|
|
40
|
-
super('
|
|
41
|
+
super('Unknown type');
|
|
41
42
|
this.schema = schema;
|
|
42
43
|
}
|
|
43
44
|
}
|
|
44
45
|
exports.ValueConvertUnknownTypeError = ValueConvertUnknownTypeError;
|
|
45
|
-
class ValueConvertDereferenceError extends Error {
|
|
46
|
-
constructor(schema) {
|
|
47
|
-
super(`ValueConvert: Unable to dereference type with $id '${schema.$ref}'`);
|
|
48
|
-
this.schema = schema;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
exports.ValueConvertDereferenceError = ValueConvertDereferenceError;
|
|
52
46
|
// --------------------------------------------------------------------------
|
|
53
47
|
// Conversions
|
|
54
48
|
// --------------------------------------------------------------------------
|
|
55
49
|
function IsStringNumeric(value) {
|
|
56
|
-
return
|
|
50
|
+
return (0, guard_1.IsString)(value) && !isNaN(value) && !isNaN(parseFloat(value));
|
|
57
51
|
}
|
|
58
52
|
function IsValueToString(value) {
|
|
59
|
-
return
|
|
53
|
+
return (0, guard_1.IsBigInt)(value) || (0, guard_1.IsBoolean)(value) || (0, guard_1.IsNumber)(value);
|
|
60
54
|
}
|
|
61
55
|
function IsValueTrue(value) {
|
|
62
|
-
return value === true || (
|
|
56
|
+
return value === true || ((0, guard_1.IsNumber)(value) && value === 1) || ((0, guard_1.IsBigInt)(value) && value === BigInt('1')) || ((0, guard_1.IsString)(value) && (value.toLowerCase() === 'true' || value === '1'));
|
|
63
57
|
}
|
|
64
58
|
function IsValueFalse(value) {
|
|
65
|
-
return value === false || (
|
|
59
|
+
return value === false || ((0, guard_1.IsNumber)(value) && (value === 0 || Object.is(value, -0))) || ((0, guard_1.IsBigInt)(value) && value === BigInt('0')) || ((0, guard_1.IsString)(value) && (value.toLowerCase() === 'false' || value === '0' || value === '-0'));
|
|
66
60
|
}
|
|
67
61
|
function IsTimeStringWithTimeZone(value) {
|
|
68
|
-
return
|
|
62
|
+
return (0, guard_1.IsString)(value) && /^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i.test(value);
|
|
69
63
|
}
|
|
70
64
|
function IsTimeStringWithoutTimeZone(value) {
|
|
71
|
-
return
|
|
65
|
+
return (0, guard_1.IsString)(value) && /^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)?$/i.test(value);
|
|
72
66
|
}
|
|
73
67
|
function IsDateTimeStringWithTimeZone(value) {
|
|
74
|
-
return
|
|
68
|
+
return (0, guard_1.IsString)(value) && /^\d\d\d\d-[0-1]\d-[0-3]\dt(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i.test(value);
|
|
75
69
|
}
|
|
76
70
|
function IsDateTimeStringWithoutTimeZone(value) {
|
|
77
|
-
return
|
|
71
|
+
return (0, guard_1.IsString)(value) && /^\d\d\d\d-[0-1]\d-[0-3]\dt(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)?$/i.test(value);
|
|
78
72
|
}
|
|
79
73
|
function IsDateString(value) {
|
|
80
|
-
return
|
|
74
|
+
return (0, guard_1.IsString)(value) && /^\d\d\d\d-[0-1]\d-[0-3]\d$/i.test(value);
|
|
81
75
|
}
|
|
82
76
|
// --------------------------------------------------------------------------
|
|
83
77
|
// Convert
|
|
@@ -105,29 +99,29 @@ function TryConvertLiteral(schema, value) {
|
|
|
105
99
|
return TryConvertLiteralBoolean(value, schema.const);
|
|
106
100
|
}
|
|
107
101
|
else {
|
|
108
|
-
return
|
|
102
|
+
return (0, clone_1.Clone)(value);
|
|
109
103
|
}
|
|
110
104
|
}
|
|
111
105
|
function TryConvertBoolean(value) {
|
|
112
106
|
return IsValueTrue(value) ? true : IsValueFalse(value) ? false : value;
|
|
113
107
|
}
|
|
114
108
|
function TryConvertBigInt(value) {
|
|
115
|
-
return IsStringNumeric(value) ? BigInt(parseInt(value)) :
|
|
109
|
+
return IsStringNumeric(value) ? BigInt(parseInt(value)) : (0, guard_1.IsNumber)(value) ? BigInt(value | 0) : IsValueFalse(value) ? BigInt(0) : IsValueTrue(value) ? BigInt(1) : value;
|
|
116
110
|
}
|
|
117
111
|
function TryConvertString(value) {
|
|
118
|
-
return IsValueToString(value) ? value.toString() :
|
|
112
|
+
return IsValueToString(value) ? value.toString() : (0, guard_1.IsSymbol)(value) && value.description !== undefined ? value.description.toString() : value;
|
|
119
113
|
}
|
|
120
114
|
function TryConvertNumber(value) {
|
|
121
115
|
return IsStringNumeric(value) ? parseFloat(value) : IsValueTrue(value) ? 1 : IsValueFalse(value) ? 0 : value;
|
|
122
116
|
}
|
|
123
117
|
function TryConvertInteger(value) {
|
|
124
|
-
return IsStringNumeric(value) ? parseInt(value) :
|
|
118
|
+
return IsStringNumeric(value) ? parseInt(value) : (0, guard_1.IsNumber)(value) ? value | 0 : IsValueTrue(value) ? 1 : IsValueFalse(value) ? 0 : value;
|
|
125
119
|
}
|
|
126
120
|
function TryConvertNull(value) {
|
|
127
|
-
return
|
|
121
|
+
return (0, guard_1.IsString)(value) && value.toLowerCase() === 'null' ? null : value;
|
|
128
122
|
}
|
|
129
123
|
function TryConvertUndefined(value) {
|
|
130
|
-
return
|
|
124
|
+
return (0, guard_1.IsString)(value) && value === 'undefined' ? undefined : value;
|
|
131
125
|
}
|
|
132
126
|
function TryConvertDate(value) {
|
|
133
127
|
// --------------------------------------------------------------------------
|
|
@@ -136,9 +130,9 @@ function TryConvertDate(value) {
|
|
|
136
130
|
// and will return a epoch date if invalid. Consider better string parsing
|
|
137
131
|
// for the iso dates in future revisions.
|
|
138
132
|
// --------------------------------------------------------------------------
|
|
139
|
-
return
|
|
133
|
+
return (0, guard_1.IsDate)(value)
|
|
140
134
|
? value
|
|
141
|
-
:
|
|
135
|
+
: (0, guard_1.IsNumber)(value)
|
|
142
136
|
? new Date(value)
|
|
143
137
|
: IsValueTrue(value)
|
|
144
138
|
? new Date(1)
|
|
@@ -159,50 +153,36 @@ function TryConvertDate(value) {
|
|
|
159
153
|
: value;
|
|
160
154
|
}
|
|
161
155
|
// --------------------------------------------------------------------------
|
|
162
|
-
//
|
|
156
|
+
// Default
|
|
163
157
|
// --------------------------------------------------------------------------
|
|
164
|
-
function
|
|
158
|
+
function Default(value) {
|
|
165
159
|
return value;
|
|
166
160
|
}
|
|
161
|
+
exports.Default = Default;
|
|
162
|
+
// --------------------------------------------------------------------------
|
|
163
|
+
// Convert
|
|
164
|
+
// --------------------------------------------------------------------------
|
|
167
165
|
function TArray(schema, references, value) {
|
|
168
|
-
if (
|
|
166
|
+
if ((0, guard_1.IsArray)(value)) {
|
|
169
167
|
return value.map((value) => Visit(schema.items, references, value));
|
|
170
168
|
}
|
|
171
169
|
return value;
|
|
172
170
|
}
|
|
173
|
-
function TAsyncIterator(schema, references, value) {
|
|
174
|
-
return value;
|
|
175
|
-
}
|
|
176
171
|
function TBigInt(schema, references, value) {
|
|
177
172
|
return TryConvertBigInt(value);
|
|
178
173
|
}
|
|
179
174
|
function TBoolean(schema, references, value) {
|
|
180
175
|
return TryConvertBoolean(value);
|
|
181
176
|
}
|
|
182
|
-
function TConstructor(schema, references, value) {
|
|
183
|
-
return ValueClone.Clone(value);
|
|
184
|
-
}
|
|
185
177
|
function TDate(schema, references, value) {
|
|
186
178
|
return TryConvertDate(value);
|
|
187
179
|
}
|
|
188
|
-
function TFunction(schema, references, value) {
|
|
189
|
-
return value;
|
|
190
|
-
}
|
|
191
180
|
function TInteger(schema, references, value) {
|
|
192
181
|
return TryConvertInteger(value);
|
|
193
182
|
}
|
|
194
|
-
function TIntersect(schema, references, value) {
|
|
195
|
-
return value;
|
|
196
|
-
}
|
|
197
|
-
function TIterator(schema, references, value) {
|
|
198
|
-
return value;
|
|
199
|
-
}
|
|
200
183
|
function TLiteral(schema, references, value) {
|
|
201
184
|
return TryConvertLiteral(schema, value);
|
|
202
185
|
}
|
|
203
|
-
function TNever(schema, references, value) {
|
|
204
|
-
return value;
|
|
205
|
-
}
|
|
206
186
|
function TNull(schema, references, value) {
|
|
207
187
|
return TryConvertNull(value);
|
|
208
188
|
}
|
|
@@ -210,15 +190,12 @@ function TNumber(schema, references, value) {
|
|
|
210
190
|
return TryConvertNumber(value);
|
|
211
191
|
}
|
|
212
192
|
function TObject(schema, references, value) {
|
|
213
|
-
if (
|
|
193
|
+
if ((0, guard_1.IsObject)(value))
|
|
214
194
|
return Object.getOwnPropertyNames(schema.properties).reduce((acc, key) => {
|
|
215
195
|
return value[key] !== undefined ? { ...acc, [key]: Visit(schema.properties[key], references, value[key]) } : { ...acc };
|
|
216
196
|
}, value);
|
|
217
197
|
return value;
|
|
218
198
|
}
|
|
219
|
-
function TPromise(schema, references, value) {
|
|
220
|
-
return value;
|
|
221
|
-
}
|
|
222
199
|
function TRecord(schema, references, value) {
|
|
223
200
|
const propertyKey = Object.getOwnPropertyNames(schema.patternProperties)[0];
|
|
224
201
|
const property = schema.patternProperties[propertyKey];
|
|
@@ -229,30 +206,19 @@ function TRecord(schema, references, value) {
|
|
|
229
206
|
return result;
|
|
230
207
|
}
|
|
231
208
|
function TRef(schema, references, value) {
|
|
232
|
-
|
|
233
|
-
if (index === -1)
|
|
234
|
-
throw new ValueConvertDereferenceError(schema);
|
|
235
|
-
const target = references[index];
|
|
236
|
-
return Visit(target, references, value);
|
|
209
|
+
return Visit((0, deref_1.Deref)(schema, references), references, value);
|
|
237
210
|
}
|
|
238
211
|
function TString(schema, references, value) {
|
|
239
212
|
return TryConvertString(value);
|
|
240
213
|
}
|
|
241
214
|
function TSymbol(schema, references, value) {
|
|
242
|
-
return value;
|
|
243
|
-
}
|
|
244
|
-
function TTemplateLiteral(schema, references, value) {
|
|
245
|
-
return value;
|
|
215
|
+
return (0, guard_1.IsString)(value) || (0, guard_1.IsNumber)(value) ? Symbol(value) : value;
|
|
246
216
|
}
|
|
247
217
|
function TThis(schema, references, value) {
|
|
248
|
-
|
|
249
|
-
if (index === -1)
|
|
250
|
-
throw new ValueConvertDereferenceError(schema);
|
|
251
|
-
const target = references[index];
|
|
252
|
-
return Visit(target, references, value);
|
|
218
|
+
return Visit((0, deref_1.Deref)(schema, references), references, value);
|
|
253
219
|
}
|
|
254
220
|
function TTuple(schema, references, value) {
|
|
255
|
-
if (
|
|
221
|
+
if ((0, guard_1.IsArray)(value) && !(0, guard_1.IsUndefined)(schema.items)) {
|
|
256
222
|
return value.map((value, index) => {
|
|
257
223
|
return index < schema.items.length ? Visit(schema.items[index], references, value) : value;
|
|
258
224
|
});
|
|
@@ -265,62 +231,37 @@ function TUndefined(schema, references, value) {
|
|
|
265
231
|
function TUnion(schema, references, value) {
|
|
266
232
|
for (const subschema of schema.anyOf) {
|
|
267
233
|
const converted = Visit(subschema, references, value);
|
|
268
|
-
if (
|
|
234
|
+
if ((0, check_1.Check)(subschema, references, converted)) {
|
|
269
235
|
return converted;
|
|
270
236
|
}
|
|
271
237
|
}
|
|
272
238
|
return value;
|
|
273
239
|
}
|
|
274
|
-
function TUint8Array(schema, references, value) {
|
|
275
|
-
return value;
|
|
276
|
-
}
|
|
277
|
-
function TUnknown(schema, references, value) {
|
|
278
|
-
return value;
|
|
279
|
-
}
|
|
280
|
-
function TVoid(schema, references, value) {
|
|
281
|
-
return value;
|
|
282
|
-
}
|
|
283
|
-
function TKind(schema, references, value) {
|
|
284
|
-
return value;
|
|
285
|
-
}
|
|
286
240
|
function Visit(schema, references, value) {
|
|
287
|
-
const references_ =
|
|
241
|
+
const references_ = (0, guard_1.IsString)(schema.$id) ? [...references, schema] : references;
|
|
288
242
|
const schema_ = schema;
|
|
289
243
|
switch (schema[Types.Kind]) {
|
|
290
|
-
|
|
291
|
-
|
|
244
|
+
// ------------------------------------------------------
|
|
245
|
+
// Structural
|
|
246
|
+
// ------------------------------------------------------
|
|
292
247
|
case 'Array':
|
|
293
248
|
return TArray(schema_, references_, value);
|
|
294
|
-
case 'AsyncIterator':
|
|
295
|
-
return TAsyncIterator(schema_, references_, value);
|
|
296
249
|
case 'BigInt':
|
|
297
250
|
return TBigInt(schema_, references_, value);
|
|
298
251
|
case 'Boolean':
|
|
299
252
|
return TBoolean(schema_, references_, value);
|
|
300
|
-
case 'Constructor':
|
|
301
|
-
return TConstructor(schema_, references_, value);
|
|
302
253
|
case 'Date':
|
|
303
254
|
return TDate(schema_, references_, value);
|
|
304
|
-
case 'Function':
|
|
305
|
-
return TFunction(schema_, references_, value);
|
|
306
255
|
case 'Integer':
|
|
307
256
|
return TInteger(schema_, references_, value);
|
|
308
|
-
case 'Intersect':
|
|
309
|
-
return TIntersect(schema_, references_, value);
|
|
310
|
-
case 'Iterator':
|
|
311
|
-
return TIterator(schema_, references_, value);
|
|
312
257
|
case 'Literal':
|
|
313
258
|
return TLiteral(schema_, references_, value);
|
|
314
|
-
case 'Never':
|
|
315
|
-
return TNever(schema_, references_, value);
|
|
316
259
|
case 'Null':
|
|
317
260
|
return TNull(schema_, references_, value);
|
|
318
261
|
case 'Number':
|
|
319
262
|
return TNumber(schema_, references_, value);
|
|
320
263
|
case 'Object':
|
|
321
264
|
return TObject(schema_, references_, value);
|
|
322
|
-
case 'Promise':
|
|
323
|
-
return TPromise(schema_, references_, value);
|
|
324
265
|
case 'Record':
|
|
325
266
|
return TRecord(schema_, references_, value);
|
|
326
267
|
case 'Ref':
|
|
@@ -329,8 +270,6 @@ function Visit(schema, references, value) {
|
|
|
329
270
|
return TString(schema_, references_, value);
|
|
330
271
|
case 'Symbol':
|
|
331
272
|
return TSymbol(schema_, references_, value);
|
|
332
|
-
case 'TemplateLiteral':
|
|
333
|
-
return TTemplateLiteral(schema_, references_, value);
|
|
334
273
|
case 'This':
|
|
335
274
|
return TThis(schema_, references_, value);
|
|
336
275
|
case 'Tuple':
|
|
@@ -339,16 +278,26 @@ function Visit(schema, references, value) {
|
|
|
339
278
|
return TUndefined(schema_, references_, value);
|
|
340
279
|
case 'Union':
|
|
341
280
|
return TUnion(schema_, references_, value);
|
|
281
|
+
// ------------------------------------------------------
|
|
282
|
+
// Default
|
|
283
|
+
// ------------------------------------------------------
|
|
284
|
+
case 'Any':
|
|
285
|
+
case 'AsyncIterator':
|
|
286
|
+
case 'Constructor':
|
|
287
|
+
case 'Function':
|
|
288
|
+
case 'Intersect':
|
|
289
|
+
case 'Iterator':
|
|
290
|
+
case 'Never':
|
|
291
|
+
case 'Promise':
|
|
292
|
+
case 'TemplateLiteral':
|
|
342
293
|
case 'Uint8Array':
|
|
343
|
-
return TUint8Array(schema_, references_, value);
|
|
344
294
|
case 'Unknown':
|
|
345
|
-
return TUnknown(schema_, references_, value);
|
|
346
295
|
case 'Void':
|
|
347
|
-
return
|
|
296
|
+
return Default(value);
|
|
348
297
|
default:
|
|
349
298
|
if (!Types.TypeRegistry.Has(schema_[Types.Kind]))
|
|
350
299
|
throw new ValueConvertUnknownTypeError(schema_);
|
|
351
|
-
return
|
|
300
|
+
return Default(value);
|
|
352
301
|
}
|
|
353
302
|
}
|
|
354
303
|
/** Converts any type mismatched values to their target type if a reasonable conversion is possible. */
|
package/value/create.d.ts
CHANGED
|
@@ -1,29 +1,25 @@
|
|
|
1
1
|
import * as Types from '../typebox';
|
|
2
|
-
export declare class ValueCreateUnknownTypeError extends
|
|
2
|
+
export declare class ValueCreateUnknownTypeError extends Types.TypeBoxError {
|
|
3
3
|
readonly schema: Types.TSchema;
|
|
4
4
|
constructor(schema: Types.TSchema);
|
|
5
5
|
}
|
|
6
|
-
export declare class ValueCreateNeverTypeError extends
|
|
6
|
+
export declare class ValueCreateNeverTypeError extends Types.TypeBoxError {
|
|
7
7
|
readonly schema: Types.TSchema;
|
|
8
8
|
constructor(schema: Types.TSchema);
|
|
9
9
|
}
|
|
10
|
-
export declare class ValueCreateNotTypeError extends
|
|
10
|
+
export declare class ValueCreateNotTypeError extends Types.TypeBoxError {
|
|
11
11
|
readonly schema: Types.TSchema;
|
|
12
12
|
constructor(schema: Types.TSchema);
|
|
13
13
|
}
|
|
14
|
-
export declare class ValueCreateIntersectTypeError extends
|
|
14
|
+
export declare class ValueCreateIntersectTypeError extends Types.TypeBoxError {
|
|
15
15
|
readonly schema: Types.TSchema;
|
|
16
16
|
constructor(schema: Types.TSchema);
|
|
17
17
|
}
|
|
18
|
-
export declare class ValueCreateTempateLiteralTypeError extends
|
|
18
|
+
export declare class ValueCreateTempateLiteralTypeError extends Types.TypeBoxError {
|
|
19
19
|
readonly schema: Types.TSchema;
|
|
20
20
|
constructor(schema: Types.TSchema);
|
|
21
21
|
}
|
|
22
|
-
export declare class
|
|
23
|
-
readonly schema: Types.TRef | Types.TThis;
|
|
24
|
-
constructor(schema: Types.TRef | Types.TThis);
|
|
25
|
-
}
|
|
26
|
-
export declare class ValueCreateRecursiveInstantiationError extends Error {
|
|
22
|
+
export declare class ValueCreateRecursiveInstantiationError extends Types.TypeBoxError {
|
|
27
23
|
readonly schema: Types.TSchema;
|
|
28
24
|
readonly recursiveMaxDepth: number;
|
|
29
25
|
constructor(schema: Types.TSchema, recursiveMaxDepth: number);
|