@lvce-editor/api 9.15.0 → 9.16.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -11,7 +11,7 @@ export { formatDocument, getDiagnostics, getEditorSelections, setEditorSelection
11
11
  export { executeCompletionProvider, executeResolveCompletionItemProvider, getCompletionProviderRegistrySnapshot, registerCompletionProvider, resetCompletionProviderRegistry, } from './parts/Completion/Completion.ts';
12
12
  export { executeDiagnosticProvider, getDiagnosticProviderRegistrySnapshot, registerDiagnosticProvider, resetDiagnosticProviderRegistry, } from './parts/Diagnostic/Diagnostic.ts';
13
13
  export { executeFormattingProvider, getFormattingProviderRegistrySnapshot, registerFormattingProvider, resetFormattingProviderRegistry, } from './parts/Formatting/Formatting.ts';
14
- export { exists, getFileHash, mkdir, readAsObjectUrl, readDirWithFileTypes, readFile, readFileAsBlob, remove, stat, writeFile, type ReadAsObjectUrlResult, } from './parts/FileSystem/FileSystem.ts';
14
+ export { exists, getFileHash, getFileHashes, mkdir, readAsObjectUrl, readDirWithFileTypes, readFile, readFileAsBlob, remove, stat, writeFile, type ReadAsObjectUrlResult, } from './parts/FileSystem/FileSystem.ts';
15
15
  export { registerFileChangeHandler, type FileChangeHandler, type FileChanges } from './parts/FileChangeHandler/FileChangeHandler.ts';
16
16
  export { executeFileSystemProviderGetPathSeparator, executeFileSystemProviderIsReadonly, executeFileSystemProviderMkdir, executeFileSystemProviderReadDirWithFileTypes, executeFileSystemProviderReadFile, executeFileSystemProviderRemove, executeFileSystemProviderRename, executeFileSystemProviderWriteFile, getFileSystemProviderRegistrySnapshot, registerFileSystemProvider, resetFileSystemProviderRegistry, } from './parts/FileSystemProviderRegistry/FileSystemProviderRegistry.ts';
17
17
  export { closeUri, confirm, getRecentlyOpenedWorkspaceUris, getWorkspaceFolder, getWorkspaceUri, handleWorkspaceRefresh, openUri, setWorkspaceUri, showNotification, type NotificationType, } from './parts/Host/Host.ts';
package/dist/index.js CHANGED
@@ -11,7 +11,7 @@ export { formatDocument, getDiagnostics, getEditorSelections, setEditorSelection
11
11
  export { executeCompletionProvider, executeResolveCompletionItemProvider, getCompletionProviderRegistrySnapshot, registerCompletionProvider, resetCompletionProviderRegistry, } from "./parts/Completion/Completion.js";
12
12
  export { executeDiagnosticProvider, getDiagnosticProviderRegistrySnapshot, registerDiagnosticProvider, resetDiagnosticProviderRegistry, } from "./parts/Diagnostic/Diagnostic.js";
13
13
  export { executeFormattingProvider, getFormattingProviderRegistrySnapshot, registerFormattingProvider, resetFormattingProviderRegistry, } from "./parts/Formatting/Formatting.js";
14
- export { exists, getFileHash, mkdir, readAsObjectUrl, readDirWithFileTypes, readFile, readFileAsBlob, remove, stat, writeFile, } from "./parts/FileSystem/FileSystem.js";
14
+ export { exists, getFileHash, getFileHashes, mkdir, readAsObjectUrl, readDirWithFileTypes, readFile, readFileAsBlob, remove, stat, writeFile, } from "./parts/FileSystem/FileSystem.js";
15
15
  export { registerFileChangeHandler } from "./parts/FileChangeHandler/FileChangeHandler.js";
16
16
  export { executeFileSystemProviderGetPathSeparator, executeFileSystemProviderIsReadonly, executeFileSystemProviderMkdir, executeFileSystemProviderReadDirWithFileTypes, executeFileSystemProviderReadFile, executeFileSystemProviderRemove, executeFileSystemProviderRename, executeFileSystemProviderWriteFile, getFileSystemProviderRegistrySnapshot, registerFileSystemProvider, resetFileSystemProviderRegistry, } from "./parts/FileSystemProviderRegistry/FileSystemProviderRegistry.js";
17
17
  export { closeUri, confirm, getRecentlyOpenedWorkspaceUris, getWorkspaceFolder, getWorkspaceUri, handleWorkspaceRefresh, openUri, setWorkspaceUri, showNotification, } from "./parts/Host/Host.js";
@@ -7,6 +7,7 @@ export interface ReadAsObjectUrlResult {
7
7
  export declare const exists: (uri: string) => Promise<boolean>;
8
8
  export declare const readDirWithFileTypes: (uri: string) => Promise<readonly FileSystemDirent[]>;
9
9
  export declare const getFileHash: (uri: string) => Promise<string>;
10
+ export declare const getFileHashes: (uris: readonly string[]) => Promise<readonly (string | null)[]>;
10
11
  export declare const readFile: (uri: string) => Promise<string>;
11
12
  export declare const readFileAsBlob: (uri: string) => Promise<Blob>;
12
13
  export declare const readAsObjectUrl: (uri: string) => Promise<ReadAsObjectUrlResult>;
@@ -38,6 +38,9 @@ export const readDirWithFileTypes = async (uri) => {
38
38
  export const getFileHash = async (uri) => {
39
39
  return FileSystemWorker.invoke('FileSystem.getFileHash', uri);
40
40
  };
41
+ export const getFileHashes = async (uris) => {
42
+ return FileSystemWorker.invoke('FileSystem.getFileHashes', uris);
43
+ };
41
44
  export const readFile = async (uri) => {
42
45
  if (isMemory(uri)) {
43
46
  return ExtensionManagementWorker.invoke('ExtensionApi.readFile', uri);
@@ -1,7 +1,10 @@
1
1
  import { ExtensionApiError } from "../ExtensionApiError/ExtensionApiError.js";
2
2
  import { registerStatusBarItemProvider } from "../StatusBarItemProviderRegistry/StatusBarItemProviderRegistry.js";
3
- const handlesByUid = Object.create(null);
3
+ const activeUidByViewId = Object.create(null);
4
+ const handlesByViewId = Object.create(null);
4
5
  const itemsByUid = Object.create(null);
6
+ const renderedUidsByViewId = Object.create(null);
7
+ const viewIdByUid = Object.create(null);
5
8
  const stringProperties = ['ariaLabel', 'icon', 'name', 'onClick', 'text', 'title'];
6
9
  const normalizeStatusBarItem = (item, index) => {
7
10
  if (!item || typeof item !== 'object' || Array.isArray(item)) {
@@ -47,44 +50,91 @@ const areItemsEqual = (oldItems, newItems) => {
47
50
  oldItem.title === newItem.title);
48
51
  });
49
52
  };
50
- const disposeHandles = (uid) => {
51
- for (const handle of handlesByUid[uid] || []) {
53
+ const disposeHandles = (viewId) => {
54
+ for (const handle of handlesByViewId[viewId] || []) {
52
55
  handle.dispose();
53
56
  }
54
- delete handlesByUid[uid];
57
+ delete handlesByViewId[viewId];
55
58
  };
56
- const replaceItems = (uid, viewId, items) => {
57
- disposeHandles(uid);
58
- itemsByUid[uid] = items;
59
- handlesByUid[uid] = items.map((_item, index) => registerStatusBarItemProvider({
59
+ const replaceItems = (viewId, itemCount) => {
60
+ disposeHandles(viewId);
61
+ handlesByViewId[viewId] = Array.from({ length: itemCount }, (_item, index) => registerStatusBarItemProvider({
60
62
  getStatusBarItem() {
61
- return itemsByUid[uid]?.[index];
63
+ return itemsByUid[activeUidByViewId[viewId]]?.[index];
62
64
  },
63
- id: `view:${viewId}:${uid}:${index}`,
65
+ id: `view:${viewId}:${index}`,
64
66
  }));
65
67
  };
68
+ const refreshItems = async (viewId) => {
69
+ await Promise.all((handlesByViewId[viewId] || []).map((handle) => handle.refresh()));
70
+ };
71
+ const setActiveUid = (viewId, uid) => {
72
+ const renderedUids = renderedUidsByViewId[viewId] || [];
73
+ const index = renderedUids.indexOf(uid);
74
+ if (index !== -1) {
75
+ renderedUids.splice(index, 1);
76
+ }
77
+ renderedUids.push(uid);
78
+ renderedUidsByViewId[viewId] = renderedUids;
79
+ activeUidByViewId[viewId] = uid;
80
+ };
66
81
  export const renderViewStatusBarItems = async (uid, viewId, instance) => {
67
82
  if (typeof instance.renderStatusBarItems !== 'function') {
68
83
  return;
69
84
  }
70
85
  const items = normalizeStatusBarItems(await instance.renderStatusBarItems());
71
86
  const oldItems = itemsByUid[uid] || [];
72
- if (areItemsEqual(oldItems, items)) {
87
+ const wasActive = activeUidByViewId[viewId] === uid;
88
+ itemsByUid[uid] = items;
89
+ viewIdByUid[uid] = viewId;
90
+ setActiveUid(viewId, uid);
91
+ if (wasActive && areItemsEqual(oldItems, items)) {
73
92
  return;
74
93
  }
75
- if ((handlesByUid[uid]?.length || 0) !== items.length) {
76
- replaceItems(uid, viewId, items);
94
+ if ((handlesByViewId[viewId]?.length || 0) !== items.length) {
95
+ replaceItems(viewId, items.length);
77
96
  return;
78
97
  }
79
- itemsByUid[uid] = items;
80
- await Promise.all((handlesByUid[uid] || []).map((handle) => handle.refresh()));
98
+ await refreshItems(viewId);
81
99
  };
82
100
  export const disposeViewStatusBarItems = (uid) => {
83
- disposeHandles(uid);
101
+ const viewId = viewIdByUid[uid];
102
+ if (!viewId) {
103
+ return;
104
+ }
84
105
  delete itemsByUid[uid];
106
+ delete viewIdByUid[uid];
107
+ const renderedUids = renderedUidsByViewId[viewId] || [];
108
+ const remainingUids = renderedUids.filter((renderedUid) => renderedUid !== uid);
109
+ if (remainingUids.length === 0) {
110
+ disposeHandles(viewId);
111
+ delete activeUidByViewId[viewId];
112
+ delete renderedUidsByViewId[viewId];
113
+ return;
114
+ }
115
+ renderedUidsByViewId[viewId] = remainingUids;
116
+ if (activeUidByViewId[viewId] !== uid) {
117
+ return;
118
+ }
119
+ const activeUid = remainingUids.at(-1);
120
+ const items = itemsByUid[activeUid] || [];
121
+ activeUidByViewId[viewId] = activeUid;
122
+ if ((handlesByViewId[viewId]?.length || 0) !== items.length) {
123
+ replaceItems(viewId, items.length);
124
+ return;
125
+ }
126
+ void refreshItems(viewId);
85
127
  };
86
128
  export const resetViewStatusBarItems = () => {
129
+ for (const viewId of Object.keys(handlesByViewId)) {
130
+ disposeHandles(viewId);
131
+ }
87
132
  for (const uid of Object.keys(itemsByUid)) {
88
- disposeViewStatusBarItems(Number(uid));
133
+ delete itemsByUid[Number(uid)];
134
+ delete viewIdByUid[Number(uid)];
135
+ }
136
+ for (const viewId of Object.keys(activeUidByViewId)) {
137
+ delete activeUidByViewId[viewId];
138
+ delete renderedUidsByViewId[viewId];
89
139
  }
90
140
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvce-editor/api",
3
- "version": "9.15.0",
3
+ "version": "9.16.1",
4
4
  "description": "Tree-shakeable extension API for Lvce Editor extensions.",
5
5
  "keywords": [
6
6
  "lvce-editor",