@lvce-editor/api 9.23.0 → 9.25.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.
Files changed (19) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/index.js +1 -0
  3. package/dist/parts/EditorGutterDecoration/EditorGutterDecoration.d.ts +5 -0
  4. package/dist/parts/EditorGutterDecoration/EditorGutterDecoration.js +1 -0
  5. package/dist/parts/EditorGutterDecorationApi/EditorGutterDecorationApi.d.ts +5 -0
  6. package/dist/parts/EditorGutterDecorationApi/EditorGutterDecorationApi.js +2 -0
  7. package/dist/parts/EditorGutterDecorationProvider/EditorGutterDecorationProvider.d.ts +6 -0
  8. package/dist/parts/EditorGutterDecorationProvider/EditorGutterDecorationProvider.js +1 -0
  9. package/dist/parts/EditorGutterDecorationProviderRegistry/EditorGutterDecorationProviderRegistry.d.ts +7 -0
  10. package/dist/parts/EditorGutterDecorationProviderRegistry/EditorGutterDecorationProviderRegistry.js +52 -0
  11. package/dist/parts/EditorGutterDecorationTextDocument/EditorGutterDecorationTextDocument.d.ts +5 -0
  12. package/dist/parts/EditorGutterDecorationTextDocument/EditorGutterDecorationTextDocument.js +1 -0
  13. package/dist/parts/RefreshEditorGutterDecorations/RefreshEditorGutterDecorations.d.ts +1 -0
  14. package/dist/parts/RefreshEditorGutterDecorations/RefreshEditorGutterDecorations.js +4 -0
  15. package/dist/parts/RegisteredEditorGutterDecorationProvider/RegisteredEditorGutterDecorationProvider.d.ts +6 -0
  16. package/dist/parts/RegisteredEditorGutterDecorationProvider/RegisteredEditorGutterDecorationProvider.js +1 -0
  17. package/dist/parts/Rpc/Rpc.d.ts +0 -2
  18. package/dist/parts/Rpc/Rpc.js +2 -42
  19. package/package.json +1 -1
package/dist/index.d.ts CHANGED
@@ -8,6 +8,7 @@ export { deleteSecret, getSecret, storeSecret } from './parts/SecretStorage/Secr
8
8
  export { registerCommand } from './parts/CommandRegistry/CommandRegistry.ts';
9
9
  export { registerDebugProvider, resetDebugProviderRegistry } from './parts/Debug/Debug.ts';
10
10
  export { formatDocument, getDiagnostics, getEditorSelections, setEditorSelections, showCompletions, type EditorSelection, } from './parts/Editor/Editor.ts';
11
+ export { executeEditorGutterDecorationProvider, refreshEditorGutterDecorations, registerEditorGutterDecorationProvider, resetEditorGutterDecorationProviderRegistry, type EditorGutterDecoration, type EditorGutterDecorationProvider, type EditorGutterDecorationTextDocument, type EditorGutterDecorationType, } from './parts/EditorGutterDecorationApi/EditorGutterDecorationApi.ts';
11
12
  export { executeEditorLineDecorationProvider, registerEditorLineDecorationProvider, resetEditorLineDecorationProviderRegistry, type EditorLineDecoration, type EditorLineDecorationProvider, type EditorLineDecorationTextDocument, } from './parts/EditorLineDecorationApi/EditorLineDecorationApi.ts';
12
13
  export { executeCompletionProvider, executeResolveCompletionItemProvider, getCompletionProviderRegistrySnapshot, registerCompletionProvider, resetCompletionProviderRegistry, } from './parts/Completion/Completion.ts';
13
14
  export { executeDiagnosticProvider, getDiagnosticProviderRegistrySnapshot, registerDiagnosticProvider, resetDiagnosticProviderRegistry, } from './parts/Diagnostic/Diagnostic.ts';
package/dist/index.js CHANGED
@@ -8,6 +8,7 @@ export { deleteSecret, getSecret, storeSecret } from "./parts/SecretStorage/Secr
8
8
  export { registerCommand } from "./parts/CommandRegistry/CommandRegistry.js";
9
9
  export { registerDebugProvider, resetDebugProviderRegistry } from "./parts/Debug/Debug.js";
10
10
  export { formatDocument, getDiagnostics, getEditorSelections, setEditorSelections, showCompletions, } from "./parts/Editor/Editor.js";
