@lvce-editor/extension-host-worker 8.44.0 → 8.45.1

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.
@@ -977,12 +977,29 @@ var create7 = async ({ commandMap: commandMap5, isMessagePortOpen, send: send2 }
977
977
  });
978
978
  };
979
979
 
980
+ // packages/extension-api/node_modules/@lvce-editor/rpc/dist/parts/MessagePortRpcParent/MessagePortRpcParent.js
981
+ var MessagePortRpcParent_exports = {};
982
+ __export(MessagePortRpcParent_exports, {
983
+ create: () => create8
984
+ });
985
+ var create8 = async ({ commandMap: commandMap5, isMessagePortOpen, messagePort }) => {
986
+ register(commandMap5);
987
+ const rawIpc = await IpcParentWithMessagePort$1.create({
988
+ isMessagePortOpen,
989
+ messagePort
990
+ });
991
+ const ipc = IpcParentWithMessagePort$1.wrap(rawIpc);
992
+ handleIpc(ipc);
993
+ const rpc = createRpc(ipc);
994
+ return rpc;
995
+ };
996
+
980
997
  // packages/extension-api/node_modules/@lvce-editor/rpc/dist/parts/WebWorkerRpcClient/WebWorkerRpcClient.js
981
998
  var WebWorkerRpcClient_exports = {};
982
999
  __export(WebWorkerRpcClient_exports, {
983
- create: () => create8
1000
+ create: () => create9
984
1001
  });
