@dxos/plugin-script 0.7.4 → 0.7.5-labs.401163d

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 (288) hide show
  1. package/dist/lib/browser/{AutomationPanel-PMTZROAZ.mjs → AutomationPanel-J3SZ5L3Y.mjs} +4 -11
  2. package/dist/lib/browser/AutomationPanel-J3SZ5L3Y.mjs.map +7 -0
  3. package/dist/lib/browser/ScriptContainer-JHAVO2KA.mjs +713 -0
  4. package/dist/lib/browser/ScriptContainer-JHAVO2KA.mjs.map +7 -0
  5. package/dist/lib/browser/artifact-YCIVHFSS.mjs +243 -0
  6. package/dist/lib/browser/artifact-YCIVHFSS.mjs.map +7 -0
  7. package/dist/lib/browser/{chunk-K7KY6YMG.mjs → chunk-45LXDWNF.mjs} +2 -2
  8. package/dist/lib/browser/chunk-6MOQ4BP3.mjs +15 -0
  9. package/dist/lib/browser/chunk-6MOQ4BP3.mjs.map +7 -0
  10. package/dist/lib/browser/chunk-FVVCAWNP.mjs +21 -0
  11. package/dist/lib/browser/chunk-FVVCAWNP.mjs.map +7 -0
  12. package/dist/lib/browser/chunk-N46LE7FS.mjs +40 -0
  13. package/dist/lib/browser/chunk-N46LE7FS.mjs.map +7 -0
  14. package/dist/lib/browser/chunk-UDLKK74O.mjs +69 -0
  15. package/dist/lib/browser/chunk-UDLKK74O.mjs.map +7 -0
  16. package/dist/lib/browser/chunk-WAXHENSY.mjs +236 -0
  17. package/dist/lib/browser/chunk-WAXHENSY.mjs.map +7 -0
  18. package/dist/lib/browser/compiler-YY2XSKHQ.mjs +82 -0
  19. package/dist/lib/browser/compiler-YY2XSKHQ.mjs.map +7 -0
  20. package/dist/lib/browser/index.mjs +111 -359
  21. package/dist/lib/browser/index.mjs.map +4 -4
  22. package/dist/lib/browser/intent-resolver-RV3YXIVN.mjs +45 -0
  23. package/dist/lib/browser/intent-resolver-RV3YXIVN.mjs.map +7 -0
  24. package/dist/lib/browser/meta.json +1 -1
  25. package/dist/lib/browser/react-surface-ETY4XKFG.mjs +65 -0
  26. package/dist/lib/browser/react-surface-ETY4XKFG.mjs.map +7 -0
  27. package/dist/lib/browser/settings-SZCDKHWO.mjs +24 -0
  28. package/dist/lib/browser/settings-SZCDKHWO.mjs.map +7 -0
  29. package/dist/lib/browser/types.mjs +10 -0
  30. package/dist/lib/node/{AutomationPanel-AAGQREH7.cjs → AutomationPanel-4M55FURO.cjs} +16 -17
  31. package/dist/lib/node/AutomationPanel-4M55FURO.cjs.map +7 -0
  32. package/dist/lib/node/ScriptContainer-EBIT6CT4.cjs +719 -0
  33. package/dist/lib/node/ScriptContainer-EBIT6CT4.cjs.map +7 -0
  34. package/dist/lib/node/artifact-IPGGY2Z2.cjs +262 -0
  35. package/dist/lib/node/artifact-IPGGY2Z2.cjs.map +7 -0
  36. package/dist/lib/node/chunk-3VDHZ54A.cjs +264 -0
  37. package/dist/lib/node/chunk-3VDHZ54A.cjs.map +7 -0
  38. package/dist/lib/node/{chunk-6LYX73ZT.cjs → chunk-5UH3F7TA.cjs} +11 -8
  39. package/dist/lib/node/chunk-5UH3F7TA.cjs.map +7 -0
  40. package/dist/lib/node/{meta.cjs → chunk-ALY3N6PW.cjs} +12 -8
  41. package/dist/lib/node/chunk-ALY3N6PW.cjs.map +7 -0
  42. package/dist/lib/node/chunk-DJGLGRQV.cjs +60 -0
  43. package/dist/lib/node/chunk-DJGLGRQV.cjs.map +7 -0
  44. package/dist/lib/node/{chunk-4INUJLXL.cjs → chunk-IID7WUQS.cjs} +6 -6
  45. package/dist/lib/node/chunk-JKPNBFU2.cjs +77 -0
  46. package/dist/lib/node/chunk-JKPNBFU2.cjs.map +7 -0
  47. package/dist/lib/node/compiler-UIBLKJKG.cjs +104 -0
  48. package/dist/lib/node/compiler-UIBLKJKG.cjs.map +7 -0
  49. package/dist/lib/node/index.cjs +108 -347
  50. package/dist/lib/node/index.cjs.map +4 -4
  51. package/dist/lib/node/intent-resolver-WFLQNAID.cjs +59 -0
  52. package/dist/lib/node/intent-resolver-WFLQNAID.cjs.map +7 -0
  53. package/dist/lib/node/meta.json +1 -1
  54. package/dist/lib/node/react-surface-OIQJFA7P.cjs +84 -0
  55. package/dist/lib/node/react-surface-OIQJFA7P.cjs.map +7 -0
  56. package/dist/lib/node/settings-SZFSMSKM.cjs +38 -0
  57. package/dist/lib/node/settings-SZFSMSKM.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-W6SKG35R.mjs} +4 -11
  61. package/dist/lib/node-esm/AutomationPanel-W6SKG35R.mjs.map +7 -0
  62. package/dist/lib/node-esm/ScriptContainer-QVFTCAML.mjs +714 -0
  63. package/dist/lib/node-esm/ScriptContainer-QVFTCAML.mjs.map +7 -0
  64. package/dist/lib/node-esm/artifact-7H4HGX5W.mjs +245 -0
  65. package/dist/lib/node-esm/artifact-7H4HGX5W.mjs.map +7 -0
  66. package/dist/lib/node-esm/chunk-5CEKSMA5.mjs +71 -0
  67. package/dist/lib/node-esm/chunk-5CEKSMA5.mjs.map +7 -0
  68. package/dist/lib/node-esm/{chunk-OFYGBUNI.mjs → chunk-CGF7EOGD.mjs} +2 -2
  69. package/dist/lib/node-esm/chunk-CP5LXTK5.mjs +16 -0
  70. package/dist/lib/node-esm/chunk-CP5LXTK5.mjs.map +7 -0
  71. package/dist/lib/node-esm/{chunk-SLTZMY34.mjs → chunk-P2V2Y5LV.mjs} +7 -4
  72. package/dist/lib/node-esm/chunk-P2V2Y5LV.mjs.map +7 -0
  73. package/dist/lib/node-esm/chunk-UNQFIERE.mjs +41 -0
  74. package/dist/lib/node-esm/chunk-UNQFIERE.mjs.map +7 -0
  75. package/dist/lib/node-esm/chunk-WCAUDRF4.mjs +237 -0
  76. package/dist/lib/node-esm/chunk-WCAUDRF4.mjs.map +7 -0
  77. package/dist/lib/node-esm/compiler-XTXFGZJM.mjs +83 -0
  78. package/dist/lib/node-esm/compiler-XTXFGZJM.mjs.map +7 -0
  79. package/dist/lib/node-esm/index.mjs +111 -359
  80. package/dist/lib/node-esm/index.mjs.map +4 -4
  81. package/dist/lib/node-esm/intent-resolver-CYT6IYYH.mjs +46 -0
  82. package/dist/lib/node-esm/intent-resolver-CYT6IYYH.mjs.map +7 -0
  83. package/dist/lib/node-esm/meta.json +1 -1
  84. package/dist/lib/node-esm/react-surface-N67GNKC2.mjs +66 -0
  85. package/dist/lib/node-esm/react-surface-N67GNKC2.mjs.map +7 -0
  86. package/dist/lib/node-esm/settings-GR4O2WHZ.mjs +25 -0
  87. package/dist/lib/node-esm/settings-GR4O2WHZ.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/artifact.d.ts +11 -0
  92. package/dist/types/src/capabilities/artifact.d.ts.map +1 -0
  93. package/dist/types/src/capabilities/capabilities.d.ts +5 -0
  94. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -0
  95. package/dist/types/src/capabilities/compiler.d.ts +4 -0
  96. package/dist/types/src/capabilities/compiler.d.ts.map +1 -0
  97. package/dist/types/src/capabilities/index.d.ts +7 -0
  98. package/dist/types/src/capabilities/index.d.ts.map +1 -0
  99. package/dist/types/src/capabilities/intent-resolver.d.ts +4 -0
  100. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -0
  101. package/dist/types/src/capabilities/react-surface.d.ts +4 -0
  102. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
  103. package/dist/types/src/capabilities/settings.d.ts +4 -0
  104. package/dist/types/src/capabilities/settings.d.ts.map +1 -0
  105. package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts +2 -2
  106. package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts.map +1 -1
  107. package/dist/types/src/components/FrameContainer/FrameContainer.d.ts +2 -2
  108. package/dist/types/src/components/FrameContainer/FrameContainer.d.ts.map +1 -1
  109. package/dist/types/src/components/ScriptContainer.d.ts +10 -2
  110. package/dist/types/src/components/ScriptContainer.d.ts.map +1 -1
  111. package/dist/types/src/components/ScriptSettings/ScriptSettings.d.ts.map +1 -1
  112. package/dist/types/src/components/ScriptSettingsPanel.d.ts +1 -1
  113. package/dist/types/src/components/ScriptSettingsPanel.d.ts.map +1 -1
  114. package/dist/types/src/components/ScriptToolbar/ScriptToolbar.d.ts +11 -0
  115. package/dist/types/src/components/ScriptToolbar/ScriptToolbar.d.ts.map +1 -0
  116. package/dist/types/src/components/{Toolbar/Toolbar.stories.d.ts → ScriptToolbar/ScriptToolbar.stories.d.ts} +1 -1
  117. package/dist/types/src/components/ScriptToolbar/ScriptToolbar.stories.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/TypescriptEditor/TypescriptEditor.d.ts +4 -2
  121. package/dist/types/src/components/TypescriptEditor/TypescriptEditor.d.ts.map +1 -1
  122. package/dist/types/src/components/TypescriptEditor/TypescriptEditor.stories.d.ts.map +1 -1
  123. package/dist/types/src/components/index.d.ts +1 -1
  124. package/dist/types/src/components/index.d.ts.map +1 -1
  125. package/dist/types/src/hooks/deploy.d.ts +48 -0
  126. package/dist/types/src/hooks/deploy.d.ts.map +1 -0
  127. package/dist/types/src/hooks/format.d.ts +25 -0
  128. package/dist/types/src/hooks/format.d.ts.map +1 -0
  129. package/dist/types/src/hooks/index.d.ts +7 -0
  130. package/dist/types/src/hooks/index.d.ts.map +1 -0
  131. package/dist/types/src/hooks/template.d.ts +31 -0
  132. package/dist/types/src/hooks/template.d.ts.map +1 -0
  133. package/dist/types/src/hooks/useToolbarAction.d.ts +14 -0
  134. package/dist/types/src/hooks/useToolbarAction.d.ts.map +1 -0
  135. package/dist/types/src/hooks/useToolbarState.d.ts +10 -0
  136. package/dist/types/src/hooks/useToolbarState.d.ts.map +1 -0
  137. package/dist/types/src/hooks/view.d.ts +33 -0
  138. package/dist/types/src/hooks/view.d.ts.map +1 -0
  139. package/dist/types/src/index.d.ts +2 -5
  140. package/dist/types/src/index.d.ts.map +1 -1
  141. package/dist/types/src/meta.d.ts +2 -2
  142. package/dist/types/src/meta.d.ts.map +1 -1
  143. package/dist/types/src/templates/discord.d.ts +3 -0
  144. package/dist/types/src/templates/discord.d.ts.map +1 -0
  145. package/dist/types/src/templates/echo.d.ts.map +1 -1
  146. package/dist/types/src/templates/email.d.ts +2 -1
  147. package/dist/types/src/templates/email.d.ts.map +1 -1
  148. package/dist/types/src/templates/forex-effect.d.ts +6 -0
  149. package/dist/types/src/templates/forex-effect.d.ts.map +1 -0
  150. package/dist/types/src/templates/forex.d.ts +1 -1
  151. package/dist/types/src/templates/forex.d.ts.map +1 -1
  152. package/dist/types/src/{templates.d.ts → templates/index.d.ts} +1 -1
  153. package/dist/types/src/templates/index.d.ts.map +1 -0
  154. package/dist/types/src/translations.d.ts +54 -0
  155. package/dist/types/src/translations.d.ts.map +1 -1
  156. package/dist/types/src/types.d.ts +30 -0
  157. package/dist/types/src/types.d.ts.map +1 -0
  158. package/dist/types/tsconfig.tsbuildinfo +1 -0
  159. package/package.json +45 -55
  160. package/src/ScriptPlugin.tsx +62 -145
  161. package/src/capabilities/artifact.ts +219 -0
  162. package/src/capabilities/capabilities.ts +12 -0
  163. package/src/capabilities/compiler.ts +33 -0
  164. package/src/capabilities/index.ts +13 -0
  165. package/src/capabilities/intent-resolver.ts +46 -0
  166. package/src/capabilities/react-surface.tsx +54 -0
  167. package/src/capabilities/settings.ts +14 -0
  168. package/src/compiler/compiler.browser.test.ts +1 -1
  169. package/src/components/AutomationPanel/AutomationPanel.tsx +2 -4
  170. package/src/components/FrameContainer/FrameContainer.tsx +5 -4
  171. package/src/components/ScriptContainer.tsx +69 -9
  172. package/src/components/ScriptSettings/ScriptSettings.tsx +28 -4
  173. package/src/components/ScriptSettingsPanel.tsx +140 -53
  174. package/src/components/{Toolbar/Toolbar.stories.tsx → ScriptToolbar/ScriptToolbar.stories.tsx} +2 -2
  175. package/src/components/ScriptToolbar/ScriptToolbar.tsx +53 -0
  176. package/src/{bundler → components/ScriptToolbar}/index.ts +1 -1
  177. package/src/components/TypescriptEditor/TypescriptEditor.stories.tsx +2 -0
  178. package/src/components/TypescriptEditor/TypescriptEditor.tsx +75 -10
  179. package/src/hooks/deploy.ts +169 -0
  180. package/src/hooks/format.ts +47 -0
  181. package/src/hooks/index.ts +11 -0
  182. package/src/hooks/template.ts +64 -0
  183. package/src/hooks/useToolbarAction.ts +54 -0
  184. package/src/hooks/useToolbarState.ts +16 -0
  185. package/src/hooks/view.ts +52 -0
  186. package/src/index.ts +2 -7
  187. package/src/meta.ts +4 -2
  188. package/src/templates/discord.ts +88 -0
  189. package/src/templates/echo.ts +5 -1
  190. package/src/templates/email.ts +26 -23
  191. package/src/templates/forex-effect.ts +44 -0
  192. package/src/templates/forex.ts +21 -13
  193. package/src/{templates.ts → templates/index.ts} +20 -5
  194. package/src/translations.ts +20 -1
  195. package/src/types.ts +39 -0
  196. package/dist/lib/browser/AutomationPanel-PMTZROAZ.mjs.map +0 -7
  197. package/dist/lib/browser/ScriptContainer-RYZFYCNK.mjs +0 -425
  198. package/dist/lib/browser/ScriptContainer-RYZFYCNK.mjs.map +0 -7
  199. package/dist/lib/browser/chunk-4UTRJLQ3.mjs +0 -286
  200. package/dist/lib/browser/chunk-4UTRJLQ3.mjs.map +0 -7
  201. package/dist/lib/browser/chunk-C7VBULMK.mjs +0 -18
  202. package/dist/lib/browser/chunk-C7VBULMK.mjs.map +0 -7
  203. package/dist/lib/browser/chunk-QFZUFT5G.mjs +0 -48
  204. package/dist/lib/browser/chunk-QFZUFT5G.mjs.map +0 -7
  205. package/dist/lib/browser/chunk-U3OP64V4.mjs +0 -123
  206. package/dist/lib/browser/chunk-U3OP64V4.mjs.map +0 -7
  207. package/dist/lib/browser/edge/index.mjs +0 -19
  208. package/dist/lib/browser/meta.mjs +0 -9
  209. package/dist/lib/browser/types/index.mjs +0 -12
  210. package/dist/lib/browser/types/index.mjs.map +0 -7
  211. package/dist/lib/node/AutomationPanel-AAGQREH7.cjs.map +0 -7
  212. package/dist/lib/node/ScriptContainer-FZ44UIRC.cjs +0 -427
  213. package/dist/lib/node/ScriptContainer-FZ44UIRC.cjs.map +0 -7
  214. package/dist/lib/node/chunk-6LYX73ZT.cjs.map +0 -7
  215. package/dist/lib/node/chunk-CS25QNKZ.cjs +0 -151
  216. package/dist/lib/node/chunk-CS25QNKZ.cjs.map +0 -7
  217. package/dist/lib/node/chunk-DQYAU2CJ.cjs +0 -67
  218. package/dist/lib/node/chunk-DQYAU2CJ.cjs.map +0 -7
  219. package/dist/lib/node/chunk-WPP65EYS.cjs +0 -298
  220. package/dist/lib/node/chunk-WPP65EYS.cjs.map +0 -7
  221. package/dist/lib/node/edge/index.cjs +0 -41
  222. package/dist/lib/node/edge/index.cjs.map +0 -7
  223. package/dist/lib/node/meta.cjs.map +0 -7
  224. package/dist/lib/node/types/index.cjs.map +0 -7
  225. package/dist/lib/node-esm/AutomationPanel-ETQEDY5I.mjs.map +0 -7
  226. package/dist/lib/node-esm/ScriptContainer-3PKDW34A.mjs +0 -426
  227. package/dist/lib/node-esm/ScriptContainer-3PKDW34A.mjs.map +0 -7
  228. package/dist/lib/node-esm/chunk-36DLLQ6E.mjs +0 -125
  229. package/dist/lib/node-esm/chunk-36DLLQ6E.mjs.map +0 -7
  230. package/dist/lib/node-esm/chunk-4SRPREUK.mjs +0 -288
  231. package/dist/lib/node-esm/chunk-4SRPREUK.mjs.map +0 -7
  232. package/dist/lib/node-esm/chunk-GMVPKT6A.mjs +0 -49
  233. package/dist/lib/node-esm/chunk-GMVPKT6A.mjs.map +0 -7
  234. package/dist/lib/node-esm/chunk-SLTZMY34.mjs.map +0 -7
  235. package/dist/lib/node-esm/edge/index.mjs +0 -20
  236. package/dist/lib/node-esm/edge/index.mjs.map +0 -7
  237. package/dist/lib/node-esm/meta.mjs +0 -10
  238. package/dist/lib/node-esm/meta.mjs.map +0 -7
  239. package/dist/lib/node-esm/types/index.mjs +0 -13
  240. package/dist/lib/node-esm/types/index.mjs.map +0 -7
  241. package/dist/types/src/bundler/bundler.d.ts +0 -39
  242. package/dist/types/src/bundler/bundler.d.ts.map +0 -1
  243. package/dist/types/src/bundler/bundler.test.d.ts +0 -2
  244. package/dist/types/src/bundler/bundler.test.d.ts.map +0 -1
  245. package/dist/types/src/bundler/index.d.ts +0 -2
  246. package/dist/types/src/bundler/index.d.ts.map +0 -1
  247. package/dist/types/src/components/ScriptBlock/ScriptBlock.d.ts +0 -12
  248. package/dist/types/src/components/ScriptBlock/ScriptBlock.d.ts.map +0 -1
  249. package/dist/types/src/components/ScriptBlock/ScriptBlock.stories.d.ts +0 -6
  250. package/dist/types/src/components/ScriptBlock/ScriptBlock.stories.d.ts.map +0 -1
  251. package/dist/types/src/components/ScriptBlock/index.d.ts +0 -2
  252. package/dist/types/src/components/ScriptBlock/index.d.ts.map +0 -1
  253. package/dist/types/src/components/ScriptEditor.d.ts +0 -9
  254. package/dist/types/src/components/ScriptEditor.d.ts.map +0 -1
  255. package/dist/types/src/components/Toolbar/Toolbar.d.ts +0 -23
  256. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +0 -1
  257. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +0 -1
  258. package/dist/types/src/components/Toolbar/index.d.ts +0 -2
  259. package/dist/types/src/components/Toolbar/index.d.ts.map +0 -1
  260. package/dist/types/src/edge/functions.d.ts +0 -25
  261. package/dist/types/src/edge/functions.d.ts.map +0 -1
  262. package/dist/types/src/edge/index.d.ts +0 -2
  263. package/dist/types/src/edge/index.d.ts.map +0 -1
  264. package/dist/types/src/templates.d.ts.map +0 -1
  265. package/dist/types/src/types/index.d.ts +0 -3
  266. package/dist/types/src/types/index.d.ts.map +0 -1
  267. package/dist/types/src/types/schema.d.ts +0 -71
  268. package/dist/types/src/types/schema.d.ts.map +0 -1
  269. package/dist/types/src/types/types.d.ts +0 -8
  270. package/dist/types/src/types/types.d.ts.map +0 -1
  271. package/src/bundler/bundler.test.ts +0 -54
  272. package/src/bundler/bundler.ts +0 -250
  273. package/src/components/ScriptBlock/ScriptBlock.stories.tsx +0 -52
  274. package/src/components/ScriptBlock/ScriptBlock.tsx +0 -102
  275. package/src/components/ScriptBlock/index.ts +0 -5
  276. package/src/components/ScriptEditor.tsx +0 -191
  277. package/src/components/Toolbar/Toolbar.tsx +0 -177
  278. package/src/components/Toolbar/index.ts +0 -5
  279. package/src/edge/functions.ts +0 -116
  280. package/src/edge/index.ts +0 -7
  281. package/src/types/index.ts +0 -6
  282. package/src/types/schema.ts +0 -44
  283. package/src/types/types.ts +0 -29
  284. /package/dist/lib/browser/{chunk-K7KY6YMG.mjs.map → chunk-45LXDWNF.mjs.map} +0 -0
  285. /package/dist/lib/browser/{edge/index.mjs.map → types.mjs.map} +0 -0
  286. /package/dist/lib/node/{chunk-4INUJLXL.cjs.map → chunk-IID7WUQS.cjs.map} +0 -0
  287. /package/dist/lib/node-esm/{chunk-OFYGBUNI.mjs.map → chunk-CGF7EOGD.mjs.map} +0 -0
  288. /package/dist/lib/{browser/meta.mjs.map → node-esm/types.mjs.map} +0 -0
