@lvce-editor/extension-host-worker 8.41.0 → 8.43.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.
@@ -457,6 +457,106 @@ var IpcParentWithMessagePort$1 = {
457
457
  signal: signal$1,
458
458
  wrap: wrap$5
459
459
  };
460
+ var Message = "message";
461
+ var Error$1 = "error";
462
+ var getFirstWorkerEvent = (worker) => {
463
+ return getFirstEvent(worker, {
464
+ error: Error$1,
465
+ message: Message
466
+ });
467
+ };
468
+ var isErrorEvent = (event) => {
469
+ return event instanceof ErrorEvent;
470
+ };
471
+ var getWorkerDisplayName = (name) => {
472
+ if (!name) {
473
+ return "<unknown> worker";
474
+ }
475
+ if (name.endsWith("Worker") || name.endsWith("worker")) {
476
+ return name.toLowerCase();
477
+ }
478
+ return `${name} Worker`;
479
+ };
480
+ var tryToGetActualErrorMessage = async ({
481
+ name
482
+ }) => {
483
+ const displayName = getWorkerDisplayName(name);
484
+ return `Failed to start ${displayName}: Worker Launch Error`;
485
+ };
486
+ var WorkerError = class extends Error {
487
+ constructor(event) {
488
+ super(event.message);
489
+ const stackLines = splitLines(this.stack || "");
490
+ const relevantLines = stackLines.slice(1);
491
+ const relevant = joinLines(relevantLines);
492
+ this.stack = `${event.message}
493
+ at Module (${event.filename}:${event.lineno}:${event.colno})
494
+ ${relevant}`;
495
+ }
496
+ };
497
+ var Module = "module";
498
+ var create$4 = async ({
499
+ name,
500
+ url
501
+ }) => {
502
+ const worker = new Worker(url, {
503
+ name,
504
+ type: Module
505
+ });
506
+ const {
507
+ event,
508
+ type
509
+ } = await getFirstWorkerEvent(worker);
510
+ switch (type) {
511
+ case Message:
512
+ if (event.data !== readyMessage) {
513
+ throw new IpcError("unexpected first message from worker");
514
+ }
515
+ break;
516
+ case Error$1:
517
+ if (isErrorEvent(event)) {
518
+ throw new WorkerError(event);
519
+ }
520
+ const actualErrorMessage = await tryToGetActualErrorMessage({
521
+ name
522
+ });
523
+ throw new Error(actualErrorMessage);
524
+ }
525
+ return worker;
526
+ };
527
+ var getData = (event) => {
528
+ if (event instanceof MessageEvent) {
529
+ return event.data;
530
+ }
531
+ return event;
532
+ };
533
+ var IpcParentWithModuleWorker = class extends Ipc {
534
+ getData(event) {
535
+ return getData(event);
536
+ }
537
+ send(message) {
538
+ this._rawIpc.postMessage(message);
539
+ }
540
+ sendAndTransfer(message) {
541
+ const transfer = getTransferrables(message);
542
+ this._rawIpc.postMessage(message, transfer);
543
+ }
544
+ dispose() {
545
+ }
546
+ onClose(callback) {
547
+ }
548
+ onMessage(callback) {
549
+ this._rawIpc.addEventListener("message", callback);
550
+ }
551
+ };
552
+ var wrap$4 = (worker) => {
553
+ return new IpcParentWithModuleWorker(worker);
554
+ };
555
+ var IpcParentWithModuleWorker$1 = {
556
+ __proto__: null,
557
+ create: create$4,
558
+ wrap: wrap$4
559
+ };
460
560
 
461
561
  // packages/extension-api/node_modules/@lvce-editor/command/dist/index.js
462
562
  var CommandNotFoundError = class extends Error {
@@ -977,12 +1077,39 @@ var create7 = async ({ commandMap: commandMap5, isMessagePortOpen, send: send2 }
977
1077
  });
978
1078
  };
979
1079
 
