From 4d10f6ca5217fd08f7432a31074c5f096eb5cf03 Mon Sep 17 00:00:00 2001 From: Justin Poehnelt Date: Thu, 26 Mar 2020 14:06:21 -0700 Subject: [PATCH] fix: serialize date to seconds and not milliseconds (#376) --- e2e/timezone.test.ts | 6 +++--- src/directions.ts | 23 ++++++++++++----------- src/distance.ts | 21 +++++++++++---------- src/serialize.test.ts | 21 ++++++++++++++++----- src/serialize.ts | 10 +++++++++- src/timezone.test.ts | 8 +++++++- src/timezone.ts | 7 ++++--- 7 files changed, 62 insertions(+), 34 deletions(-) diff --git a/e2e/timezone.test.ts b/e2e/timezone.test.ts index ec8f03d265..18f4fdeb7a 100644 --- a/e2e/timezone.test.ts +++ b/e2e/timezone.test.ts @@ -1,9 +1,9 @@ import { timezone } from "../src/timezone"; -test("elevation should call axios correctly", async () => { +test("elevation should get an ok response", async () => { const params = { - location: { lat: 35, lng: -110 }, - timestamp: 0, + location: "30, 50", + timestamp: new Date(), language: "en" as const, key: process.env.GOOGLE_MAPS_API_KEY }; diff --git a/src/directions.ts b/src/directions.ts index 897d986ad5..e83bef0858 100644 --- a/src/directions.ts +++ b/src/directions.ts @@ -1,20 +1,21 @@ +import { AxiosInstance, AxiosRequestConfig, AxiosResponse } from "axios"; import { DirectionsRoute, GeocodedWaypoint, - TrafficModel, - TransitRoutingPreference, - TravelRestriction, - LatLng, Language, - UnitSystem, + LatLng, + RequestParams, + ResponseData, + TrafficModel, TransitMode, + TransitRoutingPreference, TravelMode, - ResponseData, - RequestParams + TravelRestriction, + UnitSystem } from "./common"; -import { AxiosInstance, AxiosRequestConfig, AxiosResponse } from "axios"; +import { latLngToString, serializer, toTimestamp } from "./serialize"; + import { defaultAxiosInstance } from "./client"; -import { serializer, latLngToString } from "./serialize"; export interface DirectionsRequest extends Partial { params: { @@ -176,8 +177,8 @@ export const defaultParamsSerializer = serializer({ origin: latLngToString, destination: latLngToString, waypoints: o => o.map(latLngToString), - arrival_time: Number, - departure_time: Number + arrival_time: toTimestamp, + departure_time: toTimestamp }); export function directions( diff --git a/src/distance.ts b/src/distance.ts index 09c249efa5..916b0b30a5 100644 --- a/src/distance.ts +++ b/src/distance.ts @@ -1,18 +1,19 @@ +import { AxiosInstance, AxiosRequestConfig, AxiosResponse } from "axios"; import { DistanceMatrixRow, - TrafficModel, - TransitRoutingPreference, - TravelRestriction, LatLng, - UnitSystem, + RequestParams, + ResponseData, + TrafficModel, TransitMode, + TransitRoutingPreference, TravelMode, - ResponseData, - RequestParams + TravelRestriction, + UnitSystem } from "./common"; -import { AxiosInstance, AxiosRequestConfig, AxiosResponse } from "axios"; +import { latLngToString, serializer, toTimestamp } from "./serialize"; + import { defaultAxiosInstance } from "./client"; -import { serializer, latLngToString } from "./serialize"; export interface DistanceMatrixRequest extends Partial { params: { @@ -155,8 +156,8 @@ export const defaultUrl = export const defaultParamsSerializer = serializer({ origins: o => o.map(latLngToString), destinations: o => o.map(latLngToString), - arrival_time: Number, - departure_time: Number + arrival_time: toTimestamp, + departure_time: toTimestamp }); export function distancematrix( diff --git a/src/serialize.test.ts b/src/serialize.test.ts index 5809b0b9dd..76d71653cc 100644 --- a/src/serialize.test.ts +++ b/src/serialize.test.ts @@ -1,12 +1,13 @@ +import { LatLng, LatLngLiteral } from "./common"; import { + latLngArrayToStringMaybeEncoded, + latLngBoundsToString, latLngToString, - serializer, objectToString, - latLngBoundsToString, - latLngArrayToStringMaybeEncoded, - toLatLngLiteral + serializer, + toLatLngLiteral, + toTimestamp } from "./serialize"; -import { LatLngLiteral, LatLng } from "./common"; test("latLngToString is correct", () => { expect(latLngToString("")).toBe(""); @@ -78,3 +79,13 @@ test("toLatLngLiteral", () => { toLatLngLiteral({} as LatLngLiteral); }).toThrow(TypeError); }); + +test("toTimestamp", () => { + expect(toTimestamp(100)).toEqual(100); + + const dt = new Date(); + const seconds = Number(dt) / 1000 + expect(toTimestamp(dt)).toEqual(seconds); + +}); + diff --git a/src/serialize.ts b/src/serialize.ts index 4550c1ab4e..d6d17e2432 100644 --- a/src/serialize.ts +++ b/src/serialize.ts @@ -1,6 +1,7 @@ import { LatLng, LatLngBounds, LatLngLiteral } from "./common"; -import { stringify as qs } from "query-string"; + import { encodePath } from "./util"; +import { stringify as qs } from "query-string"; const separator = "|"; @@ -96,3 +97,10 @@ export function serializer( return qs(params, queryStringOptions); }; } + +export function toTimestamp(o: number | Date) { + if (o instanceof Date) { + return Number(o) / 1000; + } + return o +} diff --git a/src/timezone.test.ts b/src/timezone.test.ts index c7945f2845..51b1b6e17b 100644 --- a/src/timezone.test.ts +++ b/src/timezone.test.ts @@ -1,5 +1,6 @@ +import { defaultParamsSerializer, defaultUrl, timezone } from "./timezone"; + import axios from "axios"; -import { timezone, defaultParamsSerializer, defaultUrl } from "./timezone"; jest.mock("axios"); @@ -25,3 +26,8 @@ test("elevation should call axios correctly", () => { url: defaultUrl }); }); + +test("serializer should handle date object", () => { + const dt = new Date(); + expect(defaultParamsSerializer({timestamp: dt})).toEqual(`timestamp=${Number(dt)/1000}`) +}); diff --git a/src/timezone.ts b/src/timezone.ts index 229501bf8e..521f3f3a93 100644 --- a/src/timezone.ts +++ b/src/timezone.ts @@ -1,7 +1,8 @@ -import { LatLng, Language, ResponseData, RequestParams } from "./common"; import { AxiosInstance, AxiosRequestConfig, AxiosResponse } from "axios"; +import { Language, LatLng, RequestParams, ResponseData } from "./common"; +import { latLngToString, serializer, toTimestamp } from "./serialize"; + import { defaultAxiosInstance } from "./client"; -import { serializer, latLngToString } from "./serialize"; export interface TimeZoneRequest extends Partial { params: { @@ -55,7 +56,7 @@ export interface TimeZoneResponse extends AxiosResponse { export const defaultUrl = "https://maps.googleapis.com/maps/api/timezone/json"; export const defaultParamsSerializer = serializer({ - timestamp: Number, + timestamp: toTimestamp, location: latLngToString }); export function timezone(