@@ -3,27 +3,37 @@
3
3
  //
4
4
 
5
5
  import { javascript } from '@codemirror/lang-javascript';
6
+ import { defaultHighlightStyle } from '@codemirror/language';
7
+ import { Prec } from '@codemirror/state';
8
+ import { oneDarkHighlightStyle } from '@codemirror/theme-one-dark';
9
+ import { keymap } from '@codemirror/view';
10
+ import { tags } from '@lezer/highlight';
6
11
  import { type VirtualTypeScriptEnvironment } from '@typescript/vfs';
7
- import { tsSync, tsFacet, tsLinter, tsAutocomplete, tsHover } from '@valtown/codemirror-ts';
12
+ import { continueKeymap } from '@valtown/codemirror-continue';
13
+ import { tsSync, tsFacet, tsLinter, tsAutocomplete, tsHover, type HoverInfo } from '@valtown/codemirror-ts';
8
14
  import React from 'react';
9
15
 
10
- import { useThemeContext } from '@dxos/react-ui';
16
+ import { type ThemeMode, useThemeContext } from '@dxos/react-ui';
11
17
  import {
12
18
  autocomplete,
13
19
  createBasicExtensions,
14
20
  createThemeExtensions,
15
21
  editorFullWidth,
16
- editorGutter,
22
+ type EditorInputMode,
17
23
  editorMonospace,
24
+ EditorView,
25
+ folding,
18
26
  InputModeExtensions,
19
27
  useTextEditor,
20
28
  type UseTextEditorProps,
21
29
  } from '@dxos/react-ui-editor';
