@dxos/plugin-script 0.8.4-main.2e9d522 → 0.8.4-main.406dc2a

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 (287) hide show
  1. package/dist/lib/browser/DeploymentDialog-65TWT6S5.mjs +13 -0
  2. package/dist/lib/browser/NotebookContainer-LVGRPFY3.mjs +683 -0
  3. package/dist/lib/browser/NotebookContainer-LVGRPFY3.mjs.map +7 -0
  4. package/dist/lib/browser/ScriptContainer-LRTRN7JW.mjs +149 -0
  5. package/dist/lib/browser/ScriptContainer-LRTRN7JW.mjs.map +7 -0
  6. package/dist/lib/browser/{app-graph-builder-HLQ7K3BT.mjs → app-graph-builder-DPYULSME.mjs} +9 -8
  7. package/dist/lib/browser/app-graph-builder-DPYULSME.mjs.map +7 -0
  8. package/dist/lib/browser/blueprint-definition-ET5KZ46I.mjs +28 -0
  9. package/dist/lib/browser/blueprint-definition-ET5KZ46I.mjs.map +7 -0
  10. package/dist/lib/browser/chunk-5CYLWXRH.mjs +89 -0
  11. package/dist/lib/browser/chunk-5CYLWXRH.mjs.map +7 -0
  12. package/dist/lib/browser/chunk-75LH4EUR.mjs +326 -0
  13. package/dist/lib/browser/chunk-75LH4EUR.mjs.map +7 -0
  14. package/dist/lib/browser/{chunk-3U6DTUH3.mjs → chunk-E7DXDICD.mjs} +29 -30
  15. package/dist/lib/browser/chunk-E7DXDICD.mjs.map +7 -0
  16. package/dist/lib/browser/{chunk-QYAREHGH.mjs → chunk-EZVXV6DA.mjs} +3 -5
  17. package/dist/lib/browser/chunk-EZVXV6DA.mjs.map +7 -0
  18. package/dist/lib/browser/{chunk-FIM2MVNJ.mjs → chunk-I3QSGUFJ.mjs} +159 -68
  19. package/dist/lib/browser/chunk-I3QSGUFJ.mjs.map +7 -0
  20. package/dist/lib/browser/{chunk-FMDXKOP7.mjs → chunk-JO2O7W6J.mjs} +71 -50
  21. package/dist/lib/browser/chunk-JO2O7W6J.mjs.map +7 -0
  22. package/dist/lib/browser/chunk-N6M34EUC.mjs +112 -0
  23. package/dist/lib/browser/chunk-N6M34EUC.mjs.map +7 -0
  24. package/dist/lib/browser/{chunk-P4HQKUCP.mjs → chunk-NM4WQS4F.mjs} +15 -15
  25. package/dist/lib/browser/chunk-NM4WQS4F.mjs.map +7 -0
  26. package/dist/lib/browser/{chunk-5TVBECWH.mjs → chunk-OKXN2N7M.mjs} +2 -2
  27. package/dist/lib/browser/chunk-ST3ACVUC.mjs +88 -0
  28. package/dist/lib/browser/chunk-ST3ACVUC.mjs.map +7 -0
  29. package/dist/lib/browser/{compiler-CXCUA4UQ.mjs → compiler-G2N2CG63.mjs} +24 -8
  30. package/dist/lib/browser/compiler-G2N2CG63.mjs.map +7 -0
  31. package/dist/lib/browser/index.mjs +109 -39
  32. package/dist/lib/browser/index.mjs.map +3 -3
  33. package/dist/lib/browser/{intent-resolver-7B77IG3N.mjs → intent-resolver-JLU7DVLQ.mjs} +33 -19
  34. package/dist/lib/browser/intent-resolver-JLU7DVLQ.mjs.map +7 -0
  35. package/dist/lib/browser/meta.json +1 -1
  36. package/dist/lib/browser/{react-surface-FYYXZA7C.mjs → react-surface-76SDTUYG.mjs} +36 -13
  37. package/dist/lib/browser/react-surface-76SDTUYG.mjs.map +7 -0
  38. package/dist/lib/browser/{settings-KCTBK5TY.mjs → settings-ERFKVNUK.mjs} +9 -8
  39. package/dist/lib/browser/settings-ERFKVNUK.mjs.map +7 -0
  40. package/dist/lib/browser/templates/index.mjs +1 -1
  41. package/dist/lib/browser/types/index.mjs +7 -4
  42. package/dist/lib/node-esm/{DeploymentDialog-3KPRWFE7.mjs → DeploymentDialog-I63ZC2HH.mjs} +6 -5
  43. package/dist/lib/node-esm/NotebookContainer-QY5NJGJI.mjs +684 -0
  44. package/dist/lib/node-esm/NotebookContainer-QY5NJGJI.mjs.map +7 -0
  45. package/dist/lib/node-esm/ScriptContainer-SVXCSLNH.mjs +150 -0
  46. package/dist/lib/node-esm/ScriptContainer-SVXCSLNH.mjs.map +7 -0
  47. package/dist/lib/node-esm/{app-graph-builder-7EYIHWH4.mjs → app-graph-builder-UXJGHXSL.mjs} +9 -8
  48. package/dist/lib/node-esm/app-graph-builder-UXJGHXSL.mjs.map +7 -0
  49. package/dist/lib/node-esm/blueprint-definition-AIYFOT7Q.mjs +30 -0
  50. package/dist/lib/node-esm/blueprint-definition-AIYFOT7Q.mjs.map +7 -0
  51. package/dist/lib/node-esm/chunk-2GVTWESW.mjs +90 -0
  52. package/dist/lib/node-esm/chunk-2GVTWESW.mjs.map +7 -0
  53. package/dist/lib/node-esm/chunk-4X375PGY.mjs +90 -0
  54. package/dist/lib/node-esm/chunk-4X375PGY.mjs.map +7 -0
  55. package/dist/lib/node-esm/chunk-67OVZHI3.mjs +327 -0
  56. package/dist/lib/node-esm/chunk-67OVZHI3.mjs.map +7 -0
  57. package/dist/lib/node-esm/{chunk-QKK3NDHW.mjs → chunk-C2ORIPKH.mjs} +15 -15
  58. package/dist/lib/node-esm/chunk-C2ORIPKH.mjs.map +7 -0
  59. package/dist/lib/node-esm/{chunk-35M3CHYE.mjs → chunk-NUXZQQ6P.mjs} +2 -2
  60. package/dist/lib/node-esm/{chunk-AHXJ6NQU.mjs → chunk-OG2SIKHE.mjs} +3 -5
  61. package/dist/lib/node-esm/chunk-OG2SIKHE.mjs.map +7 -0
  62. package/dist/lib/node-esm/{chunk-7NMI4CEU.mjs → chunk-SMFPSKQT.mjs} +159 -68
  63. package/dist/lib/node-esm/chunk-SMFPSKQT.mjs.map +7 -0
  64. package/dist/lib/node-esm/chunk-VRSDE4CI.mjs +114 -0
  65. package/dist/lib/node-esm/chunk-VRSDE4CI.mjs.map +7 -0
  66. package/dist/lib/node-esm/{chunk-RT43MACC.mjs → chunk-VZAFGLD7.mjs} +29 -30
  67. package/dist/lib/node-esm/chunk-VZAFGLD7.mjs.map +7 -0
  68. package/dist/lib/node-esm/{chunk-XJPK3IYI.mjs → chunk-YW36TZ7K.mjs} +71 -50
  69. package/dist/lib/node-esm/chunk-YW36TZ7K.mjs.map +7 -0
  70. package/dist/lib/node-esm/{compiler-EPFKQXPE.mjs → compiler-PLDAZ5GJ.mjs} +24 -8
  71. package/dist/lib/node-esm/compiler-PLDAZ5GJ.mjs.map +7 -0
  72. package/dist/lib/node-esm/index.mjs +109 -39
  73. package/dist/lib/node-esm/index.mjs.map +3 -3
  74. package/dist/lib/node-esm/{intent-resolver-FRZGS4TB.mjs → intent-resolver-SFGTIFOG.mjs} +33 -19
  75. package/dist/lib/node-esm/intent-resolver-SFGTIFOG.mjs.map +7 -0
  76. package/dist/lib/node-esm/meta.json +1 -1
  77. package/dist/lib/node-esm/{react-surface-V32NWHKN.mjs → react-surface-SHEBNW4R.mjs} +36 -13
  78. package/dist/lib/node-esm/react-surface-SHEBNW4R.mjs.map +7 -0
  79. package/dist/lib/node-esm/{settings-DXZ334A3.mjs → settings-5TYXQ42N.mjs} +9 -8
  80. package/dist/lib/node-esm/settings-5TYXQ42N.mjs.map +7 -0
  81. package/dist/lib/node-esm/templates/index.mjs +1 -1
  82. package/dist/lib/node-esm/types/index.mjs +7 -4
  83. package/dist/types/src/ScriptPlugin.d.ts +1 -1
  84. package/dist/types/src/ScriptPlugin.d.ts.map +1 -1
  85. package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -1
  86. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  87. package/dist/types/src/capabilities/artifact-definition.d.ts +1 -1
  88. package/dist/types/src/capabilities/artifact-definition.d.ts.map +1 -1
  89. package/dist/types/src/capabilities/blueprint-definition.d.ts +5 -0
  90. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
  91. package/dist/types/src/capabilities/compiler.d.ts +1 -1
  92. package/dist/types/src/capabilities/compiler.d.ts.map +1 -1
  93. package/dist/types/src/capabilities/index.d.ts +6 -6
  94. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  95. package/dist/types/src/capabilities/intent-resolver.d.ts +1 -1
  96. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  97. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  98. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  99. package/dist/types/src/capabilities/settings.d.ts +1 -1
  100. package/dist/types/src/compiler/compiler.d.ts.map +1 -1
  101. package/dist/types/src/components/DeploymentDialog/DeploymentDialog.d.ts +2 -2
  102. package/dist/types/src/components/DeploymentDialog/DeploymentDialog.d.ts.map +1 -1
  103. package/dist/types/src/components/DeploymentDialog/DeploymentDialog.stories.d.ts +246 -13
  104. package/dist/types/src/components/DeploymentDialog/DeploymentDialog.stories.d.ts.map +1 -1
  105. package/dist/types/src/components/DeploymentDialog/index.d.ts +1 -1
  106. package/dist/types/src/components/DeploymentDialog/index.d.ts.map +1 -1
  107. package/dist/types/src/components/FrameContainer/FrameContainer.d.ts.map +1 -1
  108. package/dist/types/src/components/NotebookContainer.d.ts +10 -0
  109. package/dist/types/src/components/NotebookContainer.d.ts.map +1 -0
  110. package/dist/types/src/components/NotebookContainer.stories.d.ts +248 -0
  111. package/dist/types/src/components/NotebookContainer.stories.d.ts.map +1 -0
  112. package/dist/types/src/components/NotebookStack/NotebookCell.d.ts +14 -0
  113. package/dist/types/src/components/NotebookStack/NotebookCell.d.ts.map +1 -0
  114. package/dist/types/src/components/NotebookStack/NotebookMenu.d.ts +9 -0
  115. package/dist/types/src/components/NotebookStack/NotebookMenu.d.ts.map +1 -0
  116. package/dist/types/src/components/NotebookStack/NotebookStack.d.ts +14 -0
  117. package/dist/types/src/components/NotebookStack/NotebookStack.d.ts.map +1 -0
  118. package/dist/types/src/components/NotebookStack/NotebookStack.stories.d.ts +248 -0
  119. package/dist/types/src/components/NotebookStack/NotebookStack.stories.d.ts.map +1 -0
  120. package/dist/types/src/components/NotebookStack/index.d.ts +3 -0
  121. package/dist/types/src/components/NotebookStack/index.d.ts.map +1 -0
  122. package/dist/types/src/components/ScriptContainer.d.ts +2 -2
  123. package/dist/types/src/components/ScriptContainer.d.ts.map +1 -1
  124. package/dist/types/src/components/ScriptToolbar/ScriptToolbar.d.ts.map +1 -1
  125. package/dist/types/src/components/ScriptToolbar/ScriptToolbar.stories.d.ts +245 -10
  126. package/dist/types/src/components/ScriptToolbar/ScriptToolbar.stories.d.ts.map +1 -1
  127. package/dist/types/src/components/Settings/ScriptObjectSettings.d.ts.map +1 -1
  128. package/dist/types/src/components/Settings/ScriptPluginSettings.d.ts +2 -2
  129. package/dist/types/src/components/Settings/ScriptPluginSettings.d.ts.map +1 -1
  130. package/dist/types/src/components/TestPanel/TestContainer.d.ts.map +1 -1
  131. package/dist/types/src/components/TypescriptEditor/TypescriptEditor.d.ts +4 -2
  132. package/dist/types/src/components/TypescriptEditor/TypescriptEditor.d.ts.map +1 -1
  133. package/dist/types/src/components/TypescriptEditor/TypescriptEditor.stories.d.ts +11 -4
  134. package/dist/types/src/components/TypescriptEditor/TypescriptEditor.stories.d.ts.map +1 -1
  135. package/dist/types/src/components/index.d.ts +3 -4
  136. package/dist/types/src/components/index.d.ts.map +1 -1
  137. package/dist/types/src/events.d.ts.map +1 -1
  138. package/dist/types/src/hooks/deploy.d.ts +11 -10
  139. package/dist/types/src/hooks/deploy.d.ts.map +1 -1
  140. package/dist/types/src/hooks/template.d.ts.map +1 -1
  141. package/dist/types/src/hooks/useCreateAndDeployScriptTemplates.d.ts.map +1 -1
  142. package/dist/types/src/index.d.ts +1 -0
  143. package/dist/types/src/index.d.ts.map +1 -1
  144. package/dist/types/src/meta.d.ts +0 -1
  145. package/dist/types/src/meta.d.ts.map +1 -1
  146. package/dist/types/src/notebook/eval.d.ts +13 -0
  147. package/dist/types/src/notebook/eval.d.ts.map +1 -0
  148. package/dist/types/src/notebook/index.d.ts +2 -0
  149. package/dist/types/src/notebook/index.d.ts.map +1 -0
  150. package/dist/types/src/notebook/notebook.d.ts +35 -0
  151. package/dist/types/src/notebook/notebook.d.ts.map +1 -0
  152. package/dist/types/src/notebook/notebook.test.d.ts +2 -0
  153. package/dist/types/src/notebook/notebook.test.d.ts.map +1 -0
  154. package/dist/types/src/notebook/vfs-parser.d.ts +74 -0
  155. package/dist/types/src/notebook/vfs-parser.d.ts.map +1 -0
  156. package/dist/types/src/notebook/vfs-parser.test.d.ts +2 -0
  157. package/dist/types/src/notebook/vfs-parser.test.d.ts.map +1 -0
  158. package/dist/types/src/templates/chess.d.ts.map +1 -1
  159. package/dist/types/src/templates/data-generator.d.ts.map +1 -1
  160. package/dist/types/src/templates/discord.d.ts.map +1 -1
  161. package/dist/types/src/templates/forex-effect.d.ts.map +1 -1
  162. package/dist/types/src/templates/forex.d.ts.map +1 -1
  163. package/dist/types/src/templates/gmail.d.ts.map +1 -1
  164. package/dist/types/src/templates/index.d.ts +43 -1
  165. package/dist/types/src/templates/index.d.ts.map +1 -1
  166. package/dist/types/src/templates/{echo.d.ts → ping.d.ts} +1 -1
  167. package/dist/types/src/templates/ping.d.ts.map +1 -0
  168. package/dist/types/src/testing/data.d.ts +19 -0
  169. package/dist/types/src/testing/data.d.ts.map +1 -0
  170. package/dist/types/src/testing/index.d.ts +2 -0
  171. package/dist/types/src/testing/index.d.ts.map +1 -0
  172. package/dist/types/src/translations.d.ts +28 -2
  173. package/dist/types/src/translations.d.ts.map +1 -1
  174. package/dist/types/src/types/actions.d.ts +66 -0
  175. package/dist/types/src/types/actions.d.ts.map +1 -0
  176. package/dist/types/src/types/index.d.ts +1 -0
  177. package/dist/types/src/types/index.d.ts.map +1 -1
  178. package/dist/types/src/types/schema.d.ts +54 -31
  179. package/dist/types/src/types/schema.d.ts.map +1 -1
  180. package/dist/types/src/util/deploy.d.ts +3 -3
  181. package/dist/types/src/util/deploy.d.ts.map +1 -1
  182. package/dist/types/src/util/functions.d.ts +5 -2
  183. package/dist/types/src/util/functions.d.ts.map +1 -1
  184. package/dist/types/tsconfig.tsbuildinfo +1 -1
  185. package/package.json +76 -69
  186. package/src/ScriptPlugin.tsx +93 -70
  187. package/src/capabilities/app-graph-builder.ts +6 -5
  188. package/src/capabilities/artifact-definition.ts +8 -12
  189. package/src/capabilities/blueprint-definition.ts +30 -0
  190. package/src/capabilities/compiler.ts +2 -1
  191. package/src/capabilities/index.ts +1 -1
  192. package/src/capabilities/intent-resolver.ts +16 -9
  193. package/src/capabilities/react-surface.tsx +20 -7
  194. package/src/capabilities/settings.ts +3 -3
  195. package/src/compiler/compiler.ts +1 -1
  196. package/src/components/DeploymentDialog/DeploymentDialog.stories.tsx +34 -20
  197. package/src/components/DeploymentDialog/DeploymentDialog.tsx +16 -22
  198. package/src/components/DeploymentDialog/index.ts +1 -1
  199. package/src/components/FrameContainer/FrameContainer.tsx +3 -2
  200. package/src/components/NotebookContainer.stories.tsx +32 -0
  201. package/src/components/NotebookContainer.tsx +124 -0
  202. package/src/components/NotebookStack/NotebookCell.tsx +217 -0
  203. package/src/components/NotebookStack/NotebookMenu.tsx +47 -0
  204. package/src/components/NotebookStack/NotebookStack.stories.tsx +32 -0
  205. package/src/components/NotebookStack/NotebookStack.tsx +79 -0
  206. package/src/components/NotebookStack/index.ts +6 -0
  207. package/src/components/ScriptContainer.tsx +4 -3
  208. package/src/components/ScriptToolbar/ScriptToolbar.stories.tsx +34 -17
  209. package/src/components/ScriptToolbar/ScriptToolbar.tsx +30 -23
  210. package/src/components/Settings/ScriptObjectSettings.tsx +111 -31
  211. package/src/components/Settings/ScriptPluginSettings.tsx +37 -47
  212. package/src/components/TestPanel/TestContainer.tsx +2 -1
  213. package/src/components/TestPanel/TestPanel.tsx +6 -6
  214. package/src/components/TypescriptEditor/TypescriptEditor.stories.tsx +79 -31
  215. package/src/components/TypescriptEditor/TypescriptEditor.tsx +32 -25
  216. package/src/components/index.ts +3 -0
  217. package/src/events.ts +2 -2
  218. package/src/hooks/deploy.ts +18 -19
  219. package/src/hooks/format.ts +2 -2
  220. package/src/hooks/template.ts +5 -4
  221. package/src/hooks/useCreateAndDeployScriptTemplates.ts +4 -3
  222. package/src/index.ts +1 -0
  223. package/src/meta.ts +2 -4
  224. package/src/notebook/eval.ts +105 -0
  225. package/src/notebook/index.ts +5 -0
  226. package/src/notebook/notebook.test.ts +70 -0
  227. package/src/notebook/notebook.ts +183 -0
  228. package/src/notebook/vfs-parser.test.ts +149 -0
  229. package/src/notebook/vfs-parser.ts +451 -0
  230. package/src/templates/chess.ts +3 -1
  231. package/src/templates/data-generator.ts +9 -3
  232. package/src/templates/discord.ts +12 -4
  233. package/src/templates/forex-effect.ts +7 -3
  234. package/src/templates/forex.ts +3 -1
  235. package/src/templates/gmail.ts +33 -62
  236. package/src/templates/index.ts +6 -6
  237. package/src/testing/data.ts +47 -0
  238. package/src/testing/index.ts +5 -0
  239. package/src/translations.ts +31 -4
  240. package/src/types/actions.ts +53 -0
  241. package/src/types/index.ts +1 -0
  242. package/src/types/schema.ts +30 -19
  243. package/src/util/deploy.ts +20 -33
  244. package/src/util/functions.ts +35 -6
  245. package/dist/lib/browser/DeploymentDialog-M4QIHTDR.mjs +0 -12
  246. package/dist/lib/browser/ScriptContainer-Z6SIGRRC.mjs +0 -262
  247. package/dist/lib/browser/ScriptContainer-Z6SIGRRC.mjs.map +0 -7
  248. package/dist/lib/browser/app-graph-builder-HLQ7K3BT.mjs.map +0 -7
  249. package/dist/lib/browser/artifact-definition-24Q3IHOU.mjs +0 -249
  250. package/dist/lib/browser/artifact-definition-24Q3IHOU.mjs.map +0 -7
  251. package/dist/lib/browser/chunk-3U6DTUH3.mjs.map +0 -7
  252. package/dist/lib/browser/chunk-FIM2MVNJ.mjs.map +0 -7
  253. package/dist/lib/browser/chunk-FMDXKOP7.mjs.map +0 -7
  254. package/dist/lib/browser/chunk-IS4OG2UW.mjs +0 -39
  255. package/dist/lib/browser/chunk-IS4OG2UW.mjs.map +0 -7
  256. package/dist/lib/browser/chunk-P4HQKUCP.mjs.map +0 -7
  257. package/dist/lib/browser/chunk-QYAREHGH.mjs.map +0 -7
  258. package/dist/lib/browser/chunk-R4R7VOFY.mjs +0 -88
  259. package/dist/lib/browser/chunk-R4R7VOFY.mjs.map +0 -7
  260. package/dist/lib/browser/compiler-CXCUA4UQ.mjs.map +0 -7
  261. package/dist/lib/browser/intent-resolver-7B77IG3N.mjs.map +0 -7
  262. package/dist/lib/browser/react-surface-FYYXZA7C.mjs.map +0 -7
  263. package/dist/lib/browser/settings-KCTBK5TY.mjs.map +0 -7
  264. package/dist/lib/node-esm/ScriptContainer-KPU75HHI.mjs +0 -263
  265. package/dist/lib/node-esm/ScriptContainer-KPU75HHI.mjs.map +0 -7
  266. package/dist/lib/node-esm/app-graph-builder-7EYIHWH4.mjs.map +0 -7
  267. package/dist/lib/node-esm/artifact-definition-WAJFALUI.mjs +0 -250
  268. package/dist/lib/node-esm/artifact-definition-WAJFALUI.mjs.map +0 -7
  269. package/dist/lib/node-esm/chunk-7NMI4CEU.mjs.map +0 -7
  270. package/dist/lib/node-esm/chunk-AHXJ6NQU.mjs.map +0 -7
  271. package/dist/lib/node-esm/chunk-F5GFJ3PY.mjs +0 -90
  272. package/dist/lib/node-esm/chunk-F5GFJ3PY.mjs.map +0 -7
  273. package/dist/lib/node-esm/chunk-JIPFLBYA.mjs +0 -40
  274. package/dist/lib/node-esm/chunk-JIPFLBYA.mjs.map +0 -7
  275. package/dist/lib/node-esm/chunk-QKK3NDHW.mjs.map +0 -7
  276. package/dist/lib/node-esm/chunk-RT43MACC.mjs.map +0 -7
  277. package/dist/lib/node-esm/chunk-XJPK3IYI.mjs.map +0 -7
  278. package/dist/lib/node-esm/compiler-EPFKQXPE.mjs.map +0 -7
  279. package/dist/lib/node-esm/intent-resolver-FRZGS4TB.mjs.map +0 -7
  280. package/dist/lib/node-esm/react-surface-V32NWHKN.mjs.map +0 -7
  281. package/dist/lib/node-esm/settings-DXZ334A3.mjs.map +0 -7
  282. package/dist/types/src/templates/echo.d.ts.map +0 -1
  283. /package/dist/lib/browser/{DeploymentDialog-M4QIHTDR.mjs.map → DeploymentDialog-65TWT6S5.mjs.map} +0 -0
  284. /package/dist/lib/browser/{chunk-5TVBECWH.mjs.map → chunk-OKXN2N7M.mjs.map} +0 -0
  285. /package/dist/lib/node-esm/{DeploymentDialog-3KPRWFE7.mjs.map → DeploymentDialog-I63ZC2HH.mjs.map} +0 -0
  286. /package/dist/lib/node-esm/{chunk-35M3CHYE.mjs.map → chunk-NUXZQQ6P.mjs.map} +0 -0
  287. /package/src/templates/{echo.ts → ping.ts} +0 -0
