refactor(extensions): align editors API naming with commands/views, add description to all contribution types (#38475)

This commit is contained in:
Michael S. Molina
2026-03-06 14:18:49 -03:00
committed by GitHub
parent 03ad1789f0
commit 5fb9e17721
9 changed files with 44 additions and 47 deletions

View File

@@ -41,7 +41,7 @@ Superset uses text editors in various places throughout the application:
| `python` | Custom Python editor contexts |
| `text` | Plain text editor contexts |
By registering an editor provider for a language, your extension replaces the default Ace editor in **all** locations that use that language.
By registering an editor for a language, your extension replaces the default Ace editor in **all** locations that use that language.
## Implementing an Editor

View File

@@ -38,7 +38,7 @@ export interface Command {
/** The icon associated with the command. */
icon?: string;
/** A description of what the command does. */
description: string;
description?: string;
}
/**

View File

@@ -513,17 +513,17 @@ export interface EditorProvider {
}
/**
* Event fired when an editor provider is registered.
* Event fired when an editor is registered.
*/
export interface EditorProviderRegisteredEvent {
/** The registered provider */
provider: EditorProvider;
export interface EditorRegisteredEvent {
/** The descriptor of the editor that was registered */
editor: Editor;
}
/**
* Event fired when an editor provider is unregistered.
* Event fired when an editor is unregistered.
*/
export interface EditorProviderUnregisteredEvent {
export interface EditorUnregisteredEvent {
/** The descriptor of the editor that was unregistered */
editor: Editor;
}
@@ -557,7 +557,7 @@ export declare function registerEditor(
* @param language The language to get an editor for
* @returns The editor provider or undefined if no extension provides one
*/
export declare function getEditorProvider(
export declare function getEditor(
language: EditorLanguage,
): EditorProvider | undefined;
@@ -567,21 +567,21 @@ export declare function getEditorProvider(
* @param language The language to check
* @returns True if an extension provides an editor for this language
*/
export declare function hasEditorProvider(language: EditorLanguage): boolean;
export declare function hasEditor(language: EditorLanguage): boolean;
/**
* Get all registered editor providers.
*
* @returns Array of all registered editor providers
*/
export declare function getAllEditorProviders(): EditorProvider[];
export declare function getAllEditors(): EditorProvider[];
/**
* Event fired when an editor provider is registered.
* Event fired when an editor is registered.
*/
export declare const onDidRegisterEditorProvider: Event<EditorProviderRegisteredEvent>;
export declare const onDidRegisterEditor: Event<EditorRegisteredEvent>;
/**
* Event fired when an editor provider is unregistered.
* Event fired when an editor is unregistered.
*/
export declare const onDidUnregisterEditorProvider: Event<EditorProviderUnregisteredEvent>;
export declare const onDidUnregisterEditor: Event<EditorUnregisteredEvent>;

View File

@@ -47,6 +47,8 @@ export interface MenuItem {
view: string;
/** The command to execute when this menu item is selected. */
command: string;
/** Optional description of the menu item, for display in contribution manifests. */
description?: string;
}
/**

View File

@@ -46,6 +46,8 @@ export interface View {
id: string;
/** The display name of the view. */
name: string;
/** Optional description of the view, for display in contribution manifests. */
description?: string;
}
/**

View File

@@ -61,7 +61,7 @@ const useEditorProvider = (language: EditorLanguage) => {
// Subscribe to provider changes
const registerDisposable = manager.onDidRegister(event => {
if (event.provider.editor.languages.includes(language)) {
if (event.editor.languages.includes(language)) {
updateProvider();
}
});

View File

@@ -204,10 +204,7 @@ test('fires onDidRegister event when provider is registered', () => {
expect(listener).toHaveBeenCalledTimes(1);
expect(listener).toHaveBeenCalledWith({
provider: {
editor,
component,
},
editor,
});
});

View File

@@ -24,8 +24,8 @@ type EditorLanguage = editors.EditorLanguage;
type EditorProvider = editors.EditorProvider;
type Editor = editors.Editor;
type EditorComponent = editors.EditorComponent;
type EditorProviderRegisteredEvent = editors.EditorProviderRegisteredEvent;
type EditorProviderUnregisteredEvent = editors.EditorProviderUnregisteredEvent;
type EditorRegisteredEvent = editors.EditorRegisteredEvent;
type EditorUnregisteredEvent = editors.EditorUnregisteredEvent;
/**
* Listener function type for events.
@@ -86,13 +86,12 @@ class EditorProviders {
/**
* Event emitter for provider registration events.
*/
private registerEmitter = new EventEmitter<EditorProviderRegisteredEvent>();
private registerEmitter = new EventEmitter<EditorRegisteredEvent>();
/**
* Event emitter for provider unregistration events.
*/
private unregisterEmitter =
new EventEmitter<EditorProviderUnregisteredEvent>();
private unregisterEmitter = new EventEmitter<EditorUnregisteredEvent>();
// eslint-disable-next-line no-useless-constructor
private constructor() {
@@ -145,7 +144,7 @@ class EditorProviders {
});
// Fire registration event
this.registerEmitter.fire({ provider });
this.registerEmitter.fire({ editor });
// Return disposable for cleanup
return new Disposable(() => {
@@ -214,9 +213,7 @@ class EditorProviders {
* @param listener The listener function.
* @returns A Disposable to unsubscribe.
*/
public onDidRegister(
listener: Listener<EditorProviderRegisteredEvent>,
): Disposable {
public onDidRegister(listener: Listener<EditorRegisteredEvent>): Disposable {
return this.registerEmitter.subscribe(listener);
}
@@ -226,7 +223,7 @@ class EditorProviders {
* @returns A Disposable to unsubscribe.
*/
public onDidUnregister(
listener: Listener<EditorProviderUnregisteredEvent>,
listener: Listener<EditorUnregisteredEvent>,
): Disposable {
return this.unregisterEmitter.subscribe(listener);
}

View File

@@ -32,9 +32,8 @@ type EditorLanguage = editorsApi.EditorLanguage;
type Editor = editorsApi.Editor;
type EditorProvider = editorsApi.EditorProvider;
type EditorComponent = editorsApi.EditorComponent;
type EditorProviderRegisteredEvent = editorsApi.EditorProviderRegisteredEvent;
type EditorProviderUnregisteredEvent =
editorsApi.EditorProviderUnregisteredEvent;
type EditorRegisteredEvent = editorsApi.EditorRegisteredEvent;
type EditorUnregisteredEvent = editorsApi.EditorUnregisteredEvent;
/**
* Register an editor provider as a module-level side effect.
@@ -60,7 +59,7 @@ export const registerEditor = (
* @param language The language to get an editor for
* @returns The editor provider or undefined if no extension provides one
*/
export const getEditorProvider = (
export const getEditor = (
language: EditorLanguage,
): EditorProvider | undefined => {
const manager = EditorProviders.getInstance();
@@ -73,7 +72,7 @@ export const getEditorProvider = (
* @param language The language to check
* @returns True if an extension provides an editor for this language
*/
export const hasEditorProvider = (language: EditorLanguage): boolean => {
export const hasEditor = (language: EditorLanguage): boolean => {
const manager = EditorProviders.getInstance();
return manager.hasProvider(language);
};
@@ -83,28 +82,28 @@ export const hasEditorProvider = (language: EditorLanguage): boolean => {
*
* @returns Array of all registered editor providers
*/
export const getAllEditorProviders = (): EditorProvider[] => {
export const getAllEditors = (): EditorProvider[] => {
const manager = EditorProviders.getInstance();
return manager.getAllProviders();
};
/**
* Event fired when an editor provider is registered.
* Event fired when an editor is registered.
* Subscribe to this event to react when extensions register new editors.
*/
export const onDidRegisterEditorProvider = (
listener: (e: EditorProviderRegisteredEvent) => void,
export const onDidRegisterEditor = (
listener: (e: EditorRegisteredEvent) => void,
): Disposable => {
const manager = EditorProviders.getInstance();
return manager.onDidRegister(listener);
};
/**
* Event fired when an editor provider is unregistered.
* Event fired when an editor is unregistered.
* Subscribe to this event to react when extensions unregister editors.
*/
export const onDidUnregisterEditorProvider = (
listener: (e: EditorProviderUnregisteredEvent) => void,
export const onDidUnregisterEditor = (
listener: (e: EditorUnregisteredEvent) => void,
): Disposable => {
const manager = EditorProviders.getInstance();
return manager.onDidUnregister(listener);
@@ -115,11 +114,11 @@ export const onDidUnregisterEditorProvider = (
*/
export const editors: typeof editorsApi = {
registerEditor,
getEditorProvider,
hasEditorProvider,
getAllEditorProviders,
onDidRegisterEditorProvider,
onDidUnregisterEditorProvider,
getEditor,
hasEditor,
getAllEditors,
onDidRegisterEditor,
onDidUnregisterEditor,
};
export { EditorProviders };