@dxos/plugin-script 0.7.4 → 0.7.5-labs.a279d8c

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 (255) hide show
  1. package/dist/lib/browser/{AutomationPanel-PMTZROAZ.mjs → AutomationPanel-OOIRJFPJ.mjs} +4 -11
  2. package/dist/lib/browser/AutomationPanel-OOIRJFPJ.mjs.map +7 -0
  3. package/dist/lib/browser/ScriptContainer-T2AOMDT3.mjs +685 -0
  4. package/dist/lib/browser/ScriptContainer-T2AOMDT3.mjs.map +7 -0
  5. package/dist/lib/browser/{chunk-C7VBULMK.mjs → chunk-5BU5ERNU.mjs} +3 -3
  6. package/dist/lib/browser/chunk-5BU5ERNU.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-REL2R7SB.mjs +52 -0
  8. package/dist/lib/browser/chunk-REL2R7SB.mjs.map +7 -0
  9. package/dist/lib/browser/{chunk-4UTRJLQ3.mjs → chunk-SDHKTS6H.mjs} +2 -51
  10. package/dist/lib/browser/{chunk-4UTRJLQ3.mjs.map → chunk-SDHKTS6H.mjs.map} +4 -4
  11. package/dist/lib/browser/chunk-SIOGRRPF.mjs +224 -0
  12. package/dist/lib/browser/chunk-SIOGRRPF.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-K7KY6YMG.mjs → chunk-SJ4J527G.mjs} +2 -2
  14. package/dist/lib/browser/chunk-XPGBHZ3L.mjs +40 -0
  15. package/dist/lib/browser/chunk-XPGBHZ3L.mjs.map +7 -0
  16. package/dist/lib/browser/chunk-ZM6T4HPR.mjs +15 -0
  17. package/dist/lib/browser/chunk-ZM6T4HPR.mjs.map +7 -0
  18. package/dist/lib/browser/compiler-HT53ILG7.mjs +84 -0
  19. package/dist/lib/browser/compiler-HT53ILG7.mjs.map +7 -0
  20. package/dist/lib/browser/index.mjs +107 -357
  21. package/dist/lib/browser/index.mjs.map +4 -4
  22. package/dist/lib/browser/intent-resolver-YPHT6HDZ.mjs +42 -0
  23. package/dist/lib/browser/intent-resolver-YPHT6HDZ.mjs.map +7 -0
  24. package/dist/lib/browser/meta.json +1 -1
  25. package/dist/lib/browser/react-surface-GAWVYTJ5.mjs +67 -0
  26. package/dist/lib/browser/react-surface-GAWVYTJ5.mjs.map +7 -0
  27. package/dist/lib/browser/settings-YQQEU3DF.mjs +24 -0
  28. package/dist/lib/browser/settings-YQQEU3DF.mjs.map +7 -0
  29. package/dist/lib/browser/types.mjs +10 -0
  30. package/dist/lib/node/{AutomationPanel-AAGQREH7.cjs → AutomationPanel-EPRDDR3A.cjs} +16 -17
  31. package/dist/lib/node/AutomationPanel-EPRDDR3A.cjs.map +7 -0
  32. package/dist/lib/node/ScriptContainer-BV56I4OL.cjs +689 -0
  33. package/dist/lib/node/ScriptContainer-BV56I4OL.cjs.map +7 -0
  34. package/dist/lib/node/chunk-5V3XGLTR.cjs +252 -0
  35. package/dist/lib/node/chunk-5V3XGLTR.cjs.map +7 -0
  36. package/dist/lib/node/chunk-6VKZJ4MH.cjs +60 -0
  37. package/dist/lib/node/chunk-6VKZJ4MH.cjs.map +7 -0
  38. package/dist/lib/node/{meta.cjs → chunk-A2DI2G4D.cjs} +12 -8
  39. package/dist/lib/node/chunk-A2DI2G4D.cjs.map +7 -0
  40. package/dist/lib/node/{chunk-4INUJLXL.cjs → chunk-DQRAVZM7.cjs} +6 -6
  41. package/dist/lib/node/{chunk-6LYX73ZT.cjs → chunk-EFTZN5X7.cjs} +7 -7
  42. package/dist/lib/node/chunk-EFTZN5X7.cjs.map +7 -0
  43. package/dist/lib/node/{chunk-WPP65EYS.cjs → chunk-T4TXCRN5.cjs} +6 -44
  44. package/dist/lib/node/chunk-T4TXCRN5.cjs.map +7 -0
  45. package/dist/lib/node/chunk-TJ4BTPOS.cjs +64 -0
  46. package/dist/lib/node/chunk-TJ4BTPOS.cjs.map +7 -0
  47. package/dist/lib/node/compiler-457ZR24G.cjs +104 -0
  48. package/dist/lib/node/compiler-457ZR24G.cjs.map +7 -0
  49. package/dist/lib/node/index.cjs +104 -346
  50. package/dist/lib/node/index.cjs.map +4 -4
  51. package/dist/lib/node/intent-resolver-SUAPE7H3.cjs +56 -0
  52. package/dist/lib/node/intent-resolver-SUAPE7H3.cjs.map +7 -0
  53. package/dist/lib/node/meta.json +1 -1
  54. package/dist/lib/node/react-surface-OMBMSFZT.cjs +86 -0
  55. package/dist/lib/node/react-surface-OMBMSFZT.cjs.map +7 -0
  56. package/dist/lib/node/settings-NGHDYAVK.cjs +38 -0
  57. package/dist/lib/node/settings-NGHDYAVK.cjs.map +7 -0
  58. package/dist/lib/node/{types/index.cjs → types.cjs} +6 -8
  59. package/dist/lib/node/types.cjs.map +7 -0
  60. package/dist/lib/node-esm/{AutomationPanel-ETQEDY5I.mjs → AutomationPanel-DMLAGQS5.mjs} +4 -11
  61. package/dist/lib/node-esm/AutomationPanel-DMLAGQS5.mjs.map +7 -0
  62. package/dist/lib/node-esm/ScriptContainer-3S5VHJVR.mjs +686 -0
  63. package/dist/lib/node-esm/ScriptContainer-3S5VHJVR.mjs.map +7 -0
  64. package/dist/lib/node-esm/chunk-675XSDRN.mjs +16 -0
  65. package/dist/lib/node-esm/chunk-675XSDRN.mjs.map +7 -0
  66. package/dist/lib/node-esm/{chunk-SLTZMY34.mjs → chunk-BHP545D7.mjs} +3 -3
  67. package/dist/lib/node-esm/chunk-BHP545D7.mjs.map +7 -0
  68. package/dist/lib/node-esm/{chunk-4SRPREUK.mjs → chunk-G76M6O46.mjs} +2 -51
  69. package/dist/lib/node-esm/{chunk-4SRPREUK.mjs.map → chunk-G76M6O46.mjs.map} +4 -4
  70. package/dist/lib/node-esm/chunk-JHGOPQVO.mjs +41 -0
  71. package/dist/lib/node-esm/chunk-JHGOPQVO.mjs.map +7 -0
  72. package/dist/lib/node-esm/chunk-JJZYWSD7.mjs +54 -0
  73. package/dist/lib/node-esm/chunk-JJZYWSD7.mjs.map +7 -0
  74. package/dist/lib/node-esm/chunk-XPIKUBGS.mjs +225 -0
  75. package/dist/lib/node-esm/chunk-XPIKUBGS.mjs.map +7 -0
  76. package/dist/lib/node-esm/{chunk-OFYGBUNI.mjs → chunk-XUWS7OTK.mjs} +2 -2
  77. package/dist/lib/node-esm/compiler-PEARFTFR.mjs +85 -0
  78. package/dist/lib/node-esm/compiler-PEARFTFR.mjs.map +7 -0
  79. package/dist/lib/node-esm/index.mjs +107 -357
  80. package/dist/lib/node-esm/index.mjs.map +4 -4
  81. package/dist/lib/node-esm/intent-resolver-SZJXQ3CW.mjs +43 -0
  82. package/dist/lib/node-esm/intent-resolver-SZJXQ3CW.mjs.map +7 -0
  83. package/dist/lib/node-esm/meta.json +1 -1
  84. package/dist/lib/node-esm/react-surface-J7NLV2V4.mjs +68 -0
  85. package/dist/lib/node-esm/react-surface-J7NLV2V4.mjs.map +7 -0
  86. package/dist/lib/node-esm/settings-XGXDY4NI.mjs +25 -0
  87. package/dist/lib/node-esm/settings-XGXDY4NI.mjs.map +7 -0
  88. package/dist/lib/node-esm/types.mjs +11 -0
  89. package/dist/types/src/ScriptPlugin.d.ts +1 -3
  90. package/dist/types/src/ScriptPlugin.d.ts.map +1 -1
  91. package/dist/types/src/capabilities/capabilities.d.ts +5 -0
  92. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -0
  93. package/dist/types/src/capabilities/compiler.d.ts +4 -0
  94. package/dist/types/src/capabilities/compiler.d.ts.map +1 -0
  95. package/dist/types/src/capabilities/index.d.ts +6 -0
  96. package/dist/types/src/capabilities/index.d.ts.map +1 -0
  97. package/dist/types/src/capabilities/intent-resolver.d.ts +4 -0
  98. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -0
  99. package/dist/types/src/capabilities/react-surface.d.ts +4 -0
  100. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
  101. package/dist/types/src/capabilities/settings.d.ts +4 -0
  102. package/dist/types/src/capabilities/settings.d.ts.map +1 -0
  103. package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts +2 -2
  104. package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts.map +1 -1
  105. package/dist/types/src/components/ScriptContainer.d.ts +10 -2
  106. package/dist/types/src/components/ScriptContainer.d.ts.map +1 -1
  107. package/dist/types/src/components/ScriptSettings/ScriptSettings.d.ts.map +1 -1
  108. package/dist/types/src/components/ScriptSettingsPanel.d.ts +1 -1
  109. package/dist/types/src/components/ScriptSettingsPanel.d.ts.map +1 -1
  110. package/dist/types/src/components/ScriptToolbar/ScriptToolbar.d.ts +11 -0
  111. package/dist/types/src/components/ScriptToolbar/ScriptToolbar.d.ts.map +1 -0
  112. package/dist/types/src/components/{Toolbar/Toolbar.stories.d.ts → ScriptToolbar/ScriptToolbar.stories.d.ts} +1 -1
  113. package/dist/types/src/components/ScriptToolbar/ScriptToolbar.stories.d.ts.map +1 -0
  114. package/dist/types/src/components/ScriptToolbar/deploy.d.ts +48 -0
  115. package/dist/types/src/components/ScriptToolbar/deploy.d.ts.map +1 -0
  116. package/dist/types/src/components/ScriptToolbar/format.d.ts +25 -0
  117. package/dist/types/src/components/ScriptToolbar/format.d.ts.map +1 -0
  118. package/dist/types/src/components/ScriptToolbar/index.d.ts +2 -0
  119. package/dist/types/src/components/ScriptToolbar/index.d.ts.map +1 -0
  120. package/dist/types/src/components/ScriptToolbar/templateSelect.d.ts +31 -0
  121. package/dist/types/src/components/ScriptToolbar/templateSelect.d.ts.map +1 -0
  122. package/dist/types/src/components/ScriptToolbar/useToolbarAction.d.ts +14 -0
  123. package/dist/types/src/components/ScriptToolbar/useToolbarAction.d.ts.map +1 -0
  124. package/dist/types/src/components/ScriptToolbar/useToolbarState.d.ts +10 -0
  125. package/dist/types/src/components/ScriptToolbar/useToolbarState.d.ts.map +1 -0
  126. package/dist/types/src/components/ScriptToolbar/view.d.ts +33 -0
  127. package/dist/types/src/components/ScriptToolbar/view.d.ts.map +1 -0
  128. package/dist/types/src/components/TypescriptEditor/TypescriptEditor.d.ts +4 -2
  129. package/dist/types/src/components/TypescriptEditor/TypescriptEditor.d.ts.map +1 -1
  130. package/dist/types/src/components/TypescriptEditor/TypescriptEditor.stories.d.ts.map +1 -1
  131. package/dist/types/src/components/index.d.ts +1 -1
  132. package/dist/types/src/components/index.d.ts.map +1 -1
  133. package/dist/types/src/index.d.ts +2 -4
  134. package/dist/types/src/index.d.ts.map +1 -1
  135. package/dist/types/src/meta.d.ts +1 -2
  136. package/dist/types/src/meta.d.ts.map +1 -1
  137. package/dist/types/src/templates/email.d.ts +2 -1
  138. package/dist/types/src/templates/email.d.ts.map +1 -1
  139. package/dist/types/src/{templates.d.ts → templates/index.d.ts} +1 -1
  140. package/dist/types/src/templates/index.d.ts.map +1 -0
  141. package/dist/types/src/translations.d.ts +48 -0
  142. package/dist/types/src/translations.d.ts.map +1 -1
  143. package/dist/types/src/types.d.ts +30 -0
  144. package/dist/types/src/types.d.ts.map +1 -0
  145. package/dist/types/tsconfig.tsbuildinfo +1 -0
  146. package/package.json +45 -55
  147. package/src/ScriptPlugin.tsx +65 -145
  148. package/src/bundler/bundler.test.ts +4 -3
  149. package/src/capabilities/capabilities.ts +12 -0
  150. package/src/capabilities/compiler.ts +33 -0
  151. package/src/capabilities/index.ts +12 -0
  152. package/src/capabilities/intent-resolver.ts +43 -0
  153. package/src/capabilities/react-surface.tsx +54 -0
  154. package/src/capabilities/settings.ts +14 -0
  155. package/src/compiler/compiler.browser.test.ts +1 -1
  156. package/src/components/AutomationPanel/AutomationPanel.tsx +2 -4
  157. package/src/components/FrameContainer/FrameContainer.tsx +1 -1
  158. package/src/components/ScriptContainer.tsx +64 -9
  159. package/src/components/ScriptSettings/ScriptSettings.tsx +25 -1
  160. package/src/components/ScriptSettingsPanel.tsx +125 -52
  161. package/src/components/{Toolbar/Toolbar.stories.tsx → ScriptToolbar/ScriptToolbar.stories.tsx} +2 -2
  162. package/src/components/ScriptToolbar/ScriptToolbar.tsx +51 -0
  163. package/src/components/ScriptToolbar/deploy.ts +157 -0
  164. package/src/components/ScriptToolbar/format.ts +47 -0
  165. package/src/components/{Toolbar → ScriptToolbar}/index.ts +1 -1
  166. package/src/components/ScriptToolbar/templateSelect.ts +64 -0
  167. package/src/components/ScriptToolbar/useToolbarAction.ts +54 -0
  168. package/src/components/ScriptToolbar/useToolbarState.ts +16 -0
  169. package/src/components/ScriptToolbar/view.ts +52 -0
  170. package/src/components/TypescriptEditor/TypescriptEditor.stories.tsx +2 -0
  171. package/src/components/TypescriptEditor/TypescriptEditor.tsx +73 -8
  172. package/src/index.ts +2 -6
  173. package/src/meta.ts +1 -1
  174. package/src/templates/email.ts +26 -23
  175. package/src/{templates.ts → templates/index.ts} +5 -5
  176. package/src/translations.ts +18 -1
  177. package/src/types.ts +39 -0
  178. package/dist/lib/browser/AutomationPanel-PMTZROAZ.mjs.map +0 -7
  179. package/dist/lib/browser/ScriptContainer-RYZFYCNK.mjs +0 -425
  180. package/dist/lib/browser/ScriptContainer-RYZFYCNK.mjs.map +0 -7
  181. package/dist/lib/browser/chunk-C7VBULMK.mjs.map +0 -7
  182. package/dist/lib/browser/chunk-QFZUFT5G.mjs +0 -48
  183. package/dist/lib/browser/chunk-QFZUFT5G.mjs.map +0 -7
  184. package/dist/lib/browser/chunk-U3OP64V4.mjs +0 -123
  185. package/dist/lib/browser/chunk-U3OP64V4.mjs.map +0 -7
  186. package/dist/lib/browser/edge/index.mjs +0 -19
  187. package/dist/lib/browser/meta.mjs +0 -9
  188. package/dist/lib/browser/types/index.mjs +0 -12
  189. package/dist/lib/browser/types/index.mjs.map +0 -7
  190. package/dist/lib/node/AutomationPanel-AAGQREH7.cjs.map +0 -7
  191. package/dist/lib/node/ScriptContainer-FZ44UIRC.cjs +0 -427
  192. package/dist/lib/node/ScriptContainer-FZ44UIRC.cjs.map +0 -7
  193. package/dist/lib/node/chunk-6LYX73ZT.cjs.map +0 -7
  194. package/dist/lib/node/chunk-CS25QNKZ.cjs +0 -151
  195. package/dist/lib/node/chunk-CS25QNKZ.cjs.map +0 -7
  196. package/dist/lib/node/chunk-DQYAU2CJ.cjs +0 -67
  197. package/dist/lib/node/chunk-DQYAU2CJ.cjs.map +0 -7
  198. package/dist/lib/node/chunk-WPP65EYS.cjs.map +0 -7
  199. package/dist/lib/node/edge/index.cjs +0 -41
  200. package/dist/lib/node/edge/index.cjs.map +0 -7
  201. package/dist/lib/node/meta.cjs.map +0 -7
  202. package/dist/lib/node/types/index.cjs.map +0 -7
  203. package/dist/lib/node-esm/AutomationPanel-ETQEDY5I.mjs.map +0 -7
  204. package/dist/lib/node-esm/ScriptContainer-3PKDW34A.mjs +0 -426
  205. package/dist/lib/node-esm/ScriptContainer-3PKDW34A.mjs.map +0 -7
  206. package/dist/lib/node-esm/chunk-36DLLQ6E.mjs +0 -125
  207. package/dist/lib/node-esm/chunk-36DLLQ6E.mjs.map +0 -7
  208. package/dist/lib/node-esm/chunk-GMVPKT6A.mjs +0 -49
  209. package/dist/lib/node-esm/chunk-GMVPKT6A.mjs.map +0 -7
  210. package/dist/lib/node-esm/chunk-SLTZMY34.mjs.map +0 -7
  211. package/dist/lib/node-esm/edge/index.mjs +0 -20
  212. package/dist/lib/node-esm/edge/index.mjs.map +0 -7
  213. package/dist/lib/node-esm/meta.mjs +0 -10
  214. package/dist/lib/node-esm/meta.mjs.map +0 -7
  215. package/dist/lib/node-esm/types/index.mjs +0 -13
  216. package/dist/lib/node-esm/types/index.mjs.map +0 -7
  217. package/dist/types/src/components/ScriptBlock/ScriptBlock.d.ts +0 -12
  218. package/dist/types/src/components/ScriptBlock/ScriptBlock.d.ts.map +0 -1
  219. package/dist/types/src/components/ScriptBlock/ScriptBlock.stories.d.ts +0 -6
  220. package/dist/types/src/components/ScriptBlock/ScriptBlock.stories.d.ts.map +0 -1
  221. package/dist/types/src/components/ScriptBlock/index.d.ts +0 -2
  222. package/dist/types/src/components/ScriptBlock/index.d.ts.map +0 -1
  223. package/dist/types/src/components/ScriptEditor.d.ts +0 -9
  224. package/dist/types/src/components/ScriptEditor.d.ts.map +0 -1
  225. package/dist/types/src/components/Toolbar/Toolbar.d.ts +0 -23
  226. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +0 -1
  227. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +0 -1
  228. package/dist/types/src/components/Toolbar/index.d.ts +0 -2
  229. package/dist/types/src/components/Toolbar/index.d.ts.map +0 -1
  230. package/dist/types/src/edge/functions.d.ts +0 -25
  231. package/dist/types/src/edge/functions.d.ts.map +0 -1
  232. package/dist/types/src/edge/index.d.ts +0 -2
  233. package/dist/types/src/edge/index.d.ts.map +0 -1
  234. package/dist/types/src/templates.d.ts.map +0 -1
  235. package/dist/types/src/types/index.d.ts +0 -3
  236. package/dist/types/src/types/index.d.ts.map +0 -1
  237. package/dist/types/src/types/schema.d.ts +0 -71
  238. package/dist/types/src/types/schema.d.ts.map +0 -1
  239. package/dist/types/src/types/types.d.ts +0 -8
  240. package/dist/types/src/types/types.d.ts.map +0 -1
  241. package/src/components/ScriptBlock/ScriptBlock.stories.tsx +0 -52
  242. package/src/components/ScriptBlock/ScriptBlock.tsx +0 -102
  243. package/src/components/ScriptBlock/index.ts +0 -5
  244. package/src/components/ScriptEditor.tsx +0 -191
  245. package/src/components/Toolbar/Toolbar.tsx +0 -177
  246. package/src/edge/functions.ts +0 -116
  247. package/src/edge/index.ts +0 -7
  248. package/src/types/index.ts +0 -6
  249. package/src/types/schema.ts +0 -44
  250. package/src/types/types.ts +0 -29
  251. /package/dist/lib/browser/{chunk-K7KY6YMG.mjs.map → chunk-SJ4J527G.mjs.map} +0 -0
  252. /package/dist/lib/browser/{edge/index.mjs.map → types.mjs.map} +0 -0
  253. /package/dist/lib/node/{chunk-4INUJLXL.cjs.map → chunk-DQRAVZM7.cjs.map} +0 -0
  254. /package/dist/lib/node-esm/{chunk-OFYGBUNI.mjs.map → chunk-XUWS7OTK.mjs.map} +0 -0
  255. /package/dist/lib/{browser/meta.mjs.map → node-esm/types.mjs.map} +0 -0
