@dxos/app-framework 0.7.4 → 0.7.5-labs.5f04cf6

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 (327) hide show
  1. package/dist/lib/browser/chunk-22MGDQXD.mjs +1621 -0
  2. package/dist/lib/browser/chunk-22MGDQXD.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +136 -527
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/testing/index.mjs +67 -0
  7. package/dist/lib/browser/testing/index.mjs.map +7 -0
  8. package/dist/lib/node/chunk-7PNEFY2G.cjs +1665 -0
  9. package/dist/lib/node/chunk-7PNEFY2G.cjs.map +7 -0
  10. package/dist/lib/node/index.cjs +141 -551
  11. package/dist/lib/node/index.cjs.map +4 -4
  12. package/dist/lib/node/meta.json +1 -1
  13. package/dist/lib/node/testing/index.cjs +91 -0
  14. package/dist/lib/node/testing/index.cjs.map +7 -0
  15. package/dist/lib/node-esm/chunk-ZFOOPWBG.mjs +1623 -0
  16. package/dist/lib/node-esm/chunk-ZFOOPWBG.mjs.map +7 -0
  17. package/dist/lib/node-esm/index.mjs +136 -527
  18. package/dist/lib/node-esm/index.mjs.map +4 -4
  19. package/dist/lib/node-esm/meta.json +1 -1
  20. package/dist/lib/node-esm/testing/index.mjs +68 -0
  21. package/dist/lib/node-esm/testing/index.mjs.map +7 -0
  22. package/dist/types/src/App.d.ts +22 -13
  23. package/dist/types/src/App.d.ts.map +1 -1
  24. package/dist/types/src/common/capabilities.d.ts +343 -0
  25. package/dist/types/src/common/capabilities.d.ts.map +1 -0
  26. package/dist/types/src/common/events.d.ts +41 -0
  27. package/dist/types/src/common/events.d.ts.map +1 -0
  28. package/dist/types/src/common/file.d.ts +14 -0
  29. package/dist/types/src/common/file.d.ts.map +1 -0
  30. package/dist/types/src/common/graph.d.ts +21 -0
  31. package/dist/types/src/common/graph.d.ts.map +1 -0
  32. package/dist/types/src/{plugins/common → common}/index.d.ts +3 -1
  33. package/dist/types/src/common/index.d.ts.map +1 -0
  34. package/dist/types/src/common/layout.d.ts +165 -0
  35. package/dist/types/src/common/layout.d.ts.map +1 -0
  36. package/dist/types/src/{plugins/common → common}/navigation.d.ts +77 -32
  37. package/dist/types/src/common/navigation.d.ts.map +1 -0
  38. package/dist/types/src/common/surface.d.ts +68 -0
  39. package/dist/types/src/common/surface.d.ts.map +1 -0
  40. package/dist/types/src/{plugins/common → common}/translations.d.ts +0 -11
  41. package/dist/types/src/common/translations.d.ts.map +1 -0
  42. package/dist/types/src/core/capabilities.d.ts +90 -0
  43. package/dist/types/src/core/capabilities.d.ts.map +1 -0
  44. package/dist/types/src/core/capabilities.test.d.ts +2 -0
  45. package/dist/types/src/core/capabilities.test.d.ts.map +1 -0
  46. package/dist/types/src/core/events.d.ts +58 -0
  47. package/dist/types/src/core/events.d.ts.map +1 -0
  48. package/dist/types/src/core/index.d.ts +5 -0
  49. package/dist/types/src/core/index.d.ts.map +1 -0
  50. package/dist/types/src/core/manager.d.ts +126 -0
  51. package/dist/types/src/core/manager.d.ts.map +1 -0
  52. package/dist/types/src/core/manager.test.d.ts +2 -0
  53. package/dist/types/src/core/manager.test.d.ts.map +1 -0
  54. package/dist/types/src/core/plugin.d.ts +94 -0
  55. package/dist/types/src/core/plugin.d.ts.map +1 -0
  56. package/dist/types/src/helpers.d.ts +10 -0
  57. package/dist/types/src/helpers.d.ts.map +1 -0
  58. package/dist/types/src/helpers.test.d.ts +2 -0
  59. package/dist/types/src/helpers.test.d.ts.map +1 -0
  60. package/dist/types/src/index.d.ts +5 -1
  61. package/dist/types/src/index.d.ts.map +1 -1
  62. package/dist/types/src/playground/debug/Debug.d.ts +6 -0
  63. package/dist/types/src/playground/debug/Debug.d.ts.map +1 -0
  64. package/dist/types/src/playground/debug/index.d.ts +2 -0
  65. package/dist/types/src/playground/debug/index.d.ts.map +1 -0
  66. package/dist/types/src/playground/debug/plugin.d.ts +2 -0
  67. package/dist/types/src/playground/debug/plugin.d.ts.map +1 -0
  68. package/dist/types/src/playground/generator/Main.d.ts +6 -0
  69. package/dist/types/src/playground/generator/Main.d.ts.map +1 -0
  70. package/dist/types/src/playground/generator/Toolbar.d.ts +6 -0
  71. package/dist/types/src/playground/generator/Toolbar.d.ts.map +1 -0
  72. package/dist/types/src/playground/generator/generator.d.ts +5 -0
  73. package/dist/types/src/playground/generator/generator.d.ts.map +1 -0
  74. package/dist/types/src/playground/generator/index.d.ts +3 -0
  75. package/dist/types/src/playground/generator/index.d.ts.map +1 -0
  76. package/dist/types/src/playground/generator/plugin.d.ts +2 -0
  77. package/dist/types/src/playground/generator/plugin.d.ts.map +1 -0
  78. package/dist/types/src/playground/layout/Layout.d.ts +8 -0
  79. package/dist/types/src/playground/layout/Layout.d.ts.map +1 -0
  80. package/dist/types/src/playground/layout/index.d.ts +2 -0
  81. package/dist/types/src/playground/layout/index.d.ts.map +1 -0
  82. package/dist/types/src/playground/layout/plugin.d.ts +2 -0
  83. package/dist/types/src/playground/layout/plugin.d.ts.map +1 -0
  84. package/dist/types/src/playground/logger/Toolbar.d.ts +6 -0
  85. package/dist/types/src/playground/logger/Toolbar.d.ts.map +1 -0
  86. package/dist/types/src/playground/logger/index.d.ts +2 -0
  87. package/dist/types/src/playground/logger/index.d.ts.map +1 -0
  88. package/dist/types/src/playground/logger/plugin.d.ts +2 -0
  89. package/dist/types/src/playground/logger/plugin.d.ts.map +1 -0
  90. package/dist/types/src/playground/logger/schema.d.ts +13 -0
  91. package/dist/types/src/playground/logger/schema.d.ts.map +1 -0
  92. package/dist/types/src/playground/playground.stories.d.ts +10 -0
  93. package/dist/types/src/playground/playground.stories.d.ts.map +1 -0
  94. package/dist/types/src/plugin-intent/IntentContext.d.ts +8 -0
  95. package/dist/types/src/plugin-intent/IntentContext.d.ts.map +1 -0
  96. package/dist/types/src/plugin-intent/IntentPlugin.d.ts +2 -0
  97. package/dist/types/src/plugin-intent/IntentPlugin.d.ts.map +1 -0
  98. package/dist/types/src/plugin-intent/actions.d.ts +23 -0
  99. package/dist/types/src/plugin-intent/actions.d.ts.map +1 -0
  100. package/dist/types/src/plugin-intent/errors.d.ts +16 -0
  101. package/dist/types/src/plugin-intent/errors.d.ts.map +1 -0
  102. package/dist/types/src/plugin-intent/index.d.ts +6 -0
  103. package/dist/types/src/plugin-intent/index.d.ts.map +1 -0
  104. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts +106 -0
  105. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts.map +1 -0
  106. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts +2 -0
  107. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts.map +1 -0
  108. package/dist/types/src/plugin-intent/intent.d.ts +68 -0
  109. package/dist/types/src/plugin-intent/intent.d.ts.map +1 -0
  110. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts +2 -0
  111. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts.map +1 -0
  112. package/dist/types/src/plugin-settings/actions.d.ts +17 -0
  113. package/dist/types/src/plugin-settings/actions.d.ts.map +1 -0
  114. package/dist/types/src/plugin-settings/index.d.ts +3 -0
  115. package/dist/types/src/plugin-settings/index.d.ts.map +1 -0
  116. package/dist/types/src/react/ErrorBoundary.d.ts.map +1 -0
  117. package/dist/types/src/react/PluginManagerProvider.d.ts +10 -0
  118. package/dist/types/src/react/PluginManagerProvider.d.ts.map +1 -0
  119. package/dist/types/src/react/Surface.d.ts +12 -0
  120. package/dist/types/src/react/Surface.d.ts.map +1 -0
  121. package/dist/types/src/react/index.d.ts +5 -0
  122. package/dist/types/src/react/index.d.ts.map +1 -0
  123. package/dist/types/src/react/useCapabilities.d.ts +13 -0
  124. package/dist/types/src/react/useCapabilities.d.ts.map +1 -0
  125. package/dist/types/src/testing/index.d.ts +2 -0
  126. package/dist/types/src/testing/index.d.ts.map +1 -0
  127. package/dist/types/src/testing/withPluginManager.d.ts +10 -0
  128. package/dist/types/src/testing/withPluginManager.d.ts.map +1 -0
  129. package/dist/types/src/testing/withPluginManager.stories.d.ts +5 -0
  130. package/dist/types/src/testing/withPluginManager.stories.d.ts.map +1 -0
  131. package/dist/types/tsconfig.tsbuildinfo +1 -0
  132. package/package.json +31 -14
  133. package/project.json +2 -1
  134. package/src/App.tsx +138 -34
  135. package/src/common/capabilities.ts +88 -0
  136. package/src/common/events.ts +63 -0
  137. package/src/common/file.ts +22 -0
  138. package/src/common/graph.ts +30 -0
  139. package/src/{plugins/common → common}/index.ts +3 -1
  140. package/src/common/layout.ts +157 -0
  141. package/src/{plugins/common → common}/navigation.ts +69 -50
  142. package/src/common/surface.ts +81 -0
  143. package/src/common/translations.ts +18 -0
  144. package/src/core/capabilities.test.ts +116 -0
  145. package/src/core/capabilities.ts +213 -0
  146. package/src/core/events.ts +58 -0
  147. package/src/core/index.ts +8 -0
  148. package/src/core/manager.test.ts +567 -0
  149. package/src/core/manager.ts +497 -0
  150. package/src/core/plugin.ts +128 -0
  151. package/src/helpers.test.ts +97 -0
  152. package/src/helpers.ts +45 -0
  153. package/src/index.ts +6 -3
  154. package/src/playground/debug/Debug.tsx +39 -0
  155. package/src/playground/debug/index.ts +5 -0
  156. package/src/playground/debug/plugin.ts +17 -0
  157. package/src/playground/generator/Main.tsx +71 -0
  158. package/src/playground/generator/Toolbar.tsx +46 -0
  159. package/src/playground/generator/generator.ts +23 -0
  160. package/src/playground/generator/index.ts +6 -0
  161. package/src/playground/generator/plugin.ts +18 -0
  162. package/src/playground/layout/Layout.tsx +33 -0
  163. package/src/playground/layout/index.ts +5 -0
  164. package/src/playground/layout/plugin.ts +17 -0
  165. package/src/playground/logger/Toolbar.tsx +28 -0
  166. package/src/playground/logger/index.ts +5 -0
  167. package/src/playground/logger/plugin.ts +33 -0
  168. package/src/playground/logger/schema.ts +12 -0
  169. package/src/playground/playground.stories.tsx +34 -0
  170. package/src/plugin-intent/IntentContext.tsx +34 -0
  171. package/src/plugin-intent/IntentPlugin.tsx +60 -0
  172. package/src/plugin-intent/actions.ts +22 -0
  173. package/src/plugin-intent/errors.ts +39 -0
  174. package/src/plugin-intent/index.ts +9 -0
  175. package/src/plugin-intent/intent-dispatcher.test.ts +280 -0
  176. package/src/plugin-intent/intent-dispatcher.ts +269 -0
  177. package/src/plugin-intent/intent.ts +146 -0
  178. package/src/plugin-settings/SettingsPlugin.ts +29 -0
  179. package/src/plugin-settings/actions.ts +17 -0
  180. package/src/plugin-settings/index.ts +6 -0
  181. package/src/react/PluginManagerProvider.ts +22 -0
  182. package/src/react/Surface.tsx +72 -0
  183. package/src/react/index.ts +8 -0
  184. package/src/react/useCapabilities.ts +40 -0
  185. package/src/testing/index.ts +5 -0
  186. package/src/testing/withPluginManager.stories.tsx +47 -0
  187. package/src/testing/withPluginManager.tsx +67 -0
  188. package/tsconfig.json +54 -2
  189. package/dist/lib/browser/chunk-3E7RY3CE.mjs +0 -72
  190. package/dist/lib/browser/chunk-3E7RY3CE.mjs.map +0 -7
  191. package/dist/lib/browser/chunk-653Y45CL.mjs +0 -41
  192. package/dist/lib/browser/chunk-653Y45CL.mjs.map +0 -7
  193. package/dist/lib/browser/chunk-FRXJ25VI.mjs +0 -214
  194. package/dist/lib/browser/chunk-FRXJ25VI.mjs.map +0 -7
  195. package/dist/lib/browser/chunk-YXM35XRE.mjs +0 -213
  196. package/dist/lib/browser/chunk-YXM35XRE.mjs.map +0 -7
  197. package/dist/lib/browser/plugin-intent-LU4KL2RO.mjs +0 -22
  198. package/dist/lib/browser/plugin-intent-LU4KL2RO.mjs.map +0 -7
  199. package/dist/lib/browser/plugin-settings-OM3G2QFY.mjs +0 -11
  200. package/dist/lib/browser/plugin-settings-OM3G2QFY.mjs.map +0 -7
  201. package/dist/lib/browser/plugin-surface-LECZMKSQ.mjs +0 -24
  202. package/dist/lib/browser/plugin-surface-LECZMKSQ.mjs.map +0 -7
  203. package/dist/lib/node/chunk-JZ2JVKRY.cjs +0 -58
  204. package/dist/lib/node/chunk-JZ2JVKRY.cjs.map +0 -7
  205. package/dist/lib/node/chunk-QBM42OQ6.cjs +0 -97
  206. package/dist/lib/node/chunk-QBM42OQ6.cjs.map +0 -7
  207. package/dist/lib/node/chunk-QSVP5HOW.cjs +0 -238
  208. package/dist/lib/node/chunk-QSVP5HOW.cjs.map +0 -7
  209. package/dist/lib/node/chunk-SOVLKUWI.cjs +0 -236
  210. package/dist/lib/node/chunk-SOVLKUWI.cjs.map +0 -7
  211. package/dist/lib/node/plugin-intent-FVFR2LKB.cjs +0 -43
  212. package/dist/lib/node/plugin-intent-FVFR2LKB.cjs.map +0 -7
  213. package/dist/lib/node/plugin-settings-OZ6IKAE5.cjs +0 -32
  214. package/dist/lib/node/plugin-settings-OZ6IKAE5.cjs.map +0 -7
  215. package/dist/lib/node/plugin-surface-YWDRXQTD.cjs +0 -45
  216. package/dist/lib/node/plugin-surface-YWDRXQTD.cjs.map +0 -7
  217. package/dist/lib/node-esm/chunk-2R4GVK7O.mjs +0 -215
  218. package/dist/lib/node-esm/chunk-2R4GVK7O.mjs.map +0 -7
  219. package/dist/lib/node-esm/chunk-EYCTSFEJ.mjs +0 -74
  220. package/dist/lib/node-esm/chunk-EYCTSFEJ.mjs.map +0 -7
  221. package/dist/lib/node-esm/chunk-YFMFQBB4.mjs +0 -214
  222. package/dist/lib/node-esm/chunk-YFMFQBB4.mjs.map +0 -7
  223. package/dist/lib/node-esm/chunk-YNU7FTGJ.mjs +0 -43
  224. package/dist/lib/node-esm/chunk-YNU7FTGJ.mjs.map +0 -7
  225. package/dist/lib/node-esm/plugin-intent-V7ER24Y6.mjs +0 -23
  226. package/dist/lib/node-esm/plugin-intent-V7ER24Y6.mjs.map +0 -7
  227. package/dist/lib/node-esm/plugin-settings-37UVWF2V.mjs +0 -12
  228. package/dist/lib/node-esm/plugin-settings-37UVWF2V.mjs.map +0 -7
  229. package/dist/lib/node-esm/plugin-surface-TEU42XQN.mjs +0 -25
  230. package/dist/lib/node-esm/plugin-surface-TEU42XQN.mjs.map +0 -7
  231. package/dist/types/src/plugins/common/file.d.ts +0 -22
  232. package/dist/types/src/plugins/common/file.d.ts.map +0 -1
  233. package/dist/types/src/plugins/common/graph.d.ts +0 -51
  234. package/dist/types/src/plugins/common/graph.d.ts.map +0 -1
  235. package/dist/types/src/plugins/common/index.d.ts.map +0 -1
  236. package/dist/types/src/plugins/common/layout.d.ts +0 -202
  237. package/dist/types/src/plugins/common/layout.d.ts.map +0 -1
  238. package/dist/types/src/plugins/common/metadata.d.ts +0 -16
  239. package/dist/types/src/plugins/common/metadata.d.ts.map +0 -1
  240. package/dist/types/src/plugins/common/navigation.d.ts.map +0 -1
  241. package/dist/types/src/plugins/common/translations.d.ts.map +0 -1
  242. package/dist/types/src/plugins/helpers.d.ts +0 -41
  243. package/dist/types/src/plugins/helpers.d.ts.map +0 -1
  244. package/dist/types/src/plugins/index.d.ts +0 -7
  245. package/dist/types/src/plugins/index.d.ts.map +0 -1
  246. package/dist/types/src/plugins/plugin-host/HostPlugin.d.ts +0 -21
  247. package/dist/types/src/plugins/plugin-host/HostPlugin.d.ts.map +0 -1
  248. package/dist/types/src/plugins/plugin-host/PluginContainer.d.ts +0 -14
  249. package/dist/types/src/plugins/plugin-host/PluginContainer.d.ts.map +0 -1
  250. package/dist/types/src/plugins/plugin-host/PluginContext.d.ts +0 -47
  251. package/dist/types/src/plugins/plugin-host/PluginContext.d.ts.map +0 -1
  252. package/dist/types/src/plugins/plugin-host/index.d.ts +0 -4
  253. package/dist/types/src/plugins/plugin-host/index.d.ts.map +0 -1
  254. package/dist/types/src/plugins/plugin-host/plugin.d.ts +0 -98
  255. package/dist/types/src/plugins/plugin-host/plugin.d.ts.map +0 -1
  256. package/dist/types/src/plugins/plugin-host/plugin.test.d.ts +0 -35
  257. package/dist/types/src/plugins/plugin-host/plugin.test.d.ts.map +0 -1
  258. package/dist/types/src/plugins/plugin-intent/IntentContext.d.ts +0 -21
  259. package/dist/types/src/plugins/plugin-intent/IntentContext.d.ts.map +0 -1
  260. package/dist/types/src/plugins/plugin-intent/IntentPlugin.d.ts +0 -8
  261. package/dist/types/src/plugins/plugin-intent/IntentPlugin.d.ts.map +0 -1
  262. package/dist/types/src/plugins/plugin-intent/helpers.d.ts +0 -6
  263. package/dist/types/src/plugins/plugin-intent/helpers.d.ts.map +0 -1
  264. package/dist/types/src/plugins/plugin-intent/index.d.ts +0 -6
  265. package/dist/types/src/plugins/plugin-intent/index.d.ts.map +0 -1
  266. package/dist/types/src/plugins/plugin-intent/intent.d.ts +0 -81
  267. package/dist/types/src/plugins/plugin-intent/intent.d.ts.map +0 -1
  268. package/dist/types/src/plugins/plugin-intent/meta.d.ts +0 -5
  269. package/dist/types/src/plugins/plugin-intent/meta.d.ts.map +0 -1
  270. package/dist/types/src/plugins/plugin-intent/provides.d.ts +0 -20
  271. package/dist/types/src/plugins/plugin-intent/provides.d.ts.map +0 -1
  272. package/dist/types/src/plugins/plugin-settings/SettingsPlugin.d.ts +0 -4
  273. package/dist/types/src/plugins/plugin-settings/SettingsPlugin.d.ts.map +0 -1
  274. package/dist/types/src/plugins/plugin-settings/index.d.ts +0 -4
  275. package/dist/types/src/plugins/plugin-settings/index.d.ts.map +0 -1
  276. package/dist/types/src/plugins/plugin-settings/meta.d.ts +0 -5
  277. package/dist/types/src/plugins/plugin-settings/meta.d.ts.map +0 -1
  278. package/dist/types/src/plugins/plugin-settings/provides.d.ts +0 -13
  279. package/dist/types/src/plugins/plugin-settings/provides.d.ts.map +0 -1
  280. package/dist/types/src/plugins/plugin-surface/ErrorBoundary.d.ts.map +0 -1
  281. package/dist/types/src/plugins/plugin-surface/Surface.d.ts +0 -62
  282. package/dist/types/src/plugins/plugin-surface/Surface.d.ts.map +0 -1
  283. package/dist/types/src/plugins/plugin-surface/SurfacePlugin.d.ts +0 -7
  284. package/dist/types/src/plugins/plugin-surface/SurfacePlugin.d.ts.map +0 -1
  285. package/dist/types/src/plugins/plugin-surface/SurfaceRootContext.d.ts +0 -39
  286. package/dist/types/src/plugins/plugin-surface/SurfaceRootContext.d.ts.map +0 -1
  287. package/dist/types/src/plugins/plugin-surface/helpers.d.ts +0 -21
  288. package/dist/types/src/plugins/plugin-surface/helpers.d.ts.map +0 -1
  289. package/dist/types/src/plugins/plugin-surface/index.d.ts +0 -8
  290. package/dist/types/src/plugins/plugin-surface/index.d.ts.map +0 -1
  291. package/dist/types/src/plugins/plugin-surface/meta.d.ts +0 -5
  292. package/dist/types/src/plugins/plugin-surface/meta.d.ts.map +0 -1
  293. package/dist/types/src/plugins/plugin-surface/provides.d.ts +0 -16
  294. package/dist/types/src/plugins/plugin-surface/provides.d.ts.map +0 -1
  295. package/src/plugins/common/file.ts +0 -36
  296. package/src/plugins/common/graph.ts +0 -70
  297. package/src/plugins/common/layout.ts +0 -155
  298. package/src/plugins/common/metadata.ts +0 -29
  299. package/src/plugins/common/translations.ts +0 -36
  300. package/src/plugins/helpers.ts +0 -92
  301. package/src/plugins/index.ts +0 -11
  302. package/src/plugins/plugin-host/HostPlugin.tsx +0 -96
  303. package/src/plugins/plugin-host/PluginContainer.tsx +0 -120
  304. package/src/plugins/plugin-host/PluginContext.tsx +0 -79
  305. package/src/plugins/plugin-host/index.ts +0 -8
  306. package/src/plugins/plugin-host/plugin.test.ts +0 -158
  307. package/src/plugins/plugin-host/plugin.ts +0 -126
  308. package/src/plugins/plugin-intent/IntentContext.tsx +0 -49
  309. package/src/plugins/plugin-intent/IntentPlugin.tsx +0 -151
  310. package/src/plugins/plugin-intent/helpers.ts +0 -11
  311. package/src/plugins/plugin-intent/index.ts +0 -12
  312. package/src/plugins/plugin-intent/intent.ts +0 -101
  313. package/src/plugins/plugin-intent/meta.ts +0 -9
  314. package/src/plugins/plugin-intent/provides.ts +0 -38
  315. package/src/plugins/plugin-settings/SettingsPlugin.tsx +0 -22
  316. package/src/plugins/plugin-settings/index.ts +0 -9
  317. package/src/plugins/plugin-settings/meta.ts +0 -9
  318. package/src/plugins/plugin-settings/provides.ts +0 -29
  319. package/src/plugins/plugin-surface/Surface.tsx +0 -195
  320. package/src/plugins/plugin-surface/SurfacePlugin.tsx +0 -33
  321. package/src/plugins/plugin-surface/SurfaceRootContext.tsx +0 -60
  322. package/src/plugins/plugin-surface/helpers.ts +0 -22
  323. package/src/plugins/plugin-surface/index.ts +0 -14
  324. package/src/plugins/plugin-surface/meta.ts +0 -9
  325. package/src/plugins/plugin-surface/provides.ts +0 -26
  326. /package/dist/types/src/{plugins/plugin-surface → react}/ErrorBoundary.d.ts +0 -0
  327. /package/src/{plugins/plugin-surface → react}/ErrorBoundary.tsx +0 -0
