From 5fb9e17721d6987c6fab994141948be15ceb4149 Mon Sep 17 00:00:00 2001 From: "Michael S. Molina" <70410625+michael-s-molina@users.noreply.github.com> Date: Fri, 6 Mar 2026 14:18:49 -0300 Subject: [PATCH] refactor(extensions): align editors API naming with commands/views, add description to all contribution types (#38475) --- .../extensions/extension-points/editors.md | 2 +- .../superset-core/src/commands/index.ts | 2 +- .../superset-core/src/editors/index.ts | 26 +++++++-------- .../packages/superset-core/src/menus/index.ts | 2 ++ .../packages/superset-core/src/views/index.ts | 2 ++ .../src/core/editors/EditorHost.tsx | 2 +- .../src/core/editors/EditorProviders.test.ts | 5 +-- .../src/core/editors/EditorProviders.ts | 17 ++++------ superset-frontend/src/core/editors/index.ts | 33 +++++++++---------- 9 files changed, 44 insertions(+), 47 deletions(-) diff --git a/docs/developer_docs/extensions/extension-points/editors.md b/docs/developer_docs/extensions/extension-points/editors.md index 1a0ff2d4c81..7eec293d8bd 100644 --- a/docs/developer_docs/extensions/extension-points/editors.md +++ b/docs/developer_docs/extensions/extension-points/editors.md @@ -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 diff --git a/superset-frontend/packages/superset-core/src/commands/index.ts b/superset-frontend/packages/superset-core/src/commands/index.ts index 5873e7eec7c..ea758f8532d 100644 --- a/superset-frontend/packages/superset-core/src/commands/index.ts +++ b/superset-frontend/packages/superset-core/src/commands/index.ts @@ -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; } /** diff --git a/superset-frontend/packages/superset-core/src/editors/index.ts b/superset-frontend/packages/superset-core/src/editors/index.ts index 39c8178fee5..a1ed3ed9653 100644 --- a/superset-frontend/packages/superset-core/src/editors/index.ts +++ b/superset-frontend/packages/superset-core/src/editors/index.ts @@ -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; +export declare const onDidRegisterEditor: Event; /** - * Event fired when an editor provider is unregistered. + * Event fired when an editor is unregistered. */ -export declare const onDidUnregisterEditorProvider: Event; +export declare const onDidUnregisterEditor: Event; diff --git a/superset-frontend/packages/superset-core/src/menus/index.ts b/superset-frontend/packages/superset-core/src/menus/index.ts index 1614d840f9e..a7c7c504cef 100644 --- a/superset-frontend/packages/superset-core/src/menus/index.ts +++ b/superset-frontend/packages/superset-core/src/menus/index.ts @@ -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; } /** diff --git a/superset-frontend/packages/superset-core/src/views/index.ts b/superset-frontend/packages/superset-core/src/views/index.ts index a79098fb12a..99c8ad09eb2 100644 --- a/superset-frontend/packages/superset-core/src/views/index.ts +++ b/superset-frontend/packages/superset-core/src/views/index.ts @@ -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; } /** diff --git a/superset-frontend/src/core/editors/EditorHost.tsx b/superset-frontend/src/core/editors/EditorHost.tsx index 11b9ccab1b3..80c3ba1a138 100644 --- a/superset-frontend/src/core/editors/EditorHost.tsx +++ b/superset-frontend/src/core/editors/EditorHost.tsx @@ -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(); } }); diff --git a/superset-frontend/src/core/editors/EditorProviders.test.ts b/superset-frontend/src/core/editors/EditorProviders.test.ts index b67fdcd874c..c3d0580ef18 100644 --- a/superset-frontend/src/core/editors/EditorProviders.test.ts +++ b/superset-frontend/src/core/editors/EditorProviders.test.ts @@ -204,10 +204,7 @@ test('fires onDidRegister event when provider is registered', () => { expect(listener).toHaveBeenCalledTimes(1); expect(listener).toHaveBeenCalledWith({ - provider: { - editor, - component, - }, + editor, }); }); diff --git a/superset-frontend/src/core/editors/EditorProviders.ts b/superset-frontend/src/core/editors/EditorProviders.ts index d5bbdf973a4..81e35268e41 100644 --- a/superset-frontend/src/core/editors/EditorProviders.ts +++ b/superset-frontend/src/core/editors/EditorProviders.ts @@ -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(); + private registerEmitter = new EventEmitter(); /** * Event emitter for provider unregistration events. */ - private unregisterEmitter = - new EventEmitter(); + private unregisterEmitter = new EventEmitter(); // 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, - ): Disposable { + public onDidRegister(listener: Listener): Disposable { return this.registerEmitter.subscribe(listener); } @@ -226,7 +223,7 @@ class EditorProviders { * @returns A Disposable to unsubscribe. */ public onDidUnregister( - listener: Listener, + listener: Listener, ): Disposable { return this.unregisterEmitter.subscribe(listener); } diff --git a/superset-frontend/src/core/editors/index.ts b/superset-frontend/src/core/editors/index.ts index f7fe4caa03c..641fad56e8f 100644 --- a/superset-frontend/src/core/editors/index.ts +++ b/superset-frontend/src/core/editors/index.ts @@ -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 };