@flusys/nestjs-form-builder
v5.1.1
Published
Dynamic form builder module with schema versioning and access control
Maintainers
Readme
@flusys/nestjs-form-builder
Dynamic form management for NestJS — JSON schema storage, schema versioning, access control (PUBLIC / AUTHENTICATED / ACTION_GROUP), draft submissions, and a server-side computed fields engine.
Installation
npm install @flusys/nestjs-form-builder @flusys/nestjs-shared @flusys/nestjs-core1. Module Registration
forRoot (sync)
Mode 1: Single Database
import { FormBuilderModule } from '@flusys/nestjs-form-builder';
FormBuilderModule.forRoot({
global: true,
includeController: true,
bootstrapAppConfig: {
databaseMode: 'single',
enableCompanyFeature: false,
},
config: {
defaultDatabaseConfig: {
type: 'mysql',
host: process.env.DB_HOST,
port: Number(process.env.DB_PORT ?? 3306),
username: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
},
},
});Mode 2: Multi-Tenant
FormBuilderModule.forRoot({
global: true,
includeController: true,
bootstrapAppConfig: {
databaseMode: 'multi-tenant',
enableCompanyFeature: true,
},
config: {
tenantDefaultDatabaseConfig: {
type: 'mysql',
host: process.env.TENANT_DB_HOST,
port: Number(process.env.TENANT_DB_PORT ?? 3306),
username: process.env.TENANT_DB_USER,
password: process.env.TENANT_DB_PASSWORD,
database: process.env.TENANT_DB_NAME,
},
tenants: [
{ id: 'tenant-a', database: 'tenant_a_db' },
{ id: 'tenant-b', database: 'tenant_b_db' },
],
},
});forRootAsync (factory — recommended)
import { ConfigModule, ConfigService } from '@nestjs/config';
import { FormBuilderModule, ITenantDatabaseConfig } from '@flusys/nestjs-form-builder';
// Single database
FormBuilderModule.forRootAsync({
global: true,
bootstrapAppConfig: {
databaseMode: 'single',
enableCompanyFeature: true,
},
imports: [ConfigModule],
useFactory: (cfg: ConfigService) => ({
defaultDatabaseConfig: {
type: 'mysql',
host: cfg.get('DB_HOST'),
port: cfg.get<number>('DB_PORT'),
username: cfg.get('DB_USER'),
password: cfg.get('DB_PASSWORD'),
database: cfg.get('DB_NAME'),
},
}),
inject: [ConfigService],
});
// Multi-tenant
FormBuilderModule.forRootAsync({
global: true,
bootstrapAppConfig: {
databaseMode: 'multi-tenant',
enableCompanyFeature: true,
},
imports: [ConfigModule],
useFactory: (cfg: ConfigService) => ({
tenantDefaultDatabaseConfig: {
type: 'mysql',
host: cfg.get('TENANT_DB_HOST'),
port: cfg.get<number>('TENANT_DB_PORT'),
username: cfg.get('TENANT_DB_USER'),
password: cfg.get('TENANT_DB_PASSWORD'),
database: cfg.get('TENANT_DB_NAME'),
},
tenants: cfg.get<ITenantDatabaseConfig[]>('TENANTS'),
}),
inject: [ConfigService],
});Exported services (available for injection after registration):
FormService, FormResultService, FormBuilderConfigService, FormBuilderDataSourceProvider
2. Entities
import { getFormBuilderEntitiesByConfig } from '@flusys/nestjs-form-builder/entities';
TypeOrmModule.forRoot({
entities: [
...getFormBuilderEntitiesByConfig(false), // match enableCompanyFeature in bootstrapAppConfig
],
});| enableCompanyFeature | Entities registered |
| ---------------------- | ------------------------------- |
| false | Form, FormResult |
| true | FormWithCompany, FormResult |
The service selects the correct entity automatically at request time — no manual switching needed.
License
MIT © FLUSYS