@@ -0,0 +1,567 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { effect } from '@preact/signals-core';
6
+ import { afterEach } from 'node:test';
7
+ import { describe, expect, it } from 'vitest';
8
+
9
+ import { Trigger } from '@dxos/async';
10
+ import { raise } from '@dxos/debug';
11
+ import { updateCounter } from '@dxos/echo-schema/testing';
12
+ import { registerSignalsRuntime } from '@dxos/echo-signals';
13
+ import { invariant } from '@dxos/invariant';
14
+ import { create } from '@dxos/live-object';
15
+
16
+ import { contributes, defineCapability, type PluginsContext } from './capabilities';
17
+ import { allOf, defineEvent, oneOf } from './events';
18
+ import { PluginManager } from './manager';
19
+ import { definePlugin, defineModule, type Plugin } from './plugin';
20
+ import { Events } from '../common';
21
+
22
+ registerSignalsRuntime();
23
+
24
+ const String = defineCapability<{ string: string }>('dxos.org/test/string');
25
+ const Number = defineCapability<{ number: number }>('dxos.org/test/number');
26
+ const Total = defineCapability<{ total: number }>('dxos.org/test/total');
27
+
28
+ const CountEvent = defineEvent('dxos.org/test/count');
29
+ const FailEvent = defineEvent('dxos.org/test/fail');
30
+
31
+ const testMeta = { id: 'dxos.org/plugin/test' };
32
+
33
+ describe('PluginManager', () => {
34
+ let plugins: Plugin[] = [];
35
+ const pluginLoader = (id: string) => {
36
+ const plugin = plugins.find((plugin) => plugin.meta.id === id);
37
+ invariant(plugin, `Plugin not found: ${id}`);
38
+ return plugin;
39
+ };
40
+
41
+ afterEach(() => {
42
+ plugins = [];
43
+ });
44
+
45
+ it('should be able to add and remove plugins', async () => {
46
+ const Test = definePlugin(testMeta, []);
47
+ plugins = [Test];
48
+
49
+ const manager = new PluginManager({ pluginLoader });
50
+ await manager.add(testMeta.id);
51
+ expect(manager.plugins).toEqual([Test]);
52
+ await manager.remove(testMeta.id);
53
+ expect(manager.plugins).toEqual([]);
54
+ });
55
+
56
+ it('should be able to enable and disable plugins', async () => {
57
+ const Hello = defineModule({
58
+ id: 'dxos.org/test/hello',
59
+ activatesOn: Events.Startup,
60
+ activate: () => contributes(String, { string: 'hello' }),
61
+ });
62
+ const Test = definePlugin(testMeta, [Hello]);
63
+
64
+ const manager = new PluginManager({ plugins: [Test], core: [], pluginLoader });
65
+ manager.enable(testMeta.id);
66
+ expect(manager.enabled).toEqual([Test.meta.id]);
67
+ expect(manager.modules).toEqual([Hello]);
68
+ manager.disable(testMeta.id);
69
+ expect(manager.enabled).toEqual([]);
70
+ expect(manager.modules).toEqual([]);
71
+ });
72
+
73
+ it('should be able to activate plugins', async () => {
74
+ const Hello = defineModule({
75
+ id: 'dxos.org/test/hello',
76
+ activatesOn: Events.Startup,
77
+ activate: () => contributes(String, { string: 'hello' }),
78
+ });
79
+ const Test = definePlugin(testMeta, [Hello]);
80
+
81
+ const manager = new PluginManager({ plugins: [Test], enabled: [Test.meta.id], pluginLoader });
82
+ expect(manager.plugins).toEqual([Test]);
83
+ expect(manager.enabled).toEqual([Test.meta.id]);
84
+ expect(manager.modules).toEqual([Hello]);
85
+ expect(manager.active).toEqual([]);
86
+ expect(manager.eventsFired).toEqual([]);
87
+ await manager.activate(Events.Startup);
88
+ expect(manager.active).toEqual([Hello.id]);
89
+ expect(manager.eventsFired).toEqual([Events.Startup.id]);
90
+ });
91
+
92
+ it('should propagate errors thrown by module activate callbacks', async () => {
93
+ const Fail = defineModule({
94
+ id: 'dxos.org/test/fail',
95
+ activatesOn: FailEvent,
96
+ activate: async () => raise(new Error('test')),
97
+ });
98
+ plugins = [definePlugin(testMeta, [Fail])];
99
+
100
+ const manager = new PluginManager({ pluginLoader });
101
+ await manager.add(testMeta.id);
102
+ await expect(() => manager.activate(FailEvent)).rejects.toThrow('test');
103
+ });
104
+
105
+ it('should fire activation events', async () => {
106
+ const Hello = defineModule({
107
+ id: 'dxos.org/test/hello',
108
+ activatesOn: Events.Startup,
109
+ activate: () => contributes(String, { string: 'hello' }),
110
+ });
111
+ const Fail = defineModule({
112
+ id: 'dxos.org/test/fail',
113
+ activatesOn: FailEvent,
114
+ activate: async () => raise(new Error('test')),
115
+ });
116
+ plugins = [definePlugin(testMeta, [Hello, Fail])];
117
+
118
+ const manager = new PluginManager({ pluginLoader });
119
+ const activating = new Trigger<boolean>();
120
+ const activated = new Trigger<boolean>();
121
+ const error = new Trigger<boolean>();
122
+
123
+ manager.activation.on(({ state }) => {
124
+ state === 'activating' && activating.wake(true);
125
+ state === 'activated' && activated.wake(true);
126
+ state === 'error' && error.wake(true);
127
+ });
128
+
129
+ await manager.add(testMeta.id);
130
+ await manager.activate(Events.Startup);
131
+ expect(await activating.wait()).toEqual(true);
132
+ expect(await activated.wait()).toEqual(true);
133
+
134
+ activating.reset();
135
+
136
+ await manager.activate(FailEvent).catch(() => {});
137
+ expect(await activating.wait()).toEqual(true);
138
+ expect(await error.wait()).toEqual(true);
139
+ });
140
+
141
+ it('should be able to reset an activation event', async () => {
142
+ let count = 0;
143
+ const Hello = defineModule({
144
+ id: 'dxos.org/test/hello',
145
+ activatesOn: Events.Startup,
146
+ activate: () => {
147
+ count++;
148
+ return contributes(String, { string: 'hello' });
149
+ },
150
+ });
151
+ plugins = [definePlugin(testMeta, [Hello])];
152
+
153
+ const manager = new PluginManager({ pluginLoader });
154
+
155
+ {
156
+ await manager.add(testMeta.id);
157
+ const result = await manager.activate(Events.Startup);
158
+ expect(result).toEqual(true);
159
+ expect(manager.active).toEqual([Hello.id]);
160
+ expect(count).toEqual(1);
161
+ }
162
+
163
+ {
164
+ const result = await manager.activate(Events.Startup);
165
+ expect(result).toEqual(false);
166
+ }
167
+
168
+ {
169
+ const result = await manager.reset(Events.Startup);
170
+ expect(result).toEqual(true);
171
+ expect(count).toEqual(2);
172
+ }
173
+ });
174
+
175
+ it('should not fire an unknown event', async () => {
176
+ const manager = new PluginManager({ pluginLoader });
177
+ const UnknownEvent = defineEvent('unknown');
178
+ expect(await manager.activate(UnknownEvent)).toEqual(false);
179
+ });
180
+
181
+ it('should be able to fire custom activation events', async () => {
182
+ const One = definePlugin({ id: 'dxos.org/test/one' }, [
183
+ defineModule({
184
+ id: 'dxos.org/test/one',
185
+ activatesOn: CountEvent,
186
+ activate: () => [contributes(Number, { number: 1 })],
187
+ }),
188
+ ]);
189
+ const Two = definePlugin({ id: 'dxos.org/test/two' }, [
190
+ defineModule({
191
+ id: 'dxos.org/test/two',
192
+ activatesOn: CountEvent,
193
+ activate: () => [contributes(Number, { number: 2 })],
194
+ }),
195
+ ]);
196
+ const Three = definePlugin({ id: 'dxos.org/test/three' }, [
197
+ defineModule({
198
+ id: 'dxos.org/test/three',
199
+ activatesOn: CountEvent,
200
+ activate: () => [contributes(Number, { number: 3 })],
201
+ }),
202
+ ]);
203
+ plugins = [One, Two, Three];
204
+
205
+ const manager = new PluginManager({ pluginLoader });
206
+ expect(manager.active).toEqual([]);
207
+ expect(manager.context.requestCapabilities(Number)).toHaveLength(0);
208
+
209
+ await manager.add(One.meta.id);
210
+ await manager.activate(CountEvent);
211
+ expect(manager.active).toEqual([One.meta.id]);
212
+ expect(manager.context.requestCapabilities(Number)).toHaveLength(1);
213
+
214
+ await manager.add(Two.meta.id);
215
+ await manager.activate(CountEvent);
216
+ expect(manager.active).toEqual([One.meta.id, Two.meta.id]);
217
+ expect(manager.context.requestCapabilities(Number)).toHaveLength(2);
218
+
219
+ await manager.add(Three.meta.id);
220
+ await manager.activate(CountEvent);
221
+ expect(manager.active).toEqual([One.meta.id, Two.meta.id, Three.meta.id]);
222
+ expect(manager.context.requestCapabilities(Number)).toHaveLength(3);
223
+ });
224
+
225
+ it('should only activate modules after all activatation events have been fired', async () => {
226
+ const Hello = defineModule({
227
+ id: 'dxos.org/test/hello',
228
+ activatesOn: allOf(Events.Startup, CountEvent),
229
+ activate: () => {
230
+ return contributes(String, { string: 'hello' });
231
+ },
232
+ });
233
+ plugins = [definePlugin(testMeta, [Hello])];
234
+
235
+ const manager = new PluginManager({ pluginLoader });
236
+ expect(manager.active).toEqual([]);
237
+ expect(manager.context.requestCapabilities(String)).toHaveLength(0);
238
+
239
+ await manager.add(testMeta.id);
240
+ await manager.activate(Events.Startup);
241
+ expect(manager.active).toEqual([]);
242
+ expect(manager.context.requestCapabilities(String)).toHaveLength(0);
243
+
244
+ await manager.activate(CountEvent);
245
+ expect(manager.active).toEqual([Hello.id]);
246
+ expect(manager.context.requestCapabilities(String)).toHaveLength(1);
247
+ });
248
+
249
+ it('should only activate modules once when multiple activatation events have been fired', async () => {
250
+ let count = 0;
251
+ const Hello = defineModule({
252
+ id: 'dxos.org/test/hello',
253
+ activatesOn: oneOf(Events.Startup, CountEvent),
254
+ activate: () => {
255
+ count++;
256
+ return contributes(String, { string: 'hello' });
257
+ },
258
+ });
259
+ plugins = [definePlugin(testMeta, [Hello])];
260
+
261
+ const manager = new PluginManager({ pluginLoader });
262
+ expect(manager.active).toEqual([]);
263
+ expect(manager.context.requestCapabilities(String)).toHaveLength(0);
264
+ expect(count).toEqual(0);
265
+
266
+ await manager.add(testMeta.id);
267
+ await manager.activate(CountEvent);
268
+ expect(manager.active).toEqual([Hello.id]);
269
+ expect(manager.context.requestCapabilities(String)).toHaveLength(1);
270
+ expect(count).toEqual(1);
271
+
272
+ await manager.activate(Events.Startup);
273
+ expect(manager.active).toEqual([Hello.id]);
274
+ expect(manager.context.requestCapabilities(String)).toHaveLength(1);
275
+ expect(count).toEqual(1);
276
+ });
277
+
278
+ it('should be able to disable and re-enable an active plugin', async () => {
279
+ const state = { total: 0 };
280
+ const computeTotal = (context: PluginsContext) => {
281
+ const numbers = context.requestCapabilities(Number);
282
+ state.total = numbers.reduce((acc, n) => acc + n.number, 0);
283
+ };
284
+
285
+ const Count = definePlugin({ id: 'dxos.org/test/count' }, [
286
+ defineModule({
287
+ id: 'dxos.org/test/count',
288
+ activatesOn: Events.Startup,
289
+ activatesBefore: [CountEvent],
290
+ activate: (context) => {
291
+ computeTotal(context);
292
+ return contributes(Total, state);
293
+ },
294
+ }),
295
+ ]);
296
+
297
+ const Test = definePlugin(testMeta, [
298
+ defineModule({
299
+ id: 'dxos.org/test/one',
300
+ activatesOn: CountEvent,
301
+ activate: () => contributes(Number, { number: 1 }),
302
+ }),
303
+ defineModule({
304
+ id: 'dxos.org/test/two',
305
+ activatesOn: CountEvent,
306
+ activate: () => contributes(Number, { number: 2 }),
307
+ }),
308
+ defineModule({
309
+ id: 'dxos.org/test/three',
310
+ activatesOn: CountEvent,
311
+ activate: () => contributes(Number, { number: 3 }),
312
+ }),
313
+ ]);
314
+ plugins = [Count, Test];
315
+
316
+ const manager = new PluginManager({ pluginLoader });
317
+ {
318
+ await manager.add(Test.meta.id);
319
+ await manager.add(Count.meta.id);
320
+ await manager.activate(Events.Startup);
321
+ expect(manager.active).toEqual([...Test.modules.map((m) => m.id), Count.meta.id]);
322
+ expect(manager.pendingReset).toEqual([]);
323
+
324
+ const totals = manager.context.requestCapabilities(Total);
325
+ expect(totals).toHaveLength(1);
326
+ expect(totals[0].total).toEqual(6);
327
+ }
328
+
329
+ {
330
+ await manager.disable(Test.meta.id);
331
+ expect(manager.active).toEqual([...Test.modules.map((m) => m.id), Count.meta.id]);
332
+ expect(manager.pendingReset).toEqual([CountEvent.id, Events.Startup.id]);
333
+
334
+ const totals = manager.context.requestCapabilities(Total);
335
+ expect(totals).toHaveLength(1);
336
+ expect(totals[0].total).toEqual(6);
337
+ }
338
+
339
+ {
340
+ await manager.reset(CountEvent);
341
+ expect(manager.active).toEqual([Count.meta.id]);
342
+ expect(manager.pendingReset).toEqual([Events.Startup.id]);
343
+
344
+ const totals = manager.context.requestCapabilities(Total);
345
+ expect(totals).toHaveLength(1);
346
+ expect(totals[0].total).toEqual(6);
347
+ }
348
+
349
+ {
350
+ await manager.reset(Events.Startup);
351
+ expect(manager.active).toEqual([Count.meta.id]);
352
+ expect(manager.pendingReset).toEqual([]);
353
+
354
+ const totals = manager.context.requestCapabilities(Total);
355
+ expect(totals).toHaveLength(1);
356
+ expect(totals[0].total).toEqual(0);
357
+ }
358
+
359
+ {
360
+ await manager.enable(Test.meta.id);
361
+ expect(manager.active).toEqual([Count.meta.id]);
362
+ expect(manager.pendingReset).toEqual([CountEvent.id, Events.Startup.id]);
363
+
364
+ const totals = manager.context.requestCapabilities(Total);
365
+ expect(totals).toHaveLength(1);
366
+ expect(totals[0].total).toEqual(0);
367
+ }
368
+
369
+ {
370
+ await manager.reset(CountEvent);
371
+ expect(manager.active).toEqual([Count.meta.id, ...Test.modules.map((m) => m.id)]);
372
+ expect(manager.pendingReset).toEqual([Events.Startup.id]);
373
+
374
+ const totals = manager.context.requestCapabilities(Total);
375
+ expect(totals).toHaveLength(1);
376
+ expect(totals[0].total).toEqual(0);
377
+ }
378
+
379
+ {
380
+ await manager.reset(Events.Startup);
381
+ expect(manager.active).toEqual([...Test.modules.map((m) => m.id), Count.meta.id]);
382
+ expect(manager.pendingReset).toEqual([]);
383
+
384
+ const totals = manager.context.requestCapabilities(Total);
385
+ expect(totals).toHaveLength(1);
386
+ expect(totals[0].total).toEqual(6);
387
+ }
388
+ });
389
+
390
+ it('should be able to handle live object contributions', async () => {
391
+ const id = 'dxos.org/test/counter';
392
+ const stateEvent = Events.createStateEvent(id);
393
+
394
+ const Test = definePlugin(testMeta, [
395
+ defineModule({
396
+ id,
397
+ activatesOn: Events.Startup,
398
+ activatesAfter: [stateEvent],
399
+ activate: () => contributes(Number, create({ number: 1 })),
400
+ }),
401
+ defineModule({
402
+ id: 'dxos.org/test/doubler',
403
+ activatesOn: stateEvent,
404
+ activate: (context) => {
405
+ const counter = context.requestCapability(Number);
406
+ const state = create({ total: counter.number * 2 });
407
+ const unsubscribe = effect(() => {
408
+ state.total = counter.number * 2;
409
+ });
410
+ return contributes(Total, state, () => unsubscribe());
411
+ },
412
+ }),
413
+ ]);
414
+ plugins = [Test];
415
+
416
+ const manager = new PluginManager({ pluginLoader });
417
+ await manager.add(Test.meta.id);
418
+ await manager.activate(Events.Startup);
419
+ expect(manager.active).toEqual(Test.modules.map((m) => m.id));
420
+
421
+ const counter = manager.context.requestCapability(Number);
422
+ const doubler = manager.context.requestCapability(Total);
423
+ expect(counter.number).toEqual(1);
424
+ expect(doubler.total).toEqual(2);
425
+
426
+ counter.number = 2;
427
+ expect(doubler.total).toEqual(4);
428
+ });
429
+
430
+ it('should be reactive', async () => {
431
+ const One = definePlugin({ id: 'dxos.org/test/one' }, [
432
+ defineModule({
433
+ id: 'dxos.org/test/one',
434
+ activatesOn: CountEvent,
435
+ activate: () => [contributes(Number, { number: 1 })],
436
+ }),
437
+ ]);
438
+ const Two = definePlugin({ id: 'dxos.org/test/two' }, [
439
+ defineModule({
440
+ id: 'dxos.org/test/two',
441
+ activatesOn: CountEvent,
442
+ activate: () => [contributes(Number, { number: 2 })],
443
+ }),
444
+ ]);
445
+ const Three = definePlugin({ id: 'dxos.org/test/three' }, [
446
+ defineModule({
447
+ id: 'dxos.org/test/three',
448
+ activatesOn: CountEvent,
449
+ activate: () => [contributes(Number, { number: 3 })],
450
+ }),
451
+ ]);
452
+ plugins = [One, Two, Three];
453
+
454
+ const manager = new PluginManager({ pluginLoader });
455
+ using pluginUpdates = updateCounter(() => {
456
+ const _ = manager.plugins.length;
457
+ });
458
+ using enabledUpdates = updateCounter(() => {
459
+ const _ = manager.enabled.length;
460
+ });
461
+ using modulesUpdates = updateCounter(() => {
462
+ const _ = manager.modules.length;
463
+ });
464
+ using activeUpdates = updateCounter(() => {
465
+ const _ = manager.active.length;
466
+ });
467
+ using pendingRemovalUpdates = updateCounter(() => {
468
+ const _ = manager.pendingRemoval.length;
469
+ });
470
+ using eventsFiredUpdates = updateCounter(() => {
471
+ const _ = manager.eventsFired.length;
472
+ });
473
+ using pendingResetUpdates = updateCounter(() => {
474
+ const _ = manager.pendingReset.length;
475
+ });
476
+ expect(pluginUpdates.count).toEqual(0);
477
+ expect(enabledUpdates.count).toEqual(0);
478
+ expect(modulesUpdates.count).toEqual(0);
479
+ expect(activeUpdates.count).toEqual(0);
480
+ expect(pendingRemovalUpdates.count).toEqual(0);
481
+ expect(eventsFiredUpdates.count).toEqual(0);
482
+ expect(pendingResetUpdates.count).toEqual(0);
483
+
484
+ await manager.add(One.meta.id);
485
+ expect(pluginUpdates.count).toEqual(1);
486
+ expect(enabledUpdates.count).toEqual(1);
487
+ expect(modulesUpdates.count).toEqual(1);
488
+ expect(activeUpdates.count).toEqual(0);
489
+ expect(pendingRemovalUpdates.count).toEqual(0);
490
+ expect(eventsFiredUpdates.count).toEqual(0);
491
+ expect(pendingResetUpdates.count).toEqual(0);
492
+
493
+ await manager.activate(CountEvent);
494
+ expect(pluginUpdates.count).toEqual(1);
495
+ expect(enabledUpdates.count).toEqual(1);
496
+ expect(modulesUpdates.count).toEqual(1);
497
+ expect(activeUpdates.count).toEqual(1);
498
+ expect(pendingRemovalUpdates.count).toEqual(0);
499
+ expect(eventsFiredUpdates.count).toEqual(1);
500
+ expect(pendingResetUpdates.count).toEqual(0);
501
+
502
+ await manager.add(Two.meta.id);
503
+ expect(pluginUpdates.count).toEqual(2);
504
+ expect(enabledUpdates.count).toEqual(2);
505
+ expect(modulesUpdates.count).toEqual(2);
506
+ expect(activeUpdates.count).toEqual(1);
507
+ expect(pendingRemovalUpdates.count).toEqual(0);
508
+ expect(eventsFiredUpdates.count).toEqual(1);
509
+ expect(pendingResetUpdates.count).toEqual(1);
510
+
511
+ await manager.activate(CountEvent);
512
+ expect(pluginUpdates.count).toEqual(2);
513
+ expect(enabledUpdates.count).toEqual(2);
514
+ expect(modulesUpdates.count).toEqual(2);
515
+ expect(activeUpdates.count).toEqual(2);
516
+ expect(pendingRemovalUpdates.count).toEqual(0);
517
+ expect(eventsFiredUpdates.count).toEqual(1);
518
+ expect(pendingResetUpdates.count).toEqual(2);
519
+
520
+ await manager.add(Three.meta.id);
521
+ expect(pluginUpdates.count).toEqual(3);
522
+ expect(enabledUpdates.count).toEqual(3);
523
+ expect(modulesUpdates.count).toEqual(3);
524
+ expect(activeUpdates.count).toEqual(2);
525
+ expect(pendingRemovalUpdates.count).toEqual(0);
526
+ expect(eventsFiredUpdates.count).toEqual(1);
527
+ expect(pendingResetUpdates.count).toEqual(3);
528
+
529
+ await manager.reset(CountEvent);
530
+ expect(pluginUpdates.count).toEqual(3);
531
+ expect(enabledUpdates.count).toEqual(3);
532
+ expect(modulesUpdates.count).toEqual(3);
533
+ // Starts at 2, plus deactivates 2, plus activates 3.
534
+ expect(activeUpdates.count).toEqual(7);
535
+ expect(pendingRemovalUpdates.count).toEqual(0);
536
+ expect(eventsFiredUpdates.count).toEqual(1);
537
+ expect(pendingResetUpdates.count).toEqual(4);
538
+
539
+ await manager.disable(One.meta.id);
540
+ expect(pluginUpdates.count).toEqual(3);
541
+ expect(enabledUpdates.count).toEqual(4);
542
+ expect(modulesUpdates.count).toEqual(3);
543
+ expect(activeUpdates.count).toEqual(7);
544
+ expect(pendingRemovalUpdates.count).toEqual(1);
545
+ expect(eventsFiredUpdates.count).toEqual(1);
546
+ expect(pendingResetUpdates.count).toEqual(5);
547
+
548
+ await manager.remove(One.meta.id);
549
+ expect(pluginUpdates.count).toEqual(4);
550
+ expect(enabledUpdates.count).toEqual(4);
551
+ expect(modulesUpdates.count).toEqual(3);
552
+ expect(activeUpdates.count).toEqual(7);
553
+ expect(pendingRemovalUpdates.count).toEqual(1);
554
+ expect(eventsFiredUpdates.count).toEqual(1);
555
+ expect(pendingResetUpdates.count).toEqual(5);
556
+
557
+ await manager.reset(CountEvent);
558
+ expect(pluginUpdates.count).toEqual(4);
559
+ expect(enabledUpdates.count).toEqual(4);
560
+ expect(modulesUpdates.count).toEqual(4);
561
+ // Starts at 7, plus deactivates 3, plus activates 2.
562
+ expect(activeUpdates.count).toEqual(12);
563
+ expect(pendingRemovalUpdates.count).toEqual(2);
564
+ expect(eventsFiredUpdates.count).toEqual(1);
565
+ expect(pendingResetUpdates.count).toEqual(6);
566
+ });
567
+ });