@dxos/plugin-script 0.6.10-main.e92b5eb → 0.6.10-staging.014d6d3

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 (91) hide show
  1. package/README.md +45 -0
  2. package/dist/lib/browser/ScriptEditor-WNCGR5OU.mjs +452 -0
  3. package/dist/lib/browser/ScriptEditor-WNCGR5OU.mjs.map +7 -0
  4. package/dist/lib/browser/{TypescriptEditor-PIRIDDUS.mjs → TypescriptEditor-XTGRVCMY.mjs} +2 -2
  5. package/dist/lib/browser/{chunk-ISMNAD3P.mjs → chunk-DL5XQRQM.mjs} +13 -7
  6. package/dist/lib/browser/{chunk-ISMNAD3P.mjs.map → chunk-DL5XQRQM.mjs.map} +3 -3
  7. package/dist/lib/browser/{chunk-D4O723CR.mjs → chunk-DX5CSOBP.mjs} +22 -5
  8. package/dist/lib/browser/chunk-DX5CSOBP.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-RHEZ5LUU.mjs +229 -0
  10. package/dist/lib/browser/chunk-RHEZ5LUU.mjs.map +7 -0
  11. package/dist/lib/browser/edge/index.mjs +1 -1
  12. package/dist/lib/browser/index.mjs +88 -195
  13. package/dist/lib/browser/index.mjs.map +4 -4
  14. package/dist/lib/browser/meta.json +1 -1
  15. package/dist/lib/node/ScriptEditor-RR7AVOQL.cjs +465 -0
  16. package/dist/lib/node/ScriptEditor-RR7AVOQL.cjs.map +7 -0
  17. package/dist/lib/node/{TypescriptEditor-OTWJUIWB.cjs → TypescriptEditor-CRONCQSI.cjs} +7 -7
  18. package/dist/lib/node/{TypescriptEditor-OTWJUIWB.cjs.map → TypescriptEditor-CRONCQSI.cjs.map} +2 -2
  19. package/dist/lib/node/chunk-4GTXIELQ.cjs +252 -0
  20. package/dist/lib/node/chunk-4GTXIELQ.cjs.map +7 -0
  21. package/dist/lib/node/{chunk-HN3AVLUL.cjs → chunk-PFH3ROEH.cjs} +16 -10
  22. package/dist/lib/node/{chunk-HN3AVLUL.cjs.map → chunk-PFH3ROEH.cjs.map} +3 -3
  23. package/dist/lib/node/{chunk-ITLHJMWP.cjs → chunk-RXI576K3.cjs} +24 -7
  24. package/dist/lib/node/chunk-RXI576K3.cjs.map +7 -0
  25. package/dist/lib/node/edge/index.cjs +8 -8
  26. package/dist/lib/node/edge/index.cjs.map +1 -1
  27. package/dist/lib/node/index.cjs +85 -194
  28. package/dist/lib/node/index.cjs.map +4 -4
  29. package/dist/lib/node/meta.json +1 -1
  30. package/dist/types/src/ScriptPlugin.d.ts +1 -4
  31. package/dist/types/src/ScriptPlugin.d.ts.map +1 -1
  32. package/dist/types/src/bundler/bundler.d.ts +39 -0
  33. package/dist/types/src/bundler/bundler.d.ts.map +1 -0
  34. package/dist/types/src/bundler/bundler.test.d.ts +2 -0
  35. package/dist/types/src/bundler/bundler.test.d.ts.map +1 -0
  36. package/dist/types/src/bundler/index.d.ts +2 -0
  37. package/dist/types/src/bundler/index.d.ts.map +1 -0
  38. package/dist/types/src/compiler/compiler.browser.test.d.ts +2 -0
  39. package/dist/types/src/compiler/compiler.browser.test.d.ts.map +1 -0
  40. package/dist/types/src/compiler/compiler.d.ts +9 -34
  41. package/dist/types/src/compiler/compiler.d.ts.map +1 -1
  42. package/dist/types/src/components/DetailsPanel.d.ts +9 -0
  43. package/dist/types/src/components/DetailsPanel.d.ts.map +1 -0
  44. package/dist/types/src/components/ScriptBlock/FrameContainer/FrameContainer.d.ts +2 -2
  45. package/dist/types/src/components/ScriptBlock/FrameContainer/FrameContainer.d.ts.map +1 -1
  46. package/dist/types/src/components/ScriptBlock/ScriptBlock.d.ts.map +1 -1
  47. package/dist/types/src/components/ScriptEditor.d.ts +3 -2
  48. package/dist/types/src/components/ScriptEditor.d.ts.map +1 -1
  49. package/dist/types/src/components/Toolbar.d.ts +9 -7
  50. package/dist/types/src/components/Toolbar.d.ts.map +1 -1
  51. package/dist/types/src/components/Toolbar.stories.d.ts +1 -1
  52. package/dist/types/src/components/TypescriptEditor.d.ts +3 -1
  53. package/dist/types/src/components/TypescriptEditor.d.ts.map +1 -1
  54. package/dist/types/src/components/TypescriptEditor.stories.d.ts +1 -1
  55. package/dist/types/src/components/index.d.ts +2 -2
  56. package/dist/types/src/components/index.d.ts.map +1 -1
  57. package/dist/types/src/data/templates.md.d.ts +3 -0
  58. package/dist/types/src/data/templates.md.d.ts.map +1 -0
  59. package/dist/types/src/edge/functions.d.ts.map +1 -1
  60. package/dist/types/src/index.d.ts +1 -0
  61. package/dist/types/src/index.d.ts.map +1 -1
  62. package/dist/types/src/translations.d.ts +3 -2
  63. package/dist/types/src/translations.d.ts.map +1 -1
  64. package/package.json +38 -33
  65. package/src/ScriptPlugin.tsx +29 -10
  66. package/src/bundler/bundler.test.ts +44 -0
  67. package/src/bundler/bundler.ts +246 -0
  68. package/src/bundler/index.ts +5 -0
  69. package/src/compiler/compiler.browser.test.ts +18 -0
  70. package/src/compiler/compiler.ts +31 -190
  71. package/src/compiler/index.ts +1 -1
  72. package/src/components/DetailsPanel.tsx +218 -0
  73. package/src/components/ScriptBlock/FrameContainer/FrameContainer.tsx +2 -2
  74. package/src/components/ScriptBlock/ScriptBlock.tsx +10 -7
  75. package/src/components/ScriptEditor.tsx +71 -13
  76. package/src/components/Toolbar.tsx +69 -91
  77. package/src/components/TypescriptEditor.tsx +18 -4
  78. package/src/data/templates.md.ts +44 -0
  79. package/src/edge/functions.ts +9 -2
  80. package/src/index.ts +1 -0
  81. package/src/translations.ts +4 -3
  82. package/dist/lib/browser/ScriptEditor-MSQDR6D7.mjs +0 -241
  83. package/dist/lib/browser/ScriptEditor-MSQDR6D7.mjs.map +0 -7
  84. package/dist/lib/browser/chunk-D4O723CR.mjs.map +0 -7
  85. package/dist/lib/node/ScriptEditor-KBSACFYK.cjs +0 -258
  86. package/dist/lib/node/ScriptEditor-KBSACFYK.cjs.map +0 -7
  87. package/dist/lib/node/chunk-ITLHJMWP.cjs.map +0 -7
  88. package/dist/types/src/compiler/compiler.test.d.ts +0 -2
  89. package/dist/types/src/compiler/compiler.test.d.ts.map +0 -1
  90. package/src/compiler/compiler.test.ts +0 -17
  91. /package/dist/lib/browser/{TypescriptEditor-PIRIDDUS.mjs.map → TypescriptEditor-XTGRVCMY.mjs.map} +0 -0
