@lvce-editor/extension-detail-view 3.62.0 → 3.64.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.
@@ -668,1990 +668,2032 @@ const create$7 = rpcId => {
668
668
  };
669
669
  };
670
670
 
671
- const {
672
- invoke: invoke$5,
673
- invokeAndTransfer: invokeAndTransfer$4,
674
- set: set$9,
675
- dispose: dispose$5
676
- } = create$7(ExtensionHostWorker);
677
- const executeReferenceProvider = async (id, offset) => {
678
- // @ts-ignore
679
- return invoke$5('ExtensionHostReference.executeReferenceProvider', id, offset);
671
+ const normalizeLine = line => {
672
+ if (line.startsWith('Error: ')) {
673
+ return line.slice('Error: '.length);
674
+ }
675
+ if (line.startsWith('VError: ')) {
676
+ return line.slice('VError: '.length);
677
+ }
678
+ return line;
680
679
  };
681
- const executeFileReferenceProvider = async id => {
682
- // @ts-ignore
683
- return invoke$5('ExtensionHostReference.executeFileReferenceProvider', id);
680
+ const getCombinedMessage = (error, message) => {
681
+ const stringifiedError = normalizeLine(`${error}`);
682
+ if (message) {
683
+ return `${message}: ${stringifiedError}`;
684
+ }
685
+ return stringifiedError;
684
686
  };
685
- const getRuntimeStatus$2 = async extensionId => {
686
- // @ts-ignore
687
- return invoke$5('ExtensionHost.getRuntimeStatus', extensionId);
687
+ const NewLine$2 = '\n';
688
+ const getNewLineIndex$1 = (string, startIndex = undefined) => {
689
+ return string.indexOf(NewLine$2, startIndex);
688
690
  };
689
-
690
- const ExtensionHost = {
691
- __proto__: null,
692
- dispose: dispose$5,
693
- executeFileReferenceProvider,
694
- executeReferenceProvider,
695
- getRuntimeStatus: getRuntimeStatus$2,
696
- invoke: invoke$5,
697
- invokeAndTransfer: invokeAndTransfer$4,
698
- set: set$9
691
+ const mergeStacks = (parent, child) => {
692
+ if (!child) {
693
+ return parent;
694
+ }
695
+ const parentNewLineIndex = getNewLineIndex$1(parent);
696
+ const childNewLineIndex = getNewLineIndex$1(child);
697
+ if (childNewLineIndex === -1) {
698
+ return parent;
699
+ }
700
+ const parentFirstLine = parent.slice(0, parentNewLineIndex);
701
+ const childRest = child.slice(childNewLineIndex);
702
+ const childFirstLine = normalizeLine(child.slice(0, childNewLineIndex));
703
+ if (parentFirstLine.includes(childFirstLine)) {
704
+ return parentFirstLine + childRest;
705
+ }
706
+ return child;
699
707
  };
708
+ class VError extends Error {
709
+ constructor(error, message) {
710
+ const combinedMessage = getCombinedMessage(error, message);
711
+ super(combinedMessage);
712
+ this.name = 'VError';
713
+ if (error instanceof Error) {
714
+ this.stack = mergeStacks(this.stack, error.stack);
715
+ }
716
+ if (error.codeFrame) {
717
+ // @ts-ignore
718
+ this.codeFrame = error.codeFrame;
719
+ }
720
+ if (error.code) {
721
+ // @ts-ignore
722
+ this.code = error.code;
723
+ }
724
+ }
725
+ }
700
726
 
701
- const {
702
- invoke: invoke$4,
703
- invokeAndTransfer: invokeAndTransfer$3,
704
- set: set$8,
705
- dispose: dispose$4
706
- } = create$7(FileSystemWorker$1);
707
- const remove$1 = async dirent => {
708
- return invoke$4('FileSystem.remove', dirent);
727
+ class AssertionError extends Error {
728
+ constructor(message) {
729
+ super(message);
730
+ this.name = 'AssertionError';
731
+ }
732
+ }
733
+ const Object$1 = 1;
734
+ const Number$1 = 2;
735
+ const Array$1 = 3;
736
+ const String = 4;
737
+ const Boolean$1 = 5;
738
+ const Function = 6;
739
+ const Null = 7;
740
+ const Unknown = 8;
741
+ const getType = value => {
742
+ switch (typeof value) {
743
+ case 'number':
744
+ return Number$1;
745
+ case 'function':
746
+ return Function;
747
+ case 'string':
748
+ return String;
749
+ case 'object':
750
+ if (value === null) {
751
+ return Null;
752
+ }
753
+ if (Array.isArray(value)) {
754
+ return Array$1;
755
+ }
756
+ return Object$1;
757
+ case 'boolean':
758
+ return Boolean$1;
759
+ default:
760
+ return Unknown;
761
+ }
709
762
  };
710
- const readDirWithFileTypes = async uri => {
711
- return invoke$4('FileSystem.readDirWithFileTypes', uri);
763
+ const string = value => {
764
+ const type = getType(value);
765
+ if (type !== String) {
766
+ throw new AssertionError('expected value to be of type string');
767
+ }
712
768
  };
713
- const getPathSeparator = async root => {
714
- // @ts-ignore
715
- return invoke$4('FileSystem.getPathSeparator', root);
769
+
770
+ const isMessagePort = value => {
771
+ return value && value instanceof MessagePort;
716
772
  };
717
- const getRealPath = async path => {
718
- return invoke$4('FileSystem.getRealPath', path);
773
+ const isMessagePortMain = value => {
774
+ return value && value.constructor && value.constructor.name === 'MessagePortMain';
719
775
  };
720
- const stat = async dirent => {
721
- return invoke$4('FileSystem.stat', dirent);
776
+ const isOffscreenCanvas = value => {
777
+ return typeof OffscreenCanvas !== 'undefined' && value instanceof OffscreenCanvas;
722
778
  };
723
- const createFile = async uri => {
724
- return invoke$4('FileSystem.writeFile', uri, '');
779
+ const isInstanceOf = (value, constructorName) => {
780
+ return value?.constructor?.name === constructorName;
725
781
  };
726
- const readFile$3 = async uri => {
727
- return invoke$4('FileSystem.readFile', uri);
782
+ const isSocket = value => {
783
+ return isInstanceOf(value, 'Socket');
728
784
  };
729
- const writeFile = async (uri, content) => {
730
- return invoke$4('FileSystem.writeFile', uri, content);
785
+ const transferrables = [isMessagePort, isMessagePortMain, isOffscreenCanvas, isSocket];
786
+ const isTransferrable = value => {
787
+ for (const fn of transferrables) {
788
+ if (fn(value)) {
789
+ return true;
790
+ }
791
+ }
792
+ return false;
731
793
  };
732
- const mkdir = async uri => {
733
- return invoke$4('FileSystem.mkdir', uri);
794
+ const walkValue = (value, transferrables, isTransferrable) => {
795
+ if (!value) {
796
+ return;
797
+ }
798
+ if (isTransferrable(value)) {
799
+ transferrables.push(value);
800
+ return;
801
+ }
802
+ if (Array.isArray(value)) {
803
+ for (const item of value) {
804
+ walkValue(item, transferrables, isTransferrable);
805
+ }
806
+ return;
807
+ }
808
+ if (typeof value === 'object') {
809
+ for (const property of Object.values(value)) {
810
+ walkValue(property, transferrables, isTransferrable);
811
+ }
812
+ return;
813
+ }
734
814
  };
735
- const rename = async (oldUri, newUri) => {
736
- return invoke$4('FileSystem.rename', oldUri, newUri);
815
+ const getTransferrables = value => {
816
+ const transferrables = [];
817
+ walkValue(value, transferrables, isTransferrable);
818
+ return transferrables;
737
819
  };
738
- const copy = async (oldUri, newUri) => {
739
- return invoke$4('FileSystem.copy', oldUri, newUri);
820
+ const attachEvents = that => {
821
+ const handleMessage = (...args) => {
822
+ const data = that.getData(...args);
823
+ that.dispatchEvent(new MessageEvent('message', {
824
+ data
825
+ }));
826
+ };
827
+ that.onMessage(handleMessage);
828
+ const handleClose = event => {
829
+ that.dispatchEvent(new Event('close'));
830
+ };
831
+ that.onClose(handleClose);
740
832
  };
741
- const exists$1 = async uri => {
742
- // @ts-ignore
743
- return invoke$4('FileSystem.exists', uri);
833
+ class Ipc extends EventTarget {
834
+ constructor(rawIpc) {
835
+ super();
836
+ this._rawIpc = rawIpc;
837
+ attachEvents(this);
838
+ }
839
+ }
840
+ const E_INCOMPATIBLE_NATIVE_MODULE = 'E_INCOMPATIBLE_NATIVE_MODULE';
841
+ const E_MODULES_NOT_SUPPORTED_IN_ELECTRON = 'E_MODULES_NOT_SUPPORTED_IN_ELECTRON';
842
+ const ERR_MODULE_NOT_FOUND = 'ERR_MODULE_NOT_FOUND';
843
+ const NewLine$1 = '\n';
844
+ const joinLines$1 = lines => {
845
+ return lines.join(NewLine$1);
744
846
  };
745
- const getFolderSize$2 = async uri => {
746
- // @ts-ignore
747
- return invoke$4('FileSystem.getFolderSize', uri);
847
+ const RE_AT = /^\s+at/;
848
+ const RE_AT_PROMISE_INDEX = /^\s*at async Promise.all \(index \d+\)$/;
849
+ const isNormalStackLine = line => {
850
+ return RE_AT.test(line) && !RE_AT_PROMISE_INDEX.test(line);
748
851
  };
749
- const readFileAsBlob$1 = async uri => {
750
- // @ts-ignore
751
- return invoke$4('FileSystem.readFileAsBlob', uri);
852
+ const getDetails = lines => {
853
+ const index = lines.findIndex(isNormalStackLine);
854
+ if (index === -1) {
855
+ return {
856
+ actualMessage: joinLines$1(lines),
857
+ rest: []
858
+ };
859
+ }
860
+ let lastIndex = index - 1;
861
+ while (++lastIndex < lines.length) {
862
+ if (!isNormalStackLine(lines[lastIndex])) {
863
+ break;
864
+ }
865
+ }
866
+ return {
867
+ actualMessage: lines[index - 1],
868
+ rest: lines.slice(index, lastIndex)
869
+ };
752
870
  };
753
- const appendFile = async (uri, text) => {
754
- // @ts-ignore
755
- return invoke$4('FileSystem.appendFile', uri, text);
871
+ const splitLines$1 = lines => {
872
+ return lines.split(NewLine$1);
756
873
  };
757
-
758
- const FileSystemWorker = {
759
- __proto__: null,
760
- appendFile,
761
- copy,
762
- createFile,
763
- dispose: dispose$4,
764
- exists: exists$1,
765
- getFolderSize: getFolderSize$2,
766
- getPathSeparator,
767
- getRealPath,
768
- invoke: invoke$4,
769
- invokeAndTransfer: invokeAndTransfer$3,
770
- mkdir,
771
- readDirWithFileTypes,
772
- readFile: readFile$3,
773
- readFileAsBlob: readFileAsBlob$1,
774
- remove: remove$1,
775
- rename,
776
- set: set$8,
777
- stat,
778
- writeFile
874
+ const RE_MESSAGE_CODE_BLOCK_START = /^Error: The module '.*'$/;
875
+ const RE_MESSAGE_CODE_BLOCK_END = /^\s* at/;
876
+ const isMessageCodeBlockStartIndex = line => {
877
+ return RE_MESSAGE_CODE_BLOCK_START.test(line);
779
878
  };
780
-
781
- const {
782
- invoke: invoke$3,
783
- invokeAndTransfer: invokeAndTransfer$2,
784
- set: set$7,
785
- dispose: dispose$3
786
- } = create$7(MarkdownWorker$1);
787
- const getVirtualDom$1 = async html => {
788
- // @ts-ignore
789
- return invoke$3('Markdown.getVirtualDom', html);
790
- };
791
- const render$1 = async (markdown, options) => {
792
- // @ts-ignore
793
- return invoke$3('Markdown.render', markdown, options);
794
- };
795
-
796
- const MarkdownWorker = {
797
- __proto__: null,
798
- dispose: dispose$3,
799
- getVirtualDom: getVirtualDom$1,
800
- invoke: invoke$3,
801
- invokeAndTransfer: invokeAndTransfer$2,
802
- render: render$1,
803
- set: set$7
804
- };
805
-
806
- const {
807
- invoke: invoke$2,
808
- invokeAndTransfer: invokeAndTransfer$1,
809
- set: set$6,
810
- dispose: dispose$2
811
- } = create$7(RendererWorker$1);
812
- const searchFileHtml = async uri => {
813
- return invoke$2('ExtensionHost.searchFileWithHtml', uri);
814
- };
815
- const getFilePathElectron = async file => {
816
- return invoke$2('FileSystemHandle.getFilePathElectron', file);
817
- };
818
- const showContextMenu$1 = async (x, y, id, ...args) => {
819
- return invoke$2('ContextMenu.show', x, y, id, ...args);
820
- };
821
- const getElectronVersion = async () => {
822
- return invoke$2('Process.getElectronVersion');
823
- };
824
- const applyBulkReplacement = async bulkEdits => {
825
- await invoke$2('BulkReplacement.applyBulkReplacement', bulkEdits);
879
+ const isMessageCodeBlockEndIndex = line => {
880
+ return RE_MESSAGE_CODE_BLOCK_END.test(line);
826
881
  };
827
- const setColorTheme$2 = async id => {
828
- // @ts-ignore
829
- return invoke$2(/* ColorTheme.setColorTheme */'ColorTheme.setColorTheme', /* colorThemeId */id);
882
+ const getMessageCodeBlock = stderr => {
883
+ const lines = splitLines$1(stderr);
884
+ const startIndex = lines.findIndex(isMessageCodeBlockStartIndex);
885
+ const endIndex = startIndex + lines.slice(startIndex).findIndex(isMessageCodeBlockEndIndex, startIndex);
886
+ const relevantLines = lines.slice(startIndex, endIndex);
887
+ const relevantMessage = relevantLines.join(' ').slice('Error: '.length);
888
+ return relevantMessage;
830
889
  };
831
- const getNodeVersion = async () => {
832
- return invoke$2('Process.getNodeVersion');
890
+ const isModuleNotFoundMessage = line => {
891
+ return line.includes('[ERR_MODULE_NOT_FOUND]');
833
892
  };
834
- const getChromeVersion = async () => {
835
- return invoke$2('Process.getChromeVersion');
893
+ const getModuleNotFoundError = stderr => {
894
+ const lines = splitLines$1(stderr);
895
+ const messageIndex = lines.findIndex(isModuleNotFoundMessage);
896
+ const message = lines[messageIndex];
897
+ return {
898
+ message,
899
+ code: ERR_MODULE_NOT_FOUND
900
+ };
836
901
  };
837
- const getV8Version = async () => {
838
- return invoke$2('Process.getV8Version');
902
+ const isModuleNotFoundError = stderr => {
903
+ if (!stderr) {
904
+ return false;
905
+ }
906
+ return stderr.includes('ERR_MODULE_NOT_FOUND');
839
907
  };
840
- const getFileHandles = async fileIds => {
841
- const files = await invoke$2('FileSystemHandle.getFileHandles', fileIds);
842
- return files;
908
+ const isModulesSyntaxError = stderr => {
909
+ if (!stderr) {
910
+ return false;
911
+ }
912
+ return stderr.includes('SyntaxError: Cannot use import statement outside a module');
843
913
  };
844
- const setWorkspacePath = async path => {
845
- await invoke$2('Workspace.setPath', path);
914
+ const RE_NATIVE_MODULE_ERROR = /^innerError Error: Cannot find module '.*.node'/;
915
+ const RE_NATIVE_MODULE_ERROR_2 = /was compiled against a different Node.js version/;
916
+ const isUnhelpfulNativeModuleError = stderr => {
917
+ return RE_NATIVE_MODULE_ERROR.test(stderr) && RE_NATIVE_MODULE_ERROR_2.test(stderr);
846
918
  };
847
- const registerWebViewInterceptor = async (id, port) => {
848
- await invokeAndTransfer$1('WebView.registerInterceptor', id, port);
919
+ const getNativeModuleErrorMessage = stderr => {
920
+ const message = getMessageCodeBlock(stderr);
921
+ return {
922
+ message: `Incompatible native node module: ${message}`,
923
+ code: E_INCOMPATIBLE_NATIVE_MODULE
924
+ };
849
925
  };
850
- const unregisterWebViewInterceptor = async id => {
851
- await invoke$2('WebView.unregisterInterceptor', id);
926
+ const getModuleSyntaxError = () => {
927
+ return {
928
+ message: `ES Modules are not supported in electron`,
929
+ code: E_MODULES_NOT_SUPPORTED_IN_ELECTRON
930
+ };
852
931
  };
853
- const sendMessagePortToEditorWorker = async (port, rpcId) => {
854
- const command = 'HandleMessagePort.handleMessagePort';
855
- // @ts-ignore
856
- await invokeAndTransfer$1('SendMessagePortToExtensionHostWorker.sendMessagePortToEditorWorker', port, command, rpcId);
932
+ const getHelpfulChildProcessError = (stdout, stderr) => {
933
+ if (isUnhelpfulNativeModuleError(stderr)) {
934
+ return getNativeModuleErrorMessage(stderr);
935
+ }
936
+ if (isModulesSyntaxError(stderr)) {
937
+ return getModuleSyntaxError();
938
+ }
939
+ if (isModuleNotFoundError(stderr)) {
940
+ return getModuleNotFoundError(stderr);
941
+ }
942
+ const lines = splitLines$1(stderr);
943
+ const {
944
+ actualMessage,
945
+ rest
946
+ } = getDetails(lines);
947
+ return {
948
+ message: actualMessage,
949
+ code: '',
950
+ stack: rest
951
+ };
857
952
  };
858
- const sendMessagePortToErrorWorker = async (port, rpcId) => {
859
- const command = 'Errors.handleMessagePort';
953
+ class IpcError extends VError {
860
954
  // @ts-ignore
861
- await invokeAndTransfer$1('SendMessagePortToExtensionHostWorker.sendMessagePortToErrorWorker', port, command, rpcId);
955
+ constructor(betterMessage, stdout = '', stderr = '') {
956
+ if (stdout || stderr) {
957
+ // @ts-ignore
958
+ const {
959
+ message,
960
+ code,
961
+ stack
962
+ } = getHelpfulChildProcessError(stdout, stderr);
963
+ const cause = new Error(message);
964
+ // @ts-ignore
965
+ cause.code = code;
966
+ cause.stack = stack;
967
+ super(cause, betterMessage);
968
+ } else {
969
+ super(betterMessage);
970
+ }
971
+ // @ts-ignore
972
+ this.name = 'IpcError';
973
+ // @ts-ignore
974
+ this.stdout = stdout;
975
+ // @ts-ignore
976
+ this.stderr = stderr;
977
+ }
978
+ }
979
+ const readyMessage = 'ready';
980
+ const getData$2 = event => {
981
+ return event.data;
862
982
  };
863
- const sendMessagePortToMarkdownWorker$2 = async (port, rpcId) => {
864
- const command = 'Markdown.handleMessagePort';
983
+ const listen$7 = () => {
865
984
  // @ts-ignore
866
- await invokeAndTransfer$1('SendMessagePortToExtensionHostWorker.sendMessagePortToMarkdownWorker', port, command, rpcId);
985
+ if (typeof WorkerGlobalScope === 'undefined') {
986
+ throw new TypeError('module is not in web worker scope');
987
+ }
988
+ return globalThis;
867
989
  };
868
- const sendMessagePortToFileSystemWorker$2 = async (port, rpcId) => {
869
- const command = 'FileSystem.handleMessagePort';
870
- // @ts-ignore
871
- await invokeAndTransfer$1('SendMessagePortToExtensionHostWorker.sendMessagePortToFileSystemWorker', port, command, rpcId);
990
+ const signal$8 = global => {
991
+ global.postMessage(readyMessage);
872
992
  };
873
- const readFile$2 = async uri => {
874
- return invoke$2('FileSystem.readFile', uri);
993
+ class IpcChildWithModuleWorker extends Ipc {
994
+ getData(event) {
995
+ return getData$2(event);
996
+ }
997
+ send(message) {
998
+ // @ts-ignore
999
+ this._rawIpc.postMessage(message);
1000
+ }
1001
+ sendAndTransfer(message) {
1002
+ const transfer = getTransferrables(message);
1003
+ // @ts-ignore
1004
+ this._rawIpc.postMessage(message, transfer);
1005
+ }
1006
+ dispose() {
1007
+ // ignore
1008
+ }
1009
+ onClose(callback) {
1010
+ // ignore
1011
+ }
1012
+ onMessage(callback) {
1013
+ this._rawIpc.addEventListener('message', callback);
1014
+ }
1015
+ }
1016
+ const wrap$f = global => {
1017
+ return new IpcChildWithModuleWorker(global);
875
1018
  };
876
- const getWebViewSecret = async key => {
1019
+ const waitForFirstMessage = async port => {
1020
+ const {
1021
+ resolve,
1022
+ promise
1023
+ } = Promise.withResolvers();
1024
+ port.addEventListener('message', resolve, {
1025
+ once: true
1026
+ });
1027
+ const event = await promise;
877
1028
  // @ts-ignore
878
- return invoke$2('WebView.getSecret', key);
879
- };
880
- const setWebViewPort = async (uid, port, origin, portType) => {
881
- return invokeAndTransfer$1('WebView.setPort', uid, port, origin, portType);
1029
+ return event.data;
882
1030
  };
883
- const setFocus = key => {
884
- return invoke$2('Focus.setFocus', key);
1031
+ const listen$6 = async () => {
1032
+ const parentIpcRaw = listen$7();
1033
+ signal$8(parentIpcRaw);
1034
+ const parentIpc = wrap$f(parentIpcRaw);
1035
+ const firstMessage = await waitForFirstMessage(parentIpc);
1036
+ if (firstMessage.method !== 'initialize') {
1037
+ throw new IpcError('unexpected first message');
1038
+ }
1039
+ const type = firstMessage.params[0];
1040
+ if (type === 'message-port') {
1041
+ parentIpc.send({
1042
+ jsonrpc: '2.0',
1043
+ id: firstMessage.id,
1044
+ result: null
1045
+ });
1046
+ parentIpc.dispose();
1047
+ const port = firstMessage.params[1];
1048
+ return port;
1049
+ }
1050
+ return globalThis;
885
1051
  };
886
- const getFileIcon = async options => {
887
- return invoke$2('IconTheme.getFileIcon', options);
1052
+ class IpcChildWithModuleWorkerAndMessagePort extends Ipc {
1053
+ getData(event) {
1054
+ return getData$2(event);
1055
+ }
1056
+ send(message) {
1057
+ this._rawIpc.postMessage(message);
1058
+ }
1059
+ sendAndTransfer(message) {
1060
+ const transfer = getTransferrables(message);
1061
+ this._rawIpc.postMessage(message, transfer);
1062
+ }
1063
+ dispose() {
1064
+ if (this._rawIpc.close) {
1065
+ this._rawIpc.close();
1066
+ }
1067
+ }
1068
+ onClose(callback) {
1069
+ // ignore
1070
+ }
1071
+ onMessage(callback) {
1072
+ this._rawIpc.addEventListener('message', callback);
1073
+ this._rawIpc.start();
1074
+ }
1075
+ }
1076
+ const wrap$e = port => {
1077
+ return new IpcChildWithModuleWorkerAndMessagePort(port);
888
1078
  };
889
- const getColorThemeNames = async () => {
890
- return invoke$2('ColorTheme.getColorThemeNames');
1079
+ const IpcChildWithModuleWorkerAndMessagePort$1 = {
1080
+ __proto__: null,
1081
+ listen: listen$6,
1082
+ wrap: wrap$e
891
1083
  };
892
- const disableExtension$2 = async id => {
893
- return invoke$2('ExtensionManagement.disable', id);
1084
+ const addListener = (emitter, type, callback) => {
1085
+ if ('addEventListener' in emitter) {
1086
+ emitter.addEventListener(type, callback);
1087
+ } else {
1088
+ emitter.on(type, callback);
1089
+ }
894
1090
  };
895
- const enableExtension = async id => {
896
- // @ts-ignore
897
- return invoke$2('ExtensionManagement.enable', id);
1091
+ const removeListener = (emitter, type, callback) => {
1092
+ if ('removeEventListener' in emitter) {
1093
+ emitter.removeEventListener(type, callback);
1094
+ } else {
1095
+ emitter.off(type, callback);
1096
+ }
898
1097
  };
899
- const handleDebugChange = async params => {
900
- // @ts-ignore
901
- return invoke$2('Run And Debug.handleChange', params);
902
- };
903
- const getFolderIcon = async options => {
904
- return invoke$2('IconTheme.getFolderIcon', options);
905
- };
906
- const closeWidget = async widgetId => {
907
- return invoke$2('Viewlet.closeWidget', widgetId);
908
- };
909
- const sendMessagePortToExtensionHostWorker$2 = async (port, rpcId = 0) => {
910
- const command = 'HandleMessagePort.handleMessagePort2';
911
- await invokeAndTransfer$1('SendMessagePortToExtensionHostWorker.sendMessagePortToExtensionHostWorker', port, command, rpcId);
912
- };
913
- const sendMessagePortToSearchProcess = async port => {
914
- await invokeAndTransfer$1('SendMessagePortToElectron.sendMessagePortToElectron', port, 'HandleMessagePortForSearchProcess.handleMessagePortForSearchProcess');
915
- };
916
- const confirm = async (message, options) => {
917
- // @ts-ignore
918
- const result = await invoke$2('Confirmprompt.prompt', message, options);
919
- return result;
920
- };
921
- const getRecentlyOpened = async () => {
922
- return invoke$2(/* RecentlyOpened.getRecentlyOpened */'RecentlyOpened.getRecentlyOpened');
923
- };
924
- const getKeyBindings = async () => {
925
- return invoke$2('KeyBindingsInitial.getKeyBindings');
926
- };
927
- const writeClipBoardText$1 = async text => {
928
- await invoke$2('ClipBoard.writeText', /* text */text);
929
- };
930
- const writeClipBoardImage$1 = async blob => {
931
- // @ts-ignore
932
- await invoke$2('ClipBoard.writeImage', /* text */blob);
933
- };
934
- const searchFileMemory = async uri => {
935
- // @ts-ignore
936
- return invoke$2('ExtensionHost.searchFileWithMemory', uri);
937
- };
938
- const searchFileFetch = async uri => {
939
- return invoke$2('ExtensionHost.searchFileWithFetch', uri);
940
- };
941
- const showMessageBox = async options => {
942
- return invoke$2('ElectronDialog.showMessageBox', options);
943
- };
944
- const handleDebugResumed = async params => {
945
- await invoke$2('Run And Debug.handleResumed', params);
946
- };
947
- const openWidget = async name => {
948
- await invoke$2('Viewlet.openWidget', name);
949
- };
950
- const getIcons = async requests => {
951
- const icons = await invoke$2('IconTheme.getIcons', requests);
952
- return icons;
953
- };
954
- const activateByEvent = event => {
955
- return invoke$2('ExtensionHostManagement.activateByEvent', event);
956
- };
957
- const setAdditionalFocus = focusKey => {
958
- // @ts-ignore
959
- return invoke$2('Focus.setAdditionalFocus', focusKey);
1098
+ const getFirstEvent = (eventEmitter, eventMap) => {
1099
+ const {
1100
+ resolve,
1101
+ promise
1102
+ } = Promise.withResolvers();
1103
+ const listenerMap = Object.create(null);
1104
+ const cleanup = value => {
1105
+ for (const event of Object.keys(eventMap)) {
1106
+ removeListener(eventEmitter, event, listenerMap[event]);
1107
+ }
1108
+ resolve(value);
1109
+ };
1110
+ for (const [event, type] of Object.entries(eventMap)) {
1111
+ const listener = event => {
1112
+ cleanup({
1113
+ type,
1114
+ event
1115
+ });
1116
+ };
1117
+ addListener(eventEmitter, event, listener);
1118
+ listenerMap[event] = listener;
1119
+ }
1120
+ return promise;
960
1121
  };
961
- const getActiveEditorId = () => {
962
- // @ts-ignore
963
- return invoke$2('GetActiveEditor.getActiveEditorId');
1122
+ const Message$1 = 3;
1123
+ const create$5$1 = async ({
1124
+ messagePort,
1125
+ isMessagePortOpen
1126
+ }) => {
1127
+ if (!isMessagePort(messagePort)) {
1128
+ throw new IpcError('port must be of type MessagePort');
1129
+ }
1130
+ if (isMessagePortOpen) {
1131
+ return messagePort;
1132
+ }
1133
+ const eventPromise = getFirstEvent(messagePort, {
1134
+ message: Message$1
1135
+ });
1136
+ messagePort.start();
1137
+ const {
1138
+ type,
1139
+ event
1140
+ } = await eventPromise;
1141
+ if (type !== Message$1) {
1142
+ throw new IpcError('Failed to wait for ipc message');
1143
+ }
1144
+ if (event.data !== readyMessage) {
1145
+ throw new IpcError('unexpected first message');
1146
+ }
1147
+ return messagePort;
964
1148
  };
965
- const getWorkspacePath = () => {
966
- return invoke$2('Workspace.getPath');
1149
+ const signal$1 = messagePort => {
1150
+ messagePort.start();
967
1151
  };
968
- const sendMessagePortToRendererProcess = async port => {
969
- const command = 'HandleMessagePort.handleMessagePort';
970
- // @ts-ignore
971
- await invokeAndTransfer$1('SendMessagePortToExtensionHostWorker.sendMessagePortToRendererProcess', port, command, DebugWorker);
1152
+ class IpcParentWithMessagePort extends Ipc {
1153
+ getData = getData$2;
1154
+ send(message) {
1155
+ this._rawIpc.postMessage(message);
1156
+ }
1157
+ sendAndTransfer(message) {
1158
+ const transfer = getTransferrables(message);
1159
+ this._rawIpc.postMessage(message, transfer);
1160
+ }
1161
+ dispose() {
1162
+ this._rawIpc.close();
1163
+ }
1164
+ onMessage(callback) {
1165
+ this._rawIpc.addEventListener('message', callback);
1166
+ }
1167
+ onClose(callback) {}
1168
+ }
1169
+ const wrap$5 = messagePort => {
1170
+ return new IpcParentWithMessagePort(messagePort);
972
1171
  };
973
- const getPreference = async key => {
974
- return await invoke$2('Preferences.get', key);
1172
+ const IpcParentWithMessagePort$1 = {
1173
+ __proto__: null,
1174
+ create: create$5$1,
1175
+ signal: signal$1,
1176
+ wrap: wrap$5
975
1177
  };
976
- const getAllExtensions$2 = async () => {
977
- return invoke$2('ExtensionManagement.getAllExtensions');
1178
+
1179
+ const Two = '2.0';
1180
+ const create$4 = (method, params) => {
1181
+ return {
1182
+ jsonrpc: Two,
1183
+ method,
1184
+ params
1185
+ };
978
1186
  };
979
- const rerenderEditor = async key => {
980
- // @ts-ignore
981
- return invoke$2('Editor.rerender', key);
1187
+ const callbacks = Object.create(null);
1188
+ const set$9 = (id, fn) => {
1189
+ callbacks[id] = fn;
982
1190
  };
983
- const handleDebugPaused = async params => {
984
- await invoke$2('Run And Debug.handlePaused', params);
1191
+ const get$1 = id => {
1192
+ return callbacks[id];
985
1193
  };
986
- const openUri = async (uri, focus, options) => {
987
- await invoke$2('Main.openUri', uri, focus, options);
1194
+ const remove$1 = id => {
1195
+ delete callbacks[id];
988
1196
  };
989
- const sendMessagePortToSyntaxHighlightingWorker = async port => {
990
- await invokeAndTransfer$1(
991
- // @ts-ignore
992
- 'SendMessagePortToSyntaxHighlightingWorker.sendMessagePortToSyntaxHighlightingWorker', port, 'HandleMessagePort.handleMessagePort2');
1197
+ let id = 0;
1198
+ const create$3$1 = () => {
1199
+ return ++id;
993
1200
  };
994
- const handleDebugScriptParsed = async script => {
995
- await invoke$2('Run And Debug.handleScriptParsed', script);
1201
+ const registerPromise = () => {
1202
+ const id = create$3$1();
1203
+ const {
1204
+ resolve,
1205
+ promise
1206
+ } = Promise.withResolvers();
1207
+ set$9(id, resolve);
1208
+ return {
1209
+ id,
1210
+ promise
1211
+ };
996
1212
  };
997
- const getWindowId = async () => {
998
- return invoke$2('GetWindowId.getWindowId');
1213
+ const create$2$1 = (method, params) => {
1214
+ const {
1215
+ id,
1216
+ promise
1217
+ } = registerPromise();
1218
+ const message = {
1219
+ jsonrpc: Two,
1220
+ method,
1221
+ params,
1222
+ id
1223
+ };
1224
+ return {
1225
+ message,
1226
+ promise
1227
+ };
999
1228
  };
1000
- const getBlob = async uri => {
1001
- // @ts-ignore
1002
- return invoke$2('FileSystem.getBlob', uri);
1229
+ class JsonRpcError extends Error {
1230
+ constructor(message) {
1231
+ super(message);
1232
+ this.name = 'JsonRpcError';
1233
+ }
1234
+ }
1235
+ const NewLine = '\n';
1236
+ const DomException = 'DOMException';
1237
+ const ReferenceError$1 = 'ReferenceError';
1238
+ const SyntaxError$1 = 'SyntaxError';
1239
+ const TypeError$1 = 'TypeError';
1240
+ const getErrorConstructor = (message, type) => {
1241
+ if (type) {
1242
+ switch (type) {
1243
+ case DomException:
1244
+ return DOMException;
1245
+ case TypeError$1:
1246
+ return TypeError;
1247
+ case SyntaxError$1:
1248
+ return SyntaxError;
1249
+ case ReferenceError$1:
1250
+ return ReferenceError;
1251
+ default:
1252
+ return Error;
1253
+ }
1254
+ }
1255
+ if (message.startsWith('TypeError: ')) {
1256
+ return TypeError;
1257
+ }
1258
+ if (message.startsWith('SyntaxError: ')) {
1259
+ return SyntaxError;
1260
+ }
1261
+ if (message.startsWith('ReferenceError: ')) {
1262
+ return ReferenceError;
1263
+ }
1264
+ return Error;
1003
1265
  };
1004
- const getExtensionCommands = async () => {
1005
- return invoke$2('ExtensionHost.getCommands');
1266
+ const constructError = (message, type, name) => {
1267
+ const ErrorConstructor = getErrorConstructor(message, type);
1268
+ if (ErrorConstructor === DOMException && name) {
1269
+ return new ErrorConstructor(message, name);
1270
+ }
1271
+ if (ErrorConstructor === Error) {
1272
+ const error = new Error(message);
1273
+ if (name && name !== 'VError') {
1274
+ error.name = name;
1275
+ }
1276
+ return error;
1277
+ }
1278
+ return new ErrorConstructor(message);
1006
1279
  };
1007
- const showErrorDialog = async errorInfo => {
1008
- // @ts-ignore
1009
- await invoke$2('ErrorHandling.showErrorDialog', errorInfo);
1280
+ const joinLines = lines => {
1281
+ return lines.join(NewLine);
1010
1282
  };
1011
- const getFolderSize$1 = async uri => {
1012
- // @ts-ignore
1013
- return await invoke$2('FileSystem.getFolderSize', uri);
1283
+ const splitLines = lines => {
1284
+ return lines.split(NewLine);
1014
1285
  };
1015
- const getExtension$3 = async id => {
1016
- // @ts-ignore
1017
- return invoke$2('ExtensionManagement.getExtension', id);
1286
+ const getCurrentStack = () => {
1287
+ const stackLinesToSkip = 3;
1288
+ const currentStack = joinLines(splitLines(new Error().stack || '').slice(stackLinesToSkip));
1289
+ return currentStack;
1018
1290
  };
1019
- const getMarkdownDom = async html => {
1020
- // @ts-ignore
1021
- return invoke$2('Markdown.getVirtualDom', html);
1291
+ const getNewLineIndex = (string, startIndex = undefined) => {
1292
+ return string.indexOf(NewLine, startIndex);
1022
1293
  };
1023
- const renderMarkdown$1 = async (markdown, options) => {
1024
- // @ts-ignore
1025
- return invoke$2('Markdown.renderMarkdown', markdown, options);
1294
+ const getParentStack = error => {
1295
+ let parentStack = error.stack || error.data || error.message || '';
1296
+ if (parentStack.startsWith(' at')) {
1297
+ parentStack = error.message + NewLine + parentStack;
1298
+ }
1299
+ return parentStack;
1026
1300
  };
1027
- const openNativeFolder$1 = async uri => {
1028
- // @ts-ignore
1029
- await invoke$2('OpenNativeFolder.openNativeFolder', uri);
1301
+ const MethodNotFound = -32601;
1302
+ const Custom = -32001;
1303
+ const restoreJsonRpcError = error => {
1304
+ const currentStack = getCurrentStack();
1305
+ if (error && error instanceof Error) {
1306
+ if (typeof error.stack === 'string') {
1307
+ error.stack = error.stack + NewLine + currentStack;
1308
+ }
1309
+ return error;
1310
+ }
1311
+ if (error && error.code && error.code === MethodNotFound) {
1312
+ const restoredError = new JsonRpcError(error.message);
1313
+ const parentStack = getParentStack(error);
1314
+ restoredError.stack = parentStack + NewLine + currentStack;
1315
+ return restoredError;
1316
+ }
1317
+ if (error && error.message) {
1318
+ const restoredError = constructError(error.message, error.type, error.name);
1319
+ if (error.data) {
1320
+ if (error.data.stack && error.data.type && error.message) {
1321
+ restoredError.stack = error.data.type + ': ' + error.message + NewLine + error.data.stack + NewLine + currentStack;
1322
+ } else if (error.data.stack) {
1323
+ restoredError.stack = error.data.stack;
1324
+ }
1325
+ if (error.data.codeFrame) {
1326
+ // @ts-ignore
1327
+ restoredError.codeFrame = error.data.codeFrame;
1328
+ }
1329
+ if (error.data.code) {
1330
+ // @ts-ignore
1331
+ restoredError.code = error.data.code;
1332
+ }
1333
+ if (error.data.type) {
1334
+ // @ts-ignore
1335
+ restoredError.name = error.data.type;
1336
+ }
1337
+ } else {
1338
+ if (error.stack) {
1339
+ const lowerStack = restoredError.stack || '';
1340
+ // @ts-ignore
1341
+ const indexNewLine = getNewLineIndex(lowerStack);
1342
+ const parentStack = getParentStack(error);
1343
+ // @ts-ignore
1344
+ restoredError.stack = parentStack + lowerStack.slice(indexNewLine);
1345
+ }
1346
+ if (error.codeFrame) {
1347
+ // @ts-ignore
1348
+ restoredError.codeFrame = error.codeFrame;
1349
+ }
1350
+ }
1351
+ return restoredError;
1352
+ }
1353
+ if (typeof error === 'string') {
1354
+ return new Error(`JsonRpc Error: ${error}`);
1355
+ }
1356
+ return new Error(`JsonRpc Error: ${error}`);
1030
1357
  };
1031
- const uninstallExtension$1 = async id => {
1032
- return invoke$2('ExtensionManagement.uninstall', id);
1358
+ const unwrapJsonRpcResult = responseMessage => {
1359
+ if ('error' in responseMessage) {
1360
+ const restoredError = restoreJsonRpcError(responseMessage.error);
1361
+ throw restoredError;
1362
+ }
1363
+ if ('result' in responseMessage) {
1364
+ return responseMessage.result;
1365
+ }
1366
+ throw new JsonRpcError('unexpected response message');
1033
1367
  };
1034
- const installExtension = async id => {
1035
- // @ts-ignore
1036
- return invoke$2('ExtensionManagement.install', id);
1368
+ const warn = (...args) => {
1369
+ console.warn(...args);
1037
1370
  };
1038
- const openExtensionSearch$2 = async () => {
1039
- // @ts-ignore
1040
- return invoke$2('SideBar.openViewlet', 'Extensions');
1371
+ const resolve = (id, response) => {
1372
+ const fn = get$1(id);
1373
+ if (!fn) {
1374
+ console.log(response);
1375
+ warn(`callback ${id} may already be disposed`);
1376
+ return;
1377
+ }
1378
+ fn(response);
1379
+ remove$1(id);
1380
+ };
1381
+ const E_COMMAND_NOT_FOUND = 'E_COMMAND_NOT_FOUND';
1382
+ const getErrorType = prettyError => {
1383
+ if (prettyError && prettyError.type) {
1384
+ return prettyError.type;
1385
+ }
1386
+ if (prettyError && prettyError.constructor && prettyError.constructor.name) {
1387
+ return prettyError.constructor.name;
1388
+ }
1389
+ return undefined;
1390
+ };
1391
+ const isAlreadyStack = line => {
1392
+ return line.trim().startsWith('at ');
1393
+ };
1394
+ const getStack = prettyError => {
1395
+ const stackString = prettyError.stack || '';
1396
+ const newLineIndex = stackString.indexOf('\n');
1397
+ if (newLineIndex !== -1 && !isAlreadyStack(stackString.slice(0, newLineIndex))) {
1398
+ return stackString.slice(newLineIndex + 1);
1399
+ }
1400
+ return stackString;
1401
+ };
1402
+ const getErrorProperty = (error, prettyError) => {
1403
+ if (error && error.code === E_COMMAND_NOT_FOUND) {
1404
+ return {
1405
+ code: MethodNotFound,
1406
+ message: error.message,
1407
+ data: error.stack
1408
+ };
1409
+ }
1410
+ return {
1411
+ code: Custom,
1412
+ message: prettyError.message,
1413
+ data: {
1414
+ stack: getStack(prettyError),
1415
+ codeFrame: prettyError.codeFrame,
1416
+ type: getErrorType(prettyError),
1417
+ code: prettyError.code,
1418
+ name: prettyError.name
1419
+ }
1420
+ };
1421
+ };
1422
+ const create$1$1 = (id, error) => {
1423
+ return {
1424
+ jsonrpc: Two,
1425
+ id,
1426
+ error
1427
+ };
1428
+ };
1429
+ const getErrorResponse = (id, error, preparePrettyError, logError) => {
1430
+ const prettyError = preparePrettyError(error);
1431
+ logError(error, prettyError);
1432
+ const errorProperty = getErrorProperty(error, prettyError);
1433
+ return create$1$1(id, errorProperty);
1434
+ };
1435
+ const create$6 = (message, result) => {
1436
+ return {
1437
+ jsonrpc: Two,
1438
+ id: message.id,
1439
+ result: result ?? null
1440
+ };
1441
+ };
1442
+ const getSuccessResponse = (message, result) => {
1443
+ const resultProperty = result ?? null;
1444
+ return create$6(message, resultProperty);
1445
+ };
1446
+ const getErrorResponseSimple = (id, error) => {
1447
+ return {
1448
+ jsonrpc: Two,
1449
+ id,
1450
+ error: {
1451
+ code: Custom,
1452
+ // @ts-ignore
1453
+ message: error.message,
1454
+ data: error
1455
+ }
1456
+ };
1457
+ };
1458
+ const getResponse = async (message, ipc, execute, preparePrettyError, logError, requiresSocket) => {
1459
+ try {
1460
+ const result = requiresSocket(message.method) ? await execute(message.method, ipc, ...message.params) : await execute(message.method, ...message.params);
1461
+ return getSuccessResponse(message, result);
1462
+ } catch (error) {
1463
+ if (ipc.canUseSimpleErrorResponse) {
1464
+ return getErrorResponseSimple(message.id, error);
1465
+ }
1466
+ return getErrorResponse(message.id, error, preparePrettyError, logError);
1467
+ }
1468
+ };
1469
+ const defaultPreparePrettyError = error => {
1470
+ return error;
1471
+ };
1472
+ const defaultLogError = () => {
1473
+ // ignore
1474
+ };
1475
+ const defaultRequiresSocket = () => {
1476
+ return false;
1477
+ };
1478
+ const defaultResolve = resolve;
1479
+
1480
+ // TODO maybe remove this in v6 or v7, only accept options object to simplify the code
1481
+ const normalizeParams = args => {
1482
+ if (args.length === 1) {
1483
+ const options = args[0];
1484
+ return {
1485
+ ipc: options.ipc,
1486
+ message: options.message,
1487
+ execute: options.execute,
1488
+ resolve: options.resolve || defaultResolve,
1489
+ preparePrettyError: options.preparePrettyError || defaultPreparePrettyError,
1490
+ logError: options.logError || defaultLogError,
1491
+ requiresSocket: options.requiresSocket || defaultRequiresSocket
1492
+ };
1493
+ }
1494
+ return {
1495
+ ipc: args[0],
1496
+ message: args[1],
1497
+ execute: args[2],
1498
+ resolve: args[3],
1499
+ preparePrettyError: args[4],
1500
+ logError: args[5],
1501
+ requiresSocket: args[6]
1502
+ };
1503
+ };
1504
+ const handleJsonRpcMessage = async (...args) => {
1505
+ const options = normalizeParams(args);
1506
+ const {
1507
+ message,
1508
+ ipc,
1509
+ execute,
1510
+ resolve,
1511
+ preparePrettyError,
1512
+ logError,
1513
+ requiresSocket
1514
+ } = options;
1515
+ if ('id' in message) {
1516
+ if ('method' in message) {
1517
+ const response = await getResponse(message, ipc, execute, preparePrettyError, logError, requiresSocket);
1518
+ try {
1519
+ ipc.send(response);
1520
+ } catch (error) {
1521
+ const errorResponse = getErrorResponse(message.id, error, preparePrettyError, logError);
1522
+ ipc.send(errorResponse);
1523
+ }
1524
+ return;
1525
+ }
1526
+ resolve(message.id, message);
1527
+ return;
1528
+ }
1529
+ if ('method' in message) {
1530
+ await getResponse(message, ipc, execute, preparePrettyError, logError, requiresSocket);
1531
+ return;
1532
+ }
1533
+ throw new JsonRpcError('unexpected message');
1534
+ };
1535
+ const invokeHelper = async (ipc, method, params, useSendAndTransfer) => {
1536
+ const {
1537
+ message,
1538
+ promise
1539
+ } = create$2$1(method, params);
1540
+ if (useSendAndTransfer && ipc.sendAndTransfer) {
1541
+ ipc.sendAndTransfer(message);
1542
+ } else {
1543
+ ipc.send(message);
1544
+ }
1545
+ const responseMessage = await promise;
1546
+ return unwrapJsonRpcResult(responseMessage);
1547
+ };
1548
+ const send = (transport, method, ...params) => {
1549
+ const message = create$4(method, params);
1550
+ transport.send(message);
1551
+ };
1552
+ const invoke$5 = (ipc, method, ...params) => {
1553
+ return invokeHelper(ipc, method, params, false);
1554
+ };
1555
+ const invokeAndTransfer$4 = (ipc, method, ...params) => {
1556
+ return invokeHelper(ipc, method, params, true);
1557
+ };
1558
+
1559
+ class CommandNotFoundError extends Error {
1560
+ constructor(command) {
1561
+ super(`Command not found ${command}`);
1562
+ this.name = 'CommandNotFoundError';
1563
+ }
1564
+ }
1565
+ const commands = Object.create(null);
1566
+ const register = commandMap => {
1567
+ Object.assign(commands, commandMap);
1568
+ };
1569
+ const getCommand = key => {
1570
+ return commands[key];
1571
+ };
1572
+ const execute = (command, ...args) => {
1573
+ const fn = getCommand(command);
1574
+ if (!fn) {
1575
+ throw new CommandNotFoundError(command);
1576
+ }
1577
+ return fn(...args);
1578
+ };
1579
+
1580
+ const createRpc = ipc => {
1581
+ const rpc = {
1582
+ // @ts-ignore
1583
+ ipc,
1584
+ /**
1585
+ * @deprecated
1586
+ */
1587
+ send(method, ...params) {
1588
+ send(ipc, method, ...params);
1589
+ },
1590
+ invoke(method, ...params) {
1591
+ return invoke$5(ipc, method, ...params);
1592
+ },
1593
+ invokeAndTransfer(method, ...params) {
1594
+ return invokeAndTransfer$4(ipc, method, ...params);
1595
+ },
1596
+ async dispose() {
1597
+ await ipc?.dispose();
1598
+ }
1599
+ };
1600
+ return rpc;
1601
+ };
1602
+ const requiresSocket = () => {
1603
+ return false;
1604
+ };
1605
+ const preparePrettyError = error => {
1606
+ return error;
1607
+ };
1608
+ const logError = () => {
1609
+ // handled by renderer worker
1610
+ };
1611
+ const handleMessage = event => {
1612
+ const actualRequiresSocket = event?.target?.requiresSocket || requiresSocket;
1613
+ const actualExecute = event?.target?.execute || execute;
1614
+ return handleJsonRpcMessage(event.target, event.data, actualExecute, resolve, preparePrettyError, logError, actualRequiresSocket);
1615
+ };
1616
+ const handleIpc = ipc => {
1617
+ if ('addEventListener' in ipc) {
1618
+ ipc.addEventListener('message', handleMessage);
1619
+ } else if ('on' in ipc) {
1620
+ // deprecated
1621
+ ipc.on('message', handleMessage);
1622
+ }
1623
+ };
1624
+ const listen$1 = async (module, options) => {
1625
+ const rawIpc = await module.listen(options);
1626
+ if (module.signal) {
1627
+ module.signal(rawIpc);
1628
+ }
1629
+ const ipc = module.wrap(rawIpc);
1630
+ return ipc;
1631
+ };
1632
+ const create$5 = async ({
1633
+ commandMap,
1634
+ messagePort
1635
+ }) => {
1636
+ // TODO create a commandMap per rpc instance
1637
+ register(commandMap);
1638
+ const rawIpc = await IpcParentWithMessagePort$1.create({
1639
+ messagePort,
1640
+ isMessagePortOpen: true
1641
+ });
1642
+ const ipc = IpcParentWithMessagePort$1.wrap(rawIpc);
1643
+ handleIpc(ipc);
1644
+ const rpc = createRpc(ipc);
1645
+ messagePort.start();
1646
+ return rpc;
1647
+ };
1648
+ const create$3 = async ({
1649
+ commandMap,
1650
+ send
1651
+ }) => {
1652
+ const {
1653
+ port1,
1654
+ port2
1655
+ } = new MessageChannel();
1656
+ await send(port1);
1657
+ return create$5({
1658
+ commandMap,
1659
+ messagePort: port2
1660
+ });
1661
+ };
1662
+ const TransferMessagePortRpcParent = {
1663
+ __proto__: null,
1664
+ create: create$3
1665
+ };
1666
+ const create$2 = async ({
1667
+ commandMap
1668
+ }) => {
1669
+ // TODO create a commandMap per rpc instance
1670
+ register(commandMap);
1671
+ const ipc = await listen$1(IpcChildWithModuleWorkerAndMessagePort$1);
1672
+ handleIpc(ipc);
1673
+ const rpc = createRpc(ipc);
1674
+ return rpc;
1041
1675
  };
1042
- const setExtensionsSearchValue$1 = async searchValue => {
1043
- // @ts-ignore
1044
- return invoke$2('Extensions.handleInput', searchValue);
1676
+ const WebWorkerRpcClient = {
1677
+ __proto__: null,
1678
+ create: create$2
1045
1679
  };
1046
- const openExternal = async uri => {
1047
- // @ts-ignore
1048
- await invoke$2('Open.openExternal', uri);
1680
+ const createMockRpc = ({
1681
+ commandMap
1682
+ }) => {
1683
+ const invocations = [];
1684
+ const invoke = (method, ...params) => {
1685
+ invocations.push([method, ...params]);
1686
+ const command = commandMap[method];
1687
+ if (!command) {
1688
+ throw new Error(`command ${method} not found`);
1689
+ }
1690
+ return command(...params);
1691
+ };
1692
+ const mockRpc = {
1693
+ invoke,
1694
+ invokeAndTransfer: invoke,
1695
+ invocations
1696
+ };
1697
+ return mockRpc;
1049
1698
  };
1050
- const openUrl$2 = async uri => {
1699
+
1700
+ const {
1701
+ invoke: invoke$4,
1702
+ invokeAndTransfer: invokeAndTransfer$3,
1703
+ set: set$8,
1704
+ dispose: dispose$5
1705
+ } = create$7(ExtensionHostWorker);
1706
+ const executeReferenceProvider = async (id, offset) => {
1051
1707
  // @ts-ignore
1052
- await invoke$2('Open.openUrl', uri);
1708
+ return invoke$4('ExtensionHostReference.executeReferenceProvider', id, offset);
1053
1709
  };
1054
- const getAllPreferences = async () => {
1710
+ const executeFileReferenceProvider = async id => {
1055
1711
  // @ts-ignore
1056
- return invoke$2('Preferences.getAll');
1712
+ return invoke$4('ExtensionHostReference.executeFileReferenceProvider', id);
1057
1713
  };
1058
- const showSaveFilePicker = async () => {
1714
+ const getRuntimeStatus$2 = async extensionId => {
1059
1715
  // @ts-ignore
1060
- return invoke$2('FilePicker.showSaveFilePicker');
1716
+ return invoke$4('ExtensionHost.getRuntimeStatus', extensionId);
1061
1717
  };
1062
- const getLogsDir = async () => {
1063
- // @ts-ignore
1064
- return invoke$2('PlatformPaths.getLogsDir');
1718
+ const registerMockRpc$1 = commandMap => {
1719
+ const mockRpc = createMockRpc({
1720
+ commandMap
1721
+ });
1722
+ set$8(mockRpc);
1723
+ return mockRpc;
1065
1724
  };
1066
1725
 
1067
- const RendererWorker = {
1726
+ const ExtensionHost = {
1068
1727
  __proto__: null,
1069
- activateByEvent,
1070
- applyBulkReplacement,
1071
- closeWidget,
1072
- confirm,
1073
- disableExtension: disableExtension$2,
1074
- dispose: dispose$2,
1075
- enableExtension,
1076
- getActiveEditorId,
1077
- getAllExtensions: getAllExtensions$2,
1078
- getAllPreferences,
1079
- getBlob,
1080
- getChromeVersion,
1081
- getColorThemeNames,
1082
- getElectronVersion,
1083
- getExtension: getExtension$3,
1084
- getExtensionCommands,
1085
- getFileHandles,
1086
- getFileIcon,
1087
- getFilePathElectron,
1088
- getFolderIcon,
1089
- getFolderSize: getFolderSize$1,
1090
- getIcons,
1091
- getKeyBindings,
1092
- getLogsDir,
1093
- getMarkdownDom,
1094
- getNodeVersion,
1095
- getPreference,
1096
- getRecentlyOpened,
1097
- getV8Version,
1098
- getWebViewSecret,
1099
- getWindowId,
1100
- getWorkspacePath,
1101
- handleDebugChange,
1102
- handleDebugPaused,
1103
- handleDebugResumed,
1104
- handleDebugScriptParsed,
1105
- installExtension,
1106
- invoke: invoke$2,
1107
- invokeAndTransfer: invokeAndTransfer$1,
1108
- openExtensionSearch: openExtensionSearch$2,
1109
- openExternal,
1110
- openNativeFolder: openNativeFolder$1,
1111
- openUri,
1112
- openUrl: openUrl$2,
1113
- openWidget,
1114
- readFile: readFile$2,
1115
- registerWebViewInterceptor,
1116
- renderMarkdown: renderMarkdown$1,
1117
- rerenderEditor,
1118
- searchFileFetch,
1119
- searchFileHtml,
1120
- searchFileMemory,
1121
- sendMessagePortToEditorWorker,
1122
- sendMessagePortToErrorWorker,
1123
- sendMessagePortToExtensionHostWorker: sendMessagePortToExtensionHostWorker$2,
1124
- sendMessagePortToFileSystemWorker: sendMessagePortToFileSystemWorker$2,
1125
- sendMessagePortToMarkdownWorker: sendMessagePortToMarkdownWorker$2,
1126
- sendMessagePortToRendererProcess,
1127
- sendMessagePortToSearchProcess,
1128
- sendMessagePortToSyntaxHighlightingWorker,
1129
- set: set$6,
1130
- setAdditionalFocus,
1131
- setColorTheme: setColorTheme$2,
1132
- setExtensionsSearchValue: setExtensionsSearchValue$1,
1133
- setFocus,
1134
- setWebViewPort,
1135
- setWorkspacePath,
1136
- showContextMenu: showContextMenu$1,
1137
- showErrorDialog,
1138
- showMessageBox,
1139
- showSaveFilePicker,
1140
- uninstallExtension: uninstallExtension$1,
1141
- unregisterWebViewInterceptor,
1142
- writeClipBoardImage: writeClipBoardImage$1,
1143
- writeClipBoardText: writeClipBoardText$1
1728
+ dispose: dispose$5,
1729
+ executeFileReferenceProvider,
1730
+ executeReferenceProvider,
1731
+ getRuntimeStatus: getRuntimeStatus$2,
1732
+ invoke: invoke$4,
1733
+ invokeAndTransfer: invokeAndTransfer$3,
1734
+ registerMockRpc: registerMockRpc$1,
1735
+ set: set$8
1144
1736
  };
1145
1737
 
1146
1738
  const {
1147
- set: set$5,
1148
- getRuntimeStatus: getRuntimeStatus$1
1149
- } = ExtensionHost;
1150
-
1151
- const getRuntimeStatus = async extensionId => {
1152
- // @ts-ignore
1153
- const status = await getRuntimeStatus$1(extensionId);
1154
- // @ts-ignore
1155
- return status;
1156
- };
1157
-
1158
- const getRuntimeStatusDetails = async extension => {
1159
- const {
1160
- activationEvent,
1161
- status,
1162
- activationTime,
1163
- importTime
1164
- } = await getRuntimeStatus(extension.id);
1165
- return {
1166
- wasActivatedByEvent: activationEvent,
1167
- activationTime,
1168
- status,
1169
- importTime
1170
- };
1171
- };
1172
-
1173
- const featureRuntimeStatusEnabled = extension => {
1174
- if (!extension || typeof extension !== 'object') {
1175
- return false;
1176
- }
1177
- if ('main' in extension || 'browser' in extension) {
1178
- return true;
1179
- }
1180
- return false;
1181
- };
1182
-
1183
- const formatTime = time => {
1184
- return time.toFixed(2) + 'ms';
1185
- };
1186
-
1187
- const getActivationTimeVirtualDom = (importTime$1, activationTime$1) => {
1188
- if (!activationTime$1 && !importTime$1) {
1189
- return [];
1190
- }
1191
- const formattedImportTime = formatTime(importTime$1);
1192
- const formattedTime = formatTime(activationTime$1);
1193
- return [{
1194
- type: Dt,
1195
- childCount: 1
1196
- }, text(importTime()), {
1197
- type: Dd,
1198
- childCount: 1
1199
- }, text(formattedImportTime), {
1200
- type: Dt,
1201
- childCount: 1
1202
- }, text(activationTime()), {
1203
- type: Dd,
1204
- childCount: 1
1205
- }, text(formattedTime)];
1206
- };
1207
-
1208
- const None$1 = 0;
1209
- const Importing = 1;
1210
- const Activating = 2;
1211
- const Activated = 3;
1212
- const Error$1 = 4;
1213
-
1214
- const getStatusMessage = statusType => {
1215
- switch (statusType) {
1216
- case Activated:
1217
- return 'activated';
1218
- case None$1:
1219
- return 'none';
1220
- case Activating:
1221
- return 'Activating';
1222
- case Error$1:
1223
- return 'error';
1224
- case Importing:
1225
- return 'importing';
1226
- default:
1227
- return 'unknown';
1228
- }
1229
- };
1230
-
1231
- const key = {
1232
- type: Dt,
1233
- childCount: 1,
1234
- className: 'RuntimeStatusDefinitionListKey'
1235
- };
1236
- const value = {
1237
- type: Dd,
1238
- className: 'RuntimeStatusDefinitionListValue',
1239
- childCount: 1
1739
+ invoke: invoke$3,
1740
+ invokeAndTransfer: invokeAndTransfer$2,
1741
+ set: set$7,
1742
+ dispose: dispose$4
1743
+ } = create$7(FileSystemWorker$1);
1744
+ const remove = async dirent => {
1745
+ return invoke$3('FileSystem.remove', dirent);
1240
1746
  };
1241
- const getStatusVirtualDom = status => {
1242
- const statusString = getStatusMessage(status);
1243
- return [key, text(`Status: `),
1244
- // i18n
1245
- value, text(`${statusString}`)];
1747
+ const readDirWithFileTypes = async uri => {
1748
+ return invoke$3('FileSystem.readDirWithFileTypes', uri);
1246
1749
  };
1247
-
1248
- const getChildCount$1 = (status, activationTime, importTime) => {
1249
- let childCount = 0;
1250
- childCount += 2; // status
1251
- if (importTime || activationTime) {
1252
- childCount += 4;
1253
- }
1254
- return childCount;
1750
+ const getPathSeparator = async root => {
1751
+ // @ts-ignore
1752
+ return invoke$3('FileSystem.getPathSeparator', root);
1255
1753
  };
1256
- const getRuntimeStatusVirtualDom = state => {
1257
- const {
1258
- status,
1259
- activationTime,
1260
- importTime
1261
- } = state;
1262
- const heading = runtimeStatus();
1263
- const childCount = getChildCount$1(status, activationTime, importTime);
1264
- return [{
1265
- type: Div,
1266
- className: FeatureContent,
1267
- childCount: 2
1268
- }, ...getFeatureContentHeadingVirtualDom(heading), {
1269
- type: Dl,
1270
- className: 'RuntimeStatusDefinitionList',
1271
- childCount
1272
- }, ...getStatusVirtualDom(status), ...getActivationTimeVirtualDom(activationTime, importTime)];
1754
+ const getRealPath = async path => {
1755
+ return invoke$3('FileSystem.getRealPath', path);
1273
1756
  };
1274
-
1275
- const getSettingsTableEntry = setting => {
1276
- const {
1277
- id,
1278
- label
1279
- } = setting;
1280
- // TODO watch out for null/undefined/number/string/array
1281
- return [{
1282
- type: Text,
1283
- value: id
1284
- }, {
1285
- type: Text,
1286
- value: label
1287
- }];
1757
+ const stat = async dirent => {
1758
+ return invoke$3('FileSystem.stat', dirent);
1288
1759
  };
1289
-
1290
- const getSettingsDetails = async extension => {
1291
- const settings = extension.settings || [];
1292
- const rows = settings.map(getSettingsTableEntry);
1293
- return {
1294
- settings: rows
1295
- };
1760
+ const createFile = async uri => {
1761
+ return invoke$3('FileSystem.writeFile', uri, '');
1296
1762
  };
1297
-
1298
- const featureSettingsEnabled = extension => {
1299
- if (!extension || typeof extension !== 'object' || !('settings' in extension)) {
1300
- return false;
1301
- }
1302
- return Array.isArray(extension.settings);
1763
+ const readFile$3 = async uri => {
1764
+ return invoke$3('FileSystem.readFile', uri);
1303
1765
  };
1304
-
1305
- const getSettingsTableEntries = rows => {
1306
- const textId = id$1();
1307
- const textLabel = label();
1308
- return {
1309
- headings: [textId, textLabel],
1310
- rows
1311
- };
1766
+ const writeFile = async (uri, content) => {
1767
+ return invoke$3('FileSystem.writeFile', uri, content);
1312
1768
  };
1313
-
1314
- const getFeatureSettingsVirtualDom = rows => {
1315
- const heading = settings();
1316
- const tableInfo = getSettingsTableEntries(rows);
1317
- return [{
1318
- type: Div,
1319
- className: FeatureContent,
1320
- childCount: 2
1321
- }, ...getFeatureContentHeadingVirtualDom(heading), ...getTableVirtualDom(tableInfo)];
1769
+ const mkdir = async uri => {
1770
+ return invoke$3('FileSystem.mkdir', uri);
1322
1771
  };
1323
-
1324
- const getSettingsVirtualDom = state => {
1325
- return getFeatureSettingsVirtualDom(state.settings);
1772
+ const rename = async (oldUri, newUri) => {
1773
+ return invoke$3('FileSystem.rename', oldUri, newUri);
1326
1774
  };
1327
-
1328
- class AssertionError extends Error {
1329
- constructor(message) {
1330
- super(message);
1331
- this.name = 'AssertionError';
1332
- }
1333
- }
1334
- const Object$1 = 1;
1335
- const Number$1 = 2;
1336
- const Array$1 = 3;
1337
- const String = 4;
1338
- const Boolean$1 = 5;
1339
- const Function = 6;
1340
- const Null = 7;
1341
- const Unknown = 8;
1342
- const getType = value => {
1343
- switch (typeof value) {
1344
- case 'number':
1345
- return Number$1;
1346
- case 'function':
1347
- return Function;
1348
- case 'string':
1349
- return String;
1350
- case 'object':
1351
- if (value === null) {
1352
- return Null;
1353
- }
1354
- if (Array.isArray(value)) {
1355
- return Array$1;
1356
- }
1357
- return Object$1;
1358
- case 'boolean':
1359
- return Boolean$1;
1360
- default:
1361
- return Unknown;
1362
- }
1775
+ const copy = async (oldUri, newUri) => {
1776
+ return invoke$3('FileSystem.copy', oldUri, newUri);
1363
1777
  };
1364
- const string = value => {
1365
- const type = getType(value);
1366
- if (type !== String) {
1367
- throw new AssertionError('expected value to be of type string');
1368
- }
1778
+ const exists$1 = async uri => {
1779
+ // @ts-ignore
1780
+ return invoke$3('FileSystem.exists', uri);
1781
+ };
1782
+ const getFolderSize$2 = async uri => {
1783
+ // @ts-ignore
1784
+ return invoke$3('FileSystem.getFolderSize', uri);
1785
+ };
1786
+ const readFileAsBlob$1 = async uri => {
1787
+ // @ts-ignore
1788
+ return invoke$3('FileSystem.readFileAsBlob', uri);
1789
+ };
1790
+ const appendFile = async (uri, text) => {
1791
+ // @ts-ignore
1792
+ return invoke$3('FileSystem.appendFile', uri, text);
1369
1793
  };
1370
1794
 
1371
- const HandleClickCategory = 'handleClickCategory';
1372
- const HandleClickDisable = 'handleClickDisable';
1373
- const HandleClickEnable = 'handleClickEnable';
1374
- const HandleClickScrollToTop = 'handleClickScrollToTop';
1375
- const HandleClickSetColorTheme = 'handleClickSetColorTheme';
1376
- const HandleClickSettings = 'handleClickSettings';
1377
- const HandleClickSize = 'handleClickSize';
1378
- const HandleClickUninstall = 'handleClickUninstall';
1379
- const HandleFeaturesClick = 'handleFeaturesClick';
1380
- const HandleIconError = 'handleIconError';
1381
- const HandleImageContextMenu = 'handleImageContextMenu';
1382
- const HandleReadmeContextMenu = 'handleReadmeContextMenu';
1383
- const HandleReadmeScroll = 'handleReadmeScroll';
1384
- const HandleTabsClick = 'handleTabsClick';
1385
-
1386
- const ActivationEvents = 'ActivationEvents';
1387
- const Changelog = 'Changelog';
1388
- const Commands = 'Commands';
1389
- const Details = 'Details';
1390
- const Enable = 'Enable';
1391
- const Disable = 'Disable';
1392
- const Features = 'Features';
1393
- const JsonValidation = 'JsonValidation';
1394
- const ProgrammingLanguages = 'ProgrammingLanguages';
1395
- const RuntimeStatus = 'RuntimeStatus';
1396
- const ScrollToTop = 'scrolltotop';
1397
- const SetColorTheme = 'SetColorTheme';
1398
- const Settings = 'Settings';
1399
- const Theme = 'Theme';
1400
- const Uninstall = 'Uninstall';
1401
- const WebViews = 'WebViews';
1402
-
1403
- const getScrollToTopVirtualDom = scrollToTopButtonEnabled => {
1404
- return [{
1405
- type: Button$1,
1406
- className: ScrollToTopButton,
1407
- childCount: 1,
1408
- onClick: HandleClickScrollToTop,
1409
- ariaLabel: scrollToTop(),
1410
- name: ScrollToTop
1411
- }, {
1412
- type: Div,
1413
- className: 'MaskIcon MaskIconChevronUp',
1414
- childCount: 0,
1415
- role: None$2
1416
- }];
1795
+ const FileSystemWorker = {
1796
+ __proto__: null,
1797
+ appendFile,
1798
+ copy,
1799
+ createFile,
1800
+ dispose: dispose$4,
1801
+ exists: exists$1,
1802
+ getFolderSize: getFolderSize$2,
1803
+ getPathSeparator,
1804
+ getRealPath,
1805
+ invoke: invoke$3,
1806
+ invokeAndTransfer: invokeAndTransfer$2,
1807
+ mkdir,
1808
+ readDirWithFileTypes,
1809
+ readFile: readFile$3,
1810
+ readFileAsBlob: readFileAsBlob$1,
1811
+ remove,
1812
+ rename,
1813
+ set: set$7,
1814
+ stat,
1815
+ writeFile
1417
1816
  };
1418
1817
 
1419
1818
  const {
1420
- set: set$4,
1421
- getVirtualDom,
1422
- render
1423
- } = MarkdownWorker;
1424
-
1425
- const getMarkdownVirtualDom = async (html, options) => {
1426
- string(html);
1427
- const dom = await getVirtualDom(html);
1428
- const newDom = [...dom];
1429
- if (options?.scrollToTopEnabled) {
1430
- newDom[0].onScroll = HandleReadmeScroll;
1431
- newDom[0].childCount++;
1432
- const extraDom = getScrollToTopVirtualDom();
1433
- newDom.splice(1, 0, ...extraDom);
1434
- }
1435
- return newDom;
1819
+ invoke: invoke$2,
1820
+ invokeAndTransfer: invokeAndTransfer$1,
1821
+ set: set$6,
1822
+ dispose: dispose$3
1823
+ } = create$7(MarkdownWorker$1);
1824
+ const getVirtualDom$1 = async html => {
1825
+ // @ts-ignore
1826
+ return invoke$2('Markdown.getVirtualDom', html);
1827
+ };
1828
+ const render$1 = async (markdown, options) => {
1829
+ // @ts-ignore
1830
+ return invoke$2('Markdown.render', markdown, options);
1436
1831
  };
1437
1832
 
1438
- const getThemeItemMarkdown = (heading, items) => {
1439
- let markdown = '';
1440
- if (items.length > 0) {
1441
- markdown += `### ${heading}`;
1442
- markdown += '\n\n';
1443
- for (const item of items) {
1444
- markdown += `- ${item.label}`;
1445
- markdown += '\n';
1446
- }
1447
- }
1448
- return markdown;
1833
+ const MarkdownWorker = {
1834
+ __proto__: null,
1835
+ dispose: dispose$3,
1836
+ getVirtualDom: getVirtualDom$1,
1837
+ invoke: invoke$2,
1838
+ invokeAndTransfer: invokeAndTransfer$1,
1839
+ render: render$1,
1840
+ set: set$6
1449
1841
  };
1450
1842
 
1451
- const getColorThemeMarkdown = themes => {
1452
- const heading = 'Color Themes';
1453
- return getThemeItemMarkdown(heading, themes);
1843
+ const {
1844
+ invoke: invoke$1,
1845
+ invokeAndTransfer,
1846
+ set: set$5,
1847
+ dispose: dispose$2
1848
+ } = create$7(RendererWorker$1);
1849
+ const searchFileHtml = async uri => {
1850
+ return invoke$1('ExtensionHost.searchFileWithHtml', uri);
1454
1851
  };
1455
- const getIconThemeMarkdown = iconThemes => {
1456
- const heading = 'File Icon Themes';
1457
- return getThemeItemMarkdown(heading, iconThemes);
1852
+ const getFilePathElectron = async file => {
1853
+ return invoke$1('FileSystemHandle.getFilePathElectron', file);
1458
1854
  };
1459
- const getProductIconThemeMarkdown = iconThemes => {
1460
- const heading = 'Product Icon Themes';
1461
- return getThemeItemMarkdown(heading, iconThemes);
1855
+ const showContextMenu$1 = async (x, y, id, ...args) => {
1856
+ return invoke$1('ContextMenu.show', x, y, id, ...args);
1462
1857
  };
1463
- const getThemeMarkdown = (themes, iconThemes, productIconThemes) => {
1464
- let markdown = '';
1465
- markdown += getColorThemeMarkdown(themes);
1466
- markdown += getIconThemeMarkdown(iconThemes);
1467
- markdown += getProductIconThemeMarkdown(productIconThemes);
1468
- return markdown;
1858
+ const getElectronVersion = async () => {
1859
+ return invoke$1('Process.getElectronVersion');
1469
1860
  };
1470
-
1471
- const renderMarkdown = async (markdown, options = {}) => {
1472
- const html = await render(markdown, options);
1473
- return html;
1861
+ const applyBulkReplacement = async bulkEdits => {
1862
+ await invoke$1('BulkReplacement.applyBulkReplacement', bulkEdits);
1474
1863
  };
1475
-
1476
- const getThemeDetails = async (extension, baseUrl) => {
1477
- const {
1478
- colorThemes,
1479
- iconThemes,
1480
- productIconThemes
1481
- } = extension;
1482
- const markdown = getThemeMarkdown(colorThemes || [], iconThemes || [], productIconThemes || []);
1483
- const rendered = await renderMarkdown(markdown, {
1484
- baseUrl
1485
- });
1486
- const themesMarkdownDom = await getMarkdownVirtualDom(rendered);
1487
- return {
1488
- themesMarkdownDom
1489
- };
1864
+ const setColorTheme$2 = async id => {
1865
+ // @ts-ignore
1866
+ return invoke$1(/* ColorTheme.setColorTheme */'ColorTheme.setColorTheme', /* colorThemeId */id);
1867
+ };
1868
+ const getNodeVersion = async () => {
1869
+ return invoke$1('Process.getNodeVersion');
1870
+ };
1871
+ const getChromeVersion = async () => {
1872
+ return invoke$1('Process.getChromeVersion');
1873
+ };
1874
+ const getV8Version = async () => {
1875
+ return invoke$1('Process.getV8Version');
1876
+ };
1877
+ const getFileHandles = async fileIds => {
1878
+ const files = await invoke$1('FileSystemHandle.getFileHandles', fileIds);
1879
+ return files;
1490
1880
  };
1491
-
1492
- const featureColorThemeEnabled = extension => {
1493
- if (!extension || typeof extension !== 'object' || !('colorThemes' in extension)) {
1494
- return false;
1495
- }
1496
- return Array.isArray(extension.colorThemes);
1881
+ const setWorkspacePath = async path => {
1882
+ await invoke$1('Workspace.setPath', path);
1497
1883
  };
1498
-
1499
- const featureIconThemeEnabled = extension => {
1500
- if (!extension || typeof extension !== 'object' || !('iconThemes' in extension)) {
1501
- return false;
1502
- }
1503
- return Array.isArray(extension.iconThemes);
1884
+ const registerWebViewInterceptor = async (id, port) => {
1885
+ await invokeAndTransfer('WebView.registerInterceptor', id, port);
1504
1886
  };
1505
-
1506
- const featureProductIconThemeEnabled = extension => {
1507
- if (!extension || typeof extension !== 'object' || !('productIconThemes' in extension)) {
1508
- return false;
1509
- }
1510
- return Array.isArray(extension.productIconThemes);
1887
+ const unregisterWebViewInterceptor = async id => {
1888
+ await invoke$1('WebView.unregisterInterceptor', id);
1511
1889
  };
1512
-
1513
- const featureThemeEnabled = extension => {
1514
- return featureColorThemeEnabled(extension) || featureIconThemeEnabled(extension) || featureProductIconThemeEnabled(extension);
1890
+ const sendMessagePortToEditorWorker = async (port, rpcId) => {
1891
+ const command = 'HandleMessagePort.handleMessagePort';
1892
+ // @ts-ignore
1893
+ await invokeAndTransfer('SendMessagePortToExtensionHostWorker.sendMessagePortToEditorWorker', port, command, rpcId);
1515
1894
  };
1516
-
1517
- const getVirtualDomChildCount = dom => {
1518
- const max = dom.length - 1;
1519
- let stack = [];
1520
- for (let i = max; i >= 0; i--) {
1521
- const element = dom[i];
1522
- if (element.childCount > 0) {
1523
- stack = stack.slice(element.childCount);
1524
- }
1525
- stack.unshift(element);
1526
- }
1527
- return stack.length;
1895
+ const sendMessagePortToErrorWorker = async (port, rpcId) => {
1896
+ const command = 'Errors.handleMessagePort';
1897
+ // @ts-ignore
1898
+ await invokeAndTransfer('SendMessagePortToExtensionHostWorker.sendMessagePortToErrorWorker', port, command, rpcId);
1528
1899
  };
1529
-
1530
- const getFeatureThemesVirtualDom = themesDom => {
1531
- const childCount = getVirtualDomChildCount(themesDom);
1532
- const heading = theme();
1533
- return [{
1534
- type: Div,
1535
- className: FeatureContent,
1536
- childCount: 2
1537
- }, ...getFeatureContentHeadingVirtualDom(heading), {
1538
- type: Div,
1539
- className: DefaultMarkdown,
1540
- childCount
1541
- }, ...themesDom];
1900
+ const sendMessagePortToMarkdownWorker$2 = async (port, rpcId) => {
1901
+ const command = 'Markdown.handleMessagePort';
1902
+ // @ts-ignore
1903
+ await invokeAndTransfer('SendMessagePortToExtensionHostWorker.sendMessagePortToMarkdownWorker', port, command, rpcId);
1542
1904
  };
1543
-
1544
- const getThemeVirtualDom = state => {
1545
- return getFeatureThemesVirtualDom(state.themesMarkdownDom);
1905
+ const sendMessagePortToIconThemeWorker = async (port, rpcId) => {
1906
+ const command = 'IconTheme.handleMessagePort';
1907
+ // @ts-ignore
1908
+ await invokeAndTransfer('SendMessagePortToExtensionHostWorker.sendMessagePortToIconThemeWorker', port, command, rpcId);
1546
1909
  };
1547
-
1548
- const toWebView = rawWebView => {
1549
- const {
1550
- id,
1551
- selector,
1552
- contentSecurityPolicy,
1553
- elements
1554
- } = rawWebView;
1555
- return {
1556
- id,
1557
- selectorString: JSON.stringify(selector),
1558
- contentSecurityPolicyString: JSON.stringify(contentSecurityPolicy),
1559
- elementsString: JSON.stringify(elements, null, 2)
1560
- };
1910
+ const sendMessagePortToFileSystemWorker$2 = async (port, rpcId) => {
1911
+ const command = 'FileSystem.handleMessagePort';
1912
+ // @ts-ignore
1913
+ await invokeAndTransfer('SendMessagePortToExtensionHostWorker.sendMessagePortToFileSystemWorker', port, command, rpcId);
1561
1914
  };
1562
-
1563
- const getWebViews = extension => {
1564
- const rawWebViews = extension.webViews || [];
1565
- return rawWebViews.map(toWebView);
1915
+ const readFile$2 = async uri => {
1916
+ return invoke$1('FileSystem.readFile', uri);
1566
1917
  };
1567
-
1568
- const getWebViewsDetails = async extension => {
1569
- const webViews = getWebViews(extension);
1570
- return {
1571
- webViews
1572
- };
1918
+ const getWebViewSecret = async key => {
1919
+ // @ts-ignore
1920
+ return invoke$1('WebView.getSecret', key);
1573
1921
  };
1574
-
1575
- const featureWebViewsEnabled = extension => {
1576
- if (!extension || typeof extension !== 'object' || !('webViews' in extension)) {
1577
- return false;
1578
- }
1579
- return Array.isArray(extension.webViews);
1922
+ const setWebViewPort = async (uid, port, origin, portType) => {
1923
+ return invokeAndTransfer('WebView.setPort', uid, port, origin, portType);
1580
1924
  };
1581
-
1582
- const heading = {
1583
- type: H2,
1584
- className: DefinitionListItemHeading,
1585
- childCount: 1
1925
+ const setFocus = key => {
1926
+ return invoke$1('Focus.setFocus', key);
1586
1927
  };
1587
- const pre = {
1588
- type: Pre,
1589
- className: DefinitionListItemValue,
1590
- childCount: 1
1928
+ const getFileIcon = async options => {
1929
+ return invoke$1('IconTheme.getFileIcon', options);
1591
1930
  };
1592
- const item = {
1593
- type: Div,
1594
- className: DefinitionListItem,
1595
- childCount: 2
1931
+ const getColorThemeNames = async () => {
1932
+ return invoke$1('ColorTheme.getColorThemeNames');
1596
1933
  };
1597
- const getWebViewVirtualDom = webView => {
1598
- const {
1599
- id,
1600
- selectorString,
1601
- contentSecurityPolicyString,
1602
- elementsString
1603
- } = webView;
1604
- const textId = id$1();
1605
- const textSelector = selector();
1606
- const textContentSecurityPolicy = contentSecurityPolicy();
1607
- const textElements = elements();
1608
- return [{
1609
- type: Div,
1610
- className: FeatureWebView,
1611
- childCount: 5
1612
- }, item, heading, text(textId), pre, text(id), item, heading, text(textSelector), pre, text(selectorString), item, heading, text(textContentSecurityPolicy), pre, text(contentSecurityPolicyString), item, heading, text(textElements), pre, text(elementsString)];
1934
+ const disableExtension$2 = async id => {
1935
+ // @ts-ignore
1936
+ return invoke$1('ExtensionManagement.disable', id);
1613
1937
  };
1614
-
1615
- const getFeatureWebViewsVirtualDom = webViews$1 => {
1616
- const heading = webViews();
1617
- return [{
1618
- type: Div,
1619
- className: FeatureContent,
1620
- childCount: 2
1621
- }, ...getFeatureContentHeadingVirtualDom(heading), {
1622
- type: Div,
1623
- childCount: webViews$1.length
1624
- }, ...webViews$1.flatMap(getWebViewVirtualDom)];
1938
+ const enableExtension$2 = async id => {
1939
+ // @ts-ignore
1940
+ return invoke$1('ExtensionManagement.enable', id);
1625
1941
  };
1626
-
1627
- const getWebViewsVirtualDom = state => {
1628
- return getFeatureWebViewsVirtualDom(state.webViews);
1942
+ const handleDebugChange = async params => {
1943
+ // @ts-ignore
1944
+ return invoke$1('Run And Debug.handleChange', params);
1629
1945
  };
1630
-
1631
- const registerAllFeatures = () => {
1632
- register$1({
1633
- id: Theme,
1634
- getLabel: theme,
1635
- isEnabled: featureThemeEnabled,
1636
- getDetails: getThemeDetails,
1637
- getVirtualDom: getThemeVirtualDom
1638
- });
1639
- register$1({
1640
- id: Commands,
1641
- getLabel: commands$1,
1642
- isEnabled: featureCommandsEnabled,
1643
- getDetails: getCommandsDetails,
1644
- getVirtualDom: getCommandsVirtualDom
1645
- });
1646
- register$1({
1647
- id: Settings,
1648
- getLabel: settings,
1649
- isEnabled: featureSettingsEnabled,
1650
- getDetails: getSettingsDetails,
1651
- getVirtualDom: getSettingsVirtualDom
1652
- });
1653
- register$1({
1654
- id: JsonValidation,
1655
- getLabel: jsonValidation,
1656
- isEnabled: featureJsonValidationEnabled,
1657
- getDetails: getJsonValidationDetails,
1658
- getVirtualDom: getJsonValidationVirtualDom
1659
- });
1660
- register$1({
1661
- id: ProgrammingLanguages,
1662
- getLabel: programmingLanguages,
1663
- isEnabled: featureProgrammingLanguagesEnabled,
1664
- getDetails: getProgrammingLanguagesDetails,
1665
- getVirtualDom: getProgrammingLanguagesVirtualDom
1666
- });
1667
- register$1({
1668
- id: WebViews,
1669
- getLabel: webViews,
1670
- isEnabled: featureWebViewsEnabled,
1671
- getDetails: getWebViewsDetails,
1672
- getVirtualDom: getWebViewsVirtualDom
1673
- });
1674
- register$1({
1675
- id: ActivationEvents,
1676
- getLabel: activationEvents,
1677
- isEnabled: featureActivationEventsEnabled,
1678
- getDetails: getActivationEventsDetails,
1679
- getVirtualDom: getActivationEventsVirtualDom
1680
- });
1681
- register$1({
1682
- id: RuntimeStatus,
1683
- getLabel: runtimeStatus,
1684
- isEnabled: featureRuntimeStatusEnabled,
1685
- getDetails: getRuntimeStatusDetails,
1686
- getVirtualDom: getRuntimeStatusVirtualDom
1687
- });
1946
+ const getFolderIcon = async options => {
1947
+ return invoke$1('IconTheme.getFolderIcon', options);
1688
1948
  };
1689
-
1690
- const normalizeLine = line => {
1691
- if (line.startsWith('Error: ')) {
1692
- return line.slice('Error: '.length);
1693
- }
1694
- if (line.startsWith('VError: ')) {
1695
- return line.slice('VError: '.length);
1696
- }
1697
- return line;
1949
+ const closeWidget = async widgetId => {
1950
+ return invoke$1('Viewlet.closeWidget', widgetId);
1698
1951
  };
1699
- const getCombinedMessage = (error, message) => {
1700
- const stringifiedError = normalizeLine(`${error}`);
1701
- if (message) {
1702
- return `${message}: ${stringifiedError}`;
1703
- }
1704
- return stringifiedError;
1952
+ const sendMessagePortToExtensionHostWorker$2 = async (port, rpcId = 0) => {
1953
+ const command = 'HandleMessagePort.handleMessagePort2';
1954
+ await invokeAndTransfer('SendMessagePortToExtensionHostWorker.sendMessagePortToExtensionHostWorker', port, command, rpcId);
1705
1955
  };
1706
- const NewLine$2 = '\n';
1707
- const getNewLineIndex$1 = (string, startIndex = undefined) => {
1708
- return string.indexOf(NewLine$2, startIndex);
1956
+ const sendMessagePortToSearchProcess = async port => {
1957
+ await invokeAndTransfer('SendMessagePortToElectron.sendMessagePortToElectron', port, 'HandleMessagePortForSearchProcess.handleMessagePortForSearchProcess');
1709
1958
  };
1710
- const mergeStacks = (parent, child) => {
1711
- if (!child) {
1712
- return parent;
1713
- }
1714
- const parentNewLineIndex = getNewLineIndex$1(parent);
1715
- const childNewLineIndex = getNewLineIndex$1(child);
1716
- if (childNewLineIndex === -1) {
1717
- return parent;
1718
- }
1719
- const parentFirstLine = parent.slice(0, parentNewLineIndex);
1720
- const childRest = child.slice(childNewLineIndex);
1721
- const childFirstLine = normalizeLine(child.slice(0, childNewLineIndex));
1722
- if (parentFirstLine.includes(childFirstLine)) {
1723
- return parentFirstLine + childRest;
1724
- }
1725
- return child;
1959
+ const confirm = async (message, options) => {
1960
+ // @ts-ignore
1961
+ const result = await invoke$1('ConfirmPrompt.prompt', message, options);
1962
+ return result;
1963
+ };
1964
+ const getRecentlyOpened = async () => {
1965
+ return invoke$1(/* RecentlyOpened.getRecentlyOpened */'RecentlyOpened.getRecentlyOpened');
1966
+ };
1967
+ const getKeyBindings = async () => {
1968
+ return invoke$1('KeyBindingsInitial.getKeyBindings');
1969
+ };
1970
+ const writeClipBoardText$1 = async text => {
1971
+ await invoke$1('ClipBoard.writeText', /* text */text);
1726
1972
  };
1727
- class VError extends Error {
1728
- constructor(error, message) {
1729
- const combinedMessage = getCombinedMessage(error, message);
1730
- super(combinedMessage);
1731
- this.name = 'VError';
1732
- if (error instanceof Error) {
1733
- this.stack = mergeStacks(this.stack, error.stack);
1734
- }
1735
- if (error.codeFrame) {
1736
- // @ts-ignore
1737
- this.codeFrame = error.codeFrame;
1738
- }
1739
- if (error.code) {
1740
- // @ts-ignore
1741
- this.code = error.code;
1742
- }
1743
- }
1744
- }
1745
-
1746
- const isMessagePort = value => {
1747
- return value && value instanceof MessagePort;
1973
+ const writeClipBoardImage$1 = async blob => {
1974
+ // @ts-ignore
1975
+ await invoke$1('ClipBoard.writeImage', /* text */blob);
1748
1976
  };
1749
- const isMessagePortMain = value => {
1750
- return value && value.constructor && value.constructor.name === 'MessagePortMain';
1977
+ const searchFileMemory = async uri => {
1978
+ // @ts-ignore
1979
+ return invoke$1('ExtensionHost.searchFileWithMemory', uri);
1751
1980
  };
1752
- const isOffscreenCanvas = value => {
1753
- return typeof OffscreenCanvas !== 'undefined' && value instanceof OffscreenCanvas;
1981
+ const searchFileFetch = async uri => {
1982
+ return invoke$1('ExtensionHost.searchFileWithFetch', uri);
1754
1983
  };
1755
- const isInstanceOf = (value, constructorName) => {
1756
- return value?.constructor?.name === constructorName;
1984
+ const showMessageBox = async options => {
1985
+ return invoke$1('ElectronDialog.showMessageBox', options);
1757
1986
  };
1758
- const isSocket = value => {
1759
- return isInstanceOf(value, 'Socket');
1987
+ const handleDebugResumed = async params => {
1988
+ await invoke$1('Run And Debug.handleResumed', params);
1760
1989
  };
1761
- const transferrables = [isMessagePort, isMessagePortMain, isOffscreenCanvas, isSocket];
1762
- const isTransferrable = value => {
1763
- for (const fn of transferrables) {
1764
- if (fn(value)) {
1765
- return true;
1766
- }
1767
- }
1768
- return false;
1990
+ const openWidget = async name => {
1991
+ await invoke$1('Viewlet.openWidget', name);
1769
1992
  };
1770
- const walkValue = (value, transferrables, isTransferrable) => {
1771
- if (!value) {
1772
- return;
1773
- }
1774
- if (isTransferrable(value)) {
1775
- transferrables.push(value);
1776
- return;
1777
- }
1778
- if (Array.isArray(value)) {
1779
- for (const item of value) {
1780
- walkValue(item, transferrables, isTransferrable);
1781
- }
1782
- return;
1783
- }
1784
- if (typeof value === 'object') {
1785
- for (const property of Object.values(value)) {
1786
- walkValue(property, transferrables, isTransferrable);
1787
- }
1788
- return;
1789
- }
1993
+ const getIcons = async requests => {
1994
+ const icons = await invoke$1('IconTheme.getIcons', requests);
1995
+ return icons;
1790
1996
  };
1791
- const getTransferrables = value => {
1792
- const transferrables = [];
1793
- walkValue(value, transferrables, isTransferrable);
1794
- return transferrables;
1997
+ const activateByEvent = event => {
1998
+ return invoke$1('ExtensionHostManagement.activateByEvent', event);
1795
1999
  };
1796
- const attachEvents = that => {
1797
- const handleMessage = (...args) => {
1798
- const data = that.getData(...args);
1799
- that.dispatchEvent(new MessageEvent('message', {
1800
- data
1801
- }));
1802
- };
1803
- that.onMessage(handleMessage);
1804
- const handleClose = event => {
1805
- that.dispatchEvent(new Event('close'));
1806
- };
1807
- that.onClose(handleClose);
2000
+ const setAdditionalFocus = focusKey => {
2001
+ // @ts-ignore
2002
+ return invoke$1('Focus.setAdditionalFocus', focusKey);
1808
2003
  };
1809
- class Ipc extends EventTarget {
1810
- constructor(rawIpc) {
1811
- super();
1812
- this._rawIpc = rawIpc;
1813
- attachEvents(this);
1814
- }
1815
- }
1816
- const E_INCOMPATIBLE_NATIVE_MODULE = 'E_INCOMPATIBLE_NATIVE_MODULE';
1817
- const E_MODULES_NOT_SUPPORTED_IN_ELECTRON = 'E_MODULES_NOT_SUPPORTED_IN_ELECTRON';
1818
- const ERR_MODULE_NOT_FOUND = 'ERR_MODULE_NOT_FOUND';
1819
- const NewLine$1 = '\n';
1820
- const joinLines$1 = lines => {
1821
- return lines.join(NewLine$1);
2004
+ const getActiveEditorId = () => {
2005
+ // @ts-ignore
2006
+ return invoke$1('GetActiveEditor.getActiveEditorId');
1822
2007
  };
1823
- const RE_AT = /^\s+at/;
1824
- const RE_AT_PROMISE_INDEX = /^\s*at async Promise.all \(index \d+\)$/;
1825
- const isNormalStackLine = line => {
1826
- return RE_AT.test(line) && !RE_AT_PROMISE_INDEX.test(line);
2008
+ const getWorkspacePath = () => {
2009
+ return invoke$1('Workspace.getPath');
1827
2010
  };
1828
- const getDetails = lines => {
1829
- const index = lines.findIndex(isNormalStackLine);
1830
- if (index === -1) {
1831
- return {
1832
- actualMessage: joinLines$1(lines),
1833
- rest: []
1834
- };
1835
- }
1836
- let lastIndex = index - 1;
1837
- while (++lastIndex < lines.length) {
1838
- if (!isNormalStackLine(lines[lastIndex])) {
1839
- break;
1840
- }
1841
- }
1842
- return {
1843
- actualMessage: lines[index - 1],
1844
- rest: lines.slice(index, lastIndex)
1845
- };
2011
+ const sendMessagePortToRendererProcess = async port => {
2012
+ const command = 'HandleMessagePort.handleMessagePort';
2013
+ // @ts-ignore
2014
+ await invokeAndTransfer('SendMessagePortToExtensionHostWorker.sendMessagePortToRendererProcess', port, command, DebugWorker);
1846
2015
  };
1847
- const splitLines$1 = lines => {
1848
- return lines.split(NewLine$1);
2016
+ const getPreference = async key => {
2017
+ return await invoke$1('Preferences.get', key);
1849
2018
  };
1850
- const RE_MESSAGE_CODE_BLOCK_START = /^Error: The module '.*'$/;
1851
- const RE_MESSAGE_CODE_BLOCK_END = /^\s* at/;
1852
- const isMessageCodeBlockStartIndex = line => {
1853
- return RE_MESSAGE_CODE_BLOCK_START.test(line);
2019
+ const getAllExtensions$2 = async () => {
2020
+ return invoke$1('ExtensionManagement.getAllExtensions');
1854
2021
  };
1855
- const isMessageCodeBlockEndIndex = line => {
1856
- return RE_MESSAGE_CODE_BLOCK_END.test(line);
2022
+ const rerenderEditor = async key => {
2023
+ // @ts-ignore
2024
+ return invoke$1('Editor.rerender', key);
1857
2025
  };
1858
- const getMessageCodeBlock = stderr => {
1859
- const lines = splitLines$1(stderr);
1860
- const startIndex = lines.findIndex(isMessageCodeBlockStartIndex);
1861
- const endIndex = startIndex + lines.slice(startIndex).findIndex(isMessageCodeBlockEndIndex, startIndex);
1862
- const relevantLines = lines.slice(startIndex, endIndex);
1863
- const relevantMessage = relevantLines.join(' ').slice('Error: '.length);
1864
- return relevantMessage;
2026
+ const handleDebugPaused = async params => {
2027
+ await invoke$1('Run And Debug.handlePaused', params);
1865
2028
  };
1866
- const isModuleNotFoundMessage = line => {
1867
- return line.includes('[ERR_MODULE_NOT_FOUND]');
2029
+ const openUri = async (uri, focus, options) => {
2030
+ await invoke$1('Main.openUri', uri, focus, options);
1868
2031
  };
1869
- const getModuleNotFoundError = stderr => {
1870
- const lines = splitLines$1(stderr);
1871
- const messageIndex = lines.findIndex(isModuleNotFoundMessage);
1872
- const message = lines[messageIndex];
1873
- return {
1874
- message,
1875
- code: ERR_MODULE_NOT_FOUND
1876
- };
2032
+ const sendMessagePortToSyntaxHighlightingWorker = async port => {
2033
+ await invokeAndTransfer(
2034
+ // @ts-ignore
2035
+ 'SendMessagePortToSyntaxHighlightingWorker.sendMessagePortToSyntaxHighlightingWorker', port, 'HandleMessagePort.handleMessagePort2');
1877
2036
  };
1878
- const isModuleNotFoundError = stderr => {
1879
- if (!stderr) {
1880
- return false;
1881
- }
1882
- return stderr.includes('ERR_MODULE_NOT_FOUND');
2037
+ const handleDebugScriptParsed = async script => {
2038
+ await invoke$1('Run And Debug.handleScriptParsed', script);
1883
2039
  };
1884
- const isModulesSyntaxError = stderr => {
1885
- if (!stderr) {
1886
- return false;
1887
- }
1888
- return stderr.includes('SyntaxError: Cannot use import statement outside a module');
2040
+ const getWindowId = async () => {
2041
+ return invoke$1('GetWindowId.getWindowId');
1889
2042
  };
1890
- const RE_NATIVE_MODULE_ERROR = /^innerError Error: Cannot find module '.*.node'/;
1891
- const RE_NATIVE_MODULE_ERROR_2 = /was compiled against a different Node.js version/;
1892
- const isUnhelpfulNativeModuleError = stderr => {
1893
- return RE_NATIVE_MODULE_ERROR.test(stderr) && RE_NATIVE_MODULE_ERROR_2.test(stderr);
2043
+ const getBlob = async uri => {
2044
+ // @ts-ignore
2045
+ return invoke$1('FileSystem.getBlob', uri);
1894
2046
  };
1895
- const getNativeModuleErrorMessage = stderr => {
1896
- const message = getMessageCodeBlock(stderr);
1897
- return {
1898
- message: `Incompatible native node module: ${message}`,
1899
- code: E_INCOMPATIBLE_NATIVE_MODULE
1900
- };
2047
+ const getExtensionCommands = async () => {
2048
+ return invoke$1('ExtensionHost.getCommands');
1901
2049
  };
1902
- const getModuleSyntaxError = () => {
1903
- return {
1904
- message: `ES Modules are not supported in electron`,
1905
- code: E_MODULES_NOT_SUPPORTED_IN_ELECTRON
1906
- };
2050
+ const showErrorDialog = async errorInfo => {
2051
+ // @ts-ignore
2052
+ await invoke$1('ErrorHandling.showErrorDialog', errorInfo);
1907
2053
  };
1908
- const getHelpfulChildProcessError = (stdout, stderr) => {
1909
- if (isUnhelpfulNativeModuleError(stderr)) {
1910
- return getNativeModuleErrorMessage(stderr);
1911
- }
1912
- if (isModulesSyntaxError(stderr)) {
1913
- return getModuleSyntaxError();
1914
- }
1915
- if (isModuleNotFoundError(stderr)) {
1916
- return getModuleNotFoundError(stderr);
1917
- }
1918
- const lines = splitLines$1(stderr);
1919
- const {
1920
- actualMessage,
1921
- rest
1922
- } = getDetails(lines);
1923
- return {
1924
- message: actualMessage,
1925
- code: '',
1926
- stack: rest
1927
- };
2054
+ const getFolderSize$1 = async uri => {
2055
+ // @ts-ignore
2056
+ return await invoke$1('FileSystem.getFolderSize', uri);
1928
2057
  };
1929
- class IpcError extends VError {
2058
+ const getExtension$3 = async id => {
1930
2059
  // @ts-ignore
1931
- constructor(betterMessage, stdout = '', stderr = '') {
1932
- if (stdout || stderr) {
1933
- // @ts-ignore
1934
- const {
1935
- message,
1936
- code,
1937
- stack
1938
- } = getHelpfulChildProcessError(stdout, stderr);
1939
- const cause = new Error(message);
1940
- // @ts-ignore
1941
- cause.code = code;
1942
- cause.stack = stack;
1943
- super(cause, betterMessage);
1944
- } else {
1945
- super(betterMessage);
1946
- }
1947
- // @ts-ignore
1948
- this.name = 'IpcError';
1949
- // @ts-ignore
1950
- this.stdout = stdout;
1951
- // @ts-ignore
1952
- this.stderr = stderr;
1953
- }
1954
- }
1955
- const readyMessage = 'ready';
1956
- const getData$2 = event => {
1957
- return event.data;
2060
+ return invoke$1('ExtensionManagement.getExtension', id);
1958
2061
  };
1959
- const listen$7 = () => {
2062
+ const getMarkdownDom = async html => {
1960
2063
  // @ts-ignore
1961
- if (typeof WorkerGlobalScope === 'undefined') {
1962
- throw new TypeError('module is not in web worker scope');
1963
- }
1964
- return globalThis;
2064
+ return invoke$1('Markdown.getVirtualDom', html);
2065
+ };
2066
+ const renderMarkdown$1 = async (markdown, options) => {
2067
+ // @ts-ignore
2068
+ return invoke$1('Markdown.renderMarkdown', markdown, options);
2069
+ };
2070
+ const openNativeFolder$1 = async uri => {
2071
+ // @ts-ignore
2072
+ await invoke$1('OpenNativeFolder.openNativeFolder', uri);
1965
2073
  };
1966
- const signal$8 = global => {
1967
- global.postMessage(readyMessage);
2074
+ const uninstallExtension$1 = async id => {
2075
+ return invoke$1('ExtensionManagement.uninstall', id);
1968
2076
  };
1969
- class IpcChildWithModuleWorker extends Ipc {
1970
- getData(event) {
1971
- return getData$2(event);
1972
- }
1973
- send(message) {
1974
- // @ts-ignore
1975
- this._rawIpc.postMessage(message);
1976
- }
1977
- sendAndTransfer(message) {
1978
- const transfer = getTransferrables(message);
1979
- // @ts-ignore
1980
- this._rawIpc.postMessage(message, transfer);
1981
- }
1982
- dispose() {
1983
- // ignore
1984
- }
1985
- onClose(callback) {
1986
- // ignore
1987
- }
1988
- onMessage(callback) {
1989
- this._rawIpc.addEventListener('message', callback);
1990
- }
1991
- }
1992
- const wrap$f = global => {
1993
- return new IpcChildWithModuleWorker(global);
2077
+ const installExtension = async id => {
2078
+ // @ts-ignore
2079
+ return invoke$1('ExtensionManagement.install', id);
1994
2080
  };
1995
- const waitForFirstMessage = async port => {
1996
- const {
1997
- resolve,
1998
- promise
1999
- } = Promise.withResolvers();
2000
- port.addEventListener('message', resolve, {
2001
- once: true
2002
- });
2003
- const event = await promise;
2081
+ const openExtensionSearch$2 = async () => {
2004
2082
  // @ts-ignore
2005
- return event.data;
2083
+ return invoke$1('SideBar.openViewlet', 'Extensions');
2006
2084
  };
2007
- const listen$6 = async () => {
2008
- const parentIpcRaw = listen$7();
2009
- signal$8(parentIpcRaw);
2010
- const parentIpc = wrap$f(parentIpcRaw);
2011
- const firstMessage = await waitForFirstMessage(parentIpc);
2012
- if (firstMessage.method !== 'initialize') {
2013
- throw new IpcError('unexpected first message');
2014
- }
2015
- const type = firstMessage.params[0];
2016
- if (type === 'message-port') {
2017
- parentIpc.send({
2018
- jsonrpc: '2.0',
2019
- id: firstMessage.id,
2020
- result: null
2021
- });
2022
- parentIpc.dispose();
2023
- const port = firstMessage.params[1];
2024
- return port;
2025
- }
2026
- return globalThis;
2085
+ const setExtensionsSearchValue$1 = async searchValue => {
2086
+ // @ts-ignore
2087
+ return invoke$1('Extensions.handleInput', searchValue);
2027
2088
  };
2028
- class IpcChildWithModuleWorkerAndMessagePort extends Ipc {
2029
- getData(event) {
2030
- return getData$2(event);
2031
- }
2032
- send(message) {
2033
- this._rawIpc.postMessage(message);
2034
- }
2035
- sendAndTransfer(message) {
2036
- const transfer = getTransferrables(message);
2037
- this._rawIpc.postMessage(message, transfer);
2038
- }
2039
- dispose() {
2040
- if (this._rawIpc.close) {
2041
- this._rawIpc.close();
2042
- }
2043
- }
2044
- onClose(callback) {
2045
- // ignore
2046
- }
2047
- onMessage(callback) {
2048
- this._rawIpc.addEventListener('message', callback);
2049
- this._rawIpc.start();
2050
- }
2051
- }
2052
- const wrap$e = port => {
2053
- return new IpcChildWithModuleWorkerAndMessagePort(port);
2089
+ const openExternal = async uri => {
2090
+ // @ts-ignore
2091
+ await invoke$1('Open.openExternal', uri);
2054
2092
  };
2055
- const IpcChildWithModuleWorkerAndMessagePort$1 = {
2056
- __proto__: null,
2057
- listen: listen$6,
2058
- wrap: wrap$e
2093
+ const openUrl$2 = async uri => {
2094
+ // @ts-ignore
2095
+ await invoke$1('Open.openUrl', uri);
2059
2096
  };
2060
- const addListener = (emitter, type, callback) => {
2061
- if ('addEventListener' in emitter) {
2062
- emitter.addEventListener(type, callback);
2063
- } else {
2064
- emitter.on(type, callback);
2065
- }
2097
+ const getAllPreferences = async () => {
2098
+ // @ts-ignore
2099
+ return invoke$1('Preferences.getAll');
2066
2100
  };
2067
- const removeListener = (emitter, type, callback) => {
2068
- if ('removeEventListener' in emitter) {
2069
- emitter.removeEventListener(type, callback);
2070
- } else {
2071
- emitter.off(type, callback);
2072
- }
2101
+ const showSaveFilePicker = async () => {
2102
+ // @ts-ignore
2103
+ return invoke$1('FilePicker.showSaveFilePicker');
2073
2104
  };
2074
- const getFirstEvent = (eventEmitter, eventMap) => {
2075
- const {
2076
- resolve,
2077
- promise
2078
- } = Promise.withResolvers();
2079
- const listenerMap = Object.create(null);
2080
- const cleanup = value => {
2081
- for (const event of Object.keys(eventMap)) {
2082
- removeListener(eventEmitter, event, listenerMap[event]);
2083
- }
2084
- resolve(value);
2085
- };
2086
- for (const [event, type] of Object.entries(eventMap)) {
2087
- const listener = event => {
2088
- cleanup({
2089
- type,
2090
- event
2091
- });
2092
- };
2093
- addListener(eventEmitter, event, listener);
2094
- listenerMap[event] = listener;
2095
- }
2096
- return promise;
2105
+ const getLogsDir = async () => {
2106
+ // @ts-ignore
2107
+ return invoke$1('PlatformPaths.getLogsDir');
2097
2108
  };
2098
- const Message$1 = 3;
2099
- const create$5$1 = async ({
2100
- messagePort,
2101
- isMessagePortOpen
2102
- }) => {
2103
- if (!isMessagePort(messagePort)) {
2104
- throw new IpcError('port must be of type MessagePort');
2105
- }
2106
- if (isMessagePortOpen) {
2107
- return messagePort;
2108
- }
2109
- const eventPromise = getFirstEvent(messagePort, {
2110
- message: Message$1
2109
+ const registerMockRpc = commandMap => {
2110
+ const mockRpc = createMockRpc({
2111
+ commandMap
2111
2112
  });
2112
- messagePort.start();
2113
- const {
2114
- type,
2115
- event
2116
- } = await eventPromise;
2117
- if (type !== Message$1) {
2118
- throw new IpcError('Failed to wait for ipc message');
2119
- }
2120
- if (event.data !== readyMessage) {
2121
- throw new IpcError('unexpected first message');
2122
- }
2123
- return messagePort;
2124
- };
2125
- const signal$1 = messagePort => {
2126
- messagePort.start();
2127
- };
2128
- class IpcParentWithMessagePort extends Ipc {
2129
- getData = getData$2;
2130
- send(message) {
2131
- this._rawIpc.postMessage(message);
2132
- }
2133
- sendAndTransfer(message) {
2134
- const transfer = getTransferrables(message);
2135
- this._rawIpc.postMessage(message, transfer);
2136
- }
2137
- dispose() {
2138
- this._rawIpc.close();
2139
- }
2140
- onMessage(callback) {
2141
- this._rawIpc.addEventListener('message', callback);
2142
- }
2143
- onClose(callback) {}
2144
- }
2145
- const wrap$5 = messagePort => {
2146
- return new IpcParentWithMessagePort(messagePort);
2113
+ set$5(mockRpc);
2114
+ return mockRpc;
2147
2115
  };
2148
- const IpcParentWithMessagePort$1 = {
2116
+
2117
+ const RendererWorker = {
2149
2118
  __proto__: null,
2150
- create: create$5$1,
2151
- signal: signal$1,
2152
- wrap: wrap$5
2119
+ activateByEvent,
2120
+ applyBulkReplacement,
2121
+ closeWidget,
2122
+ confirm,
2123
+ disableExtension: disableExtension$2,
2124
+ dispose: dispose$2,
2125
+ enableExtension: enableExtension$2,
2126
+ getActiveEditorId,
2127
+ getAllExtensions: getAllExtensions$2,
2128
+ getAllPreferences,
2129
+ getBlob,
2130
+ getChromeVersion,
2131
+ getColorThemeNames,
2132
+ getElectronVersion,
2133
+ getExtension: getExtension$3,
2134
+ getExtensionCommands,
2135
+ getFileHandles,
2136
+ getFileIcon,
2137
+ getFilePathElectron,
2138
+ getFolderIcon,
2139
+ getFolderSize: getFolderSize$1,
2140
+ getIcons,
2141
+ getKeyBindings,
2142
+ getLogsDir,
2143
+ getMarkdownDom,
2144
+ getNodeVersion,
2145
+ getPreference,
2146
+ getRecentlyOpened,
2147
+ getV8Version,
2148
+ getWebViewSecret,
2149
+ getWindowId,
2150
+ getWorkspacePath,
2151
+ handleDebugChange,
2152
+ handleDebugPaused,
2153
+ handleDebugResumed,
2154
+ handleDebugScriptParsed,
2155
+ installExtension,
2156
+ invoke: invoke$1,
2157
+ invokeAndTransfer,
2158
+ openExtensionSearch: openExtensionSearch$2,
2159
+ openExternal,
2160
+ openNativeFolder: openNativeFolder$1,
2161
+ openUri,
2162
+ openUrl: openUrl$2,
2163
+ openWidget,
2164
+ readFile: readFile$2,
2165
+ registerMockRpc,
2166
+ registerWebViewInterceptor,
2167
+ renderMarkdown: renderMarkdown$1,
2168
+ rerenderEditor,
2169
+ searchFileFetch,
2170
+ searchFileHtml,
2171
+ searchFileMemory,
2172
+ sendMessagePortToEditorWorker,
2173
+ sendMessagePortToErrorWorker,
2174
+ sendMessagePortToExtensionHostWorker: sendMessagePortToExtensionHostWorker$2,
2175
+ sendMessagePortToFileSystemWorker: sendMessagePortToFileSystemWorker$2,
2176
+ sendMessagePortToIconThemeWorker,
2177
+ sendMessagePortToMarkdownWorker: sendMessagePortToMarkdownWorker$2,
2178
+ sendMessagePortToRendererProcess,
2179
+ sendMessagePortToSearchProcess,
2180
+ sendMessagePortToSyntaxHighlightingWorker,
2181
+ set: set$5,
2182
+ setAdditionalFocus,
2183
+ setColorTheme: setColorTheme$2,
2184
+ setExtensionsSearchValue: setExtensionsSearchValue$1,
2185
+ setFocus,
2186
+ setWebViewPort,
2187
+ setWorkspacePath,
2188
+ showContextMenu: showContextMenu$1,
2189
+ showErrorDialog,
2190
+ showMessageBox,
2191
+ showSaveFilePicker,
2192
+ uninstallExtension: uninstallExtension$1,
2193
+ unregisterWebViewInterceptor,
2194
+ writeClipBoardImage: writeClipBoardImage$1,
2195
+ writeClipBoardText: writeClipBoardText$1
2153
2196
  };
2154
2197
 
2155
- const Two = '2.0';
2156
- const create$4 = (method, params) => {
2157
- return {
2158
- jsonrpc: Two,
2159
- method,
2160
- params
2161
- };
2162
- };
2163
- const callbacks = Object.create(null);
2164
- const set$3 = (id, fn) => {
2165
- callbacks[id] = fn;
2166
- };
2167
- const get$1 = id => {
2168
- return callbacks[id];
2169
- };
2170
- const remove = id => {
2171
- delete callbacks[id];
2172
- };
2173
- let id = 0;
2174
- const create$3$1 = () => {
2175
- return ++id;
2176
- };
2177
- const registerPromise = () => {
2178
- const id = create$3$1();
2179
- const {
2180
- resolve,
2181
- promise
2182
- } = Promise.withResolvers();
2183
- set$3(id, resolve);
2184
- return {
2185
- id,
2186
- promise
2187
- };
2198
+ const {
2199
+ set: set$4,
2200
+ getRuntimeStatus: getRuntimeStatus$1
2201
+ } = ExtensionHost;
2202
+
2203
+ const getRuntimeStatus = async extensionId => {
2204
+ // @ts-ignore
2205
+ const status = await getRuntimeStatus$1(extensionId);
2206
+ // @ts-ignore
2207
+ return status;
2188
2208
  };
2189
- const create$2$1 = (method, params) => {
2209
+
2210
+ const getRuntimeStatusDetails = async extension => {
2190
2211
  const {
2191
- id,
2192
- promise
2193
- } = registerPromise();
2194
- const message = {
2195
- jsonrpc: Two,
2196
- method,
2197
- params,
2198
- id
2199
- };
2212
+ activationEvent,
2213
+ status,
2214
+ activationTime,
2215
+ importTime
2216
+ } = await getRuntimeStatus(extension.id);
2200
2217
  return {
2201
- message,
2202
- promise
2218
+ wasActivatedByEvent: activationEvent,
2219
+ activationTime,
2220
+ status,
2221
+ importTime
2203
2222
  };
2204
2223
  };
2205
- class JsonRpcError extends Error {
2206
- constructor(message) {
2207
- super(message);
2208
- this.name = 'JsonRpcError';
2209
- }
2210
- }
2211
- const NewLine = '\n';
2212
- const DomException = 'DOMException';
2213
- const ReferenceError$1 = 'ReferenceError';
2214
- const SyntaxError$1 = 'SyntaxError';
2215
- const TypeError$1 = 'TypeError';
2216
- const getErrorConstructor = (message, type) => {
2217
- if (type) {
2218
- switch (type) {
2219
- case DomException:
2220
- return DOMException;
2221
- case TypeError$1:
2222
- return TypeError;
2223
- case SyntaxError$1:
2224
- return SyntaxError;
2225
- case ReferenceError$1:
2226
- return ReferenceError;
2227
- default:
2228
- return Error;
2229
- }
2230
- }
2231
- if (message.startsWith('TypeError: ')) {
2232
- return TypeError;
2233
- }
2234
- if (message.startsWith('SyntaxError: ')) {
2235
- return SyntaxError;
2236
- }
2237
- if (message.startsWith('ReferenceError: ')) {
2238
- return ReferenceError;
2239
- }
2240
- return Error;
2241
- };
2242
- const constructError = (message, type, name) => {
2243
- const ErrorConstructor = getErrorConstructor(message, type);
2244
- if (ErrorConstructor === DOMException && name) {
2245
- return new ErrorConstructor(message, name);
2224
+
2225
+ const featureRuntimeStatusEnabled = extension => {
2226
+ if (!extension || typeof extension !== 'object') {
2227
+ return false;
2246
2228
  }
2247
- if (ErrorConstructor === Error) {
2248
- const error = new Error(message);
2249
- if (name && name !== 'VError') {
2250
- error.name = name;
2251
- }
2252
- return error;
2229
+ if ('main' in extension || 'browser' in extension) {
2230
+ return true;
2253
2231
  }
2254
- return new ErrorConstructor(message);
2255
- };
2256
- const joinLines = lines => {
2257
- return lines.join(NewLine);
2258
- };
2259
- const splitLines = lines => {
2260
- return lines.split(NewLine);
2261
- };
2262
- const getCurrentStack = () => {
2263
- const stackLinesToSkip = 3;
2264
- const currentStack = joinLines(splitLines(new Error().stack || '').slice(stackLinesToSkip));
2265
- return currentStack;
2232
+ return false;
2266
2233
  };
2267
- const getNewLineIndex = (string, startIndex = undefined) => {
2268
- return string.indexOf(NewLine, startIndex);
2234
+
2235
+ const formatTime = time => {
2236
+ return time.toFixed(2) + 'ms';
2269
2237
  };
2270
- const getParentStack = error => {
2271
- let parentStack = error.stack || error.data || error.message || '';
2272
- if (parentStack.startsWith(' at')) {
2273
- parentStack = error.message + NewLine + parentStack;
2238
+
2239
+ const getActivationTimeVirtualDom = (importTime$1, activationTime$1) => {
2240
+ if (!activationTime$1 && !importTime$1) {
2241
+ return [];
2274
2242
  }
2275
- return parentStack;
2243
+ const formattedImportTime = formatTime(importTime$1);
2244
+ const formattedTime = formatTime(activationTime$1);
2245
+ return [{
2246
+ type: Dt,
2247
+ childCount: 1
2248
+ }, text(importTime()), {
2249
+ type: Dd,
2250
+ childCount: 1
2251
+ }, text(formattedImportTime), {
2252
+ type: Dt,
2253
+ childCount: 1
2254
+ }, text(activationTime()), {
2255
+ type: Dd,
2256
+ childCount: 1
2257
+ }, text(formattedTime)];
2276
2258
  };
2277
- const MethodNotFound = -32601;
2278
- const Custom = -32001;
2279
- const restoreJsonRpcError = error => {
2280
- const currentStack = getCurrentStack();
2281
- if (error && error instanceof Error) {
2282
- if (typeof error.stack === 'string') {
2283
- error.stack = error.stack + NewLine + currentStack;
2284
- }
2285
- return error;
2286
- }
2287
- if (error && error.code && error.code === MethodNotFound) {
2288
- const restoredError = new JsonRpcError(error.message);
2289
- const parentStack = getParentStack(error);
2290
- restoredError.stack = parentStack + NewLine + currentStack;
2291
- return restoredError;
2292
- }
2293
- if (error && error.message) {
2294
- const restoredError = constructError(error.message, error.type, error.name);
2295
- if (error.data) {
2296
- if (error.data.stack && error.data.type && error.message) {
2297
- restoredError.stack = error.data.type + ': ' + error.message + NewLine + error.data.stack + NewLine + currentStack;
2298
- } else if (error.data.stack) {
2299
- restoredError.stack = error.data.stack;
2300
- }
2301
- if (error.data.codeFrame) {
2302
- // @ts-ignore
2303
- restoredError.codeFrame = error.data.codeFrame;
2304
- }
2305
- if (error.data.code) {
2306
- // @ts-ignore
2307
- restoredError.code = error.data.code;
2308
- }
2309
- if (error.data.type) {
2310
- // @ts-ignore
2311
- restoredError.name = error.data.type;
2312
- }
2313
- } else {
2314
- if (error.stack) {
2315
- const lowerStack = restoredError.stack || '';
2316
- // @ts-ignore
2317
- const indexNewLine = getNewLineIndex(lowerStack);
2318
- const parentStack = getParentStack(error);
2319
- // @ts-ignore
2320
- restoredError.stack = parentStack + lowerStack.slice(indexNewLine);
2321
- }
2322
- if (error.codeFrame) {
2323
- // @ts-ignore
2324
- restoredError.codeFrame = error.codeFrame;
2325
- }
2326
- }
2327
- return restoredError;
2328
- }
2329
- if (typeof error === 'string') {
2330
- return new Error(`JsonRpc Error: ${error}`);
2259
+
2260
+ const None$1 = 0;
2261
+ const Importing = 1;
2262
+ const Activating = 2;
2263
+ const Activated = 3;
2264
+ const Error$1 = 4;
2265
+
2266
+ const getStatusMessage = statusType => {
2267
+ switch (statusType) {
2268
+ case Activated:
2269
+ return 'activated';
2270
+ case None$1:
2271
+ return 'none';
2272
+ case Activating:
2273
+ return 'Activating';
2274
+ case Error$1:
2275
+ return 'error';
2276
+ case Importing:
2277
+ return 'importing';
2278
+ default:
2279
+ return 'unknown';
2331
2280
  }
2332
- return new Error(`JsonRpc Error: ${error}`);
2333
2281
  };
2334
- const unwrapJsonRpcResult = responseMessage => {
2335
- if ('error' in responseMessage) {
2336
- const restoredError = restoreJsonRpcError(responseMessage.error);
2337
- throw restoredError;
2338
- }
2339
- if ('result' in responseMessage) {
2340
- return responseMessage.result;
2341
- }
2342
- throw new JsonRpcError('unexpected response message');
2282
+
2283
+ const key = {
2284
+ type: Dt,
2285
+ childCount: 1,
2286
+ className: 'RuntimeStatusDefinitionListKey'
2343
2287
  };
2344
- const warn = (...args) => {
2345
- console.warn(...args);
2288
+ const value = {
2289
+ type: Dd,
2290
+ className: 'RuntimeStatusDefinitionListValue',
2291
+ childCount: 1
2346
2292
  };
2347
- const resolve = (id, response) => {
2348
- const fn = get$1(id);
2349
- if (!fn) {
2350
- console.log(response);
2351
- warn(`callback ${id} may already be disposed`);
2352
- return;
2353
- }
2354
- fn(response);
2355
- remove(id);
2293
+ const getStatusVirtualDom = status => {
2294
+ const statusString = getStatusMessage(status);
2295
+ return [key, text(`Status: `),
2296
+ // i18n
2297
+ value, text(`${statusString}`)];
2356
2298
  };
2357
- const E_COMMAND_NOT_FOUND = 'E_COMMAND_NOT_FOUND';
2358
- const getErrorType = prettyError => {
2359
- if (prettyError && prettyError.type) {
2360
- return prettyError.type;
2361
- }
2362
- if (prettyError && prettyError.constructor && prettyError.constructor.name) {
2363
- return prettyError.constructor.name;
2299
+
2300
+ const getChildCount$1 = (status, activationTime, importTime) => {
2301
+ let childCount = 0;
2302
+ childCount += 2; // status
2303
+ if (importTime || activationTime) {
2304
+ childCount += 4;
2364
2305
  }
2365
- return undefined;
2306
+ return childCount;
2366
2307
  };
2367
- const isAlreadyStack = line => {
2368
- return line.trim().startsWith('at ');
2308
+ const getRuntimeStatusVirtualDom = state => {
2309
+ const {
2310
+ status,
2311
+ activationTime,
2312
+ importTime
2313
+ } = state;
2314
+ const heading = runtimeStatus();
2315
+ const childCount = getChildCount$1(status, activationTime, importTime);
2316
+ return [{
2317
+ type: Div,
2318
+ className: FeatureContent,
2319
+ childCount: 2
2320
+ }, ...getFeatureContentHeadingVirtualDom(heading), {
2321
+ type: Dl,
2322
+ className: 'RuntimeStatusDefinitionList',
2323
+ childCount
2324
+ }, ...getStatusVirtualDom(status), ...getActivationTimeVirtualDom(activationTime, importTime)];
2369
2325
  };
2370
- const getStack = prettyError => {
2371
- const stackString = prettyError.stack || '';
2372
- const newLineIndex = stackString.indexOf('\n');
2373
- if (newLineIndex !== -1 && !isAlreadyStack(stackString.slice(0, newLineIndex))) {
2374
- return stackString.slice(newLineIndex + 1);
2375
- }
2376
- return stackString;
2326
+
2327
+ const getSettingsTableEntry = setting => {
2328
+ const {
2329
+ id,
2330
+ label
2331
+ } = setting;
2332
+ // TODO watch out for null/undefined/number/string/array
2333
+ return [{
2334
+ type: Text,
2335
+ value: id
2336
+ }, {
2337
+ type: Text,
2338
+ value: label
2339
+ }];
2377
2340
  };
2378
- const getErrorProperty = (error, prettyError) => {
2379
- if (error && error.code === E_COMMAND_NOT_FOUND) {
2380
- return {
2381
- code: MethodNotFound,
2382
- message: error.message,
2383
- data: error.stack
2384
- };
2385
- }
2341
+
2342
+ const getSettingsDetails = async extension => {
2343
+ const settings = extension.settings || [];
2344
+ const rows = settings.map(getSettingsTableEntry);
2386
2345
  return {
2387
- code: Custom,
2388
- message: prettyError.message,
2389
- data: {
2390
- stack: getStack(prettyError),
2391
- codeFrame: prettyError.codeFrame,
2392
- type: getErrorType(prettyError),
2393
- code: prettyError.code,
2394
- name: prettyError.name
2395
- }
2346
+ settings: rows
2396
2347
  };
2397
2348
  };
2398
- const create$1$1 = (id, error) => {
2349
+
2350
+ const featureSettingsEnabled = extension => {
2351
+ if (!extension || typeof extension !== 'object' || !('settings' in extension)) {
2352
+ return false;
2353
+ }
2354
+ return Array.isArray(extension.settings);
2355
+ };
2356
+
2357
+ const getSettingsTableEntries = rows => {
2358
+ const textId = id$1();
2359
+ const textLabel = label();
2399
2360
  return {
2400
- jsonrpc: Two,
2401
- id,
2402
- error
2361
+ headings: [textId, textLabel],
2362
+ rows
2403
2363
  };
2404
2364
  };
2405
- const getErrorResponse = (id, error, preparePrettyError, logError) => {
2406
- const prettyError = preparePrettyError(error);
2407
- logError(error, prettyError);
2408
- const errorProperty = getErrorProperty(error, prettyError);
2409
- return create$1$1(id, errorProperty);
2365
+
2366
+ const getFeatureSettingsVirtualDom = rows => {
2367
+ const heading = settings();
2368
+ const tableInfo = getSettingsTableEntries(rows);
2369
+ return [{
2370
+ type: Div,
2371
+ className: FeatureContent,
2372
+ childCount: 2
2373
+ }, ...getFeatureContentHeadingVirtualDom(heading), ...getTableVirtualDom(tableInfo)];
2410
2374
  };
2411
- const create$6 = (message, result) => {
2412
- return {
2413
- jsonrpc: Two,
2414
- id: message.id,
2415
- result: result ?? null
2416
- };
2375
+
2376
+ const getSettingsVirtualDom = state => {
2377
+ return getFeatureSettingsVirtualDom(state.settings);
2417
2378
  };
2418
- const getSuccessResponse = (message, result) => {
2419
- const resultProperty = result ?? null;
2420
- return create$6(message, resultProperty);
2379
+
2380
+ const HandleClickCategory = 'handleClickCategory';
2381
+ const HandleClickDisable = 'handleClickDisable';
2382
+ const HandleClickEnable = 'handleClickEnable';
2383
+ const HandleClickScrollToTop = 'handleClickScrollToTop';
2384
+ const HandleClickSetColorTheme = 'handleClickSetColorTheme';
2385
+ const HandleClickSettings = 'handleClickSettings';
2386
+ const HandleClickSize = 'handleClickSize';
2387
+ const HandleClickUninstall = 'handleClickUninstall';
2388
+ const HandleFeaturesClick = 'handleFeaturesClick';
2389
+ const HandleIconError = 'handleIconError';
2390
+ const HandleImageContextMenu = 'handleImageContextMenu';
2391
+ const HandleReadmeContextMenu = 'handleReadmeContextMenu';
2392
+ const HandleReadmeScroll = 'handleReadmeScroll';
2393
+ const HandleTabsClick = 'handleTabsClick';
2394
+
2395
+ const ActivationEvents = 'ActivationEvents';
2396
+ const Changelog = 'Changelog';
2397
+ const Commands = 'Commands';
2398
+ const Details = 'Details';
2399
+ const Enable = 'Enable';
2400
+ const Disable = 'Disable';
2401
+ const Features = 'Features';
2402
+ const JsonValidation = 'JsonValidation';
2403
+ const ProgrammingLanguages = 'ProgrammingLanguages';
2404
+ const RuntimeStatus = 'RuntimeStatus';
2405
+ const ScrollToTop = 'scrolltotop';
2406
+ const SetColorTheme = 'SetColorTheme';
2407
+ const Settings = 'Settings';
2408
+ const Theme = 'Theme';
2409
+ const Uninstall = 'Uninstall';
2410
+ const WebViews = 'WebViews';
2411
+
2412
+ const getScrollToTopVirtualDom = scrollToTopButtonEnabled => {
2413
+ return [{
2414
+ type: Button$1,
2415
+ className: ScrollToTopButton,
2416
+ childCount: 1,
2417
+ onClick: HandleClickScrollToTop,
2418
+ ariaLabel: scrollToTop(),
2419
+ name: ScrollToTop
2420
+ }, {
2421
+ type: Div,
2422
+ className: 'MaskIcon MaskIconChevronUp',
2423
+ childCount: 0,
2424
+ role: None$2
2425
+ }];
2421
2426
  };
2422
- const getErrorResponseSimple = (id, error) => {
2423
- return {
2424
- jsonrpc: Two,
2425
- id,
2426
- error: {
2427
- code: Custom,
2428
- // @ts-ignore
2429
- message: error.message,
2430
- data: error
2431
- }
2432
- };
2427
+
2428
+ const {
2429
+ set: set$3,
2430
+ getVirtualDom,
2431
+ render
2432
+ } = MarkdownWorker;
2433
+
2434
+ const getMarkdownVirtualDom = async (html, options) => {
2435
+ string(html);
2436
+ const dom = await getVirtualDom(html);
2437
+ const newDom = [...dom];
2438
+ if (options?.scrollToTopEnabled) {
2439
+ newDom[0].onScroll = HandleReadmeScroll;
2440
+ newDom[0].childCount++;
2441
+ const extraDom = getScrollToTopVirtualDom();
2442
+ newDom.splice(1, 0, ...extraDom);
2443
+ }
2444
+ return newDom;
2433
2445
  };
2434
- const getResponse = async (message, ipc, execute, preparePrettyError, logError, requiresSocket) => {
2435
- try {
2436
- const result = requiresSocket(message.method) ? await execute(message.method, ipc, ...message.params) : await execute(message.method, ...message.params);
2437
- return getSuccessResponse(message, result);
2438
- } catch (error) {
2439
- if (ipc.canUseSimpleErrorResponse) {
2440
- return getErrorResponseSimple(message.id, error);
2446
+
2447
+ const getThemeItemMarkdown = (heading, items) => {
2448
+ let markdown = '';
2449
+ if (items.length > 0) {
2450
+ markdown += `### ${heading}`;
2451
+ markdown += '\n\n';
2452
+ for (const item of items) {
2453
+ markdown += `- ${item.label}`;
2454
+ markdown += '\n';
2441
2455
  }
2442
- return getErrorResponse(message.id, error, preparePrettyError, logError);
2443
2456
  }
2457
+ return markdown;
2444
2458
  };
2445
- const defaultPreparePrettyError = error => {
2446
- return error;
2459
+
2460
+ const getColorThemeMarkdown = themes => {
2461
+ const heading = 'Color Themes';
2462
+ return getThemeItemMarkdown(heading, themes);
2447
2463
  };
2448
- const defaultLogError = () => {
2449
- // ignore
2464
+ const getIconThemeMarkdown = iconThemes => {
2465
+ const heading = 'File Icon Themes';
2466
+ return getThemeItemMarkdown(heading, iconThemes);
2450
2467
  };
2451
- const defaultRequiresSocket = () => {
2452
- return false;
2468
+ const getProductIconThemeMarkdown = iconThemes => {
2469
+ const heading = 'Product Icon Themes';
2470
+ return getThemeItemMarkdown(heading, iconThemes);
2471
+ };
2472
+ const getThemeMarkdown = (themes, iconThemes, productIconThemes) => {
2473
+ let markdown = '';
2474
+ markdown += getColorThemeMarkdown(themes);
2475
+ markdown += getIconThemeMarkdown(iconThemes);
2476
+ markdown += getProductIconThemeMarkdown(productIconThemes);
2477
+ return markdown;
2453
2478
  };
2454
- const defaultResolve = resolve;
2455
2479
 
2456
- // TODO maybe remove this in v6 or v7, only accept options object to simplify the code
2457
- const normalizeParams = args => {
2458
- if (args.length === 1) {
2459
- const options = args[0];
2460
- return {
2461
- ipc: options.ipc,
2462
- message: options.message,
2463
- execute: options.execute,
2464
- resolve: options.resolve || defaultResolve,
2465
- preparePrettyError: options.preparePrettyError || defaultPreparePrettyError,
2466
- logError: options.logError || defaultLogError,
2467
- requiresSocket: options.requiresSocket || defaultRequiresSocket
2468
- };
2469
- }
2480
+ const renderMarkdown = async (markdown, options = {}) => {
2481
+ const html = await render(markdown, options);
2482
+ return html;
2483
+ };
2484
+
2485
+ const getThemeDetails = async (extension, baseUrl) => {
2486
+ const {
2487
+ colorThemes,
2488
+ iconThemes,
2489
+ productIconThemes
2490
+ } = extension;
2491
+ const markdown = getThemeMarkdown(colorThemes || [], iconThemes || [], productIconThemes || []);
2492
+ const rendered = await renderMarkdown(markdown, {
2493
+ baseUrl
2494
+ });
2495
+ const themesMarkdownDom = await getMarkdownVirtualDom(rendered);
2470
2496
  return {
2471
- ipc: args[0],
2472
- message: args[1],
2473
- execute: args[2],
2474
- resolve: args[3],
2475
- preparePrettyError: args[4],
2476
- logError: args[5],
2477
- requiresSocket: args[6]
2497
+ themesMarkdownDom
2478
2498
  };
2479
2499
  };
2480
- const handleJsonRpcMessage = async (...args) => {
2481
- const options = normalizeParams(args);
2482
- const {
2483
- message,
2484
- ipc,
2485
- execute,
2486
- resolve,
2487
- preparePrettyError,
2488
- logError,
2489
- requiresSocket
2490
- } = options;
2491
- if ('id' in message) {
2492
- if ('method' in message) {
2493
- const response = await getResponse(message, ipc, execute, preparePrettyError, logError, requiresSocket);
2494
- try {
2495
- ipc.send(response);
2496
- } catch (error) {
2497
- const errorResponse = getErrorResponse(message.id, error, preparePrettyError, logError);
2498
- ipc.send(errorResponse);
2499
- }
2500
- return;
2501
- }
2502
- resolve(message.id, message);
2503
- return;
2504
- }
2505
- if ('method' in message) {
2506
- await getResponse(message, ipc, execute, preparePrettyError, logError, requiresSocket);
2507
- return;
2500
+
2501
+ const featureColorThemeEnabled = extension => {
2502
+ if (!extension || typeof extension !== 'object' || !('colorThemes' in extension)) {
2503
+ return false;
2508
2504
  }
2509
- throw new JsonRpcError('unexpected message');
2505
+ return Array.isArray(extension.colorThemes);
2510
2506
  };
2511
- const invokeHelper = async (ipc, method, params, useSendAndTransfer) => {
2512
- const {
2513
- message,
2514
- promise
2515
- } = create$2$1(method, params);
2516
- if (useSendAndTransfer && ipc.sendAndTransfer) {
2517
- ipc.sendAndTransfer(message);
2518
- } else {
2519
- ipc.send(message);
2507
+
2508
+ const featureIconThemeEnabled = extension => {
2509
+ if (!extension || typeof extension !== 'object' || !('iconThemes' in extension)) {
2510
+ return false;
2520
2511
  }
2521
- const responseMessage = await promise;
2522
- return unwrapJsonRpcResult(responseMessage);
2523
- };
2524
- const send = (transport, method, ...params) => {
2525
- const message = create$4(method, params);
2526
- transport.send(message);
2527
- };
2528
- const invoke$1 = (ipc, method, ...params) => {
2529
- return invokeHelper(ipc, method, params, false);
2530
- };
2531
- const invokeAndTransfer = (ipc, method, ...params) => {
2532
- return invokeHelper(ipc, method, params, true);
2512
+ return Array.isArray(extension.iconThemes);
2533
2513
  };
2534
2514
 
2535
- class CommandNotFoundError extends Error {
2536
- constructor(command) {
2537
- super(`Command not found ${command}`);
2538
- this.name = 'CommandNotFoundError';
2515
+ const featureProductIconThemeEnabled = extension => {
2516
+ if (!extension || typeof extension !== 'object' || !('productIconThemes' in extension)) {
2517
+ return false;
2539
2518
  }
2540
- }
2541
- const commands = Object.create(null);
2542
- const register = commandMap => {
2543
- Object.assign(commands, commandMap);
2519
+ return Array.isArray(extension.productIconThemes);
2544
2520
  };
2545
- const getCommand = key => {
2546
- return commands[key];
2521
+
2522
+ const featureThemeEnabled = extension => {
2523
+ return featureColorThemeEnabled(extension) || featureIconThemeEnabled(extension) || featureProductIconThemeEnabled(extension);
2547
2524
  };
2548
- const execute = (command, ...args) => {
2549
- const fn = getCommand(command);
2550
- if (!fn) {
2551
- throw new CommandNotFoundError(command);
2525
+
2526
+ const getVirtualDomChildCount = dom => {
2527
+ const max = dom.length - 1;
2528
+ let stack = [];
2529
+ for (let i = max; i >= 0; i--) {
2530
+ const element = dom[i];
2531
+ if (element.childCount > 0) {
2532
+ stack = stack.slice(element.childCount);
2533
+ }
2534
+ stack.unshift(element);
2552
2535
  }
2553
- return fn(...args);
2536
+ return stack.length;
2554
2537
  };
2555
2538
 
2556
- const createRpc = ipc => {
2557
- const rpc = {
2558
- // @ts-ignore
2559
- ipc,
2560
- /**
2561
- * @deprecated
2562
- */
2563
- send(method, ...params) {
2564
- send(ipc, method, ...params);
2565
- },
2566
- invoke(method, ...params) {
2567
- return invoke$1(ipc, method, ...params);
2568
- },
2569
- invokeAndTransfer(method, ...params) {
2570
- return invokeAndTransfer(ipc, method, ...params);
2571
- },
2572
- async dispose() {
2573
- await ipc?.dispose();
2574
- }
2575
- };
2576
- return rpc;
2539
+ const getFeatureThemesVirtualDom = themesDom => {
2540
+ const childCount = getVirtualDomChildCount(themesDom);
2541
+ const heading = theme();
2542
+ return [{
2543
+ type: Div,
2544
+ className: FeatureContent,
2545
+ childCount: 2
2546
+ }, ...getFeatureContentHeadingVirtualDom(heading), {
2547
+ type: Div,
2548
+ className: DefaultMarkdown,
2549
+ childCount
2550
+ }, ...themesDom];
2577
2551
  };
2578
- const requiresSocket = () => {
2579
- return false;
2552
+
2553
+ const getThemeVirtualDom = state => {
2554
+ return getFeatureThemesVirtualDom(state.themesMarkdownDom);
2580
2555
  };
2581
- const preparePrettyError = error => {
2582
- return error;
2556
+
2557
+ const toWebView = rawWebView => {
2558
+ const {
2559
+ id,
2560
+ selector,
2561
+ contentSecurityPolicy,
2562
+ elements
2563
+ } = rawWebView;
2564
+ return {
2565
+ id,
2566
+ selectorString: JSON.stringify(selector),
2567
+ contentSecurityPolicyString: JSON.stringify(contentSecurityPolicy),
2568
+ elementsString: JSON.stringify(elements, null, 2)
2569
+ };
2583
2570
  };
2584
- const logError = () => {
2585
- // handled by renderer worker
2571
+
2572
+ const getWebViews = extension => {
2573
+ const rawWebViews = extension.webViews || [];
2574
+ return rawWebViews.map(toWebView);
2586
2575
  };
2587
- const handleMessage = event => {
2588
- const actualRequiresSocket = event?.target?.requiresSocket || requiresSocket;
2589
- const actualExecute = event?.target?.execute || execute;
2590
- return handleJsonRpcMessage(event.target, event.data, actualExecute, resolve, preparePrettyError, logError, actualRequiresSocket);
2576
+
2577
+ const getWebViewsDetails = async extension => {
2578
+ const webViews = getWebViews(extension);
2579
+ return {
2580
+ webViews
2581
+ };
2591
2582
  };
2592
- const handleIpc = ipc => {
2593
- if ('addEventListener' in ipc) {
2594
- ipc.addEventListener('message', handleMessage);
2595
- } else if ('on' in ipc) {
2596
- // deprecated
2597
- ipc.on('message', handleMessage);
2583
+
2584
+ const featureWebViewsEnabled = extension => {
2585
+ if (!extension || typeof extension !== 'object' || !('webViews' in extension)) {
2586
+ return false;
2598
2587
  }
2588
+ return Array.isArray(extension.webViews);
2599
2589
  };
2600
- const listen$1 = async (module, options) => {
2601
- const rawIpc = await module.listen(options);
2602
- if (module.signal) {
2603
- module.signal(rawIpc);
2604
- }
2605
- const ipc = module.wrap(rawIpc);
2606
- return ipc;
2590
+
2591
+ const heading = {
2592
+ type: H2,
2593
+ className: DefinitionListItemHeading,
2594
+ childCount: 1
2607
2595
  };
2608
- const create$5 = async ({
2609
- commandMap,
2610
- messagePort
2611
- }) => {
2612
- // TODO create a commandMap per rpc instance
2613
- register(commandMap);
2614
- const rawIpc = await IpcParentWithMessagePort$1.create({
2615
- messagePort,
2616
- isMessagePortOpen: true
2617
- });
2618
- const ipc = IpcParentWithMessagePort$1.wrap(rawIpc);
2619
- handleIpc(ipc);
2620
- const rpc = createRpc(ipc);
2621
- messagePort.start();
2622
- return rpc;
2596
+ const pre = {
2597
+ type: Pre,
2598
+ className: DefinitionListItemValue,
2599
+ childCount: 1
2623
2600
  };
2624
- const create$3 = async ({
2625
- commandMap,
2626
- send
2627
- }) => {
2628
- const {
2629
- port1,
2630
- port2
2631
- } = new MessageChannel();
2632
- await send(port1);
2633
- return create$5({
2634
- commandMap,
2635
- messagePort: port2
2636
- });
2601
+ const item = {
2602
+ type: Div,
2603
+ className: DefinitionListItem,
2604
+ childCount: 2
2637
2605
  };
2638
- const TransferMessagePortRpcParent = {
2639
- __proto__: null,
2640
- create: create$3
2606
+ const getWebViewVirtualDom = webView => {
2607
+ const {
2608
+ id,
2609
+ selectorString,
2610
+ contentSecurityPolicyString,
2611
+ elementsString
2612
+ } = webView;
2613
+ const textId = id$1();
2614
+ const textSelector = selector();
2615
+ const textContentSecurityPolicy = contentSecurityPolicy();
2616
+ const textElements = elements();
2617
+ return [{
2618
+ type: Div,
2619
+ className: FeatureWebView,
2620
+ childCount: 5
2621
+ }, item, heading, text(textId), pre, text(id), item, heading, text(textSelector), pre, text(selectorString), item, heading, text(textContentSecurityPolicy), pre, text(contentSecurityPolicyString), item, heading, text(textElements), pre, text(elementsString)];
2641
2622
  };
2642
- const create$2 = async ({
2643
- commandMap
2644
- }) => {
2645
- // TODO create a commandMap per rpc instance
2646
- register(commandMap);
2647
- const ipc = await listen$1(IpcChildWithModuleWorkerAndMessagePort$1);
2648
- handleIpc(ipc);
2649
- const rpc = createRpc(ipc);
2650
- return rpc;
2623
+
2624
+ const getFeatureWebViewsVirtualDom = webViews$1 => {
2625
+ const heading = webViews();
2626
+ return [{
2627
+ type: Div,
2628
+ className: FeatureContent,
2629
+ childCount: 2
2630
+ }, ...getFeatureContentHeadingVirtualDom(heading), {
2631
+ type: Div,
2632
+ childCount: webViews$1.length
2633
+ }, ...webViews$1.flatMap(getWebViewVirtualDom)];
2651
2634
  };
2652
- const WebWorkerRpcClient = {
2653
- __proto__: null,
2654
- create: create$2
2635
+
2636
+ const getWebViewsVirtualDom = state => {
2637
+ return getFeatureWebViewsVirtualDom(state.webViews);
2638
+ };
2639
+
2640
+ const registerAllFeatures = () => {
2641
+ register$1({
2642
+ id: Theme,
2643
+ getLabel: theme,
2644
+ isEnabled: featureThemeEnabled,
2645
+ getDetails: getThemeDetails,
2646
+ getVirtualDom: getThemeVirtualDom
2647
+ });
2648
+ register$1({
2649
+ id: Commands,
2650
+ getLabel: commands$1,
2651
+ isEnabled: featureCommandsEnabled,
2652
+ getDetails: getCommandsDetails,
2653
+ getVirtualDom: getCommandsVirtualDom
2654
+ });
2655
+ register$1({
2656
+ id: Settings,
2657
+ getLabel: settings,
2658
+ isEnabled: featureSettingsEnabled,
2659
+ getDetails: getSettingsDetails,
2660
+ getVirtualDom: getSettingsVirtualDom
2661
+ });
2662
+ register$1({
2663
+ id: JsonValidation,
2664
+ getLabel: jsonValidation,
2665
+ isEnabled: featureJsonValidationEnabled,
2666
+ getDetails: getJsonValidationDetails,
2667
+ getVirtualDom: getJsonValidationVirtualDom
2668
+ });
2669
+ register$1({
2670
+ id: ProgrammingLanguages,
2671
+ getLabel: programmingLanguages,
2672
+ isEnabled: featureProgrammingLanguagesEnabled,
2673
+ getDetails: getProgrammingLanguagesDetails,
2674
+ getVirtualDom: getProgrammingLanguagesVirtualDom
2675
+ });
2676
+ register$1({
2677
+ id: WebViews,
2678
+ getLabel: webViews,
2679
+ isEnabled: featureWebViewsEnabled,
2680
+ getDetails: getWebViewsDetails,
2681
+ getVirtualDom: getWebViewsVirtualDom
2682
+ });
2683
+ register$1({
2684
+ id: ActivationEvents,
2685
+ getLabel: activationEvents,
2686
+ isEnabled: featureActivationEventsEnabled,
2687
+ getDetails: getActivationEventsDetails,
2688
+ getVirtualDom: getActivationEventsVirtualDom
2689
+ });
2690
+ register$1({
2691
+ id: RuntimeStatus,
2692
+ getLabel: runtimeStatus,
2693
+ isEnabled: featureRuntimeStatusEnabled,
2694
+ getDetails: getRuntimeStatusDetails,
2695
+ getVirtualDom: getRuntimeStatusVirtualDom
2696
+ });
2655
2697
  };
2656
2698
 
2657
2699
  const toCommandId = key => {
@@ -2740,6 +2782,7 @@ const terminate = () => {
2740
2782
 
2741
2783
  const {
2742
2784
  disableExtension: disableExtension$1,
2785
+ enableExtension: enableExtension$1,
2743
2786
  getAllExtensions: getAllExtensions$1,
2744
2787
  getExtension: getExtension$2,
2745
2788
  openExtensionSearch: openExtensionSearch$1,
@@ -2887,7 +2930,7 @@ const isEqual$2 = (oldState, newState) => {
2887
2930
  };
2888
2931
 
2889
2932
  const isEqual$1 = (oldState, newState) => {
2890
- return oldState.activationEvents === newState.activationEvents && oldState.badge === newState.badge && oldState.categories === newState.categories && oldState.changelogVirtualDom === newState.changelogVirtualDom && oldState.commands === newState.commands && oldState.description === newState.description && oldState.detailsVirtualDom === newState.detailsVirtualDom && oldState.displaySize === newState.displaySize && oldState.extensionId === newState.extensionId && oldState.extensionVersion === newState.extensionVersion && oldState.jsonValidation === newState.jsonValidation && oldState.selectedFeature === newState.selectedFeature && oldState.selectedTab === newState.selectedTab && oldState.settings === newState.settings && oldState.themesMarkdownDom === newState.themesMarkdownDom && oldState.webViews === newState.webViews && oldState.sizeValue === newState.sizeValue && oldState.showSideBar === newState.showSideBar;
2933
+ return oldState.activationEvents === newState.activationEvents && oldState.badge === newState.badge && oldState.buttons === newState.buttons && oldState.categories === newState.categories && oldState.changelogVirtualDom === newState.changelogVirtualDom && oldState.commands === newState.commands && oldState.description === newState.description && oldState.detailsVirtualDom === newState.detailsVirtualDom && oldState.disabled === newState.disabled && oldState.displaySize === newState.displaySize && oldState.extensionId === newState.extensionId && oldState.extensionVersion === newState.extensionVersion && oldState.jsonValidation === newState.jsonValidation && oldState.selectedFeature === newState.selectedFeature && oldState.selectedTab === newState.selectedTab && oldState.settings === newState.settings && oldState.showSideBar === newState.showSideBar && oldState.sizeValue === newState.sizeValue && oldState.themesMarkdownDom === newState.themesMarkdownDom && oldState.webViews === newState.webViews;
2891
2934
  };
2892
2935
 
2893
2936
  const User = 1;
@@ -3012,13 +3055,95 @@ const disableExtension = id => {
3012
3055
  return disableExtension$1(id);
3013
3056
  };
3014
3057
 
3015
- const handleClickDisable = async state => {
3058
+ const Web = 1;
3059
+ const Electron = 2;
3060
+ const Remote = 3;
3061
+
3062
+ const getAllExtensions = async platform => {
3063
+ if (platform === Web) {
3064
+ return [];
3065
+ }
3066
+ // @ts-ignore
3067
+ return getAllExtensions$1();
3068
+ };
3069
+ const getExtension$1 = async (id, platform) => {
3070
+ // TODO only ask one extension from renderer worker instead of all
3071
+ const allExtensions = await getAllExtensions(platform);
3072
+ for (const extension of allExtensions) {
3073
+ if (extension.id === id) {
3074
+ return extension;
3075
+ }
3076
+ }
3077
+ return undefined;
3078
+ };
3079
+
3080
+ const getExtensionNew = async id => {
3081
+ return getExtension$2(id);
3082
+ };
3083
+ const getExtension = async (id, platform) => {
3084
+ try {
3085
+ return await getExtensionNew(id);
3086
+ } catch {
3087
+ return getExtension$1(id, platform);
3088
+ }
3089
+ };
3090
+
3091
+ const getExtensionDetailButtons = (hasColorTheme, isBuiltin, isDisabled) => {
3092
+ const allActions = [{
3093
+ label: setColorTheme$3(),
3094
+ onClick: HandleClickSetColorTheme,
3095
+ enabled: hasColorTheme,
3096
+ name: SetColorTheme
3097
+ }, {
3098
+ label: enable(),
3099
+ onClick: HandleClickEnable,
3100
+ enabled: isDisabled,
3101
+ name: Enable
3102
+ }, {
3103
+ label: disable(),
3104
+ onClick: HandleClickDisable,
3105
+ enabled: !isDisabled,
3106
+ name: Disable
3107
+ }, {
3108
+ label: uninstall(),
3109
+ onClick: HandleClickUninstall,
3110
+ enabled: !isBuiltin,
3111
+ name: Uninstall
3112
+ }];
3113
+ const filteredButtons = allActions.filter(button => button.enabled);
3114
+ return filteredButtons;
3115
+ };
3116
+
3117
+ const updateExtensionStatus = async (state, updateFunction) => {
3016
3118
  const {
3017
- extensionId
3119
+ extensionId,
3120
+ platform,
3121
+ hasColorTheme
3018
3122
  } = state;
3019
- await disableExtension(extensionId);
3020
- // TODO when it fails, show dialog / alert?
3021
- return state;
3123
+ const error = await updateFunction(extensionId);
3124
+ if (error) {
3125
+ await confirm(`${error}`);
3126
+ }
3127
+ const extension = await getExtension(extensionId, platform);
3128
+ const disabled = extension?.disabled;
3129
+ const buttons = getExtensionDetailButtons(hasColorTheme, false, disabled);
3130
+ return {
3131
+ ...state,
3132
+ disabled: extension?.disabled,
3133
+ buttons
3134
+ };
3135
+ };
3136
+
3137
+ const handleClickDisable = async state => {
3138
+ return updateExtensionStatus(state, disableExtension);
3139
+ };
3140
+
3141
+ const enableExtension = id => {
3142
+ return enableExtension$1(id);
3143
+ };
3144
+
3145
+ const handleClickEnable = async state => {
3146
+ return updateExtensionStatus(state, enableExtension);
3022
3147
  };
3023
3148
 
3024
3149
  const selectFeature = async (state, name) => {
@@ -3339,7 +3464,7 @@ const createExtensionHostWorkerRpc = async () => {
3339
3464
 
3340
3465
  const initializeExtensionHostWorker = async () => {
3341
3466
  const rpc = await createExtensionHostWorkerRpc();
3342
- set$5(rpc);
3467
+ set$4(rpc);
3343
3468
  };
3344
3469
 
3345
3470
  const sendMessagePortToFileSystemWorker = async port => {
@@ -3381,7 +3506,7 @@ const createMarkdownWorkerRpc = async () => {
3381
3506
 
3382
3507
  const initializeMarkdownWorker = async () => {
3383
3508
  const rpc = await createMarkdownWorkerRpc();
3384
- set$4(rpc);
3509
+ set$3(rpc);
3385
3510
  };
3386
3511
 
3387
3512
  const initialize = async () => {
@@ -3392,39 +3517,6 @@ const existsFile = async uri => {
3392
3517
  return exists(uri);
3393
3518
  };
3394
3519
 
3395
- const Web = 1;
3396
- const Electron = 2;
3397
- const Remote = 3;
3398
-
3399
- const getAllExtensions = async platform => {
3400
- if (platform === Web) {
3401
- return [];
3402
- }
3403
- // @ts-ignore
3404
- return getAllExtensions$1();
3405
- };
3406
- const getExtension$1 = async (id, platform) => {
3407
- // TODO only ask one extension from renderer worker instead of all
3408
- const allExtensions = await getAllExtensions(platform);
3409
- for (const extension of allExtensions) {
3410
- if (extension.id === id) {
3411
- return extension;
3412
- }
3413
- }
3414
- return undefined;
3415
- };
3416
-
3417
- const getExtensionNew = async id => {
3418
- return getExtension$2(id);
3419
- };
3420
- const getExtension = async (id, platform) => {
3421
- try {
3422
- return await getExtensionNew(id);
3423
- } catch {
3424
- return getExtension$1(id, platform);
3425
- }
3426
- };
3427
-
3428
3520
  class ExtensionNotFoundError extends Error {
3429
3521
  constructor(extensionId) {
3430
3522
  super(`extension not found: ${extensionId}`);
@@ -3447,31 +3539,6 @@ const getBaseUrl = (extensionPath, platform) => {
3447
3539
  }
3448
3540
  };
3449
3541
 
3450
- const getExtensionDetailButtons = (hasColorTheme, isBuiltin, isDisabled) => {
3451
- const allActions = [{
3452
- label: setColorTheme$3(),
3453
- onClick: HandleClickSetColorTheme,
3454
- enabled: hasColorTheme,
3455
- name: SetColorTheme
3456
- }, {
3457
- label: enable(),
3458
- onClick: HandleClickEnable,
3459
- enabled: isDisabled,
3460
- name: Enable
3461
- }, {
3462
- label: disable(),
3463
- onClick: HandleClickDisable,
3464
- enabled: !isDisabled,
3465
- name: Disable
3466
- }, {
3467
- label: uninstall(),
3468
- onClick: HandleClickUninstall,
3469
- enabled: !isBuiltin,
3470
- name: Uninstall
3471
- }];
3472
- return allActions;
3473
- };
3474
-
3475
3542
  const getExtensionIdFromUri = uri => {
3476
3543
  const id = uri.slice('extension-detail://'.length);
3477
3544
  return id;
@@ -3695,7 +3762,7 @@ const log10 = numberOrBigInt => {
3695
3762
  return Math.log10(numberOrBigInt);
3696
3763
  }
3697
3764
  const string = numberOrBigInt.toString(10);
3698
- return string.length + Math.log10('0.' + string.slice(0, 15));
3765
+ return string.length + Math.log10(`0.${string.slice(0, 15)}`);
3699
3766
  };
3700
3767
  const log = numberOrBigInt => {
3701
3768
  if (typeof numberOrBigInt === 'number') {
@@ -3711,6 +3778,36 @@ const divide = (numberOrBigInt, divisor) => {
3711
3778
  const remainder = numberOrBigInt % BigInt(divisor);
3712
3779
  return Number(integerPart) + Number(remainder) / divisor;
3713
3780
  };
3781
+ const applyFixedWidth = (result, fixedWidth) => {
3782
+ if (fixedWidth === undefined) {
3783
+ return result;
3784
+ }
3785
+ if (typeof fixedWidth !== 'number' || !Number.isSafeInteger(fixedWidth) || fixedWidth < 0) {
3786
+ throw new TypeError(`Expected fixedWidth to be a non-negative integer, got ${typeof fixedWidth}: ${fixedWidth}`);
3787
+ }
3788
+ if (fixedWidth === 0) {
3789
+ return result;
3790
+ }
3791
+ return result.length < fixedWidth ? result.padStart(fixedWidth, ' ') : result;
3792
+ };
3793
+ const buildLocaleOptions = options => {
3794
+ const {
3795
+ minimumFractionDigits,
3796
+ maximumFractionDigits
3797
+ } = options;
3798
+ if (minimumFractionDigits === undefined && maximumFractionDigits === undefined) {
3799
+ return undefined;
3800
+ }
3801
+ return {
3802
+ ...(minimumFractionDigits !== undefined && {
3803
+ minimumFractionDigits
3804
+ }),
3805
+ ...(maximumFractionDigits !== undefined && {
3806
+ maximumFractionDigits
3807
+ }),
3808
+ roundingMode: 'trunc'
3809
+ };
3810
+ };
3714
3811
  function prettyBytes(number, options) {
3715
3812
  if (typeof number !== 'bigint' && !Number.isFinite(number)) {
3716
3813
  throw new TypeError(`Expected a finite number, got ${typeof number}: ${number}`);
@@ -3719,43 +3816,40 @@ function prettyBytes(number, options) {
3719
3816
  bits: false,
3720
3817
  binary: false,
3721
3818
  space: true,
3819
+ nonBreakingSpace: false,
3722
3820
  ...options
3723
3821
  };
3724
3822
  const UNITS = options.bits ? options.binary ? BIBIT_UNITS : BIT_UNITS : options.binary ? BIBYTE_UNITS : BYTE_UNITS;
3725
- const separator = options.space ? ' ' : '';
3726
- if (options.signed && (typeof number === 'number' ? number === 0 : number === 0n)) {
3727
- return ` 0${separator}${UNITS[0]}`;
3823
+ const separator = options.space ? options.nonBreakingSpace ? '\u00A0' : ' ' : '';
3824
+
3825
+ // Handle signed zero case
3826
+ const isZero = typeof number === 'number' ? number === 0 : number === 0n;
3827
+ if (options.signed && isZero) {
3828
+ const result = ` 0${separator}${UNITS[0]}`;
3829
+ return applyFixedWidth(result, options.fixedWidth);
3728
3830
  }
3729
3831
  const isNegative = number < 0;
3730
3832
  const prefix = isNegative ? '-' : options.signed ? '+' : '';
3731
3833
  if (isNegative) {
3732
3834
  number = -number;
3733
3835
  }
3734
- let localeOptions;
3735
- if (options.minimumFractionDigits !== undefined) {
3736
- localeOptions = {
3737
- minimumFractionDigits: options.minimumFractionDigits
3738
- };
3739
- }
3740
- if (options.maximumFractionDigits !== undefined) {
3741
- localeOptions = {
3742
- maximumFractionDigits: options.maximumFractionDigits,
3743
- ...localeOptions
3744
- };
3745
- }
3836
+ const localeOptions = buildLocaleOptions(options);
3837
+ let result;
3746
3838
  if (number < 1) {
3747
3839
  const numberString = toLocaleString(number, options.locale, localeOptions);
3748
- return prefix + numberString + separator + UNITS[0];
3749
- }
3750
- const exponent = Math.min(Math.floor(options.binary ? log(number) / Math.log(1024) : log10(number) / 3), UNITS.length - 1);
3751
- number = divide(number, (options.binary ? 1024 : 1000) ** exponent);
3752
- if (!localeOptions) {
3753
- const minPrecision = Math.max(3, Number.parseInt(number, 10).toString().length);
3754
- number = number.toPrecision(minPrecision);
3840
+ result = prefix + numberString + separator + UNITS[0];
3841
+ } else {
3842
+ const exponent = Math.min(Math.floor(options.binary ? log(number) / Math.log(1024) : log10(number) / 3), UNITS.length - 1);
3843
+ number = divide(number, (options.binary ? 1024 : 1000) ** exponent);
3844
+ if (!localeOptions) {
3845
+ const minPrecision = Math.max(3, Math.floor(number).toString().length);
3846
+ number = number.toPrecision(minPrecision);
3847
+ }
3848
+ const numberString = toLocaleString(Number(number), options.locale, localeOptions);
3849
+ const unit = UNITS[exponent];
3850
+ result = prefix + numberString + separator + unit;
3755
3851
  }
3756
- const numberString = toLocaleString(Number(number), options.locale, localeOptions);
3757
- const unit = UNITS[exponent];
3758
- return prefix + numberString + separator + unit;
3852
+ return applyFixedWidth(result, options.fixedWidth);
3759
3853
  }
3760
3854
 
3761
3855
  const getDisplaySize = size => {
@@ -3940,7 +4034,6 @@ const loadContent = async (state, platform, savedState, isTest = false) => {
3940
4034
  const isBuiltin = extension?.isBuiltin;
3941
4035
  const disabled = extension?.disabled;
3942
4036
  const buttons = getExtensionDetailButtons(hasColorTheme, isBuiltin, disabled);
3943
- const enabledButtons = buttons.filter(button => button.enabled);
3944
4037
  const size = getViewletSize(width);
3945
4038
  const {
3946
4039
  selectedFeature,
@@ -3968,7 +4061,7 @@ const loadContent = async (state, platform, savedState, isTest = false) => {
3968
4061
  ...state,
3969
4062
  badge,
3970
4063
  baseUrl,
3971
- buttons: enabledButtons,
4064
+ buttons,
3972
4065
  categories,
3973
4066
  changelogScrollTop,
3974
4067
  description,
@@ -4630,6 +4723,7 @@ const commandMap = {
4630
4723
  'ExtensionDetail.getMenus': getMenus,
4631
4724
  'ExtensionDetail.handleClickCategory': wrapCommand(handleClickCategory),
4632
4725
  'ExtensionDetail.handleClickDisable': wrapCommand(handleClickDisable),
4726
+ 'ExtensionDetail.handleClickEnable': wrapCommand(handleClickEnable),
4633
4727
  'ExtensionDetail.handleClickScrollToTop': wrapCommand(handleClickScrollToTop),
4634
4728
  'ExtensionDetail.handleClickSetColorTheme': wrapCommand(handleClickSetColorTheme),
4635
4729
  'ExtensionDetail.handleClickSettings': wrapCommand(handleClickSettings),