Skip to content

Instantly share code, notes, and snippets.

@guiseek
Created October 15, 2024 14:05
Show Gist options
  • Save guiseek/8fbb2df5ec3cad320a7c518b720cbf69 to your computer and use it in GitHub Desktop.
Save guiseek/8fbb2df5ec3cad320a7c518b720cbf69 to your computer and use it in GitHub Desktop.
import {Abstract} from './abstract'
import {Type} from './type'
export type AbstractConstructorParams<T extends Type> =
ConstructorParameters<T> extends {
length: 1
}
? [Abstract<ConstructorParameters<T>[0]>]
: ConstructorParameters<T> extends {length: 2}
? [
Abstract<ConstructorParameters<T>[0]>,
Abstract<ConstructorParameters<T>[1]>
]
: ConstructorParameters<T> extends {length: 3}
? [
Abstract<ConstructorParameters<T>[0]>,
Abstract<ConstructorParameters<T>[1]>,
Abstract<ConstructorParameters<T>[2]>
]
: ConstructorParameters<T> extends {length: 4}
? [
Abstract<ConstructorParameters<T>[0]>,
Abstract<ConstructorParameters<T>[1]>,
Abstract<ConstructorParameters<T>[2]>,
Abstract<ConstructorParameters<T>[3]>
]
: ConstructorParameters<T> extends {length: 5}
? [
Abstract<ConstructorParameters<T>[0]>,
Abstract<ConstructorParameters<T>[1]>,
Abstract<ConstructorParameters<T>[2]>,
Abstract<ConstructorParameters<T>[3]>,
Abstract<ConstructorParameters<T>[4]>
]
: ConstructorParameters<T> extends {length: 6}
? [
Abstract<ConstructorParameters<T>[0]>,
Abstract<ConstructorParameters<T>[1]>,
Abstract<ConstructorParameters<T>[2]>,
Abstract<ConstructorParameters<T>[3]>,
Abstract<ConstructorParameters<T>[4]>,
Abstract<ConstructorParameters<T>[5]>
]
: ConstructorParameters<T> extends {length: 7}
? [
Abstract<ConstructorParameters<T>[0]>,
Abstract<ConstructorParameters<T>[1]>,
Abstract<ConstructorParameters<T>[2]>,
Abstract<ConstructorParameters<T>[3]>,
Abstract<ConstructorParameters<T>[4]>,
Abstract<ConstructorParameters<T>[5]>,
Abstract<ConstructorParameters<T>[6]>,
]
: ConstructorParameters<T> extends {length: 8}
? [
Abstract<ConstructorParameters<T>[0]>,
Abstract<ConstructorParameters<T>[1]>,
Abstract<ConstructorParameters<T>[2]>,
Abstract<ConstructorParameters<T>[3]>,
Abstract<ConstructorParameters<T>[4]>,
Abstract<ConstructorParameters<T>[5]>,
Abstract<ConstructorParameters<T>[6]>,
Abstract<ConstructorParameters<T>[7]>,
]
: []
export type Abstract<T = any> = abstract new (...params: any[]) => T
import {Type, TypeConstructorParams} from '@webauthn/shared-api-interfaces'
export function createFactoryProvider<T extends Type>(
constructor: T,
dependencies: TypeConstructorParams<T>
) {
return {
provide: constructor,
useFactory(...params: ConstructorParameters<T>) {
return new constructor(...params)
},
deps: dependencies,
}
}
import {
Type,
Abstract,
TypeConstructorParams,
AbstractConstructorParams,
} from '@webauthn/shared-api-interfaces'
export function createServiceProvider<A extends Abstract, T extends Type>(
constructor: A,
implementation: T,
dependencies: TypeConstructorParams<T> | AbstractConstructorParams<T>
) {
return {
provide: constructor,
useFactory(...params: ConstructorParameters<T>) {
return new implementation(...params)
},
deps: dependencies,
}
}
import {
Type,
UseCase,
AbstractConstructorParams,
} from '@webauthn/shared-api-interfaces'
export function createUseCaseProvider<
T extends Type<UseCase<unknown, unknown>>
>(useCase: T, dependencies: AbstractConstructorParams<T>) {
return {
provide: useCase,
useFactory(...params: ConstructorParameters<T>) {
return new useCase(...params)
},
deps: dependencies,
}
}
import {Type} from './type'
type TypeOr<T, O> = Type<T> | O
type TypeOrString<T> = TypeOr<T, string>
export type TypeConstructorParams<T extends Type> =
ConstructorParameters<T> extends {
length: 1
}
? [TypeOrString<ConstructorParameters<T>[0]>]
: ConstructorParameters<T> extends {length: 2}
? [
TypeOrString<ConstructorParameters<T>[0]>,
TypeOrString<ConstructorParameters<T>[1]>
]
: ConstructorParameters<T> extends {length: 3}
? [
TypeOrString<ConstructorParameters<T>[0]>,
TypeOrString<ConstructorParameters<T>[1]>,
TypeOrString<ConstructorParameters<T>[2]>
]
: ConstructorParameters<T> extends {length: 4}
? [
TypeOrString<ConstructorParameters<T>[0]>,
TypeOrString<ConstructorParameters<T>[1]>,
TypeOrString<ConstructorParameters<T>[2]>,
TypeOrString<ConstructorParameters<T>[3]>
]
: ConstructorParameters<T> extends {length: 5}
? [
TypeOrString<ConstructorParameters<T>[0]>,
TypeOrString<ConstructorParameters<T>[1]>,
TypeOrString<ConstructorParameters<T>[2]>,
TypeOrString<ConstructorParameters<T>[3]>,
TypeOrString<ConstructorParameters<T>[4]>
]
: ConstructorParameters<T> extends {length: 6}
? [
TypeOrString<ConstructorParameters<T>[0]>,
TypeOrString<ConstructorParameters<T>[1]>,
TypeOrString<ConstructorParameters<T>[2]>,
TypeOrString<ConstructorParameters<T>[3]>,
TypeOrString<ConstructorParameters<T>[4]>,
TypeOrString<ConstructorParameters<T>[5]>
]
: ConstructorParameters<T> extends {length: 7}
? [
TypeOrString<ConstructorParameters<T>[0]>,
TypeOrString<ConstructorParameters<T>[1]>,
TypeOrString<ConstructorParameters<T>[2]>,
TypeOrString<ConstructorParameters<T>[3]>,
TypeOrString<ConstructorParameters<T>[4]>,
TypeOrString<ConstructorParameters<T>[5]>,
TypeOrString<ConstructorParameters<T>[6]>
]
: ConstructorParameters<T> extends {length: 8}
? [
TypeOrString<ConstructorParameters<T>[0]>,
TypeOrString<ConstructorParameters<T>[1]>,
TypeOrString<ConstructorParameters<T>[2]>,
TypeOrString<ConstructorParameters<T>[3]>,
TypeOrString<ConstructorParameters<T>[4]>,
TypeOrString<ConstructorParameters<T>[5]>,
TypeOrString<ConstructorParameters<T>[6]>,
TypeOrString<ConstructorParameters<T>[7]>
]
: ConstructorParameters<T> extends {length: 9}
? [
TypeOrString<ConstructorParameters<T>[0]>,
TypeOrString<ConstructorParameters<T>[1]>,
TypeOrString<ConstructorParameters<T>[2]>,
TypeOrString<ConstructorParameters<T>[3]>,
TypeOrString<ConstructorParameters<T>[4]>,
TypeOrString<ConstructorParameters<T>[5]>,
TypeOrString<ConstructorParameters<T>[6]>,
TypeOrString<ConstructorParameters<T>[7]>,
TypeOrString<ConstructorParameters<T>[8]>
]
: ConstructorParameters<T> extends {length: 10}
? [
TypeOrString<ConstructorParameters<T>[0]>,
TypeOrString<ConstructorParameters<T>[1]>,
TypeOrString<ConstructorParameters<T>[2]>,
TypeOrString<ConstructorParameters<T>[3]>,
TypeOrString<ConstructorParameters<T>[4]>,
TypeOrString<ConstructorParameters<T>[5]>,
TypeOrString<ConstructorParameters<T>[6]>,
TypeOrString<ConstructorParameters<T>[7]>,
TypeOrString<ConstructorParameters<T>[8]>,
TypeOrString<ConstructorParameters<T>[9]>
]
: ConstructorParameters<T> extends {length: 11}
? [
TypeOrString<ConstructorParameters<T>[0]>,
TypeOrString<ConstructorParameters<T>[1]>,
TypeOrString<ConstructorParameters<T>[2]>,
TypeOrString<ConstructorParameters<T>[3]>,
TypeOrString<ConstructorParameters<T>[4]>,
TypeOrString<ConstructorParameters<T>[5]>,
TypeOrString<ConstructorParameters<T>[6]>,
TypeOrString<ConstructorParameters<T>[7]>,
TypeOrString<ConstructorParameters<T>[8]>,
TypeOrString<ConstructorParameters<T>[9]>,
TypeOrString<ConstructorParameters<T>[10]>
]
: ConstructorParameters<T> extends {length: 12}
? [
TypeOrString<ConstructorParameters<T>[0]>,
TypeOrString<ConstructorParameters<T>[1]>,
TypeOrString<ConstructorParameters<T>[2]>,
TypeOrString<ConstructorParameters<T>[3]>,
TypeOrString<ConstructorParameters<T>[4]>,
TypeOrString<ConstructorParameters<T>[5]>,
TypeOrString<ConstructorParameters<T>[6]>,
TypeOrString<ConstructorParameters<T>[7]>,
TypeOrString<ConstructorParameters<T>[8]>,
TypeOrString<ConstructorParameters<T>[9]>,
TypeOrString<ConstructorParameters<T>[10]>,
TypeOrString<ConstructorParameters<T>[11]>
]
: never
export interface Type<T = any> extends ReturnType<FunctionConstructor> {
new (...params: any[]): T
}
import {Observable} from 'rxjs'
export interface UseCase<I, O> {
execute(input: I): Promise<O> | Observable<O>
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment