1 // Copyright 2022-present 650 Industries. All rights reserved. 2 3 /** 4 A type that can decorate a `JavaScriptObject` with some properties. 5 */ 6 internal protocol JavaScriptObjectDecorator { 7 /** 8 Decorates an existing `JavaScriptObject`. 9 */ decoratenull10 func decorate(object: JavaScriptObject, inRuntime runtime: JavaScriptRuntime) 11 } 12 13 /** 14 A type that can build and decorate a `JavaScriptObject` based on its attributes. 15 */ 16 internal protocol JavaScriptObjectBuilder: JavaScriptObjectDecorator { 17 /** 18 Creates a decorated `JavaScriptObject` in the given runtime. 19 */ 20 func build(inRuntime runtime: JavaScriptRuntime) -> JavaScriptObject 21 } 22 23 /** 24 Provides the default behavior of `JavaScriptObjectBuilder`. 25 The `build(inRuntime:)` creates a plain object and uses `decorate(object:)` for decoration. 26 */ 27 extension JavaScriptObjectBuilder { buildnull28 func build(inRuntime runtime: JavaScriptRuntime) -> JavaScriptObject { 29 let object = runtime.createObject() 30 decorate(object: object, inRuntime: runtime) 31 return object 32 } 33 decoratenull34 func decorate(object: JavaScriptObject, inRuntime runtime: JavaScriptRuntime) { 35 // no-op by default 36 } 37 } 38