This is an automated email from the ASF dual-hosted git repository.
michaelsmolina pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/superset.git
The following commit(s) were added to refs/heads/master by this push:
new cbb80f04627 refactor(extensions): simplify registerEditorProvider API
(#38127)
cbb80f04627 is described below
commit cbb80f046279b1a58b745f3a91d0b1f1b29292a3
Author: Michael S. Molina <[email protected]>
AuthorDate: Mon Feb 23 09:04:31 2026 -0300
refactor(extensions): simplify registerEditorProvider API (#38127)
---
.../extensions/extension-points/editors.md | 8 ++------
.../packages/superset-core/src/api/editors.ts | 14 ++++++-------
superset-frontend/src/core/editors/index.ts | 24 ++++++++++++++++------
3 files changed, 27 insertions(+), 19 deletions(-)
diff --git a/docs/developer_portal/extensions/extension-points/editors.md
b/docs/developer_portal/extensions/extension-points/editors.md
index 4cc1da5d4c1..001ca149300 100644
--- a/docs/developer_portal/extensions/extension-points/editors.md
+++ b/docs/developer_portal/extensions/extension-points/editors.md
@@ -172,13 +172,9 @@ import { editors } from '@apache-superset/core';
import MonacoSQLEditor from './MonacoSQLEditor';
export function activate(context) {
- // Register the Monaco editor for SQL
+ // Register the Monaco editor for SQL using the contribution ID from
extension.json
const disposable = editors.registerEditorProvider(
- {
- id: 'monaco-sql-editor.sql',
- name: 'Monaco SQL Editor',
- languages: ['sql'],
- },
+ 'monaco-sql-editor.sql',
MonacoSQLEditor,
);
diff --git a/superset-frontend/packages/superset-core/src/api/editors.ts
b/superset-frontend/packages/superset-core/src/api/editors.ts
index d2b63d2beca..cc57dde3073 100644
--- a/superset-frontend/packages/superset-core/src/api/editors.ts
+++ b/superset-frontend/packages/superset-core/src/api/editors.ts
@@ -497,25 +497,25 @@ export interface EditorProviderUnregisteredEvent {
* Register an editor provider for specific languages.
* When an extension registers an editor, it replaces the default for those
languages.
*
- * @param contribution The editor contribution metadata from extension.json
+ * The contribution metadata (name, languages, description) is read from the
+ * extension's manifest (extension.json), so only the contribution ID and
+ * component are needed at registration time.
+ *
+ * @param id The editor contribution ID declared in extension.json
* @param component The React component implementing EditorProps
* @returns A Disposable to unregister the provider
*
* @example
* ```typescript
* const disposable = registerEditorProvider(
- * {
- * id: 'acme.monaco-sql',
- * name: 'Monaco SQL Editor',
- * languages: ['sql'],
- * },
+ * 'acme.monaco-sql',
* MonacoSQLEditor
* );
* context.disposables.push(disposable);
* ```
*/
export declare function registerEditorProvider(
- contribution: EditorContribution,
+ id: string,
component: EditorComponent,
): Disposable;
diff --git a/superset-frontend/src/core/editors/index.ts
b/superset-frontend/src/core/editors/index.ts
index 26e6e63e811..b67d48cd42b 100644
--- a/superset-frontend/src/core/editors/index.ts
+++ b/superset-frontend/src/core/editors/index.ts
@@ -26,12 +26,12 @@
import type { contributions } from '@apache-superset/core';
import { editors as editorsApi } from '@apache-superset/core';
+import ExtensionsManager from 'src/extensions/ExtensionsManager';
import { Disposable } from '../models';
import EditorProviders from './EditorProviders';
type EditorLanguage = contributions.EditorLanguage;
type EditorProvider = editorsApi.EditorProvider;
-type EditorContribution = editorsApi.EditorContribution;
type EditorComponent = editorsApi.EditorComponent;
type EditorProviderRegisteredEvent = editorsApi.EditorProviderRegisteredEvent;
type EditorProviderUnregisteredEvent =
@@ -39,18 +39,30 @@ type EditorProviderUnregisteredEvent =
/**
* Register an editor provider for specific languages.
- * When an extension registers an editor, it replaces the default for those
languages.
+ * The contribution metadata is resolved from the extension manifest by ID.
*
- * @param contribution The editor contribution metadata from extension.json
+ * @param id The editor contribution ID declared in extension.json
* @param component The React component implementing EditorProps
* @returns A Disposable to unregister the provider
*/
export const registerEditorProvider = (
- contribution: EditorContribution,
+ id: string,
component: EditorComponent,
): Disposable => {
- const manager = EditorProviders.getInstance();
- return manager.registerProvider(contribution, component);
+ const manager = ExtensionsManager.getInstance();
+ const contribution = manager.getEditorContributions().find(c => c.id === id);
+
+ if (!contribution) {
+ // eslint-disable-next-line no-console
+ console.warn(
+ `No editor contribution found in extension.json for id "${id}". ` +
+ 'Ensure the editor is declared in the contributions.editors array.',
+ );
+ return new Disposable(() => {});
+ }
+
+ const providers = EditorProviders.getInstance();
+ return providers.registerProvider(contribution, component);
};
/**