@lvce-editor/extension-host-worker 8.24.0 → 8.25.0

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 (33) hide show
  1. package/dist/extension-api/index.js +560 -9
  2. package/dist/extension-api/parts/CommandRegistry/CommandRegistry.js +3 -1
  3. package/dist/extension-api/parts/CompletionProviderRegistry/CompletionProviderRegistry.js +29 -2
  4. package/dist/extension-api/parts/DiagnosticProviderRegistry/DiagnosticProviderRegistry.js +4 -1
  5. package/dist/extension-api/parts/ExtensionApiCommandMap/ExtensionApiCommandMap.js +13 -2
  6. package/dist/extension-api/parts/FormattingProviderRegistry/FormattingProviderRegistry.js +4 -1
  7. package/dist/extension-api/parts/HoverProviderRegistry/HoverProviderRegistry.js +4 -1
  8. package/dist/extension-api/parts/StatusBarItemProviderRegistry/StatusBarItemProviderRegistry.js +3 -1
  9. package/dist/extension-api/parts/ViewRegistry/ViewRegistry.js +95 -2
  10. package/extension-api/dist/index.d.ts +2 -2
  11. package/extension-api/dist/index.js +1 -1
  12. package/extension-api/dist/parts/CommandMap/CommandMap.d.ts +4 -0
  13. package/extension-api/dist/parts/CommandRegistry/CommandRegistry.js +3 -1
  14. package/extension-api/dist/parts/CommandRegistrySnapshot/CommandRegistrySnapshot.d.ts +3 -2
  15. package/extension-api/dist/parts/CompletionProviderRegistry/CompletionProviderRegistry.js +30 -2
  16. package/extension-api/dist/parts/CompletionProviderRegistrySnapshot/CompletionProviderRegistrySnapshot.d.ts +4 -2
  17. package/extension-api/dist/parts/DiagnosticProviderRegistry/DiagnosticProviderRegistry.js +4 -1
  18. package/extension-api/dist/parts/DiagnosticProviderRegistrySnapshot/DiagnosticProviderRegistrySnapshot.d.ts +4 -2
  19. package/extension-api/dist/parts/ExtensionApiCommandMap/ExtensionApiCommandMap.d.ts +4 -0
  20. package/extension-api/dist/parts/ExtensionApiCommandMap/ExtensionApiCommandMap.js +5 -1
  21. package/extension-api/dist/parts/ExtensionApiWorkerCommandMap/ExtensionApiWorkerCommandMap.d.ts +4 -0
  22. package/extension-api/dist/parts/FormattingProviderRegistry/FormattingProviderRegistry.js +4 -1
  23. package/extension-api/dist/parts/FormattingProviderRegistrySnapshot/FormattingProviderRegistrySnapshot.d.ts +4 -2
  24. package/extension-api/dist/parts/HoverProviderRegistry/HoverProviderRegistry.js +4 -1
  25. package/extension-api/dist/parts/HoverProviderRegistrySnapshot/HoverProviderRegistrySnapshot.d.ts +4 -2
  26. package/extension-api/dist/parts/StatusBarItemProviderRegistry/StatusBarItemProviderRegistry.js +3 -1
  27. package/extension-api/dist/parts/StatusBarItemProviderRegistrySnapshot/StatusBarItemProviderRegistrySnapshot.d.ts +3 -2
  28. package/extension-api/dist/parts/View/View.d.ts +30 -1
  29. package/extension-api/dist/parts/ViewRegistry/ViewRegistry.d.ts +5 -1
  30. package/extension-api/dist/parts/ViewRegistry/ViewRegistry.js +90 -1
  31. package/extension-api/package.json +3 -2
  32. package/extension-api/tsconfig.tsbuildinfo +1 -1
  33. package/package.json +1 -1
@@ -1,5 +1,8 @@
1
+ import { diffTree } from '@lvce-editor/virtual-dom-worker';
1
2
  import { ExtensionApiError } from "../ExtensionApiError/ExtensionApiError.js";
2
3
  const views = Object.create(null);
