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, 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 {
buildnull28   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 
decoratenull34   func decorate(object: JavaScriptObject, appContext: AppContext) throws {
35     // no-op by default
36   }
37 }
38