985
- var create8 = async ({ commandMap: commandMap5 }) => {
1002
+ var create9 = async ({ commandMap: commandMap5 }) => {
986
1003
  register(commandMap5);
987
1004
  const ipc = await listen(IpcChildWithModuleWorkerAndMessagePort$1);
988
1005
  handleIpc(ipc);
@@ -1022,7 +1039,7 @@ var remove2 = (id2) => {
1022
1039
  };
1023
1040
 
1024
1041
  // packages/extension-api/node_modules/@lvce-editor/rpc-registry/dist/parts/RpcFactory/RpcFactory.js
1025
- var create9 = (rpcId) => {
1042
+ var create10 = (rpcId) => {
1026
1043
  return {
1027
1044
  async dispose() {
1028
1045
  const rpc = get2(rpcId);
@@ -1370,7 +1387,7 @@ __export(ExtensionManagementWorker_exports, {
1370
1387
  set: () => set2,
1371
1388
  uninstall: () => uninstall
1372
1389
  });
1373
- var { dispose, invoke, invokeAndTransfer, registerMockRpc, set: set2 } = create9(RpcId_exports.ExtensionManagementWorker);
1390
+ var { dispose, invoke, invokeAndTransfer, registerMockRpc, set: set2 } = create10(RpcId_exports.ExtensionManagementWorker);
1374
1391
  var enable = (id2) => {
1375
1392
  return invoke(`Extensions.enable`, id2);
1376
1393
  };
@@ -1425,7 +1442,7 @@ __export(FileSystemWorker_exports, {
1425
1442
  watchFile: () => watchFile,
1426
1443
  writeFile: () => writeFile
1427
1444
  });
1428
- var { dispose: dispose2, invoke: invoke2, invokeAndTransfer: invokeAndTransfer2, registerMockRpc: registerMockRpc2, set: set3 } = create9(RpcId_exports.FileSystemWorker);
1445
+ var { dispose: dispose2, invoke: invoke2, invokeAndTransfer: invokeAndTransfer2, registerMockRpc: registerMockRpc2, set: set3 } = create10(RpcId_exports.FileSystemWorker);
1429
1446
  var remove3 = async (dirent) => {
1430
1447
  return invoke2("FileSystem.remove", dirent);
1431
1448
  };
@@ -1556,11 +1573,11 @@ var createProviderRegistry = ({
1556
1573
  requiredMethods,
1557
1574
  requireLanguageId = false
1558
1575
  }) => {
1559
- const providers2 = /* @__PURE__ */ Object.create(null);
1576
+ const providers3 = /* @__PURE__ */ Object.create(null);
1560
1577
  const hasProvider = (id2) => {
1561
- return id2 in providers2;
1578
+ return id2 in providers3;
1562
1579
  };
1563
- const registerProvider = (provider) => {
1580
+ const registerProvider2 = (provider) => {
1564
1581
  if (!provider) {
1565
1582
  throw new ExtensionApiError(`${providerName} is not defined`);
1566
1583
  }
@@ -1582,14 +1599,14 @@ var createProviderRegistry = ({
1582
1599
  throw new ExtensionApiError(`${providerName} ${id2} is already registered`);
1583
1600
  }
1584
1601
  const registeredProvider = mapProvider(provider);
1585
- providers2[registeredProvider.id] = registeredProvider;
1602
+ providers3[registeredProvider.id] = registeredProvider;
1586
1603
  return registeredProvider;
1587
1604
  };
1588
1605
  const deleteProvider = (id2) => {
1589
- delete providers2[id2];
1606
+ delete providers3[id2];
1590
1607
  };
1591
1608
  const getProviders = () => {
1592
- return Object.values(providers2);
1609
+ return Object.values(providers3);
1593
1610
  };
1594
1611
  const getProviderByLanguageId = (languageId) => {
1595
1612
  return getProviders().find((provider) => {
@@ -1597,8 +1614,8 @@ var createProviderRegistry = ({
1597
1614
  });
1598
1615
  };
1599
1616
  const reset = () => {
1600
- for (const id2 of Object.keys(providers2)) {
1601
- delete providers2[id2];
1617
+ for (const id2 of Object.keys(providers3)) {
1618
+ delete providers3[id2];
1602
1619
  }
1603
1620
  };
1604
1621
  const executeProviderByLanguageId = async (languageId, methodName, args, validateResult) => {
@@ -1619,7 +1636,7 @@ var createProviderRegistry = ({
1619
1636
  getProviderByLanguageId,
1620
1637
  getProviders,
1621
1638
  hasProvider,
1622
- registerProvider,
1639
+ registerProvider: registerProvider2,
1623
1640
  reset
1624
1641
  };
1625
1642
  };
@@ -1929,6 +1946,84 @@ var getHoverProviderRegistrySnapshot = () => {
1929
1946
  };
1930
1947
  var resetHoverProviderRegistry = registry5.reset;
1931
1948
 
1949
+ // packages/extension-api/src/parts/LanguageProvider/LanguageProvider.ts
1950
+ var providers = /* @__PURE__ */ Object.create(null);
1951
+ var getProvider = (kind, languageId) => {
1952
+ return providers[kind]?.find((provider) => provider.languageId === languageId);
1953
+ };
1954
+ var registerProvider = (kind, provider, requiredMethods) => {
1955
+ if (!provider || typeof provider !== "object") {
1956
+ throw new ExtensionApiError(`${kind} provider is not defined`);
1957
+ }
1958
+ if (typeof provider.id !== "string" || provider.id.length === 0) {
1959
+ throw new ExtensionApiError(`${kind} provider is missing id`);
1960
+ }
1961
+ if (typeof provider.languageId !== "string" || provider.languageId.length === 0) {
1962
+ throw new ExtensionApiError(`${kind} provider ${provider.id} is missing languageId`);
1963
+ }
1964
+ for (const methodName of requiredMethods) {
1965
+ if (typeof provider[methodName] !== "function") {
1966
+ throw new ExtensionApiError(`${kind} provider ${provider.id} is missing ${methodName} function`);
1967
+ }
1968
+ }
1969
+ const kindProviders = providers[kind] ||= [];
1970
+ if (kindProviders.some((registeredProvider) => registeredProvider.id === provider.id)) {
1971
+ throw new ExtensionApiError(`${kind} provider ${provider.id} is already registered`);
1972
+ }
1973
+ kindProviders.push(provider);
1974
+ return {
1975
+ dispose() {
1976
+ const index = kindProviders.indexOf(provider);
1977
+ if (index !== -1) {
1978
+ kindProviders.splice(index, 1);
1979
+ }
1980
+ }
1981
+ };
1982
+ };
1983
+ var executeLanguageProvider = async (kind, methodName, textDocument, ...args) => {
1984
+ const provider = getProvider(kind, textDocument.languageId);
1985
+ if (!provider) {
1986
+ throw new ExtensionApiError(`No ${kind} provider found for ${textDocument.languageId}`);
1987
+ }
1988
+ const method = provider[methodName];
1989
+ if (typeof method !== "function") {
1990
+ throw new ExtensionApiError(`${kind} provider ${provider.id} is missing ${methodName} function`);
1991
+ }
1992
+ return method(textDocument, ...args);
1993
+ };
1994
+ var executeOrganizeImportsProvider = async (textDocument) => {
1995
+ const provider = getProvider("code action", textDocument.languageId);
1996
+ if (!provider) {
1997
+ throw new ExtensionApiError(`No code action provider found for ${textDocument.languageId}`);
1998
+ }
1999
+ const provideCodeActions = provider.provideCodeActions;
2000
+ const actions = await provideCodeActions(textDocument);
2001
+ if (!Array.isArray(actions)) {
2002
+ throw new ExtensionApiError("invalid code action result: code actions must be of type array");
2003
+ }
2004
+ const action = actions.find((candidate) => candidate && typeof candidate === "object" && candidate.kind === "source.organizeImports");
2005
+ if (!action || typeof action.execute !== "function") {
2006
+ return [];
2007
+ }
2008
+ return action.execute(textDocument);
2009
+ };
2010
+ var registerBraceCompletionProvider = (provider) => registerProvider("brace completion", provider, ["provideBraceCompletion"]);
2011
+ var registerClosingTagProvider = (provider) => registerProvider("closing tag", provider, ["provideClosingTag"]);
2012
+ var registerCodeActionsProvider = (provider) => registerProvider("code action", provider, ["provideCodeActions"]);
2013
+ var registerCommentProvider = (provider) => registerProvider("comment", provider, ["provideComment"]);
2014
+ var registerDefinitionProvider = (provider) => registerProvider("definition", provider, ["provideDefinition"]);
2015
+ var registerImplementationProvider = (provider) => registerProvider("implementation", provider, ["provideImplementations"]);
2016
+ var registerReferenceProvider = (provider) => registerProvider("reference", provider, ["provideReferences"]);
2017
+ var registerRenameProvider = (provider) => registerProvider("rename", provider, ["provideRename"]);
2018
+ var registerSelectionProvider = (provider) => registerProvider("selection", provider, ["provideSelections"]);
2019
+ var registerTabCompletionProvider = (provider) => registerProvider("tab completion", provider, ["provideTabCompletion"]);
2020
+ var registerTypeDefinitionProvider = (provider) => registerProvider("type definition", provider, ["provideTypeDefinition"]);
2021
+ var resetLanguageProviderRegistry = () => {
2022
+ for (const kind of Object.keys(providers)) {
2023
+ delete providers[kind];
2024
+ }
2025
+ };
2026
+
1932
2027
  // packages/extension-api/src/parts/OutputChannel/OutputChannel.ts
1933
2028
  var outputChannels = /* @__PURE__ */ Object.create(null);
1934
2029
  var outputChannelLogs = /* @__PURE__ */ Object.create(null);
@@ -2004,7 +2099,7 @@ var resetOutputChannelRegistry = () => {
2004
2099
  };
2005
2100
 
2006
2101
  // packages/extension-api/src/parts/SourceControlProviderRegistry/SourceControlProviderRegistry.ts
2007
- var providers = /* @__PURE__ */ Object.create(null);
2102
+ var providers2 = /* @__PURE__ */ Object.create(null);
2008
2103
  var optionalMethods = [
2009
2104
  "acceptInput",
2010
2105
  "add",
@@ -2037,12 +2132,12 @@ var assertSourceControlProvider = (provider) => {
2037
2132
  for (const methodName of optionalMethods) {
2038
2133
  assertOptionalProviderMethod2(providerRecord, id2, methodName);
2039
2134
  }
2040
- if (id2 in providers) {
2135
+ if (id2 in providers2) {
2041
2136
  throw new ExtensionApiError(`source control provider ${id2} is already registered`);
2042
2137
  }
2043
2138
  };
2044
- var getProvider = (id2) => {
2045
- const provider = providers[id2];
2139
+ var getProvider2 = (id2) => {
2140
+ const provider = providers2[id2];
2046
2141
  if (!provider) {
2047
2142
  throw new ExtensionApiError(`source control provider ${id2} not found`);
2048
2143
  }
@@ -2087,30 +2182,30 @@ var mapSourceControlProvider = (provider) => {
2087
2182
  };
2088
2183
  var registerSourceControlProvider = (provider) => {
2089
2184
  assertSourceControlProvider(provider);
2090
- providers[provider.id] = mapSourceControlProvider(provider);
2185
+ providers2[provider.id] = mapSourceControlProvider(provider);
2091
2186
  return {
2092
2187
  dispose() {
2093
- delete providers[provider.id];
2188
+ delete providers2[provider.id];
2094
2189
  }
2095
2190
  };
2096
2191
  };
2097
2192
  var executeSourceControlAcceptInput = async (id2, value) => {
2098
- return getProvider(id2).acceptInput?.(value);
2193
+ return getProvider2(id2).acceptInput?.(value);
2099
2194
  };
2100
2195
  var executeSourceControlAdd = async (id2, path) => {
2101
- return getProvider(id2).add?.(path);
2196
+ return getProvider2(id2).add?.(path);
2102
2197
  };
2103
2198
  var executeSourceControlDiscard = async (id2, path) => {
2104
- return getProvider(id2).discard?.(path);
2199
+ return getProvider2(id2).discard?.(path);
2105
2200
  };
2106
2201
  var executeSourceControlGenerateCommitMessage = async (id2) => {
2107
- return getProvider(id2).generateCommitMessage?.();
2202
+ return getProvider2(id2).generateCommitMessage?.();
2108
2203
  };
2109
2204
  var executeSourceControlGetChangedFiles = async (id2) => {
2110
- return getProvider(id2).getChangedFiles();
2205
+ return getProvider2(id2).getChangedFiles();
2111
2206
  };
2112
2207
  var executeSourceControlGetBadgeCount = async (id2) => {
2113
- const provider = getProvider(id2);
2208
+ const provider = getProvider2(id2);
2114
2209
  if (provider.getBadgeCount) {
2115
2210
  return provider.getBadgeCount();
2116
2211
  }
@@ -2118,16 +2213,16 @@ var executeSourceControlGetBadgeCount = async (id2) => {
2118
2213
  return files.length;
2119
2214
  };
2120
2215
  var executeSourceControlGetFeatures = async (id2) => {
2121
- return getProvider(id2).getFeatures?.() ?? {};
2216
+ return getProvider2(id2).getFeatures?.() ?? {};
2122
2217
  };
2123
2218
  var executeSourceControlGetFileBefore = async (id2, uri) => {
2124
- return getProvider(id2).getFileBefore?.(uri);
2219
+ return getProvider2(id2).getFileBefore?.(uri);
2125
2220
  };
2126
2221
  var executeSourceControlGetFileDecorations = async (id2, uris) => {
2127
- return getProvider(id2).getFileDecorations?.(uris) ?? [];
2222
+ return getProvider2(id2).getFileDecorations?.(uris) ?? [];
2128
2223
  };
2129
2224
  var executeSourceControlGetGroups = async (id2, cwd) => {
2130
- const provider = getProvider(id2);
2225
+ const provider = getProvider2(id2);
2131
2226
  if (provider.getGroups) {
2132
2227
  return provider.getGroups(cwd);
2133
2228
  }
@@ -2140,18 +2235,18 @@ var executeSourceControlGetGroups = async (id2, cwd) => {
2140
2235
  ];
2141
2236
  };
2142
2237
  var executeSourceControlIsActive = async (id2, scheme, root) => {
2143
- return Boolean(await getProvider(id2).isActive?.(scheme, root));
2238
+ return Boolean(await getProvider2(id2).isActive?.(scheme, root));
2144
2239
  };
2145
2240
  var getSourceControlProviderRegistrySnapshot = () => {
2146
2241
  return {
2147
- providers: Object.values(providers).map((provider) => ({
2242
+ providers: Object.values(providers2).map((provider) => ({
2148
2243
  id: provider.id
2149
2244
  }))
2150
2245
  };
2151
2246
  };
2152
2247
  var resetSourceControlProviderRegistry = () => {
2153
- for (const id2 of Object.keys(providers)) {
2154
- delete providers[id2];
2248
+ for (const id2 of Object.keys(providers2)) {
2249
+ delete providers2[id2];
2155
2250
  }
2156
2251
  };
2157
2252
 
@@ -2914,6 +3009,8 @@ var commandMap = {
2914
3009
  "ExtensionApi.executeDiagnosticProvider": executeDiagnosticProvider,
2915
3010
  "ExtensionApi.executeFormattingProvider": executeFormattingProvider,
2916
3011
  "ExtensionApi.executeHoverProvider": executeHoverProvider,
3012
+ "ExtensionApi.executeLanguageProvider": executeLanguageProvider,
3013
+ "ExtensionApi.executeOrganizeImportsProvider": executeOrganizeImportsProvider,
2917
3014
  "ExtensionApi.executeResolveCompletionItemProvider": executeResolveCompletionItemProvider,
2918
3015
  "ExtensionApi.executeSourceControlAcceptInput": executeSourceControlAcceptInput,
2919
3016
  "ExtensionApi.executeSourceControlAdd": executeSourceControlAdd,
@@ -3099,33 +3196,38 @@ var handleExtensionManagementMessagePort2 = async ({
3099
3196
  };
3100
3197
 
3101
3198
  // packages/extension-api/src/parts/Rpc/Rpc.ts
3102
- var sendMessagePortToNode = async (port) => {
3103
- await ExtensionManagementWorker_exports.invokeAndTransfer(
3104
- "Extensions.sendMessagePortToElectron",
3105
- port,
3106
- "HandleMessagePortForExtensionHostHelperProcess.handleMessagePortForExtensionHostHelperProcess"
3107
- );
3108
- };
3109
- var sendMessagePortToWebWorker = async (port, name) => {
3110
- await ExtensionManagementWorker_exports.invokeAndTransfer("Extensions.createWebViewWorkerRpc", { name }, port);
3199
+ var sendMessagePortToWebWorker = async (port, name, url) => {
3200
+ await ExtensionManagementWorker_exports.invokeAndTransfer("Extensions.createWebViewWorkerRpc2", { name, url }, port);
3111
3201
  };
3112
- var createRpc2 = async ({ commandMap: commandMap5 = {}, name = "", url }) => {
3113
- const rpc = await LazyTransferMessagePortRpcParent_exports.create({
3202
+ var createMessagePortRpc = async (commandMap5, send2) => {
3203
+ const { port1, port2 } = new MessageChannel();
3204
+ const rpcPromise2 = MessagePortRpcParent_exports.create({
3114
3205
  commandMap: commandMap5,
3115
- send(port) {
3116
- return sendMessagePortToWebWorker(port, name);
3117
- }
3206
+ isMessagePortOpen: true,
3207
+ messagePort: port2
3118
3208
  });
3119
- await rpc.invoke("LoadFile.loadFile", url);
3120
- return rpc;
3209
+ port2.start();
3210
+ await send2(port1);
3211
+ return rpcPromise2;
3121
3212
  };
3122
- var createNodeRpc = async ({ path }) => {
3123
- const rpc = await LazyTransferMessagePortRpcParent_exports.create({
3124
- commandMap: {},
3125
- send: sendMessagePortToNode
3126
- });
3127
- await rpc.invoke("LoadFile.loadFile", path);
3128
- return rpc;
3213
+ var createRpc2 = async ({ commandMap: commandMap5 = {}, name = "", url }) => {
3214
+ return createMessagePortRpc(commandMap5, (port) => sendMessagePortToWebWorker(port, name, url));
3215
+ };
3216
+ var createNodeRpc = async ({ name = "", path }) => {
3217
+ const id2 = await ExtensionManagementWorker_exports.invoke("Extensions.executeCommand", "ExtensionNodeRpc.create", name, path);
3218
+ const invoke3 = (method, ...params) => {
3219
+ return ExtensionManagementWorker_exports.invoke("Extensions.executeCommand", "ExtensionNodeRpc.invoke", id2, method, ...params);
3220
+ };
3221
+ return {
3222
+ async dispose() {
3223
+ await ExtensionManagementWorker_exports.invoke("Extensions.executeCommand", "ExtensionNodeRpc.dispose", id2);
3224
+ },
3225
+ invoke: invoke3,
3226
+ invokeAndTransfer: invoke3,
3227
+ send(method, ...params) {
3228
+ void invoke3(method, ...params);
3229
+ }
3230
+ };
3129
3231
  };
3130
3232
  export {
3131
3233
  activate,
@@ -3170,13 +3272,24 @@ export {
3170
3272
  openUri,
3171
3273
  readDirWithFileTypes2 as readDirWithFileTypes,
3172
3274
  readFile2 as readFile,
3275
+ registerBraceCompletionProvider,
3276
+ registerClosingTagProvider,
3277
+ registerCodeActionsProvider,
3173
3278
  registerCommand,
3279
+ registerCommentProvider,
3174
3280
  registerCompletionProvider,
3281
+ registerDefinitionProvider,
3175
3282
  registerDiagnosticProvider,
3176
3283
  registerFormattingProvider,
3177
3284
  registerHoverProvider,
3285
+ registerImplementationProvider,
3286
+ registerReferenceProvider,
3287
+ registerRenameProvider,
3288
+ registerSelectionProvider,
3178
3289
  registerSourceControlProvider,
3179
3290
  registerStatusBarItemProvider,
3291
+ registerTabCompletionProvider,
3292
+ registerTypeDefinitionProvider,
3180
3293
  registerView,
3181
3294
  remove4 as remove,
3182
3295
  renderViewInstance,
@@ -3184,6 +3297,7 @@ export {
3184
3297
  resetDiagnosticProviderRegistry,
3185
3298
  resetFormattingProviderRegistry,
3186
3299
  resetHoverProviderRegistry,
3300
+ resetLanguageProviderRegistry,
3187
3301
  resetOutputChannelRegistry,
3188
3302
  resetSourceControlProviderRegistry,
3189
3303
  resetStatusBarItemProviderRegistry,
@@ -4,6 +4,7 @@ import { executeDiagnosticProvider, getDiagnosticProviderRegistrySnapshot } from
4
4
  import { executeFormattingProvider, getFormattingProviderRegistrySnapshot } from "../Formatting/Formatting.js";
5
5
  import { getStatusBarItems } from "../GetStatusBarItems/GetStatusBarItems.js";
6
6
  import { executeHoverProvider, getHoverProviderRegistrySnapshot } from "../Hover/Hover.js";
7
+ import { executeLanguageProvider, executeOrganizeImportsProvider } from "../LanguageProvider/LanguageProvider.js";
7
8
  import { getOutputChannelRegistrySnapshot } from "../OutputChannel/OutputChannel.js";
8
9
  import {
9
10
  executeSourceControlAcceptInput,
@@ -39,6 +40,8 @@ const commandMap = {
39
40
  "ExtensionApi.executeDiagnosticProvider": executeDiagnosticProvider,
40
41
  "ExtensionApi.executeFormattingProvider": executeFormattingProvider,
41
42
  "ExtensionApi.executeHoverProvider": executeHoverProvider,
43
+ "ExtensionApi.executeLanguageProvider": executeLanguageProvider,
44
+ "ExtensionApi.executeOrganizeImportsProvider": executeOrganizeImportsProvider,
42
45
  "ExtensionApi.executeResolveCompletionItemProvider": executeResolveCompletionItemProvider,
43
46
  "ExtensionApi.executeSourceControlAcceptInput": executeSourceControlAcceptInput,
44
47
  "ExtensionApi.executeSourceControlAdd": executeSourceControlAdd,
@@ -0,0 +1,93 @@
1
+ import { ExtensionApiError } from "../ExtensionApiError/ExtensionApiError.js";
2
+ const providers = /* @__PURE__ */ Object.create(null);
3
+ const getProvider = (kind, languageId) => {
4
+ return providers[kind]?.find((provider) => provider.languageId === languageId);
5
+ };
6
+ const registerProvider = (kind, provider, requiredMethods) => {
7
+ if (!provider || typeof provider !== "object") {
8
+ throw new ExtensionApiError(`${kind} provider is not defined`);
9
+ }
10
+ if (typeof provider.id !== "string" || provider.id.length === 0) {
11
+ throw new ExtensionApiError(`${kind} provider is missing id`);
12
+ }
13
+ if (typeof provider.languageId !== "string" || provider.languageId.length === 0) {
14
+ throw new ExtensionApiError(`${kind} provider ${provider.id} is missing languageId`);
15
+ }
16
+ for (const methodName of requiredMethods) {
17
+ if (typeof provider[methodName] !== "function") {
18
+ throw new ExtensionApiError(`${kind} provider ${provider.id} is missing ${methodName} function`);
19
+ }
20
+ }
21
+ const kindProviders = providers[kind] ||= [];
22
+ if (kindProviders.some((registeredProvider) => registeredProvider.id === provider.id)) {
23
+ throw new ExtensionApiError(`${kind} provider ${provider.id} is already registered`);
24
+ }
25
+ kindProviders.push(provider);
26
+ return {
27
+ dispose() {
28
+ const index = kindProviders.indexOf(provider);
29
+ if (index !== -1) {
30
+ kindProviders.splice(index, 1);
31
+ }
32
+ }
33
+ };
34
+ };
35
+ const executeLanguageProvider = async (kind, methodName, textDocument, ...args) => {
36
+ const provider = getProvider(kind, textDocument.languageId);
37
+ if (!provider) {
38
+ throw new ExtensionApiError(`No ${kind} provider found for ${textDocument.languageId}`);
39
+ }
40
+ const method = provider[methodName];
41
+ if (typeof method !== "function") {
42
+ throw new ExtensionApiError(`${kind} provider ${provider.id} is missing ${methodName} function`);
43
+ }
44
+ return method(textDocument, ...args);
45
+ };
46
+ const executeOrganizeImportsProvider = async (textDocument) => {
47
+ const provider = getProvider("code action", textDocument.languageId);
48
+ if (!provider) {
49
+ throw new ExtensionApiError(`No code action provider found for ${textDocument.languageId}`);
50
+ }
51
+ const provideCodeActions = provider.provideCodeActions;
52
+ const actions = await provideCodeActions(textDocument);
53
+ if (!Array.isArray(actions)) {
54
+ throw new ExtensionApiError("invalid code action result: code actions must be of type array");
55
+ }
56
+ const action = actions.find((candidate) => candidate && typeof candidate === "object" && candidate.kind === "source.organizeImports");
57
+ if (!action || typeof action.execute !== "function") {
58
+ return [];
59
+ }
60
+ return action.execute(textDocument);
61
+ };
62
+ const registerBraceCompletionProvider = (provider) => registerProvider("brace completion", provider, ["provideBraceCompletion"]);
63
+ const registerClosingTagProvider = (provider) => registerProvider("closing tag", provider, ["provideClosingTag"]);
64
+ const registerCodeActionsProvider = (provider) => registerProvider("code action", provider, ["provideCodeActions"]);
65
+ const registerCommentProvider = (provider) => registerProvider("comment", provider, ["provideComment"]);
66
+ const registerDefinitionProvider = (provider) => registerProvider("definition", provider, ["provideDefinition"]);
67
+ const registerImplementationProvider = (provider) => registerProvider("implementation", provider, ["provideImplementations"]);
68
+ const registerReferenceProvider = (provider) => registerProvider("reference", provider, ["provideReferences"]);
69
+ const registerRenameProvider = (provider) => registerProvider("rename", provider, ["provideRename"]);
70
+ const registerSelectionProvider = (provider) => registerProvider("selection", provider, ["provideSelections"]);
71
+ const registerTabCompletionProvider = (provider) => registerProvider("tab completion", provider, ["provideTabCompletion"]);
72
+ const registerTypeDefinitionProvider = (provider) => registerProvider("type definition", provider, ["provideTypeDefinition"]);
73
+ const resetLanguageProviderRegistry = () => {
74
+ for (const kind of Object.keys(providers)) {
75
+ delete providers[kind];
76
+ }
77
+ };
78
+ export {
79
+ executeLanguageProvider,
80
+ executeOrganizeImportsProvider,
81
+ registerBraceCompletionProvider,
82
+ registerClosingTagProvider,
83
+ registerCodeActionsProvider,
84
+ registerCommentProvider,
85
+ registerDefinitionProvider,
86
+ registerImplementationProvider,
87
+ registerReferenceProvider,
88
+ registerRenameProvider,
89
+ registerSelectionProvider,
90
+ registerTabCompletionProvider,
91
+ registerTypeDefinitionProvider,
92
+ resetLanguageProviderRegistry
93
+ };
@@ -1,32 +1,37 @@
1
- import { LazyTransferMessagePortRpcParent } from "@lvce-editor/rpc";
1
+ import { MessagePortRpcParent } from "@lvce-editor/rpc";
2
2
  import { ExtensionManagementWorker } from "@lvce-editor/rpc-registry";
3
- const sendMessagePortToNode = async (port) => {
4
- await ExtensionManagementWorker.invokeAndTransfer(
5
- "Extensions.sendMessagePortToElectron",
6
- port,
7
- "HandleMessagePortForExtensionHostHelperProcess.handleMessagePortForExtensionHostHelperProcess"
8
- );
3
+ const sendMessagePortToWebWorker = async (port, name, url) => {
4
+ await ExtensionManagementWorker.invokeAndTransfer("Extensions.createWebViewWorkerRpc2", { name, url }, port);
9
5
  };
10
- const sendMessagePortToWebWorker = async (port, name) => {
11
- await ExtensionManagementWorker.invokeAndTransfer("Extensions.createWebViewWorkerRpc", { name }, port);
12
- };
13
- const createRpc = async ({ commandMap = {}, name = "", url }) => {
14
- const rpc = await LazyTransferMessagePortRpcParent.create({
6
+ const createMessagePortRpc = async (commandMap, send) => {
7
+ const { port1, port2 } = new MessageChannel();
8
+ const rpcPromise = MessagePortRpcParent.create({
15
9
  commandMap,
16
- send(port) {
17
- return sendMessagePortToWebWorker(port, name);
18
- }
10
+ isMessagePortOpen: true,
11
+ messagePort: port2
19
12
  });
20
- await rpc.invoke("LoadFile.loadFile", url);
21
- return rpc;
13
+ port2.start();
14
+ await send(port1);
15
+ return rpcPromise;
22
16
  };
23
- const createNodeRpc = async ({ path }) => {
24
- const rpc = await LazyTransferMessagePortRpcParent.create({
25
- commandMap: {},
26
- send: sendMessagePortToNode
27
- });
28
- await rpc.invoke("LoadFile.loadFile", path);
29
- return rpc;
17
+ const createRpc = async ({ commandMap = {}, name = "", url }) => {
18
+ return createMessagePortRpc(commandMap, (port) => sendMessagePortToWebWorker(port, name, url));
19
+ };
20
+ const createNodeRpc = async ({ name = "", path }) => {
21
+ const id = await ExtensionManagementWorker.invoke("Extensions.executeCommand", "ExtensionNodeRpc.create", name, path);
22
+ const invoke = (method, ...params) => {
23
+ return ExtensionManagementWorker.invoke("Extensions.executeCommand", "ExtensionNodeRpc.invoke", id, method, ...params);
24
+ };
25
+ return {
26
+ async dispose() {
27
+ await ExtensionManagementWorker.invoke("Extensions.executeCommand", "ExtensionNodeRpc.dispose", id);
28
+ },
29
+ invoke,
30
+ invokeAndTransfer: invoke,
31
+ send(method, ...params) {
32
+ void invoke(method, ...params);
33
+ }
34
+ };
30
35
  };
31
36
  export {
32
37
  createNodeRpc,