refactor: add better typings for sern event modules

This commit is contained in:
Jacob Nguyen
2023-05-18 22:52:37 -05:00
parent ea78a98f69
commit b6ef27df88
4 changed files with 18 additions and 5 deletions

View File

@@ -1,13 +1,15 @@
import { CommandMeta, CommandModule, Module } from '../types/modules';
import { CommandType } from '../structures';
import { CommandMeta, CommandModule, CommandModuleDefs, Module } from '../types/modules';
/**
* @since 2.0.0
*/
export interface ModuleManager {
get(id: string): string | undefined;
getMetadata(m: Module): CommandMeta;
getMetadata(m: Module): CommandMeta|undefined;
setMetadata(m: Module, c: CommandMeta): void;
set(id: string, path: string): void;
getPublishableCommands(): Promise<CommandModule[]>;
getByNameCommandType<T extends CommandType>(name: string, commandType: T): Promise<CommandModuleDefs[T]>|undefined;
remove(id: string): boolean;
}

View File

@@ -1,6 +1,8 @@
import { uniqueId } from '../../../handler/id';
import { CoreModuleStore, ModuleManager } from '../../contracts';
import { importModule } from '../../module-loading';
import { CommandMeta, CommandModule, Module } from '../../types/modules';
import { CommandMeta, CommandModule, CommandModuleDefs, Module } from '../../types/modules';
import { CommandType } from '../enums';
/**
* @internal
* @since 2.0.0
@@ -8,6 +10,15 @@ import { CommandMeta, CommandModule, Module } from '../../types/modules';
*/
export class DefaultModuleManager implements ModuleManager {
constructor(private moduleStore: CoreModuleStore) {}
getByNameCommandType<T extends CommandType>(name: string, commandType: T) {
const id = this.get(`${name}_${uniqueId(commandType)}`);
if(!id) {
return undefined;
}
return importModule<CommandModuleDefs[T]>(id);
}
setMetadata(m: Module, c: CommandMeta): void {
this.moduleStore.metadata.set(m, c);
}

View File

@@ -38,7 +38,7 @@ export function init(wrapper: Wrapper) {
startReadyEvent(dependencies, getFullPathTree(wrapper.commands, mode))
.add(() => {
const time = ((performance.now() - startTime) / 1000).toFixed(2);
dependencies[0].emit('modulesLoaded');
dependencies[0].emit('modulesLoaded' );
logger?.info({
message: `sern: registered all modules in ${time} s`,
});

View File

@@ -21,7 +21,7 @@ export interface SernEventsMapping {
'module.activate': [Payload];
error: [Payload];
warning: [Payload];
'modulesLoaded' : [];
'modulesLoaded': [never?];
}
export type Awaitable<T> = PromiseLike<T> | T;