Small Nest.js-based project
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.
 
test-assignment-parcellab/src/dependencies.ts

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;