@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
@@ -9,16 +9,40 @@ const getType = (value) => {
9
9
  }
10
10
  return typeof value;
11
11
  };
12
+ const sanitizeCompletionItem = (item) => {
13
+ const sanitizedItem = {};
14
+ for (const [key, value] of Object.entries(item)) {
15
+ if (typeof value !== "function") {
16
+ sanitizedItem[key] = value;
17
+ }
18
+ }
19
+ const { kind: itemKind, type } = item;
20
+ let kind = 0;
21
+ if (typeof itemKind === "number") {
22
+ kind = itemKind;
23
+ } else if (typeof type === "number") {
24
+ kind = type;
25
+ }
26
+ return {
27
+ ...sanitizedItem,
28
+ flags: typeof item.flags === "number" ? item.flags : 0,
29
+ kind,
30
+ label: typeof item.label === "string" ? item.label : "",
31
+ matches: Array.isArray(item.matches) ? item.matches : []
32
+ };
33
+ };
12
34
  const validateCompletionResult = (completion) => {
13
35
  if (!Array.isArray(completion)) {
14
36
  throw new ExtensionApiError(`invalid completion result: completion must be of type array but is ${getType(completion)}`);
15
37
  }
38
+ const completionItems = [];
16
39
  for (const item of completion) {
17
40
  if (!item || typeof item !== "object" || Array.isArray(item)) {
18
41
  throw new ExtensionApiError(`invalid completion result: expected completion item to be of type object but was of type ${getType(item)}`);
19
42
  }
43
+ completionItems.push(sanitizeCompletionItem(item));
20
44
  }
21
- return completion;
45
+ return completionItems;
22
46
  };