1080
+ // packages/extension-api/node_modules/@lvce-editor/rpc/dist/parts/ModuleWorkerRpcParent/ModuleWorkerRpcParent.js
1081
+ var ModuleWorkerRpcParent_exports = {};
1082
+ __export(ModuleWorkerRpcParent_exports, {
1083
+ create: () => create8
1084
+ });
1085
+
1086
+ // packages/extension-api/node_modules/@lvce-editor/rpc/dist/parts/IsWorker/IsWorker.js
1087
+ var isWorker = (value) => {
1088
+ return value instanceof Worker;
1089
+ };
1090
+
1091
+ // packages/extension-api/node_modules/@lvce-editor/rpc/dist/parts/ModuleWorkerRpcParent/ModuleWorkerRpcParent.js
1092
+ var create8 = async ({ commandMap: commandMap5, name, url }) => {
1093
+ register(commandMap5);
1094
+ const worker = await IpcParentWithModuleWorker$1.create({
1095
+ name,
1096
+ url
1097
+ });
1098
+ if (!isWorker(worker)) {
1099
+ throw new Error(`worker must be of type Worker`);
1100
+ }
1101
+ const ipc = IpcParentWithModuleWorker$1.wrap(worker);
1102
+ handleIpc(ipc);
1103
+ const workerRpc = createRpc(ipc);
1104
+ return workerRpc;
1105
+ };
1106
+
980
1107
  // packages/extension-api/node_modules/@lvce-editor/rpc/dist/parts/WebWorkerRpcClient/WebWorkerRpcClient.js
981
1108
  var WebWorkerRpcClient_exports = {};
982
1109
  __export(WebWorkerRpcClient_exports, {
983
- create: () => create8
1110
+ create: () => create9
984
1111
  });
