@dxos/plugin-script 0.6.8-main.3be982f → 0.6.8-staging.63bcb81

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 (56) hide show
  1. package/dist/lib/browser/{ScriptEditor-6Q7HFLJ6.mjs → ScriptEditor-7XICKICQ.mjs} +42 -21
  2. package/dist/lib/browser/ScriptEditor-7XICKICQ.mjs.map +7 -0
  3. package/dist/lib/browser/{TypescriptEditor-HP35MTEQ.mjs → TypescriptEditor-PIRIDDUS.mjs} +2 -2
  4. package/dist/lib/browser/{chunk-2EM5Y66A.mjs → chunk-D4O723CR.mjs} +4 -2
  5. package/dist/lib/browser/chunk-D4O723CR.mjs.map +7 -0
  6. package/dist/lib/browser/{chunk-EZ7PWOLU.mjs → chunk-SK3L274X.mjs} +6 -6
  7. package/dist/lib/browser/{chunk-EZ7PWOLU.mjs.map → chunk-SK3L274X.mjs.map} +2 -2
  8. package/dist/lib/browser/{chunk-Z72YKDJ2.mjs → chunk-ZGCETT2W.mjs} +13 -3
  9. package/dist/lib/browser/chunk-ZGCETT2W.mjs.map +7 -0
  10. package/dist/lib/browser/edge/index.mjs +1 -1
  11. package/dist/lib/browser/index.mjs +7 -4
  12. package/dist/lib/browser/index.mjs.map +3 -3
  13. package/dist/lib/browser/meta.json +1 -1
  14. package/dist/lib/browser/types/index.mjs +3 -1
  15. package/dist/lib/node/{ScriptEditor-AIVKL2NX.cjs → ScriptEditor-M7KZ2CRS.cjs} +45 -26
  16. package/dist/lib/node/ScriptEditor-M7KZ2CRS.cjs.map +7 -0
  17. package/dist/lib/node/{TypescriptEditor-PWOAN5RQ.cjs → TypescriptEditor-OTWJUIWB.cjs} +7 -7
  18. package/dist/lib/node/{TypescriptEditor-PWOAN5RQ.cjs.map → TypescriptEditor-OTWJUIWB.cjs.map} +2 -2
  19. package/dist/lib/node/{chunk-SLV3SDZE.cjs → chunk-ITLHJMWP.cjs} +6 -4
  20. package/dist/lib/node/chunk-ITLHJMWP.cjs.map +7 -0
  21. package/dist/lib/node/{chunk-6Y2S6SGK.cjs → chunk-VW2POILW.cjs} +17 -6
  22. package/dist/lib/node/chunk-VW2POILW.cjs.map +7 -0
  23. package/dist/lib/node/{chunk-LWUBFTPA.cjs → chunk-X6A3D4PD.cjs} +9 -9
  24. package/dist/lib/node/{chunk-LWUBFTPA.cjs.map → chunk-X6A3D4PD.cjs.map} +2 -2
  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 +16 -13
  28. package/dist/lib/node/index.cjs.map +3 -3
  29. package/dist/lib/node/meta.json +1 -1
  30. package/dist/lib/node/types/index.cjs +5 -3
  31. package/dist/lib/node/types/index.cjs.map +2 -2
  32. package/dist/types/src/components/ScriptEditor.d.ts.map +1 -1
  33. package/dist/types/src/components/Toolbar.d.ts +1 -1
  34. package/dist/types/src/components/Toolbar.d.ts.map +1 -1
  35. package/dist/types/src/components/Toolbar.stories.d.ts +1 -1
  36. package/dist/types/src/components/TypescriptEditor.d.ts.map +1 -1
  37. package/dist/types/src/edge/functions.d.ts.map +1 -1
  38. package/dist/types/src/types/script.d.ts +33 -2
  39. package/dist/types/src/types/script.d.ts.map +1 -1
  40. package/dist/types/src/types/types.d.ts +1 -1
  41. package/dist/types/src/types/types.d.ts.map +1 -1
  42. package/package.json +33 -33
  43. package/src/ScriptPlugin.tsx +2 -2
  44. package/src/components/ScriptEditor.tsx +29 -13
  45. package/src/components/Toolbar.tsx +24 -4
  46. package/src/components/TypescriptEditor.tsx +4 -1
  47. package/src/edge/functions.ts +1 -2
  48. package/src/types/script.ts +7 -2
  49. package/src/types/types.tsx +1 -1
  50. package/dist/lib/browser/ScriptEditor-6Q7HFLJ6.mjs.map +0 -7
  51. package/dist/lib/browser/chunk-2EM5Y66A.mjs.map +0 -7
  52. package/dist/lib/browser/chunk-Z72YKDJ2.mjs.map +0 -7
  53. package/dist/lib/node/ScriptEditor-AIVKL2NX.cjs.map +0 -7
  54. package/dist/lib/node/chunk-6Y2S6SGK.cjs.map +0 -7
  55. package/dist/lib/node/chunk-SLV3SDZE.cjs.map +0 -7
  56. /package/dist/lib/browser/{TypescriptEditor-HP35MTEQ.mjs.map → TypescriptEditor-PIRIDDUS.mjs.map} +0 -0
