@univerjs/uniscript 0.1.10 → 0.1.12
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +2 -2
- package/lib/cjs/index.js +2 -2
- package/lib/es/index.js +153 -128
- package/lib/types/controllers/menu.d.ts +1 -1
- package/lib/types/controllers/uniscript.controller.d.ts +10 -3
- package/lib/types/index.d.ts +3 -2
- package/lib/types/locale/index.d.ts +1 -0
- package/lib/types/locale/ru-RU.d.ts +4 -0
- package/lib/types/plugin.d.ts +7 -5
- package/lib/types/services/script-editor.service.d.ts +4 -6
- package/lib/types/services/script-execution.service.d.ts +7 -3
- package/lib/umd/index.js +2 -2
- package/package.json +15 -15
package/README.md
CHANGED
@@ -14,11 +14,11 @@
|
|
14
14
|
Users can write business logic in the code editor to meet more flexible business requirements. For instance, as shown in the illustration, users can write a Uniscript to read identity card numbers from a selected area and validate their legality, and mark the background of invalid identity card numbers with red.
|
15
15
|
|
16
16
|
:::caution
|
17
|
-
The Uniscript is currently in the experimental stage, and it is not recommended to use it in production environments. You can refer to the [Roadmap](https://univer.ai/guides/
|
17
|
+
The Uniscript is currently in the experimental stage, and it is not recommended to use it in production environments. You can refer to the [Roadmap](https://univer.ai/guides/sheet/roadmap) to understand the iteration plan of Uniscript.
|
18
18
|
:::
|
19
19
|
|
20
20
|
:::tip
|
21
|
-
Indeed, Uniscript's Domain-Specific Language (DSL) is a set of Facade APIs that encapsulate the internal implementation details of Univer. This API is defined [here](https://univer.ai/guides/facade/).
|
21
|
+
Indeed, Uniscript's Domain-Specific Language (DSL) is a set of Facade APIs that encapsulate the internal implementation details of Univer. This API is defined [here](https://univer.ai/guides/sheet/facade/facade).
|
22
22
|
:::
|
23
23
|
|
24
24
|
## Usage
|
package/lib/cjs/index.js
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
"use strict";var
|
1
|
+
"use strict";var B=Object.defineProperty;var W=(n,e,t)=>e in n?B(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t;var f=(n,e,t)=>(W(n,typeof e!="symbol"?e+"":e,t),t);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("@univerjs/core"),l=require("@wendellhu/redi"),u=require("@univerjs/ui"),$=require("rxjs"),d=require("react"),O=require("@univerjs/design"),v=require("@wendellhu/redi/react-bindings"),z=require("monaco-editor"),V=require("@univerjs/facade"),H={"script-panel":{title:"Uniscript",tooltip:{"menu-button":"Toggle Uniscript Panel"},panel:{execute:"Execute Script"}},uniscript:{message:{success:"Execution Success",failed:"Execution Failed"}}},G=H,J={"script-panel":{title:"Uniscript",tooltip:{"menu-button":"打开收起 Uniscript 面板"},panel:{execute:"执行 Uniscript"}},uniscript:{message:{success:"执行成功",failed:"执行失败"}}},R=J,Y={"script-panel":{title:"Юнискрипт",tooltip:{"menu-button":"Переключить панель Юнискрипт"},panel:{execute:"Выполнить скрипт"}},uniscript:{message:{success:"Выполнение успешно",failed:"Выполнение не удалось"}}},K=Y;class M extends c.Disposable{constructor(){super(...arguments);f(this,"_open$",new $.BehaviorSubject(!1));f(this,"open$",this._open$.pipe($.distinctUntilChanged()))}get isOpen(){return this._open$.getValue()}dispose(){super.dispose(),this._open$.next(!1),this._open$.complete()}open(){this._open$.next(!0)}close(){this._open$.next(!1)}}const T="ScriptPanel",N={type:c.CommandType.OPERATION,id:"univer.operation.toggle-script-panel",handler:n=>{const e=n.get(M),t=n.get(u.ISidebarService);return e.isOpen?(e.close(),t.close()):(e.open(),t.open({header:{title:"script-panel.title"},children:{label:T},width:600})),!0}};var q={exports:{}},I={};/**
|
2
2
|
* @license React
|
3
3
|
* react-jsx-runtime.production.min.js
|
4
4
|
*
|
@@ -6,4 +6,4 @@
|
|
6
6
|
*
|
7
7
|
* This source code is licensed under the MIT license found in the
|
8
8
|
* LICENSE file in the root directory of this source tree.
|
9
|
-
*/var
|
9
|
+
*/var Q=d,X=Symbol.for("react.element"),Z=Symbol.for("react.fragment"),k=Object.prototype.hasOwnProperty,ee=Q.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,te={key:!0,ref:!0,__self:!0,__source:!0};function L(n,e,t){var i,r={},s=null,o=null;t!==void 0&&(s=""+t),e.key!==void 0&&(s=""+e.key),e.ref!==void 0&&(o=e.ref);for(i in e)k.call(e,i)&&!te.hasOwnProperty(i)&&(r[i]=e[i]);if(n&&n.defaultProps)for(i in e=n.defaultProps,e)r[i]===void 0&&(r[i]=e[i]);return{$$typeof:X,type:n,key:s,ref:o,props:r,_owner:ee.current}}I.Fragment=Z;I.jsx=L;I.jsxs=L;q.exports=I;var g=q.exports;class y extends c.Disposable{constructor(t){super();f(this,"_editorInstance",null);this._config=t}setEditorInstance(t){return this._editorInstance=t,c.toDisposable(()=>this._editorInstance=null)}getEditorInstance(){return this._editorInstance}requireVscodeEditor(){window.MonacoEnvironment||(window.MonacoEnvironment={getWorkerUrl:this._config.getWorkerUrl})}}var ne=Object.defineProperty,ie=Object.getOwnPropertyDescriptor,re=(n,e,t,i)=>{for(var r=i>1?void 0:i?ie(e,t):e,s=n.length-1,o;s>=0;s--)(o=n[s])&&(r=(i?o(e,t,r):o(r))||r);return i&&r&&ne(e,t,r),r},D=(n,e)=>(t,i)=>e(t,i,n);const U=l.createIdentifier("univer.uniscript.execution-service");let b=class extends c.Disposable{constructor(n,e){super(),this._logService=n,this._injector=e}async execute(n){this._logService.log("[UniscriptExecutionService]","executing Uniscript...");const e=V.FUniver.newAPI(this._injector),t=new Function("univerAPI",`(() => {${n}})()`);try{return t(e),!0}catch(i){return this._logService.error(i),!1}}};b=re([D(0,c.ILogService),D(1,l.Inject(l.Injector))],b);const se="univer-script-editor-panel",ce="univer-script-editor-content",oe="univer-script-editor-actions",E={scriptEditorPanel:se,scriptEditorContent:ce,scriptEditorActions:oe};function le(){const n=d.useRef(null),e=d.useRef(null),t=d.useRef(null),i=v.useDependency(c.LocaleService),r=v.useDependency(u.IShortcutService),s=v.useDependency(y);d.useEffect(()=>{const j=e.current,_=n.current;let a=null,S=null;if(j&&_){s.requireVscodeEditor();const m=t.current=z.editor.create(j,{value:"",language:"javascript"});S=new ResizeObserver(()=>{let C=requestIdleCallback(()=>{if(!C)return;const{height:A,width:F}=_.getBoundingClientRect();m.layout({width:F,height:A}),C=void 0})}),S.observe(_);let p;a=new c.DisposableCollection,a.add(s.setEditorInstance(m)),a.add(m.onDidFocusEditorWidget(()=>{p=r.forceEscape()})),a.add(m.onDidBlurEditorWidget(()=>{p==null||p.dispose(),p=void 0})),a.add(c.toDisposable(()=>p==null?void 0:p.dispose()))}return()=>{S&&_&&S.unobserve(_),a==null||a.dispose()}},[s,r]);const o=ae(t);return g.jsxs("div",{className:E.scriptEditorPanel,children:[g.jsx("div",{className:E.scriptEditorContent,ref:n,children:g.jsx("div",{className:E.scriptEditorContainer,ref:e})}),g.jsx("div",{className:E.scriptEditorActions,children:g.jsx(O.Button,{type:"primary",size:"small",onClick:o,children:i.t("script-panel.panel.execute")})})]})}function ae(n){const e=v.useDependency(U),t=v.useDependency(u.IMessageService),i=v.useDependency(c.LocaleService);return d.useCallback(()=>{var s;const r=(s=n.current)==null?void 0:s.getModel();r&&e.execute(r.getValue()).then(()=>{t.show({content:i.t("uniscript.message.success"),type:O.MessageType.Success})}).catch(()=>{t.show({content:i.t("uniscript.message.failed"),type:O.MessageType.Error})})},[i,t,n,e])}function pe(n){return{id:N.id,title:"toggle-script-panel",tooltip:"script-panel.tooltip.menu-button",icon:"CodeSingle",type:u.MenuItemType.BUTTON,positions:[u.MenuPosition.TOOLBAR_START],hidden$:u.getMenuHiddenObservable(n,c.UniverInstanceType.UNIVER_SHEET)}}var ue=Object.defineProperty,de=Object.getOwnPropertyDescriptor,ve=(n,e,t,i)=>{for(var r=i>1?void 0:i?de(e,t):e,s=n.length-1,o;s>=0;s--)(o=n[s])&&(r=(i?o(e,t,r):o(r))||r);return i&&r&&ue(e,t,r),r},x=(n,e)=>(t,i)=>e(t,i,n);const _e={};let h=class extends c.Disposable{constructor(n,e,t,i,r){super(),this._config=n,this._injector=e,this._menuService=t;const{menu:s={}}=this._config;this.disposeWithMe(t.addMenuItem(this._injector.invoke(pe),s)),this.disposeWithMe(r.register(T,le)),this.disposeWithMe(i.registerCommand(N))}};h=ve([c.OnLifecycle(c.LifecycleStages.Steady,h),x(1,l.Inject(l.Injector)),x(2,u.IMenuService),x(3,c.ICommandService),x(4,l.Inject(u.ComponentManager))],h);var fe=Object.defineProperty,ge=Object.getOwnPropertyDescriptor,he=(n,e,t,i)=>{for(var r=i>1?void 0:i?ge(e,t):e,s=n.length-1,o;s>=0;s--)(o=n[s])&&(r=(i?o(e,t,r):o(r))||r);return i&&r&&fe(e,t,r),r},w=(n,e)=>(t,i)=>e(t,i,n);const Se="uniscript";var P;exports.UniverUniscriptPlugin=(P=class extends c.Plugin{constructor(e={},t,i){super(),this._config=e,this._injector=t,this._localeService=i,this._config=c.Tools.deepMerge({},_e,this._config)}onStarting(e){[[h,{useFactory:()=>e.createInstance(h,this._config)}],[y,{useFactory:()=>e.createInstance(y,this._config)}],[M]].forEach(i=>e.add(i)),this.registerExecution(),this._localeService.load({zhCN:R})}registerExecution(){this._injector.add([U,{useClass:b}])}},f(P,"pluginName",Se),P);exports.UniverUniscriptPlugin=he([w(1,l.Inject(l.Injector)),w(2,l.Inject(c.LocaleService))],exports.UniverUniscriptPlugin);exports.IUniscriptExecutionService=U;exports.ScriptEditorService=y;exports.enUS=G;exports.ruRU=K;exports.zhCN=R;
|
package/lib/es/index.js
CHANGED
@@ -1,16 +1,16 @@
|
|
1
|
-
var
|
2
|
-
var
|
3
|
-
var u = (t, e, r) => (
|
4
|
-
import { Disposable as
|
5
|
-
import { Inject as
|
6
|
-
import { ISidebarService as
|
7
|
-
import { BehaviorSubject as
|
8
|
-
import
|
9
|
-
import { Button as
|
1
|
+
var q = Object.defineProperty;
|
2
|
+
var V = (t, e, r) => e in t ? q(t, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : t[e] = r;
|
3
|
+
var u = (t, e, r) => (V(t, typeof e != "symbol" ? e + "" : e, r), r);
|
4
|
+
import { Disposable as S, CommandType as z, toDisposable as M, ILogService as H, LocaleService as y, DisposableCollection as G, UniverInstanceType as J, OnLifecycle as Y, LifecycleStages as K, ICommandService as Q, Plugin as X, Tools as Z } from "@univerjs/core";
|
5
|
+
import { createIdentifier as k, Inject as f, Injector as b } from "@wendellhu/redi";
|
6
|
+
import { ISidebarService as ee, IShortcutService as te, IMessageService as re, MenuItemType as ie, MenuPosition as ne, getMenuHiddenObservable as se, ComponentManager as oe, IMenuService as ce } from "@univerjs/ui";
|
7
|
+
import { BehaviorSubject as le, distinctUntilChanged as pe } from "rxjs";
|
8
|
+
import ae, { useRef as x, useEffect as ue, useCallback as de } from "react";
|
9
|
+
import { Button as ve, MessageType as $ } from "@univerjs/design";
|
10
10
|
import { useDependency as p } from "@wendellhu/redi/react-bindings";
|
11
|
-
import { editor as
|
12
|
-
import { FUniver as
|
13
|
-
const
|
11
|
+
import { editor as fe } from "monaco-editor";
|
12
|
+
import { FUniver as _e } from "@univerjs/facade";
|
13
|
+
const he = {
|
14
14
|
"script-panel": {
|
15
15
|
title: "Uniscript",
|
16
16
|
tooltip: {
|
@@ -26,7 +26,7 @@ const ve = {
|
|
26
26
|
failed: "Execution Failed"
|
27
27
|
}
|
28
28
|
}
|
29
|
-
},
|
29
|
+
}, ke = he, me = {
|
30
30
|
"script-panel": {
|
31
31
|
title: "Uniscript",
|
32
32
|
tooltip: {
|
@@ -42,18 +42,34 @@ const ve = {
|
|
42
42
|
failed: "执行失败"
|
43
43
|
}
|
44
44
|
}
|
45
|
-
},
|
46
|
-
|
45
|
+
}, ge = me, Se = {
|
46
|
+
"script-panel": {
|
47
|
+
title: "Юнискрипт",
|
48
|
+
tooltip: {
|
49
|
+
"menu-button": "Переключить панель Юнискрипт"
|
50
|
+
},
|
51
|
+
panel: {
|
52
|
+
execute: "Выполнить скрипт"
|
53
|
+
}
|
54
|
+
},
|
55
|
+
uniscript: {
|
56
|
+
message: {
|
57
|
+
success: "Выполнение успешно",
|
58
|
+
failed: "Выполнение не удалось"
|
59
|
+
}
|
60
|
+
}
|
61
|
+
}, et = Se;
|
62
|
+
class T extends S {
|
47
63
|
constructor() {
|
48
64
|
super(...arguments);
|
49
|
-
u(this, "_open$", new
|
50
|
-
u(this, "open$", this._open$.pipe(
|
65
|
+
u(this, "_open$", new le(!1));
|
66
|
+
u(this, "open$", this._open$.pipe(pe()));
|
51
67
|
}
|
52
68
|
get isOpen() {
|
53
69
|
return this._open$.getValue();
|
54
70
|
}
|
55
71
|
dispose() {
|
56
|
-
this._open$.next(!1), this._open$.complete();
|
72
|
+
super.dispose(), this._open$.next(!1), this._open$.complete();
|
57
73
|
}
|
58
74
|
open() {
|
59
75
|
this._open$.next(!0);
|
@@ -62,19 +78,19 @@ class T extends E {
|
|
62
78
|
this._open$.next(!1);
|
63
79
|
}
|
64
80
|
}
|
65
|
-
const
|
66
|
-
type:
|
81
|
+
const D = "ScriptPanel", N = {
|
82
|
+
type: z.OPERATION,
|
67
83
|
id: "univer.operation.toggle-script-panel",
|
68
84
|
handler: (t) => {
|
69
|
-
const e = t.get(T), r = t.get(
|
85
|
+
const e = t.get(T), r = t.get(ee);
|
70
86
|
return e.isOpen ? (e.close(), r.close()) : (e.open(), r.open({
|
71
87
|
header: { title: "script-panel.title" },
|
72
|
-
children: { label:
|
88
|
+
children: { label: D },
|
73
89
|
width: 600
|
74
90
|
})), !0;
|
75
91
|
}
|
76
92
|
};
|
77
|
-
var A = { exports: {} },
|
93
|
+
var A = { exports: {} }, E = {};
|
78
94
|
/**
|
79
95
|
* @license React
|
80
96
|
* react-jsx-runtime.production.min.js
|
@@ -84,23 +100,23 @@ var A = { exports: {} }, x = {};
|
|
84
100
|
* This source code is licensed under the MIT license found in the
|
85
101
|
* LICENSE file in the root directory of this source tree.
|
86
102
|
*/
|
87
|
-
var
|
103
|
+
var Ee = ae, xe = Symbol.for("react.element"), Pe = Symbol.for("react.fragment"), Oe = Object.prototype.hasOwnProperty, Ie = Ee.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner, ye = { key: !0, ref: !0, __self: !0, __source: !0 };
|
88
104
|
function F(t, e, r) {
|
89
|
-
var
|
90
|
-
r !== void 0 && (
|
91
|
-
for (
|
92
|
-
|
105
|
+
var i, n = {}, s = null, o = null;
|
106
|
+
r !== void 0 && (s = "" + r), e.key !== void 0 && (s = "" + e.key), e.ref !== void 0 && (o = e.ref);
|
107
|
+
for (i in e)
|
108
|
+
Oe.call(e, i) && !ye.hasOwnProperty(i) && (n[i] = e[i]);
|
93
109
|
if (t && t.defaultProps)
|
94
|
-
for (
|
95
|
-
i
|
96
|
-
return { $$typeof:
|
110
|
+
for (i in e = t.defaultProps, e)
|
111
|
+
n[i] === void 0 && (n[i] = e[i]);
|
112
|
+
return { $$typeof: xe, type: t, key: s, ref: o, props: n, _owner: Ie.current };
|
97
113
|
}
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
A.exports =
|
114
|
+
E.Fragment = Pe;
|
115
|
+
E.jsx = F;
|
116
|
+
E.jsxs = F;
|
117
|
+
A.exports = E;
|
102
118
|
var d = A.exports;
|
103
|
-
class
|
119
|
+
class O extends S {
|
104
120
|
constructor(r) {
|
105
121
|
super();
|
106
122
|
u(this, "_editorInstance", null);
|
@@ -118,153 +134,162 @@ class y extends E {
|
|
118
134
|
});
|
119
135
|
}
|
120
136
|
}
|
121
|
-
var
|
122
|
-
for (var
|
123
|
-
(
|
124
|
-
return
|
125
|
-
},
|
126
|
-
|
137
|
+
var be = Object.defineProperty, Ce = Object.getOwnPropertyDescriptor, Ue = (t, e, r, i) => {
|
138
|
+
for (var n = i > 1 ? void 0 : i ? Ce(e, r) : e, s = t.length - 1, o; s >= 0; s--)
|
139
|
+
(o = t[s]) && (n = (i ? o(e, r, n) : o(n)) || n);
|
140
|
+
return i && n && be(e, r, n), n;
|
141
|
+
}, j = (t, e) => (r, i) => e(r, i, t);
|
142
|
+
const L = k("univer.uniscript.execution-service");
|
143
|
+
let I = class extends S {
|
127
144
|
constructor(t, e) {
|
128
145
|
super(), this._logService = t, this._injector = e;
|
129
146
|
}
|
130
147
|
async execute(t) {
|
131
148
|
this._logService.log("[UniscriptExecutionService]", "executing Uniscript...");
|
132
|
-
const e =
|
149
|
+
const e = _e.newAPI(this._injector), r = new Function("univerAPI", `(() => {${t}})()`);
|
133
150
|
try {
|
134
151
|
return r(e), !0;
|
135
|
-
} catch (
|
136
|
-
return this._logService.error(
|
152
|
+
} catch (i) {
|
153
|
+
return this._logService.error(i), !1;
|
137
154
|
}
|
138
155
|
}
|
139
156
|
};
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
],
|
144
|
-
const
|
145
|
-
scriptEditorPanel:
|
146
|
-
scriptEditorContent:
|
147
|
-
scriptEditorActions:
|
157
|
+
I = Ue([
|
158
|
+
j(0, H),
|
159
|
+
j(1, f(b))
|
160
|
+
], I);
|
161
|
+
const $e = "univer-script-editor-panel", je = "univer-script-editor-content", we = "univer-script-editor-actions", m = {
|
162
|
+
scriptEditorPanel: $e,
|
163
|
+
scriptEditorContent: je,
|
164
|
+
scriptEditorActions: we
|
148
165
|
};
|
149
|
-
function
|
150
|
-
const t =
|
151
|
-
|
152
|
-
const
|
153
|
-
let c = null,
|
154
|
-
if (
|
155
|
-
|
156
|
-
const
|
166
|
+
function Re() {
|
167
|
+
const t = x(null), e = x(null), r = x(null), i = p(y), n = p(te), s = p(O);
|
168
|
+
ue(() => {
|
169
|
+
const C = e.current, a = t.current;
|
170
|
+
let c = null, _ = null;
|
171
|
+
if (C && a) {
|
172
|
+
s.requireVscodeEditor();
|
173
|
+
const h = r.current = fe.create(C, {
|
157
174
|
value: "",
|
158
175
|
language: "javascript"
|
159
176
|
});
|
160
|
-
|
161
|
-
let
|
162
|
-
if (!
|
177
|
+
_ = new ResizeObserver(() => {
|
178
|
+
let U = requestIdleCallback(() => {
|
179
|
+
if (!U)
|
163
180
|
return;
|
164
|
-
const { height:
|
165
|
-
|
181
|
+
const { height: W, width: B } = a.getBoundingClientRect();
|
182
|
+
h.layout({ width: B, height: W }), U = void 0;
|
166
183
|
});
|
167
|
-
}),
|
184
|
+
}), _.observe(a);
|
168
185
|
let l;
|
169
|
-
c = new
|
170
|
-
|
171
|
-
l =
|
186
|
+
c = new G(), c.add(s.setEditorInstance(h)), c.add(
|
187
|
+
h.onDidFocusEditorWidget(() => {
|
188
|
+
l = n.forceEscape();
|
172
189
|
})
|
173
190
|
), c.add(
|
174
|
-
|
191
|
+
h.onDidBlurEditorWidget(() => {
|
175
192
|
l == null || l.dispose(), l = void 0;
|
176
193
|
})
|
177
194
|
), c.add(M(() => l == null ? void 0 : l.dispose()));
|
178
195
|
}
|
179
196
|
return () => {
|
180
|
-
|
197
|
+
_ && a && _.unobserve(a), c == null || c.dispose();
|
181
198
|
};
|
182
|
-
}, [
|
183
|
-
const
|
199
|
+
}, [s, n]);
|
200
|
+
const o = Me(r);
|
184
201
|
return /* @__PURE__ */ d.jsxs("div", { className: m.scriptEditorPanel, children: [
|
185
202
|
/* @__PURE__ */ d.jsx("div", { className: m.scriptEditorContent, ref: t, children: /* @__PURE__ */ d.jsx("div", { className: m.scriptEditorContainer, ref: e }) }),
|
186
|
-
/* @__PURE__ */ d.jsx("div", { className: m.scriptEditorActions, children: /* @__PURE__ */ d.jsx(
|
203
|
+
/* @__PURE__ */ d.jsx("div", { className: m.scriptEditorActions, children: /* @__PURE__ */ d.jsx(ve, { type: "primary", size: "small", onClick: o, children: i.t("script-panel.panel.execute") }) })
|
187
204
|
] });
|
188
205
|
}
|
189
|
-
function
|
190
|
-
const e = p(
|
191
|
-
return
|
192
|
-
var
|
193
|
-
const
|
194
|
-
|
206
|
+
function Me(t) {
|
207
|
+
const e = p(L), r = p(re), i = p(y);
|
208
|
+
return de(() => {
|
209
|
+
var s;
|
210
|
+
const n = (s = t.current) == null ? void 0 : s.getModel();
|
211
|
+
n && e.execute(n.getValue()).then(() => {
|
195
212
|
r.show({
|
196
|
-
content:
|
213
|
+
content: i.t("uniscript.message.success"),
|
197
214
|
type: $.Success
|
198
215
|
});
|
199
216
|
}).catch(() => {
|
200
217
|
r.show({
|
201
|
-
content:
|
218
|
+
content: i.t("uniscript.message.failed"),
|
202
219
|
type: $.Error
|
203
220
|
});
|
204
221
|
});
|
205
|
-
}, [
|
222
|
+
}, [i, r, t, e]);
|
206
223
|
}
|
207
|
-
function
|
224
|
+
function Te(t) {
|
208
225
|
return {
|
209
|
-
id:
|
226
|
+
id: N.id,
|
210
227
|
title: "toggle-script-panel",
|
211
228
|
tooltip: "script-panel.tooltip.menu-button",
|
212
229
|
icon: "CodeSingle",
|
213
|
-
type:
|
214
|
-
positions: [
|
230
|
+
type: ie.BUTTON,
|
231
|
+
positions: [ne.TOOLBAR_START],
|
215
232
|
// FIXME hidden$ and disabled$ are not correctly in doc
|
216
|
-
hidden$:
|
233
|
+
hidden$: se(t, J.UNIVER_SHEET)
|
217
234
|
// disabled$: getCurrentSheetDisabled$(accessor),
|
218
235
|
};
|
219
236
|
}
|
220
|
-
var
|
221
|
-
for (var
|
222
|
-
(
|
223
|
-
return
|
224
|
-
},
|
225
|
-
|
226
|
-
|
227
|
-
|
237
|
+
var De = Object.defineProperty, Ne = Object.getOwnPropertyDescriptor, Ae = (t, e, r, i) => {
|
238
|
+
for (var n = i > 1 ? void 0 : i ? Ne(e, r) : e, s = t.length - 1, o; s >= 0; s--)
|
239
|
+
(o = t[s]) && (n = (i ? o(e, r, n) : o(n)) || n);
|
240
|
+
return i && n && De(e, r, n), n;
|
241
|
+
}, g = (t, e) => (r, i) => e(r, i, t);
|
242
|
+
const Fe = {};
|
243
|
+
let v = class extends S {
|
244
|
+
constructor(t, e, r, i, n) {
|
245
|
+
super(), this._config = t, this._injector = e, this._menuService = r;
|
246
|
+
const { menu: s = {} } = this._config;
|
247
|
+
this.disposeWithMe(r.addMenuItem(this._injector.invoke(Te), s)), this.disposeWithMe(n.register(D, Re)), this.disposeWithMe(i.registerCommand(N));
|
228
248
|
}
|
229
249
|
};
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
],
|
237
|
-
var
|
238
|
-
for (var
|
239
|
-
(
|
240
|
-
return
|
241
|
-
},
|
242
|
-
const
|
243
|
-
var
|
244
|
-
let R = (
|
245
|
-
constructor(t, e, r) {
|
246
|
-
super(), this._config = t, this._injector = e, this._localeService = r;
|
250
|
+
v = Ae([
|
251
|
+
Y(K.Steady, v),
|
252
|
+
g(1, f(b)),
|
253
|
+
g(2, ce),
|
254
|
+
g(3, Q),
|
255
|
+
g(4, f(oe))
|
256
|
+
], v);
|
257
|
+
var Le = Object.defineProperty, We = Object.getOwnPropertyDescriptor, Be = (t, e, r, i) => {
|
258
|
+
for (var n = i > 1 ? void 0 : i ? We(e, r) : e, s = t.length - 1, o; s >= 0; s--)
|
259
|
+
(o = t[s]) && (n = (i ? o(e, r, n) : o(n)) || n);
|
260
|
+
return i && n && Le(e, r, n), n;
|
261
|
+
}, w = (t, e) => (r, i) => e(r, i, t);
|
262
|
+
const qe = "uniscript";
|
263
|
+
var P;
|
264
|
+
let R = (P = class extends X {
|
265
|
+
constructor(t = {}, e, r) {
|
266
|
+
super(), this._config = t, this._injector = e, this._localeService = r, this._config = Z.deepMerge({}, Fe, this._config);
|
247
267
|
}
|
248
268
|
onStarting(t) {
|
249
269
|
[
|
250
270
|
// controllers
|
251
|
-
[
|
271
|
+
[v, { useFactory: () => t.createInstance(v, this._config) }],
|
252
272
|
// services
|
253
|
-
[
|
254
|
-
[T]
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
273
|
+
[O, { useFactory: () => t.createInstance(O, this._config) }],
|
274
|
+
[T]
|
275
|
+
].forEach((r) => t.add(r)), this.registerExecution(), this._localeService.load({ zhCN: ge });
|
276
|
+
}
|
277
|
+
/**
|
278
|
+
* Allows being overridden, replacing with a new UniscriptExecutionService.
|
279
|
+
*/
|
280
|
+
registerExecution() {
|
281
|
+
this._injector.add([L, { useClass: I }]);
|
259
282
|
}
|
260
|
-
}, u(
|
261
|
-
R =
|
262
|
-
|
263
|
-
|
283
|
+
}, u(P, "pluginName", qe), P);
|
284
|
+
R = Be([
|
285
|
+
w(1, f(b)),
|
286
|
+
w(2, f(y))
|
264
287
|
], R);
|
265
288
|
export {
|
266
|
-
|
289
|
+
L as IUniscriptExecutionService,
|
290
|
+
O as ScriptEditorService,
|
267
291
|
R as UniverUniscriptPlugin,
|
268
|
-
|
269
|
-
|
292
|
+
ke as enUS,
|
293
|
+
et as ruRU,
|
294
|
+
ge as zhCN
|
270
295
|
};
|
@@ -1,8 +1,15 @@
|
|
1
|
-
import { Injector } from '@wendellhu/redi';
|
2
|
-
import { ComponentManager, IMenuService } from '@univerjs/ui';
|
3
1
|
import { Disposable, ICommandService } from '@univerjs/core';
|
2
|
+
import { MenuConfig, ComponentManager, IMenuService } from '@univerjs/ui';
|
3
|
+
import { Injector } from '@wendellhu/redi';
|
4
4
|
|
5
|
+
export interface IUniverUniscriptConfig {
|
6
|
+
getWorkerUrl(moduleID: string, label: string): string;
|
7
|
+
menu: MenuConfig;
|
8
|
+
}
|
9
|
+
export declare const DefaultUniscriptConfig: {};
|
5
10
|
export declare class UniscriptController extends Disposable {
|
11
|
+
private readonly _config;
|
6
12
|
private readonly _injector;
|
7
|
-
|
13
|
+
private readonly _menuService;
|
14
|
+
constructor(_config: Partial<IUniverUniscriptConfig>, _injector: Injector, _menuService: IMenuService, commandService: ICommandService, componentManager: ComponentManager);
|
8
15
|
}
|
package/lib/types/index.d.ts
CHANGED
@@ -13,6 +13,7 @@
|
|
13
13
|
* See the License for the specific language governing permissions and
|
14
14
|
* limitations under the License.
|
15
15
|
*/
|
16
|
-
export { enUS, zhCN } from './locale';
|
17
|
-
export {
|
16
|
+
export { enUS, zhCN, ruRU } from './locale';
|
17
|
+
export { UniverUniscriptPlugin } from './plugin';
|
18
18
|
export { ScriptEditorService } from './services/script-editor.service';
|
19
|
+
export { IUniscriptExecutionService } from './services/script-execution.service';
|
package/lib/types/plugin.d.ts
CHANGED
@@ -1,14 +1,16 @@
|
|
1
|
-
import { IScriptEditorServiceConfig } from './services/script-editor.service';
|
2
|
-
import { Injector } from '@wendellhu/redi';
|
3
1
|
import { LocaleService, Plugin } from '@univerjs/core';
|
2
|
+
import { Injector } from '@wendellhu/redi';
|
3
|
+
import { IUniverUniscriptConfig } from './controllers/uniscript.controller';
|
4
4
|
|
5
|
-
export interface IUniscriptConfig extends IScriptEditorServiceConfig {
|
6
|
-
}
|
7
5
|
export declare class UniverUniscriptPlugin extends Plugin {
|
8
6
|
private readonly _config;
|
9
7
|
protected _injector: Injector;
|
10
8
|
private readonly _localeService;
|
11
9
|
static pluginName: string;
|
12
|
-
constructor(_config:
|
10
|
+
constructor(_config: Partial<IUniverUniscriptConfig>, _injector: Injector, _localeService: LocaleService);
|
13
11
|
onStarting(injector: Injector): void;
|
12
|
+
/**
|
13
|
+
* Allows being overridden, replacing with a new UniscriptExecutionService.
|
14
|
+
*/
|
15
|
+
registerExecution(): void;
|
14
16
|
}
|
@@ -1,10 +1,8 @@
|
|
1
|
-
import { editor } from 'monaco-editor';
|
2
|
-
import { IDisposable } from '@wendellhu/redi';
|
3
1
|
import { Disposable } from '@univerjs/core';
|
2
|
+
import { IDisposable } from '@wendellhu/redi';
|
3
|
+
import { editor } from 'monaco-editor';
|
4
|
+
import { IUniverUniscriptConfig } from '../controllers/uniscript.controller';
|
4
5
|
|
5
|
-
export interface IScriptEditorServiceConfig {
|
6
|
-
getWorkerUrl(moduleID: string, label: string): string;
|
7
|
-
}
|
8
6
|
/**
|
9
7
|
* This service is for loading monaco editor and its resources. It also holds the
|
10
8
|
* monaco editor instance so user can interact with the editor programmatically.
|
@@ -12,7 +10,7 @@ export interface IScriptEditorServiceConfig {
|
|
12
10
|
export declare class ScriptEditorService extends Disposable {
|
13
11
|
private readonly _config;
|
14
12
|
private _editorInstance;
|
15
|
-
constructor(_config:
|
13
|
+
constructor(_config: Partial<IUniverUniscriptConfig>);
|
16
14
|
setEditorInstance(editor: editor.IStandaloneCodeEditor): IDisposable;
|
17
15
|
getEditorInstance(): editor.IStandaloneCodeEditor | null;
|
18
16
|
requireVscodeEditor(): void;
|
@@ -1,10 +1,14 @@
|
|
1
|
-
import { Injector } from '@wendellhu/redi';
|
2
1
|
import { Disposable, ILogService } from '@univerjs/core';
|
2
|
+
import { Injector } from '@wendellhu/redi';
|
3
3
|
|
4
|
+
export declare const IUniscriptExecutionService: import('@wendellhu/redi').IdentifierDecorator<IUniscriptExecutionService>;
|
5
|
+
export interface IUniscriptExecutionService {
|
6
|
+
execute(code: string): Promise<boolean>;
|
7
|
+
}
|
4
8
|
/**
|
5
|
-
* This service is to
|
9
|
+
* This service is to execute Uniscript code.
|
6
10
|
*/
|
7
|
-
export declare class UniscriptExecutionService extends Disposable {
|
11
|
+
export declare class UniscriptExecutionService extends Disposable implements IUniscriptExecutionService {
|
8
12
|
private readonly _logService;
|
9
13
|
private readonly _injector;
|
10
14
|
constructor(_logService: ILogService, _injector: Injector);
|
package/lib/umd/index.js
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
(function(c,s){typeof exports=="object"&&typeof module<"u"?s(exports,require("@univerjs/core"),require("@wendellhu/redi"),require("@univerjs/ui"),require("rxjs"),require("react"),require("@univerjs/design"),require("@wendellhu/redi/react-bindings"),require("monaco-editor"),require("@univerjs/facade")):typeof define=="function"&&define.amd?define(["exports","@univerjs/core","@wendellhu/redi","@univerjs/ui","rxjs","react","@univerjs/design","@wendellhu/redi/react-bindings","monaco-editor","@univerjs/facade"],s):(c=typeof globalThis<"u"?globalThis:c||self,s(c.UniverUniscript={},c.UniverCore,c["@wendellhu/redi"],c.UniverUi,c.rxjs,c.React,c.UniverDesign,c["@wendellhu/redi/react-bindings"],c.monaco,c.UniverFacade))})(this,function(c,s,p,
|
1
|
+
(function(c,s){typeof exports=="object"&&typeof module<"u"?s(exports,require("@univerjs/core"),require("@wendellhu/redi"),require("@univerjs/ui"),require("rxjs"),require("react"),require("@univerjs/design"),require("@wendellhu/redi/react-bindings"),require("monaco-editor"),require("@univerjs/facade")):typeof define=="function"&&define.amd?define(["exports","@univerjs/core","@wendellhu/redi","@univerjs/ui","rxjs","react","@univerjs/design","@wendellhu/redi/react-bindings","monaco-editor","@univerjs/facade"],s):(c=typeof globalThis<"u"?globalThis:c||self,s(c.UniverUniscript={},c.UniverCore,c["@wendellhu/redi"],c.UniverUi,c.rxjs,c.React,c.UniverDesign,c["@wendellhu/redi/react-bindings"],c.monaco,c.UniverFacade))})(this,function(c,s,p,u,w,v,U,f,q,W){"use strict";var de=Object.defineProperty;var ve=(c,s,p)=>s in c?de(c,s,{enumerable:!0,configurable:!0,writable:!0,value:p}):c[s]=p;var S=(c,s,p)=>(ve(c,typeof s!="symbol"?s+"":s,p),p);var b;const z={"script-panel":{title:"Uniscript",tooltip:{"menu-button":"Toggle Uniscript Panel"},panel:{execute:"Execute Script"}},uniscript:{message:{success:"Execution Success",failed:"Execution Failed"}}},C={"script-panel":{title:"Uniscript",tooltip:{"menu-button":"打开收起 Uniscript 面板"},panel:{execute:"执行 Uniscript"}},uniscript:{message:{success:"执行成功",failed:"执行失败"}}},V={"script-panel":{title:"Юнискрипт",tooltip:{"menu-button":"Переключить панель Юнискрипт"},panel:{execute:"Выполнить скрипт"}},uniscript:{message:{success:"Выполнение успешно",failed:"Выполнение не удалось"}}};class D extends s.Disposable{constructor(){super(...arguments);S(this,"_open$",new w.BehaviorSubject(!1));S(this,"open$",this._open$.pipe(w.distinctUntilChanged()))}get isOpen(){return this._open$.getValue()}dispose(){super.dispose(),this._open$.next(!1),this._open$.complete()}open(){this._open$.next(!0)}close(){this._open$.next(!1)}}const R="ScriptPanel",T={type:s.CommandType.OPERATION,id:"univer.operation.toggle-script-panel",handler:i=>{const e=i.get(D),n=i.get(u.ISidebarService);return e.isOpen?(e.close(),n.close()):(e.open(),n.open({header:{title:"script-panel.title"},children:{label:R},width:600})),!0}};var M={exports:{}},m={};/**
|
2
2
|
* @license React
|
3
3
|
* react-jsx-runtime.production.min.js
|
4
4
|
*
|
@@ -6,4 +6,4 @@
|
|
6
6
|
*
|
7
7
|
* This source code is licensed under the MIT license found in the
|
8
8
|
* LICENSE file in the root directory of this source tree.
|
9
|
-
*/var
|
9
|
+
*/var B=v,H=Symbol.for("react.element"),G=Symbol.for("react.fragment"),J=Object.prototype.hasOwnProperty,Y=B.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,K={key:!0,ref:!0,__self:!0,__source:!0};function $(i,e,n){var t,r={},o=null,l=null;n!==void 0&&(o=""+n),e.key!==void 0&&(o=""+e.key),e.ref!==void 0&&(l=e.ref);for(t in e)J.call(e,t)&&!K.hasOwnProperty(t)&&(r[t]=e[t]);if(i&&i.defaultProps)for(t in e=i.defaultProps,e)r[t]===void 0&&(r[t]=e[t]);return{$$typeof:H,type:i,key:o,ref:l,props:r,_owner:Y.current}}m.Fragment=G,m.jsx=$,m.jsxs=$,M.exports=m;var h=M.exports;class E extends s.Disposable{constructor(n){super();S(this,"_editorInstance",null);this._config=n}setEditorInstance(n){return this._editorInstance=n,s.toDisposable(()=>this._editorInstance=null)}getEditorInstance(){return this._editorInstance}requireVscodeEditor(){window.MonacoEnvironment||(window.MonacoEnvironment={getWorkerUrl:this._config.getWorkerUrl})}}var Q=Object.defineProperty,X=Object.getOwnPropertyDescriptor,Z=(i,e,n,t)=>{for(var r=t>1?void 0:t?X(e,n):e,o=i.length-1,l;o>=0;o--)(l=i[o])&&(r=(t?l(e,n,r):l(r))||r);return t&&r&&Q(e,n,r),r},N=(i,e)=>(n,t)=>e(n,t,i);const x=p.createIdentifier("univer.uniscript.execution-service");let O=class extends s.Disposable{constructor(i,e){super(),this._logService=i,this._injector=e}async execute(i){this._logService.log("[UniscriptExecutionService]","executing Uniscript...");const e=W.FUniver.newAPI(this._injector),n=new Function("univerAPI",`(() => {${i}})()`);try{return n(e),!0}catch(t){return this._logService.error(t),!1}}};O=Z([N(0,s.ILogService),N(1,p.Inject(p.Injector))],O);const j={scriptEditorPanel:"univer-script-editor-panel",scriptEditorContent:"univer-script-editor-content",scriptEditorActions:"univer-script-editor-actions"};function k(){const i=v.useRef(null),e=v.useRef(null),n=v.useRef(null),t=f.useDependency(s.LocaleService),r=f.useDependency(u.IShortcutService),o=f.useDependency(E);v.useEffect(()=>{const F=e.current,g=i.current;let a=null,P=null;if(F&&g){o.requireVscodeEditor();const I=n.current=q.editor.create(F,{value:"",language:"javascript"});P=new ResizeObserver(()=>{let L=requestIdleCallback(()=>{if(!L)return;const{height:ue,width:ae}=g.getBoundingClientRect();I.layout({width:ae,height:ue}),L=void 0})}),P.observe(g);let d;a=new s.DisposableCollection,a.add(o.setEditorInstance(I)),a.add(I.onDidFocusEditorWidget(()=>{d=r.forceEscape()})),a.add(I.onDidBlurEditorWidget(()=>{d==null||d.dispose(),d=void 0})),a.add(s.toDisposable(()=>d==null?void 0:d.dispose()))}return()=>{P&&g&&P.unobserve(g),a==null||a.dispose()}},[o,r]);const l=ee(n);return h.jsxs("div",{className:j.scriptEditorPanel,children:[h.jsx("div",{className:j.scriptEditorContent,ref:i,children:h.jsx("div",{className:j.scriptEditorContainer,ref:e})}),h.jsx("div",{className:j.scriptEditorActions,children:h.jsx(U.Button,{type:"primary",size:"small",onClick:l,children:t.t("script-panel.panel.execute")})})]})}function ee(i){const e=f.useDependency(x),n=f.useDependency(u.IMessageService),t=f.useDependency(s.LocaleService);return v.useCallback(()=>{var o;const r=(o=i.current)==null?void 0:o.getModel();r&&e.execute(r.getValue()).then(()=>{n.show({content:t.t("uniscript.message.success"),type:U.MessageType.Success})}).catch(()=>{n.show({content:t.t("uniscript.message.failed"),type:U.MessageType.Error})})},[t,n,i,e])}function te(i){return{id:T.id,title:"toggle-script-panel",tooltip:"script-panel.tooltip.menu-button",icon:"CodeSingle",type:u.MenuItemType.BUTTON,positions:[u.MenuPosition.TOOLBAR_START],hidden$:u.getMenuHiddenObservable(i,s.UniverInstanceType.UNIVER_SHEET)}}var ne=Object.defineProperty,ie=Object.getOwnPropertyDescriptor,re=(i,e,n,t)=>{for(var r=t>1?void 0:t?ie(e,n):e,o=i.length-1,l;o>=0;o--)(l=i[o])&&(r=(t?l(e,n,r):l(r))||r);return t&&r&&ne(e,n,r),r},y=(i,e)=>(n,t)=>e(n,t,i);const se={};let _=class extends s.Disposable{constructor(i,e,n,t,r){super(),this._config=i,this._injector=e,this._menuService=n;const{menu:o={}}=this._config;this.disposeWithMe(n.addMenuItem(this._injector.invoke(te),o)),this.disposeWithMe(r.register(R,k)),this.disposeWithMe(t.registerCommand(T))}};_=re([s.OnLifecycle(s.LifecycleStages.Steady,_),y(1,p.Inject(p.Injector)),y(2,u.IMenuService),y(3,s.ICommandService),y(4,p.Inject(u.ComponentManager))],_);var ce=Object.defineProperty,oe=Object.getOwnPropertyDescriptor,le=(i,e,n,t)=>{for(var r=t>1?void 0:t?oe(e,n):e,o=i.length-1,l;o>=0;o--)(l=i[o])&&(r=(t?l(e,n,r):l(r))||r);return t&&r&&ce(e,n,r),r},A=(i,e)=>(n,t)=>e(n,t,i);const pe="uniscript";c.UniverUniscriptPlugin=(b=class extends s.Plugin{constructor(e={},n,t){super(),this._config=e,this._injector=n,this._localeService=t,this._config=s.Tools.deepMerge({},se,this._config)}onStarting(e){[[_,{useFactory:()=>e.createInstance(_,this._config)}],[E,{useFactory:()=>e.createInstance(E,this._config)}],[D]].forEach(t=>e.add(t)),this.registerExecution(),this._localeService.load({zhCN:C})}registerExecution(){this._injector.add([x,{useClass:O}])}},S(b,"pluginName",pe),b),c.UniverUniscriptPlugin=le([A(1,p.Inject(p.Injector)),A(2,p.Inject(s.LocaleService))],c.UniverUniscriptPlugin),c.IUniscriptExecutionService=x,c.ScriptEditorService=E,c.enUS=z,c.ruRU=V,c.zhCN=C,Object.defineProperty(c,Symbol.toStringTag,{value:"Module"})});
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@univerjs/uniscript",
|
3
|
-
"version": "0.1.
|
3
|
+
"version": "0.1.12",
|
4
4
|
"private": false,
|
5
5
|
"description": "UI component library for building exceptional Univer.",
|
6
6
|
"author": "DreamNum <developer@univer.ai>",
|
@@ -53,29 +53,29 @@
|
|
53
53
|
"npm": ">=8.0.0"
|
54
54
|
},
|
55
55
|
"peerDependencies": {
|
56
|
-
"@wendellhu/redi": "
|
56
|
+
"@wendellhu/redi": "0.15.2",
|
57
57
|
"monaco-editor": ">=0.44.0",
|
58
58
|
"react": "^16.9.0 || ^17.0.0 || ^18.0.0",
|
59
59
|
"rxjs": ">=7.0.0",
|
60
|
-
"@univerjs/core": "0.1.
|
61
|
-
"@univerjs/design": "0.1.
|
62
|
-
"@univerjs/
|
63
|
-
"@univerjs/
|
60
|
+
"@univerjs/core": "0.1.12",
|
61
|
+
"@univerjs/design": "0.1.12",
|
62
|
+
"@univerjs/facade": "0.1.12",
|
63
|
+
"@univerjs/ui": "0.1.12"
|
64
64
|
},
|
65
65
|
"devDependencies": {
|
66
66
|
"@types/react": "^18.2.79",
|
67
|
-
"@wendellhu/redi": "
|
67
|
+
"@wendellhu/redi": "0.15.2",
|
68
68
|
"less": "^4.2.0",
|
69
|
-
"monaco-editor": "0.
|
69
|
+
"monaco-editor": "0.48.0",
|
70
70
|
"rxjs": "^7.8.1",
|
71
71
|
"typescript": "^5.4.5",
|
72
|
-
"vite": "^5.2.
|
73
|
-
"vitest": "^1.
|
74
|
-
"@univerjs/core": "0.1.
|
75
|
-
"@univerjs/design": "0.1.
|
76
|
-
"@univerjs/facade": "0.1.
|
77
|
-
"@univerjs/
|
78
|
-
"@univerjs/
|
72
|
+
"vite": "^5.2.11",
|
73
|
+
"vitest": "^1.6.0",
|
74
|
+
"@univerjs/core": "0.1.12",
|
75
|
+
"@univerjs/design": "0.1.12",
|
76
|
+
"@univerjs/facade": "0.1.12",
|
77
|
+
"@univerjs/ui": "0.1.12",
|
78
|
+
"@univerjs/shared": "0.1.12"
|
79
79
|
},
|
80
80
|
"scripts": {
|
81
81
|
"test": "vitest run",
|