Plugin Development Guide
Create custom plugins to extend Ever Gauzy functionality.
Overviewβ
Gauzy's plugin architecture allows developers to add new features, integrations, and modules without modifying the core codebase.
Plugin Structureβ
A typical plugin follows this directory structure:
packages/plugins/my-plugin/
βββ src/
β βββ lib/
β β βββ my-plugin.module.ts # Main module
β β βββ my-plugin.service.ts # Business logic
β β βββ my-plugin.controller.ts # REST endpoints
β β βββ my-plugin.entity.ts # Database entities
β βββ index.ts # Public API exports
βββ package.json
βββ tsconfig.json
βββ README.md
Creating a Pluginβ
1. Scaffold the Pluginβ
# Create the plugin directory
mkdir -p packages/plugins/my-plugin/src/lib
2. Define the Moduleβ
// my-plugin.module.ts
import { Module } from "@nestjs/common";
import { TypeOrmModule } from "@nestjs/typeorm";
import { MikroOrmModule } from "@mikro-orm/nestjs";
import { MyPluginService } from "./my-plugin.service";
import { MyPluginController } from "./my-plugin.controller";
import { MyEntity } from "./my-plugin.entity";
@Module({
imports: [
TypeOrmModule.forFeature([MyEntity]),
MikroOrmModule.forFeature([MyEntity]),
],
controllers: [MyPluginController],
providers: [MyPluginService],
exports: [MyPluginService],
})
export class MyPluginModule {}
3. Create an Entityβ
// my-plugin.entity.ts
import { MultiORMEntity, MultiORMColumn } from "@gauzy/core";
import { TenantOrganizationBaseEntity } from "@gauzy/core";
@MultiORMEntity("my_entity")
export class MyEntity extends TenantOrganizationBaseEntity {
@MultiORMColumn()
name: string;
@MultiORMColumn({ nullable: true })
description?: string;
}
4. Create a Serviceβ
// my-plugin.service.ts
import { Injectable } from "@nestjs/common";
import { InjectRepository } from "@nestjs/typeorm";
import { Repository } from "typeorm";
import { TenantAwareCrudService } from "@gauzy/core";
import { MyEntity } from "./my-plugin.entity";
@Injectable()
export class MyPluginService extends TenantAwareCrudService<MyEntity> {
constructor(
@InjectRepository(MyEntity)
private readonly myRepository: Repository<MyEntity>,
) {
super(myRepository);
}
}
5. Create a Controllerβ
// my-plugin.controller.ts
import { Controller, UseGuards } from "@nestjs/common";
import { ApiTags } from "@nestjs/swagger";
import { CrudController } from "@gauzy/core";
import { TenantPermissionGuard, PermissionGuard } from "@gauzy/core";
import { MyEntity } from "./my-plugin.entity";
import { MyPluginService } from "./my-plugin.service";
@ApiTags("MyPlugin")
@UseGuards(TenantPermissionGuard, PermissionGuard)
@Controller("/my-plugin")
export class MyPluginController extends CrudController<MyEntity> {
constructor(private readonly service: MyPluginService) {
super(service);
}
}
6. Register the Pluginβ
Add the plugin module to the application's main module:
// In app.module.ts or plugin registration
import { MyPluginModule } from "@gauzy/plugin-my-plugin";
@Module({
imports: [
// ... other modules
MyPluginModule,
],
})
export class AppModule {}
Plugin Lifecycleβ
| Phase | Description |
|---|---|
| Discovery | Plugin package is found in node_modules |
| Registration | Module is imported and providers registered |
| Initialization | Database entities are synced, services initialized |
| Ready | Plugin is fully operational |
| Shutdown | Cleanup on application shutdown |
Best Practicesβ
- Extend base classes β use
TenantOrganizationBaseEntityandTenantAwareCrudService - Multi-ORM support β use
MultiORMEntityandMultiORMColumndecorators - Guard all endpoints β apply
TenantPermissionGuardandPermissionGuard - Use DTOs β create validation DTOs for all inputs
- Document API β apply
@ApiTagsand@ApiOperationdecorators
Related Pagesβ
- Plugin Architecture β architecture overview
- Plugin API Reference β shared plugin APIs
- Built-in Plugins β reference implementations