@@ -6,7 +6,6 @@ declare const ScriptType_base: import("@dxos/echo-schema").AbstractTypedObject<{
6
6
  id: string;
7
7
  }>;
8
8
  name?: string | undefined;
9
- binding?: string | undefined;
10
9
  changed?: boolean | undefined;
11
10
  } & {
12
11
  id: string;
@@ -17,10 +16,42 @@ declare const ScriptType_base: import("@dxos/echo-schema").AbstractTypedObject<{
17
16
  } & {
18
17
  id: string;
19
18
  }>;
20
- binding: S.optional<typeof S.String>;
21
19
  changed: S.optional<typeof S.Boolean>;
22
20
  }>>;
23
21
  export declare class ScriptType extends ScriptType_base {
24
22
  }
23
+ declare const FunctionType_base: import("@dxos/echo-schema").AbstractTypedObject<{
24
+ source?: import("@dxos/echo-schema").Ref<{
25
+ source: import("@dxos/echo-schema").Ref<{
26
+ content: string;
27
+ } & {
28
+ id: string;
29
+ }>;
30
+ name?: string | undefined;
31
+ changed?: boolean | undefined;
32
+ } & {
33
+ id: string;
34
+ }>;
35
+ version: number;
36
+ binding?: string | undefined;
37
+ } & {
38
+ id: string;
39
+ }, S.Struct.Encoded<{
40
+ version: typeof S.Number;
41
+ binding: S.optional<typeof S.String>;
42
+ source: S.optional<ref<{
43
+ source: import("@dxos/echo-schema").Ref<{
44
+ content: string;
45
+ } & {
46
+ id: string;
47
+ }>;
48
+ name?: string | undefined;
49
+ changed?: boolean | undefined;
50
+ } & {
51
+ id: string;
52
+ }>>;
53
+ }>>;
54
+ export declare class FunctionType extends FunctionType_base {
55
+ }
25
56
  export {};
26
57
  //# sourceMappingURL=script.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"script.d.ts","sourceRoot":"","sources":["../../../../src/types/script.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,GAAG,EAAE,CAAC,EAAe,MAAM,mBAAmB,CAAC;;;;;;;;;;;;;;;;;;;;;;AAGxD,qBAAa,UAAW,SAAQ,eAQ9B;CAAG"}