23
47
  const registry = createProviderRegistry({
24
48
  mapProvider(provider) {
@@ -63,7 +87,10 @@ const executeResolveCompletionItemProvider = async (textDocument, offset, name,
63
87
  const getCompletionProviders = registry.getProviders;
64
88
  const getCompletionProviderRegistrySnapshot = () => {
65
89
  return {
66
- providers: registry.getProviders()
90
+ providers: registry.getProviders().map((provider) => ({
91
+ id: provider.id,
92
+ languageId: provider.languageId
93
+ }))
67
94
  };
68
95
  };
69
96
  const resetCompletionProviderRegistry = registry.reset;
@@ -52,7 +52,10 @@ const executeDiagnosticProvider = async (textDocument, ...args) => {
52
52
  const getDiagnosticProviders = registry.getProviders;
53
53
  const getDiagnosticProviderRegistrySnapshot = () => {
54
54
  return {
55
- providers: registry.getProviders()
55
+ providers: registry.getProviders().map((provider) => ({
56
+ id: provider.id,
57
+ languageId: provider.languageId
58
+ }))
56
59
  };
57
60
  };
58
61
  const resetDiagnosticProviderRegistry = registry.reset;
@@ -5,8 +5,18 @@ import { executeFormattingProvider, getFormattingProviderRegistrySnapshot } from
5
5
  import { getStatusBarItems } from "../GetStatusBarItems/GetStatusBarItems.js";
6
6
  import { executeHoverProvider, getHoverProviderRegistrySnapshot } from "../Hover/Hover.js";
7
7
  import { getOutputChannelRegistrySnapshot } from "../OutputChannel/OutputChannel.js";
8
- import { executeViewProvider, getViewRegistrySnapshot } from "../ViewRegistry/ViewRegistry.js";
8
+ import {
9
+ createViewInstance,
10
+ dispatchViewEvent,
11
+ disposeViewInstance,
12
+ executeViewProvider,
13
+ getViewRegistrySnapshot,
14
+ saveViewInstanceState
15
+ } from "../ViewRegistry/ViewRegistry.js";
9
16
  const commandMap = {
17
+ "ExtensionApi.createViewInstance": createViewInstance,
18
+ "ExtensionApi.dispatchViewEvent": dispatchViewEvent,
19
+ "ExtensionApi.disposeViewInstance": disposeViewInstance,
10
20
  "ExtensionApi.executeCommand": executeCommand,
11
21
  "ExtensionApi.executeCompletionProvider": executeCompletionProvider,
12
22
  "ExtensionApi.executeDiagnosticProvider": executeDiagnosticProvider,
@@ -21,7 +31,8 @@ const commandMap = {
21
31
  "ExtensionApi.getHoverProviderRegistrySnapshot": getHoverProviderRegistrySnapshot,
22
32
  "ExtensionApi.getOutputChannelRegistrySnapshot": getOutputChannelRegistrySnapshot,
23
33
  "ExtensionApi.getStatusBarItems": getStatusBarItems,
24
- "ExtensionApi.getViewRegistrySnapshot": getViewRegistrySnapshot
34
+ "ExtensionApi.getViewRegistrySnapshot": getViewRegistrySnapshot,
35
+ "ExtensionApi.saveViewInstanceState": saveViewInstanceState
25
36
  };
26
37
  export {
27
38
  commandMap
@@ -28,7 +28,10 @@ const executeFormattingProvider = async (textDocument, ...args) => {
28
28
  const getFormattingProviders = registry.getProviders;
29
29
  const getFormattingProviderRegistrySnapshot = () => {
30
30
  return {
31
- providers: registry.getProviders()
31
+ providers: registry.getProviders().map((provider) => ({
32
+ id: provider.id,
33
+ languageId: provider.languageId
34
+ }))
32
35
  };
33
36
  };
34
37
  const resetFormattingProviderRegistry = registry.reset;
@@ -50,7 +50,10 @@ const executeHoverProvider = async (textDocument, offset, ...args) => {
50
50
  const getHoverProviders = registry.getProviders;
51
51
  const getHoverProviderRegistrySnapshot = () => {
52
52
  return {
53
- providers: registry.getProviders()
53
+ providers: registry.getProviders().map((provider) => ({
54
+ id: provider.id,
55
+ languageId: provider.languageId
56
+ }))
54
57
  };
55
58
  };
56
59
  const resetHoverProviderRegistry = registry.reset;
@@ -38,7 +38,9 @@ const getStatusBarItems = () => {
38
38
  };
39
39
  const getStatusBarItemProviderRegistrySnapshot = () => {
40
40
  return {
41
- providers: registry.getProviders()
41
+ providers: registry.getProviders().map((provider) => ({
42
+ id: provider.id
43
+ }))
42
44
  };
43
45
  };
44
46
  const resetStatusBarItemProviderRegistry = registry.reset;
@@ -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 = /* @__PURE__ */ Object.create(null);
4
+ const instances = /* @__PURE__ */ Object.create(null);
5
+ const renderedDoms = /* @__PURE__ */ 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
  const registerView = (view) => {
25
35
  assertView(view);
@@ -37,6 +47,79 @@ 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
+ 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
+ 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
+ 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
+ const saveViewInstanceState = async (uid) => {
117
+ const instance = getVirtualDomInstance(uid);
118
+ if (typeof instance.saveState !== "function") {
119
+ return void 0;
120
+ }
121
+ return instance.saveState();
122
+ };
40
123
  const getViewRegistrySnapshot = () => {
41
124
  return {
42
125
  views: Object.values(views).map(toRegisteredView)
@@ -46,10 +129,20 @@ 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
  };
50
139
  export {
140
+ createViewInstance,
141
+ dispatchViewEvent,
142
+ disposeViewInstance,
51
143
  executeViewProvider,
52
144
  getViewRegistrySnapshot,
53
145
  registerView,
54
- resetViewRegistry
146
+ resetViewRegistry,
147
+ saveViewInstanceState
55
148
  };
@@ -6,10 +6,10 @@ export { executeCompletionProvider, executeResolveCompletionItemProvider, getCom
6
6
  export { executeDiagnosticProvider, getDiagnosticProviderRegistrySnapshot, registerDiagnosticProvider, resetDiagnosticProviderRegistry, } from './parts/Diagnostic/Diagnostic.ts';
7
7
  export { executeFormattingProvider, getFormattingProviderRegistrySnapshot, registerFormattingProvider, resetFormattingProviderRegistry, } from './parts/Formatting/Formatting.ts';
8
8
  export { executeHoverProvider, getHoverProviderRegistrySnapshot, registerHoverProvider, resetHoverProviderRegistry } from './parts/Hover/Hover.ts';
9
- export { executeViewProvider, getViewRegistrySnapshot, registerView, resetViewRegistry } from './parts/ViewRegistry/ViewRegistry.ts';
9
+ export { createViewInstance, dispatchViewEvent, disposeViewInstance, executeViewProvider, getViewRegistrySnapshot, registerView, resetViewRegistry, saveViewInstanceState, } from './parts/ViewRegistry/ViewRegistry.ts';
10
10
  export { createOutputChannel, getOutputChannelRegistrySnapshot, resetOutputChannelRegistry } from './parts/OutputChannel/OutputChannel.ts';
11
11
  export { getStatusBarItemProviderRegistrySnapshot, registerStatusBarItemProvider, resetStatusBarItemProviderRegistry, } from './parts/StatusBar/StatusBar.ts';
12
- export type { RegisteredView, View, ViewRegistrySnapshot } from './parts/View/View.ts';
12
+ export type { RegisteredView, View, ViewContext, ViewEvent, ViewKind, ViewRegistrySnapshot, ViewRenderResult, VirtualDomViewInstance, } from './parts/View/View.ts';
13
13
  export { handleExtensionManagementMessagePort } from './parts/HandleExtensionManagementMessagePort/HandleExtensionManagementMessagePort.ts';
14
14
  export type { Command } from './parts/Command/Command.ts';
15
15
  export type { CommandCallback } from './parts/CommandCallback/CommandCallback.ts';
@@ -6,7 +6,7 @@ export { executeCompletionProvider, executeResolveCompletionItemProvider, getCom
6
6
  export { executeDiagnosticProvider, getDiagnosticProviderRegistrySnapshot, registerDiagnosticProvider, resetDiagnosticProviderRegistry, } from "./parts/Diagnostic/Diagnostic.js";
7
7
  export { executeFormattingProvider, getFormattingProviderRegistrySnapshot, registerFormattingProvider, resetFormattingProviderRegistry, } from "./parts/Formatting/Formatting.js";
8
8
  export { executeHoverProvider, getHoverProviderRegistrySnapshot, registerHoverProvider, resetHoverProviderRegistry } from "./parts/Hover/Hover.js";
9
- export { executeViewProvider, getViewRegistrySnapshot, registerView, resetViewRegistry } from "./parts/ViewRegistry/ViewRegistry.js";
9
+ export { createViewInstance, dispatchViewEvent, disposeViewInstance, executeViewProvider, getViewRegistrySnapshot, registerView, resetViewRegistry, saveViewInstanceState, } from "./parts/ViewRegistry/ViewRegistry.js";
10
10
  export { createOutputChannel, getOutputChannelRegistrySnapshot, resetOutputChannelRegistry } from "./parts/OutputChannel/OutputChannel.js";
11
11
  export { getStatusBarItemProviderRegistrySnapshot, registerStatusBarItemProvider, resetStatusBarItemProviderRegistry, } from "./parts/StatusBar/StatusBar.js";
12
12
  export { handleExtensionManagementMessagePort } from "./parts/HandleExtensionManagementMessagePort/HandleExtensionManagementMessagePort.js";
@@ -1,5 +1,8 @@
1
1
  export declare const commandMap: {
2
2
  initialize(type: string, port: MessagePort): Promise<void>;
3
+ 'ExtensionApi.createViewInstance': (viewId: string, uid: number, context?: import("../View/View.ts").ViewContext) => Promise<import("../View/View.ts").ViewRenderResult>;
4
+ 'ExtensionApi.dispatchViewEvent': (uid: number, event: import("../View/View.ts").ViewEvent) => Promise<import("../View/View.ts").ViewRenderResult>;
5
+ 'ExtensionApi.disposeViewInstance': (uid: number) => Promise<void>;
3
6
  'ExtensionApi.executeCommand': (id: string, ...args: readonly unknown[]) => Promise<unknown>;
4
7
  'ExtensionApi.executeCompletionProvider': (textDocument: import("../CompletionTextDocument/CompletionTextDocument.ts").TextDocument, offset: number, ...args: readonly unknown[]) => Promise<readonly import("../CompletionItem/CompletionItem.ts").CompletionItem[]>;
5
8
  'ExtensionApi.executeDiagnosticProvider': (textDocument: import("../DiagnosticTextDocument/DiagnosticTextDocument.ts").TextDocument, ...args: readonly unknown[]) => Promise<readonly import("../DiagnosticResult/DiagnosticResult.ts").Diagnostic[]>;
@@ -15,4 +18,5 @@ export declare const commandMap: {
15
18
  'ExtensionApi.getOutputChannelRegistrySnapshot': () => import("../OutputChannelRegistrySnapshot/OutputChannelRegistrySnapshot.ts").OutputChannelRegistrySnapshot;
16
19
  'ExtensionApi.getStatusBarItems': () => readonly import("../StatusBarItem/StatusBarItem.ts").StatusBarItem[];
17
20
  'ExtensionApi.getViewRegistrySnapshot': () => import("../View/View.ts").ViewRegistrySnapshot;
21
+ 'ExtensionApi.saveViewInstanceState': (uid: number) => Promise<unknown>;
18
22
  };
@@ -30,7 +30,9 @@ export const registerCommand = (command) => {
30
30
  };
31
31
  export const getCommandRegistrySnapshot = () => {
32
32
  return {
33
- commands: Object.values(commands),
33
+ commands: Object.values(commands).map((command) => ({
34
+ id: command.id,
35
+ })),
34
36
  };
35
37
  };
36
38
  export const executeCommand = async (id, ...args) => {
@@ -1,4 +1,5 @@
1
- import type { RegisteredCommand } from '../RegisteredCommand/RegisteredCommand.ts';
2
1
  export interface CommandRegistrySnapshot {
3
- readonly commands: readonly RegisteredCommand[];
2
+ readonly commands: readonly {
3
+ readonly id: string;
4
+ }[];
4
5
  }
@@ -9,16 +9,41 @@ const getType = (value) => {
9
9
  }
10
10
  return typeof value;
11
11
  };
12
+ const sanitizeCompletionItem = (item) => {
13
+ const sanitizedItem = {};
14
+ for (const [key, value] of Object.entries(item)) {
15
+ if (typeof value !== 'function') {
16
+ sanitizedItem[key] = value;
17
+ }
18
+ }
19
+ const { kind: itemKind, type } = item;
20
+ let kind = 0;
21
+ if (typeof itemKind === 'number') {
22
+ kind = itemKind;
23
+ }
24
+ else if (typeof type === 'number') {
25
+ kind = type;
26
+ }
27
+ return {
28
+ ...sanitizedItem,
29
+ flags: typeof item.flags === 'number' ? item.flags : 0,
30
+ kind,
31
+ label: typeof item.label === 'string' ? item.label : '',
32
+ matches: Array.isArray(item.matches) ? item.matches : [],
33
+ };
34
+ };
12
35
  const validateCompletionResult = (completion) => {
13
36
  if (!Array.isArray(completion)) {
14
37
  throw new ExtensionApiError(`invalid completion result: completion must be of type array but is ${getType(completion)}`);
15
38
  }
39
+ const completionItems = [];
16
40
  for (const item of completion) {
17
41
  if (!item || typeof item !== 'object' || Array.isArray(item)) {
18
42
  throw new ExtensionApiError(`invalid completion result: expected completion item to be of type object but was of type ${getType(item)}`);
19
43
  }
44
+ completionItems.push(sanitizeCompletionItem(item));
20
45
  }
21
- return completion;
46
+ return completionItems;
22
47
  };
23
48
  const registry = createProviderRegistry({
24
49
  mapProvider(provider) {
@@ -60,7 +85,10 @@ export const executeResolveCompletionItemProvider = async (textDocument, offset,
60
85
  export const getCompletionProviders = registry.getProviders;
61
86
  export const getCompletionProviderRegistrySnapshot = () => {
62
87
  return {
63
- providers: registry.getProviders(),
88
+ providers: registry.getProviders().map((provider) => ({
89
+ id: provider.id,
90
+ languageId: provider.languageId,
91
+ })),
64
92
  };
65
93
  };
66
94
  export const resetCompletionProviderRegistry = registry.reset;
@@ -1,4 +1,6 @@
1
- import type { RegisteredCompletionProvider } from '../RegisteredCompletionProvider/RegisteredCompletionProvider.ts';
2
1
  export interface CompletionProviderRegistrySnapshot {
3
- readonly providers: readonly RegisteredCompletionProvider[];
2
+ readonly providers: readonly {
3
+ readonly id: string;
4
+ readonly languageId: string;
5
+ }[];
4
6
  }
@@ -52,7 +52,10 @@ export const executeDiagnosticProvider = async (textDocument, ...args) => {
52
52
  export const getDiagnosticProviders = registry.getProviders;
53
53
  export const getDiagnosticProviderRegistrySnapshot = () => {
54
54
  return {
55
- providers: registry.getProviders(),
55
+ providers: registry.getProviders().map((provider) => ({
56
+ id: provider.id,
57
+ languageId: provider.languageId,
58
+ })),
56
59
  };
57
60
  };
58
61
  export const resetDiagnosticProviderRegistry = registry.reset;
@@ -1,4 +1,6 @@
1
- import type { RegisteredDiagnosticProvider } from '../RegisteredDiagnosticProvider/RegisteredDiagnosticProvider.ts';
2
1
  export interface DiagnosticProviderRegistrySnapshot {
3
- readonly providers: readonly RegisteredDiagnosticProvider[];
2
+ readonly providers: readonly {
3
+ readonly id: string;
4
+ readonly languageId: string;
5
+ }[];
4
6
  }
@@ -1,4 +1,7 @@
1
1
  export declare const commandMap: {
2
+ 'ExtensionApi.createViewInstance': (viewId: string, uid: number, context?: import("../View/View.ts").ViewContext) => Promise<import("../View/View.ts").ViewRenderResult>;
3
+ 'ExtensionApi.dispatchViewEvent': (uid: number, event: import("../View/View.ts").ViewEvent) => Promise<import("../View/View.ts").ViewRenderResult>;
4
+ 'ExtensionApi.disposeViewInstance': (uid: number) => Promise<void>;
2
5
  'ExtensionApi.executeCommand': (id: string, ...args: readonly unknown[]) => Promise<unknown>;
3
6
  'ExtensionApi.executeCompletionProvider': (textDocument: import("../CompletionTextDocument/CompletionTextDocument.ts").TextDocument, offset: number, ...args: readonly unknown[]) => Promise<readonly import("../CompletionItem/CompletionItem.ts").CompletionItem[]>;
4
7
  'ExtensionApi.executeDiagnosticProvider': (textDocument: import("../DiagnosticTextDocument/DiagnosticTextDocument.ts").TextDocument, ...args: readonly unknown[]) => Promise<readonly import("../DiagnosticResult/DiagnosticResult.ts").Diagnostic[]>;
@@ -14,4 +17,5 @@ export declare const commandMap: {
14
17
  'ExtensionApi.getOutputChannelRegistrySnapshot': () => import("../OutputChannelRegistrySnapshot/OutputChannelRegistrySnapshot.ts").OutputChannelRegistrySnapshot;
15
18
  'ExtensionApi.getStatusBarItems': () => readonly import("../StatusBarItem/StatusBarItem.ts").StatusBarItem[];
16
19
  'ExtensionApi.getViewRegistrySnapshot': () => import("../View/View.ts").ViewRegistrySnapshot;
20
+ 'ExtensionApi.saveViewInstanceState': (uid: number) => Promise<unknown>;
17
21
  };
@@ -5,8 +5,11 @@ import { executeFormattingProvider, getFormattingProviderRegistrySnapshot } from
5
5
  import { getStatusBarItems } from "../GetStatusBarItems/GetStatusBarItems.js";
6
6
  import { executeHoverProvider, getHoverProviderRegistrySnapshot } from "../Hover/Hover.js";
7
7
  import { getOutputChannelRegistrySnapshot } from "../OutputChannel/OutputChannel.js";
8
- import { executeViewProvider, getViewRegistrySnapshot } from "../ViewRegistry/ViewRegistry.js";
8
+ import { createViewInstance, dispatchViewEvent, disposeViewInstance, executeViewProvider, getViewRegistrySnapshot, saveViewInstanceState, } from "../ViewRegistry/ViewRegistry.js";
9
9
  export const commandMap = {
10
+ 'ExtensionApi.createViewInstance': createViewInstance,
11
+ 'ExtensionApi.dispatchViewEvent': dispatchViewEvent,
12
+ 'ExtensionApi.disposeViewInstance': disposeViewInstance,
10
13
  'ExtensionApi.executeCommand': executeCommand,
11
14
  'ExtensionApi.executeCompletionProvider': executeCompletionProvider,
12
15
  'ExtensionApi.executeDiagnosticProvider': executeDiagnosticProvider,
@@ -22,4 +25,5 @@ export const commandMap = {
22
25
  'ExtensionApi.getOutputChannelRegistrySnapshot': getOutputChannelRegistrySnapshot,
23
26
  'ExtensionApi.getStatusBarItems': getStatusBarItems,
24
27
  'ExtensionApi.getViewRegistrySnapshot': getViewRegistrySnapshot,
28
+ 'ExtensionApi.saveViewInstanceState': saveViewInstanceState,
25
29
  };
@@ -1,6 +1,9 @@
1
1
  export declare const commandMap: {
2
2
  'HandleMessagePort.handleExtensionManagementMessagePort': (port: MessagePort) => Promise<void>;
3
3
  initialize(type: string, port: MessagePort): Promise<void>;
4
+ 'ExtensionApi.createViewInstance': (viewId: string, uid: number, context?: import("../View/View.ts").ViewContext) => Promise<import("../View/View.ts").ViewRenderResult>;
5
+ 'ExtensionApi.dispatchViewEvent': (uid: number, event: import("../View/View.ts").ViewEvent) => Promise<import("../View/View.ts").ViewRenderResult>;
6
+ 'ExtensionApi.disposeViewInstance': (uid: number) => Promise<void>;
4
7
  'ExtensionApi.executeCommand': (id: string, ...args: readonly unknown[]) => Promise<unknown>;
5
8
  'ExtensionApi.executeCompletionProvider': (textDocument: import("../CompletionTextDocument/CompletionTextDocument.ts").TextDocument, offset: number, ...args: readonly unknown[]) => Promise<readonly import("../CompletionItem/CompletionItem.ts").CompletionItem[]>;
6
9
  'ExtensionApi.executeDiagnosticProvider': (textDocument: import("../DiagnosticTextDocument/DiagnosticTextDocument.ts").TextDocument, ...args: readonly unknown[]) => Promise<readonly import("../DiagnosticResult/DiagnosticResult.ts").Diagnostic[]>;
@@ -16,4 +19,5 @@ export declare const commandMap: {
16
19
  'ExtensionApi.getOutputChannelRegistrySnapshot': () => import("../OutputChannelRegistrySnapshot/OutputChannelRegistrySnapshot.ts").OutputChannelRegistrySnapshot;
17
20
  'ExtensionApi.getStatusBarItems': () => readonly import("../StatusBarItem/StatusBarItem.ts").StatusBarItem[];
18
21
  'ExtensionApi.getViewRegistrySnapshot': () => import("../View/View.ts").ViewRegistrySnapshot;
22
+ 'ExtensionApi.saveViewInstanceState': (uid: number) => Promise<unknown>;
19
23
  };
@@ -28,7 +28,10 @@ export const executeFormattingProvider = async (textDocument, ...args) => {
28
28
  export const getFormattingProviders = registry.getProviders;
29
29
  export const getFormattingProviderRegistrySnapshot = () => {
30
30
  return {
31
- providers: registry.getProviders(),
31
+ providers: registry.getProviders().map((provider) => ({
32
+ id: provider.id,
33
+ languageId: provider.languageId,
34
+ })),
32
35
  };
33
36
  };
34
37
  export const resetFormattingProviderRegistry = registry.reset;
@@ -1,4 +1,6 @@
1
- import type { RegisteredFormattingProvider } from '../RegisteredFormattingProvider/RegisteredFormattingProvider.ts';
2
1
  export interface FormattingProviderRegistrySnapshot {
3
- readonly providers: readonly RegisteredFormattingProvider[];
2
+ readonly providers: readonly {
3
+ readonly id: string;
4
+ readonly languageId: string;
5
+ }[];
4
6
  }
@@ -50,7 +50,10 @@ export const executeHoverProvider = async (textDocument, offset, ...args) => {
50
50
  export const getHoverProviders = registry.getProviders;
51
51
  export const getHoverProviderRegistrySnapshot = () => {
52
52
  return {
53
- providers: registry.getProviders(),
53
+ providers: registry.getProviders().map((provider) => ({
54
+ id: provider.id,
55
+ languageId: provider.languageId,
56
+ })),
54
57
  };
55
58
  };
56
59
  export const resetHoverProviderRegistry = registry.reset;
@@ -1,4 +1,6 @@
1
- import type { RegisteredHoverProvider } from '../RegisteredHoverProvider/RegisteredHoverProvider.ts';
2
1
  export interface HoverProviderRegistrySnapshot {
3
- readonly providers: readonly RegisteredHoverProvider[];
2
+ readonly providers: readonly {
3
+ readonly id: string;
4
+ readonly languageId: string;
5
+ }[];
4
6
  }
@@ -38,7 +38,9 @@ export const getStatusBarItems = () => {
38
38
  };
39
39
  export const getStatusBarItemProviderRegistrySnapshot = () => {
40
40
  return {
41
- providers: registry.getProviders(),
41
+ providers: registry.getProviders().map((provider) => ({
42
+ id: provider.id,
43
+ })),
42
44
  };
43
45
  };
44
46
  export const resetStatusBarItemProviderRegistry = registry.reset;
@@ -1,4 +1,5 @@
1
- import type { RegisteredStatusBarItemProvider } from '../RegisteredStatusBarItemProvider/RegisteredStatusBarItemProvider.ts';
2
1
  export interface StatusBarItemProviderRegistrySnapshot {
3
- readonly providers: readonly RegisteredStatusBarItemProvider[];
2
+ readonly providers: readonly {
3
+ readonly id: string;
4
+ }[];
4
5
  }
@@ -1,14 +1,43 @@
1
+ import type { VirtualDomNode } from '@lvce-editor/virtual-dom-worker';
2
+ export type ViewKind = 'virtualDom';
3
+ export interface ViewContext {
4
+ readonly state?: unknown;
5
+ readonly uid: number;
6
+ readonly viewId: string;
7
+ }
8
+ export interface ViewEvent {
9
+ readonly name?: string;
10
+ readonly type: string;
11
+ readonly value?: unknown;
12
+ }
13
+ export interface VirtualDomViewInstance {
14
+ readonly dispose?: () => unknown;
15
+ readonly handleEvent?: (event: ViewEvent) => unknown;
16
+ readonly render: () => readonly VirtualDomNode[] | Promise<readonly VirtualDomNode[]>;
17
+ readonly saveState?: () => unknown;
18
+ }
1
19
  export interface View {
2
- readonly create: () => unknown;
20
+ readonly create: (context?: ViewContext) => unknown;
3
21
  readonly icon?: string;
4
22
  readonly id: string;
23
+ readonly kind?: ViewKind;
5
24
  readonly title?: string;
6
25
  }
7
26
  export interface RegisteredView {
8
27
  readonly icon?: string;
9
28
  readonly id: string;
29
+ readonly kind?: ViewKind;
10
30
  readonly title?: string;
11
31
  }
12
32
  export interface ViewRegistrySnapshot {
13
33
  readonly views: readonly RegisteredView[];
14
34
  }
35
+ export interface ViewRenderResultDom {
36
+ readonly dom: readonly VirtualDomNode[];
37
+ readonly type: 'setDom';
38
+ }
39
+ export interface ViewRenderResultPatches {
40
+ readonly patches: readonly unknown[];
41
+ readonly type: 'setPatches';
42
+ }
43
+ export type ViewRenderResult = ViewRenderResultDom | ViewRenderResultPatches;
@@ -1,6 +1,10 @@
1
1
  import type { Disposable } from '../Disposable/Disposable.ts';
2
- import type { View, ViewRegistrySnapshot } from '../View/View.ts';
2
+ import type { View, ViewContext, ViewEvent, ViewRegistrySnapshot, ViewRenderResult } from '../View/View.ts';
3
3
  export declare const registerView: (view: View) => Disposable;
4
4
  export declare const executeViewProvider: (id: string) => unknown;
5
+ export declare const createViewInstance: (viewId: string, uid: number, context?: ViewContext) => Promise<ViewRenderResult>;
6
+ export declare const dispatchViewEvent: (uid: number, event: ViewEvent) => Promise<ViewRenderResult>;
7
+ export declare const disposeViewInstance: (uid: number) => Promise<void>;
8
+ export declare const saveViewInstanceState: (uid: number) => Promise<unknown>;
5
9
  export declare const getViewRegistrySnapshot: () => ViewRegistrySnapshot;
6
10
  export declare const resetViewRegistry: () => void;