22
- import { nonNullable } from '@dxos/util';
30
+ import { isNonNullable } from '@dxos/util';
23
31
 
24
32
  export type TypescriptEditorProps = {
25
33
  id: string;
34
+ inputMode?: EditorInputMode;
26
35
  env?: VirtualTypeScriptEnvironment;
36
+ toolbar?: boolean;
27
37
  } & Pick<UseTextEditorProps, 'className' | 'initialValue' | 'extensions' | 'scrollTo' | 'selection'>;
28
38
 
29
39
  export const TypescriptEditor = ({
@@ -34,6 +44,8 @@ export const TypescriptEditor = ({
34
44
  extensions,
35
45
  scrollTo,
36
46
  selection,
47
+ toolbar,
48
+ inputMode = 'vscode',
37
49
  }: TypescriptEditorProps) => {
38
50
  const { themeMode } = useThemeContext();
39
51
  const { parentRef, focusAttributes } = useTextEditor(
@@ -56,24 +68,77 @@ export const TypescriptEditor = ({
56
68
  content: { className: editorFullWidth },
57
69
  },
58
70
  }),
59
- editorGutter,
71
+ // NOTE: Not using default editor gutter because folding for code works best right beside text.
72
+ EditorView.theme({
73
+ '.cm-gutters': {
74
+ // Match margin from content.
75
+ marginTop: '16px',
76
+ },
77
+ }),
78
+ InputModeExtensions[inputMode],
79
+ folding(),
80
+ // Continues block comments when you hit Enter.
81
+ Prec.high(keymap.of(continueKeymap)),
60
82
  // TODO(burdon): Factor out.
61
83
  [
62
84
  editorMonospace,
63
85
  javascript({ typescript: true }),
64
86
  // https://github.com/val-town/codemirror-ts
65
87
  autocomplete({ override: env ? [tsAutocomplete()] : [] }),
66
- env ? [tsFacet.of({ env, path: `/src/${id}.ts` }), tsSync(), tsLinter(), tsHover()] : [],
67
- InputModeExtensions.vscode,
88
+ env
89
+ ? [
90
+ tsFacet.of({ env, path: `/src/${id}.ts` }),
91
+ tsSync(),
92
+ tsLinter(),
93
+ tsHover({ renderTooltip: createTooltipRenderer(themeMode) }),
94
+ ]
95
+ : [],
68
96
  ],
69
- ].filter(nonNullable),
97
+ ].filter(isNonNullable),
70
98
  selection,
71
99
  scrollTo,
72
100
  }),