@@ -2,43 +2,91 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import React, { useCallback, useMemo, useState } from 'react';
6
7
 
7
- import { type Meta } from '@storybook/react-vite';
8
- import React, { useMemo } from 'react';
9
-
10
- import { createDocAccessor, createObject } from '@dxos/react-client/echo';
8
+ import { createDocAccessor } from '@dxos/react-client/echo';
9
+ import { createObject } from '@dxos/react-client/echo';
10
+ import { Toolbar } from '@dxos/react-ui';
11
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
11
12
  import { createDataExtensions } from '@dxos/react-ui-editor';
12
- import { withTheme } from '@dxos/storybook-utils';
13
-
14
- import { TypescriptEditor } from './TypescriptEditor';
15
- import { templates } from '../../templates';
16
-
17
- // TODO(burdon): Features:
18
- // - language support for S
19
- // - hierarchical editor (DND)
20
- // - virtual document image rendering
21
- // - mobile rendering error
22
-
23
- // TODO(burdon): JSX.
24
- // TODO(burdon): Effect schema.
25
- // TODO(burdon): react-buddy for storybook?
26
-
27
- const DefaultStory = () => {
28
- const object = useMemo(() => createObject({ content: templates[0].source }), []);
29
- const initialValue = useMemo(() => object.content, [object]);
30
- const accessor = useMemo(() => createDocAccessor(object, ['content']), [object]);
31
- const extensions = useMemo(() => [createDataExtensions({ id: object.id, text: accessor })], [object.id, accessor]);
32
- return <TypescriptEditor id='test' initialValue={initialValue} extensions={extensions} />;
33
- };
13
+ import { StackItem } from '@dxos/react-ui-stack';
14
+ import { Json } from '@dxos/react-ui-syntax-highlighter';
15
+ import { trim } from '@dxos/util';
16
+
17
+ import { TypescriptEditor, type TypescriptEditorProps } from './TypescriptEditor';
18
+
19
+ const SCRIPT = trim`
20
+ x * 2
21
+ `;
22
+
23
+ const DefaultStory = (props: TypescriptEditorProps) => {
24
+ const object = useMemo(() => createObject({ content: SCRIPT }), []);
25
+ const [result, setResult] = useState<object | undefined>({});
26
+
27
+ // TODO(burdon): Make this work.
28
+ // const object = useMemo(() => DataType.makeText(templates[1].source), []);
29
+ // const script = useMemo(
30
+ // () =>
31
+ // Obj.make(ScriptType, {
32
+ // source: Ref.make(createObject({ content: templates[0].source })),
33
+ // }),
34
+ // [object],
35
+ // );
36
+
37
+ const extensions = useMemo(
38
+ () => [createDataExtensions({ id: object.id, text: createDocAccessor(object, ['content']) })],
39
+ [],
40
+ );
41
+
42
+ const handleRun = useCallback(async () => {
43
+ try {
44
+ const definitions: [string, any][] = [['x', 100]];
34
45
 
35
- export const Default = {};
46
+ // eslint-disable-next-line @typescript-eslint/no-implied-eval
47
+ const result = new Function(...definitions.map(([name]) => name), `return ${object.content.trim()}`)(
48
+ ...definitions.map(([, value]) => value),
49
+ );
36
50
 
37
- const meta: Meta = {
51
+ setResult({
52
+ timestamp: Date.now(),
53
+ result,
54
+ });
55
+ } catch (err) {
56
+ setResult({
57
+ timestamp: Date.now(),
58
+ error: String(err),
59
+ });
60
+ }
61
+ }, [object]);
62
+
63
+ return (
64
+ <StackItem.Content toolbar>
65
+ {/* <ScriptToolbar script={script} state={{}} /> */}
66
+ <Toolbar.Root>
67
+ <Toolbar.Button onClick={handleRun}>Run</Toolbar.Button>
68
+ </Toolbar.Root>
69
+ <div role='none' className='grid grid-rows-[1fr_min-content] bs-full overflow-hidden text-sm'>
70
+ <TypescriptEditor {...props} initialValue={object.content} extensions={extensions} />
71
+ <Json data={result} classNames='shrink-0 p-2 border-t border-subduedSeparator' />
72
+ </div>
73
+ </StackItem.Content>
74
+ );
75
+ };
76
+
77
+ const meta = {
38
78
  title: 'plugins/plugin-script/TypescriptEditor',
39
79
  component: TypescriptEditor,
40
80
  render: DefaultStory,
41
- decorators: [withTheme],
42
- };
81
+ decorators: [withTheme, withLayout({ container: 'column', classNames: 'is-prose' })],
82
+ } satisfies Meta<typeof DefaultStory>;
43
83
 
