@lvce-editor/extension-host-worker 8.19.0 → 8.24.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 +470 -52
- package/dist/extension-api/parts/Activation/Activation.js +4 -2
- package/dist/extension-api/parts/Diagnostic/Diagnostic.js +10 -0
- package/dist/extension-api/parts/DiagnosticProvider/DiagnosticProvider.js +0 -0
- package/dist/extension-api/parts/DiagnosticProviderRegistry/DiagnosticProviderRegistry.js +66 -0
- package/dist/extension-api/parts/DiagnosticProviderRegistrySnapshot/DiagnosticProviderRegistrySnapshot.js +0 -0
- package/dist/extension-api/parts/DiagnosticResult/DiagnosticResult.js +0 -0
- package/dist/extension-api/parts/DiagnosticTextDocument/DiagnosticTextDocument.js +0 -0
- package/dist/extension-api/parts/ExecuteCommand/ExecuteCommand.js +2 -2
- package/dist/extension-api/parts/ExecuteDiagnosticProvider/ExecuteDiagnosticProvider.js +4 -0
- package/dist/extension-api/parts/ExtensionApiCommandMap/ExtensionApiCommandMap.js +9 -1
- package/dist/extension-api/parts/GetDiagnosticProviderRegistrySnapshot/GetDiagnosticProviderRegistrySnapshot.js +4 -0
- package/dist/extension-api/parts/NotifyStatusBarChange/NotifyStatusBarChange.js +2 -2
- package/dist/extension-api/parts/OutputChannel/OutputChannel.js +71 -0
- package/dist/extension-api/parts/OutputChannelHandle/OutputChannelHandle.js +0 -0
- package/dist/extension-api/parts/OutputChannelRegistrySnapshot/OutputChannelRegistrySnapshot.js +0 -0
- package/dist/extension-api/parts/QuickPick/QuickPick.js +2 -2
- package/dist/extension-api/parts/RegisterDiagnosticProvider/RegisterDiagnosticProvider.js +4 -0
- package/dist/extension-api/parts/RegisteredDiagnosticProvider/RegisteredDiagnosticProvider.js +0 -0
- package/dist/extension-api/parts/RegisteredOutputChannel/RegisteredOutputChannel.js +0 -0
- package/dist/extension-api/parts/ResetDiagnosticProviderRegistry/ResetDiagnosticProviderRegistry.js +4 -0
- package/dist/extension-api/parts/View/View.js +0 -0
- package/dist/extension-api/parts/ViewRegistry/ViewRegistry.js +55 -0
- package/dist/extensionHostWorkerMain.js +142 -45
- package/extension-api/dist/index.d.ts +8 -0
- package/extension-api/dist/index.js +3 -0
- package/extension-api/dist/parts/Activation/Activation.js +4 -2
- package/extension-api/dist/parts/CommandMap/CommandMap.d.ts +5 -0
- package/extension-api/dist/parts/Diagnostic/Diagnostic.d.ts +9 -0
- package/extension-api/dist/parts/Diagnostic/Diagnostic.js +4 -0
- package/extension-api/dist/parts/DiagnosticProvider/DiagnosticProvider.d.ts +7 -0
- package/extension-api/dist/parts/DiagnosticProvider/DiagnosticProvider.js +1 -0
- package/extension-api/dist/parts/DiagnosticProviderRegistry/DiagnosticProviderRegistry.d.ts +12 -0
- package/extension-api/dist/parts/DiagnosticProviderRegistry/DiagnosticProviderRegistry.js +58 -0
- package/extension-api/dist/parts/DiagnosticProviderRegistrySnapshot/DiagnosticProviderRegistrySnapshot.d.ts +4 -0
- package/extension-api/dist/parts/DiagnosticProviderRegistrySnapshot/DiagnosticProviderRegistrySnapshot.js +1 -0
- package/extension-api/dist/parts/DiagnosticResult/DiagnosticResult.d.ts +11 -0
- package/extension-api/dist/parts/DiagnosticResult/DiagnosticResult.js +1 -0
- package/extension-api/dist/parts/DiagnosticTextDocument/DiagnosticTextDocument.d.ts +6 -0
- package/extension-api/dist/parts/DiagnosticTextDocument/DiagnosticTextDocument.js +1 -0
- package/extension-api/dist/parts/ExecuteCommand/ExecuteCommand.js +2 -2
- package/extension-api/dist/parts/ExecuteDiagnosticProvider/ExecuteDiagnosticProvider.d.ts +1 -0
- package/extension-api/dist/parts/ExecuteDiagnosticProvider/ExecuteDiagnosticProvider.js +1 -0
- package/extension-api/dist/parts/ExtensionApiCommandMap/ExtensionApiCommandMap.d.ts +5 -0
- package/extension-api/dist/parts/ExtensionApiCommandMap/ExtensionApiCommandMap.js +8 -0
- package/extension-api/dist/parts/ExtensionApiWorkerCommandMap/ExtensionApiWorkerCommandMap.d.ts +5 -0
- package/extension-api/dist/parts/GetDiagnosticProviderRegistrySnapshot/GetDiagnosticProviderRegistrySnapshot.d.ts +1 -0
- package/extension-api/dist/parts/GetDiagnosticProviderRegistrySnapshot/GetDiagnosticProviderRegistrySnapshot.js +1 -0
- package/extension-api/dist/parts/NotifyStatusBarChange/NotifyStatusBarChange.js +2 -2
- package/extension-api/dist/parts/OutputChannel/OutputChannel.d.ts +9 -0
- package/extension-api/dist/parts/OutputChannel/OutputChannel.js +64 -0
- package/extension-api/dist/parts/OutputChannelHandle/OutputChannelHandle.d.ts +6 -0
- package/extension-api/dist/parts/OutputChannelHandle/OutputChannelHandle.js +1 -0
- package/extension-api/dist/parts/OutputChannelRegistrySnapshot/OutputChannelRegistrySnapshot.d.ts +4 -0
- package/extension-api/dist/parts/OutputChannelRegistrySnapshot/OutputChannelRegistrySnapshot.js +1 -0
- package/extension-api/dist/parts/QuickPick/QuickPick.js +2 -2
- package/extension-api/dist/parts/RegisterDiagnosticProvider/RegisterDiagnosticProvider.d.ts +1 -0
- package/extension-api/dist/parts/RegisterDiagnosticProvider/RegisterDiagnosticProvider.js +1 -0
- package/extension-api/dist/parts/RegisteredDiagnosticProvider/RegisteredDiagnosticProvider.d.ts +7 -0
- package/extension-api/dist/parts/RegisteredDiagnosticProvider/RegisteredDiagnosticProvider.js +1 -0
- package/extension-api/dist/parts/RegisteredOutputChannel/RegisteredOutputChannel.d.ts +3 -0
- package/extension-api/dist/parts/RegisteredOutputChannel/RegisteredOutputChannel.js +1 -0
- package/extension-api/dist/parts/ResetDiagnosticProviderRegistry/ResetDiagnosticProviderRegistry.d.ts +1 -0
- package/extension-api/dist/parts/ResetDiagnosticProviderRegistry/ResetDiagnosticProviderRegistry.js +1 -0
- package/extension-api/dist/parts/View/View.d.ts +14 -0
- package/extension-api/dist/parts/View/View.js +1 -0
- package/extension-api/dist/parts/ViewRegistry/ViewRegistry.d.ts +6 -0
- package/extension-api/dist/parts/ViewRegistry/ViewRegistry.js +49 -0
- package/extension-api/package.json +3 -2
- package/extension-api/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/dist/extension-api/parts/Rpc/Rpc.js +0 -14
- package/extension-api/dist/parts/Rpc/Rpc.d.ts +0 -3
- package/extension-api/dist/parts/Rpc/Rpc.js +0 -10
|
@@ -1,12 +1,14 @@
|
|
|
1
|
+
import { ExtensionManagementWorker } from "@lvce-editor/rpc-registry";
|
|
1
2
|
import { listen } from "../ExtensionApiWorkerListen/ExtensionApiWorkerListen.js";
|
|
2
|
-
import
|
|
3
|
+
import { activateOutputChannels } from "../OutputChannel/OutputChannel.js";
|
|
3
4
|
let rpcPromise;
|
|
4
5
|
const activate = async () => {
|
|
5
6
|
if (!rpcPromise) {
|
|
6
7
|
rpcPromise = listen();
|
|
7
8
|
}
|
|
8
9
|
const rpc = await rpcPromise;
|
|
9
|
-
|
|
10
|
+
ExtensionManagementWorker.set(rpc);
|
|
11
|
+
activateOutputChannels();
|
|
10
12
|
};
|
|
11
13
|
export {
|
|
12
14
|
activate
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { executeDiagnosticProvider } from "../ExecuteDiagnosticProvider/ExecuteDiagnosticProvider.js";
|
|
2
|
+
import { getDiagnosticProviderRegistrySnapshot } from "../GetDiagnosticProviderRegistrySnapshot/GetDiagnosticProviderRegistrySnapshot.js";
|
|
3
|
+
import { registerDiagnosticProvider } from "../RegisterDiagnosticProvider/RegisterDiagnosticProvider.js";
|
|
4
|
+
import { resetDiagnosticProviderRegistry } from "../ResetDiagnosticProviderRegistry/ResetDiagnosticProviderRegistry.js";
|
|
5
|
+
export {
|
|
6
|
+
executeDiagnosticProvider,
|
|
7
|
+
getDiagnosticProviderRegistrySnapshot,
|
|
8
|
+
registerDiagnosticProvider,
|
|
9
|
+
resetDiagnosticProviderRegistry
|
|
10
|
+
};
|
|
File without changes
|
|
@@ -0,0 +1,66 @@
|
|
|
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
|
+
if (Array.isArray(value)) {
|
|
11
|
+
return "array";
|
|
12
|
+
}
|
|
13
|
+
return typeof value;
|
|
14
|
+
};
|
|
15
|
+
const validateDiagnosticResult = (diagnostics) => {
|
|
16
|
+
if (!Array.isArray(diagnostics)) {
|
|
17
|
+
throw new ExtensionApiError(`invalid diagnostic result: diagnostic must be of type array but is ${getType(diagnostics)}`);
|
|
18
|
+
}
|
|
19
|
+
for (const item of diagnostics) {
|
|
20
|
+
if (!item || typeof item !== "object" || Array.isArray(item)) {
|
|
21
|
+
throw new ExtensionApiError(`invalid diagnostic result: expected diagnostic item to be of type object but was of type ${getType(item)}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return diagnostics;
|
|
25
|
+
};
|
|
26
|
+
const registry = createProviderRegistry({
|
|
27
|
+
mapProvider(provider) {
|
|
28
|
+
return {
|
|
29
|
+
id: provider.id,
|
|
30
|
+
languageId: provider.languageId,
|
|
31
|
+
provideDiagnostics(textDocument, ...args) {
|
|
32
|
+
return provider.provideDiagnostics(textDocument, ...args);
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
},
|
|
36
|
+
providerName: "diagnostic provider",
|
|
37
|
+
requiredMethods: ["provideDiagnostics"],
|
|
38
|
+
requireLanguageId: true
|
|
39
|
+
});
|
|
40
|
+
const hasDiagnosticProvider = registry.hasProvider;
|
|
41
|
+
const registerDiagnosticProvider = (provider) => {
|
|
42
|
+
const registeredProvider = registry.registerProvider(provider);
|
|
43
|
+
return {
|
|
44
|
+
dispose() {
|
|
45
|
+
registry.deleteProvider(registeredProvider.id);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
const executeDiagnosticProvider = async (textDocument, ...args) => {
|
|
50
|
+
return registry.executeProviderByLanguageId(textDocument.languageId, "provideDiagnostics", [textDocument, ...args], validateDiagnosticResult);
|
|
51
|
+
};
|
|
52
|
+
const getDiagnosticProviders = registry.getProviders;
|
|
53
|
+
const getDiagnosticProviderRegistrySnapshot = () => {
|
|
54
|
+
return {
|
|
55
|
+
providers: registry.getProviders()
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
const resetDiagnosticProviderRegistry = registry.reset;
|
|
59
|
+
export {
|
|
60
|
+
executeDiagnosticProvider,
|
|
61
|
+
getDiagnosticProviderRegistrySnapshot,
|
|
62
|
+
getDiagnosticProviders,
|
|
63
|
+
hasDiagnosticProvider,
|
|
64
|
+
registerDiagnosticProvider,
|
|
65
|
+
resetDiagnosticProviderRegistry
|
|
66
|
+
};
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { ExtensionManagementWorker } from "@lvce-editor/rpc-registry";
|
|
2
2
|
const executeCommand = async (id, ...args) => {
|
|
3
|
-
return
|
|
3
|
+
return ExtensionManagementWorker.invoke("Extensions.executeCommand", id, ...args);
|
|
4
4
|
};
|
|
5
5
|
export {
|
|
6
6
|
executeCommand
|
|
@@ -1,19 +1,27 @@
|
|
|
1
1
|
import { executeCommand, getCommandRegistrySnapshot } from "../CommandRegistry/CommandRegistry.js";
|
|
2
2
|
import { executeCompletionProvider, executeResolveCompletionItemProvider, getCompletionProviderRegistrySnapshot } from "../Completion/Completion.js";
|
|
3
|
+
import { executeDiagnosticProvider, getDiagnosticProviderRegistrySnapshot } from "../Diagnostic/Diagnostic.js";
|
|
3
4
|
import { executeFormattingProvider, getFormattingProviderRegistrySnapshot } from "../Formatting/Formatting.js";
|
|
4
5
|
import { getStatusBarItems } from "../GetStatusBarItems/GetStatusBarItems.js";
|
|
5
6
|
import { executeHoverProvider, getHoverProviderRegistrySnapshot } from "../Hover/Hover.js";
|
|
7
|
+
import { getOutputChannelRegistrySnapshot } from "../OutputChannel/OutputChannel.js";
|
|
8
|
+
import { executeViewProvider, getViewRegistrySnapshot } from "../ViewRegistry/ViewRegistry.js";
|
|
6
9
|
const commandMap = {
|
|
7
10
|
"ExtensionApi.executeCommand": executeCommand,
|
|
8
11
|
"ExtensionApi.executeCompletionProvider": executeCompletionProvider,
|
|
12
|
+
"ExtensionApi.executeDiagnosticProvider": executeDiagnosticProvider,
|
|
9
13
|
"ExtensionApi.executeFormattingProvider": executeFormattingProvider,
|
|
10
14
|
"ExtensionApi.executeHoverProvider": executeHoverProvider,
|
|
11
15
|
"ExtensionApi.executeResolveCompletionItemProvider": executeResolveCompletionItemProvider,
|
|
16
|
+
"ExtensionApi.executeViewProvider": executeViewProvider,
|
|
12
17
|
"ExtensionApi.getCommandRegistrySnapshot": getCommandRegistrySnapshot,
|
|
13
18
|
"ExtensionApi.getCompletionProviderRegistrySnapshot": getCompletionProviderRegistrySnapshot,
|
|
19
|
+
"ExtensionApi.getDiagnosticProviderRegistrySnapshot": getDiagnosticProviderRegistrySnapshot,
|
|
14
20
|
"ExtensionApi.getFormattingProviderRegistrySnapshot": getFormattingProviderRegistrySnapshot,
|
|
15
21
|
"ExtensionApi.getHoverProviderRegistrySnapshot": getHoverProviderRegistrySnapshot,
|
|
16
|
-
"ExtensionApi.
|
|
22
|
+
"ExtensionApi.getOutputChannelRegistrySnapshot": getOutputChannelRegistrySnapshot,
|
|
23
|
+
"ExtensionApi.getStatusBarItems": getStatusBarItems,
|
|
24
|
+
"ExtensionApi.getViewRegistrySnapshot": getViewRegistrySnapshot
|
|
17
25
|
};
|
|
18
26
|
export {
|
|
19
27
|
commandMap
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { ExtensionManagementWorker } from "@lvce-editor/rpc-registry";
|
|
2
2
|
const notifyStatusBarChange = async (id) => {
|
|
3
|
-
await
|
|
3
|
+
await ExtensionManagementWorker.invoke("StatusBar.handleChange", id);
|
|
4
4
|
};
|
|
5
5
|
export {
|
|
6
6
|
notifyStatusBarChange
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { ExtensionManagementWorker } from "@lvce-editor/rpc-registry";
|
|
2
|
+
import { ExtensionApiError } from "../ExtensionApiError/ExtensionApiError.js";
|
|
3
|
+
const outputChannels = /* @__PURE__ */ Object.create(null);
|
|
4
|
+
let isActivated = false;
|
|
5
|
+
const RE_DASH_CASE = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;
|
|
6
|
+
const assertOutputChannelId = (id) => {
|
|
7
|
+
if (typeof id !== "string" || id.length === 0) {
|
|
8
|
+
throw new ExtensionApiError("output channel id is required");
|
|
9
|
+
}
|
|
10
|
+
if (!RE_DASH_CASE.test(id)) {
|
|
11
|
+
throw new ExtensionApiError(`output channel id ${id} must be dash-case`);
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
const assertCanWrite = (id) => {
|
|
15
|
+
if (!isActivated) {
|
|
16
|
+
throw new ExtensionApiError(`output channel ${id} cannot be written before activate`);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
class ExtensionOutputChannel {
|
|
20
|
+
#id;
|
|
21
|
+
constructor(id) {
|
|
22
|
+
this.#id = id;
|
|
23
|
+
}
|
|
24
|
+
async append(text) {
|
|
25
|
+
assertCanWrite(this.#id);
|
|
26
|
+
await ExtensionManagementWorker.invoke("ExtensionApi.appendOutputChannel", this.#id, text);
|
|
27
|
+
}
|
|
28
|
+
async appendLine(text) {
|
|
29
|
+
assertCanWrite(this.#id);
|
|
30
|
+
await ExtensionManagementWorker.invoke("ExtensionApi.appendOutputChannel", this.#id, `${text}
|
|
31
|
+
`);
|
|
32
|
+
}
|
|
33
|
+
async clear() {
|
|
34
|
+
assertCanWrite(this.#id);
|
|
35
|
+
await ExtensionManagementWorker.invoke("ExtensionApi.clearOutputChannel", this.#id);
|
|
36
|
+
}
|
|
37
|
+
async replace(text) {
|
|
38
|
+
assertCanWrite(this.#id);
|
|
39
|
+
await ExtensionManagementWorker.invoke("ExtensionApi.replaceOutputChannel", this.#id, text);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const activateOutputChannels = () => {
|
|
43
|
+
isActivated = true;
|
|
44
|
+
};
|
|
45
|
+
const createOutputChannel = (id) => {
|
|
46
|
+
assertOutputChannelId(id);
|
|
47
|
+
if (id in outputChannels) {
|
|
48
|
+
throw new ExtensionApiError(`output channel ${id} is already created`);
|
|
49
|
+
}
|
|
50
|
+
outputChannels[id] = {
|
|
51
|
+
id
|
|
52
|
+
};
|
|
53
|
+
return new ExtensionOutputChannel(id);
|
|
54
|
+
};
|
|
55
|
+
const getOutputChannelRegistrySnapshot = () => {
|
|
56
|
+
return {
|
|
57
|
+
outputChannels: Object.values(outputChannels)
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
const resetOutputChannelRegistry = () => {
|
|
61
|
+
for (const id of Object.keys(outputChannels)) {
|
|
62
|
+
delete outputChannels[id];
|
|
63
|
+
}
|
|
64
|
+
isActivated = false;
|
|
65
|
+
};
|
|
66
|
+
export {
|
|
67
|
+
activateOutputChannels,
|
|
68
|
+
createOutputChannel,
|
|
69
|
+
getOutputChannelRegistrySnapshot,
|
|
70
|
+
resetOutputChannelRegistry
|
|
71
|
+
};
|
|
File without changes
|
package/dist/extension-api/parts/OutputChannelRegistrySnapshot/OutputChannelRegistrySnapshot.js
ADDED
|
File without changes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { ExtensionManagementWorker } from "@lvce-editor/rpc-registry";
|
|
2
2
|
const showQuickPick = async (options) => {
|
|
3
|
-
return
|
|
3
|
+
return ExtensionManagementWorker.invoke("ExtensionHostQuickPick.showQuickPick", options);
|
|
4
4
|
};
|
|
5
5
|
export {
|
|
6
6
|
showQuickPick
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { ExtensionApiError } from "../ExtensionApiError/ExtensionApiError.js";
|
|
2
|
+
const views = /* @__PURE__ */ Object.create(null);
|
|
3
|
+
const assertView = (view) => {
|
|
4
|
+
if (!view) {
|
|
5
|
+
throw new ExtensionApiError("view is not defined");
|
|
6
|
+
}
|
|
7
|
+
if (typeof view.id !== "string" || view.id.length === 0) {
|
|
8
|
+
throw new ExtensionApiError("view is missing id");
|
|
9
|
+
}
|
|
10
|
+
if (typeof view.create !== "function") {
|
|
11
|
+
throw new ExtensionApiError(`view ${view.id} is missing create function`);
|
|
12
|
+
}
|
|
13
|
+
if (view.id in views) {
|
|
14
|
+
throw new ExtensionApiError(`view ${view.id} is already registered`);
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
const toRegisteredView = (view) => {
|
|
18
|
+
return {
|
|
19
|
+
icon: view.icon,
|
|
20
|
+
id: view.id,
|
|
21
|
+
title: view.title
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
const registerView = (view) => {
|
|
25
|
+
assertView(view);
|
|
26
|
+
views[view.id] = view;
|
|
27
|
+
return {
|
|
28
|
+
dispose() {
|
|
29
|
+
delete views[view.id];
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
const executeViewProvider = (id) => {
|
|
34
|
+
const view = views[id];
|
|
35
|
+
if (!view) {
|
|
36
|
+
throw new ExtensionApiError(`view ${id} not found`);
|
|
37
|
+
}
|
|
38
|
+
return view.create();
|
|
39
|
+
};
|
|
40
|
+
const getViewRegistrySnapshot = () => {
|
|
41
|
+
return {
|
|
42
|
+
views: Object.values(views).map(toRegisteredView)
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
const resetViewRegistry = () => {
|
|
46
|
+
for (const id of Object.keys(views)) {
|
|
47
|
+
delete views[id];
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
export {
|
|
51
|
+
executeViewProvider,
|
|
52
|
+
getViewRegistrySnapshot,
|
|
53
|
+
registerView,
|
|
54
|
+
resetViewRegistry
|
|
55
|
+
};
|