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);
 };
 
 /**

Reply via email to