44
84
  export default meta;
85
+
86
+ type Story = StoryObj<typeof meta>;
87
+
88
+ export const Default: Story = {
89
+ args: {
90
+ id: 'test',
91
+ },
92
+ };
@@ -2,27 +2,27 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
+ import { autocompletion, completionKeymap } from '@codemirror/autocomplete';
5
6
  import { javascript } from '@codemirror/lang-javascript';
6
- import { defaultHighlightStyle } from '@codemirror/language';
7
+ import { HighlightStyle } from '@codemirror/language';
7
8
  import { lintKeymap } from '@codemirror/lint';
8
9
  import { Prec } from '@codemirror/state';
9
- import { oneDarkHighlightStyle } from '@codemirror/theme-one-dark';
10
10
  import { keymap } from '@codemirror/view';
11
11
  import { tags } from '@lezer/highlight';
12
12
  import { type VirtualTypeScriptEnvironment } from '@typescript/vfs';
13
13
  import { continueKeymap } from '@valtown/codemirror-continue';
14
- import { tsSync, tsFacet, tsLinter, tsAutocomplete, tsHover, type HoverInfo } from '@valtown/codemirror-ts';
14
+ import { type HoverInfo, tsAutocomplete, tsFacet, tsHover, tsLinter, tsSync } from '@valtown/codemirror-ts';
15
15
  import React from 'react';
