@dxos/app-framework 0.10.0 → 0.11.1

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