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