4
+ const instances = Object.create(null);
5
+ const renderedDoms = Object.create(null);
3
6
  const assertView = (view) => {
4
7
  if (!view) {
5
8
  throw new ExtensionApiError('view is not defined');
@@ -15,11 +18,18 @@ const assertView = (view) => {
15
18
  }
16
19
  };
17
20
  const toRegisteredView = (view) => {
18
- return {
21
+ const registeredView = {
19
22
  icon: view.icon,
20
23
  id: view.id,
21
24
  title: view.title,
22
25
  };
26
+ if (view.kind) {
27
+ return {
28
+ ...registeredView,
29
+ kind: view.kind,
30
+ };
31
+ }
32
+ return registeredView;
23
33
  };
24
34
  export const registerView = (view) => {
25
35
  assertView(view);
@@ -37,6 +47,79 @@ export const executeViewProvider = (id) => {
37
47
  }
38
48
  return view.create();
39
49
  };
50
+ const assertVirtualDomViewInstance = (id, instance) => {
51
+ if (!instance || typeof instance !== 'object') {
52
+ throw new ExtensionApiError(`view ${id} did not return a view instance`);
53
+ }
54
+ if (typeof instance.render !== 'function') {
55
+ throw new ExtensionApiError(`view ${id} instance is missing render function`);
56
+ }
57
+ };
58
+ const getVirtualDomInstance = (uid) => {
59
+ const instance = instances[uid];
60
+ if (!instance) {
61
+ throw new ExtensionApiError(`view instance ${uid} not found`);
62
+ }
63
+ return instance;
64
+ };
65
+ const renderDom = async (instance) => {
66
+ const dom = await instance.render();
67
+ if (!Array.isArray(dom)) {
68
+ throw new ExtensionApiError('view render result must be an array');
69
+ }
70
+ return dom;
71
+ };
72
+ export const createViewInstance = async (viewId, uid, context) => {
73
+ const view = views[viewId];
74
+ if (!view) {
75
+ throw new ExtensionApiError(`view ${viewId} not found`);
76
+ }
77
+ if (view.kind !== 'virtualDom') {
78
+ throw new ExtensionApiError(`view ${viewId} is not a virtual dom view`);
79
+ }
80
+ const instance = await view.create({
81
+ ...context,
82
+ uid,
83
+ viewId,
84
+ });
85
+ assertVirtualDomViewInstance(viewId, instance);
86
+ instances[uid] = instance;
87
+ const dom = await renderDom(instance);
88
+ renderedDoms[uid] = dom;
89
+ return {
90
+ dom,
91
+ type: 'setDom',
92
+ };
93
+ };
94
+ export const dispatchViewEvent = async (uid, event) => {
95
+ const instance = getVirtualDomInstance(uid);
96
+ if (typeof instance.handleEvent === 'function') {
97
+ await instance.handleEvent(event);
98
+ }
99
+ const oldDom = renderedDoms[uid] || [];
100
+ const newDom = await renderDom(instance);
101
+ renderedDoms[uid] = newDom;
102
+ const patches = diffTree(oldDom, newDom);
103
+ return {
104
+ patches,
105
+ type: 'setPatches',
106
+ };
107
+ };
108
+ export const disposeViewInstance = async (uid) => {
109
+ const instance = instances[uid];
110
+ if (instance && typeof instance.dispose === 'function') {
111
+ await instance.dispose();
112
+ }
113
+ delete instances[uid];
114
+ delete renderedDoms[uid];
115
+ };
116
+ export const saveViewInstanceState = async (uid) => {
117
+ const instance = getVirtualDomInstance(uid);
118
+ if (typeof instance.saveState !== 'function') {
119
+ return undefined;
120
+ }
121
+ return instance.saveState();
122
+ };
40
123
  export const getViewRegistrySnapshot = () => {
41
124
  return {
42
125
  views: Object.values(views).map(toRegisteredView),
@@ -46,4 +129,10 @@ export const resetViewRegistry = () => {
46
129
  for (const id of Object.keys(views)) {
47
130
  delete views[id];
48
131
  }
132
+ for (const uid of Object.keys(instances)) {
133
+ delete instances[Number(uid)];
134
+ }
135
+ for (const uid of Object.keys(renderedDoms)) {
136
+ delete renderedDoms[Number(uid)];
137
+ }
49
138
  };
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvce-editor/api",
3
- "version": "8.24.0",
3
+ "version": "8.25.0",
4
4
  "description": "Tree-shakeable extension API for Lvce Editor extensions.",
5
5
  "keywords": [
6
6
  "lvce-editor",
@@ -28,6 +28,7 @@
28
28
  "sideEffects": false,
29
29
  "dependencies": {
30
30
  "@lvce-editor/rpc": "^6.4.0",
31
- "@lvce-editor/rpc-registry": "^9.24.0"
31
+ "@lvce-editor/rpc-registry": "^9.24.0",
32
+ "@lvce-editor/virtual-dom-worker": "^10.0.0"
32
33
  }
33
34
  }