diff --git a/docs/developer_portal/api/frontend.md b/docs/developer_portal/api/frontend.md deleted file mode 100644 index 1f75a9f5d13..00000000000 --- a/docs/developer_portal/api/frontend.md +++ /dev/null @@ -1,772 +0,0 @@ ---- -title: Frontend API Reference -sidebar_position: 1 ---- - - - -# Frontend Extension API Reference - -The `@apache-superset/core` package provides comprehensive APIs for frontend extensions to interact with Apache Superset. All APIs are versioned and follow semantic versioning principles. - -## Core APIs - -### Extension Context - -Every extension receives a context object during activation that provides access to the extension system. - -```typescript -interface ExtensionContext { - // Unique extension identifier - extensionId: string; - - // Extension metadata - extensionPath: string; - extensionUri: Uri; - - // Storage paths - globalStorageUri: Uri; - workspaceStorageUri: Uri; - - // Subscription management - subscriptions: Disposable[]; - - // State management - globalState: Memento; - workspaceState: Memento; - - // Extension-specific APIs - registerView(viewId: string, component: React.Component): Disposable; - registerCommand(commandId: string, handler: CommandHandler): Disposable; -} -``` - -### Lifecycle Methods - -```typescript -// Required: Called when extension is activated -export function activate(context: ExtensionContext): void | Promise { - console.log('Extension activated'); -} - -// Optional: Called when extension is deactivated -export function deactivate(): void | Promise { - console.log('Extension deactivated'); -} -``` - -## SQL Lab APIs - -The `sqlLab` namespace provides APIs specific to SQL Lab functionality. - -### Query Management - -```typescript -// Get current query editor content -sqlLab.getCurrentQuery(): string | undefined - -// Get active tab information -sqlLab.getCurrentTab(): Tab | undefined - -// Get all open tabs -sqlLab.getTabs(): Tab[] - -// Get available databases -sqlLab.getDatabases(): Database[] - -// Get schemas for a database -sqlLab.getSchemas(databaseId: number): Promise - -// Get tables for a schema -sqlLab.getTables(databaseId: number, schema: string): Promise - -// Insert text at cursor position -sqlLab.insertText(text: string): void - -// Replace entire query -sqlLab.replaceQuery(query: string): void - -// Execute current query -sqlLab.executeQuery(): Promise - -// Stop query execution -sqlLab.stopQuery(queryId: string): Promise -``` - -### Event Subscriptions - -```typescript -// Query execution events -sqlLab.onDidQueryRun( - listener: (event: QueryRunEvent) => void -): Disposable - -sqlLab.onDidQueryComplete( - listener: (event: QueryCompleteEvent) => void -): Disposable - -sqlLab.onDidQueryFail( - listener: (event: QueryFailEvent) => void -): Disposable - -// Editor events -sqlLab.onDidChangeEditorContent( - listener: (content: string) => void -): Disposable - -sqlLab.onDidChangeActiveTab( - listener: (tab: Tab) => void -): Disposable - -// Panel events -sqlLab.onDidOpenPanel( - listener: (panel: Panel) => void -): Disposable - -sqlLab.onDidClosePanel( - listener: (panel: Panel) => void -): Disposable -``` - -### Types - -```typescript -interface Tab { - id: string; - title: string; - query: string; - database: Database; - schema?: string; - isActive: boolean; - queryId?: string; - status?: 'pending' | 'running' | 'success' | 'error'; -} - -interface Database { - id: number; - name: string; - backend: string; - allows_subquery: boolean; - allows_ctas: boolean; - allows_cvas: boolean; -} - -interface QueryResult { - queryId: string; - status: 'success' | 'error'; - data?: any[]; - columns?: Column[]; - error?: string; - startTime: number; - endTime: number; - rows: number; -} -``` - -## Commands API - -Register and execute commands within Superset. - -### Registration - -```typescript -interface CommandHandler { - execute(...args: any[]): any | Promise; - isEnabled?(): boolean; - isVisible?(): boolean; -} - -// Register a command -commands.registerCommand( - commandId: string, - handler: CommandHandler -): Disposable - -// Register with metadata -commands.registerCommand( - commandId: string, - metadata: CommandMetadata, - handler: (...args: any[]) => any -): Disposable - -interface CommandMetadata { - title: string; - category?: string; - icon?: string; - enablement?: string; - when?: string; -} -``` - -### Execution - -```typescript -// Execute a command -commands.executeCommand( - commandId: string, - ...args: any[] -): Promise - -// Get all registered commands -commands.getCommands(): Promise - -// Check if command exists -commands.hasCommand(commandId: string): boolean -``` - -### Built-in Commands - -```typescript -// SQL Lab commands -'sqllab.executeQuery' -'sqllab.formatQuery' -'sqllab.saveQuery' -'sqllab.shareQuery' -'sqllab.downloadResults' - -// Editor commands -'editor.action.formatDocument' -'editor.action.commentLine' -'editor.action.findReferences' - -// Extension commands -'extensions.installExtension' -'extensions.uninstallExtension' -'extensions.enableExtension' -'extensions.disableExtension' -``` - -## UI Components - -Pre-built components from `@apache-superset/core` for consistent UI. - -### Basic Components - -```typescript -import { - Button, - Input, - Select, - Checkbox, - Radio, - Switch, - Slider, - DatePicker, - TimePicker, - Tooltip, - Popover, - Modal, - Drawer, - Alert, - Message, - Notification, - Spin, - Progress -} from '@apache-superset/core'; -``` - -### Data Display - -```typescript -import { - Table, - List, - Card, - Collapse, - Tabs, - Tag, - Badge, - Statistic, - Timeline, - Tree, - Empty, - Result -} from '@apache-superset/core'; -``` - -### Form Components - -```typescript -import { - Form, - FormItem, - FormList, - InputNumber, - TextArea, - Upload, - Rate, - Cascader, - AutoComplete, - Mentions -} from '@apache-superset/core'; -``` - -## Authentication API - -Access authentication and user information. - -```typescript -// Get current user -authentication.getCurrentUser(): User | undefined - -interface User { - id: number; - username: string; - email: string; - firstName: string; - lastName: string; - roles: Role[]; - isActive: boolean; - isAnonymous: boolean; -} - -// Get CSRF token for API requests -authentication.getCSRFToken(): Promise - -// Check permissions -authentication.hasPermission( - permission: string, - resource?: string -): boolean - -// Get user preferences -authentication.getPreferences(): UserPreferences - -// Update preferences -authentication.setPreference( - key: string, - value: any -): Promise -``` - -## Storage API - -Persist data across sessions. - -### Global Storage - -```typescript -// Shared across all workspaces -const globalState = context.globalState; - -// Get value -const value = globalState.get(key: string): T | undefined - -// Set value -await globalState.update(key: string, value: any): Promise - -// Get all keys -globalState.keys(): readonly string[] -``` - -### Workspace Storage - -```typescript -// Specific to current workspace -const workspaceState = context.workspaceState; - -// Same API as globalState -workspaceState.get(key: string): T | undefined -workspaceState.update(key: string, value: any): Promise -workspaceState.keys(): readonly string[] -``` - -### Secrets Storage - -```typescript -// Secure storage for sensitive data -secrets.store(key: string, value: string): Promise -secrets.get(key: string): Promise -secrets.delete(key: string): Promise -``` - -## Events API - -Subscribe to and emit custom events. - -```typescript -// Create an event emitter -const onDidChange = new EventEmitter(); - -// Expose as event -export const onChange = onDidChange.event; - -// Fire event -onDidChange.fire({ - type: 'update', - data: newData -}); - -// Subscribe to event -const disposable = onChange((event) => { - console.log('Changed:', event); -}); - -// Cleanup -disposable.dispose(); -``` - -## Window API - -Interact with the UI window. - -### Notifications - -```typescript -// Show info message -window.showInformationMessage( - message: string, - ...items: string[] -): Promise - -// Show warning -window.showWarningMessage( - message: string, - ...items: string[] -): Promise - -// Show error -window.showErrorMessage( - message: string, - ...items: string[] -): Promise - -// Show with options -window.showInformationMessage( - message: string, - options: MessageOptions, - ...items: MessageItem[] -): Promise - -interface MessageOptions { - modal?: boolean; - detail?: string; -} -``` - -### Input Dialogs - -```typescript -// Show input box -window.showInputBox( - options?: InputBoxOptions -): Promise - -interface InputBoxOptions { - title?: string; - prompt?: string; - placeHolder?: string; - value?: string; - password?: boolean; - validateInput?(value: string): string | null; -} - -// Show quick pick -window.showQuickPick( - items: string[] | QuickPickItem[], - options?: QuickPickOptions -): Promise - -interface QuickPickOptions { - title?: string; - placeHolder?: string; - canPickMany?: boolean; - matchOnDescription?: boolean; - matchOnDetail?: boolean; -} -``` - -### Progress - -```typescript -// Show progress -window.withProgress( - options: ProgressOptions, - task: (progress: Progress<{message?: string}>) => Promise -): Promise - -interface ProgressOptions { - location: ProgressLocation; - title?: string; - cancellable?: boolean; -} - -// Example usage -await window.withProgress( - { - location: ProgressLocation.Notification, - title: "Processing", - cancellable: true - }, - async (progress) => { - progress.report({ message: 'Step 1...' }); - await step1(); - progress.report({ message: 'Step 2...' }); - await step2(); - } -); -``` - -## Workspace API - -Access workspace information and configuration. - -```typescript -// Get workspace folders -workspace.workspaceFolders: readonly WorkspaceFolder[] - -// Get configuration -workspace.getConfiguration( - section?: string -): WorkspaceConfiguration - -// Update configuration -workspace.getConfiguration('myExtension') - .update('setting', value, ConfigurationTarget.Workspace) - -// Watch for configuration changes -workspace.onDidChangeConfiguration( - listener: (e: ConfigurationChangeEvent) => void -): Disposable - -// File system operations -workspace.fs.readFile(uri: Uri): Promise -workspace.fs.writeFile(uri: Uri, content: Uint8Array): Promise -workspace.fs.delete(uri: Uri): Promise -workspace.fs.rename(oldUri: Uri, newUri: Uri): Promise -workspace.fs.copy(source: Uri, destination: Uri): Promise -workspace.fs.createDirectory(uri: Uri): Promise -workspace.fs.readDirectory(uri: Uri): Promise<[string, FileType][]> -workspace.fs.stat(uri: Uri): Promise -``` - -## HTTP Client API - -Make HTTP requests from extensions. - -```typescript -import { api } from '@apache-superset/core'; - -// GET request -const response = await api.get('/api/v1/chart/'); - -// POST request -const response = await api.post('/api/v1/chart/', { - data: chartData -}); - -// PUT request -const response = await api.put('/api/v1/chart/123', { - data: updatedData -}); - -// DELETE request -const response = await api.delete('/api/v1/chart/123'); - -// Custom headers -const response = await api.get('/api/v1/chart/', { - headers: { - 'X-Custom-Header': 'value' - } -}); - -// Query parameters -const response = await api.get('/api/v1/chart/', { - params: { - page: 1, - page_size: 20 - } -}); -``` - -## Theming API - -Access and customize theme settings. - -```typescript -// Get current theme -theme.getActiveTheme(): Theme - -interface Theme { - name: string; - isDark: boolean; - colors: ThemeColors; - typography: Typography; - spacing: Spacing; -} - -// Listen for theme changes -theme.onDidChangeTheme( - listener: (theme: Theme) => void -): Disposable - -// Get theme colors -const colors = theme.colors; -colors.primary -colors.success -colors.warning -colors.error -colors.info -colors.text -colors.background -colors.border -``` - -## Disposable Pattern - -Manage resource cleanup consistently. - -```typescript -interface Disposable { - dispose(): void; -} - -// Create a disposable -class MyDisposable implements Disposable { - dispose() { - // Cleanup logic - } -} - -// Combine disposables -const composite = Disposable.from( - disposable1, - disposable2, - disposable3 -); - -// Dispose all at once -composite.dispose(); - -// Use in extension -export function activate(context: ExtensionContext) { - // All disposables added here are cleaned up on deactivation - context.subscriptions.push( - registerCommand(...), - registerView(...), - onDidChange(...) - ); -} -``` - -## Type Definitions - -Complete TypeScript definitions are available: - -```typescript -import type { - ExtensionContext, - Disposable, - Event, - EventEmitter, - Uri, - Command, - QuickPickItem, - InputBoxOptions, - Progress, - CancellationToken -} from '@apache-superset/core'; -``` - -## Version Compatibility - -The API follows semantic versioning: - -```typescript -// Check API version -const version = superset.version; - -// Version components -version.major // Breaking changes -version.minor // New features -version.patch // Bug fixes - -// Check minimum version -if (version.major < 1) { - throw new Error('Requires Superset API v1.0.0 or higher'); -} -``` - -## Migration Guide - -### From v0.x to v1.0 - -```typescript -// Before (v0.x) -sqlLab.runQuery(query); - -// After (v1.0) -sqlLab.executeQuery(); - -// Before (v0.x) -core.registerPanel(id, component); - -// After (v1.0) -context.registerView(id, component); -``` - -## Best Practices - -### Error Handling - -```typescript -export async function activate(context: ExtensionContext) { - try { - await initializeExtension(); - } catch (error) { - console.error('Failed to initialize:', error); - window.showErrorMessage( - `Extension failed to activate: ${error.message}` - ); - } -} -``` - -### Resource Management - -```typescript -// Always use disposables -const disposables: Disposable[] = []; - -disposables.push( - commands.registerCommand(...), - sqlLab.onDidQueryRun(...), - workspace.onDidChangeConfiguration(...) -); - -// Cleanup in deactivate -export function deactivate() { - disposables.forEach(d => d.dispose()); -} -``` - -### Type Safety - -```typescript -// Use type guards -function isDatabase(obj: any): obj is Database { - return obj && typeof obj.id === 'number' && typeof obj.name === 'string'; -} - -// Use generics -function getValue(key: string, defaultValue: T): T { - return context.globalState.get(key) ?? defaultValue; -} -``` diff --git a/docs/developer_portal/architecture/overview.md b/docs/developer_portal/architecture/overview.md deleted file mode 100644 index 3c8ccc1c131..00000000000 --- a/docs/developer_portal/architecture/overview.md +++ /dev/null @@ -1,194 +0,0 @@ ---- -title: Extension Architecture -sidebar_position: 1 ---- - - - -# Superset Extension Architecture - -Apache Superset's extension architecture enables developers to enhance and customize the platform without modifying the core codebase. Inspired by the successful VS Code Extensions model, this architecture provides well-defined, versioned APIs and clear contribution points that allow the community to build upon and extend Superset's functionality. - -## Core Concepts - -### Extensions vs Plugins - -We use the term "extensions" rather than "plugins" to better convey the idea of enhancing and expanding Superset's core capabilities in a modular and integrated way. Extensions can add new features, modify existing behavior, and integrate deeply with the host application through well-defined APIs. - -### Lean Core Philosophy - -Superset's core remains minimal, with many features delegated to extensions. Built-in features are implemented using the same APIs available to external extension authors, ensuring consistency and validating the extension architecture through real-world usage. - -## Architecture Overview - -The extension architecture consists of several key components: - -### Core Packages - -#### @apache-superset/core (Frontend) -Provides essential building blocks for extensions: -- Shared UI components -- Utility functions -- Type definitions -- Frontend APIs for interacting with the host - -#### apache-superset-core (Backend) -Exposes backend functionality: -- Database access APIs -- Security models -- REST API extensions -- SQLAlchemy models and utilities - -### Extension CLI - -The `apache-superset-extensions-cli` package provides commands for: -- Scaffolding new extension projects -- Building and bundling extensions -- Development workflows with hot-reload -- Packaging extensions for distribution - -### Host Application - -Superset acts as the host, providing: -- Extension registration and management -- Dynamic loading of extension assets -- API implementation for extensions -- Lifecycle management (activation/deactivation) - -## Extension Points - -Extensions can contribute to various parts of Superset: - -### SQL Lab Extensions -- Custom panels (left, right, bottom) -- Editor enhancements -- Query processors -- Autocomplete providers -- Execution plan visualizers - -### Dashboard Extensions (Future) -- Custom widget types -- Filter components -- Interaction handlers - -### Chart Extensions (Future) -- New visualization types -- Data transformers -- Export formats - -## Technical Foundation - -### Module Federation - -Frontend extensions leverage Webpack Module Federation for dynamic loading: -- Extensions are built independently -- Dependencies are shared with the host -- No rebuild of Superset required -- Runtime loading of extension assets - -### API Versioning - -All public APIs follow semantic versioning: -- Breaking changes require major version bumps -- Extensions declare compatibility requirements -- Backward compatibility maintained within major versions - -### Security Model - -- Extensions disabled by default (require `ENABLE_EXTENSIONS` flag) -- Built-in extensions follow same security standards as core -- External extensions run in same context as host (sandboxing planned) -- Administrators responsible for vetting third-party extensions - -## Development Workflow - -1. **Initialize**: Use CLI to scaffold new extension -2. **Develop**: Work with hot-reload in development mode -3. **Build**: Bundle frontend and backend assets -4. **Package**: Create `.supx` distribution file -5. **Deploy**: Upload through API or management UI - -## Example: Dataset References Extension - -A practical example demonstrating the architecture: - -```typescript -// Frontend activation -export function activate(context) { - // Register a new SQL Lab panel - const panel = core.registerView('dataset_references.main', - - ); - - // Listen to query changes - const listener = sqlLab.onDidQueryRun(editor => { - // Analyze query and update panel - }); - - // Cleanup on deactivation - context.subscriptions.push(panel, listener); -} -``` - -```python -# Backend API extension -from superset_core.api import rest_api -from .api import DatasetReferencesAPI - -# Register custom REST endpoints -rest_api.add_extension_api(DatasetReferencesAPI) -``` - -## Best Practices - -### Extension Design -- Keep extensions focused on specific functionality -- Use versioned APIs for stability -- Handle cleanup properly on deactivation -- Follow Superset's coding standards - -### Performance -- Lazy load assets when possible -- Minimize bundle sizes -- Share dependencies with host -- Cache expensive operations - -### Compatibility -- Declare API version requirements -- Test across Superset versions -- Provide migration guides for breaking changes -- Document compatibility clearly - -## Future Roadmap - -Planned enhancements include: -- JavaScript sandboxing for untrusted extensions -- Extension marketplace and registry -- Inter-extension communication -- Advanced theming capabilities -- Backend hot-reload without restart - -## Getting Started - -Ready to build your first extension? Check out: -- [Extension Project Structure](/developer_portal/extensions/extension-project-structure) -- [API Reference](/developer_portal/api/frontend) -- [CLI Documentation](/developer_portal/cli/overview) -- [Frontend Contribution Types](/developer_portal/extensions/frontend-contribution-types) diff --git a/docs/developer_portal/capabilities/common-capabilities.md b/docs/developer_portal/capabilities/common-capabilities.md deleted file mode 100644 index dc1adf66c6f..00000000000 --- a/docs/developer_portal/capabilities/common-capabilities.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -title: Common Plugin Capabilities -sidebar_position: 2 ---- - - - -# Common Plugin Capabilities - -🚧 **Coming Soon** 🚧 - -Explore the shared functionality and common patterns available to all Superset plugins. - -## Topics to be covered: - -- Plugin lifecycle hooks (initialization, activation, deactivation) -- Accessing Superset's core services and APIs -- State management and data persistence -- Event handling and plugin communication -- Internationalization (i18n) support -- Error handling and logging -- Plugin configuration management -- Accessing user context and permissions -- Working with datasets and queries -- Plugin metadata and manifests - -## Core Services Available - -- **API Client** - HTTP client for backend communication -- **State Store** - Redux store access -- **Theme Provider** - Access to current theme settings -- **User Context** - Current user information and permissions -- **Dataset Service** - Working with data sources -- **Chart Service** - Chart rendering utilities - ---- - -*This documentation is under active development. Check back soon for updates!* diff --git a/docs/developer_portal/capabilities/extending-workbench.md b/docs/developer_portal/capabilities/extending-workbench.md deleted file mode 100644 index 07cead0abf5..00000000000 --- a/docs/developer_portal/capabilities/extending-workbench.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: Extending the Workbench -sidebar_position: 4 ---- - - - -# Extending the Workbench - -🚧 **Coming Soon** 🚧 - -Discover how to extend Superset's main interface and workbench with custom components and functionality. - -## Topics to be covered: - -- Adding custom menu items and navigation -- Creating custom dashboard components -- Extending the SQL Lab interface -- Adding custom sidebar panels -- Creating floating panels and modals -- Integrating with the command palette -- Custom toolbar buttons and actions -- Workspace state management -- Plugin-specific keyboard shortcuts -- Context menu extensions - -## Extension Points - -- **Main navigation** - Top-level menu items -- **Dashboard builder** - Custom components and layouts -- **SQL Lab** - Query editor extensions -- **Chart explorer** - Visualization building tools -- **Settings panels** - Configuration interfaces -- **Data source explorer** - Database navigation - -## UI Integration Patterns - -- React component composition -- Portal-based rendering -- Event-driven UI updates -- Responsive layout adaptation - ---- - -*This documentation is under active development. Check back soon for updates!* diff --git a/docs/developer_portal/capabilities/overview.md b/docs/developer_portal/capabilities/overview.md deleted file mode 100644 index 22fe81e1e00..00000000000 --- a/docs/developer_portal/capabilities/overview.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -title: Plugin Capabilities Overview -sidebar_position: 1 ---- - - - -# Plugin Capabilities Overview - -🚧 **Coming Soon** 🚧 - -This section provides a comprehensive overview of what Superset plugins can do and how they integrate with the core platform. - -## Topics to be covered: - -- Plugin architecture and lifecycle -- Available extension points -- Core APIs and services -- Plugin communication patterns -- Configuration and settings management -- Plugin permissions and security -- Performance considerations -- Best practices for plugin development - -## Plugin Types - -Superset supports several types of plugins: -- **Visualization plugins** - Custom chart types and data visualizations -- **Database connectors** - New data source integrations -- **UI extensions** - Custom dashboard components and interfaces -- **Theme plugins** - Custom styling and branding -- **Filter plugins** - Custom filter components - ---- - -*This documentation is under active development. Check back soon for updates!* diff --git a/docs/developer_portal/capabilities/theming.md b/docs/developer_portal/capabilities/theming.md deleted file mode 100644 index 1ad673f5671..00000000000 --- a/docs/developer_portal/capabilities/theming.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -title: Theming and Styling -sidebar_position: 3 ---- - - - -# Theming and Styling - -🚧 **Coming Soon** 🚧 - -Learn how to create custom themes and style your plugins to match Superset's design system. - -## Topics to be covered: - -- Understanding Superset's theme architecture -- Using the theme provider in plugins -- Creating custom color palettes -- Responsive design considerations -- Dark mode and light mode support -- Customizing chart colors and styling -- Brand customization and white-labeling -- CSS-in-JS best practices -- Working with Ant Design components -- Accessibility in custom themes - -## Theme Structure - -- **Color tokens** - Primary, secondary, and semantic colors -- **Typography** - Font families, sizes, and weights -- **Spacing** - Grid system and layout tokens -- **Component styles** - Default component appearances -- **Chart themes** - Color schemes for visualizations - -## Supported Theming APIs - -- Theme provider context -- CSS custom properties -- Emotion/styled-components integration -- Chart color palette API - ---- - -*This documentation is under active development. Check back soon for updates!* diff --git a/docs/developer_portal/cli/overview.md b/docs/developer_portal/cli/overview.md deleted file mode 100644 index 5e92a6e4c8b..00000000000 --- a/docs/developer_portal/cli/overview.md +++ /dev/null @@ -1,578 +0,0 @@ ---- -title: Extension CLI -sidebar_position: 1 ---- - - - -# Superset Extension CLI - -The `apache-superset-extensions-cli` package provides command-line tools for creating, developing, and packaging Apache Superset extensions. It streamlines the entire extension development workflow from initialization to deployment. - -## Installation - -Install the CLI globally using pip: - -```bash -pip install apache-superset-extensions-cli -``` - -Or install locally in your project: - -```bash -pip install --user apache-superset-extensions-cli -``` - -Verify installation: - -```bash -superset-extensions --version -# Output: apache-superset-extensions-cli version 1.0.0 -``` - -## Commands Overview - -| Command | Description | -|---------|-------------| -| `init` | Create a new extension project | -| `dev` | Start development mode with hot reload | -| `build` | Build extension assets for production | -| `bundle` | Package extension into a .supx file | -| `validate` | Validate extension metadata and structure | -| `publish` | Publish extension to registry (future) | - -## Command Reference - -### init - -Creates a new extension project with the standard structure and boilerplate code. - -```bash -superset-extensions init [options] -``` - -#### Options - -- `--type, -t ` - Extension type: `full` (default), `frontend-only`, `backend-only` -- `--template