repluggable-core 1.302.65 → 1.302.67

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 (303) hide show
  1. package/__tests__/spec-setup.js +3 -0
  2. package/dist/es/{API.d.ts → src/API.d.ts} +46 -8
  3. package/dist/es/src/API.d.ts.map +1 -0
  4. package/dist/es/src/API.js +3 -0
  5. package/dist/es/src/API.js.map +1 -0
  6. package/dist/es/src/IterableWeakMap.d.ts +20 -0
  7. package/dist/es/src/IterableWeakMap.d.ts.map +1 -0
  8. package/dist/es/src/IterableWeakMap.js +92 -0
  9. package/dist/es/src/IterableWeakMap.js.map +1 -0
  10. package/dist/es/src/__internal.d.ts.map +1 -0
  11. package/dist/es/src/__internal.js +5 -0
  12. package/dist/es/src/__internal.js.map +1 -0
  13. package/dist/es/src/appHost.d.ts +7 -0
  14. package/dist/es/src/appHost.d.ts.map +1 -0
  15. package/dist/es/src/appHost.js +898 -0
  16. package/dist/es/src/appHost.js.map +1 -0
  17. package/dist/es/src/appHostServices.d.ts +12 -0
  18. package/dist/es/src/appHostServices.d.ts.map +1 -0
  19. package/dist/es/src/appHostServices.js +25 -0
  20. package/dist/es/src/appHostServices.js.map +1 -0
  21. package/dist/es/src/appHostUtils.d.ts +4 -0
  22. package/dist/es/src/appHostUtils.d.ts.map +1 -0
  23. package/dist/es/src/appHostUtils.js +8 -0
  24. package/dist/es/src/appHostUtils.js.map +1 -0
  25. package/dist/es/src/extensionSlot.d.ts +8 -0
  26. package/dist/es/src/extensionSlot.d.ts.map +1 -0
  27. package/dist/es/src/extensionSlot.js +59 -0
  28. package/dist/es/src/extensionSlot.js.map +1 -0
  29. package/dist/es/src/hot.d.ts +14 -0
  30. package/dist/es/src/hot.d.ts.map +1 -0
  31. package/dist/es/src/hot.js +52 -0
  32. package/dist/es/src/hot.js.map +1 -0
  33. package/dist/es/src/index.d.ts +11 -0
  34. package/dist/es/src/index.d.ts.map +1 -0
  35. package/dist/es/src/index.js +10 -0
  36. package/dist/es/src/index.js.map +1 -0
  37. package/dist/es/src/installedShellsState.d.ts +19 -0
  38. package/dist/es/src/installedShellsState.d.ts.map +1 -0
  39. package/dist/es/src/installedShellsState.js +30 -0
  40. package/dist/es/src/installedShellsState.js.map +1 -0
  41. package/dist/es/src/interceptAnyObject.d.ts +7 -0
  42. package/dist/es/src/interceptAnyObject.d.ts.map +1 -0
  43. package/dist/es/src/interceptAnyObject.js +21 -0
  44. package/dist/es/src/interceptAnyObject.js.map +1 -0
  45. package/dist/es/src/invokeSlotCallbacks.d.ts +3 -0
  46. package/dist/es/src/invokeSlotCallbacks.d.ts.map +1 -0
  47. package/dist/es/src/invokeSlotCallbacks.js +20 -0
  48. package/dist/es/src/invokeSlotCallbacks.js.map +1 -0
  49. package/dist/es/src/loggers.d.ts +4 -0
  50. package/dist/es/src/loggers.d.ts.map +1 -0
  51. package/dist/es/src/loggers.js +100 -0
  52. package/dist/es/src/loggers.js.map +1 -0
  53. package/dist/es/src/monitorAPI.d.ts +3 -0
  54. package/dist/es/src/monitorAPI.d.ts.map +1 -0
  55. package/dist/es/src/monitorAPI.js +53 -0
  56. package/dist/es/src/monitorAPI.js.map +1 -0
  57. package/dist/es/src/repluggableAppDebug/index.d.ts +2 -0
  58. package/dist/es/src/repluggableAppDebug/index.d.ts.map +1 -0
  59. package/dist/es/src/repluggableAppDebug/index.js +2 -0
  60. package/dist/es/src/repluggableAppDebug/index.js.map +1 -0
  61. package/dist/es/src/repluggableAppDebug/performanceDebugInfo.d.ts +15 -0
  62. package/dist/es/src/repluggableAppDebug/performanceDebugInfo.d.ts.map +1 -0
  63. package/dist/es/src/repluggableAppDebug/performanceDebugInfo.js +94 -0
  64. package/dist/es/src/repluggableAppDebug/performanceDebugInfo.js.map +1 -0
  65. package/dist/es/src/repluggableAppDebug/repluggableAppDebug.d.ts +24 -0
  66. package/dist/es/src/repluggableAppDebug/repluggableAppDebug.d.ts.map +1 -0
  67. package/dist/es/src/repluggableAppDebug/repluggableAppDebug.js +132 -0
  68. package/dist/es/src/repluggableAppDebug/repluggableAppDebug.js.map +1 -0
  69. package/dist/es/src/tarjanGraph.d.ts +27 -0
  70. package/dist/es/src/tarjanGraph.d.ts.map +1 -0
  71. package/dist/es/src/tarjanGraph.js +94 -0
  72. package/dist/es/src/tarjanGraph.js.map +1 -0
  73. package/dist/es/src/throttledStore.d.ts +32 -0
  74. package/dist/es/src/throttledStore.d.ts.map +1 -0
  75. package/dist/es/src/throttledStore.js +240 -0
  76. package/dist/es/src/throttledStore.js.map +1 -0
  77. package/dist/es/test/IterableWeakMap.spec.d.ts +2 -0
  78. package/dist/es/test/IterableWeakMap.spec.d.ts.map +1 -0
  79. package/dist/es/test/IterableWeakMap.spec.js +218 -0
  80. package/dist/es/test/IterableWeakMap.spec.js.map +1 -0
  81. package/dist/es/test/appHost.mock.d.ts +4 -0
  82. package/dist/es/test/appHost.mock.d.ts.map +1 -0
  83. package/dist/es/test/appHost.mock.js +54 -0
  84. package/dist/es/test/appHost.mock.js.map +1 -0
  85. package/dist/es/test/appHost.spec.d.ts +2 -0
  86. package/dist/es/test/appHost.spec.d.ts.map +1 -0
  87. package/dist/es/test/appHost.spec.js +1451 -0
  88. package/dist/es/test/appHost.spec.js.map +1 -0
  89. package/dist/es/test/installedShellsState.spec.d.ts +2 -0
  90. package/dist/es/test/installedShellsState.spec.d.ts.map +1 -0
  91. package/dist/es/test/installedShellsState.spec.js +28 -0
  92. package/dist/es/test/installedShellsState.spec.js.map +1 -0
  93. package/dist/es/test/interceptAnyObject.spec.d.ts +2 -0
  94. package/dist/es/test/interceptAnyObject.spec.d.ts.map +1 -0
  95. package/dist/es/test/interceptAnyObject.spec.js +166 -0
  96. package/dist/es/test/interceptAnyObject.spec.js.map +1 -0
  97. package/dist/es/test/loggers.spec.d.ts +2 -0
  98. package/dist/es/test/loggers.spec.d.ts.map +1 -0
  99. package/dist/es/test/loggers.spec.js +218 -0
  100. package/dist/es/test/loggers.spec.js.map +1 -0
  101. package/dist/es/test/repluggableAppDebug.spec.d.ts +2 -0
  102. package/dist/es/test/repluggableAppDebug.spec.d.ts.map +1 -0
  103. package/dist/es/test/repluggableAppDebug.spec.js +107 -0
  104. package/dist/es/test/repluggableAppDebug.spec.js.map +1 -0
  105. package/dist/es/test/testKit.spec.d.ts +2 -0
  106. package/dist/es/test/testKit.spec.d.ts.map +1 -0
  107. package/dist/es/test/testKit.spec.js +129 -0
  108. package/dist/es/test/testKit.spec.js.map +1 -0
  109. package/dist/es/testKit/emptyLoggerOptions.d.ts +3 -0
  110. package/dist/es/testKit/emptyLoggerOptions.d.ts.map +1 -0
  111. package/dist/es/testKit/emptyLoggerOptions.js +15 -0
  112. package/dist/es/testKit/emptyLoggerOptions.js.map +1 -0
  113. package/dist/es/testKit/index.d.ts +27 -0
  114. package/dist/es/testKit/index.d.ts.map +1 -0
  115. package/dist/es/testKit/index.js +132 -0
  116. package/dist/es/testKit/index.js.map +1 -0
  117. package/dist/es/testKit/mockPackage.d.ts +23 -0
  118. package/dist/es/testKit/mockPackage.d.ts.map +1 -0
  119. package/dist/es/testKit/mockPackage.js +95 -0
  120. package/dist/es/testKit/mockPackage.js.map +1 -0
  121. package/dist/es/testKit/withConsoleErrors.d.ts +2 -0
  122. package/dist/es/testKit/withConsoleErrors.d.ts.map +1 -0
  123. package/dist/es/testKit/withConsoleErrors.js +12 -0
  124. package/dist/es/testKit/withConsoleErrors.js.map +1 -0
  125. package/dist/es/testKit/withThrowOnError.d.ts +3 -0
  126. package/dist/es/testKit/withThrowOnError.d.ts.map +1 -0
  127. package/dist/es/testKit/withThrowOnError.js +27 -0
  128. package/dist/es/testKit/withThrowOnError.js.map +1 -0
  129. package/dist/src/API.d.ts +46 -8
  130. package/dist/src/API.d.ts.map +1 -1
  131. package/dist/src/API.js +4 -0
  132. package/dist/src/API.js.map +1 -1
  133. package/dist/src/IterableWeakMap.d.ts +20 -0
  134. package/dist/src/IterableWeakMap.d.ts.map +1 -0
  135. package/dist/src/IterableWeakMap.js +96 -0
  136. package/dist/src/IterableWeakMap.js.map +1 -0
  137. package/dist/src/__internal.d.ts.map +1 -1
  138. package/dist/src/__internal.js +1 -1
  139. package/dist/src/__internal.js.map +1 -1
  140. package/dist/src/appHost.d.ts +7 -0
  141. package/dist/src/appHost.d.ts.map +1 -0
  142. package/dist/src/appHost.js +906 -0
  143. package/dist/src/appHost.js.map +1 -0
  144. package/dist/src/appHostServices.d.ts +12 -0
  145. package/dist/src/appHostServices.d.ts.map +1 -0
  146. package/dist/src/appHostServices.js +29 -0
  147. package/dist/src/appHostServices.js.map +1 -0
  148. package/dist/src/appHostUtils.d.ts +4 -0
  149. package/dist/src/appHostUtils.d.ts.map +1 -0
  150. package/dist/src/appHostUtils.js +16 -0
  151. package/dist/src/appHostUtils.js.map +1 -0
  152. package/dist/src/extensionSlot.d.ts +8 -0
  153. package/dist/src/extensionSlot.d.ts.map +1 -0
  154. package/dist/src/extensionSlot.js +67 -0
  155. package/dist/src/extensionSlot.js.map +1 -0
  156. package/dist/src/hot.d.ts +14 -0
  157. package/dist/src/hot.d.ts.map +1 -0
  158. package/dist/src/hot.js +56 -0
  159. package/dist/src/hot.js.map +1 -0
  160. package/dist/src/index.d.ts +10 -2
  161. package/dist/src/index.d.ts.map +1 -1
  162. package/dist/src/index.js +22 -15
  163. package/dist/src/index.js.map +1 -1
  164. package/dist/src/installedShellsState.d.ts +19 -0
  165. package/dist/src/installedShellsState.d.ts.map +1 -0
  166. package/dist/src/installedShellsState.js +38 -0
  167. package/dist/src/installedShellsState.js.map +1 -0
  168. package/dist/src/interceptAnyObject.d.ts +7 -0
  169. package/dist/src/interceptAnyObject.d.ts.map +1 -0
  170. package/dist/src/interceptAnyObject.js +28 -0
  171. package/dist/src/interceptAnyObject.js.map +1 -0
  172. package/dist/src/invokeSlotCallbacks.d.ts +3 -0
  173. package/dist/src/invokeSlotCallbacks.d.ts.map +1 -0
  174. package/dist/src/invokeSlotCallbacks.js +24 -0
  175. package/dist/src/invokeSlotCallbacks.js.map +1 -0
  176. package/dist/src/loggers.d.ts +4 -0
  177. package/dist/src/loggers.d.ts.map +1 -0
  178. package/dist/src/loggers.js +104 -0
  179. package/dist/src/loggers.js.map +1 -0
  180. package/dist/src/monitorAPI.d.ts +3 -0
  181. package/dist/src/monitorAPI.d.ts.map +1 -0
  182. package/dist/src/monitorAPI.js +57 -0
  183. package/dist/src/monitorAPI.js.map +1 -0
  184. package/dist/src/repluggableAppDebug/index.d.ts +2 -0
  185. package/dist/src/repluggableAppDebug/index.d.ts.map +1 -0
  186. package/dist/src/repluggableAppDebug/index.js +6 -0
  187. package/dist/src/repluggableAppDebug/index.js.map +1 -0
  188. package/dist/src/repluggableAppDebug/performanceDebugInfo.d.ts +15 -0
  189. package/dist/src/repluggableAppDebug/performanceDebugInfo.d.ts.map +1 -0
  190. package/dist/src/repluggableAppDebug/performanceDebugInfo.js +101 -0
  191. package/dist/src/repluggableAppDebug/performanceDebugInfo.js.map +1 -0
  192. package/dist/src/repluggableAppDebug/repluggableAppDebug.d.ts +24 -0
  193. package/dist/src/repluggableAppDebug/repluggableAppDebug.d.ts.map +1 -0
  194. package/dist/src/repluggableAppDebug/repluggableAppDebug.js +139 -0
  195. package/dist/src/repluggableAppDebug/repluggableAppDebug.js.map +1 -0
  196. package/dist/src/tarjanGraph.d.ts +27 -0
  197. package/dist/src/tarjanGraph.d.ts.map +1 -0
  198. package/dist/src/tarjanGraph.js +100 -0
  199. package/dist/src/tarjanGraph.js.map +1 -0
  200. package/dist/src/throttledStore.d.ts +32 -0
  201. package/dist/src/throttledStore.d.ts.map +1 -0
  202. package/dist/src/throttledStore.js +249 -0
  203. package/dist/src/throttledStore.js.map +1 -0
  204. package/dist/test/IterableWeakMap.spec.d.ts +2 -0
  205. package/dist/test/IterableWeakMap.spec.d.ts.map +1 -0
  206. package/dist/test/IterableWeakMap.spec.js +220 -0
  207. package/dist/test/IterableWeakMap.spec.js.map +1 -0
  208. package/dist/test/appHost.mock.d.ts +4 -0
  209. package/dist/test/appHost.mock.d.ts.map +1 -0
  210. package/dist/test/appHost.mock.js +59 -0
  211. package/dist/test/appHost.mock.js.map +1 -0
  212. package/dist/test/appHost.spec.d.ts +2 -0
  213. package/dist/test/appHost.spec.d.ts.map +1 -0
  214. package/dist/test/appHost.spec.js +1456 -0
  215. package/dist/test/appHost.spec.js.map +1 -0
  216. package/dist/test/installedShellsState.spec.d.ts +2 -0
  217. package/dist/test/installedShellsState.spec.d.ts.map +1 -0
  218. package/dist/test/installedShellsState.spec.js +30 -0
  219. package/dist/test/installedShellsState.spec.js.map +1 -0
  220. package/dist/test/interceptAnyObject.spec.d.ts +2 -0
  221. package/dist/test/interceptAnyObject.spec.d.ts.map +1 -0
  222. package/dist/test/interceptAnyObject.spec.js +171 -0
  223. package/dist/test/interceptAnyObject.spec.js.map +1 -0
  224. package/dist/test/loggers.spec.d.ts +2 -0
  225. package/dist/test/loggers.spec.d.ts.map +1 -0
  226. package/dist/test/loggers.spec.js +220 -0
  227. package/dist/test/loggers.spec.js.map +1 -0
  228. package/dist/test/repluggableAppDebug.spec.d.ts +2 -0
  229. package/dist/test/repluggableAppDebug.spec.d.ts.map +1 -0
  230. package/dist/test/repluggableAppDebug.spec.js +109 -0
  231. package/dist/test/repluggableAppDebug.spec.js.map +1 -0
  232. package/dist/test/testKit.spec.d.ts +2 -0
  233. package/dist/test/testKit.spec.d.ts.map +1 -0
  234. package/dist/test/testKit.spec.js +134 -0
  235. package/dist/test/testKit.spec.js.map +1 -0
  236. package/dist/testKit/emptyLoggerOptions.d.ts +3 -0
  237. package/dist/testKit/emptyLoggerOptions.d.ts.map +1 -0
  238. package/dist/testKit/emptyLoggerOptions.js +18 -0
  239. package/dist/testKit/emptyLoggerOptions.js.map +1 -0
  240. package/dist/testKit/index.d.ts +27 -0
  241. package/dist/testKit/index.d.ts.map +1 -0
  242. package/dist/testKit/index.js +160 -0
  243. package/dist/testKit/index.js.map +1 -0
  244. package/dist/testKit/mockPackage.d.ts +23 -0
  245. package/dist/testKit/mockPackage.d.ts.map +1 -0
  246. package/dist/testKit/mockPackage.js +101 -0
  247. package/dist/testKit/mockPackage.js.map +1 -0
  248. package/dist/testKit/withConsoleErrors.d.ts +2 -0
  249. package/dist/testKit/withConsoleErrors.d.ts.map +1 -0
  250. package/dist/testKit/withConsoleErrors.js +16 -0
  251. package/dist/testKit/withConsoleErrors.js.map +1 -0
  252. package/dist/testKit/withThrowOnError.d.ts +3 -0
  253. package/dist/testKit/withThrowOnError.d.ts.map +1 -0
  254. package/dist/testKit/withThrowOnError.js +31 -0
  255. package/dist/testKit/withThrowOnError.js.map +1 -0
  256. package/jest.config.js +16 -0
  257. package/package.json +21 -3
  258. package/src/API.ts +47 -9
  259. package/src/IterableWeakMap.ts +123 -0
  260. package/src/__internal.ts +1 -1
  261. package/src/appHost.ts +1222 -0
  262. package/src/appHostServices.ts +42 -0
  263. package/src/appHostUtils.ts +11 -0
  264. package/src/extensionSlot.ts +96 -0
  265. package/src/hot.ts +53 -0
  266. package/src/index.ts +42 -2
  267. package/src/installedShellsState.ts +54 -0
  268. package/src/interceptAnyObject.ts +39 -0
  269. package/src/invokeSlotCallbacks.ts +20 -0
  270. package/src/loggers.ts +112 -0
  271. package/src/monitorAPI.ts +71 -0
  272. package/src/repluggableAppDebug/debug.d.ts +37 -0
  273. package/src/repluggableAppDebug/index.ts +1 -0
  274. package/src/repluggableAppDebug/performanceDebugInfo.ts +96 -0
  275. package/src/repluggableAppDebug/repluggableAppDebug.ts +192 -0
  276. package/src/tarjanGraph.ts +96 -0
  277. package/src/throttledStore.ts +355 -0
  278. package/test/IterableWeakMap.spec.ts +280 -0
  279. package/test/appHost.mock.ts +58 -0
  280. package/test/appHost.spec.ts +1765 -0
  281. package/test/installedShellsState.spec.ts +39 -0
  282. package/test/interceptAnyObject.spec.ts +217 -0
  283. package/test/loggers.spec.ts +288 -0
  284. package/test/repluggableAppDebug.spec.ts +118 -0
  285. package/test/testKit.spec.tsx +153 -0
  286. package/testKit/emptyLoggerOptions.ts +16 -0
  287. package/testKit/index.ts +170 -0
  288. package/testKit/mockPackage.ts +110 -0
  289. package/testKit/package.json +3 -0
  290. package/testKit/withConsoleErrors.ts +12 -0
  291. package/testKit/withThrowOnError.ts +34 -0
  292. package/tsconfig.json +9 -2
  293. package/dist/es/API.d.ts.map +0 -1
  294. package/dist/es/API.js +0 -2
  295. package/dist/es/API.js.map +0 -1
  296. package/dist/es/__internal.d.ts.map +0 -1
  297. package/dist/es/__internal.js +0 -5
  298. package/dist/es/__internal.js.map +0 -1
  299. package/dist/es/index.d.ts +0 -3
  300. package/dist/es/index.d.ts.map +0 -1
  301. package/dist/es/index.js +0 -2
  302. package/dist/es/index.js.map +0 -1
  303. /package/dist/es/{__internal.d.ts → src/__internal.d.ts} +0 -0
