Skip to content

Commit 1856c93

Browse files
Updating snapshots
1 parent 08f563d commit 1856c93

File tree

1,185 files changed

+68695
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,185 files changed

+68695
-0
lines changed
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
▿ Config
2+
▿ analyticsProperties: 2 elements
3+
▿ Variable
4+
- name: "<analyticsProperties-name-1>"
5+
- type: "<analyticsProperties-type-1>"
6+
▿ Variable
7+
- name: "<analyticsProperties-name-2>"
8+
- type: "<analyticsProperties-type-2>"
9+
▿ baseImports: 2 members
10+
- "<baseImports-1>"
11+
- "<baseImports-2>"
12+
▿ baseTestImports: 2 members
13+
- "<baseTestImports-1>"
14+
- "<baseTestImports-2>"
15+
▿ builderImports: 2 members
16+
- "<builderImports-1>"
17+
- "<builderImports-2>"
18+
▿ contextGenericTypes: 2 elements
19+
- "<contextGenericTypes-1>"
20+
- "<contextGenericTypes-2>"
21+
▿ dependencies: 2 elements
22+
▿ Variable
23+
- name: "<dependencies-name-1>"
24+
- type: "<dependencies-type-1>"
25+
▿ Variable
26+
- name: "<dependencies-name-2>"
27+
- type: "<dependencies-type-2>"
28+
▿ dependencyInjectionImports: 2 members
29+
- "<dependencyInjectionImports-1>"
30+
- "<dependencyInjectionImports-2>"
31+
▿ flowImports: 2 members
32+
- "<flowImports-1>"
33+
- "<flowImports-2>"
34+
▿ flowProperties: 2 elements
35+
▿ Variable
36+
- name: "<flowProperties-name-1>"
37+
- type: "<flowProperties-type-1>"
38+
▿ Variable
39+
- name: "<flowProperties-name-2>"
40+
- type: "<flowProperties-type-2>"
41+
- isObservableStoreEnabled: false
42+
- isPeripheryCommentEnabled: true
43+
- isPreviewProviderEnabled: true
44+
- isTestTemplatesGenerationEnabled: true
45+
- isViewInjectedTemplateEnabled: true
46+
▿ pluginListImports: 2 members
47+
- "<pluginListImports-1>"
48+
- "<pluginListImports-2>"
49+
- publisherFailureType: "<publisherFailureType>"
50+
- publisherType: "<publisherType>"
51+
▿ reactiveImports: 2 members
52+
- "<reactiveImports-1>"
53+
- "<reactiveImports-2>"
54+
▿ uiFrameworks: 4 elements
55+
▿ UIFramework
56+
- framework: Framework.appKit
57+
▿ UIFramework
58+
- framework: Framework.uiKit
59+
▿ UIFramework
60+
- framework: Framework.uiKitSwiftUI
61+
▿ UIFramework
62+
▿ framework: Framework
63+
▿ custom: (5 elements)
64+
- name: "<uiFrameworkName>"
65+
- import: "<uiFrameworkImport>"
66+
- viewControllerType: "<viewControllerType>"
67+
- viewControllerSuperParameters: "<viewControllerSuperParameters>"
68+
- viewControllerMethods: "<viewControllerMethods>"
69+
- viewControllableFlowType: "<viewControllableFlowType>"
70+
- viewControllableMockContents: "<viewControllableMockContents>"
71+
- viewControllableType: "<viewControllableType>"
72+
▿ viewControllerImports: 2 members
73+
- "<viewControllerImports-1>"
74+
- "<viewControllerImports-2>"
75+
- viewControllerStaticContent: "<viewControllerStaticContent>"
76+
- viewControllerSubscriptionsProperty: "<viewControllerSubscriptionsProperty>"
77+
- viewControllerUpdateComment: "<viewControllerUpdateComment>"
78+
- viewStateEmptyFactory: "<viewStateEmptyFactory>"
79+
- viewStateOperators: "<viewStateOperators>"
80+
- viewStatePropertyComment: "<viewStatePropertyComment>"
81+
- viewStatePropertyName: "<viewStatePropertyName>"
82+
- viewStateTransform: "<viewStateTransform>"
83+
▿ workerGenericTypes: 2 elements
84+
- "<workerGenericTypes-1>"
85+
- "<workerGenericTypes-2>"
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
▿ Config
2+
- analyticsProperties: 0 elements
3+
- baseImports: 0 members
4+
▿ baseTestImports: 2 members
5+
- "Nimble"
6+
- "XCTest"
7+
- builderImports: 0 members
8+
▿ contextGenericTypes: 1 element
9+
- "AnyCancellable"
10+
- dependencies: 0 elements
11+
▿ dependencyInjectionImports: 1 member
12+
- "NeedleFoundation"
13+
- flowImports: 0 members
14+
- flowProperties: 0 elements
15+
- isObservableStoreEnabled: false
16+
- isPeripheryCommentEnabled: false
17+
- isPreviewProviderEnabled: false
18+
- isTestTemplatesGenerationEnabled: true
19+
- isViewInjectedTemplateEnabled: true
20+
- pluginListImports: 0 members
21+
- publisherFailureType: "Never"
22+
- publisherType: "AnyPublisher"
23+
▿ reactiveImports: 1 member
24+
- "Combine"
25+
▿ uiFrameworks: 2 elements
26+
▿ UIFramework
27+
- framework: Framework.uiKit
28+
▿ UIFramework
29+
- framework: Framework.uiKitSwiftUI
30+
- viewControllableFlowType: "ViewControllableFlow"
31+
- viewControllableMockContents: ""
32+
- viewControllableType: "ViewControllable"
33+
- viewControllerImports: 0 members
34+
- viewControllerStaticContent: ""
35+
- viewControllerSubscriptionsProperty: "/// The collection of cancellable instances.\nprivate var cancellables: Set<AnyCancellable> = .init()"
36+
- viewControllerUpdateComment: "// Add implementation to update the user interface when the view state changes."
37+
- viewStateEmptyFactory: "Empty().eraseToAnyPublisher()"
38+
- viewStateOperators: ".removeDuplicates()\n.receive(on: DispatchQueue.main)\n.eraseToAnyPublisher()"
39+
- viewStatePropertyComment: "The view state publisher."
40+
- viewStatePropertyName: "statePublisher"
41+
- viewStateTransform: "store.viewStatePublisher"
42+
▿ workerGenericTypes: 1 element
43+
- "AnyCancellable"
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
▿ Config
2+
- analyticsProperties: 0 elements
3+
- baseImports: 0 members
4+
▿ baseTestImports: 2 members
5+
- "Nimble"
6+
- "XCTest"
7+
- builderImports: 0 members
8+
▿ contextGenericTypes: 1 element
9+
- "AnyCancellable"
10+
- dependencies: 0 elements
11+
▿ dependencyInjectionImports: 1 member
12+
- "NeedleFoundation"
13+
- flowImports: 0 members
14+
- flowProperties: 0 elements
15+
- isObservableStoreEnabled: false
16+
- isPeripheryCommentEnabled: false
17+
- isPreviewProviderEnabled: false
18+
- isTestTemplatesGenerationEnabled: true
19+
- isViewInjectedTemplateEnabled: true
20+
- pluginListImports: 0 members
21+
- publisherFailureType: "Never"
22+
- publisherType: "AnyPublisher"
23+
▿ reactiveImports: 1 member
24+
- "Combine"
25+
▿ uiFrameworks: 2 elements
26+
▿ UIFramework
27+
- framework: Framework.uiKit
28+
▿ UIFramework
29+
- framework: Framework.uiKitSwiftUI
30+
- viewControllableFlowType: "ViewControllableFlow"
31+
- viewControllableMockContents: ""
32+
- viewControllableType: "ViewControllable"
33+
- viewControllerImports: 0 members
34+
- viewControllerStaticContent: ""
35+
- viewControllerSubscriptionsProperty: "/// The collection of cancellable instances.\nprivate var cancellables: Set<AnyCancellable> = .init()"
36+
- viewControllerUpdateComment: "// Add implementation to update the user interface when the view state changes."
37+
- viewStateEmptyFactory: "Empty().eraseToAnyPublisher()"
38+
- viewStateOperators: ".removeDuplicates()\n.receive(on: DispatchQueue.main)\n.eraseToAnyPublisher()"
39+
- viewStatePropertyComment: "The view state publisher."
40+
- viewStatePropertyName: "statePublisher"
41+
- viewStateTransform: "store.viewStatePublisher"
42+
▿ workerGenericTypes: 1 element
43+
- "AnyCancellable"
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
▿ Config
2+
- analyticsProperties: 0 elements
3+
- baseImports: 0 members
4+
▿ baseTestImports: 2 members
5+
- "Nimble"
6+
- "XCTest"
7+
- builderImports: 0 members
8+
▿ contextGenericTypes: 1 element
9+
- "AnyCancellable"
10+
- dependencies: 0 elements
11+
▿ dependencyInjectionImports: 1 member
12+
- "NeedleFoundation"
13+
- flowImports: 0 members
14+
- flowProperties: 0 elements
15+
- isObservableStoreEnabled: false
16+
- isPeripheryCommentEnabled: false
17+
- isPreviewProviderEnabled: false
18+
- isTestTemplatesGenerationEnabled: true
19+
- isViewInjectedTemplateEnabled: true
20+
- pluginListImports: 0 members
21+
- publisherFailureType: "Never"
22+
- publisherType: "AnyPublisher"
23+
▿ reactiveImports: 1 member
24+
- "Combine"
25+
▿ uiFrameworks: 2 elements
26+
▿ UIFramework
27+
- framework: Framework.uiKit
28+
▿ UIFramework
29+
- framework: Framework.uiKitSwiftUI
30+
- viewControllableFlowType: "ViewControllableFlow"
31+
- viewControllableMockContents: ""
32+
- viewControllableType: "ViewControllable"
33+
- viewControllerImports: 0 members
34+
- viewControllerStaticContent: ""
35+
- viewControllerSubscriptionsProperty: "/// The collection of cancellable instances.\nprivate var cancellables: Set<AnyCancellable> = .init()"
36+
- viewControllerUpdateComment: "// Add implementation to update the user interface when the view state changes."
37+
- viewStateEmptyFactory: "Empty().eraseToAnyPublisher()"
38+
- viewStateOperators: ".removeDuplicates()\n.receive(on: DispatchQueue.main)\n.eraseToAnyPublisher()"
39+
- viewStatePropertyComment: "The view state publisher."
40+
- viewStatePropertyName: "statePublisher"
41+
- viewStateTransform: "store.viewStatePublisher"
42+
▿ workerGenericTypes: 1 element
43+
- "AnyCancellable"
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
//
2+
// Created by <author> on <date>.
3+
//
4+
5+
/// INSTRUCTIONS:
6+
///
7+
/// Inject an existing analytics tracker (or client), that is defined outside of the Node, into the
8+
/// class defined in this file (below).
9+
///
10+
/// Inject the tracker (or client) via a protocol. The protocol for the injected tracker (or client)
11+
/// can either be an existing one defined outside of the Node or can be a new one added to this file.
12+
///
13+
14+
/// PURPOSE:
15+
/// The interface for analytics tracked by this Node.
16+
///
17+
/// Add requirements to this protocol to provide analytics tracking methods for this Node.
18+
/// @mockable
19+
internal protocol AppAnalytics: AnyObject {}
20+
21+
/// PURPOSE:
22+
/// Custom analytics implementation for this Node.
23+
internal final class AppAnalyticsImp {}
24+
25+
extension AppAnalyticsImp: AppAnalytics {}
Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
//
2+
// Created by <author> on <date>.
3+
//
4+
5+
import Combine
6+
import NeedleFoundation
7+
import Nodes
8+
9+
/// PURPOSE:
10+
/// The interface of the Flow.
11+
/// @mockable
12+
@MainActor
13+
internal protocol AppFlow: Flow {}
14+
15+
/// PURPOSE:
16+
/// A dependency needed by the Builder (such as a Listener), passed in from the caller (i.e. is not on the DI graph).
17+
/// Can be a tuple or struct containing multiple values when necessary.
18+
internal typealias AppDynamicBuildDependency = Void
19+
20+
/// PURPOSE:
21+
/// A dependency used by the Component itself, passed into the Component's initializer (in the Component factory).
22+
/// Can be a tuple or struct containing multiple values when necessary.
23+
internal typealias AppDynamicComponentDependency = Void
24+
25+
// MARK: - Component
26+
27+
/// PURPOSE:
28+
/// Declares dependencies that are owned by this Node.
29+
public final class AppComponent: BootstrapComponent {
30+
31+
/// Dependencies
32+
/// ============
33+
///
34+
/// Declare dependencies as 'fileprivate' properties (increasing access control only as necessary).
35+
///
36+
/// fileprivate let example: Example = .init()
37+
///
38+
/// Whenever possible, for example when the dependency does not provide shared state, define the property as a
39+
/// factory that always returns a new instance. Factory properties are preferred over factory methods to ensure
40+
/// Needle compatibility whenever the access control is increased.
41+
///
42+
/// fileprivate var exampleFactory: Example {
43+
/// Example()
44+
/// }
45+
///
46+
/// When shared state is desired but the dependency depends on another dependency, use the `shared` helper method
47+
/// that always returns the same instance from a computed property.
48+
///
49+
/// fileprivate var example: Example {
50+
/// shared { Example(otherDependency: dependency.otherDependency) }
51+
/// }
52+
53+
54+
fileprivate let appService: AppService = AppServiceImp()
55+
56+
private let dynamicDependency: AppDynamicComponentDependency
57+
58+
/// The initializer.
59+
///
60+
/// Remove `dynamicDependency` default parameter when its type is not `Void`.
61+
///
62+
/// - Parameter dynamicDependency: The dynamic component dependency
63+
internal init(
64+
dynamicDependency: AppDynamicComponentDependency = ()
65+
) {
66+
self.dynamicDependency = dynamicDependency
67+
super.init()
68+
}
69+
70+
/*
71+
Child Components
72+
================
73+
74+
Declare child component factories as 'fileprivate' methods.
75+
76+
fileprivate func <name>ComponentFactory() -> <Name>Component {
77+
<Name>Component(parent: self)
78+
}
79+
80+
*/
81+
82+
fileprivate func windowSceneComponentFactory() -> WindowSceneComponent {
83+
WindowSceneComponent(parent: self)
84+
}
85+
}
86+
87+
// MARK: - Builder
88+
89+
90+
/// PURPOSE:
91+
/// The Builder interface (available to mock for testability).
92+
/// @mockable
93+
@MainActor
94+
internal protocol AppBuilder: AnyObject {
95+
func build() -> AppFlow
96+
}
97+
98+
99+
/// PURPOSE:
100+
/// Concrete implementation of the Builder, where everything is created and associated.
101+
internal final class AppBuilderImp: AbstractBuilder
102+
<
103+
AppComponent,
104+
AppFlow,
105+
AppDynamicBuildDependency,
106+
AppDynamicComponentDependency
107+
> {
108+
109+
/// The purpose of this method is to route input parameters to either the dynamic build dependency and/or
110+
/// the dynamic component dependency.
111+
///
112+
/// The dynamic dependencies can be tuples or structs containing multiple values when necessary.
113+
/// - Returns: The Flow instance
114+
internal func build() -> AppFlow {
115+
let dynamicBuildDependency: AppDynamicBuildDependency = ()
116+
let dynamicComponentDependency: AppDynamicComponentDependency = ()
117+
return build(dynamicBuildDependency, dynamicComponentDependency)
118+
}
119+
120+
/// The factory method in which the Context and Flow are initialized.
121+
/// - Parameters:
122+
/// - component: The component instance
123+
/// - dynamicBuildDependency: The dynamic build dependency
124+
/// - Returns: The Flow instance
125+
override internal func build(
126+
component: AppComponent,
127+
dynamicBuildDependency: AppDynamicBuildDependency
128+
) -> AppFlow {
129+
let analytics: AppAnalyticsImp = .init()
130+
let context: AppContextImp = .init(
131+
workers: [],
132+
analytics: analytics,
133+
windowScenePublisher: component.appService.windowScenePublisher
134+
)
135+
let flow: AppFlowImp = .init(
136+
context: context,
137+
windowSceneBuilder: WindowSceneBuilderImp(componentFactory: component.windowSceneComponentFactory)
138+
)
139+
context.flow = flow
140+
return flow
141+
}
142+
}
143+
144+
extension AppBuilderImp: AppBuilder {}

0 commit comments

Comments
 (0)