@@ -5,6 +5,8 @@
5
5
  import { javascript } from '@codemirror/lang-javascript';
6
6
  import { defaultHighlightStyle, syntaxHighlighting } from '@codemirror/language';
7
7
  import { oneDarkHighlightStyle } from '@codemirror/theme-one-dark';
8
+ import { type VirtualTypeScriptEnvironment } from '@typescript/vfs';
9
+ import { tsSync, tsFacet, tsLinter, tsAutocomplete, tsHover } from '@valtown/codemirror-ts';
8
10
  import React from 'react';
9
11
 
10
12
  import { useThemeContext } from '@dxos/react-ui';
@@ -12,9 +14,10 @@ import {
12
14
  autocomplete,
13
15
  createBasicExtensions,
14
16
  createThemeExtensions,
15
- editorContent,
17
+ editorFullWidth,
16
18
  editorGutter,
17
19
  editorMonospace,
20
+ InputModeExtensions,
18
21
  useTextEditor,
19
22
  type UseTextEditorProps,
20
23
  } from '@dxos/react-ui-editor';
@@ -22,6 +25,7 @@ import { nonNullable } from '@dxos/util';
22
25
 
23
26
  export type TypescriptEditorProps = {
24
27
  id: string;
28
+ env?: VirtualTypeScriptEnvironment;
25
29
  className?: string;
26
30
  scrollPastEnd?: boolean;
27
31
  } & Pick<UseTextEditorProps, 'initialValue' | 'extensions' | 'scrollTo' | 'selection'>;