73
- [id, extensions, themeMode, selection, scrollTo],
101
+ [id, extensions, themeMode, inputMode, selection, scrollTo],
102
+ );
103
+
104
+ return (
105
+ <div ref={parentRef} data-toolbar={toolbar ? 'enabled' : 'disabled'} className={className} {...focusAttributes} />
74
106
  );
107
+ };
108
+
109
+ const createTooltipRenderer = (themeMode: ThemeMode) => {
110
+ const theme = themeMode === 'dark' ? oneDarkHighlightStyle : defaultHighlightStyle;
111
+
112
+ const classFromKind = (_kind: string) => {
113
+ // E.g., localName, methodName, parameterName, etc.
114
+ const kind = _kind.endsWith('Name') ? 'name' : _kind;
115
+ const validTag = kind in tags;
116
+ if (!validTag) {
117
+ return '';
118
+ }
119
+
120
+ const tag = tags[kind as keyof typeof tags];
121
+ if (typeof tag === 'function') {
122
+ return '';
123
+ }
124
+
125
+ return theme.style([tag]) ?? '';
126
+ };
127
+
128
+ return (info: HoverInfo) => {
129
+ const div = document.createElement('div');
130
+ div.className = 'p-1 rounded border border-separator bg-baseSurface xs:max-w-80 max-w-lg';
131
+
132
+ if (info.quickInfo?.displayParts) {
133
+ for (const part of info.quickInfo.displayParts) {
134
+ const span = div.appendChild(document.createElement('span'));
135
+ span.className = classFromKind(part.kind);
136
+ span.innerText = part.text;
137
+ }
138
+ }
75
139
 
76
- return <div ref={parentRef} className={className} {...focusAttributes} />;
140
+ return { dom: div };
141
+ };
77
142
  };
