@sinclair/typebox 0.26.0-dev.3 → 0.26.0-dev.5

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/value/cast.js CHANGED
@@ -27,7 +27,7 @@ THE SOFTWARE.
27
27
 
28
28
  ---------------------------------------------------------------------------*/
29
29
  Object.defineProperty(exports, "__esModule", { value: true });
30
- exports.ValueCast = exports.ValueCastUnknownTypeError = exports.ValueCastRecursiveTypeError = exports.ValueCastNeverTypeError = exports.ValueCastArrayUniqueItemsTypeError = exports.ValueCastReferenceTypeError = void 0;
30
+ exports.ValueCast = exports.ValueCastDereferenceError = exports.ValueCastUnknownTypeError = exports.ValueCastRecursiveTypeError = exports.ValueCastNeverTypeError = exports.ValueCastArrayUniqueItemsTypeError = exports.ValueCastReferenceTypeError = void 0;
31
31
  const Types = require("../typebox");
32
32
  const create_1 = require("./create");
33
33
  const check_1 = require("./check");
@@ -71,6 +71,13 @@ class ValueCastUnknownTypeError extends Error {
71
71
  }
72
72
  }
73
73
  exports.ValueCastUnknownTypeError = ValueCastUnknownTypeError;
74
+ class ValueCastDereferenceError extends Error {
75
+ constructor(schema) {
76
+ super(`ValueCast: Unable to dereference schema with $id '${schema.$ref}'`);
77
+ this.schema = schema;
78
+ }
79
+ }
80
+ exports.ValueCastDereferenceError = ValueCastDereferenceError;
74
81
  // ----------------------------------------------------------------------------------------------
75
82
  // The following will score a schema against a value. For objects, the score is the tally of
76
83
  // points awarded for each property of the value. Property points are (1.0 / propertyCount)
@@ -79,7 +86,7 @@ exports.ValueCastUnknownTypeError = ValueCastUnknownTypeError;
79
86
  // ----------------------------------------------------------------------------------------------
80
87
  var UnionCastCreate;