@@ -29,6 +33,7 @@ export type TypescriptEditorProps = {
29
33
  export const TypescriptEditor = ({
30
34
  id,
31
35
  extensions,
36
+ env,
32
37
  initialValue,
33
38
  scrollTo,
34
39
  selection,
@@ -43,19 +48,28 @@ export const TypescriptEditor = ({
43
48
  extensions: [
44
49
  extensions,
45
50
  // TODO(wittjosiah): Highlight active line doesn't work.
46
- createBasicExtensions({ highlightActiveLine: true, indentWithTab: true, lineNumbers: true, scrollPastEnd }),
51
+ createBasicExtensions({
52
+ highlightActiveLine: true,
53
+ indentWithTab: true,
54
+ lineNumbers: true,
55
+ lineWrapping: false,
56
+ scrollPastEnd,
57
+ }),
47
58
  // TODO(wittjosiah): Factor out syntax highlighting to theme extensions.
48
59
  themeMode === 'dark' ? syntaxHighlighting(oneDarkHighlightStyle) : syntaxHighlighting(defaultHighlightStyle),
49
60
  createThemeExtensions({
50
61
  themeMode,
51
62
  slots: {
52
- content: { className: editorContent },
63
+ content: { className: editorFullWidth },
53
64
  },
54
65
  }),
55
66
  editorGutter,
56
67
  editorMonospace,
57
68
  javascript({ typescript: true }),
58
- autocomplete(),
69
+ // https://github.com/val-town/codemirror-ts
70
+ env ? [tsFacet.of({ env, path: `/src/${id}.ts` }), tsSync(), tsLinter(), tsHover()] : [],
71
+ autocomplete({ override: env ? [tsAutocomplete()] : [] }),
72
+ InputModeExtensions.vscode,
59
73
  ].filter(nonNullable),
60
74
  selection,
61
75
  scrollTo,
@@ -0,0 +1,44 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ export default async ({
6
+ event: {
7
+ data: { request },
8
+ },
9
+ context: { space, ai },
10
+ }: any) => {
11
+ const { objects: docs } = await space.crud.query({ __typename: 'dxos.org/type/Document' }).run();
12
+
13
+ let context = '';
14
+ for (const doc of docs) {
15
+ const { content } = await space.crud.query({ id: doc.content }).first();
16
+ context += content + '\n\n';
17
+ }
18
+
19
+ const answer = await ai.run('@cf/meta/llama-3.1-8b-instruct', {
20
+ prompt: `
21
+ Using the context data only to answer the user's question.
22
+ If you don't know the answer reply with "I don't know.".
23
+
24
+ CONTEXT:
25
+ ${context}
26
+
27
+ QUESTION:
28
+ ${await request.text()}
29
+ `,
30
+ stream: true,
31
+ });
32
+
33
+ // TODO(burdon): Create wrapper for stream response.
34
+ // Transform event stream into raw text.
35
+ const { readable, writable } = new TransformStream({
36
+ transform: (chunk, controller) => {
37
+ controller.enqueue(
38
+ new TextEncoder().encode(JSON.parse(new TextDecoder().decode(chunk).slice('data: '.length)).response),
39
+ );
40
+ },
41
+ });
42
+ answer.pipeTo(writable);
43
+ return new Response(readable);
44
+ };
@@ -37,10 +37,17 @@ export type UploadWorkerProps = {
37
37
  credentialLoadTimeout?: number; // ms to wait for credentials to load
38
38
  };
39
39
 
40
- const defaultUserFunctionsBaseUrl = 'https://edge-main.dxos.workers.dev'; // 'http://localhost:8600';
40
+ // TODO(burdon): Config.
41
+ const defaultUserFunctionsBaseUrl = 'https://edge-main.dxos.workers.dev/functions'; // 'http://localhost:8600';
41
42
 
42
43
  const getBaseUrl = (config: Config) => {
43
- return config.get('runtime.app.env.DX_FUNCTIONS_SERVICE_HOST') || defaultUserFunctionsBaseUrl;
44
+ if (config.values.runtime?.services?.edge?.url) {
45
+ const url = new URL('/functions', config.values.runtime?.services?.edge?.url);
46
+ url.protocol = 'https';
47
+ return url.toString();
48
+ } else {
49
+ return defaultUserFunctionsBaseUrl;
50
+ }
44
51
  };
45
52
 
46
53
  export const uploadWorkerFunction = async ({
package/src/index.ts CHANGED
@@ -6,6 +6,7 @@ import { ScriptPlugin } from './ScriptPlugin';
6
6
 
7
7
  export default ScriptPlugin;
8
8
 
9
+ export * from './bundler';
9
10
  export * from './compiler';
10
11
  export * from './components';
11
12
  export * from './types';
@@ -12,13 +12,14 @@ export default [
12
12
  'object title placeholder': 'New script',
13
13
  'create object label': 'Create script',
14
14
  'create stack section label': 'Create script',
15
- 'binding label': 'Binding',
16
- 'binding placeholder': 'Enter binding',
17
- 'edit binding label': 'Edit binding',
15
+ 'binding placeholder': 'Function name',
16
+ 'function request placeholder': 'Function request',
18
17
  'deploy label': 'Deploy',
19
18
  'deployed label': 'Current version of the script is deployed',
20
19
  'upload failed label': 'Upload failed',
21
20
  'copy link label': 'Copy function link',
21
+ 'format label': 'Format',
22
+ 'toggle details label': 'Toggle details panel',
22
23
  },
23
24
  },
24
25
  },
@@ -1,241 +0,0 @@
1
- import {
2
- getUserFunctionUrlInMetadata,
3
- publicKeyToDid,
4
- setUserFunctionUrlInMetadata,
5
- uploadWorkerFunction
6
- } from "./chunk-ISMNAD3P.mjs";
7
- import {
8
- FunctionType
9
- } from "./chunk-ZGCETT2W.mjs";
10
- import {
11
- SCRIPT_PLUGIN
12
- } from "./chunk-JBACGDOJ.mjs";
13
- import {
14
- TypescriptEditor
15
- } from "./chunk-D4O723CR.mjs";
16
-
17
- // packages/plugins/experimental/plugin-script/src/components/ScriptEditor.tsx
18
- import React2, { useCallback, useMemo, useState as useState2 } from "react";
19
- import { log } from "@dxos/log";
20
- import { useClient } from "@dxos/react-client";
21
- import { create, createDocAccessor, Filter, getMeta, getSpace, useQuery } from "@dxos/react-client/echo";
22
- import { useIdentity } from "@dxos/react-client/halo";
23
- import { useTranslation as useTranslation2 } from "@dxos/react-ui";
24
- import { createDataExtensions, listener } from "@dxos/react-ui-editor";
25
- import { mx as mx2 } from "@dxos/react-ui-theme";
26
-
27
- // packages/plugins/experimental/plugin-script/src/components/Toolbar.tsx
28
- import { Check, Checks, CircleNotch, Link, PencilSimple, UploadSimple, WarningCircle, X } from "@phosphor-icons/react";
29
- import React, { useEffect, useRef, useState } from "react";
30
- import { Button, DensityProvider, ElevationProvider, Input, Toolbar as NaturalToolbar, Tooltip, useTranslation } from "@dxos/react-ui";
31
- import { getSize, mx } from "@dxos/react-ui-theme";
32
- var Toolbar = ({ binding: _binding, onBindingChange, deployed, onDeploy, functionUrl, error }) => {
33
- const { t } = useTranslation(SCRIPT_PLUGIN);
34
- const [pending, setPending] = useState(false);
35
- const [editing, setEditing] = useState(false);
36
- const [binding, setBinding] = useState(_binding);
37
- const inputRef = useRef(null);
38
- useEffect(() => {
39
- if (!editing && _binding !== binding) {
40
- setBinding(_binding);
41
- }
42
- }, [
43
- _binding
44
- ]);
45
- const handleEdit = () => {
46
- setEditing(true);
47
- inputRef.current?.focus();
48
- };
49
- const handleSave = () => {
50
- setEditing(false);
51
- onBindingChange(binding);
52
- };
53
- const handleCancel = () => {
54
- setEditing(false);
55
- };
56
- const handleCopyLink = async () => {
57
- if (!functionUrl) {
58
- return;
59
- }
60
- await navigator.clipboard.writeText(functionUrl);
61
- };
62
- const handleDeploy = async () => {
63
- setPending(true);
64
- await onDeploy?.();
65
- setPending(false);
66
- };
67
- return /* @__PURE__ */ React.createElement(DensityProvider, {
68
- density: "fine"
69
- }, /* @__PURE__ */ React.createElement(ElevationProvider, {
70
- elevation: "chrome"
71
- }, /* @__PURE__ */ React.createElement(NaturalToolbar.Root, {
72
- classNames: "p-1 is-full shrink-0 overflow-x-auto overflow-y-hidden",
73
- style: {
74
- contain: "layout"
75
- }
76
- }, /* @__PURE__ */ React.createElement(Input.Root, null, /* @__PURE__ */ React.createElement(Input.Label, null, t("binding label")), /* @__PURE__ */ React.createElement(Input.TextInput, {
77
- ref: inputRef,
78
- classNames: "!is-auto",
79
- disabled: !editing,
80
- value: binding,
81
- onChange: (event) => setBinding(event.target.value.toUpperCase())
82
- }), editing ? /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Button, {
83
- variant: "ghost",
84
- onClick: handleCancel
85
- }, /* @__PURE__ */ React.createElement(X, {
86
- className: getSize(4)
87
- })), /* @__PURE__ */ React.createElement(Button, {
88
- variant: "ghost",
89
- onClick: handleSave
90
- }, /* @__PURE__ */ React.createElement(Check, {
91
- className: getSize(4)
92
- }))) : /* @__PURE__ */ React.createElement(Tooltip.Root, null, /* @__PURE__ */ React.createElement(Tooltip.Trigger, {
93
- asChild: true
94
- }, /* @__PURE__ */ React.createElement(Button, {
95
- variant: "ghost",
96
- onClick: handleEdit
97
- }, /* @__PURE__ */ React.createElement(PencilSimple, {
98
- className: getSize(4)
99
- }))), /* @__PURE__ */ React.createElement(Tooltip.Portal, null, /* @__PURE__ */ React.createElement(Tooltip.Content, null, /* @__PURE__ */ React.createElement(Tooltip.Arrow, null), t("edit binding label"))))), /* @__PURE__ */ React.createElement("div", {
100
- role: "separator",
101
- className: "grow"
102
- }), error ? /* @__PURE__ */ React.createElement(Tooltip.Root, null, /* @__PURE__ */ React.createElement(Tooltip.Trigger, null, /* @__PURE__ */ React.createElement(WarningCircle, {
103
- className: getSize(4)
104
- })), /* @__PURE__ */ React.createElement(Tooltip.Portal, null, /* @__PURE__ */ React.createElement(Tooltip.Content, null, /* @__PURE__ */ React.createElement(Tooltip.Arrow, null), error))) : deployed ? /* @__PURE__ */ React.createElement(Tooltip.Root, null, /* @__PURE__ */ React.createElement(Tooltip.Trigger, null, /* @__PURE__ */ React.createElement(Checks, {
105
- className: getSize(4)
106
- })), /* @__PURE__ */ React.createElement(Tooltip.Portal, null, /* @__PURE__ */ React.createElement(Tooltip.Content, null, /* @__PURE__ */ React.createElement(Tooltip.Arrow, null), t("deployed label")))) : null, functionUrl && /* @__PURE__ */ React.createElement(Tooltip.Root, null, /* @__PURE__ */ React.createElement(Tooltip.Trigger, {
107
- asChild: true
108
- }, /* @__PURE__ */ React.createElement(NaturalToolbar.Button, {
109
- variant: "ghost",
110
- onClick: handleCopyLink
111
- }, /* @__PURE__ */ React.createElement(Link, {
112
- className: getSize(4)
113
- }))), /* @__PURE__ */ React.createElement(Tooltip.Portal, null, /* @__PURE__ */ React.createElement(Tooltip.Content, null, /* @__PURE__ */ React.createElement(Tooltip.Arrow, null), t("copy link label")))), /* @__PURE__ */ React.createElement(Tooltip.Root, null, /* @__PURE__ */ React.createElement(Tooltip.Trigger, {
114
- asChild: true
115
- }, /* @__PURE__ */ React.createElement(NaturalToolbar.Button, {
116
- variant: "ghost",
117
- onClick: handleDeploy,
118
- disabled: pending
119
- }, pending ? /* @__PURE__ */ React.createElement(CircleNotch, {
120
- className: mx("spinner", getSize(4))
121
- }) : /* @__PURE__ */ React.createElement(UploadSimple, {
122
- className: getSize(4)
123
- }))), /* @__PURE__ */ React.createElement(Tooltip.Portal, null, /* @__PURE__ */ React.createElement(Tooltip.Content, null, /* @__PURE__ */ React.createElement(Tooltip.Arrow, null), pending ? t("pending label") : t("deploy label")))))));
124
- };
125
-
126
- // packages/plugins/experimental/plugin-script/src/components/ScriptEditor.tsx
127
- var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/experimental/plugin-script/src/components/ScriptEditor.tsx";
128
- var ScriptEditor = ({ script, role }) => {
129
- const { t } = useTranslation2(SCRIPT_PLUGIN);
130
- const client = useClient();
131
- const identity = useIdentity();
132
- const space = getSpace(script);
133
- const [fn] = useQuery(space, Filter.schema(FunctionType, (fn2) => fn2.source === script));
134
- const extensions = useMemo(() => [
135
- listener({
136
- onChange: (text) => {
137
- if (script.source && script.source?.content !== text) {
138
- script.changed = true;
139
- }
140
- }
141
- }),
142
- createDataExtensions({
143
- id: script.id,
144
- text: script.source && createDocAccessor(script.source, [
145
- "content"
146
- ]),
147
- space,
148
- identity
149
- })
150
- ], [
151
- script,
152
- script.source,
153
- space,
154
- identity
155
- ]);
156
- const initialValue = useMemo(() => script.source?.content, [
157
- script.source
158
- ]);
159
- const existingFunctionUrl = fn && getUserFunctionUrlInMetadata(getMeta(fn));
160
- const [error, setError] = useState2();
161
- const handleBindingChange = useCallback((binding) => {
162
- fn.binding = binding;
163
- }, [
164
- fn
165
- ]);
166
- const handleDeploy = useCallback(async () => {
167
- if (!script.source || !identity || !space) {
168
- return;
169
- }
170
- setError(void 0);
171
- try {
172
- const existingFunctionId = existingFunctionUrl?.split("/").at(-1);
173
- const ownerDid = existingFunctionUrl?.split("/").at(-2) ?? publicKeyToDid(identity.identityKey);
174
- const { result, functionId, functionVersionNumber, errorMessage } = await uploadWorkerFunction({
175
- clientConfig: client.config,
176
- halo: client.halo,
177
- ownerDid,
178
- functionId: existingFunctionId,
179
- source: script.source.content
180
- });
181
- if (result !== "success" || functionId === void 0 || functionVersionNumber === void 0) {
182
- throw new Error(errorMessage);
183
- }
184
- log.info("function uploaded", {
185
- functionId,
186
- functionVersionNumber
187
- }, {
188
- F: __dxlog_file,
189
- L: 91,
190
- S: void 0,
191
- C: (f, a) => f(...a)
192
- });
193
- if (fn) {
194
- fn.version = functionVersionNumber;
195
- }
196
- const deployedFunction = fn ?? space.db.add(create(FunctionType, {
197
- version: functionVersionNumber,
198
- source: script
199
- }));
200
- const meta = getMeta(deployedFunction);
201
- setUserFunctionUrlInMetadata(meta, `/${ownerDid}/${functionId}`);
202
- script.changed = false;
203
- } catch (err) {
204
- log.catch(err, void 0, {
205
- F: __dxlog_file,
206
- L: 101,
207
- S: void 0,
208
- C: (f, a) => f(...a)
209
- });
210
- setError(t("upload failed label"));
211
- }
212
- }, [
213
- fn,
214
- existingFunctionUrl,
215
- script,
216
- script.name,
217
- script.source
218
- ]);
219
- return /* @__PURE__ */ React2.createElement("div", {
220
- role: "none",
221
- className: mx2(role === "article" && "row-span-2", "flex flex-col is-full bs-full overflow-hidden")
222
- }, /* @__PURE__ */ React2.createElement(Toolbar, {
223
- binding: fn?.binding ?? "",
224
- onBindingChange: handleBindingChange,
225
- deployed: Boolean(existingFunctionUrl) && !script.changed,
226
- onDeploy: handleDeploy,
227
- functionUrl: existingFunctionUrl,
228
- error
229
- }), /* @__PURE__ */ React2.createElement(TypescriptEditor, {
230
- id: script.id,
231
- initialValue,
232
- extensions,
233
- className: "flex is-full bs-full overflow-hidden"
234
- }));
235
- };
236
- var ScriptEditor_default = ScriptEditor;
237
- export {
238
- ScriptEditor,
239
- ScriptEditor_default as default
240
- };
241
- //# sourceMappingURL=ScriptEditor-MSQDR6D7.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/components/ScriptEditor.tsx", "../../../src/components/Toolbar.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type DID } from 'iso-did/types';\nimport React, { useCallback, useMemo, useState } from 'react';\n\nimport { log } from '@dxos/log';\nimport { useClient } from '@dxos/react-client';\nimport { create, createDocAccessor, Filter, getMeta, getSpace, useQuery } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { useTranslation } from '@dxos/react-ui';\nimport { createDataExtensions, listener } from '@dxos/react-ui-editor';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { Toolbar } from './Toolbar';\nimport { TypescriptEditor } from './TypescriptEditor';\nimport {\n getUserFunctionUrlInMetadata,\n publicKeyToDid,\n setUserFunctionUrlInMetadata,\n uploadWorkerFunction,\n} from '../edge';\nimport { SCRIPT_PLUGIN } from '../meta';\nimport { FunctionType, type ScriptType } from '../types';\n\nexport type ScriptEditorProps = {\n script: ScriptType;\n role?: string;\n};\n\nexport const ScriptEditor = ({ script, role }: ScriptEditorProps) => {\n const { t } = useTranslation(SCRIPT_PLUGIN);\n const client = useClient();\n const identity = useIdentity();\n const space = getSpace(script);\n const [fn] = useQuery(\n space,\n Filter.schema(FunctionType, (fn) => fn.source === script),\n );\n const extensions = useMemo(\n () => [\n listener({\n onChange: (text) => {\n if (script.source && script.source?.content !== text) {\n script.changed = true;\n }\n },\n }),\n createDataExtensions({\n id: script.id,\n text: script.source && createDocAccessor(script.source, ['content']),\n space,\n identity,\n }),\n ],\n [script, script.source, space, identity],\n );\n const initialValue = useMemo(() => script.source?.content, [script.source]);\n const existingFunctionUrl = fn && getUserFunctionUrlInMetadata(getMeta(fn));\n const [error, setError] = useState<string>();\n\n const handleBindingChange = useCallback(\n (binding: string) => {\n fn.binding = binding;\n },\n [fn],\n );\n\n const handleDeploy = useCallback(async () => {\n if (!script.source || !identity || !space) {\n return;\n }\n\n setError(undefined);\n\n try {\n const existingFunctionId = existingFunctionUrl?.split('/').at(-1);\n const ownerDid = (existingFunctionUrl?.split('/').at(-2) as DID) ?? publicKeyToDid(identity.identityKey);\n\n const { result, functionId, functionVersionNumber, errorMessage } = await uploadWorkerFunction({\n clientConfig: client.config,\n halo: client.halo,\n ownerDid,\n functionId: existingFunctionId,\n source: script.source.content,\n });\n if (result !== 'success' || functionId === undefined || functionVersionNumber === undefined) {\n throw new Error(errorMessage);\n }\n log.info('function uploaded', { functionId, functionVersionNumber });\n if (fn) {\n fn.version = functionVersionNumber;\n }\n const deployedFunction =\n fn ?? space.db.add(create(FunctionType, { version: functionVersionNumber, source: script }));\n const meta = getMeta(deployedFunction);\n setUserFunctionUrlInMetadata(meta, `/${ownerDid}/${functionId}`);\n script.changed = false;\n } catch (err: any) {\n log.catch(err);\n setError(t('upload failed label'));\n }\n }, [fn, existingFunctionUrl, script, script.name, script.source]);\n\n return (\n <div\n role='none'\n className={mx(role === 'article' && 'row-span-2', 'flex flex-col is-full bs-full overflow-hidden')}\n >\n <Toolbar\n binding={fn?.binding ?? ''}\n onBindingChange={handleBindingChange}\n deployed={Boolean(existingFunctionUrl) && !script.changed}\n onDeploy={handleDeploy}\n functionUrl={existingFunctionUrl}\n error={error}\n />\n <TypescriptEditor\n id={script.id}\n initialValue={initialValue}\n extensions={extensions}\n className='flex is-full bs-full overflow-hidden'\n />\n </div>\n );\n};\n\nexport default ScriptEditor;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Check, Checks, CircleNotch, Link, PencilSimple, UploadSimple, WarningCircle, X } from '@phosphor-icons/react';\nimport React, { useEffect, useRef, useState } from 'react';\n\nimport {\n Button,\n DensityProvider,\n ElevationProvider,\n Input,\n Toolbar as NaturalToolbar,\n Tooltip,\n useTranslation,\n} from '@dxos/react-ui';\nimport { getSize, mx } from '@dxos/react-ui-theme';\n\nimport { SCRIPT_PLUGIN } from '../meta';\n\nexport type ToolbarProps = {\n binding: string;\n onBindingChange: (binding: string) => void;\n deployed?: boolean;\n onDeploy?: () => Promise<void>;\n functionUrl?: string;\n error?: string;\n};\n\nexport const Toolbar = ({\n binding: _binding,\n onBindingChange,\n deployed,\n onDeploy,\n functionUrl,\n error,\n}: ToolbarProps) => {\n const { t } = useTranslation(SCRIPT_PLUGIN);\n const [pending, setPending] = useState(false);\n const [editing, setEditing] = useState(false);\n const [binding, setBinding] = useState(_binding);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (!editing && _binding !== binding) {\n setBinding(_binding);\n }\n }, [_binding]);\n\n const handleEdit = () => {\n setEditing(true);\n inputRef.current?.focus();\n };\n\n const handleSave = () => {\n setEditing(false);\n onBindingChange(binding);\n };\n\n const handleCancel = () => {\n setEditing(false);\n };\n\n const handleCopyLink = async () => {\n if (!functionUrl) {\n return;\n }\n\n await navigator.clipboard.writeText(functionUrl);\n };\n\n const handleDeploy = async () => {\n setPending(true);\n await onDeploy?.();\n setPending(false);\n };\n\n return (\n <DensityProvider density='fine'>\n <ElevationProvider elevation='chrome'>\n <NaturalToolbar.Root\n classNames='p-1 is-full shrink-0 overflow-x-auto overflow-y-hidden'\n style={{ contain: 'layout' }}\n >\n {/* TODO(wittjosiah): Binding input shouldn't be in the toolbar. */}\n <Input.Root>\n <Input.Label>{t('binding label')}</Input.Label>\n <Input.TextInput\n ref={inputRef}\n classNames='!is-auto'\n disabled={!editing}\n value={binding}\n onChange={(event) => setBinding(event.target.value.toUpperCase())}\n />\n {editing ? (\n <>\n <Button variant='ghost' onClick={handleCancel}>\n <X className={getSize(4)} />\n </Button>\n <Button variant='ghost' onClick={handleSave}>\n <Check className={getSize(4)} />\n </Button>\n </>\n ) : (\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n <Button variant='ghost' onClick={handleEdit}>\n <PencilSimple className={getSize(4)} />\n </Button>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content>\n <Tooltip.Arrow />\n {t('edit binding label')}\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n )}\n </Input.Root>\n <div role='separator' className='grow' />\n {/* TODO(wittjosiah): Better treatment for status indicators in toolbar? */}\n {error ? (\n <Tooltip.Root>\n <Tooltip.Trigger>\n <WarningCircle className={getSize(4)} />\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content>\n <Tooltip.Arrow />\n {error}\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n ) : deployed ? (\n <Tooltip.Root>\n <Tooltip.Trigger>\n <Checks className={getSize(4)} />\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content>\n <Tooltip.Arrow />\n {t('deployed label')}\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n ) : null}\n {functionUrl && (\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n <NaturalToolbar.Button variant='ghost' onClick={handleCopyLink}>\n <Link className={getSize(4)} />\n </NaturalToolbar.Button>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content>\n <Tooltip.Arrow />\n {t('copy link label')}\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n )}\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n <NaturalToolbar.Button variant='ghost' onClick={handleDeploy} disabled={pending}>\n {pending ? (\n <CircleNotch className={mx('spinner', getSize(4))} />\n ) : (\n <UploadSimple className={getSize(4)} />\n )}\n </NaturalToolbar.Button>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content>\n <Tooltip.Arrow />\n {pending ? t('pending label') : t('deploy label')}\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n </NaturalToolbar.Root>\n </ElevationProvider>\n </DensityProvider>\n );\n};\n"],
5
- "mappings": "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",
6
- "names": ["React", "useCallback", "useMemo", "useState", "log", "useClient", "create", "createDocAccessor", "Filter", "getMeta", "getSpace", "useQuery", "useIdentity", "useTranslation", "createDataExtensions", "listener", "mx", "Check", "Checks", "CircleNotch", "Link", "PencilSimple", "UploadSimple", "WarningCircle", "X", "React", "useEffect", "useRef", "useState", "Button", "DensityProvider", "ElevationProvider", "Input", "Toolbar", "NaturalToolbar", "Tooltip", "useTranslation", "getSize", "mx", "Toolbar", "binding", "_binding", "onBindingChange", "deployed", "onDeploy", "functionUrl", "error", "t", "useTranslation", "SCRIPT_PLUGIN", "pending", "setPending", "useState", "editing", "setEditing", "setBinding", "inputRef", "useRef", "useEffect", "handleEdit", "current", "focus", "handleSave", "handleCancel", "handleCopyLink", "navigator", "clipboard", "writeText", "handleDeploy", "DensityProvider", "density", "ElevationProvider", "elevation", "NaturalToolbar", "Root", "classNames", "style", "contain", "Input", "Label", "TextInput", "ref", "disabled", "value", "onChange", "event", "target", "toUpperCase", "Button", "variant", "onClick", "X", "className", "getSize", "Check", "Tooltip", "Trigger", "asChild", "PencilSimple", "Portal", "Content", "Arrow", "div", "role", "WarningCircle", "Checks", "Link", "CircleNotch", "mx", "UploadSimple", "ScriptEditor", "script", "role", "t", "useTranslation", "SCRIPT_PLUGIN", "client", "useClient", "identity", "useIdentity", "space", "getSpace", "fn", "useQuery", "Filter", "schema", "FunctionType", "source", "extensions", "useMemo", "listener", "onChange", "text", "content", "changed", "createDataExtensions", "id", "createDocAccessor", "initialValue", "existingFunctionUrl", "getUserFunctionUrlInMetadata", "getMeta", "error", "setError", "useState", "handleBindingChange", "useCallback", "binding", "handleDeploy", "undefined", "existingFunctionId", "split", "at", "ownerDid", "publicKeyToDid", "identityKey", "result", "functionId", "functionVersionNumber", "errorMessage", "uploadWorkerFunction", "clientConfig", "config", "halo", "Error", "log", "info", "version", "deployedFunction", "db", "add", "create", "meta", "setUserFunctionUrlInMetadata", "err", "catch", "name", "React", "div", "className", "mx", "Toolbar", "onBindingChange", "deployed", "Boolean", "onDeploy", "functionUrl", "TypescriptEditor"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/components/TypescriptEditor.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { javascript } from '@codemirror/lang-javascript';\nimport { defaultHighlightStyle, syntaxHighlighting } from '@codemirror/language';\nimport { oneDarkHighlightStyle } from '@codemirror/theme-one-dark';\nimport React from 'react';\n\nimport { useThemeContext } from '@dxos/react-ui';\nimport {\n autocomplete,\n createBasicExtensions,\n createThemeExtensions,\n editorContent,\n editorGutter,\n editorMonospace,\n useTextEditor,\n type UseTextEditorProps,\n} from '@dxos/react-ui-editor';\nimport { nonNullable } from '@dxos/util';\n\nexport type TypescriptEditorProps = {\n id: string;\n className?: string;\n scrollPastEnd?: boolean;\n} & Pick<UseTextEditorProps, 'initialValue' | 'extensions' | 'scrollTo' | 'selection'>;\n\nexport const TypescriptEditor = ({\n id,\n extensions,\n initialValue,\n scrollTo,\n selection,\n className,\n scrollPastEnd,\n}: TypescriptEditorProps) => {\n const { themeMode } = useThemeContext();\n const { parentRef, focusAttributes } = useTextEditor(\n () => ({\n id,\n initialValue,\n extensions: [\n extensions,\n // TODO(wittjosiah): Highlight active line doesn't work.\n createBasicExtensions({ highlightActiveLine: true, indentWithTab: true, lineNumbers: true, scrollPastEnd }),\n // TODO(wittjosiah): Factor out syntax highlighting to theme extensions.\n themeMode === 'dark' ? syntaxHighlighting(oneDarkHighlightStyle) : syntaxHighlighting(defaultHighlightStyle),\n createThemeExtensions({\n themeMode,\n slots: {\n content: { className: editorContent },\n },\n }),\n editorGutter,\n editorMonospace,\n javascript({ typescript: true }),\n autocomplete(),\n ].filter(nonNullable),\n selection,\n scrollTo,\n }),\n [id, initialValue, extensions, themeMode, selection, scrollTo],\n );\n\n return <div ref={parentRef} className={className} {...focusAttributes} />;\n};\n\nexport default TypescriptEditor;\n"],
5
- "mappings": ";AAIA,SAASA,kBAAkB;AAC3B,SAASC,uBAAuBC,0BAA0B;AAC1D,SAASC,6BAA6B;AACtC,OAAOC,WAAW;AAElB,SAASC,uBAAuB;AAChC,SACEC,cACAC,uBACAC,uBACAC,eACAC,cACAC,iBACAC,qBAEK;AACP,SAASC,mBAAmB;AAQrB,IAAMC,mBAAmB,CAAC,EAC/BC,IACAC,YACAC,cACAC,UACAC,WACAC,WACAC,cAAa,MACS;AACtB,QAAM,EAAEC,UAAS,IAAKC,gBAAAA;AACtB,QAAM,EAAEC,WAAWC,gBAAe,IAAKC,cACrC,OAAO;IACLX;IACAE;IACAD,YAAY;MACVA;;MAEAW,sBAAsB;QAAEC,qBAAqB;QAAMC,eAAe;QAAMC,aAAa;QAAMT;MAAc,CAAA;;MAEzGC,cAAc,SAASS,mBAAmBC,qBAAAA,IAAyBD,mBAAmBE,qBAAAA;MACtFC,sBAAsB;QACpBZ;QACAa,OAAO;UACLC,SAAS;YAAEhB,WAAWiB;UAAc;QACtC;MACF,CAAA;MACAC;MACAC;MACAC,WAAW;QAAEC,YAAY;MAAK,CAAA;MAC9BC,aAAAA;MACAC,OAAOC,WAAAA;IACTzB;IACAD;EACF,IACA;IAACH;IAAIE;IAAcD;IAAYM;IAAWH;IAAWD;GAAS;AAGhE,SAAO,sBAAA,cAAC2B,OAAAA;IAAIC,KAAKtB;IAAWJ;IAAuB,GAAGK;;AACxD;AAEA,IAAA,2BAAeX;",
6
- "names": ["javascript", "defaultHighlightStyle", "syntaxHighlighting", "oneDarkHighlightStyle", "React", "useThemeContext", "autocomplete", "createBasicExtensions", "createThemeExtensions", "editorContent", "editorGutter", "editorMonospace", "useTextEditor", "nonNullable", "TypescriptEditor", "id", "extensions", "initialValue", "scrollTo", "selection", "className", "scrollPastEnd", "themeMode", "useThemeContext", "parentRef", "focusAttributes", "useTextEditor", "createBasicExtensions", "highlightActiveLine", "indentWithTab", "lineNumbers", "syntaxHighlighting", "oneDarkHighlightStyle", "defaultHighlightStyle", "createThemeExtensions", "slots", "content", "editorContent", "editorGutter", "editorMonospace", "javascript", "typescript", "autocomplete", "filter", "nonNullable", "div", "ref"]
7
- }