78
143
 
79
144
  export default TypescriptEditor;
@@ -0,0 +1,169 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { useCallback, useEffect, useMemo } from 'react';
6
+
7
+ import {
8
+ FunctionType,
9
+ type ScriptType,
10
+ getInvocationUrl,
11
+ getUserFunctionUrlInMetadata,
12
+ incrementSemverPatch,
13
+ setUserFunctionUrlInMetadata,
14
+ uploadWorkerFunction,
15
+ } from '@dxos/functions';
16
+ import { Bundler } from '@dxos/functions/bundler';
17
+ import { log } from '@dxos/log';
18
+ import { useClient } from '@dxos/react-client';
19
+ import { Filter, create, getMeta, getSpace, makeRef, useQuery } from '@dxos/react-client/echo';
20
+ import { useTranslation } from '@dxos/react-ui';
21
+ import { createMenuAction } from '@dxos/react-ui-menu';
22
+
23
+ import { type ViewState } from './view';
24
+ import { SCRIPT_PLUGIN } from '../meta';
25
+
26
+ export type DeployActionProperties = { type: 'deploy' } | { type: 'copy' };
27
+
28
+ export type DeployState = ViewState & {
29
+ deploying: boolean;
30
+ deployed: boolean;
31
+ functionUrl: string;
32
+ error: string;
33
+ };
34
+
35
+ export const createDeploy = (state: Partial<DeployState>) => {
36
+ const errorItem = createMenuAction('error', {
37
+ label: state.error ?? ['no error label', { ns: SCRIPT_PLUGIN }],
38
+ icon: 'ph--warning-circle--regular',
39
+ hidden: !state.error,
40
+ });
41
+
42
+ const deployAction = createMenuAction<DeployActionProperties>('deploy', {
43
+ type: 'deploy',
44
+ label: [state.deploying ? 'pending label' : 'deploy label', { ns: SCRIPT_PLUGIN }],
45
+ icon: state.deploying ? 'ph--spinner-gap--regular' : 'ph--cloud-arrow-up--regular',
46
+ disabled: state.deploying,
47
+ classNames: state.deploying ? '[&_svg]:animate-spin' : '',
48
+ });
49
+
50
+ const copyAction = createMenuAction<DeployActionProperties>('copy', {
51
+ type: 'copy',
52
+ label: ['copy link label', { ns: SCRIPT_PLUGIN }],
53
+ icon: 'ph--link--regular',
54
+ disabled: !state.functionUrl,
55
+ });
56
+
57
+ return {
58
+ nodes: [errorItem, deployAction, copyAction],
59
+ edges: [
60
+ { source: 'root', target: 'error' },
61
+ { source: 'root', target: 'deploy' },
62
+ { source: 'root', target: 'copy' },
63
+ ],
64
+ };
65
+ };
66
+
67
+ const useDeployDeps = ({ state, script }: { state: Partial<DeployState>; script: ScriptType }) => {
68
+ const space = getSpace(script);
69
+ const [fn] = useQuery(space, Filter.schema(FunctionType, { source: script }));
70
+ const client = useClient();
71
+ const existingFunctionUrl = useMemo(() => fn && getUserFunctionUrlInMetadata(getMeta(fn)), [fn]);
72
+ return { space, fn, client, existingFunctionUrl };
73
+ };
74
+
75
+ export const useDeployState = ({ state, script }: { state: Partial<DeployState>; script: ScriptType }) => {
76
+ const { space, client, existingFunctionUrl } = useDeployDeps({ state, script });
77
+ useEffect(() => {
78
+ if (!existingFunctionUrl) {
79
+ return;
80
+ }
81
+
82
+ state.functionUrl = getInvocationUrl(existingFunctionUrl, client.config.values.runtime?.services?.edge?.url ?? '', {
83
+ spaceId: space?.id,
84
+ });
85
+ }, [existingFunctionUrl, space]);
86
+
87
+ useEffect(() => {
88
+ state.deployed = Boolean(existingFunctionUrl) && !script.changed;
89
+ }, [script.changed, existingFunctionUrl]);
90
+ };
91
+
92
+ export const useDeployHandler = ({ state, script }: { state: Partial<DeployState>; script: ScriptType }) => {
93
+ const { space, fn, client, existingFunctionUrl } = useDeployDeps({ state, script });
94
+ const { t } = useTranslation(SCRIPT_PLUGIN);
95
+
96
+ return useCallback(async () => {
97
+ if (!script.source || !space) {
98
+ return;
99
+ }
100
+
101
+ state.error = undefined;
102
+ state.deploying = true;
103
+
104
+ try {
105
+ const existingFunctionId = existingFunctionUrl?.split('/').at(-1);
106
+
107
+ const bundler = new Bundler({ platform: 'browser', sandboxedModules: [], remoteModules: {} });
108
+ const buildResult = await bundler.bundle({ source: script.source.target!.content });
109
+ if (buildResult.error || !buildResult.bundle) {
110
+ throw buildResult.error;
111
+ }
112
+
113
+ const { functionId, version, meta } = await uploadWorkerFunction({
114
+ client,
115
+ spaceId: space.id,
116
+ version: fn ? incrementSemverPatch(fn.version) : '0.0.1',
117
+ functionId: existingFunctionId,
118
+ source: buildResult.bundle,
119
+ });
120
+ if (functionId === undefined || version === undefined) {
121
+ throw new Error(`Upload didn't return expected data: functionId=${functionId}, version=${version}`);
122
+ }
123
+
124
+ log.info('function uploaded', { functionId, version });
125
+ if (fn) {
126
+ fn.version = version;
127
+ }
128
+
129
+ const deployedFunction =
130
+ fn ?? space.db.add(create(FunctionType, { name: functionId, version, source: makeRef(script) }));
131
+
132
+ script.changed = false;
133
+ if (script.description !== undefined && script.description.trim() !== '') {
134
+ deployedFunction.description = script.description;
135
+ } else if (meta.description) {
136
+ deployedFunction.description = meta.description;
137
+ } else {
138
+ log.verbose('no description in function metadata', { functionId });
139
+ }
140
+
141
+ if (meta.inputSchema) {
142
+ deployedFunction.inputSchema = meta.inputSchema;
143
+ } else {
144
+ log.verbose('no input schema in function metadata', { functionId });
145
+ }
146
+ if (meta.outputSchema) {
147
+ deployedFunction.outputSchema = meta.outputSchema;
148
+ } else {
149
+ log.verbose('no output schema in function metadata', { functionId });
150
+ }
151
+
152
+ setUserFunctionUrlInMetadata(getMeta(deployedFunction), `/${space.id}/${functionId}`);
153
+
154
+ state.view = 'split';
155
+ } catch (err: any) {
156
+ log.catch(err);
157
+ state.error = t('upload failed label');
158
+ }
159
+ state.deploying = false;
160
+ }, [fn, client, t, existingFunctionUrl, script, script.name, script.source, space?.id ?? null]);
161
+ };
162
+
163
+ export const useCopyHandler = ({ state }: { state: Partial<DeployState> }) =>
164
+ useCallback(async () => {
165
+ if (!state.functionUrl) {
166
+ return;
167
+ }
168
+ await navigator.clipboard.writeText(state.functionUrl);
169
+ }, [state.functionUrl]);
@@ -0,0 +1,47 @@
1
+ //
2
+ // Copyright 2025 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 { useCallback } from 'react';
9
+
10
+ import { type ScriptType } from '@dxos/functions';
11
+ import { log } from '@dxos/log';
12
+ import { createMenuAction } from '@dxos/react-ui-menu';
13
+
14
+ import { SCRIPT_PLUGIN } from '../meta';
15
+
16
+ export type FormatActionProperties = { type: 'format' };
17
+
18
+ export const createFormat = () => {
19
+ const formatAction = createMenuAction('format', {
20
+ label: ['format label', { ns: SCRIPT_PLUGIN }],
21
+ icon: 'ph--magic-wand--regular',
22
+ });
23
+
24
+ return {
25
+ nodes: [formatAction],
26
+ edges: [{ source: 'root', target: 'format' }],
27
+ };
28
+ };
29
+
30
+ export const useFormatHandler = ({ script }: { script: ScriptType }) =>
31
+ useCallback(async () => {
32
+ if (!script.source) {
33
+ return;
34
+ }
35
+
36
+ try {
37
+ script.source.target!.content = await format(script.source.target!.content, {
38
+ parser: 'typescript',
39
+ plugins: [prettierPluginEstree, prettierPluginTypescript],
40
+ semi: true,
41
+ singleQuote: true,
42
+ });
43
+ } catch (err: any) {
44
+ // TODO(wittjosiah): Show error in UI.
45
+ log.catch(err);
46
+ }
47
+ }, [script.source]);
@@ -0,0 +1,11 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './deploy';
6
+ export * from './format';
7
+ export * from './template';
8
+ export * from './view';
9
+
10
+ export * from './useToolbarAction';
11
+ export * from './useToolbarState';
@@ -0,0 +1,64 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { useCallback } from 'react';
6
+
7
+ import { FUNCTIONS_PRESET_META_KEY, type ScriptType } from '@dxos/functions';
8
+ import { getMeta } from '@dxos/live-object';
9
+ import { createMenuItemGroup, createMenuAction } from '@dxos/react-ui-menu';
10
+
11
+ import { SCRIPT_PLUGIN } from '../meta';
12
+ import { templates } from '../templates';
13
+
14
+ export type TemplateActionProperties = { type: 'template'; value: string };
15
+
16
+ const createTemplateSelectGroup = () => {
17
+ return createMenuItemGroup('template-select', {
18
+ label: ['template select group label', { ns: SCRIPT_PLUGIN }],
19
+ variant: 'dropdownMenu',
20
+ });
21
+ };
22
+
23
+ const createTemplateSelectActions = () => {
24
+ return templates.map((template) => {
25
+ return createMenuAction<TemplateActionProperties>(`template--${template.id}`, {
26
+ label: template.name,
27
+ value: template.id,
28
+ type: 'template',
29
+ });
30
+ });
31
+ };
32
+
33
+ export const createTemplateSelect = () => {
34
+ const templateSelectGroup = createTemplateSelectGroup();
35
+ const templateSelectActions = createTemplateSelectActions();
36
+ return {
37
+ nodes: [templateSelectGroup, ...templateSelectActions],
38
+ edges: [
39
+ { source: 'root', target: 'template-select' },
40
+ ...templateSelectActions.map((action) => ({ source: 'template-select', target: action.id })),
41
+ ],
42
+ };
43
+ };
44
+
45
+ export const useTemplateSelectHandler = ({ script }: { script: ScriptType }) => {
46
+ return useCallback(
47
+ (templateId: string) => {
48
+ const template = templates.find((template) => template.id === templateId);
49
+ if (template) {
50
+ script.name = template.name;
51
+ script.source!.target!.content = template.source;
52
+ const metaKeys = getMeta(script).keys;
53
+ const oldPresetIndex = metaKeys.findIndex((key) => key.source === FUNCTIONS_PRESET_META_KEY);
54
+ if (oldPresetIndex >= 0) {
55
+ metaKeys.splice(oldPresetIndex, 1);
56
+ }
57
+ if (template.presetId) {
58
+ metaKeys.push({ source: FUNCTIONS_PRESET_META_KEY, id: template.presetId });
59
+ }
60
+ }
61
+ },
62
+ [script],
63
+ );
64
+ };
@@ -0,0 +1,54 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { useCallback } from 'react';
6
+
7
+ import { type ScriptType } from '@dxos/functions';
8
+ import { log } from '@dxos/log';
9
+ import { type MenuAction, type MenuActionHandler } from '@dxos/react-ui-menu';
10
+
11
+ import { type DeployActionProperties, useDeployHandler, useCopyHandler } from './deploy';
12
+ import { type FormatActionProperties, useFormatHandler } from './format';
13
+ import { type TemplateActionProperties, useTemplateSelectHandler } from './template';
14
+ import { type ScriptToolbarState } from './useToolbarState';
15
+ import { type ViewActionProperties } from './view';
16
+
17
+ export type ScriptToolbarActionProperties =
18
+ | TemplateActionProperties
19
+ | ViewActionProperties
20
+ | FormatActionProperties
21
+ | DeployActionProperties;
22
+
23
+ export type ScriptToolbarAction = MenuAction<ScriptToolbarActionProperties>;
24
+
25
+ export const useToolbarAction = (props: { state: ScriptToolbarState; script: ScriptType }) => {
26
+ const handleTemplateSelect = useTemplateSelectHandler(props);
27
+ const handleFormat = useFormatHandler(props);
28
+ const handleDeploy = useDeployHandler(props);
29
+ const handleCopy = useCopyHandler(props);
30
+ return useCallback(
31
+ ((action: ScriptToolbarAction) => {
32
+ switch (action.properties.type) {
33
+ case 'template':
34
+ handleTemplateSelect(action.properties.value);
35
+ break;
36
+ case 'view':
37
+ props.state.view = action.properties.value;
38
+ break;
39
+ case 'format':
40
+ void handleFormat();
41
+ break;
42
+ case 'deploy':
43
+ void handleDeploy();
44
+ break;
45
+ case 'copy':
46
+ void handleCopy();
47
+ break;
48
+ default:
49
+ log.error('Unknown action type', action);
50
+ }
51
+ }) as MenuActionHandler,
52
+ [handleTemplateSelect, handleFormat, handleDeploy, handleCopy],
53
+ );
54
+ };
@@ -0,0 +1,16 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { useMemo } from 'react';
6
+
7
+ import { create } from '@dxos/live-object';
8
+
9
+ import { type DeployState } from './deploy';
10
+ import { type ViewState } from './view';
11
+
12
+ export type ScriptToolbarState = Partial<DeployState & ViewState>;
13
+
14
+ export const useToolbarState = (initialState: ScriptToolbarState = {}) => {
15
+ return useMemo(() => create<ScriptToolbarState>(initialState), []);
16
+ };
@@ -0,0 +1,52 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { createMenuAction, createMenuItemGroup } from '@dxos/react-ui-menu';
6
+
7
+ import { SCRIPT_PLUGIN } from '../meta';
8
+
9
+ export type ViewType = 'editor' | 'split' | 'debug';
10
+
11
+ export type ViewState = { view: ViewType };
12
+
13
+ export type ViewActionProperties = { type: 'view'; value: ViewType };
14
+
15
+ const views: Record<ViewType, string> = {
16
+ editor: 'ph--code--regular',
17
+ split: 'ph--square-split-vertical--regular',
18
+ debug: 'ph--bug--regular',
19
+ };
20
+
21
+ const createViewGroupItem = (state: Partial<ViewState>) => {
22
+ return createMenuItemGroup('view', {
23
+ label: ['view group label', { ns: SCRIPT_PLUGIN }],
24
+ variant: 'dropdownMenu',
25
+ applyActive: true,
26
+ value: state.view,
27
+ });
28
+ };
29
+
30
+ const createViewActions = (state: Partial<ViewState>) => {
31
+ return Object.entries(views).map(([viewType, icon]) => {
32
+ return createMenuAction<ViewActionProperties>(`view--${viewType}`, {
33
+ type: 'view',
34
+ value: viewType as ViewType,
35
+ label: [`view ${viewType} label`, { ns: SCRIPT_PLUGIN }],
36
+ icon,
37
+ checked: state.view === viewType,
38
+ });
39
+ });
40
+ };
41
+
42
+ export const createView = (state: Partial<ViewState>) => {
43
+ const viewGroupItem = createViewGroupItem(state);
44
+ const viewActions = createViewActions(state);
45
+ return {
46
+ nodes: [viewGroupItem, ...viewActions],
47
+ edges: [
48
+ { source: 'root', target: 'view' },
49
+ ...viewActions.map((action) => ({ source: 'view', target: action.id })),
50
+ ],
51
+ };
52
+ };
package/src/index.ts CHANGED
@@ -2,13 +2,8 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { ScriptPlugin } from './ScriptPlugin';
6
-
7
- export default ScriptPlugin;
8
-
9
- export * from './bundler';
10
- export * from './compiler';
5
+ export { ScriptCapabilities } from './capabilities';
11
6
  export * from './components';
