@dxos/app-framework 0.10.0 → 0.11.0

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 (294) hide show
  1. package/.storybook/main.mts +1 -1
  2. package/.storybook/preview.mts +2 -2
  3. package/CHANGELOG.md +93 -0
  4. package/TASKS.md +11 -0
  5. package/dist/lib/chunk-SurfaceManager.mjs +960 -0
  6. package/dist/lib/chunk-SurfaceManager.mjs.map +1 -0
  7. package/dist/lib/chunk-capability.mjs +15 -0
  8. package/dist/lib/chunk-capability.mjs.map +1 -0
  9. package/dist/lib/{browser/chunk-FJ4765WW.mjs → chunk-context.mjs} +4 -5
  10. package/dist/lib/chunk-context.mjs.map +1 -0
  11. package/dist/lib/chunk-history-tracker.mjs +160 -0
  12. package/dist/lib/chunk-history-tracker.mjs.map +1 -0
  13. package/dist/lib/chunk-plugin-manager.mjs +1390 -0
  14. package/dist/lib/chunk-plugin-manager.mjs.map +1 -0
  15. package/dist/lib/chunk-plugin-manifest.mjs +125 -0
  16. package/dist/lib/chunk-plugin-manifest.mjs.map +1 -0
  17. package/dist/lib/chunk-process-manager-capability.mjs +126 -0
  18. package/dist/lib/chunk-process-manager-capability.mjs.map +1 -0
  19. package/dist/lib/chunk-rolldown-runtime.mjs +13 -0
  20. package/dist/lib/chunk-url-loader.mjs +347 -0
  21. package/dist/lib/chunk-url-loader.mjs.map +1 -0
  22. package/dist/lib/cli.mjs +78 -0
  23. package/dist/lib/cli.mjs.map +1 -0
  24. package/dist/lib/common/activation-events.mjs +35 -0
  25. package/dist/lib/common/activation-events.mjs.map +1 -0
  26. package/dist/lib/common/capabilities.mjs +184 -0
  27. package/dist/lib/common/capabilities.mjs.map +1 -0
  28. package/dist/lib/config.mjs +2 -0
  29. package/dist/lib/core/activation-event.mjs +55 -0
  30. package/dist/lib/core/activation-event.mjs.map +1 -0
  31. package/dist/lib/core/capability.mjs +189 -0
  32. package/dist/lib/core/capability.mjs.map +1 -0
  33. package/dist/lib/core/plugin-manager.mjs +2 -0
  34. package/dist/lib/core/plugin.mjs +340 -0
  35. package/dist/lib/core/plugin.mjs.map +1 -0
  36. package/dist/lib/core/url-loader.mjs +2 -0
  37. package/dist/lib/index.mjs +134 -0
  38. package/dist/lib/index.mjs.map +1 -0
  39. package/dist/lib/testing/react.mjs +70 -0
  40. package/dist/lib/testing/react.mjs.map +1 -0
  41. package/dist/lib/testing.mjs +399 -0
  42. package/dist/lib/testing.mjs.map +1 -0
  43. package/dist/lib/ui.mjs +636 -0
  44. package/dist/lib/ui.mjs.map +1 -0
  45. package/dist/lib/vite-plugin.mjs +986 -0
  46. package/dist/lib/vite-plugin.mjs.map +1 -0
  47. package/dist/plugin/node-esm/index.mjs +4 -3
  48. package/dist/plugin/node-esm/index.mjs.map +3 -3
  49. package/dist/plugin/node-esm/meta.json +1 -1
  50. package/dist/types/src/common/Role.d.ts +31 -0
  51. package/dist/types/src/common/Role.d.ts.map +1 -0
  52. package/dist/types/src/common/Role.test.d.ts +2 -0
  53. package/dist/types/src/common/Role.test.d.ts.map +1 -0
  54. package/dist/types/src/common/capabilities.d.ts +11 -2
  55. package/dist/types/src/common/capabilities.d.ts.map +1 -1
  56. package/dist/types/src/common/index.d.ts +1 -0
  57. package/dist/types/src/common/index.d.ts.map +1 -1
  58. package/dist/types/src/core/capability-manager.d.ts +1 -1
  59. package/dist/types/src/core/capability-manager.d.ts.map +1 -1
  60. package/dist/types/src/core/capability.d.ts +38 -5
  61. package/dist/types/src/core/capability.d.ts.map +1 -1
  62. package/dist/types/src/core/plugin-manager.d.ts +1 -1
  63. package/dist/types/src/core/plugin-manager.d.ts.map +1 -1
  64. package/dist/types/src/core/plugin.d.ts +14 -1
  65. package/dist/types/src/core/plugin.d.ts.map +1 -1
  66. package/dist/types/src/core/registry.d.ts +1 -1
  67. package/dist/types/src/core/registry.d.ts.map +1 -1
  68. package/dist/types/src/plugin-process-manager/history/capability.d.ts +1 -1
  69. package/dist/types/src/plugin-process-manager/process-manager-capability.d.ts +1 -1
  70. package/dist/types/src/plugin-process-manager/process-manager-capability.d.ts.map +1 -1
  71. package/dist/types/src/testing/StorybookErrorFallback.d.ts +15 -0
  72. package/dist/types/src/testing/StorybookErrorFallback.d.ts.map +1 -0
  73. package/dist/types/src/testing/harness.d.ts +1 -1
  74. package/dist/types/src/testing/harness.d.ts.map +1 -1
  75. package/dist/types/src/testing/index.d.ts +2 -0
  76. package/dist/types/src/testing/index.d.ts.map +1 -1
  77. package/dist/types/src/testing/react.d.ts +4 -4
  78. package/dist/types/src/testing/react.d.ts.map +1 -1
  79. package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
  80. package/dist/types/src/testing/withPluginManager.stories.d.ts +6 -0
  81. package/dist/types/src/testing/withPluginManager.stories.d.ts.map +1 -1
  82. package/dist/types/src/testing/withSurfaceDebug.d.ts +10 -0
  83. package/dist/types/src/testing/withSurfaceDebug.d.ts.map +1 -0
  84. package/dist/types/src/ui/components/App/App.d.ts +0 -32
  85. package/dist/types/src/ui/components/App/App.d.ts.map +1 -1
  86. package/dist/types/src/ui/components/App/index.d.ts +1 -0
  87. package/dist/types/src/ui/components/App/index.d.ts.map +1 -1
  88. package/dist/types/src/ui/components/App/loader.d.ts +35 -0
  89. package/dist/types/src/ui/components/App/loader.d.ts.map +1 -0
  90. package/dist/types/src/ui/components/HomeSection/HomeSection.d.ts +26 -0
  91. package/dist/types/src/ui/components/HomeSection/HomeSection.d.ts.map +1 -0
  92. package/dist/types/src/ui/components/HomeSection/HomeSection.stories.d.ts +15 -0
  93. package/dist/types/src/ui/components/HomeSection/HomeSection.stories.d.ts.map +1 -0
  94. package/dist/types/src/ui/components/HomeSection/index.d.ts +2 -0
  95. package/dist/types/src/ui/components/HomeSection/index.d.ts.map +1 -0
  96. package/dist/types/src/ui/components/NamePopover/NamePopover.d.ts +14 -0
  97. package/dist/types/src/ui/components/NamePopover/NamePopover.d.ts.map +1 -0
  98. package/dist/types/src/ui/components/NamePopover/index.d.ts +2 -0
  99. package/dist/types/src/ui/components/NamePopover/index.d.ts.map +1 -0
  100. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts +21 -9
  101. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts.map +1 -1
  102. package/dist/types/src/ui/components/Surface/SurfaceComponent.stories.d.ts +4 -1
  103. package/dist/types/src/ui/components/Surface/SurfaceComponent.stories.d.ts.map +1 -1
  104. package/dist/types/src/ui/components/Surface/SurfaceComponent.test.d.ts +2 -0
  105. package/dist/types/src/ui/components/Surface/SurfaceComponent.test.d.ts.map +1 -0
  106. package/dist/types/src/ui/components/Surface/SurfaceDebug.d.ts +40 -0
  107. package/dist/types/src/ui/components/Surface/SurfaceDebug.d.ts.map +1 -0
  108. package/dist/types/src/ui/components/Surface/SurfaceManager.d.ts +23 -0
  109. package/dist/types/src/ui/components/Surface/SurfaceManager.d.ts.map +1 -0
  110. package/dist/types/src/ui/components/Surface/SurfaceManagerContext.d.ts +11 -0
  111. package/dist/types/src/ui/components/Surface/SurfaceManagerContext.d.ts.map +1 -0
  112. package/dist/types/src/ui/components/Surface/SurfaceMetrics.d.ts +72 -0
  113. package/dist/types/src/ui/components/Surface/SurfaceMetrics.d.ts.map +1 -0
  114. package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts.map +1 -1
  115. package/dist/types/src/ui/components/Surface/index.d.ts +20 -25
  116. package/dist/types/src/ui/components/Surface/index.d.ts.map +1 -1
  117. package/dist/types/src/ui/components/Surface/types.d.ts +56 -52
  118. package/dist/types/src/ui/components/Surface/types.d.ts.map +1 -1
  119. package/dist/types/src/ui/components/index.d.ts +2 -0
  120. package/dist/types/src/ui/components/index.d.ts.map +1 -1
  121. package/dist/types/src/ui/hooks/useApp.d.ts.map +1 -1
  122. package/dist/types/tsconfig.tsbuildinfo +1 -1
  123. package/moon.yml +25 -18
  124. package/package.json +58 -73
  125. package/src/common/Role.test.ts +41 -0
  126. package/src/common/Role.ts +54 -0
  127. package/src/common/capabilities.ts +17 -2
  128. package/src/common/index.ts +1 -0
  129. package/src/core/capability-manager.test.ts +1 -1
  130. package/src/core/capability-manager.ts +1 -1
  131. package/src/core/capability.ts +45 -6
  132. package/src/core/plugin-manager.test.ts +38 -3
  133. package/src/core/plugin-manager.ts +18 -1
  134. package/src/core/plugin.ts +16 -1
  135. package/src/core/registry.ts +1 -1
  136. package/src/plugin-process-manager/process-manager-capability.ts +25 -2
  137. package/src/testing/StorybookErrorFallback.tsx +40 -0
  138. package/src/testing/harness.ts +1 -1
  139. package/src/testing/index.ts +2 -0
  140. package/src/testing/react.test.tsx +2 -1
  141. package/src/testing/react.tsx +14 -8
  142. package/src/testing/withPluginManager.stories.tsx +16 -1
  143. package/src/testing/withPluginManager.tsx +13 -2
  144. package/src/testing/withSurfaceDebug.tsx +22 -0
  145. package/src/ui/components/App/App.tsx +7 -35
  146. package/src/ui/components/App/index.ts +1 -0
  147. package/src/ui/components/App/loader.ts +39 -0
  148. package/src/ui/components/HomeSection/HomeSection.stories.tsx +43 -0
  149. package/src/ui/components/HomeSection/HomeSection.tsx +69 -0
  150. package/src/ui/components/HomeSection/index.ts +5 -0
  151. package/src/ui/components/NamePopover/NamePopover.tsx +70 -0
  152. package/src/ui/components/NamePopover/index.ts +5 -0
  153. package/src/ui/components/Surface/DESIGN.md +136 -0
  154. package/src/ui/components/Surface/SurfaceComponent.stories.tsx +70 -41
  155. package/src/ui/components/Surface/SurfaceComponent.test.tsx +403 -0
  156. package/src/ui/components/Surface/SurfaceComponent.tsx +209 -189
  157. package/src/ui/components/Surface/SurfaceDebug.tsx +435 -0
  158. package/src/ui/components/Surface/SurfaceManager.ts +95 -0
  159. package/src/ui/components/Surface/SurfaceManagerContext.ts +23 -0
  160. package/src/ui/components/Surface/SurfaceMetrics.ts +202 -0
  161. package/src/ui/components/Surface/SurfaceProfilerContext.tsx +12 -2
  162. package/src/ui/components/Surface/index.ts +24 -22
  163. package/src/ui/components/Surface/types.test.ts +47 -54
  164. package/src/ui/components/Surface/types.ts +66 -91
  165. package/src/ui/components/index.ts +2 -0
  166. package/src/ui/hooks/useApp.tsx +7 -3
  167. package/src/vite-plugin/boot-loader/loader-app/boot-loader.css +1 -1
  168. package/tsconfig.json +3 -0
  169. package/vite.config.ts +26 -0
  170. package/dist/lib/browser/capability-S44TE2H7.mjs +0 -35
  171. package/dist/lib/browser/capability-S44TE2H7.mjs.map +0 -7
  172. package/dist/lib/browser/chunk-3NQLTQCP.mjs +0 -47
  173. package/dist/lib/browser/chunk-3NQLTQCP.mjs.map +0 -7
  174. package/dist/lib/browser/chunk-53HJHMS5.mjs +0 -7
  175. package/dist/lib/browser/chunk-53HJHMS5.mjs.map +0 -7
  176. package/dist/lib/browser/chunk-FJ4765WW.mjs.map +0 -7
  177. package/dist/lib/browser/chunk-J5LGTIGS.mjs +0 -10
  178. package/dist/lib/browser/chunk-J5LGTIGS.mjs.map +0 -7
  179. package/dist/lib/browser/chunk-KRJ4KK2W.mjs +0 -505
  180. package/dist/lib/browser/chunk-KRJ4KK2W.mjs.map +0 -7
  181. package/dist/lib/browser/chunk-LUH4Y5F2.mjs +0 -430
  182. package/dist/lib/browser/chunk-LUH4Y5F2.mjs.map +0 -7
  183. package/dist/lib/browser/chunk-NKVRSMFN.mjs +0 -95
  184. package/dist/lib/browser/chunk-NKVRSMFN.mjs.map +0 -7
  185. package/dist/lib/browser/chunk-OO53M5UK.mjs +0 -260
  186. package/dist/lib/browser/chunk-OO53M5UK.mjs.map +0 -7
  187. package/dist/lib/browser/chunk-OPTS3ZSN.mjs +0 -83
  188. package/dist/lib/browser/chunk-OPTS3ZSN.mjs.map +0 -7
  189. package/dist/lib/browser/chunk-Q2GLJTVV.mjs +0 -12
  190. package/dist/lib/browser/chunk-Q2GLJTVV.mjs.map +0 -7
  191. package/dist/lib/browser/chunk-SYXIYT6T.mjs +0 -143
  192. package/dist/lib/browser/chunk-SYXIYT6T.mjs.map +0 -7
  193. package/dist/lib/browser/chunk-U5MESPM5.mjs +0 -603
  194. package/dist/lib/browser/chunk-U5MESPM5.mjs.map +0 -7
  195. package/dist/lib/browser/chunk-UGYCLOXE.mjs +0 -1471
  196. package/dist/lib/browser/chunk-UGYCLOXE.mjs.map +0 -7
  197. package/dist/lib/browser/chunk-VF37YTXJ.mjs +0 -28
  198. package/dist/lib/browser/chunk-VF37YTXJ.mjs.map +0 -7
  199. package/dist/lib/browser/chunk-YUVQIOTB.mjs +0 -60
  200. package/dist/lib/browser/chunk-YUVQIOTB.mjs.map +0 -7
  201. package/dist/lib/browser/cli/index.mjs +0 -74
  202. package/dist/lib/browser/cli/index.mjs.map +0 -7
  203. package/dist/lib/browser/common/activation-events.mjs +0 -20
  204. package/dist/lib/browser/common/activation-events.mjs.map +0 -7
  205. package/dist/lib/browser/common/capabilities.mjs +0 -56
  206. package/dist/lib/browser/common/capabilities.mjs.map +0 -7
  207. package/dist/lib/browser/config/index.mjs +0 -8
  208. package/dist/lib/browser/config/index.mjs.map +0 -7
  209. package/dist/lib/browser/core/activation-event.mjs +0 -20
  210. package/dist/lib/browser/core/activation-event.mjs.map +0 -7
  211. package/dist/lib/browser/core/capability.mjs +0 -32
  212. package/dist/lib/browser/core/capability.mjs.map +0 -7
  213. package/dist/lib/browser/core/plugin-manager.mjs +0 -19
  214. package/dist/lib/browser/core/plugin-manager.mjs.map +0 -7
  215. package/dist/lib/browser/core/plugin.mjs +0 -51
  216. package/dist/lib/browser/core/plugin.mjs.map +0 -7
  217. package/dist/lib/browser/core/url-loader.mjs +0 -24
  218. package/dist/lib/browser/core/url-loader.mjs.map +0 -7
  219. package/dist/lib/browser/index.mjs +0 -98
  220. package/dist/lib/browser/index.mjs.map +0 -7
  221. package/dist/lib/browser/meta.json +0 -1
  222. package/dist/lib/browser/process-manager-capability-QK4BMKMN.mjs +0 -132
  223. package/dist/lib/browser/process-manager-capability-QK4BMKMN.mjs.map +0 -7
  224. package/dist/lib/browser/testing/index.mjs +0 -359
  225. package/dist/lib/browser/testing/index.mjs.map +0 -7
  226. package/dist/lib/browser/testing/react.mjs +0 -78
  227. package/dist/lib/browser/testing/react.mjs.map +0 -7
  228. package/dist/lib/browser/ui/index.mjs +0 -60
  229. package/dist/lib/browser/ui/index.mjs.map +0 -7
  230. package/dist/lib/node-esm/capability-3YRF77LV.mjs +0 -36
  231. package/dist/lib/node-esm/capability-3YRF77LV.mjs.map +0 -7
  232. package/dist/lib/node-esm/chunk-2UPUZXGU.mjs +0 -9
  233. package/dist/lib/node-esm/chunk-2UPUZXGU.mjs.map +0 -7
  234. package/dist/lib/node-esm/chunk-37Z53PXZ.mjs +0 -10
  235. package/dist/lib/node-esm/chunk-37Z53PXZ.mjs.map +0 -7
  236. package/dist/lib/node-esm/chunk-4SE7SX7N.mjs +0 -261
  237. package/dist/lib/node-esm/chunk-4SE7SX7N.mjs.map +0 -7
  238. package/dist/lib/node-esm/chunk-BMW6P6QA.mjs +0 -48
  239. package/dist/lib/node-esm/chunk-BMW6P6QA.mjs.map +0 -7
  240. package/dist/lib/node-esm/chunk-COHOWGGJ.mjs +0 -144
  241. package/dist/lib/node-esm/chunk-COHOWGGJ.mjs.map +0 -7
  242. package/dist/lib/node-esm/chunk-DRT75WGD.mjs +0 -604
  243. package/dist/lib/node-esm/chunk-DRT75WGD.mjs.map +0 -7
  244. package/dist/lib/node-esm/chunk-FKMVORZN.mjs +0 -431
  245. package/dist/lib/node-esm/chunk-FKMVORZN.mjs.map +0 -7
  246. package/dist/lib/node-esm/chunk-FPW45EZH.mjs +0 -14
  247. package/dist/lib/node-esm/chunk-FPW45EZH.mjs.map +0 -7
  248. package/dist/lib/node-esm/chunk-GLH4LGHZ.mjs +0 -84
  249. package/dist/lib/node-esm/chunk-GLH4LGHZ.mjs.map +0 -7
  250. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +0 -11
  251. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +0 -7
  252. package/dist/lib/node-esm/chunk-IL7O7IRX.mjs +0 -1472
  253. package/dist/lib/node-esm/chunk-IL7O7IRX.mjs.map +0 -7
  254. package/dist/lib/node-esm/chunk-ND2HETHD.mjs +0 -506
  255. package/dist/lib/node-esm/chunk-ND2HETHD.mjs.map +0 -7
  256. package/dist/lib/node-esm/chunk-TLKYZKPW.mjs +0 -29
  257. package/dist/lib/node-esm/chunk-TLKYZKPW.mjs.map +0 -7
  258. package/dist/lib/node-esm/chunk-VCPGX7WN.mjs +0 -62
  259. package/dist/lib/node-esm/chunk-VCPGX7WN.mjs.map +0 -7
  260. package/dist/lib/node-esm/chunk-XSZMX53L.mjs +0 -96
  261. package/dist/lib/node-esm/chunk-XSZMX53L.mjs.map +0 -7
  262. package/dist/lib/node-esm/cli/index.mjs +0 -75
  263. package/dist/lib/node-esm/cli/index.mjs.map +0 -7
  264. package/dist/lib/node-esm/common/activation-events.mjs +0 -21
  265. package/dist/lib/node-esm/common/activation-events.mjs.map +0 -7
  266. package/dist/lib/node-esm/common/capabilities.mjs +0 -57
  267. package/dist/lib/node-esm/common/capabilities.mjs.map +0 -7
  268. package/dist/lib/node-esm/config/index.mjs +0 -9
  269. package/dist/lib/node-esm/config/index.mjs.map +0 -7
  270. package/dist/lib/node-esm/core/activation-event.mjs +0 -21
  271. package/dist/lib/node-esm/core/activation-event.mjs.map +0 -7
  272. package/dist/lib/node-esm/core/capability.mjs +0 -33
  273. package/dist/lib/node-esm/core/capability.mjs.map +0 -7
  274. package/dist/lib/node-esm/core/plugin-manager.mjs +0 -20
  275. package/dist/lib/node-esm/core/plugin-manager.mjs.map +0 -7
  276. package/dist/lib/node-esm/core/plugin.mjs +0 -52
  277. package/dist/lib/node-esm/core/plugin.mjs.map +0 -7
  278. package/dist/lib/node-esm/core/url-loader.mjs +0 -25
  279. package/dist/lib/node-esm/core/url-loader.mjs.map +0 -7
  280. package/dist/lib/node-esm/index.mjs +0 -99
  281. package/dist/lib/node-esm/index.mjs.map +0 -7
  282. package/dist/lib/node-esm/meta.json +0 -1
  283. package/dist/lib/node-esm/process-manager-capability-5S7WZ2JR.mjs +0 -133
  284. package/dist/lib/node-esm/process-manager-capability-5S7WZ2JR.mjs.map +0 -7
  285. package/dist/lib/node-esm/testing/index.mjs +0 -360
  286. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  287. package/dist/lib/node-esm/testing/react.mjs +0 -79
  288. package/dist/lib/node-esm/testing/react.mjs.map +0 -7
  289. package/dist/lib/node-esm/ui/index.mjs +0 -61
  290. package/dist/lib/node-esm/ui/index.mjs.map +0 -7
  291. package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts +0 -11
  292. package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts.map +0 -1
  293. package/src/ui/components/Surface/SurfaceInfo.tsx +0 -106
  294. package/vitest.config.ts +0 -14
