@ohos-ports/react-native-navigation 8.9.0-beta.11 → 8.9.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (271) hide show
  1. package/README.md +13 -11
  2. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/statusbar/StatusBarPresenter.kt +212 -0
  3. package/lib/module/ARCHITECTURE.md +331 -0
  4. package/lib/module/Mock/Application.js +33 -0
  5. package/lib/module/Mock/Application.js.map +1 -0
  6. package/lib/module/Mock/ComponentProps.js +4 -0
  7. package/lib/module/Mock/ComponentProps.js.map +1 -0
  8. package/lib/module/Mock/Components/BottomTabs.js +16 -0
  9. package/lib/module/Mock/Components/BottomTabs.js.map +1 -0
  10. package/lib/module/Mock/Components/ComponentScreen.js +101 -0
  11. package/lib/module/Mock/Components/ComponentScreen.js.map +1 -0
  12. package/lib/module/Mock/Components/LayoutComponent.js +50 -0
  13. package/lib/module/Mock/Components/LayoutComponent.js.map +1 -0
  14. package/lib/module/Mock/Components/Modals.js +22 -0
  15. package/lib/module/Mock/Components/Modals.js.map +1 -0
  16. package/lib/module/Mock/Components/NavigationButton.js +72 -0
  17. package/lib/module/Mock/Components/NavigationButton.js.map +1 -0
  18. package/lib/module/Mock/Components/Overlays.js +23 -0
  19. package/lib/module/Mock/Components/Overlays.js.map +1 -0
  20. package/lib/module/Mock/Components/SideMenu.js +29 -0
  21. package/lib/module/Mock/Components/SideMenu.js.map +1 -0
  22. package/lib/module/Mock/Components/Stack.js +18 -0
  23. package/lib/module/Mock/Components/Stack.js.map +1 -0
  24. package/lib/module/Mock/Components/TopBar.js +81 -0
  25. package/lib/module/Mock/Components/TopBar.js.map +1 -0
  26. package/lib/module/Mock/Layouts/BottomTabsNode.js +30 -0
  27. package/lib/module/Mock/Layouts/BottomTabsNode.js.map +1 -0
  28. package/lib/module/Mock/Layouts/ComponentNode.js +102 -0
  29. package/lib/module/Mock/Layouts/ComponentNode.js.map +1 -0
  30. package/lib/module/Mock/Layouts/LayoutNodeFactory.js +28 -0
  31. package/lib/module/Mock/Layouts/LayoutNodeFactory.js.map +1 -0
  32. package/lib/module/Mock/Layouts/Node.js +14 -0
  33. package/lib/module/Mock/Layouts/Node.js.map +1 -0
  34. package/lib/module/Mock/Layouts/ParentNode.js +66 -0
  35. package/lib/module/Mock/Layouts/ParentNode.js.map +1 -0
  36. package/lib/module/Mock/Layouts/SideMenu.js +72 -0
  37. package/lib/module/Mock/Layouts/SideMenu.js.map +1 -0
  38. package/lib/module/Mock/Layouts/StackNode.js +12 -0
  39. package/lib/module/Mock/Layouts/StackNode.js.map +1 -0
  40. package/lib/module/Mock/Stores/EventsStore.js +53 -0
  41. package/lib/module/Mock/Stores/EventsStore.js.map +1 -0
  42. package/lib/{cjs → module}/Mock/Stores/LayoutStore.js +24 -56
  43. package/lib/module/Mock/Stores/LayoutStore.js.map +1 -0
  44. package/lib/module/Mock/actions/layoutActions.js +19 -0
  45. package/lib/module/Mock/actions/layoutActions.js.map +1 -0
  46. package/lib/module/Mock/connect.js +8 -0
  47. package/lib/module/Mock/connect.js.map +1 -0
  48. package/lib/module/Mock/constants.js +5 -0
  49. package/lib/module/Mock/constants.js.map +1 -0
  50. package/lib/module/Mock/index.js +20 -0
  51. package/lib/module/Mock/index.js.map +1 -0
  52. package/lib/module/Mock/mocks/AppRegistryService.js +6 -0
  53. package/lib/module/Mock/mocks/AppRegistryService.js.map +1 -0
  54. package/lib/module/Mock/mocks/NativeCommandsSender.js +146 -0
  55. package/lib/module/Mock/mocks/NativeCommandsSender.js.map +1 -0
  56. package/lib/module/Mock/mocks/NativeEventsReceiver.js +103 -0
  57. package/lib/module/Mock/mocks/NativeEventsReceiver.js.map +1 -0
  58. package/lib/module/Navigation.js +250 -0
  59. package/lib/module/Navigation.js.map +1 -0
  60. package/lib/{cjs → module}/NavigationDelegate.js +34 -33
  61. package/lib/module/NavigationDelegate.js.map +1 -0
  62. package/lib/module/adapters/AndroidCustomRowForwarder.js +75 -0
  63. package/lib/module/adapters/AndroidCustomRowForwarder.js.map +1 -0
  64. package/lib/module/adapters/AppRegistryService.js +9 -0
  65. package/lib/module/adapters/AppRegistryService.js.map +1 -0
  66. package/lib/module/adapters/AssetResolver.js +9 -0
  67. package/lib/module/adapters/AssetResolver.js.map +1 -0
  68. package/lib/module/adapters/ColorService.js +9 -0
  69. package/lib/module/adapters/ColorService.js.map +1 -0
  70. package/lib/module/adapters/Constants.js +19 -0
  71. package/lib/module/adapters/Constants.js.map +1 -0
  72. package/lib/{cjs → module}/adapters/NativeCommandsSender.js +5 -39
  73. package/lib/module/adapters/NativeCommandsSender.js.map +1 -0
  74. package/lib/module/adapters/NativeEventsReceiver.js +65 -0
  75. package/lib/module/adapters/NativeEventsReceiver.js.map +1 -0
  76. package/lib/module/adapters/NativeEventsReceiver.mock.js +6 -0
  77. package/lib/module/adapters/NativeEventsReceiver.mock.js.map +1 -0
  78. package/lib/module/adapters/NativeRNNTurboEventEmitter.js +7 -0
  79. package/lib/module/adapters/NativeRNNTurboEventEmitter.js.map +1 -0
  80. package/lib/module/adapters/NativeRNNTurboModule.js +6 -0
  81. package/lib/module/adapters/NativeRNNTurboModule.js.map +1 -0
  82. package/lib/module/adapters/TouchablePreview.js +115 -0
  83. package/lib/module/adapters/TouchablePreview.js.map +1 -0
  84. package/lib/module/adapters/UniqueIdProvider.js +9 -0
  85. package/lib/module/adapters/UniqueIdProvider.js.map +1 -0
  86. package/lib/module/commands/Commands.js +241 -0
  87. package/lib/module/commands/Commands.js.map +1 -0
  88. package/lib/module/commands/Commands.test.js +759 -0
  89. package/lib/module/commands/Commands.test.js.map +1 -0
  90. package/lib/module/commands/Deprecations.js +66 -0
  91. package/lib/module/commands/Deprecations.js.map +1 -0
  92. package/lib/module/commands/LayoutTreeCrawler.js +32 -0
  93. package/lib/module/commands/LayoutTreeCrawler.js.map +1 -0
  94. package/lib/module/commands/LayoutTreeCrawler.test.js +82 -0
  95. package/lib/module/commands/LayoutTreeCrawler.test.js.map +1 -0
  96. package/lib/module/commands/LayoutTreeParser.js +130 -0
  97. package/lib/module/commands/LayoutTreeParser.js.map +1 -0
  98. package/lib/module/commands/LayoutTreeParser.test.js +359 -0
  99. package/lib/module/commands/LayoutTreeParser.test.js.map +1 -0
  100. package/lib/module/commands/LayoutType.js +16 -0
  101. package/lib/module/commands/LayoutType.js.map +1 -0
  102. package/lib/module/commands/LayoutType.test.js +12 -0
  103. package/lib/module/commands/LayoutType.test.js.map +1 -0
  104. package/lib/module/commands/OptionsCrawler.js +72 -0
  105. package/lib/module/commands/OptionsCrawler.js.map +1 -0
  106. package/lib/module/commands/OptionsCrawler.test.js +351 -0
  107. package/lib/module/commands/OptionsCrawler.test.js.map +1 -0
  108. package/lib/{cjs → module}/commands/OptionsProcessor.js +67 -102
  109. package/lib/module/commands/OptionsProcessor.js.map +1 -0
  110. package/lib/module/commands/OptionsProcessor.test.js +1234 -0
  111. package/lib/module/commands/OptionsProcessor.test.js.map +1 -0
  112. package/lib/{cjs → module}/components/ComponentRegistry.js +3 -27
  113. package/lib/module/components/ComponentRegistry.js.map +1 -0
  114. package/lib/module/components/ComponentRegistry.test.js +57 -0
  115. package/lib/module/components/ComponentRegistry.test.js.map +1 -0
  116. package/lib/module/components/ComponentWrapper.js +80 -0
  117. package/lib/module/components/ComponentWrapper.js.map +1 -0
  118. package/lib/module/components/ComponentWrapper.test.js +333 -0
  119. package/lib/module/components/ComponentWrapper.test.js.map +1 -0
  120. package/lib/module/components/Modal.js +125 -0
  121. package/lib/module/components/Modal.js.map +1 -0
  122. package/lib/{cjs → module}/components/Store.js +3 -27
  123. package/lib/module/components/Store.js.map +1 -0
  124. package/lib/module/components/Store.test.js +148 -0
  125. package/lib/module/components/Store.test.js.map +1 -0
  126. package/lib/module/events/CommandsObserver.js +19 -0
  127. package/lib/module/events/CommandsObserver.js.map +1 -0
  128. package/lib/module/events/CommandsObserver.test.js +43 -0
  129. package/lib/module/events/CommandsObserver.test.js.map +1 -0
  130. package/lib/module/events/ComponentEventsObserver.js +94 -0
  131. package/lib/module/events/ComponentEventsObserver.js.map +1 -0
  132. package/lib/module/events/ComponentEventsObserver.test.js +391 -0
  133. package/lib/module/events/ComponentEventsObserver.test.js.map +1 -0
  134. package/lib/{cjs → module}/events/EventsRegistry.js +3 -27
  135. package/lib/module/events/EventsRegistry.js.map +1 -0
  136. package/lib/module/events/EventsRegistry.test.js +131 -0
  137. package/lib/module/events/EventsRegistry.test.js.map +1 -0
  138. package/lib/module/index.js +22 -0
  139. package/lib/module/index.js.map +1 -0
  140. package/lib/module/interfaces/CommandName.js +22 -0
  141. package/lib/module/interfaces/CommandName.js.map +1 -0
  142. package/lib/module/interfaces/ComponentEvents.js +2 -0
  143. package/lib/module/interfaces/ComponentEvents.js.map +1 -0
  144. package/lib/module/interfaces/EventSubscription.js +2 -0
  145. package/lib/module/interfaces/EventSubscription.js.map +1 -0
  146. package/lib/module/interfaces/Events.js +2 -0
  147. package/lib/module/interfaces/Events.js.map +1 -0
  148. package/lib/module/interfaces/Layout.js +4 -0
  149. package/lib/module/interfaces/Layout.js.map +1 -0
  150. package/lib/module/interfaces/NavigationComponent.js +21 -0
  151. package/lib/module/interfaces/NavigationComponent.js.map +1 -0
  152. package/lib/module/interfaces/NavigationComponentListener.js +4 -0
  153. package/lib/module/interfaces/NavigationComponentListener.js.map +1 -0
  154. package/lib/module/interfaces/NavigationComponentProps.js +2 -0
  155. package/lib/module/interfaces/NavigationComponentProps.js.map +1 -0
  156. package/lib/module/interfaces/NavigationFunctionComponent.js +4 -0
  157. package/lib/module/interfaces/NavigationFunctionComponent.js.map +1 -0
  158. package/lib/module/interfaces/Options.js +47 -0
  159. package/lib/module/interfaces/Options.js.map +1 -0
  160. package/lib/module/interfaces/ProcessorSubscription.js +2 -0
  161. package/lib/module/interfaces/ProcessorSubscription.js.map +1 -0
  162. package/lib/module/interfaces/Processors.js +4 -0
  163. package/lib/module/interfaces/Processors.js.map +1 -0
  164. package/lib/module/linking/DeferredLinkQueue.js +52 -0
  165. package/lib/module/linking/DeferredLinkQueue.js.map +1 -0
  166. package/lib/module/linking/DeferredLinkQueue.test.js +54 -0
  167. package/lib/module/linking/DeferredLinkQueue.test.js.map +1 -0
  168. package/lib/{cjs → module}/linking/LinkingHandler.js +43 -40
  169. package/lib/module/linking/LinkingHandler.js.map +1 -0
  170. package/lib/module/linking/LinkingHandler.test.js +384 -0
  171. package/lib/module/linking/LinkingHandler.test.js.map +1 -0
  172. package/lib/module/linking/ModalLayoutBuilder.js +56 -0
  173. package/lib/module/linking/ModalLayoutBuilder.js.map +1 -0
  174. package/lib/module/linking/ModalLayoutBuilder.test.js +154 -0
  175. package/lib/module/linking/ModalLayoutBuilder.test.js.map +1 -0
  176. package/lib/{cjs → module}/linking/RouteMatcher.js +15 -31
  177. package/lib/module/linking/RouteMatcher.js.map +1 -0
  178. package/lib/module/linking/RouteMatcher.test.js +164 -0
  179. package/lib/module/linking/RouteMatcher.test.js.map +1 -0
  180. package/lib/module/linking/URLParser.js +56 -0
  181. package/lib/module/linking/URLParser.js.map +1 -0
  182. package/lib/module/linking/URLParser.test.js +100 -0
  183. package/lib/module/linking/URLParser.test.js.map +1 -0
  184. package/lib/module/linking/types.js +4 -0
  185. package/lib/module/linking/types.js.map +1 -0
  186. package/lib/module/package.json +1 -0
  187. package/lib/module/processors/LayoutProcessor.js +15 -0
  188. package/lib/module/processors/LayoutProcessor.js.map +1 -0
  189. package/lib/module/processors/LayoutProcessor.test.js +53 -0
  190. package/lib/module/processors/LayoutProcessor.test.js.map +1 -0
  191. package/lib/module/processors/LayoutProcessorsStore.js +18 -0
  192. package/lib/module/processors/LayoutProcessorsStore.js.map +1 -0
  193. package/lib/module/processors/LayoutProcessorsStore.test.js +31 -0
  194. package/lib/module/processors/LayoutProcessorsStore.test.js.map +1 -0
  195. package/lib/module/processors/OptionProcessorsStore.js +19 -0
  196. package/lib/module/processors/OptionProcessorsStore.js.map +1 -0
  197. package/lib/module/processors/OptionProcessorsStore.test.js +31 -0
  198. package/lib/module/processors/OptionProcessorsStore.test.js.map +1 -0
  199. package/lib/module/types.js +2 -0
  200. package/lib/module/types.js.map +1 -0
  201. package/package.json +7 -12
  202. package/lib/cjs/Mock/Application.js +0 -67
  203. package/lib/cjs/Mock/ComponentProps.js +0 -16
  204. package/lib/cjs/Mock/Components/BottomTabs.js +0 -50
  205. package/lib/cjs/Mock/Components/ComponentScreen.js +0 -135
  206. package/lib/cjs/Mock/Components/LayoutComponent.js +0 -85
  207. package/lib/cjs/Mock/Components/Modals.js +0 -56
  208. package/lib/cjs/Mock/Components/NavigationButton.js +0 -104
  209. package/lib/cjs/Mock/Components/Overlays.js +0 -57
  210. package/lib/cjs/Mock/Components/SideMenu.js +0 -69
  211. package/lib/cjs/Mock/Components/Stack.js +0 -52
  212. package/lib/cjs/Mock/Components/TopBar.js +0 -115
  213. package/lib/cjs/Mock/Layouts/BottomTabsNode.js +0 -60
  214. package/lib/cjs/Mock/Layouts/ComponentNode.js +0 -132
  215. package/lib/cjs/Mock/Layouts/LayoutNodeFactory.js +0 -59
  216. package/lib/cjs/Mock/Layouts/Node.js +0 -32
  217. package/lib/cjs/Mock/Layouts/ParentNode.js +0 -99
  218. package/lib/cjs/Mock/Layouts/SideMenu.js +0 -112
  219. package/lib/cjs/Mock/Layouts/StackNode.js +0 -42
  220. package/lib/cjs/Mock/Stores/EventsStore.js +0 -85
  221. package/lib/cjs/Mock/actions/layoutActions.js +0 -47
  222. package/lib/cjs/Mock/connect.js +0 -31
  223. package/lib/cjs/Mock/constants.js +0 -31
  224. package/lib/cjs/Mock/index.js +0 -48
  225. package/lib/cjs/Mock/mocks/AppRegistryService.js +0 -31
  226. package/lib/cjs/Mock/mocks/NativeCommandsSender.js +0 -181
  227. package/lib/cjs/Mock/mocks/NativeEventsReceiver.js +0 -146
  228. package/lib/cjs/Navigation.js +0 -259
  229. package/lib/cjs/adapters/AndroidCustomRowForwarder.js +0 -84
  230. package/lib/cjs/adapters/AppRegistryService.js +0 -33
  231. package/lib/cjs/adapters/AssetResolver.js +0 -33
  232. package/lib/cjs/adapters/ColorService.js +0 -33
  233. package/lib/cjs/adapters/Constants.js +0 -43
  234. package/lib/cjs/adapters/NativeEventsReceiver.js +0 -99
  235. package/lib/cjs/adapters/NativeEventsReceiver.mock.js +0 -30
  236. package/lib/cjs/adapters/NativeRNNTurboEventEmitter.js +0 -27
  237. package/lib/cjs/adapters/NativeRNNTurboModule.js +0 -26
  238. package/lib/cjs/adapters/TouchablePreview.js +0 -137
  239. package/lib/cjs/adapters/UniqueIdProvider.js +0 -43
  240. package/lib/cjs/commands/Commands.js +0 -276
  241. package/lib/cjs/commands/Deprecations.js +0 -101
  242. package/lib/cjs/commands/LayoutTreeCrawler.js +0 -56
  243. package/lib/cjs/commands/LayoutTreeParser.js +0 -154
  244. package/lib/cjs/commands/LayoutType.js +0 -40
  245. package/lib/cjs/commands/OptionsCrawler.js +0 -106
  246. package/lib/cjs/components/ComponentWrapper.js +0 -114
  247. package/lib/cjs/components/Modal.js +0 -159
  248. package/lib/cjs/events/CommandsObserver.js +0 -43
  249. package/lib/cjs/events/ComponentEventsObserver.js +0 -128
  250. package/lib/cjs/index.js +0 -63
  251. package/lib/cjs/interfaces/CommandName.js +0 -46
  252. package/lib/cjs/interfaces/ComponentEvents.js +0 -1
  253. package/lib/cjs/interfaces/EventSubscription.js +0 -1
  254. package/lib/cjs/interfaces/Events.js +0 -1
  255. package/lib/cjs/interfaces/Layout.js +0 -16
  256. package/lib/cjs/interfaces/NavigationComponent.js +0 -62
  257. package/lib/cjs/interfaces/NavigationComponentListener.js +0 -16
  258. package/lib/cjs/interfaces/NavigationComponentProps.js +0 -1
  259. package/lib/cjs/interfaces/NavigationFunctionComponent.js +0 -16
  260. package/lib/cjs/interfaces/Options.js +0 -47
  261. package/lib/cjs/interfaces/ProcessorSubscription.js +0 -1
  262. package/lib/cjs/interfaces/Processors.js +0 -16
  263. package/lib/cjs/linking/DeferredLinkQueue.js +0 -66
  264. package/lib/cjs/linking/ModalLayoutBuilder.js +0 -59
  265. package/lib/cjs/linking/URLParser.js +0 -70
  266. package/lib/cjs/linking/types.js +0 -16
  267. package/lib/cjs/processors/LayoutProcessor.js +0 -39
  268. package/lib/cjs/processors/LayoutProcessorsStore.js +0 -42
  269. package/lib/cjs/processors/OptionProcessorsStore.js +0 -43
  270. package/lib/cjs/types.js +0 -1
  271. package/postinstall.js +0 -53