@@ -1,191 +0,0 @@
1
- //
2
- // Copyright 2023 DXOS.org
3
- //
4
-
5
- import { format } from 'prettier';
6
- import prettierPluginEstree from 'prettier/plugins/estree';
7
- import prettierPluginTypescript from 'prettier/plugins/typescript';
8
- import React, { useCallback, useMemo, useState } from 'react';
9
-
10
- import { log } from '@dxos/log';
11
- import { useClient } from '@dxos/react-client';
12
- import { create, createDocAccessor, Filter, getMeta, getSpace, useQuery } from '@dxos/react-client/echo';
13
- import { useIdentity } from '@dxos/react-client/halo';
14
- import { useTranslation, type ThemedClassName } from '@dxos/react-ui';
15
- import { createDataExtensions, listener } from '@dxos/react-ui-editor';
16
- import { mx } from '@dxos/react-ui-theme';
17
-
18
- import { DebugPanel } from './DebugPanel';
19
- import { type TemplateSelectProps, Toolbar, type ViewType } from './Toolbar';
20
- import { TypescriptEditor, type TypescriptEditorProps } from './TypescriptEditor';
21
- import { Bundler } from '../bundler';
22
- import {
23
- getInvocationUrl,
24
- getUserFunctionUrlInMetadata,
25
- setUserFunctionUrlInMetadata,
26
- uploadWorkerFunction,
27
- FUNCTIONS_PRESET_META_KEY,
28
- incrementSemverPatch,
29
- } from '../edge';
30
- import { SCRIPT_PLUGIN } from '../meta';
31
- import { templates } from '../templates';
32
- import { FunctionType, type ScriptType } from '../types';
33
-
34
- export type ScriptEditorProps = ThemedClassName<{
35
- script: ScriptType;
36
- }> &
37
- Pick<TypescriptEditorProps, 'env'>;
38
-
39
- export const ScriptEditor = ({ classNames, script, env }: ScriptEditorProps) => {
40
- const { t } = useTranslation(SCRIPT_PLUGIN);
41
- const client = useClient();
42
- const identity = useIdentity();
43
- const space = getSpace(script);
44
- const [fn] = useQuery(space, Filter.schema(FunctionType, { source: script }));
45
-
46
- const extensions = useMemo(
47
- () => [
48
- listener({
49
- onChange: (text) => {
50
- if (script.source && script.source?.content !== text) {
51
- script.changed = true;
52
- }
53
- },
54
- }),
55
- createDataExtensions({
56
- id: script.id,
57
- text: script.source && createDocAccessor(script.source, ['content']),
58
- space,
59
- identity,
60
- }),
61
- ],
62
- [script, script.source, space, identity],
63
- );
64
-
65
- const [view, setView] = useState<ViewType>('editor');
66
- const existingFunctionUrl = fn && getUserFunctionUrlInMetadata(getMeta(fn));
67
- const [error, setError] = useState<string>();
68
-
69
- const handleFormat = useCallback(async () => {
70
- if (!script.source) {
71
- return;
72
- }
73
-
74
- try {
75
- script.source.content = await format(script.source.content, {
76
- parser: 'typescript',
77
- plugins: [prettierPluginEstree, prettierPluginTypescript],
78
- semi: true,
79
- singleQuote: true,
80
- });
81
- } catch (err: any) {
82
- // TODO(wittjosiah): Show error in UI.
83
- log.catch(err);
84
- }
85
- }, [script.source]);
86
-
87
- const handleTemplateChange: TemplateSelectProps['onTemplateSelect'] = (id) => {
88
- const template = templates.find((template) => template.id === id);
89
- if (template) {
90
- script.name = template.name;
91
- script.source!.content = template.source;
92
- const metaKeys = getMeta(script).keys;
93
- const oldPresetIndex = metaKeys.findIndex((key) => key.source === FUNCTIONS_PRESET_META_KEY);
94
- if (oldPresetIndex >= 0) {
95
- metaKeys.splice(oldPresetIndex, 1);
96
- }
97
- if (template.presetId) {
98
- metaKeys.push({ source: FUNCTIONS_PRESET_META_KEY, id: template.presetId });
99
- }
100
- }
101
- };
102
-
103
- const handleDeploy = useCallback(async () => {
104
- if (!script.source || !identity || !space) {
105
- return;
106
- }
107
-
108
- setError(undefined);
109
-
110
- try {
111
- const existingFunctionId = existingFunctionUrl?.split('/').at(-1);
112
-
113
- const bundler = new Bundler({ platform: 'browser', sandboxedModules: [], remoteModules: {} });
114
- const buildResult = await bundler.bundle(script.source.content);
115
- if (buildResult.error || !buildResult.bundle) {
116
- throw buildResult.error;
117
- }
118
-
119
- const { functionId, version, meta } = await uploadWorkerFunction({
120
- client,
121
- spaceId: space.id,
122
- version: fn ? incrementSemverPatch(fn.version) : '0.0.1',
123
- functionId: existingFunctionId,
124
- source: buildResult.bundle,
125
- });
126
- if (functionId === undefined || version === undefined) {
127
- throw new Error(`Upload didn't return expected data: functionId=${functionId}, version=${version}`);
128
- }
129
-
130
- log.info('function uploaded', { functionId, version });
131
- if (fn) {
132
- fn.version = version;
133
- }
134
-
135
- const deployedFunction = fn ?? space.db.add(create(FunctionType, { name: functionId, version, source: script }));
136
-
137
- script.changed = false;
138
-
139
- if (meta.inputSchema) {
140
- deployedFunction.inputSchema = meta.inputSchema;
141
- } else {
142
- log.verbose('no input schema in function metadata', { functionId });
143
- }
144
-
145
- setUserFunctionUrlInMetadata(getMeta(deployedFunction), `/${space.id}/${functionId}`);
146
-
147
- setView('split');
148
- } catch (err: any) {
149
- log.catch(err);
150
- setError(t('upload failed label'));
151
- }
152
- }, [fn, existingFunctionUrl, script, script.name, script.source, space?.id ?? null]);
153
-
154
- const functionUrl = useMemo(() => {
155
- if (!existingFunctionUrl) {
156
- return;
157
- }
158
-
159
- return getInvocationUrl(existingFunctionUrl, client.config.values.runtime?.services?.edge?.url ?? '', {
160
- spaceId: space?.id,
161
- });
162
- }, [existingFunctionUrl, space]);
163
-
164
- return (
165
- <div role='none' className={mx('flex flex-col w-full overflow-hidden divide-y divide-separator', classNames)}>
166
- <Toolbar
167
- deployed={Boolean(existingFunctionUrl) && !script.changed}
168
- functionUrl={functionUrl}
169
- error={error}
170
- view={view}
171
- templates={templates}
172
- onDeploy={handleDeploy}
173
- onFormat={handleFormat}
174
- onViewChange={setView}
175
- onTemplateSelect={handleTemplateChange}
176
- />
177
-
178
- {view !== 'preview' && (
179
- <TypescriptEditor
180
- id={script.id}
181
- env={env}
182
- initialValue={script.source?.content}
183
- extensions={extensions}
184
- className='flex is-full bs-full overflow-hidden ch-focus-ring-inset-over-all'
185
- />
186
- )}
187
-
188
- {view !== 'editor' && <DebugPanel functionUrl={functionUrl} />}
189
- </div>
190
- );
191
- };
@@ -1,177 +0,0 @@
1
- //
2
- // Copyright 2024 DXOS.org
3
- //
4
-
5
- import React, { useState } from 'react';
6
-
7
- import {
8
- ElevationProvider,
9
- Icon,
10
- Select,
11
- type ThemedClassName,
12
- ToggleGroup,
13
- ToggleGroupItem,
14
- type ToolbarButtonProps,
15
- Toolbar as NaturalToolbar,
16
- Tooltip,
17
- useTranslation,
18
- } from '@dxos/react-ui';
19
-
20
- import { SCRIPT_PLUGIN } from '../../meta';
21
- import { type Template } from '../../templates';
22
-
23
- export type ToolbarProps = ThemedClassName<
24
- {
25
- deployed?: boolean;
26
- error?: string;
27
- functionUrl?: string;
28
- onDeploy?: () => Promise<void>;
29
- onFormat?: () => Promise<void>;
30
- } & TemplateSelectProps &
31
- ViewSelectorProps
32
- >;
33
-
34
- export const Toolbar = ({
35
- classNames,
36
- deployed,
37
- error,
38
- functionUrl,
39
- view,
40
- templates,
41
- onDeploy,
42
- onFormat,
43
- onViewChange,
44
- onTemplateSelect,
45
- }: ToolbarProps) => {
46
- const { t } = useTranslation(SCRIPT_PLUGIN);
47
- const [pending, setPending] = useState(false);
48
-
49
- const handleCopyLink = async () => {
50
- if (!functionUrl) {
51
- return;
52
- }
53
-
54
- await navigator.clipboard.writeText(functionUrl);
55
- };
56
-
57
- const handleDeploy = async () => {
58
- if (!pending) {
59
- setPending(true);
60
- await onDeploy?.();
61
- setPending(false);
62
- }
63
- };
64
-
65
- // TODO(burdon): Factor out common toolbar components with sheet/editor?
66
- return (
67
- <ElevationProvider elevation='chrome'>
68
- <NaturalToolbar.Root classNames={['p-1', classNames]} style={{ contain: 'layout' }}>
69
- {templates && <TemplateSelect templates={templates} onTemplateSelect={onTemplateSelect} />}
70
- {onFormat && <ToolbarIconButton icon='ph--magic-wand--regular' text={t('format label')} onClick={onFormat} />}
71
-
72
- <div role='separator' className='grow' />
73
-
74
- {error ? (
75
- <Tooltip.Root>
76
- <Tooltip.Trigger>
77
- <Icon icon='ph--warning-circle--regular' size={4} />
78
- </Tooltip.Trigger>
79
- <Tooltip.Portal>
80
- <Tooltip.Content>
81
- <Tooltip.Arrow />
82
- {error}
83
- </Tooltip.Content>
84
- </Tooltip.Portal>
85
- </Tooltip.Root>
86
- ) : null}
87
-
88
- {functionUrl && deployed && (
89
- <ToolbarIconButton icon='ph--link--regular' text={t('copy link label')} onClick={handleCopyLink} />
90
- )}
91
-
92
- {onDeploy && (
93
- <ToolbarIconButton
94
- icon={pending ? 'ph--spinner-gap--regular' : 'ph--cloud-arrow-up--regular'}
95
- classNames={[pending && 'animate-spin']}
96
- text={pending ? t('pending label') : t('deploy label')}
97
- onClick={handleDeploy}
98
- />
99
- )}
100
-
101
- <ViewSelector view={view} onViewChange={onViewChange} />
102
- </NaturalToolbar.Root>
103
- </ElevationProvider>
104
- );
105
- };
106
-
107
- const ToolbarIconButton = ({
108
- icon,
109
- text,
110
- classNames,
111
- disabled,
112
- onClick,
113
- }: { icon: string; text: string } & Pick<ToolbarButtonProps, 'classNames' | 'disabled' | 'onClick'>) => {
114
- return (
115
- <Tooltip.Root>
116
- <Tooltip.Trigger asChild>
117
- <NaturalToolbar.Button variant='ghost' disabled={disabled} onClick={onClick}>
118
- <Icon icon={icon} size={4} classNames={classNames} />
119
- </NaturalToolbar.Button>
120
- </Tooltip.Trigger>
121
- <Tooltip.Portal>
122
- <Tooltip.Content>
123
- <Tooltip.Arrow />
124
- {text}
125
- </Tooltip.Content>
126
- </Tooltip.Portal>
127
- </Tooltip.Root>
128
- );
129
- };
130
-
131
- export type ViewType = 'editor' | 'split' | 'preview';
132
-
133
- export type TemplateSelectProps = {
134
- templates?: Template[];
135
- onTemplateSelect?: (id: string) => void;
136
- };
137
-
138
- export const TemplateSelect = ({ templates = [], onTemplateSelect }: TemplateSelectProps) => {
139
- return (
140
- <Select.Root value={''} onValueChange={onTemplateSelect}>
141
- <Select.TriggerButton />
142
- <Select.Portal>
143
- <Select.Content>
144
- <Select.Viewport>
145
- <Select.Option value={''}>Template</Select.Option>
146
- {templates.map(({ id, name }) => (
147
- <Select.Option key={id} value={id}>
148
- {name}
149
- </Select.Option>
150
- ))}
151
- </Select.Viewport>
152
- </Select.Content>
153
- </Select.Portal>
154
- </Select.Root>
155
- );
156
- };
157
-
158
- export type ViewSelectorProps = {
159
- view?: ViewType;
160
- onViewChange?: (view: ViewType) => void;
161
- };
162
-
163
- export const ViewSelector = ({ view, onViewChange }: ViewSelectorProps) => {
164
- return (
165
- <ToggleGroup type='single' value={view} onValueChange={(value) => onViewChange?.(value as ViewType)}>
166
- <ToggleGroupItem value='editor' classNames='bg-transparent text-subdued'>
167
- <Icon icon='ph--code--regular' size={4} />
168
- </ToggleGroupItem>
169
- <ToggleGroupItem value='split' classNames='bg-transparent text-subdued'>
170
- <Icon icon='ph--square-split-vertical--regular' size={4} />
171
- </ToggleGroupItem>
172
- <ToggleGroupItem value='preview' classNames='bg-transparent text-subdued'>
173
- <Icon icon='ph--eye--regular' size={4} />
174
- </ToggleGroupItem>
175
- </ToggleGroup>
176
- );
177
- };
@@ -1,116 +0,0 @@
1
- //
2
- // Copyright 2024 DXOS.org
3
- //
4
-
5
- import { type DID } from 'iso-did/types';
6
-
7
- import { type Client } from '@dxos/client';
8
- import { type ObjectMeta } from '@dxos/echo-schema';
9
- import { EdgeHttpClient, type EdgeIdentity } from '@dxos/edge-client';
10
- import { invariant } from '@dxos/invariant';
11
- import type { PublicKey, SpaceId } from '@dxos/keys';
12
- import { log } from '@dxos/log';
13
- import { type UploadFunctionResponseBody } from '@dxos/protocols';
14
-
15
- // TODO: use URL scheme for source?
16
- const FUNCTIONS_META_KEY = 'dxos.org/service/function';
17
-
18
- export const FUNCTIONS_PRESET_META_KEY = 'dxos.org/service/function-preset';
19
-
20
- export type UploadWorkerArgs = {
21
- client: Client;
22
- name?: string;
23
- source: string;
24
- version: string;
25
- functionId?: string;
26
- spaceId: SpaceId;
27
- };
28
-
29
- export const uploadWorkerFunction = async ({
30
- client,
31
- name,
32
- version,
33
- source,
34
- spaceId,
35
- functionId,
36
- }: UploadWorkerArgs): Promise<UploadFunctionResponseBody> => {
37
- const edgeUrl = client.config.values.runtime?.services?.edge?.url;
38
- invariant(edgeUrl, 'Edge is not configured.');
39
- const edgeClient = new EdgeHttpClient(edgeUrl);
40
- const edgeIdentity = createEdgeIdentity(client);
41
- edgeClient.setIdentity(edgeIdentity);
42
- const response = await edgeClient.uploadFunction({ spaceId, functionId }, { name, version, script: source });
43
-
44
- log('Uploaded', {
45
- functionId,
46
- source,
47
- name,
48
- identityKey: edgeIdentity.identityKey,
49
- response,
50
- });
51
-
52
- return response;
53
- };
54
-
55
- export const getUserFunctionUrlInMetadata = (meta: ObjectMeta) => {
56
- return meta.keys.find((key) => key.source === FUNCTIONS_META_KEY)?.id;
57
- };
58
-
59
- export const setUserFunctionUrlInMetadata = (meta: ObjectMeta, functionUrl: string) => {
60
- const key = meta.keys.find((key) => key.source === FUNCTIONS_META_KEY);
61
- if (key) {
62
- if (key.id !== functionUrl) {
63
- throw new Error('Metadata mismatch');
64
- }
65
- } else {
66
- meta.keys.push({ source: FUNCTIONS_META_KEY, id: functionUrl });
67
- }
68
- };
69
-
70
- export const getInvocationUrl = (functionUrl: string, edgeUrl: string, options: InvocationOptions = {}) => {
71
- const baseUrl = new URL('functions/', edgeUrl);
72
-
73
- // Leading slashes cause the URL to be treated as an absolute path.
74
- const relativeUrl = functionUrl.replace(/^\//, '');
75
- const url = new URL(`./${relativeUrl}`, baseUrl.toString());
76
- options.spaceId && url.searchParams.set('spaceId', options.spaceId);
77
- options.subjectId && url.searchParams.set('subjectId', options.subjectId);
78
- url.protocol = 'https';
79
- return url.toString();
80
- };
81
-
82
- const createEdgeIdentity = (client: Client): EdgeIdentity => {
83
- const identity = client.halo.identity.get();
84
- const device = client.halo.device;
85
- if (!identity || !device) {
86
- throw new Error('Identity not available');
87
- }
88
- return {
89
- identityKey: identity.identityKey.toHex(),
90
- peerKey: device.deviceKey.toHex(),
91
- presentCredentials: async ({ challenge }) => {
92
- const identityService = client.services.services.IdentityService!;
93
- const authCredential = await identityService.createAuthCredential();
94
- return identityService.signPresentation({
95
- presentation: { credentials: [authCredential] },
96
- nonce: challenge,
97
- });
98
- },
99
- };
100
- };
101
-
102
- export const incrementSemverPatch = (version: string): string => {
103
- const [major, minor, patch] = version.split('.');
104
- const patchNum = Number(patch);
105
- invariant(!Number.isNaN(patchNum), 'Unexpected function version format.');
106
- return [major, minor, String(patchNum + 1)].join('.');
107
- };
108
-
109
- export const publicKeyToDid = (key: PublicKey): DID => {
110
- return `did:key:${key.toHex()}`;
111
- };
112
-
113
- export type InvocationOptions = {
114
- spaceId?: SpaceId;
115
- subjectId?: string;
116
- };
package/src/edge/index.ts DELETED
@@ -1,7 +0,0 @@
1
- //
2
- // Copyright 2024 DXOS.org
3
- //
4
-
5
- // TODO(wittjosiah): Factor out.
6
-
7
- export * from './functions';
@@ -1,6 +0,0 @@
1
- //
2
- // Copyright 2024 DXOS.org
3
- //
4
-
5
- export * from './schema';
6
- export * from './types';
@@ -1,44 +0,0 @@
1
- //
2
- // Copyright 2024 DXOS.org
3
- //
4
-
5
- import { JsonSchemaType, ref, S, TypedObject } from '@dxos/echo-schema';
6
- import { TextType } from '@dxos/plugin-markdown/types';
7
-
8
- /**
9
- * Source script.
10
- */
11
- export class ScriptType extends TypedObject({
12
- typename: 'dxos.org/type/Script',
13
- version: '0.1.0',
14
- })({
15
- // TODO(burdon): Change to URI?
16
- name: S.optional(S.String),
17
- description: S.optional(S.String),
18
- // TODO(burdon): Change to hash of deployed content.
19
- // Whether source has changed since last deploy.
20
- changed: S.optional(S.Boolean),
21
- source: ref(TextType),
22
- }) {}
23
-
24
- /**
25
- * Function deployment.
26
- */
27
- // TODO(burdon): Move to core/functions.
28
- export class FunctionType extends TypedObject({
29
- typename: 'dxos.org/type/Function',
30
- version: '0.1.0',
31
- })({
32
- // TODO(burdon): Rename to id/uri?
33
- name: S.NonEmptyString,
34
- version: S.String,
35
-
36
- // Reference to a source script if it exists within ECHO.
37
- // TODO(burdon): Don't ref ScriptType directly (core).
38
- source: S.optional(ref(ScriptType)),
39
-
40
- inputSchema: S.optional(JsonSchemaType),
41
-
42
- // Local binding to a function name.
43
- binding: S.optional(S.String),
44
- }) {}
@@ -1,29 +0,0 @@
1
- //
2
- // Copyright 2023 DXOS.org
3
- //
4
-
5
- import type {
6
- GraphBuilderProvides,
7
- IntentResolverProvides,
8
- MetadataRecordsProvides,
9
- SettingsProvides,
10
- SurfaceProvides,
11
- TranslationsProvides,
12
- } from '@dxos/app-framework';
13
- import { type SchemaProvides } from '@dxos/plugin-space';
14
-
15
- import { SCRIPT_PLUGIN } from '../meta';
16
-
17
- export enum ScriptAction {
18
- CREATE = `${SCRIPT_PLUGIN}/create`,
19
- }
20
-
21
- export type ScriptSettingsProps = {};
22
-
23
- export type ScriptPluginProvides = GraphBuilderProvides &
24
- IntentResolverProvides &
25
- MetadataRecordsProvides &
26
- SchemaProvides &
27
- SettingsProvides<ScriptSettingsProps> &
28
- SurfaceProvides &
29
- TranslationsProvides;