81
88
  (function (UnionCastCreate) {
82
- function Score(schema, value) {
89
+ function Score(schema, references, value) {
83
90
  if (schema[Types.Kind] === 'Object' && typeof value === 'object' && value !== null) {
84
91
  const object = schema;
85
92
  const keys = Object.keys(value);
@@ -87,19 +94,19 @@ var UnionCastCreate;
87
94
  const [point, max] = [1 / entries.length, entries.length];
88
95
  return entries.reduce((acc, [key, schema]) => {
89
96
  const literal = schema[Types.Kind] === 'Literal' && schema.const === value[key] ? max : 0;
90
- const checks = check_1.ValueCheck.Check(schema, value[key]) ? point : 0;
97
+ const checks = check_1.ValueCheck.Check(schema, references, value[key]) ? point : 0;
91
98
  const exists = keys.includes(key) ? point : 0;
92
99
  return acc + (literal + checks + exists);
93
100
  }, 0);
94
101
  }
95
102
  else {
96
- return check_1.ValueCheck.Check(schema, value) ? 1 : 0;
103
+ return check_1.ValueCheck.Check(schema, references, value) ? 1 : 0;
97
104
  }
98
105
  }
99
- function Select(union, value) {
106
+ function Select(union, references, value) {
100
107
  let [select, best] = [union.anyOf[0], 0];
101
108
  for (const schema of union.anyOf) {
102
- const score = Score(schema, value);
109
+ const score = Score(schema, references, value);
103
110
  if (score > best) {
104
111
  select = schema;
105
112
  best = score;
@@ -107,13 +114,13 @@ var UnionCastCreate;
107
114
  }
108
115
  return select;
109
116
  }
110
- function Create(union, value) {
117
+ function Create(union, references, value) {
111
118
  if (union.default !== undefined) {
112
119
  return union.default;
113
120
  }
114
121
  else {
115
- const schema = Select(union, value);
116
- return ValueCast.Cast(schema, value);
122
+ const schema = Select(union, references, value);
123
+ return ValueCast.Cast(schema, references, value);
117
124
  }
118
125
  }
119
126
  UnionCastCreate.Create = Create;
@@ -132,84 +139,87 @@ var ValueCast;
132
139
  function IsNumber(value) {
133
140
  return typeof value === 'number' && !isNaN(value);
134
141
  }
142
+ function IsString(value) {
143
+ return typeof value === 'string';
144
+ }
135
145
  // ----------------------------------------------------------------------------------------------
136
146
  // Cast
137
147
  // ----------------------------------------------------------------------------------------------
138
- function Any(schema, value) {
139
- return check_1.ValueCheck.Check(schema, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema);
148
+ function Any(schema, references, value) {
149
+ return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references);
140
150
  }
141
- function Array(schema, value) {
142
- if (check_1.ValueCheck.Check(schema, value))
151
+ function Array(schema, references, value) {
152
+ if (check_1.ValueCheck.Check(schema, references, value))
143
153
  return clone_1.ValueClone.Clone(value);
144
- const created = IsArray(value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema);
154
+ const created = IsArray(value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references);
145
155
  const minimum = IsNumber(schema.minItems) && created.length < schema.minItems ? [...created, ...globalThis.Array.from({ length: schema.minItems - created.length }, () => null)] : created;
146
156
  const maximum = IsNumber(schema.maxItems) && minimum.length > schema.maxItems ? minimum.slice(0, schema.maxItems) : minimum;
147
- const casted = maximum.map((value) => Visit(schema.items, value));
157
+ const casted = maximum.map((value) => Visit(schema.items, references, value));
148
158
  if (schema.uniqueItems !== true)
149
159
  return casted;
150
160
  const unique = [...new Set(casted)];
151
- if (!check_1.ValueCheck.Check(schema, unique))
161
+ if (!check_1.ValueCheck.Check(schema, references, unique))
152
162
  throw new ValueCastArrayUniqueItemsTypeError(schema, unique);
153
163
  return unique;
154
164
  }
155
- function BigInt(schema, value) {
156
- return check_1.ValueCheck.Check(schema, value) ? value : create_1.ValueCreate.Create(schema);
165
+ function BigInt(schema, references, value) {
166
+ return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references);
157
167
  }
158
- function Boolean(schema, value) {
159
- return check_1.ValueCheck.Check(schema, value) ? value : create_1.ValueCreate.Create(schema);
168
+ function Boolean(schema, references, value) {
169
+ return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references);
160
170
  }
161
- function Constructor(schema, value) {
162
- if (check_1.ValueCheck.Check(schema, value))
163
- return create_1.ValueCreate.Create(schema);
171
+ function Constructor(schema, references, value) {
172
+ if (check_1.ValueCheck.Check(schema, references, value))
173
+ return create_1.ValueCreate.Create(schema, references);
164
174
  const required = new Set(schema.returns.required || []);
165
175
  const result = function () { };
166
176
  for (const [key, property] of globalThis.Object.entries(schema.returns.properties)) {
167
177
  if (!required.has(key) && value.prototype[key] === undefined)
168
178
  continue;
169
- result.prototype[key] = Visit(property, value.prototype[key]);
179
+ result.prototype[key] = Visit(property, references, value.prototype[key]);
170
180
  }
171
181
  return result;
172
182
  }
173
- function Date(schema, value) {
174
- return check_1.ValueCheck.Check(schema, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema);
183
+ function Date(schema, references, value) {
184
+ return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references);
175
185
  }
176
- function Function(schema, value) {
177
- return check_1.ValueCheck.Check(schema, value) ? value : create_1.ValueCreate.Create(schema);
186
+ function Function(schema, references, value) {
187
+ return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references);
178
188
  }
179
- function Integer(schema, value) {
180
- return check_1.ValueCheck.Check(schema, value) ? value : create_1.ValueCreate.Create(schema);
189
+ function Integer(schema, references, value) {
190
+ return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references);
181
191
  }
182
- function Intersect(schema, value) {
183
- const created = create_1.ValueCreate.Create(schema);
192
+ function Intersect(schema, references, value) {
193
+ const created = create_1.ValueCreate.Create(schema, references);
184
194
  const mapped = IsObject(created) && IsObject(value) ? { ...created, ...value } : value;
185
- return check_1.ValueCheck.Check(schema, mapped) ? mapped : create_1.ValueCreate.Create(schema);
195
+ return check_1.ValueCheck.Check(schema, references, mapped) ? mapped : create_1.ValueCreate.Create(schema, references);
186
196
  }
187
- function Literal(schema, value) {
188
- return check_1.ValueCheck.Check(schema, value) ? value : create_1.ValueCreate.Create(schema);
197
+ function Literal(schema, references, value) {
198
+ return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references);
189
199
  }
190
- function Never(schema, value) {
200
+ function Never(schema, references, value) {
191
201
  throw new ValueCastNeverTypeError(schema);
192
202
  }
193
- function Not(schema, value) {
194
- return check_1.ValueCheck.Check(schema, value) ? value : create_1.ValueCreate.Create(schema.allOf[1]);
203
+ function Not(schema, references, value) {
204
+ return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema.allOf[1], references);
195
205
  }
196
- function Null(schema, value) {
197
- return check_1.ValueCheck.Check(schema, value) ? value : create_1.ValueCreate.Create(schema);
206
+ function Null(schema, references, value) {
207
+ return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references);
198
208
  }
199
- function Number(schema, value) {
200
- return check_1.ValueCheck.Check(schema, value) ? value : create_1.ValueCreate.Create(schema);
209
+ function Number(schema, references, value) {
210
+ return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references);
201
211
  }
202
- function Object(schema, value) {
203
- if (check_1.ValueCheck.Check(schema, value))
212
+ function Object(schema, references, value) {
213
+ if (check_1.ValueCheck.Check(schema, references, value))
204
214
  return value;
205
215
  if (value === null || typeof value !== 'object')
206
- return create_1.ValueCreate.Create(schema);
216
+ return create_1.ValueCreate.Create(schema, references);
207
217
  const required = new Set(schema.required || []);
208
218
  const result = {};
209
219
  for (const [key, property] of globalThis.Object.entries(schema.properties)) {
210
220
  if (!required.has(key) && value[key] === undefined)
211
221
  continue;
212
- result[key] = Visit(property, value[key]);
222
+ result[key] = Visit(property, references, value[key]);
213
223
  }
214
224
  // additional schema properties
215
225
  if (typeof schema.additionalProperties === 'object') {
@@ -217,132 +227,141 @@ var ValueCast;
217
227
  for (const propertyName of globalThis.Object.getOwnPropertyNames(value)) {
218
228
  if (propertyNames.includes(propertyName))
219
229
  continue;
220
- result[propertyName] = Visit(schema.additionalProperties, value[propertyName]);
230
+ result[propertyName] = Visit(schema.additionalProperties, references, value[propertyName]);
221
231
  }
222
232
  }
223
233
  return result;
224
234
  }
225
- function Promise(schema, value) {
226
- return check_1.ValueCheck.Check(schema, value) ? value : create_1.ValueCreate.Create(schema);
235
+ function Promise(schema, references, value) {
236
+ return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references);
227
237
  }
228
- function Record(schema, value) {
229
- if (check_1.ValueCheck.Check(schema, value))
238
+ function Record(schema, references, value) {
239
+ if (check_1.ValueCheck.Check(schema, references, value))
230
240
  return clone_1.ValueClone.Clone(value);
231
241
  if (value === null || typeof value !== 'object' || globalThis.Array.isArray(value) || value instanceof globalThis.Date)
232
- return create_1.ValueCreate.Create(schema);
242
+ return create_1.ValueCreate.Create(schema, references);
233
243
  const subschemaPropertyName = globalThis.Object.getOwnPropertyNames(schema.patternProperties)[0];
234
244
  const subschema = schema.patternProperties[subschemaPropertyName];
235
245
  const result = {};
236
246
  for (const [propKey, propValue] of globalThis.Object.entries(value)) {
237
- result[propKey] = Visit(subschema, propValue);
247
+ result[propKey] = Visit(subschema, references, propValue);
238
248
  }
239
249
  return result;
240
250
  }
241
- function Ref(schema, value) {
242
- return Visit(Types.ReferenceRegistry.DerefOne(schema), value);
251
+ function Ref(schema, references, value) {
252
+ const index = references.findIndex((foreign) => foreign.$id === schema.$ref);
253
+ if (index === -1)
254
+ throw new ValueCastDereferenceError(schema);
255
+ const target = references[index];
256
+ return Visit(target, references, value);
243
257
  }
244
- function Self(schema, value) {
245
- return Visit(Types.ReferenceRegistry.DerefOne(schema), value);
258
+ function Self(schema, references, value) {
259
+ const index = references.findIndex((foreign) => foreign.$id === schema.$ref);
260
+ if (index === -1)
261
+ throw new ValueCastDereferenceError(schema);
262
+ const target = references[index];
263
+ return Visit(target, references, value);
246
264
  }
247
- function String(schema, value) {
248
- return check_1.ValueCheck.Check(schema, value) ? value : create_1.ValueCreate.Create(schema);
265
+ function String(schema, references, value) {
266
+ return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references);
249
267
  }
250
- function Symbol(schema, value) {
251
- return check_1.ValueCheck.Check(schema, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema);
268
+ function Symbol(schema, references, value) {
269
+ return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references);
252
270
  }
253
- function Tuple(schema, value) {
254
- if (check_1.ValueCheck.Check(schema, value))
271
+ function Tuple(schema, references, value) {
272
+ if (check_1.ValueCheck.Check(schema, references, value))
255
273
  return clone_1.ValueClone.Clone(value);
256
274
  if (!globalThis.Array.isArray(value))
257
- return create_1.ValueCreate.Create(schema);
275
+ return create_1.ValueCreate.Create(schema, references);
258
276
  if (schema.items === undefined)
259
277
  return [];
260
- return schema.items.map((schema, index) => Visit(schema, value[index]));
278
+ return schema.items.map((schema, index) => Visit(schema, references, value[index]));
261
279
  }
262
- function Undefined(schema, value) {
263
- return check_1.ValueCheck.Check(schema, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema);
280
+ function Undefined(schema, references, value) {
281
+ return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references);
264
282
  }
265
- function Union(schema, value) {
266
- return check_1.ValueCheck.Check(schema, value) ? clone_1.ValueClone.Clone(value) : UnionCastCreate.Create(schema, value);
283
+ function Union(schema, references, value) {
284
+ return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : UnionCastCreate.Create(schema, references, value);
267
285
  }
268
- function Uint8Array(schema, value) {
269
- return check_1.ValueCheck.Check(schema, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema);
286
+ function Uint8Array(schema, references, value) {
287
+ return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references);
270
288
  }
271
- function Unknown(schema, value) {
272
- return check_1.ValueCheck.Check(schema, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema);
289
+ function Unknown(schema, references, value) {
290
+ return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references);
273
291
  }
274
- function Void(schema, value) {
275
- return check_1.ValueCheck.Check(schema, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema);
292
+ function Void(schema, references, value) {
293
+ return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references);
276
294
  }
277
- function UserDefined(schema, value) {
278
- return check_1.ValueCheck.Check(schema, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema);
295
+ function UserDefined(schema, references, value) {
296
+ return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references);
279
297
  }
280
- function Visit(schema, value) {
281
- const anySchema = schema;
298
+ function Visit(schema, references, value) {
299
+ const references_ = IsString(schema.$id) ? [...references, schema] : references;
300
+ const schema_ = schema;
282
301
  switch (schema[Types.Kind]) {
283
302
  case 'Any':
284
- return Any(anySchema, value);
303
+ return Any(schema_, references_, value);
285
304
  case 'Array':
286
- return Array(anySchema, value);
305
+ return Array(schema_, references_, value);
287
306
  case 'BigInt':
288
- return BigInt(anySchema, value);
307
+ return BigInt(schema_, references_, value);
289
308
  case 'Boolean':
290
- return Boolean(anySchema, value);
309
+ return Boolean(schema_, references_, value);
291
310
  case 'Constructor':
292
- return Constructor(anySchema, value);
311
+ return Constructor(schema_, references_, value);
293
312
  case 'Date':
294
- return Date(anySchema, value);
313
+ return Date(schema_, references_, value);
295
314
  case 'Function':
296
- return Function(anySchema, value);
315
+ return Function(schema_, references_, value);
297
316
  case 'Integer':
298
- return Integer(anySchema, value);
317
+ return Integer(schema_, references_, value);
299
318
  case 'Intersect':
300
- return Intersect(anySchema, value);
319
+ return Intersect(schema_, references_, value);
301
320
  case 'Literal':
302
- return Literal(anySchema, value);
321
+ return Literal(schema_, references_, value);
303
322
  case 'Never':
304
- return Never(anySchema, value);
323
+ return Never(schema_, references_, value);
305
324
  case 'Not':
306
- return Not(anySchema, value);
325
+ return Not(schema_, references_, value);
307
326
  case 'Null':
308
- return Null(anySchema, value);
327
+ return Null(schema_, references_, value);
309
328
  case 'Number':
310
- return Number(anySchema, value);
329
+ return Number(schema_, references_, value);
311
330
  case 'Object':
312
- return Object(anySchema, value);
331
+ return Object(schema_, references_, value);
313
332
  case 'Promise':
314
- return Promise(anySchema, value);
333
+ return Promise(schema_, references_, value);
315
334
  case 'Record':
316
- return Record(anySchema, value);
335
+ return Record(schema_, references_, value);
317
336
  case 'Ref':
318
- return Ref(anySchema, value);
337
+ return Ref(schema_, references_, value);
319
338
  case 'Self':
320
- return Self(anySchema, value);
339
+ return Self(schema_, references_, value);
321
340
  case 'String':
322
- return String(anySchema, value);
341
+ return String(schema_, references_, value);
323
342
  case 'Symbol':
324
- return Symbol(anySchema, value);
343
+ return Symbol(schema_, references_, value);
325
344
  case 'Tuple':
326
- return Tuple(anySchema, value);
345
+ return Tuple(schema_, references_, value);
327
346
  case 'Undefined':
328
- return Undefined(anySchema, value);
347
+ return Undefined(schema_, references_, value);
329
348
  case 'Union':
330
- return Union(anySchema, value);
349
+ return Union(schema_, references_, value);
331
350
  case 'Uint8Array':
332
- return Uint8Array(anySchema, value);
351
+ return Uint8Array(schema_, references_, value);
333
352
  case 'Unknown':
334
- return Unknown(anySchema, value);
353
+ return Unknown(schema_, references_, value);
335
354
  case 'Void':
336
- return Void(anySchema, value);
355
+ return Void(schema_, references_, value);
337
356
  default:
338
- if (!Types.TypeRegistry.Has(anySchema[Types.Kind]))
339
- throw new ValueCastUnknownTypeError(anySchema);
340
- return UserDefined(anySchema, value);
357
+ if (!Types.TypeRegistry.Has(schema_[Types.Kind]))
358
+ throw new ValueCastUnknownTypeError(schema_);
359
+ return UserDefined(schema_, references_, value);
341
360
  }
342
361
  }
343
362
  ValueCast.Visit = Visit;
344
- function Cast(schema, value) {
345
- return Visit(schema, clone_1.ValueClone.Clone(value));
363
+ function Cast(schema, references, value) {
364
+ return Visit(schema, references, clone_1.ValueClone.Clone(value));
346
365
  }
347
366
  ValueCast.Cast = Cast;
348
367
  })(ValueCast = exports.ValueCast || (exports.ValueCast = {}));
package/value/check.d.ts CHANGED
@@ -3,6 +3,10 @@ export declare class ValueCheckUnknownTypeError extends Error {
3
3
  readonly schema: Types.TSchema;
4
4
  constructor(schema: Types.TSchema);
5
5
  }
6
+ export declare class ValueCheckDereferenceError extends Error {
7
+ readonly schema: Types.TRef | Types.TSelf;
8
+ constructor(schema: Types.TRef | Types.TSelf);
9
+ }
6
10
  export declare namespace ValueCheck {
7
- function Check<T extends Types.TSchema>(schema: T, value: any): boolean;
11
+ function Check<T extends Types.TSchema>(schema: T, references: Types.TSchema[], value: any): boolean;
8
12
  }