985
- var create8 = async ({ commandMap: commandMap5 }) => {
1112
+ var create9 = async ({ commandMap: commandMap5 }) => {
986
1113
  register(commandMap5);
987
1114
  const ipc = await listen(IpcChildWithModuleWorkerAndMessagePort$1);
988
1115
  handleIpc(ipc);
@@ -1022,7 +1149,7 @@ var remove2 = (id2) => {
1022
1149
  };
1023
1150
 
1024
1151
  // packages/extension-api/node_modules/@lvce-editor/rpc-registry/dist/parts/RpcFactory/RpcFactory.js
1025
- var create9 = (rpcId) => {
1152
+ var create10 = (rpcId) => {
1026
1153
  return {
1027
1154
  async dispose() {
1028
1155
  const rpc = get2(rpcId);
@@ -1370,7 +1497,7 @@ __export(ExtensionManagementWorker_exports, {
1370
1497
  set: () => set2,
1371
1498
  uninstall: () => uninstall
1372
1499
  });
1373
- var { dispose, invoke, invokeAndTransfer, registerMockRpc, set: set2 } = create9(RpcId_exports.ExtensionManagementWorker);
1500
+ var { dispose, invoke, invokeAndTransfer, registerMockRpc, set: set2 } = create10(RpcId_exports.ExtensionManagementWorker);
1374
1501
  var enable = (id2) => {
1375
1502
  return invoke(`Extensions.enable`, id2);
1376
1503
  };
@@ -1425,7 +1552,7 @@ __export(FileSystemWorker_exports, {
1425
1552
  watchFile: () => watchFile,
1426
1553
  writeFile: () => writeFile
1427
1554
  });
1428
- var { dispose: dispose2, invoke: invoke2, invokeAndTransfer: invokeAndTransfer2, registerMockRpc: registerMockRpc2, set: set3 } = create9(RpcId_exports.FileSystemWorker);
1555
+ var { dispose: dispose2, invoke: invoke2, invokeAndTransfer: invokeAndTransfer2, registerMockRpc: registerMockRpc2, set: set3 } = create10(RpcId_exports.FileSystemWorker);
1429
1556
  var remove3 = async (dirent) => {
1430
1557
  return invoke2("FileSystem.remove", dirent);
1431
1558
  };
@@ -2723,6 +2850,23 @@ var withFocusSelector = async (result, instance, contextChange) => {
2723
2850
  focusSelector
2724
2851
  };
2725
2852
  };
2853
+ var withTitle = async (result, instance) => {
2854
+ if (typeof instance.renderTitle !== "function") {
2855
+ return result;
2856
+ }
2857
+ const title = await instance.renderTitle();
2858
+ if (typeof title !== "string") {
2859
+ throw new ExtensionApiError("view renderTitle result must be a string");
2860
+ }
2861
+ return {
2862
+ ...result,
2863
+ title
2864
+ };
2865
+ };
2866
+ var withRenderMetadata = async (result, instance, contextChange) => {
2867
+ const resultWithFocus = await withFocusSelector(result, instance, contextChange);
2868
+ return withTitle(resultWithFocus, instance);
2869
+ };
2726
2870
  var maybeClearContext = async (uid, viewId) => {
2727
2871
  if (!contexts[uid]) {
2728
2872
  return;
@@ -2765,7 +2909,7 @@ var createViewInstance = async (viewId, uid, context) => {
2765
2909
  type: "setDom"
2766
2910
  };
2767
2911
  const contextChange = await maybeNotifyContextChanged(uid, viewId, instance);
2768
- return withFocusSelector(result, instance, contextChange);
2912
+ return withRenderMetadata(result, instance, contextChange);
2769
2913
  };
2770
2914
  var dispatchViewEvent = async (uid, event) => {
2771
2915
  const instance = getVirtualDomInstance(uid);
@@ -2777,13 +2921,13 @@ var dispatchViewEvent = async (uid, event) => {
2777
2921
  }
2778
2922
  const result = await renderPatches(uid, instance);
2779
2923
  const contextChange = await maybeNotifyContextChanged(uid, contextViewIds[uid], instance);
2780
- return withFocusSelector(result, instance, contextChange);
2924
+ return withRenderMetadata(result, instance, contextChange);
2781
2925
  };
2782
2926
  var renderViewInstance = async (uid) => {
2783
2927
  const instance = getVirtualDomInstance(uid);
2784
2928
  const result = await renderPatches(uid, instance);
2785
2929
  const contextChange = await maybeNotifyContextChanged(uid, contextViewIds[uid], instance);
2786
- return withFocusSelector(result, instance, contextChange);
2930
+ return withRenderMetadata(result, instance, contextChange);
2787
2931
  };
2788
2932
  var disposeViewInstance = async (uid) => {
2789
2933
  const instance = instances[uid];
@@ -3000,10 +3144,27 @@ var mkdir2 = async (uri) => {
3000
3144
  var remove4 = async (uri) => {
3001
3145
  await FileSystemWorker_exports.remove(uri);
3002
3146
  };
3147
+ var stat2 = async (uri) => {
3148
+ return FileSystemWorker_exports.stat(uri);
3149
+ };
3003
3150
  var writeFile2 = async (uri, content) => {
3004
3151
  await FileSystemWorker_exports.writeFile(uri, content);
3005
3152
  };
3006
3153
 
3154
+ // packages/extension-api/src/parts/Host/Host.ts
3155
+ var confirm = async (message) => {
3156
+ return Boolean(await executeCommand2("ConfirmPrompt.prompt", message));
3157
+ };
3158
+ var getWorkspaceFolder = async () => {
3159
+ return await executeCommand2("Workspace.getPath");
3160
+ };
3161
+ var handleWorkspaceRefresh = async () => {
3162
+ await executeCommand2("Layout.handleWorkspaceRefresh");
3163
+ };
3164
+ var openUri = async (uri) => {
3165
+ await executeCommand2("Main.openUri", uri);
3166
+ };
3167
+
3007
3168
  // packages/extension-api/src/parts/CommandMap/CommandMap.ts
3008
3169
  var commandMap4 = {
3009
3170
  ...commandMap,
@@ -3029,9 +3190,36 @@ var handleExtensionManagementMessagePort2 = async ({
3029
3190
  messagePort: port
3030
3191
  });
3031
3192
  };
3193
+
3194
+ // packages/extension-api/src/parts/Rpc/Rpc.ts
3195
+ var sendMessagePortToNode = async (port) => {
3196
+ await ExtensionManagementWorker_exports.invokeAndTransfer(
3197
+ "Extensions.sendMessagePortToElectron",
3198
+ port,
3199
+ "HandleMessagePortForExtensionHostHelperProcess.handleMessagePortForExtensionHostHelperProcess"
3200
+ );
3201
+ };
3202
+ var createRpc2 = async ({ commandMap: commandMap5 = {}, name = "", url }) => {
3203
+ return ModuleWorkerRpcParent_exports.create({
3204
+ commandMap: commandMap5,
3205
+ name,
3206
+ url
3207
+ });
3208
+ };
3209
+ var createNodeRpc = async ({ path }) => {
3210
+ const rpc = await LazyTransferMessagePortRpcParent_exports.create({
3211
+ commandMap: {},
3212
+ send: sendMessagePortToNode
3213
+ });
3214
+ await rpc.invoke("LoadFile.loadFile", path);
3215
+ return rpc;
3216
+ };
3032
3217
  export {
3033
3218
  activate,
3219
+ confirm,
3220
+ createNodeRpc,
3034
3221
  createOutputChannel,
3222
+ createRpc2 as createRpc,
3035
3223
  createViewInstance,
3036
3224
  dispatchViewEvent,
3037
3225
  disposeViewInstance,
@@ -3062,8 +3250,11 @@ export {
3062
3250
  getPreference,
3063
3251
  getStatusBarItemProviderRegistrySnapshot,
3064
3252
  getViewRegistrySnapshot,
3253
+ getWorkspaceFolder,
3065
3254
  handleExtensionManagementMessagePort2 as handleExtensionManagementMessagePort,
3255
+ handleWorkspaceRefresh,
3066
3256
  mkdir2 as mkdir,
3257
+ openUri,
3067
3258
  readDirWithFileTypes2 as readDirWithFileTypes,
3068
3259
  readFile2 as readFile,
3069
3260
  registerCommand,
@@ -3087,5 +3278,6 @@ export {
3087
3278
  saveViewInstanceState,
3088
3279
  setPreference,
3089
3280
  showQuickPick,
3281
+ stat2 as stat,
3090
3282
  writeFile2 as writeFile
3091
3283
  };
@@ -21,6 +21,9 @@ const mkdir = async (uri) => {
21
21
  const remove = async (uri) => {
22
22
  await FileSystemWorker.remove(uri);
23
23
  };
24
+ const stat = async (uri) => {
25
+ return FileSystemWorker.stat(uri);
26
+ };
24
27
  const writeFile = async (uri, content) => {
25
28
  await FileSystemWorker.writeFile(uri, content);
26
29
  };
@@ -30,5 +33,6 @@ export {
30
33
  readDirWithFileTypes,
31
34
  readFile,
32
35
  remove,
36
+ stat,
33
37
  writeFile
34
38
  };
@@ -0,0 +1,19 @@
1
+ import { executeCommand } from "../ExecuteCommand/ExecuteCommand.js";
2
+ const confirm = async (message) => {
3
+ return Boolean(await executeCommand("ConfirmPrompt.prompt", message));
4
+ };
5
+ const getWorkspaceFolder = async () => {
6
+ return await executeCommand("Workspace.getPath");
7
+ };
8
+ const handleWorkspaceRefresh = async () => {
9
+ await executeCommand("Layout.handleWorkspaceRefresh");
10
+ };
11
+ const openUri = async (uri) => {
12
+ await executeCommand("Main.openUri", uri);
13
+ };
14
+ export {
15
+ confirm,
16
+ getWorkspaceFolder,
17
+ handleWorkspaceRefresh,
18
+ openUri
19
+ };
@@ -0,0 +1,28 @@
1
+ import { LazyTransferMessagePortRpcParent, ModuleWorkerRpcParent } from "@lvce-editor/rpc";
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
+ );
9
+ };
10
+ const createRpc = async ({ commandMap = {}, name = "", url }) => {
11
+ return ModuleWorkerRpcParent.create({
12
+ commandMap,
13
+ name,
14
+ url
15
+ });
16
+ };
17
+ const createNodeRpc = async ({ path }) => {
18
+ const rpc = await LazyTransferMessagePortRpcParent.create({
19
+ commandMap: {},
20
+ send: sendMessagePortToNode
21
+ });
22
+ await rpc.invoke("LoadFile.loadFile", path);
23
+ return rpc;
24
+ };
25
+ export {
26
+ createNodeRpc,
27
+ createRpc
28
+ };
@@ -323,6 +323,23 @@ const withFocusSelector = async (result, instance, contextChange) => {
323
323
  focusSelector
324
324
  };
325
325
  };
326
+ const withTitle = async (result, instance) => {
327
+ if (typeof instance.renderTitle !== "function") {
328
+ return result;
329
+ }
330
+ const title = await instance.renderTitle();
331
+ if (typeof title !== "string") {
332
+ throw new ExtensionApiError("view renderTitle result must be a string");
333
+ }
334
+ return {
335
+ ...result,
336
+ title
337
+ };
338
+ };
339
+ const withRenderMetadata = async (result, instance, contextChange) => {
340
+ const resultWithFocus = await withFocusSelector(result, instance, contextChange);
341
+ return withTitle(resultWithFocus, instance);
342
+ };
326
343
  const maybeClearContext = async (uid, viewId) => {
327
344
  if (!contexts[uid]) {
328
345
  return;
@@ -365,7 +382,7 @@ const createViewInstance = async (viewId, uid, context) => {
365
382
  type: "setDom"
366
383
  };
367
384
  const contextChange = await maybeNotifyContextChanged(uid, viewId, instance);
368
- return withFocusSelector(result, instance, contextChange);
385
+ return withRenderMetadata(result, instance, contextChange);
369
386
  };
370
387
  const dispatchViewEvent = async (uid, event) => {
371
388
  const instance = getVirtualDomInstance(uid);
@@ -377,13 +394,13 @@ const dispatchViewEvent = async (uid, event) => {
377
394
  }
378
395
  const result = await renderPatches(uid, instance);
379
396
  const contextChange = await maybeNotifyContextChanged(uid, contextViewIds[uid], instance);
380
- return withFocusSelector(result, instance, contextChange);
397
+ return withRenderMetadata(result, instance, contextChange);
381
398
  };
382
399
  const renderViewInstance = async (uid) => {
383
400
  const instance = getVirtualDomInstance(uid);
384
401
  const result = await renderPatches(uid, instance);
385
402
  const contextChange = await maybeNotifyContextChanged(uid, contextViewIds[uid], instance);
386
- return withFocusSelector(result, instance, contextChange);
403
+ return withRenderMetadata(result, instance, contextChange);
387
404
  };
388
405
  const disposeViewInstance = async (uid) => {
389
406
  const instance = instances[uid];
@@ -3855,6 +3855,19 @@ const renderDom = async instance => {
3855
3855
  }
3856
3856
  return dom;
3857
3857
  };
3858
+ const withTitle = async (result, instance) => {
3859
+ if (typeof instance.renderTitle !== 'function') {
3860
+ return result;
3861
+ }
3862
+ const title = await instance.renderTitle();
3863
+ if (typeof title !== 'string') {
3864
+ throw new TypeError('view renderTitle result must be a string');
3865
+ }
3866
+ return {
3867
+ ...result,
3868
+ title
3869
+ };
3870
+ };
3858
3871
  const createViewInstance = async (viewId, uid, context) => {
3859
3872
  const view = state$6.views[viewId];
3860
3873
  if (!view) {
@@ -3872,10 +3885,10 @@ const createViewInstance = async (viewId, uid, context) => {
3872
3885
  state$6.instances[uid] = instance;
3873
3886
  const dom = await renderDom(instance);
3874
3887
  state$6.renderedDoms[uid] = dom;
3875
- return {
3888
+ return withTitle({
3876
3889
  dom,
3877
3890
  type: 'setDom'
3878
- };
3891
+ }, instance);
3879
3892
  };
3880
3893
  const dispatchViewEvent = async (uid, event) => {
3881
3894
  const instance = getVirtualDomInstance(uid);
@@ -3886,10 +3899,10 @@ const dispatchViewEvent = async (uid, event) => {
3886
3899
  const newDom = await renderDom(instance);
3887
3900
  state$6.renderedDoms[uid] = newDom;
3888
3901
  const patches = diffTree(oldDom, newDom);
3889
- return {
3902
+ return withTitle({
3890
3903
  patches,
3891
3904
  type: 'setPatches'
3892
- };
3905
+ }, instance);
3893
3906
  };
3894
3907
  const saveViewInstanceState = async uid => {
3895
3908
  const instance = getVirtualDomInstance(uid);
@@ -6,7 +6,8 @@ export { registerCommand } from './parts/CommandRegistry/CommandRegistry.ts';
6
6
  export { executeCompletionProvider, executeResolveCompletionItemProvider, getCompletionProviderRegistrySnapshot, registerCompletionProvider, resetCompletionProviderRegistry, } from './parts/Completion/Completion.ts';
7
7
  export { executeDiagnosticProvider, getDiagnosticProviderRegistrySnapshot, registerDiagnosticProvider, resetDiagnosticProviderRegistry, } from './parts/Diagnostic/Diagnostic.ts';
8
8
  export { executeFormattingProvider, getFormattingProviderRegistrySnapshot, registerFormattingProvider, resetFormattingProviderRegistry, } from './parts/Formatting/Formatting.ts';
9
- export { exists, mkdir, readDirWithFileTypes, readFile, remove, writeFile } from './parts/FileSystem/FileSystem.ts';
9
+ export { exists, mkdir, readDirWithFileTypes, readFile, remove, stat, writeFile } from './parts/FileSystem/FileSystem.ts';
10
+ export { confirm, getWorkspaceFolder, handleWorkspaceRefresh, openUri } from './parts/Host/Host.ts';
10
11
  export { executeHoverProvider, getHoverProviderRegistrySnapshot, registerHoverProvider, resetHoverProviderRegistry } from './parts/Hover/Hover.ts';
11
12
  export { executeSourceControlAcceptInput, executeSourceControlAdd, executeSourceControlDiscard, executeSourceControlGenerateCommitMessage, executeSourceControlGetBadgeCount, executeSourceControlGetChangedFiles, executeSourceControlGetFeatures, executeSourceControlGetFileBefore, executeSourceControlGetFileDecorations, executeSourceControlGetGroups, executeSourceControlIsActive, registerSourceControlProvider, resetSourceControlProviderRegistry, } from './parts/SourceControl/SourceControl.ts';
12
13
  export { createViewInstance, dispatchViewEvent, disposeViewInstance, executeViewProvider, getViewRegistrySnapshot, renderViewInstance, registerView, resetViewRegistry, saveViewInstanceState, } from './parts/ViewRegistry/ViewRegistry.ts';
@@ -14,6 +15,7 @@ export { createOutputChannel, getOutputChannelRegistrySnapshot, resetOutputChann
14
15
  export { getStatusBarItemProviderRegistrySnapshot, registerStatusBarItemProvider, resetStatusBarItemProviderRegistry, } from './parts/StatusBar/StatusBar.ts';
15
16
  export type { RegisteredView, View, ViewAction, ViewCommand, ViewContext, ViewEvent, ViewKind, MenuEntry, ViewRegistrySnapshot, ViewRenderResult, VirtualDomViewInstance, } from './parts/View/View.ts';
16
17
  export { handleExtensionManagementMessagePort } from './parts/HandleExtensionManagementMessagePort/HandleExtensionManagementMessagePort.ts';
18
+ export { createNodeRpc, createRpc } from './parts/Rpc/Rpc.ts';
17
19
  export type { Command } from './parts/Command/Command.ts';
18
20
  export type { CommandCallback } from './parts/CommandCallback/CommandCallback.ts';
19
21
  export type { CommandRegistrySnapshot } from './parts/CommandRegistrySnapshot/CommandRegistrySnapshot.ts';
@@ -28,6 +30,7 @@ export type { OutputChannel } from './parts/OutputChannelHandle/OutputChannelHan
28
30
  export type { OutputChannelRegistrySnapshot } from './parts/OutputChannelRegistrySnapshot/OutputChannelRegistrySnapshot.ts';
29
31
  export type { RegisteredOutputChannel } from './parts/RegisteredOutputChannel/RegisteredOutputChannel.ts';
30
32
  export type { QuickPickItem } from './parts/QuickPickItem/QuickPickItem.ts';
33
+ export type { CreateNodeRpcOptions, CreateRpcOptions } from './parts/Rpc/Rpc.ts';
31
34
  export type { RegisteredSourceControlProvider, SourceControlProvider, SourceControlProviderRegistrySnapshot, } from './parts/SourceControl/SourceControl.ts';
32
35
  export type { ShowQuickPickOptions } from './parts/ShowQuickPickOptions/ShowQuickPickOptions.ts';
33
36
  export type { StatusBarItem, StatusBarItemProvider, StatusBarItemProviderHandle, StatusBarItemProviderRegistrySnapshot, } from './parts/StatusBar/StatusBar.ts';
@@ -6,10 +6,12 @@ export { registerCommand } from "./parts/CommandRegistry/CommandRegistry.js";
6
6
  export { executeCompletionProvider, executeResolveCompletionItemProvider, getCompletionProviderRegistrySnapshot, registerCompletionProvider, resetCompletionProviderRegistry, } from "./parts/Completion/Completion.js";
7
7
  export { executeDiagnosticProvider, getDiagnosticProviderRegistrySnapshot, registerDiagnosticProvider, resetDiagnosticProviderRegistry, } from "./parts/Diagnostic/Diagnostic.js";
8
8
  export { executeFormattingProvider, getFormattingProviderRegistrySnapshot, registerFormattingProvider, resetFormattingProviderRegistry, } from "./parts/Formatting/Formatting.js";
9
- export { exists, mkdir, readDirWithFileTypes, readFile, remove, writeFile } from "./parts/FileSystem/FileSystem.js";
9
+ export { exists, mkdir, readDirWithFileTypes, readFile, remove, stat, writeFile } from "./parts/FileSystem/FileSystem.js";
10
+ export { confirm, getWorkspaceFolder, handleWorkspaceRefresh, openUri } from "./parts/Host/Host.js";
10
11
  export { executeHoverProvider, getHoverProviderRegistrySnapshot, registerHoverProvider, resetHoverProviderRegistry } from "./parts/Hover/Hover.js";
11
12
  export { executeSourceControlAcceptInput, executeSourceControlAdd, executeSourceControlDiscard, executeSourceControlGenerateCommitMessage, executeSourceControlGetBadgeCount, executeSourceControlGetChangedFiles, executeSourceControlGetFeatures, executeSourceControlGetFileBefore, executeSourceControlGetFileDecorations, executeSourceControlGetGroups, executeSourceControlIsActive, registerSourceControlProvider, resetSourceControlProviderRegistry, } from "./parts/SourceControl/SourceControl.js";
12
13
  export { createViewInstance, dispatchViewEvent, disposeViewInstance, executeViewProvider, getViewRegistrySnapshot, renderViewInstance, registerView, resetViewRegistry, saveViewInstanceState, } from "./parts/ViewRegistry/ViewRegistry.js";
13
14
  export { createOutputChannel, getOutputChannelRegistrySnapshot, resetOutputChannelRegistry } from "./parts/OutputChannel/OutputChannel.js";
14
15
  export { getStatusBarItemProviderRegistrySnapshot, registerStatusBarItemProvider, resetStatusBarItemProviderRegistry, } from "./parts/StatusBar/StatusBar.js";
15
16
  export { handleExtensionManagementMessagePort } from "./parts/HandleExtensionManagementMessagePort/HandleExtensionManagementMessagePort.js";
17
+ export { createNodeRpc, createRpc } from "./parts/Rpc/Rpc.js";
@@ -4,5 +4,6 @@ export declare const readDirWithFileTypes: (uri: string) => Promise<readonly Fil
4
4
  export declare const readFile: (uri: string) => Promise<string>;
5
5
  export declare const mkdir: (uri: string) => Promise<void>;
6
6
  export declare const remove: (uri: string) => Promise<void>;
7
+ export declare const stat: (uri: string) => Promise<unknown>;
7
8
  export declare const writeFile: (uri: string, content: string) => Promise<void>;
8
9
  export type { FileSystemDirent } from '../FileSystemDirent/FileSystemDirent.ts';
@@ -21,6 +21,9 @@ export const mkdir = async (uri) => {
21
21
  export const remove = async (uri) => {
22
22
  await FileSystemWorker.remove(uri);
23
23
  };
24
+ export const stat = async (uri) => {
25
+ return FileSystemWorker.stat(uri);
26
+ };
24
27
  export const writeFile = async (uri, content) => {
25
28
  await FileSystemWorker.writeFile(uri, content);
26
29
  };
@@ -0,0 +1,4 @@
1
+ export declare const confirm: (message: string) => Promise<boolean>;
2
+ export declare const getWorkspaceFolder: () => Promise<string>;
3
+ export declare const handleWorkspaceRefresh: () => Promise<void>;
4
+ export declare const openUri: (uri: string) => Promise<void>;
@@ -0,0 +1,13 @@
1
+ import { executeCommand } from "../ExecuteCommand/ExecuteCommand.js";
2
+ export const confirm = async (message) => {
3
+ return Boolean(await executeCommand('ConfirmPrompt.prompt', message));
4
+ };
5
+ export const getWorkspaceFolder = async () => {
6
+ return (await executeCommand('Workspace.getPath'));
7
+ };
8
+ export const handleWorkspaceRefresh = async () => {
9
+ await executeCommand('Layout.handleWorkspaceRefresh');
10
+ };
11
+ export const openUri = async (uri) => {
12
+ await executeCommand('Main.openUri', uri);
13
+ };
@@ -0,0 +1,12 @@
1
+ import { type Rpc } from '@lvce-editor/rpc';
2
+ export interface CreateRpcOptions {
3
+ readonly commandMap?: Record<string, unknown>;
4
+ readonly name?: string;
5
+ readonly url: string;
6
+ }
7
+ export interface CreateNodeRpcOptions {
8
+ readonly name?: string;
9
+ readonly path: string;
10
+ }
11
+ export declare const createRpc: ({ commandMap, name, url }: CreateRpcOptions) => Promise<Rpc>;
12
+ export declare const createNodeRpc: ({ path }: CreateNodeRpcOptions) => Promise<Rpc>;
@@ -0,0 +1,20 @@
1
+ import { LazyTransferMessagePortRpcParent, ModuleWorkerRpcParent } from '@lvce-editor/rpc';
2
+ import { ExtensionManagementWorker } from '@lvce-editor/rpc-registry';
3
+ const sendMessagePortToNode = async (port) => {
4
+ await ExtensionManagementWorker.invokeAndTransfer('Extensions.sendMessagePortToElectron', port, 'HandleMessagePortForExtensionHostHelperProcess.handleMessagePortForExtensionHostHelperProcess');
5
+ };
6
+ export const createRpc = async ({ commandMap = {}, name = '', url }) => {
7
+ return ModuleWorkerRpcParent.create({
8
+ commandMap,
9
+ name,
10
+ url,
11
+ });
12
+ };
13
+ export const createNodeRpc = async ({ path }) => {
14
+ const rpc = await LazyTransferMessagePortRpcParent.create({
15
+ commandMap: {},
16
+ send: sendMessagePortToNode,
17
+ });
18
+ await rpc.invoke('LoadFile.loadFile', path);
19
+ return rpc;
20
+ };
@@ -42,6 +42,7 @@ export interface VirtualDomViewInstance {
42
42
  readonly render: () => readonly VirtualDomNode[] | Promise<readonly VirtualDomNode[]>;
43
43
  readonly renderActions?: () => readonly ViewAction[] | Promise<readonly ViewAction[]>;
44
44
  readonly renderFocus?: (oldContext: Readonly<Record<string, boolean>>, newContext: Readonly<Record<string, boolean>>) => string | Promise<string>;
45
+ readonly renderTitle?: () => string | Promise<string>;
45
46
  readonly saveState?: () => unknown;
46
47
  }
47
48
  export type ViewCommand<State = VirtualDomViewInstance, Args extends readonly any[] = readonly any[]> = (state: State, ...args: Args) => State | Promise<State>;
@@ -71,11 +72,13 @@ export interface ViewRegistrySnapshot {
71
72
  export interface ViewRenderResultDom {
72
73
  readonly dom: readonly VirtualDomNode[];
73
74
  readonly focusSelector?: string;
75
+ readonly title?: string;
74
76
  readonly type: 'setDom';
75
77
  }
76
78
  export interface ViewRenderResultPatches {
77
79
  readonly focusSelector?: string;
78
80
  readonly patches: readonly unknown[];
81
+ readonly title?: string;
79
82
  readonly type: 'setPatches';
80
83
  }
81
84
  export type ViewRenderResult = ViewRenderResultDom | ViewRenderResultPatches;
@@ -323,6 +323,23 @@ const withFocusSelector = async (result, instance, contextChange) => {
323
323
  focusSelector,
324
324
  };
325
325
  };
326
+ const withTitle = async (result, instance) => {
327
+ if (typeof instance.renderTitle !== 'function') {
328
+ return result;
329
+ }
330
+ const title = await instance.renderTitle();
331
+ if (typeof title !== 'string') {
332
+ throw new ExtensionApiError('view renderTitle result must be a string');
333
+ }
334
+ return {
335
+ ...result,
336
+ title,
337
+ };
338
+ };
339
+ const withRenderMetadata = async (result, instance, contextChange) => {
340
+ const resultWithFocus = await withFocusSelector(result, instance, contextChange);
341
+ return withTitle(resultWithFocus, instance);
342
+ };
326
343
  const maybeClearContext = async (uid, viewId) => {
327
344
  if (!contexts[uid]) {
328
345
  return;
@@ -365,7 +382,7 @@ export const createViewInstance = async (viewId, uid, context) => {
365
382
  type: 'setDom',
366
383
  };
367
384
  const contextChange = await maybeNotifyContextChanged(uid, viewId, instance);
368
- return withFocusSelector(result, instance, contextChange);
385
+ return withRenderMetadata(result, instance, contextChange);
369
386
  };
370
387
  export const dispatchViewEvent = async (uid, event) => {
371
388
  const instance = getVirtualDomInstance(uid);
@@ -377,13 +394,13 @@ export const dispatchViewEvent = async (uid, event) => {
377
394
  }
378
395
  const result = await renderPatches(uid, instance);
379
396
  const contextChange = await maybeNotifyContextChanged(uid, contextViewIds[uid], instance);
380
- return withFocusSelector(result, instance, contextChange);
397
+ return withRenderMetadata(result, instance, contextChange);
381
398
  };
382
399
  export const renderViewInstance = async (uid) => {
383
400
  const instance = getVirtualDomInstance(uid);
384
401
  const result = await renderPatches(uid, instance);
385
402
  const contextChange = await maybeNotifyContextChanged(uid, contextViewIds[uid], instance);
386
- return withFocusSelector(result, instance, contextChange);
403
+ return withRenderMetadata(result, instance, contextChange);
387
404
  };
388
405
  export const disposeViewInstance = async (uid) => {
389
406
  const instance = instances[uid];
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvce-editor/api",
3
- "version": "8.41.0",
3
+ "version": "8.43.0",
4
4
  "description": "Tree-shakeable extension API for Lvce Editor extensions.",
5
5
  "keywords": [
6
6
  "lvce-editor",