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 */ 10 func decorate(object: JavaScriptObject, appContext: AppContext) throws 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 app context. 19 */ 20 func build(appContext: AppContext) throws -> JavaScriptObject 21 } 22 23 /** 24 Provides the default behavior of `JavaScriptObjectBuilder`. 25 The `build(appContext:)` creates a plain object and uses `decorate(object:appContext:)` for decoration. 26 */ 27 extension JavaScriptObjectBuilder { 28 func build(appContext: AppContext) throws -> JavaScriptObject { 29 let object = try appContext.runtime.createObject() 30 try decorate(object: object, appContext: appContext) 31 return object 32 } 33 34 func decorate(object: JavaScriptObject, appContext: AppContext) throws { 35 // no-op by default 36 } 37 } 38