What3Words module for NestJS. It wraps up @what3words/api package into convenient NestJS module.
Yarn
yarn add nestjs-what3words
NPM
npm install nestjs-what3words --save
It is possible to register What3Words module synchronously and asynchronously.
For registering module synchronously use register()
method, which expects object with key
property. Example:
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { What3WordsModule } from 'nestjs-what3words';
@Module({
imports: [What3WordsModule.register({ key: 'YOUR API KEY' })],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
When you need to resolve asynchronous dependencies, you can use registerAsync()
method.
useClass
useClass
property accepts class which implements What3WordsOptionsFactory
interface. For example:
class What3WordConfig implements What3WordsOptionsFactory {
createWhat3WordsOptions(): ApiOptions | Promise<ApiOptions> {
return { key: 'YOUR KEY' };
}
}
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { What3WordsModule, What3WordsOptionsFactory } from 'nestjs-what3words';
import { ApiOptions } from '@what3words/api';
@Module({
imports: [What3WordsModule.registerAsync({ useClass: What3WordConfig })],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
useFactory
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { What3WordsModule } from 'nestjs-what3words';
import { ConfigService } from '@nestjs/config';
@Module({
imports: [
What3WordsModule.registerAsync({
useFactory: (configService: ConfigService) => {
return { key: configService.get('WHAT3WORDS_API_KEY') };
},
imports: [ConfigModule],
inject: [ConfigService],
}),
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
Module exposes What3WordsService
class with public methods compatible with @what3words/api:
convertToCoordinates(words: string, signal?: AbortSignal): Promise<LocationJsonResponse>;
convertToCoordinatesGeoJson(words: string, signal?: AbortSignal): Promise<LocationGeoJsonResponse>;
convertTo3wa(coordinates: api.Coordinates, language?: string, signal?: AbortSignal): Promise<LocationJsonResponse>;
convertTo3waGeoJson(coordinates: api.Coordinates, language?: string, signal?: AbortSignal): Promise<LocationGeoJsonResponse>;
availableLanguages(signal?: AbortSignal): Promise<AvailableLanguagesResponse>;
gridSection(boundingBox: api.Bounds, signal?: AbortSignal): Promise<GridSectionJsonResponse>;
gridSectionGeoJson(bbox: api.Bounds, signal?: AbortSignal): Promise<GridSectionGeoJsonResponse>;
autosuggest(input: string, options?: AutosuggestOptions, signal?: AbortSignal): Promise<AutosuggestResponse>;
autosuggestSelection(rawInput: string, selection: string, rank: number, options?: AutosuggestOptions, sourceApi?: 'text' | 'voice'): Promise<null>;
To use them, just inject What3WordService into your class. Here is an example, where we inject service, and get available languages from What3Words API.
import { Controller, Get } from '@nestjs/common';
import { What3WordsService } from 'nestjs-what3words';
import { AvailableLanguagesResponse } from '@what3words/api';
@Controller()
export class AppController {
constructor(private readonly service: What3WordsService) {}
@Get()
async getLanguages(): Promise<AvailableLanguagesResponse> {
return await this.service.availableLanguages();
}
}
Feel free to contribute!