@lvce-editor/extension-host-worker 8.16.0 → 8.17.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.
- package/dist/extension-api/index.js +1360 -0
- package/dist/extension-api/parts/Activation/Activation.js +13 -0
- package/dist/extension-api/parts/AssertCompletionProvider/AssertCompletionProvider.js +25 -0
- package/dist/extension-api/parts/AssertFormattingProvider/AssertFormattingProvider.js +22 -0
- package/dist/extension-api/parts/AssertStatusBarItemProvider/AssertStatusBarItemProvider.js +19 -0
- package/dist/extension-api/parts/Command/Command.js +0 -0
- package/dist/extension-api/parts/CommandCallback/CommandCallback.js +0 -0
- package/dist/extension-api/parts/CommandMap/CommandMap.js +14 -0
- package/dist/extension-api/parts/CommandRegistry/CommandRegistry.js +53 -0
- package/dist/extension-api/parts/CommandRegistrySnapshot/CommandRegistrySnapshot.js +0 -0
- package/dist/extension-api/parts/Completion/Completion.js +11 -0
- package/dist/extension-api/parts/CompletionItem/CompletionItem.js +0 -0
- package/dist/extension-api/parts/CompletionProvider/CompletionProvider.js +0 -0
- package/dist/extension-api/parts/CompletionProviderRegistry/CompletionProviderRegistry.js +78 -0
- package/dist/extension-api/parts/CompletionProviderRegistrySnapshot/CompletionProviderRegistrySnapshot.js +0 -0
- package/dist/extension-api/parts/CompletionProviderState/CompletionProviderState.js +10 -0
- package/dist/extension-api/parts/CompletionTextDocument/CompletionTextDocument.js +0 -0
- package/dist/extension-api/parts/Disposable/Disposable.js +0 -0
- package/dist/extension-api/parts/ExecuteCommand/ExecuteCommand.js +7 -0
- package/dist/extension-api/parts/ExecuteCompletionProvider/ExecuteCompletionProvider.js +5 -0
- package/dist/extension-api/parts/ExecuteFormattingProvider/ExecuteFormattingProvider.js +4 -0
- package/dist/extension-api/parts/ExtensionApiCommandMap/ExtensionApiCommandMap.js +17 -0
- package/dist/extension-api/parts/ExtensionApiError/ExtensionApiError.js +9 -0
- package/dist/extension-api/parts/ExtensionApiWorkerCommandMap/ExtensionApiWorkerCommandMap.js +15 -0
- package/dist/extension-api/parts/ExtensionApiWorkerHandleMessagePort/ExtensionApiWorkerHandleMessagePort.js +21 -0
- package/dist/extension-api/parts/ExtensionApiWorkerListen/ExtensionApiWorkerListen.js +11 -0
- package/dist/extension-api/parts/Formatting/Formatting.js +10 -0
- package/dist/extension-api/parts/FormattingEdit/FormattingEdit.js +0 -0
- package/dist/extension-api/parts/FormattingProvider/FormattingProvider.js +0 -0
- package/dist/extension-api/parts/FormattingProviderRegistry/FormattingProviderRegistry.js +42 -0
- package/dist/extension-api/parts/FormattingProviderRegistrySnapshot/FormattingProviderRegistrySnapshot.js +0 -0
- package/dist/extension-api/parts/FormattingProviderState/FormattingProviderState.js +10 -0
- package/dist/extension-api/parts/FormattingTextDocument/FormattingTextDocument.js +0 -0
- package/dist/extension-api/parts/GetCompletionProviderRegistrySnapshot/GetCompletionProviderRegistrySnapshot.js +4 -0
- package/dist/extension-api/parts/GetFormattingProviderRegistrySnapshot/GetFormattingProviderRegistrySnapshot.js +4 -0
- package/dist/extension-api/parts/GetStatusBarItemProviderRegistrySnapshot/GetStatusBarItemProviderRegistrySnapshot.js +4 -0
- package/dist/extension-api/parts/GetStatusBarItems/GetStatusBarItems.js +4 -0
- package/dist/extension-api/parts/HandleExtensionManagementMessagePort/HandleExtensionManagementMessagePort.js +17 -0
- package/dist/extension-api/parts/NotifyStatusBarChange/NotifyStatusBarChange.js +7 -0
- package/dist/extension-api/parts/ProviderRegistry/ProviderRegistry.js +95 -0
- package/dist/extension-api/parts/QuickPick/QuickPick.js +7 -0
- package/dist/extension-api/parts/QuickPickItem/QuickPickItem.js +0 -0
- package/dist/extension-api/parts/RegisterCompletionProvider/RegisterCompletionProvider.js +4 -0
- package/dist/extension-api/parts/RegisterFormattingProvider/RegisterFormattingProvider.js +4 -0
- package/dist/extension-api/parts/RegisterStatusBarItemProvider/RegisterStatusBarItemProvider.js +4 -0
- package/dist/extension-api/parts/RegisteredCommand/RegisteredCommand.js +0 -0
- package/dist/extension-api/parts/RegisteredCompletionProvider/RegisteredCompletionProvider.js +0 -0
- package/dist/extension-api/parts/RegisteredFormattingProvider/RegisteredFormattingProvider.js +0 -0
- package/dist/extension-api/parts/RegisteredStatusBarItemProvider/RegisteredStatusBarItemProvider.js +0 -0
- package/dist/extension-api/parts/ResetCompletionProviderRegistry/ResetCompletionProviderRegistry.js +4 -0
- package/dist/extension-api/parts/ResetFormattingProviderRegistry/ResetFormattingProviderRegistry.js +4 -0
- package/dist/extension-api/parts/ResetStatusBarItemProviderRegistry/ResetStatusBarItemProviderRegistry.js +4 -0
- package/dist/extension-api/parts/Rpc/Rpc.js +14 -0
- package/dist/extension-api/parts/ShowQuickPickOptions/ShowQuickPickOptions.js +0 -0
- package/dist/extension-api/parts/StatusBar/StatusBar.js +8 -0
- package/dist/extension-api/parts/StatusBarItem/StatusBarItem.js +0 -0
- package/dist/extension-api/parts/StatusBarItemProvider/StatusBarItemProvider.js +0 -0
- package/dist/extension-api/parts/StatusBarItemProviderHandle/StatusBarItemProviderHandle.js +0 -0
- package/dist/extension-api/parts/StatusBarItemProviderRegistry/StatusBarItemProviderRegistry.js +52 -0
- package/dist/extension-api/parts/StatusBarItemProviderRegistrySnapshot/StatusBarItemProviderRegistrySnapshot.js +0 -0
- package/dist/extension-api/parts/StatusBarItemProviderState/StatusBarItemProviderState.js +10 -0
- package/dist/extensionHostWorkerMain.js +1327 -1177
- package/package.json +1 -1
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { listen } from "../ExtensionApiWorkerListen/ExtensionApiWorkerListen.js";
|
|
2
|
+
import * as Rpc from "../Rpc/Rpc.js";
|
|
3
|
+
let rpcPromise;
|
|
4
|
+
const activate = async () => {
|
|
5
|
+
if (!rpcPromise) {
|
|
6
|
+
rpcPromise = listen();
|
|
7
|
+
}
|
|
8
|
+
const rpc = await rpcPromise;
|
|
9
|
+
Rpc.set(rpc);
|
|
10
|
+
};
|
|
11
|
+
export {
|
|
12
|
+
activate
|
|
13
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { hasCompletionProvider } from "../CompletionProviderState/CompletionProviderState.js";
|
|
2
|
+
import { ExtensionApiError } from "../ExtensionApiError/ExtensionApiError.js";
|
|
3
|
+
const assertCompletionProvider = (provider) => {
|
|
4
|
+
if (!provider) {
|
|
5
|
+
throw new ExtensionApiError("completion provider is not defined");
|
|
6
|
+
}
|
|
7
|
+
if (!provider.id) {
|
|
8
|
+
throw new ExtensionApiError("completion provider is missing id");
|
|
9
|
+
}
|
|
10
|
+
if (!provider.languageId) {
|
|
11
|
+
throw new ExtensionApiError(`completion provider ${provider.id} is missing languageId`);
|
|
12
|
+
}
|
|
13
|
+
if (typeof provider.provideCompletions !== "function") {
|
|
14
|
+
throw new ExtensionApiError(`completion provider ${provider.id} is missing provideCompletions function`);
|
|
15
|
+
}
|
|
16
|
+
if (provider.resolveCompletionItem !== void 0 && typeof provider.resolveCompletionItem !== "function") {
|
|
17
|
+
throw new ExtensionApiError(`completion provider ${provider.id} has invalid resolveCompletionItem function`);
|
|
18
|
+
}
|
|
19
|
+
if (hasCompletionProvider(provider.id)) {
|
|
20
|
+
throw new ExtensionApiError(`completion provider ${provider.id} is already registered`);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
export {
|
|
24
|
+
assertCompletionProvider
|
|
25
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ExtensionApiError } from "../ExtensionApiError/ExtensionApiError.js";
|
|
2
|
+
import { hasFormattingProvider } from "../FormattingProviderState/FormattingProviderState.js";
|
|
3
|
+
const assertFormattingProvider = (provider) => {
|
|
4
|
+
if (!provider) {
|
|
5
|
+
throw new ExtensionApiError("formatting provider is not defined");
|
|
6
|
+
}
|
|
7
|
+
if (typeof provider.id !== "string" || provider.id.length === 0) {
|
|
8
|
+
throw new ExtensionApiError("formatting provider is missing id");
|
|
9
|
+
}
|
|
10
|
+
if (typeof provider.languageId !== "string" || provider.languageId.length === 0) {
|
|
11
|
+
throw new ExtensionApiError(`formatting provider ${provider.id} is missing languageId`);
|
|
12
|
+
}
|
|
13
|
+
if (typeof provider.format !== "function") {
|
|
14
|
+
throw new ExtensionApiError(`formatting provider ${provider.id} is missing format function`);
|
|
15
|
+
}
|
|
16
|
+
if (hasFormattingProvider(provider.id)) {
|
|
17
|
+
throw new ExtensionApiError(`formatting provider ${provider.id} is already registered`);
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
export {
|
|
21
|
+
assertFormattingProvider
|
|
22
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ExtensionApiError } from "../ExtensionApiError/ExtensionApiError.js";
|
|
2
|
+
import { hasStatusBarItemProvider } from "../StatusBarItemProviderState/StatusBarItemProviderState.js";
|
|
3
|
+
const assertStatusBarItemProvider = (provider) => {
|
|
4
|
+
if (!provider) {
|
|
5
|
+
throw new ExtensionApiError("status bar item provider is not defined");
|
|
6
|
+
}
|
|
7
|
+
if (typeof provider.id !== "string" || provider.id.length === 0) {
|
|
8
|
+
throw new ExtensionApiError("status bar item provider is missing id");
|
|
9
|
+
}
|
|
10
|
+
if (typeof provider.getStatusBarItem !== "function") {
|
|
11
|
+
throw new ExtensionApiError(`status bar item provider ${provider.id} is missing getStatusBarItem function`);
|
|
12
|
+
}
|
|
13
|
+
if (hasStatusBarItemProvider(provider.id)) {
|
|
14
|
+
throw new ExtensionApiError(`status bar item provider ${provider.id} is already registered`);
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
export {
|
|
18
|
+
assertStatusBarItemProvider
|
|
19
|
+
};
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { commandMap as extensionApiCommandMap } from "../ExtensionApiCommandMap/ExtensionApiCommandMap.js";
|
|
2
|
+
import { handleExtensionManagementMessagePort } from "../ExtensionApiWorkerHandleMessagePort/ExtensionApiWorkerHandleMessagePort.js";
|
|
3
|
+
const commandMap = {
|
|
4
|
+
...extensionApiCommandMap,
|
|
5
|
+
async initialize(type, port) {
|
|
6
|
+
if (type !== "message-port") {
|
|
7
|
+
throw new Error(`unsupported initialize type ${type}`);
|
|
8
|
+
}
|
|
9
|
+
await handleExtensionManagementMessagePort(port);
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
export {
|
|
13
|
+
commandMap
|
|
14
|
+
};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { ExtensionApiError } from "../ExtensionApiError/ExtensionApiError.js";
|
|
2
|
+
const commands = /* @__PURE__ */ Object.create(null);
|
|
3
|
+
const assertCommand = (command) => {
|
|
4
|
+
if (!command) {
|
|
5
|
+
throw new ExtensionApiError("command is not defined");
|
|
6
|
+
}
|
|
7
|
+
if (typeof command.id !== "string" || command.id.length === 0) {
|
|
8
|
+
throw new ExtensionApiError("command is missing id");
|
|
9
|
+
}
|
|
10
|
+
if (typeof command.execute !== "function") {
|
|
11
|
+
throw new ExtensionApiError(`command ${command.id} is missing execute function`);
|
|
12
|
+
}
|
|
13
|
+
if (command.id in commands) {
|
|
14
|
+
throw new ExtensionApiError(`command ${command.id} is already registered`);
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
const registerCommand = (command) => {
|
|
18
|
+
assertCommand(command);
|
|
19
|
+
commands[command.id] = {
|
|
20
|
+
execute(...args) {
|
|
21
|
+
return command.execute(...args);
|
|
22
|
+
},
|
|
23
|
+
id: command.id
|
|
24
|
+
};
|
|
25
|
+
return {
|
|
26
|
+
dispose() {
|
|
27
|
+
delete commands[command.id];
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
const getCommandRegistrySnapshot = () => {
|
|
32
|
+
return {
|
|
33
|
+
commands: Object.values(commands)
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
const executeCommand = async (id, ...args) => {
|
|
37
|
+
const command = commands[id];
|
|
38
|
+
if (!command) {
|
|
39
|
+
throw new ExtensionApiError(`command ${id} not found`);
|
|
40
|
+
}
|
|
41
|
+
return command.execute(...args);
|
|
42
|
+
};
|
|
43
|
+
const resetCommandRegistry = () => {
|
|
44
|
+
for (const id of Object.keys(commands)) {
|
|
45
|
+
delete commands[id];
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
export {
|
|
49
|
+
executeCommand,
|
|
50
|
+
getCommandRegistrySnapshot,
|
|
51
|
+
registerCommand,
|
|
52
|
+
resetCommandRegistry
|
|
53
|
+
};
|
|
File without changes
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { executeCompletionProvider, executeResolveCompletionItemProvider } from "../ExecuteCompletionProvider/ExecuteCompletionProvider.js";
|
|
2
|
+
import { getCompletionProviderRegistrySnapshot } from "../GetCompletionProviderRegistrySnapshot/GetCompletionProviderRegistrySnapshot.js";
|
|
3
|
+
import { registerCompletionProvider } from "../RegisterCompletionProvider/RegisterCompletionProvider.js";
|
|
4
|
+
import { resetCompletionProviderRegistry } from "../ResetCompletionProviderRegistry/ResetCompletionProviderRegistry.js";
|
|
5
|
+
export {
|
|
6
|
+
executeCompletionProvider,
|
|
7
|
+
executeResolveCompletionItemProvider,
|
|
8
|
+
getCompletionProviderRegistrySnapshot,
|
|
9
|
+
registerCompletionProvider,
|
|
10
|
+
resetCompletionProviderRegistry
|
|
11
|
+
};
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { ExtensionApiError } from "../ExtensionApiError/ExtensionApiError.js";
|
|
2
|
+
import { createProviderRegistry } from "../ProviderRegistry/ProviderRegistry.js";
|
|
3
|
+
const getType = (value) => {
|
|
4
|
+
if (value === null) {
|
|
5
|
+
return "null";
|
|
6
|
+
}
|
|
7
|
+
if (typeof value === "string") {
|
|
8
|
+
return JSON.stringify(value);
|
|
9
|
+
}
|
|
10
|
+
return typeof value;
|
|
11
|
+
};
|
|
12
|
+
const validateCompletionResult = (completion) => {
|
|
13
|
+
if (!Array.isArray(completion)) {
|
|
14
|
+
throw new ExtensionApiError(`invalid completion result: completion must be of type array but is ${getType(completion)}`);
|
|
15
|
+
}
|
|
16
|
+
for (const item of completion) {
|
|
17
|
+
if (!item || typeof item !== "object" || Array.isArray(item)) {
|
|
18
|
+
throw new ExtensionApiError(`invalid completion result: expected completion item to be of type object but was of type ${getType(item)}`);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return completion;
|
|
22
|
+
};
|
|
23
|
+
const registry = createProviderRegistry({
|
|
24
|
+
mapProvider(provider) {
|
|
25
|
+
return {
|
|
26
|
+
id: provider.id,
|
|
27
|
+
languageId: provider.languageId,
|
|
28
|
+
provideCompletions(textDocument, offset, ...args) {
|
|
29
|
+
return provider.provideCompletions(textDocument, offset, ...args);
|
|
30
|
+
},
|
|
31
|
+
resolveCompletionItem: provider.resolveCompletionItem ? (textDocument, offset, name, completionItem, ...args) => provider.resolveCompletionItem?.(textDocument, offset, name, completionItem, ...args) : void 0
|
|
32
|
+
};
|
|
33
|
+
},
|
|
34
|
+
optionalMethods: ["resolveCompletionItem"],
|
|
35
|
+
providerName: "completion provider",
|
|
36
|
+
requiredMethods: ["provideCompletions"],
|
|
37
|
+
requireLanguageId: true
|
|
38
|
+
});
|
|
39
|
+
const hasCompletionProvider = registry.hasProvider;
|
|
40
|
+
const registerCompletionProvider = (provider) => {
|
|
41
|
+
const registeredProvider = registry.registerProvider(provider);
|
|
42
|
+
return {
|
|
43
|
+
dispose() {
|
|
44
|
+
registry.deleteProvider(registeredProvider.id);
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
const executeCompletionProvider = async (textDocument, offset, ...args) => {
|
|
49
|
+
return registry.executeProviderByLanguageId(
|
|
50
|
+
textDocument.languageId,
|
|
51
|
+
"provideCompletions",
|
|
52
|
+
[textDocument, offset, ...args],
|
|
53
|
+
validateCompletionResult
|
|
54
|
+
);
|
|
55
|
+
};
|
|
56
|
+
const executeResolveCompletionItemProvider = async (textDocument, offset, name, completionItem, ...args) => {
|
|
57
|
+
const provider = registry.getProviderByLanguageId(textDocument.languageId);
|
|
58
|
+
if (!provider) {
|
|
59
|
+
throw new ExtensionApiError(`No completion provider found for ${textDocument.languageId}`);
|
|
60
|
+
}
|
|
61
|
+
return provider.resolveCompletionItem?.(textDocument, offset, name, completionItem, ...args);
|
|
62
|
+
};
|
|
63
|
+
const getCompletionProviders = registry.getProviders;
|
|
64
|
+
const getCompletionProviderRegistrySnapshot = () => {
|
|
65
|
+
return {
|
|
66
|
+
providers: registry.getProviders()
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
const resetCompletionProviderRegistry = registry.reset;
|
|
70
|
+
export {
|
|
71
|
+
executeCompletionProvider,
|
|
72
|
+
executeResolveCompletionItemProvider,
|
|
73
|
+
getCompletionProviderRegistrySnapshot,
|
|
74
|
+
getCompletionProviders,
|
|
75
|
+
hasCompletionProvider,
|
|
76
|
+
registerCompletionProvider,
|
|
77
|
+
resetCompletionProviderRegistry
|
|
78
|
+
};
|
|
File without changes
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getCompletionProviders,
|
|
3
|
+
hasCompletionProvider,
|
|
4
|
+
resetCompletionProviderRegistry
|
|
5
|
+
} from "../CompletionProviderRegistry/CompletionProviderRegistry.js";
|
|
6
|
+
export {
|
|
7
|
+
resetCompletionProviderRegistry as clearCompletionProviders,
|
|
8
|
+
getCompletionProviders,
|
|
9
|
+
hasCompletionProvider
|
|
10
|
+
};
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { executeCommand, getCommandRegistrySnapshot } from "../CommandRegistry/CommandRegistry.js";
|
|
2
|
+
import { executeCompletionProvider, executeResolveCompletionItemProvider, getCompletionProviderRegistrySnapshot } from "../Completion/Completion.js";
|
|
3
|
+
import { executeFormattingProvider, getFormattingProviderRegistrySnapshot } from "../Formatting/Formatting.js";
|
|
4
|
+
import { getStatusBarItems } from "../GetStatusBarItems/GetStatusBarItems.js";
|
|
5
|
+
const commandMap = {
|
|
6
|
+
"ExtensionApi.executeCommand": executeCommand,
|
|
7
|
+
"ExtensionApi.executeCompletionProvider": executeCompletionProvider,
|
|
8
|
+
"ExtensionApi.executeFormattingProvider": executeFormattingProvider,
|
|
9
|
+
"ExtensionApi.executeResolveCompletionItemProvider": executeResolveCompletionItemProvider,
|
|
10
|
+
"ExtensionApi.getCommandRegistrySnapshot": getCommandRegistrySnapshot,
|
|
11
|
+
"ExtensionApi.getCompletionProviderRegistrySnapshot": getCompletionProviderRegistrySnapshot,
|
|
12
|
+
"ExtensionApi.getFormattingProviderRegistrySnapshot": getFormattingProviderRegistrySnapshot,
|
|
13
|
+
"ExtensionApi.getStatusBarItems": getStatusBarItems
|
|
14
|
+
};
|
|
15
|
+
export {
|
|
16
|
+
commandMap
|
|
17
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { commandMap as extensionApiCommandMap } from "../ExtensionApiCommandMap/ExtensionApiCommandMap.js";
|
|
2
|
+
import { handleExtensionManagementMessagePort } from "../ExtensionApiWorkerHandleMessagePort/ExtensionApiWorkerHandleMessagePort.js";
|
|
3
|
+
const commandMap = {
|
|
4
|
+
...extensionApiCommandMap,
|
|
5
|
+
"HandleMessagePort.handleExtensionManagementMessagePort": handleExtensionManagementMessagePort,
|
|
6
|
+
async initialize(type, port) {
|
|
7
|
+
if (type !== "message-port") {
|
|
8
|
+
throw new Error(`unsupported initialize type ${type}`);
|
|
9
|
+
}
|
|
10
|
+
await handleExtensionManagementMessagePort(port);
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
export {
|
|
14
|
+
commandMap
|
|
15
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { PlainMessagePortRpc } from "@lvce-editor/rpc";
|
|
2
|
+
import * as ExtensionApiCommandMap from "../ExtensionApiCommandMap/ExtensionApiCommandMap.js";
|
|
3
|
+
const commandMap = {
|
|
4
|
+
...ExtensionApiCommandMap.commandMap,
|
|
5
|
+
async initialize(type, port) {
|
|
6
|
+
if (type !== "message-port") {
|
|
7
|
+
throw new Error(`unsupported initialize type ${type}`);
|
|
8
|
+
}
|
|
9
|
+
await handleExtensionManagementMessagePort(port);
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
const handleExtensionManagementMessagePort = async (port) => {
|
|
13
|
+
await PlainMessagePortRpc.create({
|
|
14
|
+
commandMap,
|
|
15
|
+
isMessagePortOpen: true,
|
|
16
|
+
messagePort: port
|
|
17
|
+
});
|
|
18
|
+
};
|
|
19
|
+
export {
|
|
20
|
+
handleExtensionManagementMessagePort
|
|
21
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { WebWorkerRpcClient } from "@lvce-editor/rpc";
|
|
2
|
+
import * as ExtensionApiWorkerCommandMap from "../ExtensionApiWorkerCommandMap/ExtensionApiWorkerCommandMap.js";
|
|
3
|
+
const listen = async () => {
|
|
4
|
+
const rpc = WebWorkerRpcClient.create({
|
|
5
|
+
commandMap: ExtensionApiWorkerCommandMap.commandMap
|
|
6
|
+
});
|
|
7
|
+
return rpc;
|
|
8
|
+
};
|
|
9
|
+
export {
|
|
10
|
+
listen
|
|
11
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { executeFormattingProvider } from "../ExecuteFormattingProvider/ExecuteFormattingProvider.js";
|
|
2
|
+
import { getFormattingProviderRegistrySnapshot } from "../GetFormattingProviderRegistrySnapshot/GetFormattingProviderRegistrySnapshot.js";
|
|
3
|
+
import { registerFormattingProvider } from "../RegisterFormattingProvider/RegisterFormattingProvider.js";
|
|
4
|
+
import { resetFormattingProviderRegistry } from "../ResetFormattingProviderRegistry/ResetFormattingProviderRegistry.js";
|
|
5
|
+
export {
|
|
6
|
+
executeFormattingProvider,
|
|
7
|
+
getFormattingProviderRegistrySnapshot,
|
|
8
|
+
registerFormattingProvider,
|
|
9
|
+
resetFormattingProviderRegistry
|
|
10
|
+
};
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { createProviderRegistry } from "../ProviderRegistry/ProviderRegistry.js";
|
|
2
|
+
const registry = createProviderRegistry({
|
|
3
|
+
mapProvider(provider) {
|
|
4
|
+
return {
|
|
5
|
+
format(textDocument, ...args) {
|
|
6
|
+
return provider.format(textDocument, ...args);
|
|
7
|
+
},
|
|
8
|
+
id: provider.id,
|
|
9
|
+
languageId: provider.languageId
|
|
10
|
+
};
|
|
11
|
+
},
|
|
12
|
+
providerName: "formatting provider",
|
|
13
|
+
requiredMethods: ["format"],
|
|
14
|
+
requireLanguageId: true
|
|
15
|
+
});
|
|
16
|
+
const hasFormattingProvider = registry.hasProvider;
|
|
17
|
+
const registerFormattingProvider = (provider) => {
|
|
18
|
+
const registeredProvider = registry.registerProvider(provider);
|
|
19
|
+
return {
|
|
20
|
+
dispose() {
|
|
21
|
+
registry.deleteProvider(registeredProvider.id);
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
const executeFormattingProvider = async (textDocument, ...args) => {
|
|
26
|
+
return registry.executeProviderByLanguageId(textDocument.languageId, "format", [textDocument, ...args]);
|
|
27
|
+
};
|
|
28
|
+
const getFormattingProviders = registry.getProviders;
|
|
29
|
+
const getFormattingProviderRegistrySnapshot = () => {
|
|
30
|
+
return {
|
|
31
|
+
providers: registry.getProviders()
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
const resetFormattingProviderRegistry = registry.reset;
|
|
35
|
+
export {
|
|
36
|
+
executeFormattingProvider,
|
|
37
|
+
getFormattingProviderRegistrySnapshot,
|
|
38
|
+
getFormattingProviders,
|
|
39
|
+
hasFormattingProvider,
|
|
40
|
+
registerFormattingProvider,
|
|
41
|
+
resetFormattingProviderRegistry
|
|
42
|
+
};
|
|
File without changes
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getFormattingProviders,
|
|
3
|
+
hasFormattingProvider,
|
|
4
|
+
resetFormattingProviderRegistry
|
|
5
|
+
} from "../FormattingProviderRegistry/FormattingProviderRegistry.js";
|
|
6
|
+
export {
|
|
7
|
+
resetFormattingProviderRegistry as clearFormattingProviders,
|
|
8
|
+
getFormattingProviders,
|
|
9
|
+
hasFormattingProvider
|
|
10
|
+
};
|
|
File without changes
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { commandMap as extensionApiCommandMap } from "../CommandMap/CommandMap.js";
|
|
2
|
+
const handleExtensionManagementMessagePort = async ({
|
|
3
|
+
commandMap,
|
|
4
|
+
createMessagePortRpcClient,
|
|
5
|
+
port
|
|
6
|
+
}) => {
|
|
7
|
+
await createMessagePortRpcClient({
|
|
8
|
+
commandMap: {
|
|
9
|
+
...extensionApiCommandMap,
|
|
10
|
+
...commandMap
|
|
11
|
+
},
|
|
12
|
+
messagePort: port
|
|
13
|
+
});
|
|
14
|
+
};
|
|
15
|
+
export {
|
|
16
|
+
handleExtensionManagementMessagePort
|
|
17
|
+
};
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { ExtensionApiError } from "../ExtensionApiError/ExtensionApiError.js";
|
|
2
|
+
const getProviderMethod = (provider, methodName) => {
|
|
3
|
+
const method = provider[methodName];
|
|
4
|
+
if (typeof method !== "function") {
|
|
5
|
+
return void 0;
|
|
6
|
+
}
|
|
7
|
+
return method;
|
|
8
|
+
};
|
|
9
|
+
const assertProviderMethod = (provider, providerName, providerId, methodName) => {
|
|
10
|
+
if (typeof provider[methodName] !== "function") {
|
|
11
|
+
throw new ExtensionApiError(`${providerName} ${providerId} is missing ${methodName} function`);
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
const assertOptionalProviderMethod = (provider, providerName, providerId, methodName) => {
|
|
15
|
+
if (provider[methodName] !== void 0 && typeof provider[methodName] !== "function") {
|
|
16
|
+
throw new ExtensionApiError(`${providerName} ${providerId} has invalid ${methodName} function`);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
const createProviderRegistry = ({
|
|
20
|
+
mapProvider,
|
|
21
|
+
optionalMethods = [],
|
|
22
|
+
providerName,
|
|
23
|
+
requiredMethods,
|
|
24
|
+
requireLanguageId = false
|
|
25
|
+
}) => {
|
|
26
|
+
const providers = /* @__PURE__ */ Object.create(null);
|
|
27
|
+
const hasProvider = (id) => {
|
|
28
|
+
return id in providers;
|
|
29
|
+
};
|
|
30
|
+
const registerProvider = (provider) => {
|
|
31
|
+
if (!provider) {
|
|
32
|
+
throw new ExtensionApiError(`${providerName} is not defined`);
|
|
33
|
+
}
|
|
34
|
+
const providerRecord = provider;
|
|
35
|
+
const { id } = providerRecord;
|
|
36
|
+
if (typeof id !== "string" || id.length === 0) {
|
|
37
|
+
throw new ExtensionApiError(`${providerName} is missing id`);
|
|
38
|
+
}
|
|
39
|
+
if (requireLanguageId && (typeof providerRecord.languageId !== "string" || providerRecord.languageId.length === 0)) {
|
|
40
|
+
throw new ExtensionApiError(`${providerName} ${id} is missing languageId`);
|
|
41
|
+
}
|
|
42
|
+
for (const methodName of requiredMethods) {
|
|
43
|
+
assertProviderMethod(providerRecord, providerName, id, methodName);
|
|
44
|
+
}
|
|
45
|
+
for (const methodName of optionalMethods) {
|
|
46
|
+
assertOptionalProviderMethod(providerRecord, providerName, id, methodName);
|
|
47
|
+
}
|
|
48
|
+
if (hasProvider(id)) {
|
|
49
|
+
throw new ExtensionApiError(`${providerName} ${id} is already registered`);
|
|
50
|
+
}
|
|
51
|
+
const registeredProvider = mapProvider(provider);
|
|
52
|
+
providers[registeredProvider.id] = registeredProvider;
|
|
53
|
+
return registeredProvider;
|
|
54
|
+
};
|
|
55
|
+
const deleteProvider = (id) => {
|
|
56
|
+
delete providers[id];
|
|
57
|
+
};
|
|
58
|
+
const getProviders = () => {
|
|
59
|
+
return Object.values(providers);
|
|
60
|
+
};
|
|
61
|
+
const getProviderByLanguageId = (languageId) => {
|
|
62
|
+
return getProviders().find((provider) => {
|
|
63
|
+
return "languageId" in provider && provider.languageId === languageId;
|
|
64
|
+
});
|
|
65
|
+
};
|
|
66
|
+
const reset = () => {
|
|
67
|
+
for (const id of Object.keys(providers)) {
|
|
68
|
+
delete providers[id];
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
const executeProviderByLanguageId = async (languageId, methodName, args, validateResult) => {
|
|
72
|
+
const provider = getProviderByLanguageId(languageId);
|
|
73
|
+
if (!provider) {
|
|
74
|
+
throw new ExtensionApiError(`No ${providerName} found for ${languageId}`);
|
|
75
|
+
}
|
|
76
|
+
const method = getProviderMethod(provider, methodName);
|
|
77
|
+
if (!method) {
|
|
78
|
+
throw new ExtensionApiError(`${providerName} ${provider.id} is missing ${methodName} function`);
|
|
79
|
+
}
|
|
80
|
+
const result = await method(...args);
|
|
81
|
+
return validateResult ? validateResult(result) : result;
|
|
82
|
+
};
|
|
83
|
+
return {
|
|
84
|
+
deleteProvider,
|
|
85
|
+
executeProviderByLanguageId,
|
|
86
|
+
getProviderByLanguageId,
|
|
87
|
+
getProviders,
|
|
88
|
+
hasProvider,
|
|
89
|
+
registerProvider,
|
|
90
|
+
reset
|
|
91
|
+
};
|
|
92
|
+
};
|
|
93
|
+
export {
|
|
94
|
+
createProviderRegistry
|
|
95
|
+
};
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
package/dist/extension-api/parts/RegisteredStatusBarItemProvider/RegisteredStatusBarItemProvider.js
ADDED
|
File without changes
|