Plugin System
Overview
Section titled “Overview”Plugins are the primary extension mechanism in Rebase. They can:
- Wrap the entire app with a provider (context, state management)
- Add home page actions and widgets
- Inject collection view components (toolbar, column builders)
- Add form components (field builders, additional panels)
- Inject or modify collections dynamically
Plugin Interface
Section titled “Plugin Interface”interface RebasePlugin { key: string; // Unique identifier loading?: boolean; // Show loading state while initializing
// Wrap the app with a provider provider?: { Component: React.ComponentType; };
// Home page customization homePage?: { additionalActions?: React.ReactNode; additionalChildrenStart?: React.ReactNode; additionalChildrenEnd?: React.ReactNode; };
// Collection view customization collectionView?: { showTextSearchBar?: boolean; CollectionActions?: React.ComponentType[]; AddColumnComponent?: React.ComponentType; onCellValueChange?: (params) => void; };
// Entity form customization form?: { Actions?: React.ComponentType; provider?: { Component: React.ComponentType }; fieldBuilder?: (params) => React.ReactNode | null; };
// Collection injection/modification collection?: { injectCollections?: (params) => EntityCollection[]; modifyCollection?: (params) => EntityCollection; };}Using Plugins
Section titled “Using Plugins”Pass plugin instances to the navigation controller:
const dataEnhancementPlugin = useDataEnhancementPlugin();const collectionEditorPlugin = useCollectionEditorPlugin({ collectionConfigController});
const plugins = [dataEnhancementPlugin, collectionEditorPlugin];
const navigationStateController = useBuildNavigationStateController({ plugins, collections: () => collections, // ...});Building a Plugin
Section titled “Building a Plugin”Here’s a minimal plugin that adds a toolbar action to every collection:
import { RebasePlugin } from "@rebasepro/types";
function useMyPlugin(): RebasePlugin { return { key: "my_plugin",
collectionView: { CollectionActions: [MyToolbarAction] },
form: { fieldBuilder: ({ property, ...rest }) => { // Return a custom field for specific property configs if (property.propertyConfig === "my_custom_field") { return <MyCustomField {...rest} />; } return null; // Use default field } } };}Built-in Plugins
Section titled “Built-in Plugins”Collection Editor Plugin
Section titled “Collection Editor Plugin”Visual schema editing — add/remove fields, change types, rearrange properties:
import { useCollectionEditorPlugin, useLocalCollectionsConfigController } from "@rebasepro/studio";
const configController = useLocalCollectionsConfigController(client, collections, { getAuthToken: authController.getAuthToken});
const editorPlugin = useCollectionEditorPlugin({ collectionConfigController: configController });Data Enhancement Plugin
Section titled “Data Enhancement Plugin”AI-powered field autocompletion:
import { useDataEnhancementPlugin } from "@rebasepro/data_enhancement";
const enhancementPlugin = useDataEnhancementPlugin();
Collection Injection
Section titled “Collection Injection”Plugins can dynamically add new collections:
collection: { injectCollections: ({ collections, user }) => { // Add an audit log collection for admins if (user?.roles?.includes("admin")) { return [auditLogCollection]; } return []; }}Collection Modification
Section titled “Collection Modification”Plugins can modify existing collections:
collection: { modifyCollection: ({ collection }) => { // Add a "last_modified_by" field to every collection return { ...collection, properties: { ...collection.properties, last_modified_by: { type: "string", name: "Modified By", readOnly: true } } }; }}Next Steps
Section titled “Next Steps”- Studio Tools — SQL console, JS console, RLS editor
- Custom Fields — Building custom form fields