11
+ export { executeEditorGutterDecorationProvider, refreshEditorGutterDecorations, registerEditorGutterDecorationProvider, resetEditorGutterDecorationProviderRegistry, } from "./parts/EditorGutterDecorationApi/EditorGutterDecorationApi.js";
11
12
  export { executeEditorLineDecorationProvider, registerEditorLineDecorationProvider, resetEditorLineDecorationProviderRegistry, } from "./parts/EditorLineDecorationApi/EditorLineDecorationApi.js";
12
13
  export { executeCompletionProvider, executeResolveCompletionItemProvider, getCompletionProviderRegistrySnapshot, registerCompletionProvider, resetCompletionProviderRegistry, } from "./parts/Completion/Completion.js";
13
14
  export { executeDiagnosticProvider, getDiagnosticProviderRegistrySnapshot, registerDiagnosticProvider, resetDiagnosticProviderRegistry, } from "./parts/Diagnostic/Diagnostic.js";
@@ -0,0 +1,5 @@
1
+ export type EditorGutterDecorationType = 'added' | 'deleted' | 'modified';
2
+ export interface EditorGutterDecoration {
3
+ readonly rowIndex: number;
4
+ readonly type: EditorGutterDecorationType;
5
+ }
@@ -0,0 +1,5 @@
1
+ export { executeEditorGutterDecorationProvider, registerEditorGutterDecorationProvider, resetEditorGutterDecorationProviderRegistry, } from '../EditorGutterDecorationProviderRegistry/EditorGutterDecorationProviderRegistry.ts';
2
+ export type { EditorGutterDecoration, EditorGutterDecorationType } from '../EditorGutterDecoration/EditorGutterDecoration.ts';
3
+ export type { EditorGutterDecorationProvider } from '../EditorGutterDecorationProvider/EditorGutterDecorationProvider.ts';
4
+ export type { EditorGutterDecorationTextDocument } from '../EditorGutterDecorationTextDocument/EditorGutterDecorationTextDocument.ts';
5
+ export { refreshEditorGutterDecorations } from '../RefreshEditorGutterDecorations/RefreshEditorGutterDecorations.ts';
@@ -0,0 +1,2 @@
1
+ export { executeEditorGutterDecorationProvider, registerEditorGutterDecorationProvider, resetEditorGutterDecorationProviderRegistry, } from "../EditorGutterDecorationProviderRegistry/EditorGutterDecorationProviderRegistry.js";
2
+ export { refreshEditorGutterDecorations } from "../RefreshEditorGutterDecorations/RefreshEditorGutterDecorations.js";
@@ -0,0 +1,6 @@
1
+ import type { EditorGutterDecoration } from '../EditorGutterDecoration/EditorGutterDecoration.ts';
2
+ import type { EditorGutterDecorationTextDocument } from '../EditorGutterDecorationTextDocument/EditorGutterDecorationTextDocument.ts';
3
+ export interface EditorGutterDecorationProvider {
4
+ readonly id: string;
5
+ readonly provideEditorGutterDecorations: (textDocument: EditorGutterDecorationTextDocument) => readonly EditorGutterDecoration[] | Promise<readonly EditorGutterDecoration[]>;
6
+ }
@@ -0,0 +1,7 @@
1
+ import type { Disposable } from '../Disposable/Disposable.ts';
2
+ import type { EditorGutterDecoration } from '../EditorGutterDecoration/EditorGutterDecoration.ts';
3
+ import type { EditorGutterDecorationProvider } from '../EditorGutterDecorationProvider/EditorGutterDecorationProvider.ts';
4
+ import type { EditorGutterDecorationTextDocument } from '../EditorGutterDecorationTextDocument/EditorGutterDecorationTextDocument.ts';
5
+ export declare const registerEditorGutterDecorationProvider: (provider: EditorGutterDecorationProvider) => Disposable;
6
+ export declare const executeEditorGutterDecorationProvider: (textDocument: EditorGutterDecorationTextDocument) => Promise<readonly EditorGutterDecoration[]>;
7
+ export declare const resetEditorGutterDecorationProviderRegistry: () => void;
@@ -0,0 +1,52 @@
1
+ import * as ExtensionApiCommandRegistry from "../ExtensionApiCommandRegistry/ExtensionApiCommandRegistry.js";
2
+ import { ExtensionApiError } from "../ExtensionApiError/ExtensionApiError.js";
3
+ import { createProviderRegistry } from "../ProviderRegistry/ProviderRegistry.js";
4
+ const validTypes = new Set(['added', 'deleted', 'modified']);
5
+ const validateEditorGutterDecoration = (decoration) => {
6
+ if (!decoration || typeof decoration !== 'object' || Array.isArray(decoration)) {
7
+ throw new ExtensionApiError('invalid editor gutter decoration result: decoration must be an object');
8
+ }
9
+ const { rowIndex, type } = decoration;
10
+ if (!Number.isSafeInteger(rowIndex) || rowIndex < 0) {
11
+ throw new ExtensionApiError('invalid editor gutter decoration result: decoration rowIndex must be a non-negative integer');
12
+ }
13
+ if (typeof type !== 'string' || !validTypes.has(type)) {
14
+ throw new ExtensionApiError('invalid editor gutter decoration result: decoration type must be added, deleted, or modified');
15
+ }
16
+ return { rowIndex: rowIndex, type: type };
17
+ };
18
+ const validateEditorGutterDecorations = (decorations) => {
19
+ if (!Array.isArray(decorations)) {
20
+ throw new ExtensionApiError('invalid editor gutter decoration result: decorations must be an array');
21
+ }
22
+ return decorations.map(validateEditorGutterDecoration);
23
+ };
24
+ const registry = createProviderRegistry({
25
+ mapProvider(provider) {
26
+ return {
27
+ id: provider.id,
28
+ provideEditorGutterDecorations(textDocument) {
29
+ return provider.provideEditorGutterDecorations(textDocument);
30
+ },
31
+ };
32
+ },
33
+ providerName: 'editor gutter decoration provider',
34
+ requiredMethods: ['provideEditorGutterDecorations'],
35
+ });
36
+ export const registerEditorGutterDecorationProvider = (provider) => {
37
+ const registeredProvider = registry.registerProvider(provider);
38
+ ExtensionApiCommandRegistry.registerCommandMap(commandMap);
39
+ return {
40
+ dispose() {
41
+ registry.deleteProvider(registeredProvider.id);
42
+ },
43
+ };
44
+ };
45
+ export const executeEditorGutterDecorationProvider = async (textDocument) => {
46
+ const results = await Promise.all(registry.getProviders().map(async (provider) => provider.provideEditorGutterDecorations(textDocument)));
47
+ return results.flatMap(validateEditorGutterDecorations);
48
+ };
49
+ const commandMap = {
50
+ 'ExtensionApi.executeEditorGutterDecorationProvider': executeEditorGutterDecorationProvider,
51
+ };
52
+ export const resetEditorGutterDecorationProviderRegistry = registry.reset;
@@ -0,0 +1,5 @@
1
+ export interface EditorGutterDecorationTextDocument {
2
+ readonly languageId: string;
3
+ readonly text: string;
4
+ readonly uri: string;
5
+ }
@@ -0,0 +1 @@
1
+ export declare const refreshEditorGutterDecorations: () => Promise<void>;
@@ -0,0 +1,4 @@
1
+ import { executeCommand } from "../ExecuteCommand/ExecuteCommand.js";
2
+ export const refreshEditorGutterDecorations = async () => {
3
+ await executeCommand('Editor.refreshGutterDecorationsAll');
4
+ };
@@ -0,0 +1,6 @@
1
+ import type { EditorGutterDecoration } from '../EditorGutterDecoration/EditorGutterDecoration.ts';
2
+ import type { EditorGutterDecorationTextDocument } from '../EditorGutterDecorationTextDocument/EditorGutterDecorationTextDocument.ts';
3
+ export interface RegisteredEditorGutterDecorationProvider {
4
+ readonly id: string;
5
+ readonly provideEditorGutterDecorations: (textDocument: EditorGutterDecorationTextDocument) => readonly EditorGutterDecoration[] | Promise<readonly EditorGutterDecoration[]>;
6
+ }
@@ -13,8 +13,6 @@ interface CreateLegacyRpcOptions extends CreateRpcBaseOptions {
13
13
  export type CreateRpcOptions = CreateDeclaredRpcOptions | CreateLegacyRpcOptions;
14
14
  export interface CreateNodeRpcOptions {
15
15
  readonly id: string;
16
- readonly legacyName?: string;
17
- readonly legacyPath?: string;
18
16
  }
19
17
  export declare const createRpc: (options: CreateRpcOptions) => Promise<Rpc>;
20
18
  export declare const createNodeRpc: (options: CreateNodeRpcOptions) => Promise<Rpc>;
@@ -38,45 +38,11 @@ export const createRpc = async (options) => {
38
38
  const { contentSecurityPolicy, name, traceId, url } = await resolveRpcOptions(options);
39
39
  return createMessagePortRpc(commandMap, (port) => sendMessagePortToWebWorker(port, contentSecurityPolicy, name, traceId, url));
40
40
  };
41
- const isMissingCommand = (error, command) => {
42
- return error instanceof Error && error.message.includes(command) && /command not found|not found/i.test(error.message);
43
- };
44
- const getNodeRpcConnection = async ({ id, legacyName = '', legacyPath }) => {
41
+ const getNodeRpcConnection = async ({ id }) => {
45
42
  if (!id) {
46
43
  throw new TypeError('createNodeRpc requires an id');
47
44
  }
48
- try {
49
- const connectionInfo = (await ExtensionManagementWorker.invoke('Extensions.createNodeRpcConnection', id));
50
- return connectionInfo;
51
- }
52
- catch (error) {
53
- if (!isMissingCommand(error, 'Extensions.createNodeRpcConnection')) {
54
- throw error;
55
- }
56
- if (legacyPath) {
57
- return { name: legacyName, path: legacyPath, type: 'old-legacy-proxy' };
58
- }
59
- const { name, path } = (await ExtensionManagementWorker.invoke('Extensions.getNodeRpcInfo', id));
60
- return { name, path, type: 'old-legacy-proxy' };
61
- }
62
- };
63
- const createProxyRpc = (invoke, dispose) => {
64
- return {
65
- dispose,
66
- invoke,
67
- invokeAndTransfer: invoke,
68
- send(method, ...params) {
69
- void invoke(method, ...params);
70
- },
71
- };
72
- };
73
- const createLegacyProxyRpc = async (id) => {
74
- const rpcId = await ExtensionManagementWorker.invoke('Extensions.createLegacyNodeRpc', id);
75
- return createProxyRpc((method, ...params) => ExtensionManagementWorker.invoke('Extensions.invokeLegacyNodeRpc', rpcId, method, ...params), () => ExtensionManagementWorker.invoke('Extensions.disposeLegacyNodeRpc', rpcId));
76
- };
77
- const createOldLegacyProxyRpc = async (name, path) => {
78
- const rpcId = await ExtensionManagementWorker.invoke('Extensions.executeCommand', 'ExtensionNodeRpc.create', name, path);
79
- return createProxyRpc((method, ...params) => ExtensionManagementWorker.invoke('Extensions.executeCommand', 'ExtensionNodeRpc.invoke', rpcId, method, ...params), () => ExtensionManagementWorker.invoke('Extensions.executeCommand', 'ExtensionNodeRpc.dispose', rpcId));
45
+ return ExtensionManagementWorker.invoke('Extensions.createNodeRpcConnection', id);
80
46
  };
81
47
  export const createNodeRpc = async (options) => {
82
48
  const { id } = options;
@@ -84,12 +50,6 @@ export const createNodeRpc = async (options) => {
84
50
  if (connectionInfo.type === 'message-port') {
85
51
  return createMessagePortRpc({}, (port) => ExtensionManagementWorker.invokeAndTransfer('Extensions.createNodeRpcMessagePort', id, port));
86
52
  }
87
- if (connectionInfo.type === 'legacy-proxy') {
88
- return createLegacyProxyRpc(id);
89
- }
90
- if (connectionInfo.type === 'old-legacy-proxy') {
91
- return createOldLegacyProxyRpc(connectionInfo.name, connectionInfo.path);
92
- }
93
53
  const { protocols, url } = connectionInfo;
94
54
  const webSocket = new WebSocket(url, protocols);
95
55
  return WebSocketRpcParent.create({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvce-editor/api",
3
- "version": "9.23.0",
3
+ "version": "9.25.0",
4
4
  "description": "Tree-shakeable extension API for Lvce Editor extensions.",
5
5
  "keywords": [
6
6
  "lvce-editor",