repluggable-core 1.302.66 → 1.302.68

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 (315) hide show
  1. package/__tests__/spec-setup.js +3 -0
  2. package/debug/index.ts +1 -0
  3. package/dist/debug/debug/index.d.ts +1 -0
  4. package/dist/{es → debug/src}/API.d.ts +46 -9
  5. package/dist/debug/src/__internal.d.ts +4 -0
  6. package/dist/debug/src/appHostServices.d.ts +11 -0
  7. package/dist/debug/src/extensionSlot.d.ts +7 -0
  8. package/dist/debug/src/hot.d.ts +13 -0
  9. package/dist/debug/src/installedShellsState.d.ts +18 -0
  10. package/dist/debug/src/interceptAnyObject.d.ts +6 -0
  11. package/dist/debug/src/invokeSlotCallbacks.d.ts +2 -0
  12. package/dist/debug/src/throttledStore.d.ts +31 -0
  13. package/dist/es/src/API.d.ts +509 -0
  14. package/dist/es/src/API.d.ts.map +1 -0
  15. package/dist/es/src/API.js +3 -0
  16. package/dist/es/src/API.js.map +1 -0
  17. package/dist/es/src/IterableWeakMap.d.ts +20 -0
  18. package/dist/es/src/IterableWeakMap.d.ts.map +1 -0
  19. package/dist/es/src/IterableWeakMap.js +92 -0
  20. package/dist/es/src/IterableWeakMap.js.map +1 -0
  21. package/dist/es/src/__internal.d.ts.map +1 -0
  22. package/dist/es/src/__internal.js +5 -0
  23. package/dist/es/src/__internal.js.map +1 -0
  24. package/dist/es/src/appHost.d.ts +7 -0
  25. package/dist/es/src/appHost.d.ts.map +1 -0
  26. package/dist/es/src/appHost.js +898 -0
  27. package/dist/es/src/appHost.js.map +1 -0
  28. package/dist/es/src/appHostServices.d.ts +12 -0
  29. package/dist/es/src/appHostServices.d.ts.map +1 -0
  30. package/dist/es/src/appHostServices.js +25 -0
  31. package/dist/es/src/appHostServices.js.map +1 -0
  32. package/dist/es/src/appHostUtils.d.ts +4 -0
  33. package/dist/es/src/appHostUtils.d.ts.map +1 -0
  34. package/dist/es/src/appHostUtils.js +8 -0
  35. package/dist/es/src/appHostUtils.js.map +1 -0
  36. package/dist/es/src/extensionSlot.d.ts +8 -0
  37. package/dist/es/src/extensionSlot.d.ts.map +1 -0
  38. package/dist/es/src/extensionSlot.js +59 -0
  39. package/dist/es/src/extensionSlot.js.map +1 -0
  40. package/dist/es/src/hot.d.ts +14 -0
  41. package/dist/es/src/hot.d.ts.map +1 -0
  42. package/dist/es/src/hot.js +52 -0
  43. package/dist/es/src/hot.js.map +1 -0
  44. package/dist/es/src/index.d.ts +11 -0
  45. package/dist/es/src/index.d.ts.map +1 -0
  46. package/dist/es/src/index.js +10 -0
  47. package/dist/es/src/index.js.map +1 -0
  48. package/dist/es/src/installedShellsState.d.ts +19 -0
  49. package/dist/es/src/installedShellsState.d.ts.map +1 -0
  50. package/dist/es/src/installedShellsState.js +30 -0
  51. package/dist/es/src/installedShellsState.js.map +1 -0
  52. package/dist/es/src/interceptAnyObject.d.ts +7 -0
  53. package/dist/es/src/interceptAnyObject.d.ts.map +1 -0
  54. package/dist/es/src/interceptAnyObject.js +21 -0
  55. package/dist/es/src/interceptAnyObject.js.map +1 -0
  56. package/dist/es/src/invokeSlotCallbacks.d.ts +3 -0
  57. package/dist/es/src/invokeSlotCallbacks.d.ts.map +1 -0
  58. package/dist/es/src/invokeSlotCallbacks.js +20 -0
  59. package/dist/es/src/invokeSlotCallbacks.js.map +1 -0
  60. package/dist/es/src/loggers.d.ts +4 -0
  61. package/dist/es/src/loggers.d.ts.map +1 -0
  62. package/dist/es/src/loggers.js +100 -0
  63. package/dist/es/src/loggers.js.map +1 -0
  64. package/dist/es/src/monitorAPI.d.ts +3 -0
  65. package/dist/es/src/monitorAPI.d.ts.map +1 -0
  66. package/dist/es/src/monitorAPI.js +53 -0
  67. package/dist/es/src/monitorAPI.js.map +1 -0
  68. package/dist/es/src/repluggableAppDebug/index.d.ts +2 -0
  69. package/dist/es/src/repluggableAppDebug/index.d.ts.map +1 -0
  70. package/dist/es/src/repluggableAppDebug/index.js +2 -0
  71. package/dist/es/src/repluggableAppDebug/index.js.map +1 -0
  72. package/dist/es/src/repluggableAppDebug/performanceDebugInfo.d.ts +15 -0
  73. package/dist/es/src/repluggableAppDebug/performanceDebugInfo.d.ts.map +1 -0
  74. package/dist/es/src/repluggableAppDebug/performanceDebugInfo.js +94 -0
  75. package/dist/es/src/repluggableAppDebug/performanceDebugInfo.js.map +1 -0
  76. package/dist/es/src/repluggableAppDebug/repluggableAppDebug.d.ts +24 -0
  77. package/dist/es/src/repluggableAppDebug/repluggableAppDebug.d.ts.map +1 -0
  78. package/dist/es/src/repluggableAppDebug/repluggableAppDebug.js +132 -0
  79. package/dist/es/src/repluggableAppDebug/repluggableAppDebug.js.map +1 -0
  80. package/dist/es/src/tarjanGraph.d.ts +27 -0
  81. package/dist/es/src/tarjanGraph.d.ts.map +1 -0
  82. package/dist/es/src/tarjanGraph.js +94 -0
  83. package/dist/es/src/tarjanGraph.js.map +1 -0
  84. package/dist/es/src/throttledStore.d.ts +32 -0
  85. package/dist/es/src/throttledStore.d.ts.map +1 -0
  86. package/dist/es/src/throttledStore.js +240 -0
  87. package/dist/es/src/throttledStore.js.map +1 -0
  88. package/dist/es/test/IterableWeakMap.spec.d.ts +2 -0
  89. package/dist/es/test/IterableWeakMap.spec.d.ts.map +1 -0
  90. package/dist/es/test/IterableWeakMap.spec.js +218 -0
  91. package/dist/es/test/IterableWeakMap.spec.js.map +1 -0
  92. package/dist/es/test/appHost.mock.d.ts +4 -0
  93. package/dist/es/test/appHost.mock.d.ts.map +1 -0
  94. package/dist/es/test/appHost.mock.js +54 -0
  95. package/dist/es/test/appHost.mock.js.map +1 -0
  96. package/dist/es/test/appHost.spec.d.ts +2 -0
  97. package/dist/es/test/appHost.spec.d.ts.map +1 -0
  98. package/dist/es/test/appHost.spec.js +1451 -0
  99. package/dist/es/test/appHost.spec.js.map +1 -0
  100. package/dist/es/test/installedShellsState.spec.d.ts +2 -0
  101. package/dist/es/test/installedShellsState.spec.d.ts.map +1 -0
  102. package/dist/es/test/installedShellsState.spec.js +28 -0
  103. package/dist/es/test/installedShellsState.spec.js.map +1 -0
  104. package/dist/es/test/interceptAnyObject.spec.d.ts +2 -0
  105. package/dist/es/test/interceptAnyObject.spec.d.ts.map +1 -0
  106. package/dist/es/test/interceptAnyObject.spec.js +166 -0
  107. package/dist/es/test/interceptAnyObject.spec.js.map +1 -0
  108. package/dist/es/test/loggers.spec.d.ts +2 -0
  109. package/dist/es/test/loggers.spec.d.ts.map +1 -0
  110. package/dist/es/test/loggers.spec.js +218 -0
  111. package/dist/es/test/loggers.spec.js.map +1 -0
  112. package/dist/es/test/repluggableAppDebug.spec.d.ts +2 -0
  113. package/dist/es/test/repluggableAppDebug.spec.d.ts.map +1 -0
  114. package/dist/es/test/repluggableAppDebug.spec.js +107 -0
  115. package/dist/es/test/repluggableAppDebug.spec.js.map +1 -0
  116. package/dist/es/test/testKit.spec.d.ts +2 -0
  117. package/dist/es/test/testKit.spec.d.ts.map +1 -0
  118. package/dist/es/test/testKit.spec.js +129 -0
  119. package/dist/es/test/testKit.spec.js.map +1 -0
  120. package/dist/es/testKit/emptyLoggerOptions.d.ts +3 -0
  121. package/dist/es/testKit/emptyLoggerOptions.d.ts.map +1 -0
  122. package/dist/es/testKit/emptyLoggerOptions.js +15 -0
  123. package/dist/es/testKit/emptyLoggerOptions.js.map +1 -0
  124. package/dist/es/testKit/index.d.ts +27 -0
  125. package/dist/es/testKit/index.d.ts.map +1 -0
  126. package/dist/es/testKit/index.js +132 -0
  127. package/dist/es/testKit/index.js.map +1 -0
  128. package/dist/es/testKit/mockPackage.d.ts +23 -0
  129. package/dist/es/testKit/mockPackage.d.ts.map +1 -0
  130. package/dist/es/testKit/mockPackage.js +95 -0
  131. package/dist/es/testKit/mockPackage.js.map +1 -0
  132. package/dist/es/testKit/withConsoleErrors.d.ts +2 -0
  133. package/dist/es/testKit/withConsoleErrors.d.ts.map +1 -0
  134. package/dist/es/testKit/withConsoleErrors.js +12 -0
  135. package/dist/es/testKit/withConsoleErrors.js.map +1 -0
  136. package/dist/es/testKit/withThrowOnError.d.ts +3 -0
  137. package/dist/es/testKit/withThrowOnError.d.ts.map +1 -0
  138. package/dist/es/testKit/withThrowOnError.js +27 -0
  139. package/dist/es/testKit/withThrowOnError.js.map +1 -0
  140. package/dist/src/API.d.ts +46 -8
  141. package/dist/src/API.d.ts.map +1 -1
  142. package/dist/src/API.js +4 -0
  143. package/dist/src/API.js.map +1 -1
  144. package/dist/src/IterableWeakMap.d.ts +20 -0
  145. package/dist/src/IterableWeakMap.d.ts.map +1 -0
  146. package/dist/src/IterableWeakMap.js +96 -0
  147. package/dist/src/IterableWeakMap.js.map +1 -0
  148. package/dist/src/__internal.d.ts.map +1 -1
  149. package/dist/src/__internal.js +1 -1
  150. package/dist/src/__internal.js.map +1 -1
  151. package/dist/src/appHost.d.ts +7 -0
  152. package/dist/src/appHost.d.ts.map +1 -0
  153. package/dist/src/appHost.js +906 -0
  154. package/dist/src/appHost.js.map +1 -0
  155. package/dist/src/appHostServices.d.ts +12 -0
  156. package/dist/src/appHostServices.d.ts.map +1 -0
  157. package/dist/src/appHostServices.js +29 -0
  158. package/dist/src/appHostServices.js.map +1 -0
  159. package/dist/src/appHostUtils.d.ts +4 -0
  160. package/dist/src/appHostUtils.d.ts.map +1 -0
  161. package/dist/src/appHostUtils.js +16 -0
  162. package/dist/src/appHostUtils.js.map +1 -0
  163. package/dist/src/extensionSlot.d.ts +8 -0
  164. package/dist/src/extensionSlot.d.ts.map +1 -0
  165. package/dist/src/extensionSlot.js +67 -0
  166. package/dist/src/extensionSlot.js.map +1 -0
  167. package/dist/src/hot.d.ts +14 -0
  168. package/dist/src/hot.d.ts.map +1 -0
  169. package/dist/src/hot.js +56 -0
  170. package/dist/src/hot.js.map +1 -0
  171. package/dist/src/index.d.ts +10 -2
  172. package/dist/src/index.d.ts.map +1 -1
  173. package/dist/src/index.js +22 -15
  174. package/dist/src/index.js.map +1 -1
  175. package/dist/src/installedShellsState.d.ts +19 -0
  176. package/dist/src/installedShellsState.d.ts.map +1 -0
  177. package/dist/src/installedShellsState.js +38 -0
  178. package/dist/src/installedShellsState.js.map +1 -0
  179. package/dist/src/interceptAnyObject.d.ts +7 -0
  180. package/dist/src/interceptAnyObject.d.ts.map +1 -0
  181. package/dist/src/interceptAnyObject.js +28 -0
  182. package/dist/src/interceptAnyObject.js.map +1 -0
  183. package/dist/src/invokeSlotCallbacks.d.ts +3 -0
  184. package/dist/src/invokeSlotCallbacks.d.ts.map +1 -0
  185. package/dist/src/invokeSlotCallbacks.js +24 -0
  186. package/dist/src/invokeSlotCallbacks.js.map +1 -0
  187. package/dist/src/loggers.d.ts +4 -0
  188. package/dist/src/loggers.d.ts.map +1 -0
  189. package/dist/src/loggers.js +104 -0
  190. package/dist/src/loggers.js.map +1 -0
  191. package/dist/src/monitorAPI.d.ts +3 -0
  192. package/dist/src/monitorAPI.d.ts.map +1 -0
  193. package/dist/src/monitorAPI.js +57 -0
  194. package/dist/src/monitorAPI.js.map +1 -0
  195. package/dist/src/repluggableAppDebug/index.d.ts +2 -0
  196. package/dist/src/repluggableAppDebug/index.d.ts.map +1 -0
  197. package/dist/src/repluggableAppDebug/index.js +6 -0
  198. package/dist/src/repluggableAppDebug/index.js.map +1 -0
  199. package/dist/src/repluggableAppDebug/performanceDebugInfo.d.ts +15 -0
  200. package/dist/src/repluggableAppDebug/performanceDebugInfo.d.ts.map +1 -0
  201. package/dist/src/repluggableAppDebug/performanceDebugInfo.js +101 -0
  202. package/dist/src/repluggableAppDebug/performanceDebugInfo.js.map +1 -0
  203. package/dist/src/repluggableAppDebug/repluggableAppDebug.d.ts +24 -0
  204. package/dist/src/repluggableAppDebug/repluggableAppDebug.d.ts.map +1 -0
  205. package/dist/src/repluggableAppDebug/repluggableAppDebug.js +139 -0
  206. package/dist/src/repluggableAppDebug/repluggableAppDebug.js.map +1 -0
  207. package/dist/src/tarjanGraph.d.ts +27 -0
  208. package/dist/src/tarjanGraph.d.ts.map +1 -0
  209. package/dist/src/tarjanGraph.js +100 -0
  210. package/dist/src/tarjanGraph.js.map +1 -0
  211. package/dist/src/throttledStore.d.ts +32 -0
  212. package/dist/src/throttledStore.d.ts.map +1 -0
  213. package/dist/src/throttledStore.js +249 -0
  214. package/dist/src/throttledStore.js.map +1 -0
  215. package/dist/test/IterableWeakMap.spec.d.ts +2 -0
  216. package/dist/test/IterableWeakMap.spec.d.ts.map +1 -0
  217. package/dist/test/IterableWeakMap.spec.js +220 -0
  218. package/dist/test/IterableWeakMap.spec.js.map +1 -0
  219. package/dist/test/appHost.mock.d.ts +4 -0
  220. package/dist/test/appHost.mock.d.ts.map +1 -0
  221. package/dist/test/appHost.mock.js +59 -0
  222. package/dist/test/appHost.mock.js.map +1 -0
  223. package/dist/test/appHost.spec.d.ts +2 -0
  224. package/dist/test/appHost.spec.d.ts.map +1 -0
  225. package/dist/test/appHost.spec.js +1456 -0
  226. package/dist/test/appHost.spec.js.map +1 -0
  227. package/dist/test/installedShellsState.spec.d.ts +2 -0
  228. package/dist/test/installedShellsState.spec.d.ts.map +1 -0
  229. package/dist/test/installedShellsState.spec.js +30 -0
  230. package/dist/test/installedShellsState.spec.js.map +1 -0
  231. package/dist/test/interceptAnyObject.spec.d.ts +2 -0
  232. package/dist/test/interceptAnyObject.spec.d.ts.map +1 -0
  233. package/dist/test/interceptAnyObject.spec.js +171 -0
  234. package/dist/test/interceptAnyObject.spec.js.map +1 -0
  235. package/dist/test/loggers.spec.d.ts +2 -0
  236. package/dist/test/loggers.spec.d.ts.map +1 -0
  237. package/dist/test/loggers.spec.js +220 -0
  238. package/dist/test/loggers.spec.js.map +1 -0
  239. package/dist/test/repluggableAppDebug.spec.d.ts +2 -0
  240. package/dist/test/repluggableAppDebug.spec.d.ts.map +1 -0
  241. package/dist/test/repluggableAppDebug.spec.js +109 -0
  242. package/dist/test/repluggableAppDebug.spec.js.map +1 -0
  243. package/dist/test/testKit.spec.d.ts +2 -0
  244. package/dist/test/testKit.spec.d.ts.map +1 -0
  245. package/dist/test/testKit.spec.js +134 -0
  246. package/dist/test/testKit.spec.js.map +1 -0
  247. package/dist/testKit/emptyLoggerOptions.d.ts +3 -0
  248. package/dist/testKit/emptyLoggerOptions.d.ts.map +1 -0
  249. package/dist/testKit/emptyLoggerOptions.js +18 -0
  250. package/dist/testKit/emptyLoggerOptions.js.map +1 -0
  251. package/dist/testKit/index.d.ts +27 -0
  252. package/dist/testKit/index.d.ts.map +1 -0
  253. package/dist/testKit/index.js +160 -0
  254. package/dist/testKit/index.js.map +1 -0
  255. package/dist/testKit/mockPackage.d.ts +23 -0
  256. package/dist/testKit/mockPackage.d.ts.map +1 -0
  257. package/dist/testKit/mockPackage.js +101 -0
  258. package/dist/testKit/mockPackage.js.map +1 -0
  259. package/dist/testKit/withConsoleErrors.d.ts +2 -0
  260. package/dist/testKit/withConsoleErrors.d.ts.map +1 -0
  261. package/dist/testKit/withConsoleErrors.js +16 -0
  262. package/dist/testKit/withConsoleErrors.js.map +1 -0
  263. package/dist/testKit/withThrowOnError.d.ts +3 -0
  264. package/dist/testKit/withThrowOnError.d.ts.map +1 -0
  265. package/dist/testKit/withThrowOnError.js +31 -0
  266. package/dist/testKit/withThrowOnError.js.map +1 -0
  267. package/jest.config.js +16 -0
  268. package/package.json +23 -4
  269. package/src/API.ts +47 -9
  270. package/src/IterableWeakMap.ts +123 -0
  271. package/src/__internal.ts +1 -1
  272. package/src/appHost.ts +1222 -0
  273. package/src/appHostServices.ts +42 -0
  274. package/src/appHostUtils.ts +11 -0
  275. package/src/extensionSlot.ts +96 -0
  276. package/src/hot.ts +53 -0
  277. package/src/index.ts +42 -2
  278. package/src/installedShellsState.ts +54 -0
  279. package/src/interceptAnyObject.ts +39 -0
  280. package/src/invokeSlotCallbacks.ts +20 -0
  281. package/src/loggers.ts +112 -0
  282. package/src/monitorAPI.ts +71 -0
  283. package/src/repluggableAppDebug/debug.d.ts +37 -0
  284. package/src/repluggableAppDebug/index.ts +1 -0
  285. package/src/repluggableAppDebug/performanceDebugInfo.ts +96 -0
  286. package/src/repluggableAppDebug/repluggableAppDebug.ts +192 -0
  287. package/src/tarjanGraph.ts +96 -0
  288. package/src/throttledStore.ts +355 -0
  289. package/test/IterableWeakMap.spec.ts +280 -0
  290. package/test/appHost.mock.ts +58 -0
  291. package/test/appHost.spec.ts +1765 -0
  292. package/test/installedShellsState.spec.ts +39 -0
  293. package/test/interceptAnyObject.spec.ts +217 -0
  294. package/test/loggers.spec.ts +288 -0
  295. package/test/repluggableAppDebug.spec.ts +118 -0
  296. package/test/testKit.spec.tsx +153 -0
  297. package/testKit/emptyLoggerOptions.ts +16 -0
  298. package/testKit/index.ts +170 -0
  299. package/testKit/mockPackage.ts +110 -0
  300. package/testKit/package.json +3 -0
  301. package/testKit/withConsoleErrors.ts +12 -0
  302. package/testKit/withThrowOnError.ts +34 -0
  303. package/tsconfig.debug.json +11 -0
  304. package/tsconfig.json +9 -2
  305. package/dist/es/API.d.ts.map +0 -1
  306. package/dist/es/API.js +0 -2
  307. package/dist/es/API.js.map +0 -1
  308. package/dist/es/__internal.d.ts.map +0 -1
  309. package/dist/es/__internal.js +0 -5
  310. package/dist/es/__internal.js.map +0 -1
  311. package/dist/es/index.d.ts +0 -3
  312. package/dist/es/index.d.ts.map +0 -1
  313. package/dist/es/index.js +0 -2
  314. package/dist/es/index.js.map +0 -1
  315. /package/dist/es/{__internal.d.ts → src/__internal.d.ts} +0 -0
