You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
2.3 KiB
59 lines
2.3 KiB
import { Module as NestModule } from '@nestjs/common';
|
|
import { Test, TestingModuleBuilder } from '@nestjs/testing';
|
|
import { GeocodingProvider } from './integration/geocoding/types';
|
|
import { WeatherProvider } from './integration/weather/types';
|
|
import { PackagesService } from './packages.service';
|
|
import { PackagesRepository } from './storage/types';
|
|
|
|
export const packagesRepositoryDependency = Symbol('packages repository');
|
|
export const geocodingProviderDependency = Symbol('geocoding provider');
|
|
export const weatherProviderDependency = Symbol('weather provider');
|
|
export const packagesServiceDependency = Symbol('packages service');
|
|
|
|
export type Dependencies = {
|
|
[packagesRepositoryDependency]: PackagesRepository;
|
|
[geocodingProviderDependency]: GeocodingProvider;
|
|
[weatherProviderDependency]: WeatherProvider;
|
|
[packagesServiceDependency]: Pick<PackagesService, keyof PackagesService>;
|
|
};
|
|
|
|
export type Dependency<T extends keyof Dependencies> = Dependencies[T];
|
|
|
|
type ProviderImplementation<TProvider> =
|
|
| {
|
|
useValue: TProvider;
|
|
}
|
|
| {
|
|
// Quick workaround instead of extracting relevant types from @nestjs/types
|
|
// (which are not really very different from `any` anyway)
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
useClass: new (...args: any[]) => TProvider;
|
|
}
|
|
| {
|
|
// Quick workaround instead of extracting relevant types from @nestjs/types
|
|
// (which are not really very different from `any` anyway)
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
useFactory: (...args: any[]) => TProvider | Promise<TProvider>;
|
|
};
|
|
|
|
type ProviderDictionary = {
|
|
[TKey in keyof Dependencies]: {
|
|
provide: TKey;
|
|
} & ProviderImplementation<Dependencies[TKey]>;
|
|
};
|
|
|
|
type Provider = ProviderDictionary[keyof ProviderDictionary];
|
|
|
|
type ModuleMetadata = {
|
|
// Quick workaround instead of extracting relevant types from @nestjs/types
|
|
// (which are not really very different from `any` anyway)
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
controllers?: any[];
|
|
providers?: Provider[];
|
|
};
|
|
|
|
export const createTestingModule: (
|
|
metadata: ModuleMetadata,
|
|
) => TestingModuleBuilder = Test.createTestingModule.bind(Test);
|
|
|
|
export const Module: (metadata: ModuleMetadata) => ClassDecorator = NestModule;
|
|
|