16
16
 
17
- import { type ThemedClassName, type ThemeMode, useThemeContext } from '@dxos/react-ui';
17
+ import { Domino, type ThemeMode, type ThemedClassName, useThemeContext } from '@dxos/react-ui';
18
18
  import {
19
+ type BasicExtensionsOptions,
19
20
  type EditorInputMode,
20
21
  InputModeExtensions,
21
22
  type UseTextEditorProps,
22
- autocomplete,
23
23
  createBasicExtensions,
24
24
  createThemeExtensions,
25
- folding,
25
+ defaultStyles,
26
26
  useTextEditor,
27
27
  } from '@dxos/react-ui-editor';
28
28
  import { mx } from '@dxos/react-ui-theme';
@@ -31,18 +31,22 @@ import { isNonNullable } from '@dxos/util';
31
31
  export type TypescriptEditorProps = ThemedClassName<
32
32
  {
33
33
  id: string;
34
+ role?: string;
34
35
  inputMode?: EditorInputMode;
35
36
  toolbar?: boolean;
36
37
  env?: VirtualTypeScriptEnvironment;
38
+ options?: BasicExtensionsOptions;
37
39
  } & Pick<UseTextEditorProps, 'initialValue' | 'extensions' | 'scrollTo' | 'selection'>
38
40
  >;