@@ -0,0 +1,42 @@
1
+ import { AppHostOptions, EntryPoint, Shell, SlotKey } from './API'
2
+
3
+ export interface AppHostAPI {
4
+ getAllEntryPoints(): EntryPoint[]
5
+ getAppHostOptions(): AppHostOptions
6
+ }
7
+
8
+ export const AppHostServicesEntryPointName = 'APP-HOST-SERVICES'
9
+
10
+ export const AppHostAPI: SlotKey<AppHostAPI> = {
11
+ name: 'AppHost API',
12
+ public: true
13
+ }
14
+
15
+ export interface AppHostServicesProvider {
16
+ getAppHostServicesShell(): Shell
17
+ }
18
+
19
+ export function createAppHostServicesEntryPoint(apiFactory: () => AppHostAPI): EntryPoint & AppHostServicesProvider {
20
+ let cachedShell: Shell | null = null
21
+
22
+ return {
23
+ name: AppHostServicesEntryPointName,
24
+
25
+ declareAPIs() {
26
+ return [AppHostAPI]
27
+ },
28
+
29
+ attach(shell: Shell) {
30
+ cachedShell = shell
31
+ shell.contributeAPI(AppHostAPI, apiFactory)
32
+ },
33
+
34
+ getAppHostServicesShell() {
35
+ if (cachedShell) {
36
+ return cachedShell
37
+ }
38
+
39
+ throw new Error('Shell for AppHostServices entry point was not yet created')
40
+ }
41
+ }
42
+ }
@@ -0,0 +1,11 @@
1
+ import { AnyEntryPoint, AnySlotKey } from './API'
2
+
3
+ import _ from 'lodash'
4
+
5
+ export const dependentAPIs = (entryPoint: AnyEntryPoint): AnySlotKey[] => {
6
+ return _.chain(entryPoint).invoke('getDependencyAPIs').defaultTo([]).value()
7
+ }
8
+
9
+ export const declaredAPIs = (entryPoint: AnyEntryPoint): AnySlotKey[] => {
10
+ return _.chain(entryPoint).invoke('declareAPIs').defaultTo([]).value()
11
+ }
@@ -0,0 +1,96 @@
1
+ import {
2
+ AppHost,
3
+ ContributionPredicate,
4
+ ExtensionItem,
5
+ ExtensionItemFilter,
6
+ PrivateExtensionSlot,
7
+ Shell,
8
+ SlotKey,
9
+ CustomExtensionSlot,
10
+ CustomExtensionSlotHandler,
11
+ PrivateAppHost
12
+ } from './API'
13
+ import _ from 'lodash'
14
+
15
+ export interface AnyExtensionSlot {
16
+ readonly name: string
17
+ readonly declaringShell?: Shell
18
+ }
19
+
20
+ const alwaysTrue = () => true
21
+
22
+ type Unsubscribe = () => void
23
+
24
+ export function createExtensionSlot<T>(
25
+ key: SlotKey<T>,
26
+ host: PrivateAppHost,
27
+ declaringShell?: Shell
28
+ ): PrivateExtensionSlot<T> & AnyExtensionSlot {
29
+ let items: ExtensionItem<T>[] = []
30
+ let subscribers: (() => void)[] = []
31
+ const slotUniqueId = _.uniqueId()
32
+
33
+ return {
34
+ host,
35
+ declaringShell,
36
+ name: key.name,
37
+ contribute,
38
+ getItems,
39
+ getSingleItem,
40
+ getItemByName,
41
+ discardBy,
42
+ subscribe
43
+ }
44
+
45
+ function contribute(fromShell: Shell, item: T, condition?: ContributionPredicate): void {
46
+ items.push({
47
+ shell: fromShell,
48
+ contribution: item,
49
+ condition: condition || alwaysTrue,
50
+ uniqueId: _.uniqueId(`${fromShell.name}_extItem_`)
51
+ })
52
+ host.executeWhenFree(slotUniqueId, () => subscribers.forEach(func => func()))
53
+ }
54
+
55
+ function getItems(forceAll: boolean = false): ExtensionItem<T>[] {
56
+ return forceAll ? items : items.filter(item => item.condition())
57
+ }
58
+
59
+ function getSingleItem(): ExtensionItem<T> | undefined {
60
+ return items.find(item => item.condition())
61
+ }
62
+
63
+ function getItemByName(name: string): ExtensionItem<T> | undefined {
64
+ return items.find(item => item.name === name && item.condition())
65
+ }
66
+
67
+ function discardBy(predicate: ExtensionItemFilter<T>) {
68
+ const originalContributionCount = items.length
69
+ items = items.filter(v => !predicate(v))
70
+ if (items.length !== originalContributionCount) {
71
+ subscribers.forEach(func => func())
72
+ }
73
+ }
74
+
75
+ function subscribe(callback: () => void): Unsubscribe {
76
+ subscribers.push(callback)
77
+ return () => {
78
+ subscribers = subscribers.filter(func => func !== callback)
79
+ }
80
+ }
81
+ }
82
+
83
+ export function createCustomExtensionSlot<T>(
84
+ key: SlotKey<T>,
85
+ handler: CustomExtensionSlotHandler<T>,
86
+ host: AppHost,
87
+ declaringShell?: Shell
88
+ ): CustomExtensionSlot<T> & AnyExtensionSlot {
89
+ return {
90
+ name: key.name,
91
+ host,
92
+ declaringShell,
93
+ contribute: (...args) => handler.contribute(...args),
94
+ discardBy: (...args) => handler.discardBy(...args)
95
+ }
96
+ }
package/src/hot.ts ADDED
@@ -0,0 +1,53 @@
1
+ import { AppHost, EntryPoint } from './API'
2
+
3
+ export type Hot = typeof hot
4
+
5
+ /**
6
+ * To enable HMR, use the `hot` util to wrap the export of your repluggable package
7
+ *
8
+ * @param {NodeModule} sourceModule
9
+ * @param {EntryPoint[]} entryPoints
10
+ * @param {AppHost} [host] Optional. The AppHost to be used for removing / adding entrypoints. If not provided, `window.repluggableAppDebug.host` will be used,
11
+ * @example ```ts
12
+ * export default hot(module, [FooEntryPoint, BarEntryPoint])
13
+ * ```
14
+ */
15
+ export function hot(sourceModule: any, entryPoints: EntryPoint[], host?: AppHost) {
16
+ if (!sourceModule.hot) {
17
+ return entryPoints
18
+ }
19
+
20
+ const getHostInstance = () => {
21
+ const hostInstance = host ?? globalThis.repluggableAppDebug?.host
22
+ if (!hostInstance) {
23
+ console.error(
24
+ `HMR error: cannot find host object.\n` +
25
+ `hot(...) was called without the optional host parameter, and the fallback globalThis.repluggableAppDebug.host doesn't exist`
26
+ )
27
+ }
28
+
29
+ return hostInstance
30
+ }
31
+
32
+ const shellNames = entryPoints.map(x => x.name)
33
+ const shortModuleId = sourceModule.id.split('/').pop()
34
+
35
+ sourceModule.hot.accept()
36
+ sourceModule.hot.dispose(async () => {
37
+ const hostInstance = getHostInstance()
38
+ if (hostInstance) {
39
+ console.debug(`----- HMR[${shortModuleId}] > REMOVING SHELLS >`, shellNames)
40
+ await hostInstance.removeShells(shellNames)
41
+ }
42
+ })
43
+
44
+ if (sourceModule.hot.status() === 'apply') {
45
+ const hostInstance = getHostInstance()
46
+ if (hostInstance) {
47
+ console.debug(`----- HMR[${shortModuleId}] > ADDING SHELLS >`, shellNames)
48
+ hostInstance.addShells(entryPoints)
49
+ }
50
+ }
51
+
52
+ return entryPoints
53
+ }
package/src/index.ts CHANGED
@@ -1,6 +1,46 @@
1
1
  export {
2
+ EntryPointOrPackage,
3
+ EntryPointOrPackagesMap,
4
+ EntryPoint,
5
+ AppHost,
6
+ AppHostAPI,
7
+ AppHostOptions,
8
+ Shell,
9
+ ExtensionSlot,
10
+ ExtensionItem,
11
+ CustomExtensionSlot,
12
+ CustomExtensionSlotHandler,
2
13
  AnySlotKey,
3
- SlotKey
14
+ SlotKey,
15
+ ReactComponentContributor,
16
+ ReducersMapObjectContributor,
17
+ EntryPointInterceptor,
18
+ ShellLogger,
19
+ ShellLoggerSpan,
20
+ HostLogger,
21
+ LogSeverity,
22
+ APILayer,
23
+ StateObserverUnsubscribe,
24
+ StateObserver,
25
+ ObservableState,
26
+ ScopedStore
4
27
  } from './API'
