@sinclair/typebox 0.31.26 → 0.31.28

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sinclair/typebox",
3
- "version": "0.31.26",
3
+ "version": "0.31.28",
4
4
  "description": "JSONSchema Type Builder with Static Type Resolution for TypeScript",
5
5
  "keywords": [
6
6
  "typescript",
package/readme.md CHANGED
@@ -1719,11 +1719,11 @@ The following table lists esbuild compiled and minified sizes for each TypeBox m
1719
1719
  ┌──────────────────────┬────────────┬────────────┬─────────────┐
1720
1720
  │ (index) │ Compiled │ Minified │ Compression │
1721
1721
  ├──────────────────────┼────────────┼────────────┼─────────────┤
1722
- │ typebox/compiler │ '148.9 kb' │ ' 65.8 kb' │ '2.26 x' │
1723
- │ typebox/errors │ '111.5 kb' │ ' 49.1 kb' │ '2.27 x' │
1724
- │ typebox/system │ ' 82.6 kb' │ ' 36.8 kb' │ '2.24 x' │
1725
- │ typebox/value │ '190.5 kb' │ ' 82.4 kb' │ '2.31 x' │
1726
- │ typebox │ ' 72.4 kb' │ ' 31.6 kb' │ '2.29 x' │
1722
+ │ typebox/compiler │ '163.6 kb' │ ' 71.6 kb' │ '2.28 x' │
1723
+ │ typebox/errors │ '113.3 kb' │ ' 50.1 kb' │ '2.26 x' │
1724
+ │ typebox/system │ ' 83.9 kb' │ ' 37.5 kb' │ '2.24 x' │
1725
+ │ typebox/value │ '191.1 kb' │ ' 82.3 kb' │ '2.32 x' │
1726
+ │ typebox │ ' 73.8 kb' │ ' 32.3 kb' │ '2.29 x' │
1727
1727
  └──────────────────────┴────────────┴────────────┴─────────────┘
1728
1728
  ```
1729
1729
 
package/typebox.d.ts CHANGED
@@ -560,6 +560,8 @@ export declare namespace ValueGuard {
560
560
  function IsBigInt(value: unknown): value is bigint;
561
561
  /** Returns true if this value is a boolean */
562
562
  function IsBoolean(value: unknown): value is boolean;
563
+ /** Returns true if this value is a Date object */
564
+ function IsDate(value: unknown): value is Date;
563
565
  /** Returns true if this value is null */
564
566
  function IsNull(value: unknown): value is null;
565
567
  /** Returns true if this value is number */
@@ -568,6 +570,8 @@ export declare namespace ValueGuard {
568
570
  function IsObject(value: unknown): value is Record<PropertyKey, unknown>;
569
571
  /** Returns true if this value is string */
570
572
  function IsString(value: unknown): value is string;
573
+ /** Returns true if this value is a Uint8Array */
574
+ function IsUint8Array(value: unknown): value is Uint8Array;
571
575
  /** Returns true if this value is undefined */
572
576
  function IsUndefined(value: unknown): value is undefined;
573
577
  }
package/typebox.js CHANGED
@@ -145,6 +145,11 @@ var ValueGuard;
145
145
  return typeof value === 'boolean';
146
146
  }
147
147
  ValueGuard.IsBoolean = IsBoolean;
148
+ /** Returns true if this value is a Date object */
149
+ function IsDate(value) {
150
+ return value instanceof globalThis.Date;
151
+ }
152
+ ValueGuard.IsDate = IsDate;
148
153
  /** Returns true if this value is null */
149
154
  function IsNull(value) {
150
155
  return value === null;
@@ -165,6 +170,11 @@ var ValueGuard;
165
170
  return typeof value === 'string';
166
171
  }
167
172
  ValueGuard.IsString = IsString;
173
+ /** Returns true if this value is a Uint8Array */
174
+ function IsUint8Array(value) {
175
+ return value instanceof globalThis.Uint8Array;
176
+ }
177
+ ValueGuard.IsUint8Array = IsUint8Array;
168
178
  /** Returns true if this value is undefined */
169
179
  function IsUndefined(value) {
170
180
  return value === undefined;
@@ -1252,19 +1262,27 @@ var TypeExtends;
1252
1262
  /** Specialized Clone for Types */
1253
1263
  var TypeClone;
1254
1264
  (function (TypeClone) {
1265
+ function ArrayType(value) {
1266
+ return value.map((value) => Visit(value));
1267
+ }
1268
+ function DateType(value) {
1269
+ return new Date(value.getTime());
1270
+ }
1271
+ function Uint8ArrayType(value) {
1272
+ return new Uint8Array(value);
1273
+ }
1255
1274
  function ObjectType(value) {
1256
1275
  const clonedProperties = Object.getOwnPropertyNames(value).reduce((acc, key) => ({ ...acc, [key]: Visit(value[key]) }), {});
1257
1276
  const clonedSymbols = Object.getOwnPropertySymbols(value).reduce((acc, key) => ({ ...acc, [key]: Visit(value[key]) }), {});
1258
1277
  return { ...clonedProperties, ...clonedSymbols };
1259
1278
  }
1260
- function ArrayType(value) {
1261
- return value.map((value) => Visit(value));
1262
- }
1263
1279
  function Visit(value) {
1264
1280
  // prettier-ignore
1265
- return ValueGuard.IsArray(value) ? ArrayType(value) :
1266
- ValueGuard.IsObject(value) ? ObjectType(value) :
1267
- value;
1281
+ return (ValueGuard.IsArray(value) ? ArrayType(value) :
1282
+ ValueGuard.IsDate(value) ? DateType(value) :
1283
+ ValueGuard.IsUint8Array(value) ? Uint8ArrayType(value) :
1284
+ ValueGuard.IsObject(value) ? ObjectType(value) :
1285
+ value);
1268
1286
  }
1269
1287
  /** Clones a Rest */
1270
1288
  function Rest(schemas) {
package/value/create.js CHANGED
@@ -162,7 +162,7 @@ function TDate(schema, references) {
162
162
  return new Date(schema.minimumTimestamp);
163
163
  }
164
164
  else {
165
- return new Date(0);
165
+ return new Date();
166
166
  }
167
167
  }
168
168
  function TFunction(schema, references) {
@@ -1,10 +1,5 @@
1
1
  import { ValueError } from '../errors/errors';
2
2
  import * as Types from '../typebox';
3
- export type CheckFunction = (schema: Types.TSchema, references: Types.TSchema[], value: unknown) => boolean;
4
- export declare class TransformUnknownTypeError extends Types.TypeBoxError {
5
- readonly schema: Types.TRef | Types.TThis;
6
- constructor(schema: Types.TRef | Types.TThis);
7
- }
8
3
  export declare class TransformDecodeCheckError extends Types.TypeBoxError {
9
4
  readonly schema: Types.TSchema;
10
5
  readonly value: unknown;
@@ -27,7 +27,7 @@ THE SOFTWARE.
27
27
 
28
28
  ---------------------------------------------------------------------------*/
29
29
  Object.defineProperty(exports, "__esModule", { value: true });
30
- exports.EncodeTransform = exports.DecodeTransform = exports.HasTransform = exports.TransformEncodeError = exports.TransformDecodeError = exports.TransformEncodeCheckError = exports.TransformDecodeCheckError = exports.TransformUnknownTypeError = void 0;
30
+ exports.EncodeTransform = exports.DecodeTransform = exports.HasTransform = exports.TransformEncodeError = exports.TransformDecodeError = exports.TransformEncodeCheckError = exports.TransformDecodeCheckError = void 0;
31
31
  const guard_1 = require("./guard");
32
32
  const deref_1 = require("./deref");
33
33
  const check_1 = require("./check");
@@ -35,13 +35,6 @@ const Types = require("../typebox");
35
35
  // -------------------------------------------------------------------------
36
36
  // Errors
37
37
  // -------------------------------------------------------------------------
38
- class TransformUnknownTypeError extends Types.TypeBoxError {
39
- constructor(schema) {
40
- super(`Unknown type`);
41
- this.schema = schema;
42
- }
43
- }
44
- exports.TransformUnknownTypeError = TransformUnknownTypeError;
45
38
  class TransformDecodeCheckError extends Types.TypeBoxError {
46
39
  constructor(schema, value, error) {
47
40
  super(`Unable to decode due to invalid value`);
@@ -76,9 +69,9 @@ class TransformEncodeError extends Types.TypeBoxError {
76
69
  }
77
70
  }
78
71
  exports.TransformEncodeError = TransformEncodeError;
79
- // -------------------------------------------------------------------------
72
+ // ------------------------------------------------------------------
80
73
  // HasTransform
81
- // -------------------------------------------------------------------------
74
+ // ------------------------------------------------------------------
82
75
  /** Recursively checks a schema for transform codecs */
83
76
  var HasTransform;
84
77
  (function (HasTransform) {
@@ -139,9 +132,6 @@ var HasTransform;
139
132
  if (schema.$id)
140
133
  visited.add(schema.$id);
141
134
  switch (schema[Types.Kind]) {
142
- // ------------------------------------------------------
143
- // Structural
144
- // ------------------------------------------------------
145
135
  case 'Array':
146
136
  return TArray(schema_, references_);
147
137
  case 'AsyncIterator':
@@ -170,29 +160,7 @@ var HasTransform;
170
160
  return TTuple(schema_, references_);
171
161
  case 'Union':
172
162
  return TUnion(schema_, references_);
173
- // ------------------------------------------------------
174
- // Default
175
- // ------------------------------------------------------
176
- case 'Any':
177
- case 'BigInt':
178
- case 'Boolean':
179
- case 'Date':
180
- case 'Integer':
181
- case 'Literal':
182
- case 'Never':
183
- case 'Null':
184
- case 'Number':
185
- case 'String':
186
- case 'Symbol':
187
- case 'TemplateLiteral':
188
- case 'Undefined':
189
- case 'Uint8Array':
190
- case 'Unknown':
191
- case 'Void':
192
- return Types.TypeGuard.TTransform(schema);
193
163
  default:
194
- if (!Types.TypeRegistry.Has(schema_[Types.Kind]))
195
- throw new TransformUnknownTypeError(schema_);
196
164
  return Types.TypeGuard.TTransform(schema);
197
165
  }
198
166
  }
@@ -204,9 +172,9 @@ var HasTransform;
204
172
  }
205
173
  HasTransform.Has = Has;
206
174
  })(HasTransform || (exports.HasTransform = HasTransform = {}));
207
- // -------------------------------------------------------------------------
175
+ // ------------------------------------------------------------------
208
176
  // DecodeTransform
209
- // -------------------------------------------------------------------------
177
+ // ------------------------------------------------------------------
210
178
  /** Decodes a value using transform decoders if available. Does not ensure correct results. */
211
179
  var DecodeTransform;
212
180
  (function (DecodeTransform) {
@@ -218,89 +186,109 @@ var DecodeTransform;
218
186
  throw new TransformDecodeError(schema, value, error);
219
187
  }
220
188
  }
189
+ // prettier-ignore
221
190
  function TArray(schema, references, value) {
222
- const elements1 = value.map((value) => Visit(schema.items, references, value));
223
- return Default(schema, elements1);
191
+ return ((0, guard_1.IsArray)(value))
192
+ ? Default(schema, value.map((value) => Visit(schema.items, references, value)))
193
+ : Default(schema, value);
224
194
  }
195
+ // prettier-ignore
225
196
  function TIntersect(schema, references, value) {
226
197
  if (!(0, guard_1.IsPlainObject)(value) || (0, guard_1.IsValueType)(value))
227
198
  return Default(schema, value);
228
- const keys = Types.KeyResolver.ResolveKeys(schema, { includePatterns: false });
229
- const properties1 = Object.entries(value).reduce((acc, [key, value]) => {
230
- return !keys.includes(key) ? { ...acc, [key]: value } : { ...acc, [key]: Default(Types.IndexedAccessor.Resolve(schema, [key]), value) };
231
- }, {});
232
- if (!Types.TypeGuard.TTransform(schema.unevaluatedProperties))
233
- return Default(schema, properties1);
234
- const properties2 = Object.entries(properties1).reduce((acc, [key, value]) => {
235
- return keys.includes(key) ? { ...acc, [key]: value } : { ...acc, [key]: Default(schema.unevaluatedProperties, value) };
236
- }, {});
237
- return Default(schema, properties2);
199
+ const knownKeys = Types.KeyResolver.ResolveKeys(schema, { includePatterns: false });
200
+ const knownProperties = knownKeys.reduce((value, key) => {
201
+ return (key in value)
202
+ ? { ...value, [key]: Visit(Types.IndexedAccessor.Resolve(schema, [key]), references, value[key]) }
203
+ : value;
204
+ }, value);
205
+ if (!Types.TypeGuard.TTransform(schema.unevaluatedProperties)) {
206
+ return Default(schema, knownProperties);
207
+ }
208
+ const unknownKeys = Object.getOwnPropertyNames(knownProperties);
209
+ const unevaluatedProperties = schema.unevaluatedProperties;
210
+ const unknownProperties = unknownKeys.reduce((value, key) => {
211
+ return !knownKeys.includes(key)
212
+ ? { ...value, [key]: Default(unevaluatedProperties, value[key]) }
213
+ : value;
214
+ }, knownProperties);
215
+ return Default(schema, unknownProperties);
238
216
  }
239
217
  function TNot(schema, references, value) {
240
- const value1 = Visit(schema.not, references, value);
241
- return Default(schema, value1);
218
+ return Default(schema, Visit(schema.not, references, value));
242
219
  }
220
+ // prettier-ignore
243
221
  function TObject(schema, references, value) {
244
222
  if (!(0, guard_1.IsPlainObject)(value))
245
223
  return Default(schema, value);
246
- const properties1 = Object.entries(value).reduce((acc, [key, value]) => {
247
- return !(key in schema.properties) ? { ...acc, [key]: value } : { ...acc, [key]: Visit(schema.properties[key], references, value) };
248
- }, {});
249
- if (!Types.TypeGuard.TSchema(schema.additionalProperties))
250
- return Default(schema, properties1);
224
+ const knownKeys = Types.KeyResolver.ResolveKeys(schema, { includePatterns: false });
225
+ const knownProperties = knownKeys.reduce((value, key) => {
226
+ return (key in value)
227
+ ? { ...value, [key]: Visit(schema.properties[key], references, value[key]) }
228
+ : value;
229
+ }, value);
230
+ if (!Types.TypeGuard.TSchema(schema.additionalProperties)) {
231
+ return Default(schema, knownProperties);
232
+ }
233
+ const unknownKeys = Object.getOwnPropertyNames(knownProperties);
251
234
  const additionalProperties = schema.additionalProperties;
252
- const properties2 = Object.entries(properties1).reduce((acc, [key, value]) => {
253
- return key in schema.properties ? { ...acc, [key]: value } : { ...acc, [key]: Visit(additionalProperties, references, value) };
254
- }, {});
255
- return Default(schema, properties2);
256
- }
235
+ const unknownProperties = unknownKeys.reduce((value, key) => {
236
+ return !knownKeys.includes(key)
237
+ ? { ...value, [key]: Default(additionalProperties, value[key]) }
238
+ : value;
239
+ }, knownProperties);
240
+ return Default(schema, unknownProperties);
241
+ }
242
+ // prettier-ignore
257
243
  function TRecord(schema, references, value) {
258
244
  if (!(0, guard_1.IsPlainObject)(value))
259
245
  return Default(schema, value);
260
246
  const pattern = Object.getOwnPropertyNames(schema.patternProperties)[0];
261
- const property = schema.patternProperties[pattern];
262
- const regex = new RegExp(pattern);
263
- const properties1 = Object.entries(value).reduce((acc, [key, value]) => {
264
- return !regex.test(key) ? { ...acc, [key]: value } : { ...acc, [key]: Visit(property, references, value) };
265
- }, {});
266
- if (!Types.TypeGuard.TSchema(schema.additionalProperties))
267
- return Default(schema, properties1);
247
+ const knownKeys = new RegExp(pattern);
248
+ const knownProperties = Object.getOwnPropertyNames(value).reduce((value, key) => {
249
+ return knownKeys.test(key)
250
+ ? { ...value, [key]: Visit(schema.patternProperties[pattern], references, value[key]) }
251
+ : value;
252
+ }, value);
253
+ if (!Types.TypeGuard.TSchema(schema.additionalProperties)) {
254
+ return Default(schema, knownProperties);
255
+ }
256
+ const unknownKeys = Object.getOwnPropertyNames(knownProperties);
268
257
  const additionalProperties = schema.additionalProperties;
269
- const properties2 = Object.entries(properties1).reduce((acc, [key, value]) => {
270
- return regex.test(key) ? { ...acc, [key]: value } : { ...acc, [key]: Visit(additionalProperties, references, value) };
271
- }, {});
272
- return Default(schema, properties2);
258
+ const unknownProperties = unknownKeys.reduce((value, key) => {
259
+ return !knownKeys.test(key)
260
+ ? { ...value, [key]: Default(additionalProperties, value[key]) }
261
+ : value;
262
+ }, knownProperties);
263
+ return Default(schema, unknownProperties);
273
264
  }
274
265
  function TRef(schema, references, value) {
275
266
  const target = (0, deref_1.Deref)(schema, references);
276
- const resolved = Visit(target, references, value);
277
- return Default(schema, resolved);
267
+ return Default(schema, Visit(target, references, value));
278
268
  }
279
269
  function TThis(schema, references, value) {
280
270
  const target = (0, deref_1.Deref)(schema, references);
281
- const resolved = Visit(target, references, value);
282
- return Default(schema, resolved);
271
+ return Default(schema, Visit(target, references, value));
283
272
  }
273
+ // prettier-ignore
284
274
  function TTuple(schema, references, value) {
285
- const value1 = (0, guard_1.IsArray)(schema.items) ? schema.items.map((schema, index) => Visit(schema, references, value[index])) : [];
286
- return Default(schema, value1);
275
+ return ((0, guard_1.IsArray)(value) && (0, guard_1.IsArray)(schema.items))
276
+ ? Default(schema, schema.items.map((schema, index) => Visit(schema, references, value[index])))
277
+ : Default(schema, value);
287
278
  }
288
279
  function TUnion(schema, references, value) {
289
- const value1 = Default(schema, value);
280
+ const defaulted = Default(schema, value);
290
281
  for (const subschema of schema.anyOf) {
291
- if (!(0, check_1.Check)(subschema, references, value1))
282
+ if (!(0, check_1.Check)(subschema, references, defaulted))
292
283
  continue;
293
- return Visit(subschema, references, value1);
284
+ return Visit(subschema, references, defaulted);
294
285
  }
295
- return value1;
286
+ return defaulted;
296
287
  }
297
288
  function Visit(schema, references, value) {
298
289
  const references_ = typeof schema.$id === 'string' ? [...references, schema] : references;
299
290
  const schema_ = schema;
300
291
  switch (schema[Types.Kind]) {
301
- // ------------------------------------------------------
302
- // Structural
303
- // ------------------------------------------------------
304
292
  case 'Array':
305
293
  return TArray(schema_, references_, value);
306
294
  case 'Intersect':
@@ -321,33 +309,7 @@ var DecodeTransform;
321
309
  return TTuple(schema_, references_, value);
322
310
  case 'Union':
323
311
  return TUnion(schema_, references_, value);
324
- // ------------------------------------------------------
325
- // Default
326
- // ------------------------------------------------------
327
- case 'Any':
328
- case 'AsyncIterator':
329
- case 'BigInt':
330
- case 'Boolean':
331
- case 'Constructor':
332
- case 'Date':
333
- case 'Function':
334
- case 'Integer':
335
- case 'Iterator':
336
- case 'Literal':
337
- case 'Never':
338
- case 'Null':
339
- case 'Number':
340
- case 'Promise':
341
- case 'String':
342
- case 'TemplateLiteral':
343
- case 'Undefined':
344
- case 'Uint8Array':
345
- case 'Unknown':
346
- case 'Void':
347
- return Default(schema_, value);
348
312
  default:
349
- if (!Types.TypeRegistry.Has(schema_[Types.Kind]))
350
- throw new TransformUnknownTypeError(schema_);
351
313
  return Default(schema_, value);
352
314
  }
353
315
  }
@@ -356,9 +318,9 @@ var DecodeTransform;
356
318
  }
357
319
  DecodeTransform.Decode = Decode;
358
320
  })(DecodeTransform || (exports.DecodeTransform = DecodeTransform = {}));
359
- // -------------------------------------------------------------------------
321
+ // ------------------------------------------------------------------
360
322
  // DecodeTransform
361
- // -------------------------------------------------------------------------
323
+ // ------------------------------------------------------------------
362
324
  /** Encodes a value using transform encoders if available. Does not ensure correct results. */
363
325
  var EncodeTransform;
364
326
  (function (EncodeTransform) {
@@ -370,58 +332,82 @@ var EncodeTransform;
370
332
  throw new TransformEncodeError(schema, value, error);
371
333
  }
372
334
  }
335
+ // prettier-ignore
373
336
  function TArray(schema, references, value) {
374
- const elements1 = Default(schema, value);
375
- return elements1.map((value) => Visit(schema.items, references, value));
337
+ const defaulted = Default(schema, value);
338
+ return (0, guard_1.IsArray)(defaulted)
339
+ ? defaulted.map((value) => Visit(schema.items, references, value))
340
+ : defaulted;
376
341
  }
342
+ // prettier-ignore
377
343
  function TIntersect(schema, references, value) {
378
- const properties1 = Default(schema, value);
344
+ const defaulted = Default(schema, value);
379
345
  if (!(0, guard_1.IsPlainObject)(value) || (0, guard_1.IsValueType)(value))
380
- return properties1;
381
- const keys = Types.KeyResolver.ResolveKeys(schema, { includePatterns: false });
382
- const properties2 = Object.entries(properties1).reduce((acc, [key, value]) => {
383
- return !keys.includes(key) ? { ...acc, [key]: value } : { ...acc, [key]: Default(Types.IndexedAccessor.Resolve(schema, [key]), value) };
384
- }, {});
385
- if (!Types.TypeGuard.TTransform(schema.unevaluatedProperties))
386
- return Default(schema, properties2);
387
- return Object.entries(properties2).reduce((acc, [key, value]) => {
388
- return keys.includes(key) ? { ...acc, [key]: value } : { ...acc, [key]: Default(schema.unevaluatedProperties, value) };
389
- }, {});
346
+ return defaulted;
347
+ const knownKeys = Types.KeyResolver.ResolveKeys(schema, { includePatterns: false });
348
+ const knownProperties = knownKeys.reduce((value, key) => {
349
+ return key in defaulted
350
+ ? { ...value, [key]: Visit(Types.IndexedAccessor.Resolve(schema, [key]), references, value[key]) }
351
+ : value;
352
+ }, defaulted);
353
+ if (!Types.TypeGuard.TTransform(schema.unevaluatedProperties)) {
354
+ return Default(schema, knownProperties);
355
+ }
356
+ const unknownKeys = Object.getOwnPropertyNames(knownProperties);
357
+ const unevaluatedProperties = schema.unevaluatedProperties;
358
+ return unknownKeys.reduce((value, key) => {
359
+ return !knownKeys.includes(key)
360
+ ? { ...value, [key]: Default(unevaluatedProperties, value[key]) }
361
+ : value;
362
+ }, knownProperties);
390
363
  }
391
364
  function TNot(schema, references, value) {
392
- const value1 = Default(schema, value);
393
- return Default(schema.not, value1);
365
+ return Default(schema.not, Default(schema, value));
394
366
  }
367
+ // prettier-ignore
395
368
  function TObject(schema, references, value) {
396
- const properties1 = Default(schema, value);
369
+ const defaulted = Default(schema, value);
397
370
  if (!(0, guard_1.IsPlainObject)(value))
398
- return properties1;
399
- const properties2 = Object.entries(properties1).reduce((acc, [key, value]) => {
400
- return !(key in schema.properties) ? { ...acc, [key]: value } : { ...acc, [key]: Visit(schema.properties[key], references, value) };
401
- }, {});
402
- if (!Types.TypeGuard.TSchema(schema.additionalProperties))
403
- return properties2;
371
+ return defaulted;
372
+ const knownKeys = Types.KeyResolver.ResolveKeys(schema, { includePatterns: false });
373
+ const knownProperties = knownKeys.reduce((value, key) => {
374
+ return key in value
375
+ ? { ...value, [key]: Visit(schema.properties[key], references, value[key]) }
376
+ : value;
377
+ }, defaulted);
378
+ if (!Types.TypeGuard.TSchema(schema.additionalProperties)) {
379
+ return knownProperties;
380
+ }
381
+ const unknownKeys = Object.getOwnPropertyNames(knownProperties);
404
382
  const additionalProperties = schema.additionalProperties;
405
- return Object.entries(properties2).reduce((acc, [key, value]) => {
406
- return key in schema.properties ? { ...acc, [key]: value } : { ...acc, [key]: Visit(additionalProperties, references, value) };
407
- }, {});
383
+ return unknownKeys.reduce((value, key) => {
384
+ return !knownKeys.includes(key)
385
+ ? { ...value, [key]: Default(additionalProperties, value[key]) }
386
+ : value;
387
+ }, knownProperties);
408
388
  }
389
+ // prettier-ignore
409
390
  function TRecord(schema, references, value) {
410
- const properties1 = Default(schema, value);
391
+ const defaulted = Default(schema, value);
411
392
  if (!(0, guard_1.IsPlainObject)(value))
412
- return properties1;
393
+ return defaulted;
413
394
  const pattern = Object.getOwnPropertyNames(schema.patternProperties)[0];
414
- const property = schema.patternProperties[pattern];
415
- const regex = new RegExp(pattern);
416
- const properties2 = Object.entries(properties1).reduce((acc, [key, value]) => {
417
- return !regex.test(key) ? { ...acc, [key]: value } : { ...acc, [key]: Visit(property, references, value) };
418
- }, {});
419
- if (!Types.TypeGuard.TSchema(schema.additionalProperties))
420
- return Default(schema, properties2);
395
+ const knownKeys = new RegExp(pattern);
396
+ const knownProperties = Object.getOwnPropertyNames(value).reduce((value, key) => {
397
+ return knownKeys.test(key)
398
+ ? { ...value, [key]: Visit(schema.patternProperties[pattern], references, value[key]) }
399
+ : value;
400
+ }, defaulted);
401
+ if (!Types.TypeGuard.TSchema(schema.additionalProperties)) {
402
+ return Default(schema, knownProperties);
403
+ }
404
+ const unknownKeys = Object.getOwnPropertyNames(knownProperties);
421
405
  const additionalProperties = schema.additionalProperties;
422
- return Object.entries(properties2).reduce((acc, [key, value]) => {
423
- return regex.test(key) ? { ...acc, [key]: value } : { ...acc, [key]: Visit(additionalProperties, references, value) };
424
- }, {});
406
+ return unknownKeys.reduce((value, key) => {
407
+ return !knownKeys.test(key)
408
+ ? { ...value, [key]: Default(additionalProperties, value[key]) }
409
+ : value;
410
+ }, knownProperties);
425
411
  }
426
412
  function TRef(schema, references, value) {
427
413
  const target = (0, deref_1.Deref)(schema, references);
@@ -458,9 +444,6 @@ var EncodeTransform;
458
444
  const references_ = typeof schema.$id === 'string' ? [...references, schema] : references;
459
445
  const schema_ = schema;
460
446
  switch (schema[Types.Kind]) {
461
- // ------------------------------------------------------
462
- // Structural
463
- // ------------------------------------------------------
464
447
  case 'Array':
465
448
  return TArray(schema_, references_, value);
466
449
  case 'Intersect':
@@ -479,34 +462,7 @@ var EncodeTransform;
479
462
  return TTuple(schema_, references_, value);
480
463
  case 'Union':
481
464
  return TUnion(schema_, references_, value);
482
- // ------------------------------------------------------
483
- // Apply
484
- // ------------------------------------------------------
485
- case 'Any':
486
- case 'AsyncIterator':
487
- case 'BigInt':
488
- case 'Boolean':
489
- case 'Constructor':
490
- case 'Date':
491
- case 'Function':
492
- case 'Integer':
493
- case 'Iterator':
494
- case 'Literal':
495
- case 'Never':
496
- case 'Null':
497
- case 'Number':
498
- case 'Promise':
499
- case 'String':
500
- case 'Symbol':
501
- case 'TemplateLiteral':
502
- case 'Undefined':
503
- case 'Uint8Array':
504
- case 'Unknown':
505
- case 'Void':
506
- return Default(schema_, value);
507
465
  default:
508
- if (!Types.TypeRegistry.Has(schema_[Types.Kind]))
509
- throw new TransformUnknownTypeError(schema_);
510
466
  return Default(schema_, value);
511
467
  }
512
468
  }