---
title: Contribution Points
sidebar_position: 3
---
# Contribution Points Reference
Contribution points define where and how extensions can add functionality to Apache Superset. Extensions declare their contributions in the `extension.json` manifest file.
## Views
Views are UI components that appear in designated areas of Superset.
### SQL Lab Panels
Extensions can contribute panels to SQL Lab:
```json
"contributions": {
"views": {
"sqllab.panels": [
{
"id": "myExtension.dataPanel",
"name": "Data Explorer",
"icon": "DatabaseOutlined",
"when": "sqllab.connected"
}
]
}
}
```
**Properties**:
- `id` - Unique view identifier
- `name` - Display name in UI
- `icon` - Ant Design icon name
- `when` - Conditional visibility
**Available Locations**:
- `sqllab.panels` - Side panels in SQL Lab
- `sqllab.bottomPanels` - Bottom panels below editor
**TODO: Future Locations**:
- `dashboard.widgets` - Dashboard widget areas
- `chart.panels` - Chart editor panels
- `explore.sections` - Explore view sections
### View Registration
In your extension code:
```typescript
export function activate(context: ExtensionContext) {
const view = context.registerView(
'myExtension.dataPanel',
);
context.subscriptions.push(view);
}
```
## Commands
Commands are actions that can be invoked by users or other extensions.
### Command Definition
```json
"commands": [
{
"command": "myExtension.runAnalysis",
"title": "Run Analysis",
"category": "Data Tools",
"icon": "PlayCircleOutlined",
"enablement": "sqllab.hasQuery && !sqllab.running"
}
]
```
**Properties**:
- `command` - Unique command identifier
- `title` - Display name
- `category` - Command palette category
- `icon` - Optional icon
- `enablement` - Condition for enabling
### Command Registration
```typescript
commands.registerCommand('myExtension.runAnalysis', {
execute: async (...args) => {
const query = sqlLab.getCurrentQuery();
const result = await analyzeQuery(query);
return result;
},
isEnabled: () => {
return sqlLab.hasQuery() && !sqlLab.isRunning();
}
});
```
### Built-in Commands
Extensions can invoke these built-in commands:
```typescript
// SQL Lab commands
await commands.executeCommand('sqllab.executeQuery');
await commands.executeCommand('sqllab.formatQuery');
await commands.executeCommand('sqllab.saveQuery');
await commands.executeCommand('sqllab.exportResults');
// Editor commands
await commands.executeCommand('editor.action.formatDocument');
await commands.executeCommand('editor.action.commentLine');
// System commands
await commands.executeCommand('workbench.action.openSettings');
await commands.executeCommand('workbench.action.showCommands');
```
## Menus
Add items to existing Superset menus.
### Menu Contributions
```json
"menus": {
"sqllab.editor": {
"primary": [
{
"command": "myExtension.analyze",
"group": "navigation",
"order": 1,
"when": "editorFocus"
}
],
"secondary": [
{
"command": "myExtension.settings",
"group": "settings"
}
],
"context": [
{
"command": "myExtension.explain",
"group": "1_modification",
"when": "editorTextFocus && editorHasSelection"
}
]
}
}
```
**Menu Locations**:
- `sqllab.editor.primary` - Main toolbar
- `sqllab.editor.secondary` - Secondary toolbar
- `sqllab.editor.context` - Right-click menu
**Groups** (for organization):
- `navigation` - Primary navigation items
- `1_modification` - Edit operations
- `2_workspace` - Workspace management
- `9_cutcopypaste` - Clipboard operations
- `z_commands` - Other commands
**TODO: Future Menu Locations**:
- `explorer.context` - Data explorer context menu
- `dashboard.toolbar` - Dashboard toolbar
- `chart.context` - Chart context menu
## Configuration
Define user-configurable settings.
### Configuration Schema
```json
"configuration": {
"title": "My Extension Settings",
"order": 10,
"properties": {
"myExtension.enableFeature": {
"type": "boolean",
"default": true,
"description": "Enable the main feature",
"order": 1
},
"myExtension.apiEndpoint": {
"type": "string",
"default": "https://api.example.com",
"description": "API endpoint URL",
"pattern": "^https?://",
"order": 2
},
"myExtension.refreshInterval": {
"type": "number",
"default": 5000,
"minimum": 1000,
"maximum": 60000,
"description": "Refresh interval in milliseconds",
"order": 3
},
"myExtension.theme": {
"type": "string",
"enum": ["light", "dark", "auto"],
"enumDescriptions": [
"Light theme",
"Dark theme",
"Follow system"
],
"default": "auto",
"description": "Color theme",
"order": 4
},
"myExtension.advanced": {
"type": "object",
"properties": {
"cacheSize": {
"type": "number",
"default": 100
},
"debug": {
"type": "boolean",
"default": false
}
},
"description": "Advanced settings",
"order": 5
}
}
}
```
### Accessing Configuration
```typescript
// Get configuration value
const isEnabled = workspace.getConfiguration('myExtension')
.get('enableFeature');
// Update configuration
await workspace.getConfiguration('myExtension')
.update('refreshInterval', 10000);
// Listen for changes
workspace.onDidChangeConfiguration(e => {
if (e.affectsConfiguration('myExtension.theme')) {
updateTheme();
}
});
```
## Keybindings
Register keyboard shortcuts for commands.
### TODO: Keybinding Definition (Future)
```json
"keybindings": [
{
"command": "myExtension.runQuery",
"key": "ctrl+shift+r",
"mac": "cmd+shift+r",
"when": "editorTextFocus"
}
]
```
## Language Support
### TODO: Language Contributions (Future)
```json
"languages": [
{
"id": "supersql",
"extensions": [".ssql"],
"aliases": ["SuperSQL", "ssql"],
"configuration": "./language-configuration.json"
}
]
```
## Themes
### TODO: Theme Contributions (Future)
```json
"themes": [
{
"label": "My Dark Theme",
"uiTheme": "vs-dark",
"path": "./themes/my-dark-theme.json"
}
]
```
## Status Bar
Add items to the status bar.
### TODO: Status Bar Contributions (Future)
```json
"statusBar": [
{
"id": "myExtension.status",
"alignment": "left",
"priority": 100,
"text": "$(database) Connected",
"tooltip": "Database connection status",
"command": "myExtension.showStatus"
}
]
```
## Activity Bar
### TODO: Activity Bar Contributions (Future)
```json
"activityBar": [
{
"id": "myExtension.explorer",
"title": "Data Explorer",
"icon": "./icons/explorer.svg"
}
]
```
## Context Variables
Extensions can use these context variables in `when` clauses:
### SQL Lab Context
- `sqllab.connected` - Database connection established
- `sqllab.hasQuery` - Query text present
- `sqllab.querySelected` - Query text selected
- `sqllab.running` - Query executing
- `sqllab.hasResults` - Results available
- `sqllab.queryExecuted` - Query has been run
- `sqllab.panelVisible` - Specific panel visible
- `sqllab.tabActive` - Specific tab active
### Editor Context
- `editorFocus` - Editor has focus
- `editorTextFocus` - Text area focused
- `editorHasSelection` - Text selected
- `editorHasMultipleSelections` - Multiple selections
- `editorReadonly` - Editor is read-only
- `editorLangId` - Language ID matches
### Workspace Context
- `workspaceFolderCount` - Number of workspace folders
- `workspaceState` - Workspace state value
- `config.*` - Configuration values
### Resource Context
- `resourceScheme` - URI scheme matches
- `resourceFilename` - Filename matches pattern
- `resourceExtname` - File extension matches
- `resourceLangId` - Resource language ID
## Activation Events
Control when your extension activates:
```json
"activationEvents": [
"onCommand:myExtension.start",
"onView:myExtension.explorer",
"onLanguage:sql",
"workspaceContains:**/*.ssql",
"onStartupFinished"
]
```
See [Activation Events](/developer_portal/references/activation-events) for details.
## API Access Declaration
Declare which APIs your extension uses:
```json
"capabilities": {
"apis": [
"sqllab.*",
"authentication.getUser",
"workspace.getConfiguration",
"commands.executeCommand"
]
}
```
## Contribution Validation
Contributions are validated:
1. **At build time** - Schema validation
2. **At registration** - Conflict detection
3. **At runtime** - Permission checks
Common validation errors:
- Duplicate command IDs
- Invalid menu locations
- Missing required properties
- Circular dependencies
- Invalid context expressions
## Best Practices
1. **Use namespaced IDs** - Prefix with extension name
2. **Declare minimal capabilities** - Only request needed APIs
3. **Provide meaningful descriptions** - Help users understand
4. **Use appropriate icons** - Follow Ant Design guidelines
5. **Group related items** - Organize menus logically
6. **Test context conditions** - Ensure `when` clauses work
7. **Handle missing permissions** - Graceful degradation
8. **Document commands** - Explain what they do
9. **Version your APIs** - Plan for changes
10. **Validate user input** - For configuration values
## Future Contribution Points
These contribution points are planned for future releases:
- **Debuggers** - Custom debugging adapters
- **Tasks** - Background task providers
- **Snippets** - Code snippets
- **Color Themes** - Complete color themes
- **Icon Themes** - Icon set definitions
- **Product Icons** - Custom product icons
- **Walkthroughs** - Getting started guides
- **Authentication** - Auth providers
- **Views Containers** - Custom view containers
- **Terminal** - Terminal profiles
- **Comments** - Comment providers
- **Code Actions** - Quick fixes
- **Code Lens** - Inline commands
- **Semantic Tokens** - Syntax highlighting
## Related Documentation
- [Extension Manifest](/developer_portal/references/manifest)
- [Activation Events](/developer_portal/references/activation-events)
- [API Reference](/developer_portal/api/frontend)
- [Frontend Contribution Types](/developer_portal/extensions/frontend-contribution-types)