12
- export * from './types';
7
+ export * from './meta';
13
8
 
14
9
  export * from './ScriptPlugin';
package/src/meta.ts CHANGED
@@ -6,11 +6,13 @@ import { type PluginMeta } from '@dxos/app-framework';
6
6
 
7
7
  export const SCRIPT_PLUGIN = 'dxos.org/plugin/script';
8
8
 
9
- export default {
9
+ export const meta = {
10
10
  id: SCRIPT_PLUGIN,
11
11
  name: 'Scripts',
12
- description: 'Distributed functions.',
12
+ description:
13
+ 'Scripts in Composer allow you to deploy custom functions that run on the edge. These functions can be referenced by your AI agent and called inside of cells in any Sheet. Use scripts to interact with API’s or external data inside of Composer.',
13
14
  icon: 'ph--code--regular',
14
15
  source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/experimental/plugin-explorer',
15
16
  tags: ['experimental'],
17
+ screenshots: ['https://dxos.network/plugin-details-scripts-dark.png'],
16
18
  } satisfies PluginMeta;
@@ -0,0 +1,88 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ // @ts-ignore
6
+ import { createStatic, EchoObject, defineFunction, DXN, Filter, ObjectId, S } from 'dxos:functions';
7
+ import {
8
+ FetchHttpClient,
9
+ // @ts-ignore
10
+ } from 'https://esm.sh/@effect/platform@0.77.2?deps=effect@3.13.3';
11
+ // @ts-ignore
12
+ import { DiscordConfig, DiscordREST, DiscordRESTMemoryLive } from 'https://esm.sh/dfx@0.113.0?deps=effect@3.13.3';
13
+ // @ts-ignore
14
+ import { Effect, Config, Redacted } from 'https://esm.sh/effect@3.13.3';
15
+
16
+ const MessageSchema = S.Struct({
17
+ id: S.String,
18
+ foreignId: S.Number,
19
+ content: S.String,
20
+ }).pipe(EchoObject('example.com/type/Message', '0.1.0'));
21
+
22
+ export default defineFunction({
23
+ inputSchema: S.Struct({
24
+ // TODO(wittjosiah): Remove. This is used to provide a terminal for a cron trigger.
25
+ tick: S.optional(S.String),
26
+ channelId: S.String,
27
+ pageSize: S.optional(S.Number),
28
+ queueId: S.String,
29
+ }),
30
+
31
+ outputSchema: S.Struct({
32
+ newMessages: S.Number,
33
+ }),
34
+
35
+ handler: ({
36
+ event: {
37
+ data: { channelId, queueId, pageSize = 5 },
38
+ },
39
+ context: { space },
40
+ }: any) =>
41
+ Effect.gen(function* () {
42
+ const { token } = yield* Effect.tryPromise(() =>
43
+ space.db.query(Filter.typename('dxos.org/type/AccessToken', { source: 'discord.com' })).first(),
44
+ );
45
+
46
+ const enqueueMessages = Effect.gen(function* () {
47
+ const rest = yield* DiscordREST;
48
+ const { objects } = yield* Effect.tryPromise(() => space.queues.queryQueue(DXN.parse(queueId)));
49
+
50
+ let newMessages = 0;
51
+ let lastMessage = objects.at(-1);
52
+ while (true) {
53
+ // NOTE: If `after` is specified, the specified message is included in the results.
54
+ const messages = yield* rest
55
+ .getChannelMessages(channelId, { after: lastMessage?.foreignId, limit: pageSize })
56
+ .pipe((res: any) => res.json);
57
+ if (messages.length === 1) {
58
+ break;
59
+ }
60
+ const queueMessages = messages
61
+ .map((message: any) =>
62
+ createStatic(MessageSchema, {
63
+ id: ObjectId.random(),
64
+ foreignId: parseInt(message.id),
65
+ content: message.content,
66
+ }),
67
+ )
68
+ .slice(lastMessage ? 1 : 0)
69
+ .toReversed();
70
+ yield* Effect.tryPromise(() => space.queues.insertIntoQueue(DXN.parse(queueId), queueMessages));
71
+ newMessages += queueMessages.length;
72
+ lastMessage = queueMessages.at(-1);
73
+ }
74
+
75
+ return { newMessages };
76
+ }).pipe(
77
+ Effect.provide(DiscordRESTMemoryLive),
78
+ Effect.provide(
79
+ DiscordConfig.layerConfig({
80
+ token: Config.succeed(Redacted.make(token)),
81
+ }),
82
+ ),
83
+ Effect.provide(FetchHttpClient.layer),
84
+ );
85
+
86
+ return yield* enqueueMessages;
87
+ }),
88
+ });
@@ -11,5 +11,9 @@ export default async ({
11
11
  },
12
12
  }: any) => {
13
13
  const data = await request.json();
14
- return new Response(JSON.stringify(data ?? {}), { headers: { 'Content-Type': 'application/json' } });
14
+ return new Response(JSON.stringify(data ?? {}), {
15
+ headers: {
16
+ 'Content-Type': 'application/json',
17
+ },
18
+ });
15
19
  };