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