Skip to content

Commit

Permalink
feat(api): improve types
Browse files Browse the repository at this point in the history
  • Loading branch information
riccardoperra committed Mar 4, 2023
1 parent 2d42f5c commit 3ac27fa
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 24 deletions.
28 changes: 12 additions & 16 deletions apps/api/src/common/domainFunctions/builder.ts
Original file line number Diff line number Diff line change
@@ -1,34 +1,30 @@
import {
Handler,
HandlerCallbackMetadata,
HandlerInternalMetadata,
Wrap,
} from '@api/domain';
/* eslint-disable @typescript-eslint/no-explicit-any */
import {Handler, HandlerCallbackMetadata, Wrap} from '@api/domain';
import {$HANDLER} from './handlers';

type HandlerBuilderData = {
dependencies?: unknown;
input?: unknown[];
output?: unknown;
name?: string;
dependencies: any;
input: any[];
output: any;
name: any;
};

type ExtendBuilder<
T extends HandlerBuilderData,
S extends Partial<HandlerBuilderData>,
> = Wrap<Omit<T, keyof S> & S> extends infer U
? U extends HandlerInternalMetadata
> = Wrap<Omit<T, keyof S>> & S extends infer U
? U extends HandlerBuilderData
? U
: never
: never;

export class HandlerBuilder<T extends HandlerBuilderData> {
private name: T['name'] = undefined;
private name!: T['name'];

private callback!: (
dependencies: T['dependencies'],
metadata: HandlerCallbackMetadata,
) => (...args: T['input'] & unknown[]) => T['output'];
) => (...args: NonNullable<T['input']>) => T['output'];

// eslint-disable-next-line @typescript-eslint/no-empty-function
protected constructor() {}
Expand Down Expand Up @@ -73,11 +69,11 @@ export class HandlerBuilder<T extends HandlerBuilderData> {
}

build(): Handler<
T['name'] & string,
T['name'],
Wrap<Required<Pick<T, 'input' | 'output' | 'dependencies'>>>
> {
return Object.assign(this.callback, {
[$HANDLER]: {name: this.name},
}) as unknown as Handler<T['name'] & string, any>;
}) as unknown as any;
}
}
6 changes: 3 additions & 3 deletions apps/api/src/common/domainFunctions/functions.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@ declare module '@api/domain' {

type Handler<
HandlerName extends string,
THandlerInternals extends HandlerInternalMetadata,
> = (<TReturn>(
THandlerInternals extends HandlerInternalMetadata = HandlerInternalMetadata,
> = ((
dependencies: THandlerInternals['dependencies'],
metadata: HandlerCallbackMetadata,
) => TReturn) & {
) => (...args: THandlerInternals['input']) => THandlerInternals['output']) & {
[$HANDLER]: {name: HandlerName};
};

Expand Down
8 changes: 3 additions & 5 deletions apps/api/src/common/domainFunctions/handlers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import {
ComposeHandlers,
Handler,
HandlerCallbackMetadata,
HandlerInternalMetadata,
MergeHandlerDependencies,
Wrap,
} from '@api/domain';
Expand Down Expand Up @@ -51,13 +50,12 @@ export function registerHandlers<S extends Handler<string, any>[]>(
registry: HandlerRegistry,
): Wrap<ComposeHandlers<S>> {
return Object.fromEntries(
handlers.map((handler: Handler<string, HandlerInternalMetadata>) => {
handlers.map((handler: Handler<string>) => {
const metadata = getHandlerMetadata(handler);
const handlerCallback = Object.assign(
// eslint-disable-next-line @typescript-eslint/no-explicit-any
(...args: any[]) => {
return handler(dependencies, {handlers: registry.handlers})(...args);
},
(...args: any[]) =>
handler(dependencies, {handlers: registry.handlers})(...args),
{
[$HANDLER]: metadata,
},
Expand Down

0 comments on commit 3ac27fa

Please sign in to comment.