1
+ {"version":3,"file":"script.d.ts","sourceRoot":"","sources":["../../../../src/types/script.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,GAAG,EAAE,CAAC,EAAe,MAAM,mBAAmB,CAAC;;;;;;;;;;;;;;;;;;;;AAGxD,qBAAa,UAAW,SAAQ,eAK9B;CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEL,qBAAa,YAAa,SAAQ,iBAMhC;CAAG"}
@@ -1,6 +1,6 @@
1
1
  import type { GraphBuilderProvides, IntentResolverProvides, MetadataRecordsProvides, SurfaceProvides, TranslationsProvides } from '@dxos/app-framework';
2
2
  import { type SchemaProvides } from '@dxos/plugin-client';
3
- import type { StackProvides } from '@dxos/plugin-stack';
3
+ import { type StackProvides } from '@dxos/plugin-stack';
4
4
  export declare enum ScriptAction {
5
5
  CREATE = "dxos.org/plugin/script/create"
6
6
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/types/types.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,EACvB,eAAe,EACf,oBAAoB,EACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAIxD,oBAAY,YAAY;IACtB,MAAM,kCAA4B;CACnC;AAED,MAAM,MAAM,oBAAoB,GAAG,eAAe,GAChD,sBAAsB,GACtB,oBAAoB,GACpB,uBAAuB,GACvB,oBAAoB,GACpB,cAAc,GACd,aAAa,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/types/types.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,EACvB,eAAe,EACf,oBAAoB,EACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAIxD,oBAAY,YAAY;IACtB,MAAM,kCAA4B;CACnC;AAED,MAAM,MAAM,oBAAoB,GAAG,eAAe,GAChD,sBAAsB,GACtB,oBAAoB,GACpB,uBAAuB,GACvB,oBAAoB,GACpB,cAAc,GACd,aAAa,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/plugin-script",
3
- "version": "0.6.8-main.3be982f",
3
+ "version": "0.6.8-staging.63bcb81",
4
4
  "description": "Braneframe notebook plugin",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -67,29 +67,29 @@
67
67
  "esbuild-wasm": "^0.16.14",
68
68
  "iso-did": "^1.6.0",
69
69
  "lodash.get": "^4.4.2",
70
- "@dxos/app-framework": "0.6.8-main.3be982f",
71
- "@dxos/async": "0.6.8-main.3be982f",
72
- "@dxos/client-protocol": "0.6.8-main.3be982f",
73
- "@dxos/client": "0.6.8-main.3be982f",
74
- "@dxos/echo-schema": "0.6.8-main.3be982f",
75
- "@dxos/debug": "0.6.8-main.3be982f",
76
- "@dxos/crypto": "0.6.8-main.3be982f",
77
- "@dxos/invariant": "0.6.8-main.3be982f",
78
- "@dxos/keys": "0.6.8-main.3be982f",
79
- "@dxos/plugin-client": "0.6.8-main.3be982f",
80
- "@dxos/log": "0.6.8-main.3be982f",
81
- "@dxos/plugin-explorer": "0.6.8-main.3be982f",
82
- "@dxos/plugin-graph": "0.6.8-main.3be982f",
83
- "@dxos/plugin-space": "0.6.8-main.3be982f",
84
- "@dxos/plugin-markdown": "0.6.8-main.3be982f",
85
- "@dxos/plugin-theme": "0.6.8-main.3be982f",
86
- "@dxos/plugin-stack": "0.6.8-main.3be982f",
87
- "@dxos/protocols": "0.6.8-main.3be982f",
88
- "@dxos/react-ui-editor": "0.6.8-main.3be982f",
89
- "@dxos/rpc": "0.6.8-main.3be982f",
90
- "@dxos/react-client": "0.6.8-main.3be982f",
91
- "@dxos/rpc-tunnel": "0.6.8-main.3be982f",
92
- "@dxos/util": "0.6.8-main.3be982f"
70
+ "@dxos/app-framework": "0.6.8-staging.63bcb81",
71
+ "@dxos/client": "0.6.8-staging.63bcb81",
72
+ "@dxos/client-protocol": "0.6.8-staging.63bcb81",
73
+ "@dxos/async": "0.6.8-staging.63bcb81",
74
+ "@dxos/crypto": "0.6.8-staging.63bcb81",
75
+ "@dxos/debug": "0.6.8-staging.63bcb81",
76
+ "@dxos/echo-schema": "0.6.8-staging.63bcb81",
77
+ "@dxos/invariant": "0.6.8-staging.63bcb81",
78
+ "@dxos/keys": "0.6.8-staging.63bcb81",
79
+ "@dxos/log": "0.6.8-staging.63bcb81",
80
+ "@dxos/plugin-client": "0.6.8-staging.63bcb81",
81
+ "@dxos/plugin-explorer": "0.6.8-staging.63bcb81",
82
+ "@dxos/plugin-graph": "0.6.8-staging.63bcb81",
83
+ "@dxos/plugin-markdown": "0.6.8-staging.63bcb81",
84
+ "@dxos/plugin-space": "0.6.8-staging.63bcb81",
85
+ "@dxos/plugin-theme": "0.6.8-staging.63bcb81",
86
+ "@dxos/protocols": "0.6.8-staging.63bcb81",
87
+ "@dxos/plugin-stack": "0.6.8-staging.63bcb81",
88
+ "@dxos/react-ui-editor": "0.6.8-staging.63bcb81",
89
+ "@dxos/rpc": "0.6.8-staging.63bcb81",
90
+ "@dxos/rpc-tunnel": "0.6.8-staging.63bcb81",
91
+ "@dxos/react-client": "0.6.8-staging.63bcb81",
92
+ "@dxos/util": "0.6.8-staging.63bcb81"
93
93
  },
94
94
  "devDependencies": {
95
95
  "@phosphor-icons/react": "^2.1.5",
@@ -99,20 +99,20 @@
99
99
  "react": "~18.2.0",
100
100
  "react-dom": "~18.2.0",
101
101
  "vite": "^5.3.4",
102
- "@dxos/echo-generator": "0.6.8-main.3be982f",
103
- "@dxos/random": "0.6.8-main.3be982f",
104
- "@dxos/react-ui": "0.6.8-main.3be982f",
105
- "@dxos/react-ui-mosaic": "0.6.8-main.3be982f",
106
- "@dxos/storybook-utils": "0.6.8-main.3be982f",
107
- "@dxos/react-ui-theme": "0.6.8-main.3be982f"
102
+ "@dxos/echo-generator": "0.6.8-staging.63bcb81",
103
+ "@dxos/random": "0.6.8-staging.63bcb81",
104
+ "@dxos/react-ui": "0.6.8-staging.63bcb81",
105
+ "@dxos/react-ui-theme": "0.6.8-staging.63bcb81",
106
+ "@dxos/react-ui-mosaic": "0.6.8-staging.63bcb81",
107
+ "@dxos/storybook-utils": "0.6.8-staging.63bcb81"
108
108
  },
109
109
  "optionalDependencies": {
110
110
  "@phosphor-icons/react": "^2.1.5",
111
111
  "react": "^18.0.0",
112
112
  "react-dom": "^18.0.0",
113
- "@dxos/react-ui-mosaic": "0.6.8-main.3be982f",
114
- "@dxos/react-ui": "0.6.8-main.3be982f",
115
- "@dxos/react-ui-theme": "0.6.8-main.3be982f"
113
+ "@dxos/react-ui-mosaic": "0.6.8-staging.63bcb81",
114
+ "@dxos/react-ui-theme": "0.6.8-staging.63bcb81",
115
+ "@dxos/react-ui": "0.6.8-staging.63bcb81"
116
116
  },
117
117
  "publishConfig": {
118
118
  "access": "public"
@@ -16,7 +16,7 @@ import { loadObjectReferences } from '@dxos/react-client/echo';
16
16
  import { ScriptEditor } from './components';
17
17
  import meta, { SCRIPT_PLUGIN } from './meta';
18
18
  import translations from './translations';
19
- import { ScriptType } from './types';
19
+ import { FunctionType, ScriptType } from './types';
20
20
  import { ScriptAction, type ScriptPluginProvides } from './types';
21
21
 
22
22
  export type ScriptPluginProps = {
@@ -40,7 +40,7 @@ export const ScriptPlugin = ({ containerUrl }: ScriptPluginProps): PluginDefinit
40
40
  },
41
41
  translations,
42
42
  echo: {
43
- schema: [ScriptType],
43
+ schema: [ScriptType, FunctionType],
44
44
  },
45
45
  graph: {
46
46
  builder: (plugins) => {
@@ -7,7 +7,7 @@ import React, { useCallback, useMemo, useState } from 'react';
7
7
 
8
8
  import { log } from '@dxos/log';
9
9
  import { useClient } from '@dxos/react-client';
10
- import { createDocAccessor, getMeta, getSpace } from '@dxos/react-client/echo';
10
+ import { create, createDocAccessor, Filter, getMeta, getSpace, useQuery } from '@dxos/react-client/echo';
11
11
  import { useIdentity } from '@dxos/react-client/halo';
12
12
  import { useTranslation } from '@dxos/react-ui';
13
13
  import { createDataExtensions, listener } from '@dxos/react-ui-editor';
@@ -22,7 +22,7 @@ import {
22
22
  uploadWorkerFunction,
23
23
  } from '../edge';
24
24
  import { SCRIPT_PLUGIN } from '../meta';
25
- import { type ScriptType } from '../types';
25
+ import { FunctionType, type ScriptType } from '../types';
26
26
 
27
27
  export type ScriptEditorProps = {
28
28
  script: ScriptType;
@@ -34,6 +34,10 @@ export const ScriptEditor = ({ script, role }: ScriptEditorProps) => {
34
34
  const client = useClient();
35
35
  const identity = useIdentity();
36
36
  const space = getSpace(script);
37
+ const [fn] = useQuery(
38
+ space,
39
+ Filter.schema(FunctionType, (fn) => fn.source === script),
40
+ );
37
41
  const extensions = useMemo(
38
42
  () => [
39
43
  listener({
@@ -53,18 +57,18 @@ export const ScriptEditor = ({ script, role }: ScriptEditorProps) => {
53
57
  [script, script.source, space, identity],
54
58
  );
55
59
  const initialValue = useMemo(() => script.source?.content, [script.source]);
56
- const existingFunctionUrl = getUserFunctionUrlInMetadata(getMeta(script));
60
+ const existingFunctionUrl = fn && getUserFunctionUrlInMetadata(getMeta(fn));
57
61
  const [error, setError] = useState<string>();
58
62
 
59
63
  const handleBindingChange = useCallback(
60
64
  (binding: string) => {
61
- script.binding = binding;
65
+ fn.binding = binding;
62
66
  },
63
- [script],
67
+ [fn],
64
68
  );
65
69
 
66
70
  const handleDeploy = useCallback(async () => {
67
- if (!script.source || !identity) {
71
+ if (!script.source || !identity || !space) {
68
72
  return;
69
73
  }
70
74
 
@@ -79,33 +83,45 @@ export const ScriptEditor = ({ script, role }: ScriptEditorProps) => {
79
83
  halo: client.halo,
80
84
  ownerDid,
81
85
  functionId: existingFunctionId,
82
- name: script.name,
83
86
  source: script.source.content,
84
87
  });
85
- if (result !== 'success' || functionId === undefined) {
88
+ if (result !== 'success' || functionId === undefined || functionVersionNumber === undefined) {
86
89
  throw new Error(errorMessage);
87
90
  }
88
91
  log.info('function uploaded', { functionId, functionVersionNumber });
89
- const meta = getMeta(script);
92
+ if (fn) {
93
+ fn.version = functionVersionNumber;
94
+ }
95
+ const deployedFunction =
96
+ fn ?? space.db.add(create(FunctionType, { version: functionVersionNumber, source: script }));
97
+ const meta = getMeta(deployedFunction);
90
98
  setUserFunctionUrlInMetadata(meta, `/${ownerDid}/${functionId}`);
91
99
  script.changed = false;
92
100
  } catch (err: any) {
93
101
  log.catch(err);
94
102
  setError(t('upload failed label'));
95
103
  }
96
- }, [existingFunctionUrl, script, script.name, script.source]);
104
+ }, [fn, existingFunctionUrl, script, script.name, script.source]);
97
105
 
98
106
  return (
99
- <div role='none' className={mx(role === 'article' && 'row-span-2', 'is-full pli-2')}>
107
+ <div
108
+ role='none'
109
+ className={mx(role === 'article' && 'row-span-2', 'flex flex-col is-full bs-full overflow-hidden')}
110
+ >
100
111
  <Toolbar
101
- binding={script.binding ?? ''}
112
+ binding={fn?.binding ?? ''}
102
113
  onBindingChange={handleBindingChange}
103
114
  deployed={Boolean(existingFunctionUrl) && !script.changed}
104
115
  onDeploy={handleDeploy}
105
116
  functionUrl={existingFunctionUrl}
106
117
  error={error}
107
118
  />
108
- <TypescriptEditor id={script.id} initialValue={initialValue} extensions={extensions} />
119
+ <TypescriptEditor
120
+ id={script.id}
121
+ initialValue={initialValue}
122
+ extensions={extensions}
123
+ className='flex is-full bs-full overflow-hidden'
124
+ />
109
125
  </div>
110
126
  );
111
127
  };
@@ -3,7 +3,7 @@
3
3
  //
4
4
 
5
5
  import { Check, Checks, CircleNotch, Link, PencilSimple, UploadSimple, WarningCircle, X } from '@phosphor-icons/react';
6
- import React, { useRef, useState } from 'react';
6
+ import React, { useEffect, useRef, useState } from 'react';
7
7
 
8
8
  import {
9
9
  Button,
@@ -27,12 +27,26 @@ export type ToolbarProps = {
27
27
  error?: string;
28
28
  };
29
29
 
30
- export const Toolbar = ({ binding, onBindingChange, deployed, onDeploy, functionUrl, error }: ToolbarProps) => {
30
+ export const Toolbar = ({
31
+ binding: _binding,
32
+ onBindingChange,
33
+ deployed,
34
+ onDeploy,
35
+ functionUrl,
36
+ error,
37
+ }: ToolbarProps) => {
31
38
  const { t } = useTranslation(SCRIPT_PLUGIN);
32
39
  const [pending, setPending] = useState(false);
33
40
  const [editing, setEditing] = useState(false);
41
+ const [binding, setBinding] = useState(_binding);
34
42
  const inputRef = useRef<HTMLInputElement>(null);
35
43
 
44
+ useEffect(() => {
45
+ if (!editing && _binding !== binding) {
46
+ setBinding(_binding);
47
+ }
48
+ }, [_binding]);
49
+
36
50
  const handleEdit = () => {
37
51
  setEditing(true);
38
52
  inputRef.current?.focus();
@@ -40,7 +54,7 @@ export const Toolbar = ({ binding, onBindingChange, deployed, onDeploy, function
40
54
 
41
55
  const handleSave = () => {
42
56
  setEditing(false);
43
- onBindingChange(inputRef.current?.value || '');
57
+ onBindingChange(binding);
44
58
  };
45
59
 
46
60
  const handleCancel = () => {
@@ -71,7 +85,13 @@ export const Toolbar = ({ binding, onBindingChange, deployed, onDeploy, function
71
85
  {/* TODO(wittjosiah): Binding input shouldn't be in the toolbar. */}
72
86
  <Input.Root>
73
87
  <Input.Label>{t('binding label')}</Input.Label>
74
- <Input.TextInput ref={inputRef} defaultValue={binding} disabled={!editing} classNames='!is-auto' />
88
+ <Input.TextInput
89
+ ref={inputRef}
90
+ classNames='!is-auto'
91
+ disabled={!editing}
92
+ value={binding}
93
+ onChange={(event) => setBinding(event.target.value.toUpperCase())}
94
+ />
75
95
  {editing ? (
76
96
  <>
77
97
  <Button variant='ghost' onClick={handleCancel}>
@@ -13,6 +13,8 @@ import {
13
13
  createBasicExtensions,
14
14
  createThemeExtensions,
15
15
  editorContent,
16
+ editorGutter,
17
+ editorMonospace,
16
18
  useTextEditor,
17
19
  type UseTextEditorProps,
18
20
  } from '@dxos/react-ui-editor';
@@ -34,7 +36,6 @@ export const TypescriptEditor = ({
34
36
  scrollPastEnd,
35
37
  }: TypescriptEditorProps) => {
36
38
  const { themeMode } = useThemeContext();
37
-
38
39
  const { parentRef, focusAttributes } = useTextEditor(
39
40
  () => ({
40
41
  id,
@@ -51,6 +52,8 @@ export const TypescriptEditor = ({
51
52
  content: { className: editorContent },
52
53
  },
53
54
  }),
55
+ editorGutter,
56
+ editorMonospace,
54
57
  javascript({ typescript: true }),
55
58
  autocomplete(),
56
59
  ].filter(nonNullable),
@@ -37,8 +37,7 @@ export type UploadWorkerProps = {
37
37
  credentialLoadTimeout?: number; // ms to wait for credentials to load
38
38
  };
39
39
 
40
- const defaultUserFunctionsBaseUrl = 'http://localhost:8600';
41
- // const userFunctionsBaseUrl = 'https://functions-nftest.dxos.workers.dev';
40
+ const defaultUserFunctionsBaseUrl = 'https://functions-staging.dxos.workers.dev'; // 'http://localhost:8600';
42
41
 
43
42
  const getBaseUrl = (config: Config) => {
44
43
  return config.get('runtime.app.env.DX_USERFUNCTIONS_BASE_URL') || defaultUserFunctionsBaseUrl;
@@ -8,9 +8,14 @@ import { TextType } from '@dxos/plugin-markdown/types';
8
8
  export class ScriptType extends TypedObject({ typename: 'dxos.org/type/Script', version: '0.1.0' })({
9
9
  name: S.optional(S.String),
10
10
  source: ref(TextType),
11
+ // Whether source has changed since last deploy.
12
+ changed: S.optional(S.Boolean),
13
+ }) {}
11
14
 
15
+ export class FunctionType extends TypedObject({ typename: 'dxos.org/type/Function', version: '0.1.0' })({
16
+ version: S.Number,
12
17
  // Local binding to a function name.
13
18
  binding: S.optional(S.String),
14
- // Whether source has changed since last deploy.
15
- changed: S.optional(S.Boolean),
19
+ // Reference to a source script if it exists within ECHO.
20
+ source: S.optional(ref(ScriptType)),
16
21
  }) {}
@@ -10,7 +10,7 @@ import type {
10
10
  TranslationsProvides,
11
11
  } from '@dxos/app-framework';
12
12
  import { type SchemaProvides } from '@dxos/plugin-client';
13
- import type { StackProvides } from '@dxos/plugin-stack';
13
+ import { type StackProvides } from '@dxos/plugin-stack';
14
14
 
15
15
  import { SCRIPT_PLUGIN } from '../meta';
16
16
 
@@ -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 { createDocAccessor, getMeta, getSpace } 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 { 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 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 = getUserFunctionUrlInMetadata(getMeta(script));\n const [error, setError] = useState<string>();\n\n const handleBindingChange = useCallback(\n (binding: string) => {\n script.binding = binding;\n },\n [script],\n );\n\n const handleDeploy = useCallback(async () => {\n if (!script.source || !identity) {\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 name: script.name,\n source: script.source.content,\n });\n if (result !== 'success' || functionId === undefined) {\n throw new Error(errorMessage);\n }\n log.info('function uploaded', { functionId, functionVersionNumber });\n const meta = getMeta(script);\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 }, [existingFunctionUrl, script, script.name, script.source]);\n\n return (\n <div role='none' className={mx(role === 'article' && 'row-span-2', 'is-full pli-2')}>\n <Toolbar\n binding={script.binding ?? ''}\n onBindingChange={handleBindingChange}\n deployed={Boolean(existingFunctionUrl) && !script.changed}\n onDeploy={handleDeploy}\n functionUrl={existingFunctionUrl}\n error={error}\n />\n <TypescriptEditor id={script.id} initialValue={initialValue} extensions={extensions} />\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, { 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 = ({ binding, onBindingChange, deployed, onDeploy, functionUrl, error }: ToolbarProps) => {\n const { t } = useTranslation(SCRIPT_PLUGIN);\n const [pending, setPending] = useState(false);\n const [editing, setEditing] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const handleEdit = () => {\n setEditing(true);\n inputRef.current?.focus();\n };\n\n const handleSave = () => {\n setEditing(false);\n onBindingChange(inputRef.current?.value || '');\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 ref={inputRef} defaultValue={binding} disabled={!editing} classNames='!is-auto' />\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", "createDocAccessor", "getMeta", "getSpace", "useIdentity", "useTranslation", "createDataExtensions", "listener", "mx", "Check", "Checks", "CircleNotch", "Link", "PencilSimple", "UploadSimple", "WarningCircle", "X", "React", "useRef", "useState", "Button", "DensityProvider", "ElevationProvider", "Input", "Toolbar", "NaturalToolbar", "Tooltip", "useTranslation", "getSize", "mx", "Toolbar", "binding", "onBindingChange", "deployed", "onDeploy", "functionUrl", "error", "t", "useTranslation", "SCRIPT_PLUGIN", "pending", "setPending", "useState", "editing", "setEditing", "inputRef", "useRef", "handleEdit", "current", "focus", "handleSave", "value", "handleCancel", "handleCopyLink", "navigator", "clipboard", "writeText", "handleDeploy", "DensityProvider", "density", "ElevationProvider", "elevation", "NaturalToolbar", "Root", "classNames", "style", "contain", "Input", "Label", "TextInput", "ref", "defaultValue", "disabled", "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", "extensions", "useMemo", "listener", "onChange", "text", "source", "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", "name", "Error", "log", "info", "meta", "setUserFunctionUrlInMetadata", "err", "catch", "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 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\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 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,qBAEK;AACP,SAASC,mBAAmB;AAQrB,IAAMC,mBAAmB,CAAC,EAC/BC,IACAC,YACAC,cACAC,UACAC,WACAC,WACAC,cAAa,MACS;AACtB,QAAM,EAAEC,UAAS,IAAKC,gBAAAA;AAEtB,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,WAAW;QAAEC,YAAY;MAAK,CAAA;MAC9BC,aAAAA;MACAC,OAAOC,WAAAA;IACTvB;IACAD;EACF,IACA;IAACH;IAAIE;IAAcD;IAAYM;IAAWH;IAAWD;GAAS;AAGhE,SAAO,sBAAA,cAACyB,OAAAA;IAAIC,KAAKpB;IAAWJ;IAAuB,GAAGK;;AACxD;AAEA,IAAA,2BAAeX;",
6
- "names": ["javascript", "defaultHighlightStyle", "syntaxHighlighting", "oneDarkHighlightStyle", "React", "useThemeContext", "autocomplete", "createBasicExtensions", "createThemeExtensions", "editorContent", "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", "javascript", "typescript", "autocomplete", "filter", "nonNullable", "div", "ref"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/types/script.ts", "../../../src/types/types.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { ref, S, TypedObject } from '@dxos/echo-schema';\nimport { TextType } from '@dxos/plugin-markdown/types';\n\nexport class ScriptType extends TypedObject({ typename: 'dxos.org/type/Script', version: '0.1.0' })({\n name: S.optional(S.String),\n source: ref(TextType),\n\n // Local binding to a function name.\n binding: S.optional(S.String),\n // Whether source has changed since last deploy.\n changed: S.optional(S.Boolean),\n}) {}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport type {\n GraphBuilderProvides,\n IntentResolverProvides,\n MetadataRecordsProvides,\n SurfaceProvides,\n TranslationsProvides,\n} from '@dxos/app-framework';\nimport { type SchemaProvides } from '@dxos/plugin-client';\nimport type { StackProvides } from '@dxos/plugin-stack';\n\nimport { SCRIPT_PLUGIN } from '../meta';\n\nexport enum ScriptAction {\n CREATE = `${SCRIPT_PLUGIN}/create`,\n}\n\nexport type ScriptPluginProvides = SurfaceProvides &\n IntentResolverProvides &\n GraphBuilderProvides &\n MetadataRecordsProvides &\n TranslationsProvides &\n SchemaProvides &\n StackProvides;\n"],
5
- "mappings": ";;;;;AAIA,SAASA,KAAKC,GAAGC,mBAAmB;AACpC,SAASC,gBAAgB;AAElB,IAAMC,aAAN,cAAyBC,YAAY;EAAEC,UAAU;EAAwBC,SAAS;AAAQ,CAAA,EAAG;EAClGC,MAAMC,EAAEC,SAASD,EAAEE,MAAM;EACzBC,QAAQC,IAAIC,QAAAA;;EAGZC,SAASN,EAAEC,SAASD,EAAEE,MAAM;;EAE5BK,SAASP,EAAEC,SAASD,EAAEQ,OAAO;AAC/B,CAAA,EAAA;AAAI;;;;UCCQC,eAAAA;0CACD,GAAGC,aAAAA,SAAsB,IAAA;GADxBD,iBAAAA,eAAAA,CAAAA,EAAAA;",
6
- "names": ["ref", "S", "TypedObject", "TextType", "ScriptType", "TypedObject", "typename", "version", "name", "S", "optional", "String", "source", "ref", "TextType", "binding", "changed", "Boolean", "ScriptAction", "SCRIPT_PLUGIN"]
7
- }
@@ -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 { createDocAccessor, getMeta, getSpace } 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 { 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 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 = getUserFunctionUrlInMetadata(getMeta(script));\n const [error, setError] = useState<string>();\n\n const handleBindingChange = useCallback(\n (binding: string) => {\n script.binding = binding;\n },\n [script],\n );\n\n const handleDeploy = useCallback(async () => {\n if (!script.source || !identity) {\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 name: script.name,\n source: script.source.content,\n });\n if (result !== 'success' || functionId === undefined) {\n throw new Error(errorMessage);\n }\n log.info('function uploaded', { functionId, functionVersionNumber });\n const meta = getMeta(script);\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 }, [existingFunctionUrl, script, script.name, script.source]);\n\n return (\n <div role='none' className={mx(role === 'article' && 'row-span-2', 'is-full pli-2')}>\n <Toolbar\n binding={script.binding ?? ''}\n onBindingChange={handleBindingChange}\n deployed={Boolean(existingFunctionUrl) && !script.changed}\n onDeploy={handleDeploy}\n functionUrl={existingFunctionUrl}\n error={error}\n />\n <TypescriptEditor id={script.id} initialValue={initialValue} extensions={extensions} />\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, { 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 = ({ binding, onBindingChange, deployed, onDeploy, functionUrl, error }: ToolbarProps) => {\n const { t } = useTranslation(SCRIPT_PLUGIN);\n const [pending, setPending] = useState(false);\n const [editing, setEditing] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const handleEdit = () => {\n setEditing(true);\n inputRef.current?.focus();\n };\n\n const handleSave = () => {\n setEditing(false);\n onBindingChange(inputRef.current?.value || '');\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 ref={inputRef} defaultValue={binding} disabled={!editing} classNames='!is-auto' />\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": ["import_react", "import_react_ui", "import_react_ui_theme", "Toolbar", "binding", "onBindingChange", "deployed", "onDeploy", "functionUrl", "error", "t", "useTranslation", "SCRIPT_PLUGIN", "pending", "setPending", "useState", "editing", "setEditing", "inputRef", "useRef", "handleEdit", "current", "focus", "handleSave", "value", "handleCancel", "handleCopyLink", "navigator", "clipboard", "writeText", "handleDeploy", "React", "DensityProvider", "density", "ElevationProvider", "elevation", "NaturalToolbar", "Root", "classNames", "style", "contain", "Input", "Label", "TextInput", "ref", "defaultValue", "disabled", "Button", "variant", "onClick", "X", "className", "getSize", "Check", "Tooltip", "Trigger", "asChild", "PencilSimple", "Portal", "Content", "Arrow", "div", "role", "WarningCircle", "Checks", "Link", "CircleNotch", "mx", "UploadSimple", "ScriptEditor", "script", "client", "useClient", "identity", "useIdentity", "space", "getSpace", "extensions", "useMemo", "listener", "onChange", "text", "source", "content", "changed", "createDataExtensions", "id", "createDocAccessor", "initialValue", "existingFunctionUrl", "getUserFunctionUrlInMetadata", "getMeta", "setError", "handleBindingChange", "useCallback", "undefined", "existingFunctionId", "split", "at", "ownerDid", "publicKeyToDid", "identityKey", "result", "functionId", "functionVersionNumber", "errorMessage", "uploadWorkerFunction", "clientConfig", "config", "halo", "name", "Error", "log", "info", "meta", "setUserFunctionUrlInMetadata", "err", "catch", "Boolean", "TypescriptEditor"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/types/script.ts", "../../../src/types/types.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { ref, S, TypedObject } from '@dxos/echo-schema';\nimport { TextType } from '@dxos/plugin-markdown/types';\n\nexport class ScriptType extends TypedObject({ typename: 'dxos.org/type/Script', version: '0.1.0' })({\n name: S.optional(S.String),\n source: ref(TextType),\n\n // Local binding to a function name.\n binding: S.optional(S.String),\n // Whether source has changed since last deploy.\n changed: S.optional(S.Boolean),\n}) {}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport type {\n GraphBuilderProvides,\n IntentResolverProvides,\n MetadataRecordsProvides,\n SurfaceProvides,\n TranslationsProvides,\n} from '@dxos/app-framework';\nimport { type SchemaProvides } from '@dxos/plugin-client';\nimport type { StackProvides } from '@dxos/plugin-stack';\n\nimport { SCRIPT_PLUGIN } from '../meta';\n\nexport enum ScriptAction {\n CREATE = `${SCRIPT_PLUGIN}/create`,\n}\n\nexport type ScriptPluginProvides = SurfaceProvides &\n IntentResolverProvides &\n GraphBuilderProvides &\n MetadataRecordsProvides &\n TranslationsProvides &\n SchemaProvides &\n StackProvides;\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;AAIA,yBAAoC;AACpC,mBAAyB;AAElB,IAAMA,aAAN,kBAAyBC,gCAAY;EAAEC,UAAU;EAAwBC,SAAS;AAAQ,CAAA,EAAG;EAClGC,MAAMC,qBAAEC,SAASD,qBAAEE,MAAM;EACzBC,YAAQC,wBAAIC,qBAAAA;;EAGZC,SAASN,qBAAEC,SAASD,qBAAEE,MAAM;;EAE5BK,SAASP,qBAAEC,SAASD,qBAAEQ,OAAO;AAC/B,CAAA,EAAA;AAAI;;UCCQC,eAAAA;0CACD,GAAGC,mCAAAA,SAAsB,IAAA;GADxBD,iBAAAA,eAAAA,CAAAA,EAAAA;",
6
- "names": ["ScriptType", "TypedObject", "typename", "version", "name", "S", "optional", "String", "source", "ref", "TextType", "binding", "changed", "Boolean", "ScriptAction", "SCRIPT_PLUGIN"]
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 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\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 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,6BAA2B;AAC3B,sBAA0D;AAC1D,4BAAsC;AACtC,mBAAkB;AAElB,sBAAgC;AAChC,6BAOO;AACP,kBAA4B;AAQrB,IAAMA,mBAAmB,CAAC,EAC/BC,IACAC,YACAC,cACAC,UACAC,WACAC,WACAC,cAAa,MACS;AACtB,QAAM,EAAEC,UAAS,QAAKC,iCAAAA;AAEtB,QAAM,EAAEC,WAAWC,gBAAe,QAAKC,sCACrC,OAAO;IACLX;IACAE;IACAD,YAAY;MACVA;;UAEAW,8CAAsB;QAAEC,qBAAqB;QAAMC,eAAe;QAAMC,aAAa;QAAMT;MAAc,CAAA;;MAEzGC,cAAc,aAASS,oCAAmBC,2CAAAA,QAAyBD,oCAAmBE,qCAAAA;UACtFC,8CAAsB;QACpBZ;QACAa,OAAO;UACLC,SAAS;YAAEhB,WAAWiB;UAAc;QACtC;MACF,CAAA;UACAC,mCAAW;QAAEC,YAAY;MAAK,CAAA;UAC9BC,qCAAAA;MACAC,OAAOC,uBAAAA;IACTvB;IACAD;EACF,IACA;IAACH;IAAIE;IAAcD;IAAYM;IAAWH;IAAWD;GAAS;AAGhE,SAAO,6BAAAyB,QAAA,cAACC,OAAAA;IAAIC,KAAKrB;IAAWJ;IAAuB,GAAGK;;AACxD;AAEA,IAAA,2BAAeX;",
6
- "names": ["TypescriptEditor", "id", "extensions", "initialValue", "scrollTo", "selection", "className", "scrollPastEnd", "themeMode", "useThemeContext", "parentRef", "focusAttributes", "useTextEditor", "createBasicExtensions", "highlightActiveLine", "indentWithTab", "lineNumbers", "syntaxHighlighting", "oneDarkHighlightStyle", "defaultHighlightStyle", "createThemeExtensions", "slots", "content", "editorContent", "javascript", "typescript", "autocomplete", "filter", "nonNullable", "React", "div", "ref"]
7
- }