@@ -0,0 +1,759 @@
1
+ "use strict";
2
+
3
+ import forEach from 'lodash/forEach';
4
+ import filter from 'lodash/filter';
5
+ import invoke from 'lodash/invoke';
6
+ import { mock, verify, instance, deepEqual, when, anything, anyString, capture } from 'ts-mockito';
7
+ import { LayoutTreeParser } from "./LayoutTreeParser.js";
8
+ import { LayoutTreeCrawler } from "./LayoutTreeCrawler.js";
9
+ import { Store } from "../components/Store.js";
10
+ import { Commands } from "./Commands.js";
11
+ import { CommandsObserver } from "../events/CommandsObserver.js";
12
+ import { NativeCommandsSender } from "../adapters/NativeCommandsSender.js";
13
+ import { OptionsProcessor } from "./OptionsProcessor.js";
14
+ import { UniqueIdProvider } from "../adapters/UniqueIdProvider.js";
15
+ import { LayoutProcessor } from "../processors/LayoutProcessor.js";
16
+ import { LayoutProcessorsStore } from "../processors/LayoutProcessorsStore.js";
17
+ import { CommandName } from "../interfaces/CommandName.js";
18
+ import { OptionsCrawler } from "./OptionsCrawler.js";
19
+ import React from 'react';
20
+ describe('Commands', () => {
21
+ let uut;
22
+ let mockedNativeCommandsSender;
23
+ let mockedOptionsProcessor;
24
+ let mockedStore;
25
+ let commandsObserver;
26
+ let mockedUniqueIdProvider;
27
+ let layoutProcessor;
28
+ beforeEach(() => {
29
+ mockedNativeCommandsSender = mock(NativeCommandsSender);
30
+ mockedUniqueIdProvider = mock(UniqueIdProvider);
31
+ when(mockedUniqueIdProvider.generate(anything())).thenCall(prefix => `${prefix}+UNIQUE_ID`);
32
+ const uniqueIdProvider = instance(mockedUniqueIdProvider);
33
+ mockedStore = mock(Store);
34
+ commandsObserver = new CommandsObserver(uniqueIdProvider);
35
+ const layoutProcessorsStore = new LayoutProcessorsStore();
36
+ mockedOptionsProcessor = mock(OptionsProcessor);
37
+ const optionsProcessor = instance(mockedOptionsProcessor);
38
+ layoutProcessor = new LayoutProcessor(layoutProcessorsStore);
39
+ jest.spyOn(layoutProcessor, 'process');
40
+ uut = new Commands(instance(mockedStore), instance(mockedNativeCommandsSender), new LayoutTreeParser(uniqueIdProvider), new LayoutTreeCrawler(instance(mockedStore), optionsProcessor), commandsObserver, uniqueIdProvider, optionsProcessor, layoutProcessor, new OptionsCrawler(instance(mockedStore), uniqueIdProvider));
41
+ });
42
+ describe('setRoot', () => {
43
+ it('sends setRoot to native after parsing into a correct layout tree', () => {
44
+ uut.setRoot({
45
+ root: {
46
+ component: {
47
+ name: 'com.example.MyScreen'
48
+ }
49
+ }
50
+ });
51
+ verify(mockedNativeCommandsSender.setRoot('setRoot+UNIQUE_ID', deepEqual({
52
+ root: {
53
+ type: 'Component',
54
+ id: 'Component+UNIQUE_ID',
55
+ children: [],
56
+ data: {
57
+ name: 'com.example.MyScreen',
58
+ options: {},
59
+ passProps: undefined
60
+ }
61
+ },
62
+ modals: [],
63
+ overlays: []
64
+ }))).called();
65
+ });
66
+ it('returns a promise with the resolved layout', async () => {
67
+ when(mockedNativeCommandsSender.setRoot(anything(), anything())).thenResolve('the resolved layout');
68
+ const result = await uut.setRoot({
69
+ root: {
70
+ component: {
71
+ name: 'com.example.MyScreen'
72
+ }
73
+ }
74
+ });
75
+ expect(result).toEqual('the resolved layout');
76
+ });
77
+ it('inputs modals and overlays', () => {
78
+ uut.setRoot({
79
+ root: {
80
+ component: {
81
+ name: 'com.example.MyScreen'
82
+ }
83
+ },
84
+ modals: [{
85
+ component: {
86
+ name: 'com.example.MyModal'
87
+ }
88
+ }],
89
+ overlays: [{
90
+ component: {
91
+ name: 'com.example.MyOverlay'
92
+ }
93
+ }]
94
+ });
95
+ verify(mockedNativeCommandsSender.setRoot('setRoot+UNIQUE_ID', deepEqual({
96
+ root: {
97
+ type: 'Component',
98
+ id: 'Component+UNIQUE_ID',
99
+ children: [],
100
+ data: {
101
+ name: 'com.example.MyScreen',
102
+ options: {},
103
+ passProps: undefined
104
+ }
105
+ },
106
+ modals: [{
107
+ type: 'Component',
108
+ id: 'Component+UNIQUE_ID',
109
+ children: [],
110
+ data: {
111
+ name: 'com.example.MyModal',
112
+ options: {},
113
+ passProps: undefined
114
+ }
115
+ }],
116
+ overlays: [{
117
+ type: 'Component',
118
+ id: 'Component+UNIQUE_ID',
119
+ children: [],
120
+ data: {
121
+ name: 'com.example.MyOverlay',
122
+ options: {},
123
+ passProps: undefined
124
+ }
125
+ }]
126
+ }))).called();
127
+ });
128
+ it('process layout with layoutProcessor', () => {
129
+ uut.setRoot({
130
+ root: {
131
+ component: {
132
+ name: 'com.example.MyScreen'
133
+ }
134
+ }
135
+ });
136
+ expect(layoutProcessor.process).toBeCalledWith({
137
+ component: {
138
+ name: 'com.example.MyScreen',
139
+ options: {},
140
+ id: 'Component+UNIQUE_ID'
141
+ }
142
+ }, CommandName.SetRoot);
143
+ });
144
+ it('pass component static options to layoutProcessor', () => {
145
+ when(mockedStore.getComponentClassForName('com.example.MyScreen')).thenReturn(() => class extends React.Component {
146
+ static options() {
147
+ return {
148
+ topBar: {
149
+ visible: false
150
+ }
151
+ };
152
+ }
153
+ });
154
+ uut.setRoot({
155
+ root: {
156
+ component: {
157
+ name: 'com.example.MyScreen'
158
+ }
159
+ }
160
+ });
161
+ expect(layoutProcessor.process).toBeCalledWith({
162
+ component: {
163
+ id: 'Component+UNIQUE_ID',
164
+ name: 'com.example.MyScreen',
165
+ options: {
166
+ topBar: {
167
+ visible: false
168
+ }
169
+ }
170
+ }
171
+ }, CommandName.SetRoot);
172
+ });
173
+ it('retains passProps properties identity', () => {
174
+ const obj = {
175
+ some: 'content'
176
+ };
177
+ uut.setRoot({
178
+ root: {
179
+ component: {
180
+ name: 'com.example.MyScreen',
181
+ passProps: {
182
+ obj
183
+ }
184
+ }
185
+ }
186
+ });
187
+ const args = capture(mockedStore.setPendingProps).last();
188
+ expect(args[1].obj).toBe(obj);
189
+ });
190
+ });
191
+ describe('mergeOptions', () => {
192
+ it('passes options for component', () => {
193
+ uut.mergeOptions('theComponentId', {
194
+ blurOnUnmount: true
195
+ });
196
+ verify(mockedNativeCommandsSender.mergeOptions('theComponentId', deepEqual({
197
+ blurOnUnmount: true
198
+ }))).called();
199
+ });
200
+ it('show warning when invoking before componentDidMount', () => {
201
+ jest.spyOn(console, 'warn');
202
+ when(mockedStore.getComponentInstance('component1')).thenReturn({});
203
+ const componentId = 'component1';
204
+ uut.mergeOptions(componentId, {
205
+ blurOnUnmount: true
206
+ });
207
+ expect(console.warn).toBeCalledWith(`Navigation.mergeOptions was invoked on component with id: ${componentId} before it is mounted, this can cause UI issues and should be avoided.\n Use static options instead.`);
208
+ });
209
+ it('should not show warning for mounted component', () => {
210
+ jest.spyOn(console, 'warn');
211
+ const componentId = 'component1';
212
+ when(mockedStore.getComponentInstance('component1')).thenReturn({
213
+ isMounted: true
214
+ });
215
+ uut.mergeOptions('component1', {
216
+ blurOnUnmount: true
217
+ });
218
+ expect(console.warn).not.toBeCalledWith(`Navigation.mergeOptions was invoked on component with id: ${componentId} before it is mounted, this can cause UI issues and should be avoided.\n Use static options instead.`);
219
+ });
220
+ it('should not show warning for component id that does not exist', () => {
221
+ jest.spyOn(console, 'warn');
222
+ const componentId = 'component1';
223
+ when(mockedStore.getComponentInstance('stackId')).thenReturn(undefined);
224
+ uut.mergeOptions('stackId', {
225
+ blurOnUnmount: true
226
+ });
227
+ expect(console.warn).not.toBeCalledWith(`Navigation.mergeOptions was invoked on component with id: ${componentId} before it is mounted, this can cause UI issues and should be avoided.\n Use static options instead.`);
228
+ });
229
+ it('processes mergeOptions', async () => {
230
+ const options = {
231
+ animations: {
232
+ dismissModal: {
233
+ enabled: false
234
+ }
235
+ }
236
+ };
237
+ uut.mergeOptions('myUniqueId', options);
238
+ verify(mockedOptionsProcessor.processOptions(CommandName.MergeOptions, deepEqual(options), undefined)).called();
239
+ });
240
+ it('processing mergeOptions should pass component props', async () => {
241
+ const options = {
242
+ animations: {
243
+ dismissModal: {
244
+ enabled: false
245
+ }
246
+ }
247
+ };
248
+ const passProps = {
249
+ prop: '1'
250
+ };
251
+ when(mockedStore.getPropsForId('myUniqueId')).thenReturn(passProps);
252
+ uut.mergeOptions('myUniqueId', options);
253
+ verify(mockedOptionsProcessor.processOptions(CommandName.MergeOptions, deepEqual(options), passProps)).called();
254
+ });
255
+ });
256
+ describe('updateProps', () => {
257
+ it('delegates to store', () => {
258
+ uut.updateProps('theComponentId', {
259
+ someProp: 'someValue'
260
+ });
261
+ verify(mockedStore.updateProps('theComponentId', deepEqual({
262
+ someProp: 'someValue'
263
+ })));
264
+ });
265
+ it('notifies commands observer', () => {
266
+ uut.updateProps('theComponentId', {
267
+ someProp: 'someValue'
268
+ });
269
+ verify(commandsObserver.notify('updateProps', deepEqual({
270
+ componentId: 'theComponentId',
271
+ props: {
272
+ someProp: 'someValue'
273
+ }
274
+ })));
275
+ });
276
+ it('update props with callback', () => {
277
+ const callback = jest.fn();
278
+ uut.updateProps('theComponentId', {
279
+ someProp: 'someValue'
280
+ }, callback);
281
+ const args = capture(mockedStore.updateProps).last();
282
+ expect(args[0]).toEqual('theComponentId');
283
+ expect(args[1]).toEqual({
284
+ someProp: 'someValue'
285
+ });
286
+ expect(args[2]).toEqual(callback);
287
+ });
288
+ });
289
+ describe('showModal', () => {
290
+ it('sends command to native after parsing into a correct layout tree', () => {
291
+ uut.showModal({
292
+ component: {
293
+ name: 'com.example.MyScreen'
294
+ }
295
+ });
296
+ verify(mockedNativeCommandsSender.showModal('showModal+UNIQUE_ID', deepEqual({
297
+ type: 'Component',
298
+ id: 'Component+UNIQUE_ID',
299
+ data: {
300
+ name: 'com.example.MyScreen',
301
+ options: {},
302
+ passProps: undefined
303
+ },
304
+ children: []
305
+ }))).called();
306
+ });
307
+ it('returns a promise with the resolved layout', async () => {
308
+ when(mockedNativeCommandsSender.showModal(anything(), anything())).thenResolve('the resolved layout');
309
+ const result = await uut.showModal({
310
+ component: {
311
+ name: 'com.example.MyScreen'
312
+ }
313
+ });
314
+ expect(result).toEqual('the resolved layout');
315
+ });
316
+ it('process layout with layoutProcessor', () => {
317
+ uut.showModal({
318
+ component: {
319
+ name: 'com.example.MyScreen'
320
+ }
321
+ });
322
+ expect(layoutProcessor.process).toBeCalledWith({
323
+ component: {
324
+ id: 'Component+UNIQUE_ID',
325
+ name: 'com.example.MyScreen',
326
+ options: {}
327
+ }
328
+ }, CommandName.ShowModal);
329
+ });
330
+ it('retains passProps properties identity', () => {
331
+ const obj = {
332
+ some: 'content'
333
+ };
334
+ uut.showModal({
335
+ component: {
336
+ name: 'com.example.MyScreen',
337
+ passProps: {
338
+ obj
339
+ }
340
+ }
341
+ });
342
+ const args = capture(mockedStore.setPendingProps).last();
343
+ expect(args[1].obj).toBe(obj);
344
+ });
345
+ });
346
+ describe('dismissModal', () => {
347
+ it('sends command to native', () => {
348
+ uut.dismissModal('myUniqueId', {});
349
+ verify(mockedNativeCommandsSender.dismissModal('dismissModal+UNIQUE_ID', 'myUniqueId', deepEqual({}))).called();
350
+ });
351
+ it('returns a promise with the id', async () => {
352
+ when(mockedNativeCommandsSender.dismissModal(anyString(), anything(), anything())).thenResolve('the id');
353
+ const result = await uut.dismissModal('myUniqueId');
354
+ expect(result).toEqual('the id');
355
+ });
356
+ it('processes mergeOptions', async () => {
357
+ const options = {
358
+ animations: {
359
+ dismissModal: {
360
+ enabled: false
361
+ }
362
+ }
363
+ };
364
+ uut.dismissModal('myUniqueId', options);
365
+ verify(mockedOptionsProcessor.processOptions(CommandName.DismissModal, options)).called();
366
+ });
367
+ });
368
+ describe('dismissAllModals', () => {
369
+ it('sends command to native', () => {
370
+ uut.dismissAllModals({});
371
+ verify(mockedNativeCommandsSender.dismissAllModals('dismissAllModals+UNIQUE_ID', deepEqual({}))).called();
372
+ });
373
+ it('returns a promise with the id', async () => {
374
+ when(mockedNativeCommandsSender.dismissAllModals(anyString(), anything())).thenResolve('the id');
375
+ const result = await uut.dismissAllModals();
376
+ expect(result).toEqual('the id');
377
+ });
378
+ it('processes mergeOptions', async () => {
379
+ const options = {
380
+ animations: {
381
+ dismissModal: {
382
+ enabled: false
383
+ }
384
+ }
385
+ };
386
+ uut.dismissAllModals(options);
387
+ verify(mockedOptionsProcessor.processOptions(CommandName.DismissAllModals, options)).called();
388
+ });
389
+ });
390
+ describe('push', () => {
391
+ it('resolves with the parsed layout', async () => {
392
+ when(mockedNativeCommandsSender.push(anyString(), anyString(), anything())).thenResolve('the resolved layout');
393
+ const result = await uut.push('theComponentId', {
394
+ component: {
395
+ name: 'com.example.MyScreen'
396
+ }
397
+ });
398
+ expect(result).toEqual('the resolved layout');
399
+ });
400
+ it('parses into correct layout node and sends to native', () => {
401
+ uut.push('theComponentId', {
402
+ component: {
403
+ name: 'com.example.MyScreen'
404
+ }
405
+ });
406
+ verify(mockedNativeCommandsSender.push('push+UNIQUE_ID', 'theComponentId', deepEqual({
407
+ type: 'Component',
408
+ id: 'Component+UNIQUE_ID',
409
+ data: {
410
+ name: 'com.example.MyScreen',
411
+ options: {},
412
+ passProps: undefined
413
+ },
414
+ children: []
415
+ }))).called();
416
+ });
417
+ it('process layout with layoutProcessor', () => {
418
+ uut.push('theComponentId', {
419
+ component: {
420
+ name: 'com.example.MyScreen'
421
+ }
422
+ });
423
+ expect(layoutProcessor.process).toBeCalledWith({
424
+ component: {
425
+ id: 'Component+UNIQUE_ID',
426
+ name: 'com.example.MyScreen',
427
+ options: {}
428
+ }
429
+ }, CommandName.Push);
430
+ });
431
+ it('retains passProps properties identity', () => {
432
+ const obj = {
433
+ some: 'content'
434
+ };
435
+ uut.push('theComponentId', {
436
+ component: {
437
+ name: 'com.example.MyScreen',
438
+ passProps: {
439
+ obj
440
+ }
441
+ }
442
+ });
443
+ const args = capture(mockedStore.setPendingProps).last();
444
+ expect(args[1].obj).toBe(obj);
445
+ });
446
+ });
447
+ describe('pop', () => {
448
+ it('pops a component, passing componentId', () => {
449
+ uut.pop('theComponentId', {});
450
+ verify(mockedNativeCommandsSender.pop('pop+UNIQUE_ID', 'theComponentId', deepEqual({}))).called();
451
+ });
452
+ it('pops a component, passing componentId and options', () => {
453
+ const options = {
454
+ popGesture: true
455
+ };
456
+ uut.pop('theComponentId', options);
457
+ verify(mockedNativeCommandsSender.pop('pop+UNIQUE_ID', 'theComponentId', options)).called();
458
+ });
459
+ it('pop returns a promise that resolves to componentId', async () => {
460
+ when(mockedNativeCommandsSender.pop(anyString(), anyString(), anything())).thenResolve('theComponentId');
461
+ const result = await uut.pop('theComponentId', {});
462
+ expect(result).toEqual('theComponentId');
463
+ });
464
+ it('processes mergeOptions', async () => {
465
+ const options = {
466
+ animations: {
467
+ pop: {
468
+ enabled: false
469
+ }
470
+ }
471
+ };
472
+ uut.pop('theComponentId', options);
473
+ verify(mockedOptionsProcessor.processOptions(CommandName.Pop, options)).called();
474
+ });
475
+ });
476
+ describe('popTo', () => {
477
+ it('pops all components until the passed Id is top', () => {
478
+ uut.popTo('theComponentId', {});
479
+ verify(mockedNativeCommandsSender.popTo('popTo+UNIQUE_ID', 'theComponentId', deepEqual({}))).called();
480
+ });
481
+ it('returns a promise that resolves to targetId', async () => {
482
+ when(mockedNativeCommandsSender.popTo(anyString(), anyString(), anything())).thenResolve('theComponentId');
483
+ const result = await uut.popTo('theComponentId');
484
+ expect(result).toEqual('theComponentId');
485
+ });
486
+ it('processes mergeOptions', async () => {
487
+ const options = {
488
+ animations: {
489
+ pop: {
490
+ enabled: false
491
+ }
492
+ }
493
+ };
494
+ uut.popTo('theComponentId', options);
495
+ verify(mockedOptionsProcessor.processOptions(CommandName.PopTo, options)).called();
496
+ });
497
+ });
498
+ describe('popToRoot', () => {
499
+ it('pops all components to root', () => {
500
+ uut.popToRoot('theComponentId', {});
501
+ verify(mockedNativeCommandsSender.popToRoot('popToRoot+UNIQUE_ID', 'theComponentId', deepEqual({}))).called();
502
+ });
503
+ it('returns a promise that resolves to targetId', async () => {
504
+ when(mockedNativeCommandsSender.popToRoot(anyString(), anyString(), anything())).thenResolve('theComponentId');
505
+ const result = await uut.popToRoot('theComponentId');
506
+ expect(result).toEqual('theComponentId');
507
+ });
508
+ it('processes mergeOptions', async () => {
509
+ const options = {
510
+ animations: {
511
+ pop: {
512
+ enabled: false
513
+ }
514
+ }
515
+ };
516
+ uut.popToRoot('theComponentId', options);
517
+ verify(mockedOptionsProcessor.processOptions(CommandName.PopToRoot, options)).called();
518
+ });
519
+ });
520
+ describe('setStackRoot', () => {
521
+ it('parses into correct layout node and sends to native', () => {
522
+ uut.setStackRoot('theComponentId', [{
523
+ component: {
524
+ name: 'com.example.MyScreen'
525
+ }
526
+ }]);
527
+ verify(mockedNativeCommandsSender.setStackRoot('setStackRoot+UNIQUE_ID', 'theComponentId', deepEqual([{
528
+ type: 'Component',
529
+ id: 'Component+UNIQUE_ID',
530
+ data: {
531
+ name: 'com.example.MyScreen',
532
+ options: {},
533
+ passProps: undefined
534
+ },
535
+ children: []
536
+ }]))).called();
537
+ });
538
+ it('process layout with layoutProcessor', () => {
539
+ uut.setStackRoot('theComponentId', [{
540
+ component: {
541
+ name: 'com.example.MyScreen'
542
+ }
543
+ }]);
544
+ expect(layoutProcessor.process).toBeCalledWith({
545
+ component: {
546
+ id: 'Component+UNIQUE_ID',
547
+ name: 'com.example.MyScreen',
548
+ options: {}
549
+ }
550
+ }, CommandName.SetStackRoot);
551
+ });
552
+ it('retains passProps properties identity', () => {
553
+ const obj = {
554
+ some: 'content'
555
+ };
556
+ uut.setStackRoot('theComponentId', [{
557
+ component: {
558
+ name: 'com.example.MyScreen',
559
+ passProps: {
560
+ obj
561
+ }
562
+ }
563
+ }]);
564
+ const args = capture(mockedStore.setPendingProps).last();
565
+ expect(args[1].obj).toBe(obj);
566
+ });
567
+ });
568
+ describe('showOverlay', () => {
569
+ it('sends command to native after parsing into a correct layout tree', () => {
570
+ uut.showOverlay({
571
+ component: {
572
+ name: 'com.example.MyScreen'
573
+ }
574
+ });
575
+ verify(mockedNativeCommandsSender.showOverlay('showOverlay+UNIQUE_ID', deepEqual({
576
+ type: 'Component',
577
+ id: 'Component+UNIQUE_ID',
578
+ data: {
579
+ name: 'com.example.MyScreen',
580
+ options: {},
581
+ passProps: undefined
582
+ },
583
+ children: []
584
+ }))).called();
585
+ });
586
+ it('resolves with the component id', async () => {
587
+ when(mockedNativeCommandsSender.showOverlay(anyString(), anything())).thenResolve('Component1');
588
+ const result = await uut.showOverlay({
589
+ component: {
590
+ name: 'com.example.MyScreen'
591
+ }
592
+ });
593
+ expect(result).toEqual('Component1');
594
+ });
595
+ it('process layout with layoutProcessor', () => {
596
+ uut.showOverlay({
597
+ component: {
598
+ name: 'com.example.MyScreen'
599
+ }
600
+ });
601
+ expect(layoutProcessor.process).toBeCalledWith({
602
+ component: {
603
+ id: 'Component+UNIQUE_ID',
604
+ name: 'com.example.MyScreen',
605
+ options: {}
606
+ }
607
+ }, CommandName.ShowOverlay);
608
+ });
609
+ it('retains passProps properties identity', () => {
610
+ const obj = {
611
+ some: 'content'
612
+ };
613
+ uut.showOverlay({
614
+ component: {
615
+ name: 'com.example.MyScreen',
616
+ passProps: {
617
+ obj
618
+ }
619
+ }
620
+ });
621
+ const args = capture(mockedStore.setPendingProps).last();
622
+ expect(args[1].obj).toBe(obj);
623
+ });
624
+ });
625
+ describe('dismissOverlay', () => {
626
+ it('check promise returns true', async () => {
627
+ when(mockedNativeCommandsSender.dismissOverlay(anyString(), anyString())).thenResolve('true');
628
+ const result = await uut.dismissOverlay('Component1');
629
+ verify(mockedNativeCommandsSender.dismissOverlay(anyString(), anyString())).called();
630
+ expect(result).toEqual('true');
631
+ });
632
+ it('send command to native with componentId', () => {
633
+ uut.dismissOverlay('Component1');
634
+ verify(mockedNativeCommandsSender.dismissOverlay('dismissOverlay+UNIQUE_ID', 'Component1')).called();
635
+ });
636
+ });
637
+ describe('notifies commandsObserver', () => {
638
+ let cb;
639
+ let mockedLayoutTreeParser;
640
+ let mockedLayoutTreeCrawler;
641
+ beforeEach(() => {
642
+ cb = jest.fn();
643
+ mockedLayoutTreeParser = mock(LayoutTreeParser);
644
+ mockedLayoutTreeCrawler = mock(LayoutTreeCrawler);
645
+ commandsObserver.register(cb);
646
+ const mockedOptionsProcessor = mock(OptionsProcessor);
647
+ uut = new Commands(mockedStore, mockedNativeCommandsSender, instance(mockedLayoutTreeParser), instance(mockedLayoutTreeCrawler), commandsObserver, instance(mockedUniqueIdProvider), instance(mockedOptionsProcessor), new LayoutProcessor(new LayoutProcessorsStore()), new OptionsCrawler(instance(mockedStore), mockedUniqueIdProvider));
648
+ });
649
+ function getAllMethodsOfUut() {
650
+ const uutFns = Object.getOwnPropertyNames(Commands.prototype);
651
+ const methods = filter(uutFns, fn => fn !== 'constructor');
652
+ expect(methods.length).toBeGreaterThan(1);
653
+ return methods;
654
+ }
655
+ describe('passes correct params', () => {
656
+ const argsForMethodName = {
657
+ setRoot: [{}],
658
+ setDefaultOptions: [{}],
659
+ mergeOptions: ['id', {}],
660
+ updateProps: ['id', {}],
661
+ showModal: [{}],
662
+ dismissModal: ['id', {}],
663
+ dismissAllModals: [{}],
664
+ push: ['id', {}],
665
+ pop: ['id', {}],
666
+ popTo: ['id', {}],
667
+ popToRoot: ['id', {}],
668
+ setStackRoot: ['id', [{}]],
669
+ showOverlay: [{}],
670
+ dismissOverlay: ['id'],
671
+ dismissAllOverlays: [{}],
672
+ getLaunchArgs: ['id']
673
+ };
674
+ const paramsForMethodName = {
675
+ setRoot: {
676
+ commandId: 'setRoot+UNIQUE_ID',
677
+ layout: {
678
+ root: null,
679
+ modals: [],
680
+ overlays: []
681
+ }
682
+ },
683
+ setDefaultOptions: {
684
+ options: {}
685
+ },
686
+ mergeOptions: {
687
+ componentId: 'id',
688
+ options: {}
689
+ },
690
+ updateProps: {
691
+ componentId: 'id',
692
+ props: {}
693
+ },
694
+ showModal: {
695
+ commandId: 'showModal+UNIQUE_ID',
696
+ layout: null
697
+ },
698
+ dismissModal: {
699
+ commandId: 'dismissModal+UNIQUE_ID',
700
+ componentId: 'id',
701
+ mergeOptions: {}
702
+ },
703
+ dismissAllModals: {
704
+ commandId: 'dismissAllModals+UNIQUE_ID',
705
+ mergeOptions: {}
706
+ },
707
+ push: {
708
+ commandId: 'push+UNIQUE_ID',
709
+ componentId: 'id',
710
+ layout: null
711
+ },
712
+ pop: {
713
+ commandId: 'pop+UNIQUE_ID',
714
+ componentId: 'id',
715
+ mergeOptions: {}
716
+ },
717
+ popTo: {
718
+ commandId: 'popTo+UNIQUE_ID',
719
+ componentId: 'id',
720
+ mergeOptions: {}
721
+ },
722
+ popToRoot: {
723
+ commandId: 'popToRoot+UNIQUE_ID',
724
+ componentId: 'id',
725
+ mergeOptions: {}
726
+ },
727
+ setStackRoot: {
728
+ commandId: 'setStackRoot+UNIQUE_ID',
729
+ componentId: 'id',
730
+ layout: [null]
731
+ },
732
+ showOverlay: {
733
+ commandId: 'showOverlay+UNIQUE_ID',
734
+ layout: null
735
+ },
736
+ dismissOverlay: {
737
+ commandId: 'dismissOverlay+UNIQUE_ID',
738
+ componentId: 'id'
739
+ },
740
+ dismissAllOverlays: {
741
+ commandId: 'dismissAllOverlays+UNIQUE_ID'
742
+ },
743
+ getLaunchArgs: {
744
+ commandId: 'getLaunchArgs+UNIQUE_ID'
745
+ }
746
+ };
747
+ forEach(getAllMethodsOfUut(), m => {
748
+ it(`for ${m}`, () => {
749
+ expect(argsForMethodName).toHaveProperty(m);
750
+ expect(paramsForMethodName).toHaveProperty(m);
751
+ invoke(uut, m, ...argsForMethodName[m]);
752
+ expect(cb).toHaveBeenCalledTimes(1);
753
+ expect(cb).toHaveBeenCalledWith(m, paramsForMethodName[m]);
754
+ });
755
+ });
756
+ });
757
+ });
758
+ });
759
+ //# sourceMappingURL=Commands.test.js.map