@@ -0,0 +1,39 @@
1
+ import {
2
+ InstalledShellsActions,
3
+ installedShellsReducer,
4
+ InstalledShellsSelectors,
5
+ InstalledShellsState,
6
+ ShellToggleSet
7
+ } from '../src/installedShellsState'
8
+
9
+ const initialState: InstalledShellsState = {
10
+ installedShells: {
11
+ shellA: true,
12
+ shellB: true
13
+ }
14
+ }
15
+
16
+ const shellsToggleSet: ShellToggleSet = {
17
+ shellB: false,
18
+ shellC: true
19
+ }
20
+
21
+ const expectedState: InstalledShellsState = {
22
+ installedShells: {
23
+ shellA: true,
24
+ shellC: true
25
+ }
26
+ }
27
+
28
+ describe('Installed Shells State', () => {
29
+ it('should toggle shells according to shell toggles', () => {
30
+ const actualState = installedShellsReducer(initialState, InstalledShellsActions.updateInstalledShells(shellsToggleSet))
31
+
32
+ expect(actualState).toEqual(expectedState)
33
+ })
34
+
35
+ it('should select installed shells from state', () => {
36
+ const rootState = { $installedShells: initialState }
37
+ expect(InstalledShellsSelectors.getInstalledShellsSet(rootState)).toEqual(initialState.installedShells)
38
+ })
39
+ })
@@ -0,0 +1,217 @@
1
+ import _ from 'lodash'
2
+ import { FunctionInterceptor, interceptAnyObject, PropertyInterceptor } from '../src/interceptAnyObject'
3
+
4
+ type LogSpy = jest.Mock<void, string[]>
5
+
6
+ function takeLog(spy: LogSpy): string[] {
7
+ return _.flatten(spy.mock.calls)
8
+ }
9
+
10
+ interface StringDict {
11
+ [key: string]: string
12
+ }
13
+
14
+ function dictToString(dict: StringDict): string {
15
+ return Object.keys(dict)
16
+ .map(key => ({
17
+ key,
18
+ value: dict[key]
19
+ }))
20
+ .filter(kvp => typeof kvp.value === 'string')
21
+ .map(kvp => `${kvp.key}:${kvp.value}`)
22
+ .join(';')
23
+ }
24
+
25
+ function argToString(arg: any): string {
26
+ switch (typeof arg) {
27
+ case 'number':
28
+ case 'string':
29
+ return `${arg}`
30
+ case 'object':
31
+ return dictToString(arg)
32
+ case 'undefined':
33
+ return 'undefined'
34
+ default:
35
+ return '???'
36
+ }
37
+ }
38
+
39
+ interface TestTarget {
40
+ voidFunc(): void
41
+ voidFuncWithArgs(str: string, num: number, obj: StringDict): void
42
+ nonVoidFunc(): StringDict
43
+ nonVoidFuncWithArgs(str: string, num: number): StringDict
44
+ scalarProp: string
45
+ objectProp: TestTargetNested
46
+ }
47
+
48
+ interface TestTargetNested {
49
+ nestedFunc(): void
50
+ nestedProp: string
51
+ nestedObject: TestTargetNestedLevelTwo
52
+ }
53
+
54
+ interface TestTargetNestedLevelTwo {
55
+ nestedFuncLevelTwo(): number
56
+ }
57
+
58
+ function createTestTarget(spy: LogSpy): TestTarget {
59
+ return {
60
+ voidFunc() {
61
+ spy('voidFunc')
62
+ },
63
+ voidFuncWithArgs(str: string, num: number, dict: StringDict): void {
64
+ spy(`voidFuncWithArgs(str=${str},num=${num},dict=${dictToString(dict)})`)
65
+ },
66
+ nonVoidFunc() {
67
+ spy('nonVoidFunc')
68
+ return {
69
+ aaa: '111'
70
+ }
71
+ },
72
+ nonVoidFuncWithArgs(str: string, num: number): StringDict {
73
+ spy(`nonVoidFuncWithArgs(str=${str},num=${num})`)
74
+ return {
75
+ bbb: '222'
76
+ }
77
+ },
78
+ scalarProp: 'original-scalar',
79
+ objectProp: {
80
+ nestedProp: 'original-nested',
81
+ nestedFunc() {
82
+ spy('objectProp.nestedFunc')
83
+ },
84
+ nestedObject: {
85
+ nestedFuncLevelTwo() {
86
+ spy('objectProp.nestedObject.nestedFuncLevelTwo')
87
+ return 12345
88
+ }
89
+ }
90
+ }
91
+ }
92
+ }
93
+
94
+ describe('interceptAnyObject', () => {
95
+ function createFuncInterceptor(spy: LogSpy): FunctionInterceptor {
96
+ return (name, func) => {
97
+ return (...args: any[]) => {
98
+ spy(`BEFORE:${name}(${args.map(argToString).join(';')})`)
99
+ const retVal = func.apply(null, args)
100
+ spy(`AFTER:${name}(${argToString(retVal)})`)
101
+ return retVal
102
+ }
103
+ }
104
+ }
105
+
106
+ function createPropInterceptor(spy: LogSpy): PropertyInterceptor {
107
+ return (name, value) => {
108
+ return typeof value === 'string' ? value.replace('original', `INTERCEPTED[${name}]`) : value
109
+ }
110
+ }
111
+
112
+ it('should return same members if no interceptors passed', () => {
113
+ const spy: LogSpy = jest.fn()
114
+ const real = createTestTarget(spy)
115
+ const intercepted = interceptAnyObject(real)
116
+
117
+ expect(intercepted.voidFunc).toBe(real.voidFunc)
118
+ expect(intercepted.scalarProp).toBe(real.scalarProp)
119
+ expect(intercepted.objectProp.nestedFunc).toBe(real.objectProp.nestedFunc)
120
+ })
121
+
122
+ it('should intercept void functions', () => {
123
+ const spy: LogSpy = jest.fn()
124
+ const real = createTestTarget(spy)
125
+ const intercepted = interceptAnyObject(real, createFuncInterceptor(spy))
126
+
127
+ intercepted.voidFunc()
128
+
129
+ const log = takeLog(spy)
130
+ expect(log).toEqual(['BEFORE:voidFunc()', 'voidFunc', 'AFTER:voidFunc(undefined)'])
131
+ })
132
+
133
+ it('should intercept non-void functions with arguments', () => {
134
+ const spy: LogSpy = jest.fn()
135
+ const real = createTestTarget(spy)
136
+ const intercepted = interceptAnyObject(real, createFuncInterceptor(spy))
137
+
138
+ const retVal = intercepted.nonVoidFuncWithArgs('abc', 123)
139
+
140
+ const log = takeLog(spy)
141
+ expect(log).toEqual([
142
+ 'BEFORE:nonVoidFuncWithArgs(abc;123)',
143
+ 'nonVoidFuncWithArgs(str=abc,num=123)',
144
+ 'AFTER:nonVoidFuncWithArgs(bbb:222)'
145
+ ])
146
+ expect(dictToString(retVal)).toBe('bbb:222')
147
+ })
148
+
149
+ it('should intercept scalar props', () => {
150
+ const spy: LogSpy = jest.fn()
151
+ const real = createTestTarget(spy)
152
+ const intercepted = interceptAnyObject(real, createFuncInterceptor(spy), createPropInterceptor(spy))
153
+
154
+ const propValue = intercepted.scalarProp
155
+
156
+ expect(propValue).toBe('INTERCEPTED[scalarProp]-scalar')
157
+ })
158
+
159
+ it('should intercept nested objects', () => {
160
+ const spy: LogSpy = jest.fn()
161
+ const real = createTestTarget(spy)
162
+ const intercepted = interceptAnyObject(real, createFuncInterceptor(spy), createPropInterceptor(spy), 10)
163
+
164
+ const nestedPropValue = intercepted.objectProp.nestedProp
165
+ intercepted.objectProp.nestedFunc()
166
+
167
+ const log = takeLog(spy)
168
+ expect(log).toEqual(['BEFORE:objectProp.nestedFunc()', 'objectProp.nestedFunc', 'AFTER:objectProp.nestedFunc(undefined)'])
169
+ expect(nestedPropValue).toBe('INTERCEPTED[objectProp.nestedProp]-nested')
170
+ })
171
+
172
+ it('should intercept multiple levels of nested objects', () => {
173
+ const spy: LogSpy = jest.fn()
174
+ const real = createTestTarget(spy)
175
+ const intercepted = interceptAnyObject(real, createFuncInterceptor(spy), createPropInterceptor(spy), 10)
176
+
177
+ const nestedFuncLevelTwoRetVal = intercepted.objectProp.nestedObject.nestedFuncLevelTwo()
178
+
179
+ const log = takeLog(spy)
180
+ expect(log).toEqual([
181
+ 'BEFORE:objectProp.nestedObject.nestedFuncLevelTwo()',
182
+ 'objectProp.nestedObject.nestedFuncLevelTwo',
183
+ 'AFTER:objectProp.nestedObject.nestedFuncLevelTwo(12345)'
184
+ ])
185
+ expect(nestedFuncLevelTwoRetVal).toBe(12345)
186
+ })
187
+
188
+ it('should not intercept non object-like values - functions', () => {
189
+ const spy: LogSpy = jest.fn()
190
+ function real() {
191
+ return 'real'
192
+ }
193
+ const intercepted = interceptAnyObject(real, createFuncInterceptor(spy), createPropInterceptor(spy))
194
+ expect(intercepted()).toBe('real')
195
+ })
196
+
197
+ it('should not intercept non object-like values - primitives', () => {
198
+ const spy: LogSpy = jest.fn()
199
+ const real = 'real'
200
+ const intercepted = interceptAnyObject(real, createFuncInterceptor(spy), createPropInterceptor(spy))
201
+ expect(intercepted).toBe('real')
202
+ })
203
+
204
+ it('should not intercept non object-like values - arrays', () => {
205
+ const spy: LogSpy = jest.fn()
206
+ const real = ['real']
207
+ const intercepted = interceptAnyObject(real, createFuncInterceptor(spy), createPropInterceptor(spy))
208
+ expect(intercepted).toEqual(['real'])
209
+ })
210
+
211
+ it('should not intercept non object-like values - maps', () => {
212
+ const spy: LogSpy = jest.fn()
213
+ const real = new Map<string, string>([['key', 'value']])
214
+ const intercepted = interceptAnyObject(real, createFuncInterceptor(spy), createPropInterceptor(spy))
215
+ expect(intercepted.get('key')).toEqual('value')
216
+ })
217
+ })
@@ -0,0 +1,288 @@
1
+ import { EntryPoint, HostLogger, EntryPointTags } from '../src/API'
2
+ import { createAppHost } from '../src/appHost'
3
+ import { createShellLogger } from '../src/loggers'
4
+
5
+ describe('ShellLogger', () => {
6
+ function setup(tags?: EntryPointTags) {
7
+ const logSpy = jest.fn()
8
+ const spanSpy = jest.fn().mockImplementation(() => ({}))
9
+
10
+ const entryPoint: EntryPoint = {
11
+ name: 'ep-1',
12
+ tags
13
+ }
14
+ const hostLogger: HostLogger = {
15
+ log: logSpy,
16
+ spanChild: spanSpy,
17
+ spanRoot: spanSpy
18
+ }
19
+ const host = createAppHost([], { logger: hostLogger, monitoring: {} })
20
+ const shellLogger = createShellLogger(host, entryPoint)
21
+
22
+ logSpy.mockClear()
23
+
24
+ return {
25
+ entryPoint,
26
+ hostLogger,
27
+ host,
28
+ shellLogger
29
+ }
30
+ }
31
+
32
+ function delay(milliseconds: number) {
33
+ return new Promise(resolve => {
34
+ setTimeout(resolve, milliseconds)
35
+ })
36
+ }
37
+
38
+ it('should log simple message', () => {
39
+ const { shellLogger, hostLogger } = setup()
40
+
41
+ shellLogger.debug('M1')
42
+ shellLogger.info('M2')
43
+ shellLogger.warning('M3')
44
+ shellLogger.error('M4')
45
+
46
+ expect(hostLogger.log).toHaveBeenCalledTimes(4)
47
+ expect(hostLogger.log).toHaveBeenNthCalledWith(1, 'debug', 'M1', undefined, { $ep: 'ep-1' })
48
+ expect(hostLogger.log).toHaveBeenNthCalledWith(2, 'info', 'M2', undefined, { $ep: 'ep-1' })
49
+ expect(hostLogger.log).toHaveBeenNthCalledWith(3, 'warning', 'M3', undefined, { $ep: 'ep-1' })
50
+ expect(hostLogger.log).toHaveBeenNthCalledWith(4, 'error', 'M4', undefined, { $ep: 'ep-1' })
51
+ })
52
+
53
+ it('should log simple message with key-value pairs', () => {
54
+ const { shellLogger, hostLogger } = setup()
55
+
56
+ shellLogger.debug('M1', { k1: 'v1' })
57
+ shellLogger.info('M2', { k2: 'v2' })
58
+ shellLogger.warning('M3', { k3: 'v3' })
59
+ shellLogger.error('M4', undefined, { k4: 'v4' })
60
+
61
+ expect(hostLogger.log).toHaveBeenCalledTimes(4)
62
+ expect(hostLogger.log).toHaveBeenNthCalledWith(1, 'debug', 'M1', undefined, { $ep: 'ep-1', k1: 'v1' })
63
+ expect(hostLogger.log).toHaveBeenNthCalledWith(2, 'info', 'M2', undefined, { $ep: 'ep-1', k2: 'v2' })
64
+ expect(hostLogger.log).toHaveBeenNthCalledWith(3, 'warning', 'M3', undefined, { $ep: 'ep-1', k3: 'v3' })
65
+ expect(hostLogger.log).toHaveBeenNthCalledWith(4, 'error', 'M4', undefined, { $ep: 'ep-1', k4: 'v4' })
66
+ })
67
+
68
+ it('should include entry point tags in key-value pairs', () => {
69
+ const { shellLogger, hostLogger } = setup({ t1: 'T1', t2: 'T2' })
70
+
71
+ shellLogger.debug('M1', { k1: 'v1' })
72
+ shellLogger.info('M2', { k2: 'v2' })
73
+ shellLogger.warning('M3', { k3: 'v3' })
74
+ shellLogger.error('M4', undefined, { k4: 'v4' })
75
+
76
+ expect(hostLogger.log).toHaveBeenCalledTimes(4)
77
+ expect(hostLogger.log).toHaveBeenNthCalledWith(1, 'debug', 'M1', undefined, { $ep: 'ep-1', k1: 'v1', t1: 'T1', t2: 'T2' })
78
+ expect(hostLogger.log).toHaveBeenNthCalledWith(2, 'info', 'M2', undefined, { $ep: 'ep-1', k2: 'v2', t1: 'T1', t2: 'T2' })
79
+ expect(hostLogger.log).toHaveBeenNthCalledWith(3, 'warning', 'M3', undefined, { $ep: 'ep-1', k3: 'v3', t1: 'T1', t2: 'T2' })
80
+ expect(hostLogger.log).toHaveBeenNthCalledWith(4, 'error', 'M4', undefined, { $ep: 'ep-1', k4: 'v4', t1: 'T1', t2: 'T2' })
81
+ })
82
+
83
+ it('should begin span', () => {
84
+ const { shellLogger, hostLogger } = setup({ t1: 'T1' })
85
+
86
+ const span = shellLogger.spanChild('M1', { k1: 'v1' })
87
+
88
+ expect(span).toBeDefined()
89
+ expect(hostLogger.spanChild).toHaveBeenCalledTimes(1)
90
+ expect(hostLogger.spanChild).toHaveBeenNthCalledWith(1, 'M1', { $ep: 'ep-1', k1: 'v1', t1: 'T1' })
91
+ })
92
+
93
+ it.skip('should monitor synchronous void function success', () => {
94
+ const { shellLogger, hostLogger } = setup({ t1: 'T1' })
95
+
96
+ shellLogger.monitor('M1', { k1: 'v1' }, () => {
97
+ shellLogger.debug('this-is-monitored-code')
98
+ })
99
+
100
+ expect(hostLogger.log).toHaveBeenCalledTimes(3)
101
+ expect(hostLogger.log).toHaveBeenNthCalledWith(1, 'span', 'M1', undefined, { $ep: 'ep-1', k1: 'v1', t1: 'T1' }, 'begin')
102
+ expect(hostLogger.log).toHaveBeenNthCalledWith(2, 'debug', 'this-is-monitored-code', undefined, { $ep: 'ep-1', t1: 'T1' })
103
+ expect(hostLogger.log).toHaveBeenNthCalledWith(
104
+ 3,
105
+ 'span',
106
+ 'M1',
107
+ {
108
+ $ep: 'ep-1',
109
+ k1: 'v1',
110
+ t1: 'T1',
111
+ success: true,
112
+ returnValue: undefined,
113
+ error: undefined
114
+ },
115
+ 'end'
116
+ )
117
+ })
118
+
119
+ it.skip('should monitor synchronous non-void function success', () => {
120
+ const { shellLogger, hostLogger } = setup({ t1: 'T1' })
121
+
122
+ const returnValue = shellLogger.monitor('M1', { k1: 'v1' }, () => {
123
+ shellLogger.debug('this-is-monitored-code')
124
+ return 123
125
+ })
126
+
127
+ expect(returnValue).toBe(123)
128
+ expect(hostLogger.log).toHaveBeenCalledTimes(3)
129
+ expect(hostLogger.log).toHaveBeenNthCalledWith(1, 'span', 'M1', undefined, { $ep: 'ep-1', k1: 'v1', t1: 'T1' }, 'begin')
130
+ expect(hostLogger.log).toHaveBeenNthCalledWith(2, 'debug', 'this-is-monitored-code', undefined, { $ep: 'ep-1', t1: 'T1' })
131
+ expect(hostLogger.log).toHaveBeenNthCalledWith(
132
+ 3,
133
+ 'span',
134
+ 'M1',
135
+ {
136
+ $ep: 'ep-1',
137
+ k1: 'v1',
138
+ t1: 'T1',
139
+ success: true,
140
+ returnValue: 123,
141
+ error: undefined
142
+ },
143
+ 'end'
144
+ )
145
+ })
146
+
147
+ it.skip('should monitor synchronous function that returns null', () => {
148
+ const { shellLogger, hostLogger } = setup({ t1: 'T1' })
149
+
150
+ const returnValue = shellLogger.monitor('M1', { k1: 'v1' }, () => {
151
+ shellLogger.debug('this-is-monitored-code')
152
+ return null
153
+ })
154
+
155
+ expect(returnValue).toBeNull()
156
+ expect(hostLogger.log).toHaveBeenCalledTimes(3)
157
+ expect(hostLogger.log).toHaveBeenNthCalledWith(1, 'span', 'M1', { $ep: 'ep-1', k1: 'v1', t1: 'T1' }, 'begin')
158
+ expect(hostLogger.log).toHaveBeenNthCalledWith(2, 'debug', 'this-is-monitored-code', { $ep: 'ep-1', t1: 'T1' })
159
+ expect(hostLogger.log).toHaveBeenNthCalledWith(
160
+ 3,
161
+ 'span',
162
+ 'M1',
163
+ {
164
+ $ep: 'ep-1',
165
+ k1: 'v1',
166
+ t1: 'T1',
167
+ success: true,
168
+ returnValue: null,
169
+ error: undefined
170
+ },
171
+ 'end'
172
+ )
173
+ })
174
+
175
+ it.skip('should monitor synchronous function failure', () => {
176
+ const { shellLogger, hostLogger } = setup({ t1: 'T1' })
177
+
178
+ expect(() => {
179
+ shellLogger.monitor('M1', { k1: 'v1' }, () => {
180
+ throw new Error('ERR1')
181
+ })
182
+ }).toThrowError('ERR1')
183
+
184
+ expect(hostLogger.log).toHaveBeenCalledTimes(2)
185
+ expect(hostLogger.log).toHaveBeenNthCalledWith(1, 'span', 'M1', { $ep: 'ep-1', k1: 'v1', t1: 'T1' }, 'begin')
186
+ expect(hostLogger.log).toHaveBeenNthCalledWith(
187
+ 2,
188
+ 'span',
189
+ 'M1',
190
+ {
191
+ $ep: 'ep-1',
192
+ k1: 'v1',
193
+ t1: 'T1',
194
+ success: false,
195
+ returnValue: undefined,
196
+ error: new Error('ERR1')
197
+ },
198
+ 'end'
199
+ )
200
+ })
201
+
202
+ it.skip('should monitor async void function success', async () => {
203
+ const { shellLogger, hostLogger } = setup({ t1: 'T1' })
204
+
205
+ await shellLogger.monitor('M1', { k1: 'v1' }, async () => {
206
+ await delay(10)
207
+ shellLogger.debug('this-is-monitored-code')
208
+ })
209
+
210
+ expect(hostLogger.log).toHaveBeenCalledTimes(3)
211
+ expect(hostLogger.log).toHaveBeenNthCalledWith(1, 'span', 'M1', { $ep: 'ep-1', k1: 'v1', t1: 'T1' }, 'begin')
212
+ expect(hostLogger.log).toHaveBeenNthCalledWith(2, 'debug', 'this-is-monitored-code', { $ep: 'ep-1', t1: 'T1' })
213
+ expect(hostLogger.log).toHaveBeenNthCalledWith(
214
+ 3,
215
+ 'span',
216
+ 'M1',
217
+ {
218
+ $ep: 'ep-1',
219
+ k1: 'v1',
220
+ t1: 'T1',
221
+ success: true,
222
+ returnValue: undefined,
223
+ error: undefined
224
+ },
225
+ 'end'
226
+ )
227
+ })
228
+
229
+ it.skip('should monitor async non-void function success', async () => {
230
+ const { shellLogger, hostLogger } = setup({ t1: 'T1' })
231
+
232
+ const returnValue = await shellLogger.monitor('M1', { k1: 'v1' }, async () => {
233
+ shellLogger.debug('this-is-monitored-code')
234
+ await delay(10)
235
+ return 123
236
+ })
237
+
238
+ expect(returnValue).toBe(123)
239
+ expect(hostLogger.log).toHaveBeenCalledTimes(3)
240
+ expect(hostLogger.log).toHaveBeenNthCalledWith(1, 'span', 'M1', { $ep: 'ep-1', k1: 'v1', t1: 'T1' }, 'begin')
241
+ expect(hostLogger.log).toHaveBeenNthCalledWith(2, 'debug', 'this-is-monitored-code', { $ep: 'ep-1', t1: 'T1' })
242
+ expect(hostLogger.log).toHaveBeenNthCalledWith(
243
+ 3,
244
+ 'span',
245
+ 'M1',
246
+ {
247
+ $ep: 'ep-1',
248
+ k1: 'v1',
249
+ t1: 'T1',
250
+ success: true,
251
+ returnValue: 123,
252
+ error: undefined
253
+ },
254
+ 'end'
255
+ )
256
+ })
257
+
258
+ it.skip('should monitor async function failure', async () => {
259
+ const { shellLogger, hostLogger } = setup({ t1: 'T1' })
260
+
261
+ try {
262
+ await shellLogger.monitor('M1', { k1: 'v1' }, async () => {
263
+ await delay(10)
264
+ throw new Error('ERR1')
265
+ })
266
+ fail('expected to throw, but did not')
267
+ } catch (err) {
268
+ expect(err.message).toBe('ERR1')
269
+ }
270
+
271
+ expect(hostLogger.log).toHaveBeenCalledTimes(2)
272
+ expect(hostLogger.log).toHaveBeenNthCalledWith(1, 'span', 'M1', { $ep: 'ep-1', k1: 'v1', t1: 'T1' }, 'begin')
273
+ expect(hostLogger.log).toHaveBeenNthCalledWith(
274
+ 2,
275
+ 'span',
276
+ 'M1',
277
+ {
278
+ $ep: 'ep-1',
279
+ k1: 'v1',
280
+ t1: 'T1',
281
+ success: false,
282
+ returnValue: undefined,
283
+ error: new Error('ERR1')
284
+ },
285
+ 'end'
286
+ )
287
+ })
288
+ })
@@ -0,0 +1,118 @@
1
+ import { createAppHost } from '../src'
2
+
3
+ const unreadAPI = { name: 'unreadyAPI' }
4
+
5
+ const getUnreadyAPIs = async () => {
6
+ await new Promise(resolve => setTimeout(resolve, 0))
7
+ return globalThis.repluggableAppDebug.utils.getRootUnreadyAPI()
8
+ }
9
+
10
+ describe('RepluggableAppDebug', () => {
11
+ describe('getRootUnreadyAPI', () => {
12
+ it('should not report any issues in case there are no entry points', async () => {
13
+ createAppHost([])
14
+
15
+ const unreadyAPIs = await getUnreadyAPIs()
16
+
17
+ expect(unreadyAPIs).toEqual([])
18
+ })
19
+
20
+ it('should not report any issues in case all entry points are loaded', async () => {
21
+ createAppHost([
22
+ {
23
+ name: 'entryPoint',
24
+ declareAPIs: () => []
25
+ }
26
+ ])
27
+
28
+ const unreadyAPIs = await getUnreadyAPIs()
29
+
30
+ expect(unreadyAPIs).toEqual([])
31
+ })
32
+
33
+ it('should return an API if its not ready', async () => {
34
+ createAppHost([
35
+ {
36
+ name: 'entryPoint',
37
+ getDependencyAPIs: () => [unreadAPI]
38
+ }
39
+ ])
40
+
41
+ const unreadyAPIs = await getUnreadyAPIs()
42
+
43
+ expect(unreadyAPIs).toEqual([{ name: 'unreadyAPI' }])
44
+ })
45
+
46
+ it('should return the root unready API when there are multiple entry points that depend on the same API', async () => {
47
+ createAppHost([
48
+ {
49
+ name: 'entryPoint A',
50
+ getDependencyAPIs: () => [unreadAPI]
51
+ },
52
+ {
53
+ name: 'entryPoint B',
54
+ getDependencyAPIs: () => [unreadAPI]
55
+ },
56
+ {
57
+ name: 'entryPoint C',
58
+ getDependencyAPIs: () => [unreadAPI]
59
+ }
60
+ ])
61
+
62
+ const unreadyAPIs = await getUnreadyAPIs()
63
+
64
+ expect(unreadyAPIs).toEqual([{ name: 'unreadyAPI' }])
65
+ })
66
+
67
+ it('should return the root unready API when there is a graph of dependencies', async () => {
68
+ createAppHost([
69
+ {
70
+ name: 'entryPoint A',
71
+ declareAPIs: () => [{ name: 'API A' }],
72
+ getDependencyAPIs: () => [{ name: 'API B' }]
73
+ },
74
+ {
75
+ name: 'entryPoint B',
76
+ declareAPIs: () => [{ name: 'API B' }],
77
+ getDependencyAPIs: () => [{ name: 'API C' }]
78
+ },
79
+ {
80
+ name: 'entryPoint C',
81
+ declareAPIs: () => [{ name: 'API C' }],
82
+ getDependencyAPIs: () => [unreadAPI]
83
+ }
84
+ ])
85
+
86
+ const unreadyAPIs = await getUnreadyAPIs()
87
+
88
+ expect(unreadyAPIs).toEqual([{ name: 'unreadyAPI' }, { name: 'API C' }, { name: 'API B' }])
89
+ })
90
+
91
+ it('should return the root unready API when there is a graph of dependencies (declation order is reversed)', async () => {
92
+ createAppHost(
93
+ [
94
+ {
95
+ name: 'entryPoint A',
96
+ declareAPIs: () => [{ name: 'API A' }],
97
+ getDependencyAPIs: () => [{ name: 'API B' }]
98
+ },
99
+ {
100
+ name: 'entryPoint B',
101
+ declareAPIs: () => [{ name: 'API B' }],
102
+ getDependencyAPIs: () => [{ name: 'API C' }]
103
+ },
104
+ {
105
+ name: 'entryPoint C',
106
+ declareAPIs: () => [{ name: 'API C' }],
107
+ getDependencyAPIs: () => [unreadAPI]
108
+ }
109
+ ].reverse()
110
+ )
111
+
112
+ const unreadyAPIs = await getUnreadyAPIs()
113
+ // because we take the first unready entry point, and in this case its the root,
114
+ // we don't get the rest of the unready APIs
115
+ expect(unreadyAPIs).toEqual([{ name: 'unreadyAPI' }])
116
+ })
117
+ })
118
+ })