@eggjs/tegg-common-util
Common utility functions for tegg framework.
ModuleConfigUtil.deduplicateModules
A utility method for deduplicating module references to avoid adding duplicate modules.
Features
- Path-based deduplication: Removes modules with duplicate paths
- Name-based deduplication: Removes modules with duplicate names (throws error if found)
- Priority handling: Prioritizes non-optional modules over optional ones
- Error handling: Throws error for duplicate module names with different paths
- Simple API: No complex options, straightforward behavior
API
public static deduplicateModules(
moduleReferences: readonly ModuleReference[]
): readonly ModuleReference[]
Note: This method does not accept options parameters. The behavior is fixed and optimized for common use cases.
Behavior
- Path Deduplication: If multiple modules have the same path, only one is kept
- Optional Priority: When paths are the same, non-optional modules are prioritized over optional ones
- Name Validation: If modules have the same name but different paths, an error is thrown
- First Occurrence: When both modules have the same optional status, the first occurrence is kept
Usage Examples
Basic Usage
import { ModuleConfigUtil } from '@eggjs/tegg-common-util';
const modules = [
{ name: 'module1', path: '/path/to/module1' },
{ name: 'module2', path: '/path/to/module2' },
{ name: 'module1', path: '/different/path/to/module1' },
];
const result = ModuleConfigUtil.deduplicateModules(modules);
With Optional Modules
const modules = [
{ name: 'module1', path: '/path/to/module1', optional: true },
{ name: 'module1', path: '/path/to/module1' },
];
const result = ModuleConfigUtil.deduplicateModules(modules);
Path Deduplication
const modules = [
{ name: 'module1', path: '/path/to/module1' },
{ name: 'module2', path: '/path/to/module1' },
];
const result = ModuleConfigUtil.deduplicateModules(modules);
Use Cases
1. Plugin/Config Module Scanner
return ModuleConfigUtil.deduplicateModules(allModuleReferences);
2. Standalone Runner
return ModuleConfigUtil.deduplicateModules(allModuleReferences);
3. Error Handling
try {
const result = ModuleConfigUtil.deduplicateModules(modules);
} catch (error) {
if (error.message.includes('Duplicate module name')) {
console.error('Configuration error:', error.message);
}
throw error;
}
Benefits
- Simplicity: No complex configuration needed, works out of the box
- Reliability: Consistent behavior across different use cases
- Performance: Optimized for common scenarios
- Error Prevention: Catches configuration errors early
- Maintainability: Simple API reduces complexity
Migration from Options-based API
Before (Options-based - Not Available)
const result = ModuleConfigUtil.deduplicateModules(modules, {
prioritizeNonOptional: true,
allowNameDuplicates: false,
logPrefix: '[tegg/config]',
logger: customLogger,
});
After (Current Implementation)
const result = ModuleConfigUtil.deduplicateModules(modules);
Important Notes
- No Options: The method signature is fixed and does not accept configuration options
- Error on Name Duplicates: Duplicate names with different paths will cause an error
- Automatic Priority: Non-optional modules are automatically prioritized over optional ones
- Path-based Deduplication: Same path modules are deduplicated with smart priority handling