@@ -1,603 +0,0 @@
1
- import {
2
- capabilities_exports
3
- } from "./chunk-NKVRSMFN.mjs";
4
-
5
- // src/helpers.ts
6
- var topologicalSort = (nodes) => {
7
- const getDependencies = (nodeId, seen = /* @__PURE__ */ new Set(), path = /* @__PURE__ */ new Set()) => {
8
- if (path.has(nodeId)) {
9
- throw new Error(`Circular dependency detected involving ${nodeId}`);
10
- }
11
- if (seen.has(nodeId)) {
12
- return [];
13
- }
14
- const node = nodes.find((n) => n.id === nodeId);
15
- if (!node) {
16
- throw new Error(`Node ${nodeId} not found but is listed as a dependency`);
17
- }
18
- const newPath = /* @__PURE__ */ new Set([
19
- ...path,
20
- nodeId
21
- ]);
22
- const newSeen = /* @__PURE__ */ new Set([
23
- ...seen,
24
- nodeId
25
- ]);
26
- const dependsOn = node.dependsOn ?? [];
27
- return [
28
- ...dependsOn.flatMap((depId) => getDependencies(depId, newSeen, newPath)),
29
- nodeId
30
- ];
31
- };
32
- const allDependencies = nodes.map((node) => node.id).flatMap((id) => getDependencies(id)).filter((id, index, self) => self.indexOf(id) === index);
33
- return allDependencies.map((id) => nodes.find((node) => node.id === id)).filter((node) => node !== void 0);
34
- };
35
-
36
- // src/ui/hooks/useSurface.ts
37
- import { useContext as useContext3 } from "react";
38
- import { raise as raise2 } from "@dxos/debug";
39
-
40
- // src/ui/components/PluginManager/PluginManagerProvider.ts
41
- import { createContext, useContext } from "react";
42
- import { raise } from "@dxos/debug";
43
- var PluginManagerContext = createContext(void 0);
44
- var usePluginManager = () => useContext(PluginManagerContext) ?? raise(new Error("Missing PluginManagerContext"));
45
- var useOptionalPluginManager = () => useContext(PluginManagerContext);
46
- var PluginManagerProvider = PluginManagerContext.Provider;
47
-
48
- // src/ui/components/Surface/context.ts
49
- import { createContext as createContext2 } from "react";
50
- var SurfaceContext = createContext2(void 0);
51
-
52
- // src/ui/components/Surface/SurfaceComponent.tsx
53
- import { useAtomValue } from "@effect-atom/atom-react";
54
- import React3, { Fragment, Profiler, Suspense, forwardRef as forwardRef2, memo, useEffect, useMemo as useMemo2, useRef as useRef2 } from "react";
55
- import { log } from "@dxos/log";
56
- import { ErrorBoundary } from "@dxos/react-error-boundary";
57
- import { useDefaultValue } from "@dxos/react-hooks";
58
- import { Position } from "@dxos/util";
59
-
60
- // src/ui/components/Surface/SurfaceInfo.tsx
61
- import React, { cloneElement, forwardRef, useCallback, useLayoutEffect, useState } from "react";
62
- import { createPortal } from "react-dom";
63
- import { addEventListener, combine } from "@dxos/async";
64
- import { useMergeRefs } from "@dxos/react-hooks";
65
- var SurfaceInfo = /* @__PURE__ */ forwardRef(({ children }, forwardedRef) => {
66
- const [rect, setRect] = useState(null);
67
- const [expand, setExpand] = useState(false);
68
- const info = useSurface();
69
- const [root, setRoot] = useState(null);
70
- const measureRef = useCallback((node) => setRoot(node), []);
71
- const mergedRef = useMergeRefs([
72
- measureRef,
73
- forwardedRef
74
- ]);
75
- const childWithRef = /* @__PURE__ */ cloneElement(children, {
76
- ref: mergedRef
77
- });
78
- useLayoutEffect(() => {
79
- if (!root) {
80
- setRect(null);
81
- return;
82
- }
83
- const measure = () => {
84
- setRect(root.getBoundingClientRect());
85
- };
86
- const observer = new ResizeObserver(measure);
87
- observer.observe(root);
88
- measure();
89
- return combine(addEventListener(window, "scroll", measure, true), addEventListener(window, "resize", measure), () => {
90
- observer.disconnect();
91
- });
92
- }, [
93
- root
94
- ]);
95
- const padding = 0;
96
- return /* @__PURE__ */ React.createElement(React.Fragment, null, childWithRef, rect && /* @__PURE__ */ createPortal(
97
- /* @__PURE__ */ React.createElement("div", {
98
- className: "z-[100] fixed flex flex-col-reverse scrollbar-none overflow-auto pointer-events-none",
99
- style: {
100
- top: rect.top + padding,
101
- left: rect.left + padding,
102
- width: rect.width - padding * 2,
103
- height: rect.height - padding * 2
104
- }
105
- }, expand ? /* @__PURE__ */ React.createElement("div", {
106
- className: "absolute inset-0 bg-deck-surface border border-green-500 cursor-pointer pointer-events-auto overflow-auto",
107
- onPointerDown: (ev) => ev.stopPropagation(),
108
- onClick: (ev) => {
109
- ev.stopPropagation();
110
- setExpand(false);
111
- }
112
- }, /* @__PURE__ */ React.createElement("pre", {
113
- className: "p-2 text-xs text-description font-mono"
114
- }, JSON.stringify({
115
- info
116
- }, null, 2))) : /* @__PURE__ */ React.createElement("span", {
117
- className: "absolute right-1 bottom-0 flex items-center p-1 text-green-500 opacity-80 hover:opacity-100 text-xl cursor-pointer pointer-events-auto",
118
- title: info.id,
119
- onPointerDown: (ev) => ev.stopPropagation(),
120
- onClick: (ev) => {
121
- ev.stopPropagation();
122
- setExpand(true);
123
- }
124
- }, "\u24D8")),
125
- // TODO(burdon): Create well-known element to gather all debug portals.
126
- document.body
127
- ));
128
- });
129
-
130
- // src/ui/components/Surface/SurfaceProfilerContext.tsx
131
- import React2, { createContext as createContext3, useContext as useContext2, useMemo, useRef, useSyncExternalStore } from "react";
132
- var MAX_ENTRIES = 500;
133
- var SurfaceProfilerStore = class {
134
- _entries = [];
135
- _listeners = /* @__PURE__ */ new Set();
136
- _snapshot = [];
137
- _pendingNotify = false;
138
- /** Records an entry and schedules a deferred notification to avoid re-render loops. */
139
- record(entry) {
140
- this._entries.push(entry);
141
- if (this._entries.length > MAX_ENTRIES) {
142
- this._entries = this._entries.slice(-MAX_ENTRIES);
143
- }
144
- this._snapshot = [
145
- ...this._entries
146
- ];
147
- this._scheduleNotify();
148
- }
149
- clear() {
150
- this._entries = [];
151
- this._snapshot = [];
152
- this._notifySync();
153
- }
154
- subscribe = (listener) => {
155
- this._listeners.add(listener);
156
- return () => {
157
- this._listeners.delete(listener);
158
- };
159
- };
160
- getSnapshot = () => {
161
- return this._snapshot;
162
- };
163
- /**
164
- * Defers notification to the next animation frame to break the
165
- * Profiler onRender → record → notify → re-render → onRender loop.
166
- */
167
- _scheduleNotify() {
168
- if (!this._pendingNotify) {
169
- this._pendingNotify = true;
170
- requestAnimationFrame(() => {
171
- this._pendingNotify = false;
172
- this._notifySync();
173
- });
174
- }
175
- }
176
- _notifySync() {
177
- for (const listener of this._listeners) {
178
- listener();
179
- }
180
- }
181
- };
182
- var SurfaceProfilerContext = /* @__PURE__ */ createContext3(void 0);
183
- var SurfaceProfilerProvider = ({ children }) => {
184
- const storeRef = useRef(null);
185
- if (!storeRef.current) {
186
- storeRef.current = new SurfaceProfilerStore();
187
- }
188
- return /* @__PURE__ */ React2.createElement(SurfaceProfilerContext.Provider, {
189
- value: {
190
- store: storeRef.current
191
- }
192
- }, children);
193
- };
194
- var useSurfaceProfilerCallback = () => {
195
- const store = useContext2(SurfaceProfilerContext)?.store;
196
- return useMemo(() => {
197
- if (!store) {
198
- return void 0;
199
- }
200
- return (id, phase, actualDuration, baseDuration, startTime, commitTime) => {
201
- store.record({
202
- id,
203
- phase,
204
- actualDuration,
205
- baseDuration,
206
- startTime,
207
- commitTime,
208
- timestamp: Date.now()
209
- });
210
- };
211
- }, [
212
- store
213
- ]);
214
- };
215
- var useSurfaceProfilerEntries = () => {
216
- const context = useContext2(SurfaceProfilerContext);
217
- return useSyncExternalStore(context?.store.subscribe ?? noop, context?.store.getSnapshot ?? emptySnapshot);
218
- };
219
- var useSurfaceProfilerStats = () => {
220
- const entries = useSurfaceProfilerEntries();
221
- const statsMap = /* @__PURE__ */ new Map();
222
- for (const entry of entries) {
223
- let stats = statsMap.get(entry.id);
224
- if (!stats) {
225
- stats = {
226
- id: entry.id,
227
- mountCount: 0,
228
- updateCount: 0,
229
- totalRenders: 0,
230
- avgActualDuration: 0,
231
- maxActualDuration: 0,
232
- avgBaseDuration: 0,
233
- lastActualDuration: 0,
234
- lastCommitTime: 0
235
- };
236
- statsMap.set(entry.id, stats);
237
- }
238
- if (entry.phase === "mount") {
239
- stats.mountCount++;
240
- } else {
241
- stats.updateCount++;
242
- }
243
- stats.totalRenders++;
244
- stats.avgActualDuration = (stats.avgActualDuration * (stats.totalRenders - 1) + entry.actualDuration) / stats.totalRenders;
245
- stats.avgBaseDuration = (stats.avgBaseDuration * (stats.totalRenders - 1) + entry.baseDuration) / stats.totalRenders;
246
- stats.maxActualDuration = Math.max(stats.maxActualDuration, entry.actualDuration);
247
- stats.lastActualDuration = entry.actualDuration;
248
- stats.lastCommitTime = entry.commitTime;
249
- }
250
- return [
251
- ...statsMap.values()
252
- ].sort((a, b) => b.maxActualDuration - a.maxActualDuration);
253
- };
254
- var useSurfaceProfilerClear = () => {
255
- const store = useContext2(SurfaceProfilerContext)?.store;
256
- return useMemo(() => store ? () => store.clear() : void 0, [
257
- store
258
- ]);
259
- };
260
- var noop = () => () => {
261
- };
262
- var EMPTY_SNAPSHOT = [];
263
- var emptySnapshot = () => EMPTY_SNAPSHOT;
264
-
265
- // src/ui/components/Surface/SurfaceComponent.tsx
266
- var __dxlog_file = "/__w/dxos/dxos/packages/sdk/app-framework/src/ui/components/Surface/SurfaceComponent.tsx";
267
- var DEBUG = import.meta.env?.VITE_DEBUG;
268
- var DEFAULT_PLACEHOLDER = /* @__PURE__ */ React3.createElement(Fragment, null);
269
- var WebComponentWrapper = /* @__PURE__ */ memo(/* @__PURE__ */ forwardRef2(({ id, role, data, limit, definition, ...rest }, forwardedRef) => {
270
- const containerRef = useRef2(null);
271
- const elementRef = useRef2(null);
272
- const propsRef = useRef2({
273
- id,
274
- role,
275
- data,
276
- limit,
277
- ...rest
278
- });
279
- propsRef.current = {
280
- id,
281
- role,
282
- data,
283
- limit,
284
- ...rest
285
- };
286
- useEffect(() => {
287
- if (!containerRef.current || elementRef.current) {
288
- return;
289
- }
290
- const element = document.createElement(definition.tagName);
291
- elementRef.current = element;
292
- Object.assign(element, propsRef.current);
293
- containerRef.current.appendChild(element);
294
- if (typeof forwardedRef === "function") {
295
- forwardedRef(element);
296
- } else if (forwardedRef) {
297
- forwardedRef.current = element;
298
- }
299
- return () => {
300
- if (elementRef.current && containerRef.current?.contains(elementRef.current)) {
301
- containerRef.current.removeChild(elementRef.current);
302
- }
303
- if (typeof forwardedRef === "function") {
304
- forwardedRef(null);
305
- } else if (forwardedRef) {
306
- forwardedRef.current = null;
307
- }
308
- elementRef.current = null;
309
- };
310
- }, [
311
- definition.tagName,
312
- forwardedRef
313
- ]);
314
- useEffect(() => {
315
- const element = elementRef.current;
316
- if (!element) {
317
- return;
318
- }
319
- Object.assign(element, propsRef.current);
320
- });
321
- return /* @__PURE__ */ React3.createElement("div", {
322
- ref: containerRef
323
- });
324
- }));
325
- WebComponentWrapper.displayName = "WebComponentWrapper";
326
- var SurfaceContextProvider = /* @__PURE__ */ memo(/* @__PURE__ */ forwardRef2(({ id, role, data, limit, fallback = ErrorFallback, definition, ...rest }, forwardedRef) => {
327
- const contextValue = useMemo2(() => ({
328
- id,
329
- role,
330
- data
331
- }), [
332
- id,
333
- role,
334
- data
335
- ]);
336
- const onProfilerRender = useSurfaceProfilerCallback();
337
- const profilerId = `surface/${id}/${role}`;
338
- if (definition.kind === "web-component") {
339
- return /* @__PURE__ */ React3.createElement(ErrorBoundary, {
340
- name: "surface",
341
- resetKeys: [
342
- data
343
- ],
344
- FallbackComponent: fallback
345
- }, /* @__PURE__ */ React3.createElement(SurfaceContext.Provider, {
346
- value: contextValue
347
- }, /* @__PURE__ */ React3.createElement(WebComponentWrapper, {
348
- id,
349
- role,
350
- data,
351
- limit,
352
- definition,
353
- ref: forwardedRef,
354
- ...rest
355
- })));
356
- }
357
- const Component = definition.component;
358
- const debug = DEBUG || "__DX_DEBUG__" in window;
359
- if (debug) {
360
- return /* @__PURE__ */ React3.createElement(ErrorBoundary, {
361
- name: "surface",
362
- resetKeys: [
363
- data
364
- ],
365
- FallbackComponent: fallback
366
- }, /* @__PURE__ */ React3.createElement("div", {
367
- className: "contents",
368
- "data-id": id,
369
- "data-role": role
370
- }, /* @__PURE__ */ React3.createElement(SurfaceContext.Provider, {
371
- value: contextValue
372
- }, /* @__PURE__ */ React3.createElement(SurfaceInfo, {
373
- ref: forwardedRef
374
- }, onProfilerRender && !profilerId.includes("org.dxos.plugin.debug") ? /* @__PURE__ */ React3.createElement(Profiler, {
375
- id: profilerId,
376
- onRender: onProfilerRender
377
- }, /* @__PURE__ */ React3.createElement(Component, {
378
- id,
379
- role,
380
- data,
381
- limit,
382
- ...rest
383
- })) : /* @__PURE__ */ React3.createElement(Component, {
384
- id,
385
- role,
386
- data,
387
- limit,
388
- ...rest
389
- })))));
390
- }
391
- return /* @__PURE__ */ React3.createElement(ErrorBoundary, {
392
- name: "surface",
393
- resetKeys: [
394
- data
395
- ],
396
- FallbackComponent: fallback
397
- }, /* @__PURE__ */ React3.createElement("div", {
398
- className: "contents",
399
- "data-id": id,
400
- "data-role": role
401
- }, /* @__PURE__ */ React3.createElement(SurfaceContext.Provider, {
402
- value: contextValue
403
- }, /* @__PURE__ */ React3.createElement(Component, {
404
- id,
405
- role,
406
- data,
407
- limit,
408
- ...rest,
409
- ref: forwardedRef
410
- }))));
411
- }));
412
- SurfaceContextProvider.displayName = "SurfaceContextProvider";
413
- var SurfaceComponent = /* @__PURE__ */ memo(/* @__PURE__ */ forwardRef2(({ id: _id, type, data: dataProp, limit, placeholder = DEFAULT_PLACEHOLDER, ...rest }, forwardedRef) => {
414
- const data = useDefaultValue(dataProp, () => ({}));
415
- const surfaces = useSurfaces();
416
- const effectiveRole = type?.role;
417
- if (effectiveRole == null) {
418
- if (DEBUG) {
419
- log.warn("Surface is missing required `type` prop", {
420
- id: _id
421
- }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 193, S: void 0 });
422
- }
423
- return null;
424
- }
425
- const definitions = findCandidates(surfaces, {
426
- role: effectiveRole,
427
- data
428
- });
429
- const candidates = limit ? definitions.slice(0, limit) : definitions;
430
- if (DEBUG && candidates.length === 0) {
431
- log.warn("no candidates for surface", {
432
- role: effectiveRole,
433
- data
434
- }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 206, S: void 0 });
435
- return null;
436
- }
437
- return /* @__PURE__ */ React3.createElement(Suspense, {
438
- fallback: placeholder
439
- }, candidates.map((definition) => /* @__PURE__ */ React3.createElement(SurfaceContextProvider, {
440
- key: definition.id,
441
- id: definition.id,
442
- role: effectiveRole,
443
- data,
444
- limit,
445
- definition,
446
- ref: forwardedRef,
447
- ...rest
448
- })));
449
- }));
450
- SurfaceComponent.displayName = "Surface";
451
- var ErrorFallback = ({ error }) => {
452
- const { message } = error instanceof Error ? error : {
453
- message: String(error)
454
- };
455
- return /* @__PURE__ */ React3.createElement("div", {
456
- role: "alert",
457
- "data-testid": "error-boundary-fallback"
458
- }, /* @__PURE__ */ React3.createElement("h1", {
459
- className: "flex gap-2 text-sm mt-2 text-info-text"
460
- }, message));
461
- };
462
- var findCandidates = (surfaces, { role, data }) => {
463
- return Object.values(surfaces).filter((definition) => Array.isArray(definition.role) ? definition.role.includes(role) : definition.role === role).filter(({ filter }) => filter ? filter(data ?? {}, role) : true).toSorted(Position.compare);
464
- };
465
- var useSurfaces = () => {
466
- const manager = usePluginManager();
467
- const surfacesByModule = useAtomValue(manager.capabilities.atomByModule(capabilities_exports.ReactSurface));
468
- return useMemo2(() => {
469
- const result = [];
470
- for (const [_moduleId, surfaces] of Object.entries(surfacesByModule)) {
471
- for (const def of surfaces.flat()) {
472
- result.push(def);
473
- }
474
- }
475
- return result;
476
- }, [
477
- surfacesByModule
478
- ]);
479
- };
480
- function isSurfaceAvailable(capabilityManager, args) {
481
- const effectiveRole = args.type?.role;
482
- if (effectiveRole == null) {
483
- return false;
484
- }
485
- const surfaces = capabilityManager.getAll(capabilities_exports.ReactSurface);
486
- const candidates = findCandidates(surfaces.flat(), {
487
- role: effectiveRole,
488
- data: args.data
489
- });
490
- return candidates.length > 0;
491
- }
492
-
493
- // src/ui/components/Surface/types.ts
494
- import { log as log2 } from "@dxos/log";
495
- var __dxlog_file2 = "/__w/dxos/dxos/packages/sdk/app-framework/src/ui/components/Surface/types.ts";
496
- var isSurfaceFilter = (value) => typeof value === "object" && value !== null && Array.isArray(value.bindings);
497
- var makeType = (nsid) => {
498
- if (typeof nsid !== "string" || !/^[a-zA-Z]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(\.[a-zA-Z][a-zA-Z0-9]{0,62})$/.test(nsid)) {
499
- throw new Error(`Invalid role NSID: "${nsid}". Must be a dotted name with a camelCase final segment (no hyphens in the last segment).`);
500
- }
501
- return {
502
- role: nsid
503
- };
504
- };
505
- var makeFilter = (token, guard) => {
506
- const boundGuard = guard == null ? () => true : (data) => {
507
- try {
508
- return guard(data);
509
- } catch (err) {
510
- log2.catch(err, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 39, S: void 0 });
511
- return false;
512
- }
513
- };
514
- return {
515
- bindings: [
516
- {
517
- role: token.role,
518
- guard: boundGuard
519
- }
520
- ]
521
- };
522
- };
523
- var expandBindings = (filter) => {
524
- const bindings = filter.bindings;
525
- const roles = Array.from(new Set(bindings.map((binding) => binding.role)));
526
- const guard = (data, role) => {
527
- if (role != null) {
528
- return bindings.some((entry) => entry.role === role && entry.guard(data));
529
- }
530
- return bindings.some((entry) => entry.guard(data));
531
- };
532
- return {
533
- role: roles.length === 1 ? roles[0] : roles,
534
- guard
535
- };
536
- };
537
- var validateLocalId = (id) => {
538
- const segments = id.split(".");
539
- const finalSegment = segments[segments.length - 1];
540
- if (!/^[a-zA-Z][a-zA-Z0-9]*$/.test(finalSegment)) {
541
- throw new Error(`Invalid surface id: "${id}". The final segment "${finalSegment}" must be camelCase (letters and digits only, starting with a letter \u2014 no hyphens or underscores).`);
542
- }
543
- };
544
- function create(definition) {
545
- validateLocalId(definition.id);
546
- const { id, filter, component, position } = definition;
547
- const { role, guard } = expandBindings(filter);
548
- return {
549
- kind: "react",
550
- id,
551
- role,
552
- position,
553
- component,
554
- filter: guard
555
- };
556
- }
557
- function createWeb(definition) {
558
- validateLocalId(definition.id);
559
- const { id, filter, tagName, position } = definition;
560
- const { role, guard } = expandBindings(filter);
561
- return {
562
- kind: "web-component",
563
- id,
564
- role,
565
- position,
566
- tagName,
567
- filter: guard
568
- };
569
- }
570
-
571
- // src/ui/components/Surface/index.ts
572
- (function(Surface2) {
573
- Surface2.create = create;
574
- Surface2.createWeb = createWeb;
575
- Surface2.Context = SurfaceContext;
576
- Surface2.Surface = SurfaceComponent;
577
- Surface2.isAvailable = isSurfaceAvailable;
578
- Surface2.makeType = makeType;
579
- Surface2.makeFilter = makeFilter;
580
- Surface2.isFilter = isSurfaceFilter;
581
- Surface2.ProfilerProvider = SurfaceProfilerProvider;
582
- Surface2.useProfilerCallback = useSurfaceProfilerCallback;
583
- Surface2.useProfilerEntries = useSurfaceProfilerEntries;
584
- Surface2.useProfilerStats = useSurfaceProfilerStats;
585
- Surface2.useProfilerClear = useSurfaceProfilerClear;
586
- })(Surface || (Surface = {}));
587
- var Surface;
588
-
589
- // src/ui/hooks/useSurface.ts
590
- var useSurface = () => {
591
- return useContext3(Surface.Context) ?? raise2(new Error("Missing SurfaceContext"));
592
- };
593
-
594
- export {
595
- topologicalSort,
596
- useSurface,
597
- usePluginManager,
598
- useOptionalPluginManager,
599
- PluginManagerProvider,
600
- SurfaceComponent,
601
- Surface
602
- };
603
- //# sourceMappingURL=chunk-U5MESPM5.mjs.map