39
41
 
40
42
  export const TypescriptEditor = ({
41
43
  classNames,
42
44
  id,
45
+ role = 'article',
43
46
  inputMode = 'vscode',
44
47
  toolbar,
45
48
  env,
49
+ options,
46
50
  initialValue,
47
51
  extensions,
48
52
  scrollTo,
@@ -63,19 +67,22 @@ export const TypescriptEditor = ({
63
67
  lineNumbers: true,
64
68
  lineWrapping: false,
65
69
  monospace: true,
66
- scrollPastEnd: true,
70
+ scrollPastEnd: role !== 'section',
71
+ search: true,
72
+ ...options,
67
73
  }),
68
74
  createThemeExtensions({ themeMode, syntaxHighlighting: true }),
69
75
  InputModeExtensions[inputMode],
70
- folding(),
76
+
77
+ javascript({ typescript: true }),
78
+ autocompletion({ override: env ? [tsAutocomplete()] : undefined }),
79
+
71
80
  // Continues block comments when pressing Enter.
72
81
  Prec.high(keymap.of(continueKeymap)),
82
+ keymap.of(completionKeymap),
83
+ keymap.of(lintKeymap),
73
84
 
74
- // TODO(burdon): Factor out.
75
- javascript({ typescript: true }),
76
85
  // https://github.com/val-town/codemirror-ts
77
- autocomplete({ override: env ? [tsAutocomplete()] : undefined }),
78
- keymap.of(lintKeymap),
79
86
  env && [
80
87
  tsFacet.of({ env, path: `/src/${id}.ts` }),
81
88
  tsSync(),
@@ -87,6 +94,7 @@ export const TypescriptEditor = ({
87
94
  [id, extensions, themeMode, inputMode, selection, scrollTo],
88
95
  );
89
96
 
97
+ // TODO(brudon): Use react-ui-editor's Editor component.
90
98
  return (
91
99
  <div
92
100
  ref={parentRef}
@@ -97,8 +105,9 @@ export const TypescriptEditor = ({
97
105
  );
98
106
  };
99
107
 
108
+ // TODO(burdon): Factor out (react-ui-editor).
100
109
  const createTooltipRenderer = (themeMode: ThemeMode) => {
101
- const theme = themeMode === 'dark' ? oneDarkHighlightStyle : defaultHighlightStyle;
110
+ const theme = HighlightStyle.define(themeMode === 'dark' ? defaultStyles.dark : defaultStyles.light);
102
111
 
103
112
  const classFromKind = (_kind: string) => {
104
113
  // E.g., localName, methodName, parameterName, etc.
@@ -117,18 +126,16 @@ const createTooltipRenderer = (themeMode: ThemeMode) => {
117
126
  };
118
127
 
119
128
  return (info: HoverInfo) => {
120
- const div = document.createElement('div');
121
- div.className = 'p-1 rounded border border-separator bg-baseSurface xs:max-w-80 max-w-lg';
122
-
123
- if (info.quickInfo?.displayParts) {
124
- for (const part of info.quickInfo.displayParts) {
125
- const span = div.appendChild(document.createElement('span'));
126
- span.className = classFromKind(part.kind);
127
- span.innerText = part.text;
128
- }
129
- }
130
-
131
- return { dom: div };
129
+ return {
130
+ dom: Domino.of('div')
131
+ .classNames('xs:max-is-80 max-is-lg p-1 bg-baseSurface rounded border border-separator')
132
+ .children(
133
+ ...(info.quickInfo?.displayParts?.map(({ kind, text }) =>
134
+ Domino.of('span').classNames(classFromKind(kind)).text(text),
135
+ ) ?? []),
136
+ )
137
+ .build(),
138
+ };
132
139
  };
133
140
  };
134
141
 
@@ -4,9 +4,12 @@
4
4
 
5
5
  import { lazy } from 'react';
6
6
 
7
+ export * from './NotebookStack';
7
8
  export * from './Settings';
8
9
  export * from './TestPanel';
10
+
9
11
  export { DEPLOYMENT_DIALOG } from './DeploymentDialog';
10
12
 
11
13
  export const ScriptContainer = lazy(() => import('./ScriptContainer'));
12
14
  export const DeploymentDialog = lazy(() => import('./DeploymentDialog'));
15
+ export const NotebookContainer = lazy(() => import('./NotebookContainer'));
package/src/events.ts CHANGED
@@ -4,8 +4,8 @@
4
4
 
5
5
  import { defineEvent } from '@dxos/app-framework';
6
6
 
7
- import { SCRIPT_PLUGIN } from './meta';
7
+ import { meta } from './meta';
8
8
 
9
9
  export namespace ScriptEvents {
10
- export const SetupCompiler = defineEvent(`${SCRIPT_PLUGIN}/event/setup-compiler`);
10
+ export const SetupCompiler = defineEvent(`${meta.id}/event/setup-compiler`);
11
11
  }
@@ -4,15 +4,15 @@
4
4
 
5
5
  import { useEffect, useMemo } from 'react';
6
6
 
7
- import { FunctionType, type ScriptType, getUserFunctionUrlInMetadata } from '@dxos/functions';
7
+ import { FunctionType, type ScriptType, getUserFunctionIdInMetadata } from '@dxos/functions';
8
8
  import { log } from '@dxos/log';
9
9
  import { type Client, useClient } from '@dxos/react-client';
10
- import { getMeta, getSpace, Query, Ref, type Space, useQuery } from '@dxos/react-client/echo';
10
+ import { Query, Ref, type Space, getMeta, getSpace, useQuery } from '@dxos/react-client/echo';
11
11
  import { type TFunction } from '@dxos/react-ui';
12
12
  import { createMenuAction } from '@dxos/react-ui-menu';
13
13
  import { errorMessageColors } from '@dxos/react-ui-theme';
14
14
 
15
- import { SCRIPT_PLUGIN } from '../meta';
15
+ import { meta } from '../meta';
16
16
  import { deployScript, getFunctionUrl, isScriptDeployed } from '../util';
17
17
 
18
18
  export type DeployActionProperties = { type: 'deploy' } | { type: 'copy' };
@@ -29,15 +29,15 @@ export type CreateDeployOptions = {
29
29
  script: ScriptType;
30
30
  fn: FunctionType;
31
31
  space?: Space;
32
- existingFunctionUrl?: string;
32
+ existingFunctionId?: string;
33
33
  client: Client;
34
34
  t: TFunction;
35
35
  };
36
36
 
37
- export const createDeploy = ({ state, script, space, fn, client, existingFunctionUrl, t }: CreateDeployOptions) => {
37
+ export const createDeploy = ({ state, script, space, fn, client, existingFunctionId, t }: CreateDeployOptions) => {
38
38
  // TODO(wittjosiah): Should this be an action?
39
39
  const errorItem = createMenuAction('error', () => {}, {
40
- label: state.error ?? ['no error label', { ns: SCRIPT_PLUGIN }],
40
+ label: state.error ?? ['no error label', { ns: meta.id }],
41
41
  icon: 'ph--warning-circle--regular',
42
42
  hidden: !state.error,
43
43
  classNames: state.error && errorMessageColors,
@@ -53,7 +53,7 @@ export const createDeploy = ({ state, script, space, fn, client, existingFunctio
53
53
  state.error = undefined;
54
54
  state.deploying = true;
55
55
 
56
- const result = await deployScript({ script, client, space, fn, existingFunctionUrl });
56
+ const result = await deployScript({ script, client, space, fn, existingFunctionId });
57
57
 
58
58
  if (!result.success) {
59
59
  log.catch(result.error);
@@ -64,7 +64,7 @@ export const createDeploy = ({ state, script, space, fn, client, existingFunctio
64
64
  },
65
65
  {
66
66
  type: 'deploy',
67
- label: [state.deploying ? 'pending label' : 'deploy label', { ns: SCRIPT_PLUGIN }],
67
+ label: [state.deploying ? 'publishing label' : 'deploy label', { ns: meta.id }],
68
68
  icon: state.deploying ? 'ph--spinner-gap--regular' : 'ph--cloud-arrow-up--regular',
69
69
  disabled: state.deploying,
70
70
  classNames: state.deploying ? '[&_svg]:animate-spin' : '',
@@ -74,14 +74,13 @@ export const createDeploy = ({ state, script, space, fn, client, existingFunctio
74
74
  const copyAction = createMenuAction<DeployActionProperties>(
75
75
  'copy',
76
76
  async () => {
77
- if (!state.functionUrl) {
78
- return;
77
+ if (state.functionUrl) {
78
+ await navigator.clipboard.writeText(state.functionUrl);
79
79
  }
80
- await navigator.clipboard.writeText(state.functionUrl);
81
80
  },
82
81
  {
83
82
  type: 'copy',
84
- label: ['copy link label', { ns: SCRIPT_PLUGIN }],
83
+ label: ['copy link label', { ns: meta.id }],
85
84
  icon: 'ph--link--regular',
86
85
  disabled: !state.functionUrl,
87
86
  },
@@ -98,9 +97,9 @@ export const createDeploy = ({ state, script, space, fn, client, existingFunctio
98
97
  };
99
98
 
100
99
  export const useDeployState = ({ state, script }: { state: Partial<DeployState>; script: ScriptType }) => {
101
- const { space, client, fn, existingFunctionUrl } = useDeployDeps({ script });
100
+ const { space, client, fn, existingFunctionId } = useDeployDeps({ script });
102
101
  useEffect(() => {
103
- if (!existingFunctionUrl) {
102
+ if (!existingFunctionId) {
104
103
  return;
105
104
  }
106
105
 
@@ -109,17 +108,17 @@ export const useDeployState = ({ state, script }: { state: Partial<DeployState>;
109
108
  fn,
110
109
  edgeUrl: client.config.values.runtime?.services?.edge?.url ?? '',
111
110
  });
112
- }, [existingFunctionUrl, space, fn, script, client.config.values.runtime?.services?.edge?.url]);
111
+ }, [existingFunctionId, space, fn, script, client.config.values.runtime?.services?.edge?.url]);
113
112
 
114
113
  useEffect(() => {
115
114
  state.deployed = isScriptDeployed({ script, fn });
116
- }, [script.changed, existingFunctionUrl, fn, script]);
115
+ }, [script.changed, existingFunctionId, fn, script]);
117
116
  };
118
117
 
119
118
  export const useDeployDeps = ({ script }: { script: ScriptType }) => {
119
+ const client = useClient();
120
120
  const space = getSpace(script);
121
121
  const [fn] = useQuery(space, Query.type(FunctionType, { source: Ref.make(script) }));
122
- const client = useClient();
123
- const existingFunctionUrl = useMemo(() => fn && getUserFunctionUrlInMetadata(getMeta(fn)), [fn]);
124
- return { space, fn, client, existingFunctionUrl };
122
+ const existingFunctionId = useMemo(() => fn && getUserFunctionIdInMetadata(getMeta(fn)), [fn]);
123
+ return { client, space, fn, existingFunctionId };
125
124
  };
@@ -10,7 +10,7 @@ import { type ScriptType } from '@dxos/functions';
10
10
  import { log } from '@dxos/log';
11
11
  import { createMenuAction } from '@dxos/react-ui-menu';
12
12
 
13
- import { SCRIPT_PLUGIN } from '../meta';
13
+ import { meta } from '../meta';
14
14
 
15
15
  export type FormatActionProperties = { type: 'format' };
16
16
 
@@ -35,7 +35,7 @@ export const createFormat = (script: ScriptType) => {
35
35
  }
36
36
  },
37
37
  {
38
- label: ['format label', { ns: SCRIPT_PLUGIN }],
38
+ label: ['format label', { ns: meta.id }],
39
39
  icon: 'ph--magic-wand--regular',
40
40
  },
41
41
  );
@@ -4,16 +4,17 @@
4
4
 
5
5
  import { Obj } from '@dxos/echo';
6
6
  import { FUNCTIONS_PRESET_META_KEY, type ScriptType } from '@dxos/functions';
7
- import { createMenuItemGroup, createMenuAction } from '@dxos/react-ui-menu';
7
+ import { createMenuAction, createMenuItemGroup } from '@dxos/react-ui-menu';
8
8
 
9
- import { SCRIPT_PLUGIN } from '../meta';
9
+ import { meta } from '../meta';
10
10
  import { templates } from '../templates';
11
11
 
12
12
  export type TemplateActionProperties = { type: 'template'; value: string };
13
13
 
14
14
  const createTemplateSelectGroup = () => {
15
+ // TODO(burdon): This should not be in the toolbar (move to create Object dialog).
15
16
  return createMenuItemGroup('template-select', {
16
- label: ['template select group label', { ns: SCRIPT_PLUGIN }],
17
+ label: ['template select group label', { ns: meta.id }],
17
18
  variant: 'dropdownMenu',
18
19
  });
19
20
  };
@@ -30,7 +31,7 @@ const createTemplateSelectActions = (script: ScriptType) => {
30
31
  if (oldPresetIndex >= 0) {
31
32
  metaKeys.splice(oldPresetIndex, 1);
32
33
  }
33
- if (template.presetId) {
34
+ if ('presetId' in template) {
34
35
  metaKeys.push({ source: FUNCTIONS_PRESET_META_KEY, id: template.presetId });
35
36
  }
36
37
  },
@@ -2,7 +2,7 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { pipe } from 'effect/Function';
5
+ import * as Function from 'effect/Function';
6
6
  import { useCallback, useState } from 'react';
7
7
 
8
8
  import { chain, createIntent, useIntentDispatcher } from '@dxos/app-framework';
@@ -40,8 +40,8 @@ export const useCreateAndDeployScriptTemplates = (space: Space | undefined, scri
40
40
  const deploymentResults = await Promise.all(
41
41
  scriptTemplates.map(async (template) => {
42
42
  const result = await dispatch(
43
- pipe(
44
- createIntent(ScriptAction.Create, { space, initialTemplateId: template.id }),
43
+ Function.pipe(
44
+ createIntent(ScriptAction.CreateScript, { space, initialTemplateId: template.id as any }),
45
45
  chain(SpaceAction.AddObject, { target: space }),
46
46
  ),
47
47
  );
@@ -55,5 +55,6 @@ export const useCreateAndDeployScriptTemplates = (space: Space | undefined, scri
55
55
  setStatus(hasErrors ? 'error' : 'success');
56
56
  }, [space, dispatch, client, scriptTemplates]);
57
57
 
58
+ // TODO(burdon): Return onCreateAndDeployScripts.
58
59
  return { handleCreateAndDeployScripts, status, error };
59
60
  };
package/src/index.ts CHANGED
@@ -5,5 +5,6 @@
5
5
  export { ScriptCapabilities } from './capabilities';
6
6
  export * from './components';
7
7
  export * from './meta';
8
+ export * from './util';
8
9
 
9
10
  export * from './ScriptPlugin';
package/src/meta.ts CHANGED
@@ -4,13 +4,11 @@
4
4
 
5
5
  import { type PluginMeta } from '@dxos/app-framework';
6
6
 
7
- export const SCRIPT_PLUGIN = 'dxos.org/plugin/script';
8
-
9
7
  export const meta: PluginMeta = {
10
- id: SCRIPT_PLUGIN,
8
+ id: 'dxos.org/plugin/script',
11
9
  name: 'Scripts',
12
10
  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.',
11
+ 'Scripts enable 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.',
14
12
  icon: 'ph--code--regular',
15
13
  source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-explorer',
16
14
  tags: ['labs'],
@@ -0,0 +1,105 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { trim } from '@dxos/util';
6
+
7
+ /**
8
+ * Evaluate the script (with dependencies as arguments).
9
+ */
10
+ export const evalScript = (code: string, deps: Record<string, any> = {}) => {
11
+ // Create a sandboxed environment that blocks access to window and document.
12
+ const sandbox = {
13
+ ...deps,
14
+
15
+ // Block access to global objects.
16
+ console: undefined,
17
+ document: undefined,
18
+ global: undefined,
19
+ globalThis: undefined,
20
+ self: undefined,
21
+ window: undefined,
22
+
23
+ // Allow some safe globals.
24
+ Array,
25
+ Boolean,
26
+ Date,
27
+ Error,
28
+ JSON,
29
+ Map,
30
+ Math,
31
+ Number,
32
+ Object,
33
+ Promise,
34
+ RegExp,
35
+ Set,
36
+ String,
37
+
38
+ // Functions.
39
+ isFinite,
40
+ isNaN,
41
+ parseFloat,
42
+ parseInt,
43
+
44
+ // Note: undefined and null are not included as they are keywords, not variables.
45
+ };
46
+
47
+ // Create function with all sandbox keys as parameters.
48
+ const sandboxKeys = Object.keys(sandbox);
49
+ const sandboxValues = Object.values(sandbox);
50
+
51
+ // eslint-disable-next-line @typescript-eslint/no-implied-eval
52
+ const fn = new Function(
53
+ ...sandboxKeys,
54
+ trim`
55
+ 'use strict';
56
+ return ${code};
57
+ `,
58
+ );
59
+
60
+ return fn(...sandboxValues);
61
+ };
62
+
63
+ /**
64
+ * Globals.
65
+ */
66
+ export const builtIns = new Set([
67
+ // Types.
68
+ 'Array',
69
+ 'Date',
70
+ 'Error',
71
+ 'JSON',
72
+ 'Map',
73
+ 'Math',
74
+ 'Number',
75
+ 'Object',
76
+ 'Promise',
77
+ 'RegExp',
78
+ 'Set',
79
+ 'String',
80
+
81
+ // Functions.
82
+ 'isFinite',
83
+ 'isNaN',
84
+ 'parseFloat',
85
+ 'parseInt',
86
+ ]);
87
+
88
+ /**
89
+ * Default system definitions.
90
+ */
91
+ export const systemDefinitions = trim`
92
+ interface Array<T> { length: number; [n: number]: T; }
93
+ interface Boolean {}
94
+ interface Function {}
95
+ interface IArguments {}
96
+ interface Number {}
97
+ interface Object {}
98
+ interface RegExp {}
99
+ interface String { length: number; }
100
+
101
+ interface CallableFunction extends Function {}
102
+ interface NewableFunction extends Function {}
103
+
104
+ declare var console: { log(...args: any[]): void };
105
+ `;
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './notebook';
@@ -0,0 +1,70 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { describe, expect, test } from 'vitest';
6
+
7
+ import { createNotebook } from '../testing';
8
+
9
+ import { ComputeGraph } from './notebook';
10
+
11
+ describe('notebook', () => {
12
+ test('parse dependency graph', () => {
13
+ const notebook = createNotebook();
14
+ const computer = new ComputeGraph(notebook);
15
+ const result = computer.parse();
16
+
17
+ const getId = (i: number) => notebook.cells[i].id;
18
+
19
+ // Check dependencies.
20
+ expect(result.dependencyGraph).toMatchObject({
21
+ [getId(0)]: [getId(1), getId(2)],
22
+ [getId(3)]: [getId(1)],
23
+ [getId(4)]: [getId(0), getId(3)],
24
+ });
25
+
26
+ // Compute values.
27
+ const values = computer.evaluate();
28
+ expect(values).toEqual({
29
+ [getId(0)]: 300,
30
+ [getId(2)]: 200,
31
+ [getId(3)]: 200,
32
+ [getId(4)]: 500,
33
+ });
34
+ });
35
+
36
+ test('evalScript blocks access to window and document', () => {
37
+ const notebook = createNotebook();
38
+ // Replace one of the cells with code that tries to access window/document.
39
+ if (notebook.cells[2].script?.target) {
40
+ notebook.cells[2].script.target.content = 'b = typeof window';
41
+ }
42
+
43
+ const computer = new ComputeGraph(notebook);
44
+ computer.parse();
45
+ const values = computer.evaluate();
46
+
47
+ // Should evaluate to 'undefined' since window is blocked.
48
+ expect(values[notebook.cells[2].id]).toBe('undefined');
49
+
50
+ // Test document access.
51
+ if (notebook.cells[2].script?.target) {
52
+ notebook.cells[2].script.target.content = 'b = typeof document';
53
+ }
54
+ computer.parse();
55
+ const values2 = computer.evaluate();
56
+
57
+ // Should evaluate to 'undefined' since document is blocked.
58
+ expect(values2[notebook.cells[2].id]).toBe('undefined');
59
+
60
+ // Test that safe globals still work.
61
+ if (notebook.cells[2].script?.target) {
62
+ notebook.cells[2].script.target.content = 'b = Math.max(100, 200)';
63
+ }
64
+ computer.parse();
65
+ const values3 = computer.evaluate();
66
+
67
+ // Should evaluate correctly.
68
+ expect(values3[notebook.cells[2].id]).toBe(200);
69
+ });
70
+ });