Skip to content

Commit

Permalink
fix: better inference for Geocoder type
Browse files Browse the repository at this point in the history
  • Loading branch information
alanpoulain committed Jun 27, 2021
1 parent e0d1095 commit c994e40
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 23 deletions.
48 changes: 48 additions & 0 deletions spec/UniversalGeocoder.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import UniversalGeocoder, { GeocoderName } from "UniversalGeocoder";

describe("Universal Geocoder main module", () => {
it("can geocode with a specified geocoder", (done) => {
const useGeocoder = () =>
UniversalGeocoder.createGeocoder({
provider: "nominatim",
useSsl: true,
userAgent: "Universal Geocoder Example",
});
const geocoder = useGeocoder();
expect(geocoder).toBeDefined();
geocoder.geocode("1600 Pennsylvania Ave, Washington, DC", (results) => {
expect(results).toBeDefined();
done();
});
});

it("can geocode with an unspecified geocoder", (done) => {
const useGeocoder = (geocoderName: string) =>
UniversalGeocoder.createGeocoder({
provider: geocoderName,
useSsl: true,
userAgent: "Universal Geocoder Example",
});
const geocoder = useGeocoder("nominatim");
expect(geocoder).toBeDefined();
geocoder?.geocode("1600 Pennsylvania Ave, Washington, DC", (results) => {
expect(results).toBeDefined();
done();
});
});

it("can geocode with a restricted unspecified geocoder", (done) => {
const useGeocoder = (geocoderName: GeocoderName) =>
UniversalGeocoder.createGeocoder({
provider: geocoderName,
useSsl: true,
userAgent: "Universal Geocoder Example",
});
const geocoder = useGeocoder("nominatim");
expect(geocoder).toBeDefined();
geocoder.geocode("1600 Pennsylvania Ave, Washington, DC", (results) => {
expect(results).toBeDefined();
done();
});
});
});
16 changes: 2 additions & 14 deletions src/GeocoderProviderFactory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -115,18 +115,6 @@ export interface YandexGeocoderProviderFactoryOptions
provider: "yandex";
}

export type GeocoderProvider =
| BingProvider
| ChainProvider
| GeoPluginProvider
| GoogleMapsProvider
| LocationIQProvider
| MapboxProvider
| MapQuestProvider
| NominatimProvider
| OpenCageProvider
| YandexProvider;

export default class ProviderFactory {
public static createProvider(
options: "chain" | ChainGeocoderProviderFactoryOptions
Expand Down Expand Up @@ -177,7 +165,7 @@ export default class ProviderFactory {

public static createProvider<O extends RestrictedProviderOptionInterface>(
options: ProviderName | O
): GeocoderProvider;
): ProviderInterface<Geocoded>;

public static createProvider<O extends ProviderOptionInterface>(
options: string | O
Expand All @@ -195,7 +183,7 @@ export default class ProviderFactory {
*/
public static createProvider<O extends RestrictedProviderOptionInterface>(
options: ProviderName | O
): GeocoderProvider | undefined {
): ProviderInterface<Geocoded> | undefined {
const createProviderOptions = {
...defaultProviderOptions,
...(typeof options === "string" ? { provider: options } : options),
Expand Down
9 changes: 4 additions & 5 deletions src/UniversalGeocoder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,11 @@ import ProviderFactory, {
RestrictedProviderOptionInterface,
YandexGeocoderProviderFactoryOptions,
} from "GeocoderProviderFactory";
import type {
ProviderName as GeocoderName,
GeocoderProvider as Geocoder,
} from "GeocoderProviderFactory";
import type { ProviderName as GeocoderName } from "GeocoderProviderFactory";

export type Geocoder = ProviderInterface<Geocoded>;

export type { GeocoderName, Geocoder };
export type { GeocoderName };

export default class UniversalGeocoder {
public version = "0.1.0";
Expand Down
6 changes: 2 additions & 4 deletions src/provider/ProviderInterface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,16 +31,14 @@ export type GeocodedResultsCallback<G extends Geocoded> = (
export type ErrorCallback = (responseError: ResponseError) => void;

export default interface ProviderInterface<G extends Geocoded> {
geocode(
query: string | GeocodeQuery | GeocodeQueryObject
): Promise<Geocoded[]>;
geocode(query: string | GeocodeQuery | GeocodeQueryObject): Promise<G[]>;
geocode(
query: string | GeocodeQuery | GeocodeQueryObject,
callback: GeocodedResultsCallback<G>,
errorCallback?: ErrorCallback
): void;

geodecode(query: ReverseQuery | ReverseQueryObject): Promise<Geocoded[]>;
geodecode(query: ReverseQuery | ReverseQueryObject): Promise<G[]>;
geodecode(
query: ReverseQuery | ReverseQueryObject,
callback: GeocodedResultsCallback<G>,
Expand Down

0 comments on commit c994e40

Please sign in to comment.