@@ -34,13 +34,20 @@ import { Metrics } from './metrics.ts'
3434// deno-lint-ignore no-explicit-any
3535type ObjectLike = Record < PropertyKey , any >
3636
37- function Merge ( left : ObjectLike , right : ObjectLike , configuration : PropertyDescriptor = { } ) : ObjectLike {
38- const descriptor : PropertyDescriptor = { configurable : true , writable : true , enumerable : true , ...configuration }
37+ function MergeHidden ( left : ObjectLike , right : ObjectLike , configuration : PropertyDescriptor = { } ) : ObjectLike {
3938 for ( const key of Object . keys ( right ) ) {
40- Object . defineProperty ( left , key , { ...descriptor , value : right [ key ] } )
39+ Object . defineProperty ( left , key , {
40+ configurable : true ,
41+ writable : true ,
42+ enumerable : false ,
43+ value : right [ key ]
44+ } )
4145 }
4246 return left
4347}
48+ function Merge ( left : ObjectLike , right : ObjectLike ) : ObjectLike {
49+ return { ...left , ...right }
50+ }
4451/**
4552 * Creates an object with hidden, enumerable, and optional property sets. This function
4653 * ensures types are instantiated according to configuration rules for enumerable and
@@ -49,8 +56,7 @@ function Merge(left: ObjectLike, right: ObjectLike, configuration: PropertyDescr
4956export function Create ( hidden : ObjectLike , enumerable : ObjectLike , options : ObjectLike = { } ) : ObjectLike {
5057 Metrics . create += 1
5158 const settings = Settings . Get ( )
52- const withHidden = Merge ( { } , hidden , { enumerable : settings . enumerableKind } )
53- const withEnumerable = Merge ( withHidden , enumerable )
54- const withOptions = Merge ( withEnumerable , options )
55- return settings . immutableTypes ? Object . freeze ( withOptions ) : withOptions
59+ const withOptions = Merge ( enumerable , options )
60+ const withHidden = settings . enumerableKind ? Merge ( withOptions , hidden ) : MergeHidden ( withOptions , hidden )
61+ return settings . immutableTypes ? Object . freeze ( withHidden ) : withHidden
5662}
0 commit comments