@eleven-am/nestjs-graphql-crud
Version:
nestjs-graphql-crud is a library that aims to reduce the boilerplate code needed to create a GraphQL CRUD API.
102 lines • 4.63 kB
JavaScript
;
/**
* @module crudModulesFactory
* @description Factory for creating and registering CRUD modules
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.CrudModulesFactory = void 0;
const createBaseCrudModule_1 = require("./createBaseCrudModule");
const graphql_subscriptions_1 = require("graphql-subscriptions");
const crudModuleConfig_1 = require("./crudModuleConfig");
const decorators_1 = require("./decorators");
/**
* Factory class for creating and registering CRUD modules
*/
class CrudModulesFactory {
/**
* Creates a factory builder for a specific entity type
*
* @template Item - The entity type
* @param {Type<Item>} entity - The entity class
*/
static forEntity(entity) {
return {
/**
* Configures a CRUD module for this entity
*
* @template CreateInput - The input type for create operations
* @template UpdateInput - The input type for update operations
* @template UpdateManyInput - The input type for update many operations
* @template WhereInput - The input type for query filters
*
* @param {{ modelName: string; createInput: Type<CreateInput>; updateInput: Type<UpdateInput>; updateManyInput: Type<UpdateManyInput>; whereInput: Type<WhereInput> }} config - Configuration for the CRUD module
* @returns {CrudModuleConfig<Item, CreateInput, UpdateInput, UpdateManyInput, WhereInput>} A configuration builder for further customization
*/
withConfig(config) {
return new crudModuleConfig_1.CrudModuleConfig({
...config,
findManyArgs: (0, decorators_1.createFindMany)(config.whereInput, config.modelName),
entity,
});
}
};
}
/**
* Creates a factory with specified provider implementations
*
* @param {Type<DataProvider>} dataProvider - The data provider implementation
* @param {Type<FieldSelectionProvider>} fieldSelectionProvider - The field selection provider implementation
* @returns An object with methods to configure and create modules
*/
static using(dataProvider, fieldSelectionProvider) {
return {
/**
* Creates and registers all CRUD modules using the specified providers
*
* @param {CrudModuleConfig<any, any, any, any, any>[]} configBuilders - Array of CRUD module configurations
* @param {any} [configBuilders] - Optional provider-specific configuration
* @returns {DynamicModule} A NestJS dynamic module incorporating all configured CRUD modules
*/
forRoot(configBuilders) {
// Create tokens for the providers
const dataProviderToken = Symbol('DataProvider');
const fieldSelectionProviderToken = Symbol('FieldSelectionProvider');
// Create providers
const pubSubProvider = {
provide: decorators_1.PUB_SUB_SYMBOL,
useValue: new graphql_subscriptions_1.PubSub()
};
const dataProviderInstanceProvider = {
provide: dataProviderToken,
useClass: dataProvider
};
const fieldSelectionProviderInstanceProvider = {
provide: fieldSelectionProviderToken,
useClass: fieldSelectionProvider
};
// Create each CRUD module
const crudModules = configBuilders.map(builder => {
return (0, createBaseCrudModule_1.createBaseCrudModule)(dataProviderToken, fieldSelectionProviderToken, builder.options);
});
// Return the combined module
return {
global: true,
imports: crudModules,
module: CrudModulesFactory,
providers: [
pubSubProvider,
dataProviderInstanceProvider,
fieldSelectionProviderInstanceProvider
],
exports: [
pubSubProvider,
dataProviderInstanceProvider,
fieldSelectionProviderInstanceProvider
],
};
}
};
}
}
exports.CrudModulesFactory = CrudModulesFactory;
//# sourceMappingURL=crudModulesFactory.js.map