5
28
 
6
- export * from './__internal'
29
+
30
+
31
+ export { ConsoleHostLogger } from './loggers'
32
+
33
+ export { createAppHost, makeLazyEntryPoint, mainViewSlotKey, stateSlotKey } from './appHost'
34
+
35
+ export {AppHostServicesProvider} from './appHostServices'
36
+
37
+ export { InstalledShellsSelectors, ShellToggleSet } from './installedShellsState'
38
+
39
+ export { invokeSlotCallbacks } from './invokeSlotCallbacks'
40
+
41
+ export { interceptAnyObject } from './interceptAnyObject'
42
+ export { monitorAPI } from './monitorAPI'
43
+ export { hot } from './hot'
44
+
45
+
46
+ export {INTERNAL_DONT_USE_SHELL_GET_APP_HOST} from './__internal'
@@ -0,0 +1,54 @@
1
+ import _ from 'lodash'
2
+ import { Action, AnyAction, ReducersMapObject } from 'redux'
3
+
4
+ export interface ShellToggleSet {
5
+ [name: string]: boolean
6
+ }
7
+
8
+ export interface InstalledShellsState {
9
+ readonly installedShells: ShellToggleSet
10
+ }
11
+
12
+ export interface UpdateInstalledShellsAction extends Action {
13
+ readonly updates: ShellToggleSet
14
+ }
15
+
16
+ const UPDATE_INSTALLED_SHELLS_ACTION = '$installedShells/update'
17
+
18
+ export const contributeInstalledShellsState = (): ReducersMapObject => {
19
+ return {
20
+ $installedShells: installedShellsReducer
21
+ }
22
+ }
23
+
24
+ const selectRootState = (state: any): InstalledShellsState => state.$installedShells
25
+
26
+ export const InstalledShellsSelectors = {
27
+ getInstalledShellsSet(state: any): ShellToggleSet {
28
+ return selectRootState(state).installedShells
29
+ }
30
+ }
31
+
32
+ export const InstalledShellsActions = {
33
+ updateInstalledShells: (updates: ShellToggleSet): UpdateInstalledShellsAction => {
34
+ return {
35
+ type: UPDATE_INSTALLED_SHELLS_ACTION,
36
+ updates
37
+ }
38
+ }
39
+ }
40
+
41
+ const toggleInstalledShells = (currentlyInstalled: ShellToggleSet, updates: ShellToggleSet): ShellToggleSet =>
42
+ _.pickBy(_.assign({}, currentlyInstalled, updates), _.identity)
43
+
44
+ export const installedShellsReducer = (state: InstalledShellsState = { installedShells: {} }, action: AnyAction): InstalledShellsState => {
45
+ switch (action.type) {
46
+ case UPDATE_INSTALLED_SHELLS_ACTION:
47
+ return {
48
+ ...state,
49
+ installedShells: toggleInstalledShells(state.installedShells, action.updates)
50
+ }
51
+ }
52
+
53
+ return state
54
+ }
@@ -0,0 +1,39 @@
1
+ import _ from 'lodash'
2
+
3
+ export type FunctionInterceptor = (name: string, original: Function) => Function
4
+ export type PropertyInterceptor = (name: string, original: any) => any
5
+
6
+ export interface AnyObject {
7
+ [key: string]: any
8
+ }
9
+ const isPlainObject = (value: any): value is AnyObject => _.isPlainObject(value)
10
+
11
+ export function interceptAnyObject<T>(
12
+ inner: T,
13
+ onFunction?: FunctionInterceptor,
14
+ onProperty?: PropertyInterceptor,
15
+ includeNestedLevels?: number
16
+ ): T {
17
+ if (isPlainObject(inner)) {
18
+ const result = _.mapValues(inner, (original, key) => {
19
+ if (typeof original === 'function' && typeof onFunction === 'function') {
20
+ return onFunction(key, original)
21
+ }
22
+ if (includeNestedLevels && _.isPlainObject(original)) {
23
+ return interceptAnyObject(
24
+ original,
25
+ onFunction ? (name, func) => onFunction(`${key}.${name}`, func) : undefined,
26
+ onProperty ? (name, value) => onProperty(`${key}.${name}`, value) : undefined,
27
+ includeNestedLevels - 1
28
+ )
29
+ }
30
+ if (typeof onProperty === 'function') {
31
+ return onProperty(key, original)
32
+ }
33
+ return original
34
+ }) as T
35
+
36
+ return result
37
+ }
38
+ return inner
39
+ }
@@ -0,0 +1,20 @@
1
+ import { ExtensionSlot } from './API'
2
+
3
+ export function invokeSlotCallbacks<T extends any[]>(slot: ExtensionSlot<(...args: T) => void | Promise<void>>, ...args: T): void {
4
+ const slotItems = slot.getItems()
5
+
6
+ if (slot.host.options.monitoring.disableMonitoring) {
7
+ slotItems.forEach(slotItem => {
8
+ try {
9
+ slotItem.contribution(...args)
10
+ } catch (e) {
11
+ console.error(e)
12
+ }
13
+ })
14
+ } else {
15
+ slotItems.forEach(slotItem => {
16
+ const messageId = `${slot.host}-${slot.name}:${slotItem.shell.name}${slotItem.name && '-' + slotItem.name}`
17
+ slotItem.shell.log.monitor(messageId, {}, () => slotItem.contribution(...args))
18
+ })
19
+ }
20
+ }
package/src/loggers.ts ADDED
@@ -0,0 +1,112 @@
1
+ import { HostLogger, LogSeverity, ShellLogger, EntryPoint, AppHost, ShellLoggerSpan, EntryPointTags } from './API'
2
+
3
+ const consoleLoggerSpan: ShellLoggerSpan = {
4
+ end(success, error, keyValuePairs) {
5
+ if (error) {
6
+ console.error(error, keyValuePairs)
7
+ }
8
+ }
9
+ }
10
+
11
+ export const ConsoleHostLogger: HostLogger = {
12
+ spanRoot(messageId: string, error?: Error, keyValuePairs?: Object): ShellLoggerSpan {
13
+ return consoleLoggerSpan
14
+ },
15
+ spanChild(messageId: string, error?: Error, keyValuePairs?: Object): ShellLoggerSpan {
16
+ return consoleLoggerSpan
17
+ },
18
+ log(severity: LogSeverity, id: string, error?: Error, keyValuePairs?: Object): void {
19
+ const consoleFunc = getConsoleOutputFunc(severity)
20
+ consoleFunc(id, keyValuePairs)
21
+ }
22
+ }
23
+
24
+ export function createShellLogger(host: AppHost, entryPoint: EntryPoint): ShellLogger {
25
+ const entryPointTags = buildEntryPointTags()
26
+
27
+ const spanChild = (messageId: string, keyValuePairs?: Object): ShellLoggerSpan => {
28
+ return host.log.spanChild(messageId, withEntryPointTags(keyValuePairs))
29
+ }
30
+
31
+ const spanRoot = (messageId: string, keyValuePairs?: Object): ShellLoggerSpan => {
32
+ return host.log.spanRoot(messageId, withEntryPointTags(keyValuePairs))
33
+ }
34
+
35
+ return {
36
+ log(severity: LogSeverity, id: string, keyValuePairs?: Object): void {
37
+ host.log.log(severity, id, undefined, withEntryPointTags(keyValuePairs))
38
+ },
39
+ debug(messageId: string, keyValuePairs?: Object): void {
40
+ host.log.log('debug', messageId, undefined, withEntryPointTags(keyValuePairs))
41
+ },
42
+ info(messageId: string, keyValuePairs?: Object): void {
43
+ host.log.log('info', messageId, undefined, withEntryPointTags(keyValuePairs))
44
+ },
45
+ warning(messageId: string, keyValuePairs?: Object): void {
46
+ host.log.log('warning', messageId, undefined, withEntryPointTags(keyValuePairs))
47
+ },
48
+ error(messageId: string, error?: Error, keyValuePairs?: Object): void {
49
+ host.log.log('error', messageId, error, withEntryPointTags(keyValuePairs))
50
+ },
51
+ critical(messageId: string, error?: Error, keyValuePairs?: Object): void {
52
+ host.log.log('critical', messageId, error, withEntryPointTags(keyValuePairs))
53
+ },
54
+ spanChild,
55
+ spanRoot,
56
+ monitor
57
+ }
58
+
59
+ function monitor(messageId: string, keyValuePairs: Object, monitoredCode: () => any): any {
60
+ const allTags = withEntryPointTags(keyValuePairs)
61
+ const span = spanChild(messageId, allTags)
62
+
63
+ try {
64
+ const returnValue = monitoredCode()
65
+
66
+ if (isPromise(returnValue)) {
67
+ return returnValue
68
+ .then(retVal => {
69
+ span.end(true, undefined, { ...allTags, returnValue: retVal })
70
+ return retVal
71
+ })
72
+ .catch(error => {
73
+ span.end(false, error, allTags)
74
+ throw error
75
+ })
76
+ }
77
+ span.end(true, undefined, { ...allTags, returnValue })
78
+ return returnValue
79
+ } catch (error) {
80
+ span.end(false, error, allTags)
81
+ throw error
82
+ }
83
+ }
84
+
85
+ function buildEntryPointTags(): EntryPointTags {
86
+ return entryPoint.tags ? { ...entryPoint.tags, $ep: entryPoint.name } : { $ep: entryPoint.name }
87
+ }
88
+
89
+ function withEntryPointTags(keyValuePairs?: Object) {
90
+ return keyValuePairs ? { ...keyValuePairs, ...entryPointTags } : entryPointTags
91
+ }
92
+
93
+ function isPromise(obj: any | Promise<any>): obj is Promise<any> {
94
+ return !!obj && typeof obj === 'object' && typeof obj.then === 'function'
95
+ }
96
+ }
97
+
98
+ function getConsoleOutputFunc(severity: LogSeverity): Console['log'] {
99
+ switch (severity) {
100
+ case 'debug':
101
+ return console.debug
102
+ case 'event':
103
+ return console.info
104
+ case 'warning':
105
+ return console.warn
106
+ case 'error':
107
+ case 'critical':
108
+ return console.error
109
+ default:
110
+ return console.log
111
+ }
112
+ }
@@ -0,0 +1,71 @@
1
+ import { AppHostOptions, Shell, enrichedMemoizationFunction, ContributeAPIOptions } from './API'
2
+ import { interceptAnyObject } from './interceptAnyObject'
3
+
4
+ function isEnrichedMemoizationFunction(func: any): func is enrichedMemoizationFunction {
5
+ return func.hasOwnProperty('cache') && func.hasOwnProperty('hit')
6
+ }
7
+
8
+ function isMemberNamesArray<TAPI>(value: boolean | (keyof TAPI)[] | undefined): value is (keyof TAPI)[] {
9
+ return Array.isArray(value)
10
+ }
11
+
12
+ export function monitorAPI<TAPI>(
13
+ shell: Shell,
14
+ hostOptions: AppHostOptions,
15
+ apiName: string,
16
+ api: TAPI,
17
+ //trace: Trace[],
18
+ //memoized: StatisticsMemoization[]
19
+ apiOptions?: ContributeAPIOptions<TAPI>
20
+ ): TAPI {
21
+ if (hostOptions.monitoring.disableMonitoring || (apiOptions && apiOptions.disableMonitoring === true)) {
22
+ return api
23
+ }
24
+
25
+ const shouldMonitor =
26
+ apiOptions && isMemberNamesArray(apiOptions.disableMonitoring)
27
+ ? (funcName: string) => {
28
+ const { disableMonitoring } = apiOptions
29
+ if (isMemberNamesArray(disableMonitoring)) {
30
+ return !disableMonitoring.find(memberName => {
31
+ const memberNameString = memberName as string
32
+ return (
33
+ funcName.indexOf(memberNameString) === 0 &&
34
+ (funcName.length === memberNameString.length || funcName.charAt(memberNameString.length) === '.')
35
+ )
36
+ })
37
+ }
38
+ }
39
+ : () => true
40
+
41
+ return interceptAnyObject(
42
+ api,
43
+ (funcName, originalFunc) => {
44
+ if (!shouldMonitor(funcName)) {
45
+ console.log('DISABLED MONITORING>', funcName)
46
+ return originalFunc
47
+ }
48
+ //let funcId = `${apiName}::${funcName}`
49
+ let isMemoized = false
50
+ if (isEnrichedMemoizationFunction(originalFunc)) {
51
+ isMemoized = true
52
+ //funcId += '(Memoized)'
53
+ //memoized.push({ name: funcId, func: originalFunc })
54
+ }
55
+ return (...args: any[]) => {
56
+ const tags = {
57
+ $api: apiName,
58
+ $apiFunc: funcName,
59
+ $args: args,
60
+ $memoized: isMemoized || undefined
61
+ }
62
+ return shell.log.monitor(`${apiName}.${funcName}`, tags, () => {
63
+ return originalFunc.apply(api, args)
64
+ //wrapWithMeasure(options, originalFunc, api, args, funcId, trace)
65
+ })
66
+ }
67
+ },
68
+ undefined,
69
+ apiOptions && apiOptions.includesNamespaces ? 4 : 0
70
+ )
71
+ }
@@ -0,0 +1,37 @@
1
+ import { EntryPoint, AppHost, AnySlotKey, LazyEntryPointFactory, PrivateShell, SlotKey } from '../API'
2
+ import { AnyExtensionSlot } from '../extensionSlot'
3
+ import { Hot } from '../hot'
4
+
5
+ declare global {
6
+ // Have to use var is this variable reassigned in the global scope
7
+ var repluggableAppDebug: RepluggableAppDebugInfo
8
+ }
9
+
10
+ export interface RepluggableAppDebugInfo {
11
+ host: AppHost
12
+ uniqueShellNames: Set<string>
13
+ extensionSlots: Map<AnySlotKey, AnyExtensionSlot>
14
+ addedShells: Map<string, PrivateShell>
15
+ lazyShells: Map<string, LazyEntryPointFactory>
16
+ readyAPIs: Set<AnySlotKey>
17
+ shellInstallers: WeakMap<PrivateShell, string[]>
18
+ utils: RepluggableDebugUtils
19
+ hmr: RepluggableHMR
20
+ }
21
+
22
+ export interface RepluggableDebugUtils {
23
+ apis(): APIDebugInfo[]
24
+ unReadyEntryPoints(): EntryPoint[]
25
+ getRootUnreadyAPI(): SlotKey<any>[]
26
+ whyEntryPointUnready(name: string): void
27
+ findAPI(name: string): APIDebugInfo[]
28
+ }
29
+
30
+ export interface RepluggableHMR {
31
+ hot: Hot
32
+ }
33
+
34
+ export interface APIDebugInfo {
35
+ key: AnySlotKey
36
+ impl(): any
37
+ }
@@ -0,0 +1 @@
1
+ export { setupDebugInfo } from './repluggableAppDebug'
@@ -0,0 +1,96 @@
1
+ import _ from 'lodash'
2
+ import { AppHostOptions, Trace, StatisticsMemoization } from '../API'
3
+
4
+ export function getPerformanceDebug(options: AppHostOptions, trace: Trace[], memoized: StatisticsMemoization[]) {
5
+ const getMemoizedTable = () => {
6
+ return _.map(memoized, memoize => {
7
+ const { calls, hit, miss } = memoize.func
8
+ const hitRate = `${((hit / calls) * 100).toFixed(2)}%`
9
+ const { name } = memoize
10
+ return { name, hitRate, calls, hit, miss }
11
+ })
12
+ }
13
+
14
+ const getGroups = (apiName: string) => {
15
+ const api = _.groupBy(trace, 'name')[apiName]
16
+ try {
17
+ const groupedArgs = _.groupBy(api, a => JSON.stringify(a.args))
18
+ const groupedRes = _.groupBy(api, a => JSON.stringify(a.res))
19
+ const groupedArgsAndRes = _.groupBy(api, a => JSON.stringify(a.args) + JSON.stringify(a.res))
20
+ return { groupedArgs, groupedRes, groupedArgsAndRes }
21
+ } catch (err) {
22
+ return { groupedArgs: [], groupedRes: [], groupedArgsAndRes: [] }
23
+ }
24
+ }
25
+ const printMemoizeTable = () => {
26
+ console.table(getMemoizedTable())
27
+ }
28
+ return {
29
+ getSortedMeasurments: () => {
30
+ return _(trace)
31
+ .map(measurement => _.pick(measurement, ['name', 'duration']))
32
+ .sortBy('duration')
33
+ .reverse()
34
+ .value()
35
+ },
36
+ start: () => {
37
+ if (!options.monitoring.disableMonitoring) {
38
+ options.monitoring.enablePerformance = true
39
+ } else {
40
+ console.log('Remove "disableMonitoring" in order to use trace')
41
+ }
42
+ },
43
+ stop: () => {
44
+ options.monitoring.enablePerformance = false
45
+ },
46
+ clean: () => {
47
+ trace.length = 0
48
+ },
49
+ getTrace: () => {
50
+ return trace
51
+ },
52
+ getGroupedTrace: () => {
53
+ return _.groupBy(trace, 'name')
54
+ },
55
+ getGroupedSumTrace: () => {
56
+ const traceData = _(trace)
57
+ .groupBy('name')
58
+ .mapValues((arr, name) => {
59
+ const totalDuration = Number(_.sumBy(arr, 'duration').toFixed(2))
60
+ const times = arr.length
61
+ const avgDuration = Number((totalDuration / times).toFixed(2))
62
+ const groups = _(getGroups(name))
63
+ .mapValues((obj, group) => {
64
+ const keys = Object.keys(obj)
65
+ const length = keys.length
66
+ if (group !== 'groupedRes' || length === 0) {
67
+ return length
68
+ }
69
+ const joined = keys.join(' ')
70
+ return joined.length < 15 ? `${length}: ${joined}` : length
71
+ })
72
+ .value()
73
+
74
+ return { name, times, totalDuration, avgDuration, ...groups }
75
+ })
76
+ .orderBy(x => x.totalDuration, 'desc')
77
+ .value()
78
+
79
+ _.forEach(getMemoizedTable(), memoizeData => {
80
+ _.assign(_.find(traceData, { name: memoizeData.name }), memoizeData)
81
+ })
82
+ console.table(traceData)
83
+ },
84
+ analyseAPI: (apiName: string) => {
85
+ const groups = getGroups(apiName)
86
+ if (groups) {
87
+ const { groupedArgs, groupedRes, groupedArgsAndRes } = groups
88
+ console.log(`groupedArgs: ${Object.keys(groupedArgs).length}`, groupedArgs)
89
+ console.log(`groupedRes: ${Object.keys(groupedRes).length}`, groupedRes)
90
+ console.log(`groupedArgsAndRes: ${Object.keys(groupedArgsAndRes).length}`, groupedArgsAndRes)
91
+ }
92
+ },
93
+ getMemoized: () => memoized,
94
+ printMemoizeTable
95
+ }
96
+ }