From f8b5564d2223197327cc01b48719886821b68e63 Mon Sep 17 00:00:00 2001 From: Tobias Karlsson Date: Wed, 8 Mar 2023 14:00:04 +0100 Subject: [PATCH] Replace querystring with URLSearchParams URLSearchParams has greater compatibility with browser code Created new PageOptions and LocaleOptions for easier use with URLSearchParams --- src/endpoints/changes.ts | 14 ++++++---- src/endpoints/discover.ts | 11 +++++--- src/endpoints/find.ts | 3 +-- src/endpoints/movies.ts | 55 ++++++++++++++++++++++++++------------- src/endpoints/people.ts | 20 ++++++++------ src/endpoints/search.ts | 16 +++++------- src/endpoints/tv-shows.ts | 46 ++++++++++++++++++++------------ src/types/changes.ts | 4 +-- src/types/find.ts | 3 +-- src/types/index.ts | 1 + src/types/page.ts | 8 ++++++ 11 files changed, 113 insertions(+), 68 deletions(-) create mode 100644 src/types/page.ts diff --git a/src/endpoints/changes.ts b/src/endpoints/changes.ts index 4b74652..c1d5711 100644 --- a/src/endpoints/changes.ts +++ b/src/endpoints/changes.ts @@ -1,4 +1,3 @@ -import querystring from 'querystring'; import { BaseEndpoint } from './base'; import { ChangeOptions, Changes } from '../types/changes'; @@ -9,18 +8,23 @@ export class ChangeEndpoint extends BaseEndpoint { } async movies(options?: ChangeOptions): Promise { - const params = querystring.encode(options); + const params = options + ? new URLSearchParams(Object.entries(options)).toString() + : ''; return await this.api.get(`/movie/changes?${params}`); } async tvShows(options?: ChangeOptions): Promise { - const params = querystring.stringify(options); + const params = options + ? new URLSearchParams(Object.entries(options)).toString() + : ''; return await this.api.get(`/tv/changes?${params}`); } async person(options?: ChangeOptions): Promise { - const params = querystring.stringify(options); - + const params = options + ? new URLSearchParams(Object.entries(options)).toString() + : ''; return await this.api.get(`/person/changes${params}`); } } diff --git a/src/endpoints/discover.ts b/src/endpoints/discover.ts index c039978..bc4365b 100644 --- a/src/endpoints/discover.ts +++ b/src/endpoints/discover.ts @@ -1,10 +1,9 @@ import { MovieDiscoverResult, SortOption, TvShowDiscoverResult } from '../types'; import { BaseEndpoint } from './base'; -import querystring, { ParsedUrlQueryInput } from 'querystring'; const BASE_DISCOVER = '/discover'; -interface DiscoverQueryOptions extends ParsedUrlQueryInput{ +interface DiscoverQueryOptions { language?: string; sort_by?: SortOption; page?: number; @@ -66,12 +65,16 @@ export class DiscoverEndpoint extends BaseEndpoint { } async movie(options?: MovieQueryOptions): Promise { - const params = querystring.encode(options); + const params = options + ? new URLSearchParams(Object.entries(options)).toString() + : ''; return await this.api.get(`${BASE_DISCOVER}/movie?${params}`); } async tvShow(options?: TvShowQueryOptions): Promise { - const params = querystring.encode(options); + const params = options + ? new URLSearchParams(Object.entries(options)).toString() + : ''; return await this.api.get(`${BASE_DISCOVER}/tv?${params}`); } } diff --git a/src/endpoints/find.ts b/src/endpoints/find.ts index 4df537d..d791e47 100644 --- a/src/endpoints/find.ts +++ b/src/endpoints/find.ts @@ -1,5 +1,4 @@ import { BaseEndpoint } from './base'; -import querystring from 'querystring'; import { ExternalIdOptions, FindResult } from '../types'; export class FindEndpoint extends BaseEndpoint { @@ -8,7 +7,7 @@ export class FindEndpoint extends BaseEndpoint { } async byId(externalId: string, options: ExternalIdOptions): Promise { - const params = querystring.encode(options); + const params = new URLSearchParams(Object.entries(options)).toString(); return await this.api.get(`/find/${externalId}?${params}`); } } diff --git a/src/endpoints/movies.ts b/src/endpoints/movies.ts index 92a2f7c..e967a1f 100644 --- a/src/endpoints/movies.ts +++ b/src/endpoints/movies.ts @@ -7,10 +7,12 @@ import { Images, Keywords, LatestMovie, + LocaleOptions, MovieChanges, MovieDetails, MovieLists, MoviesPlayingNow, + PageOptions, PopularMovies, Recommendations, ReleaseDates, @@ -21,7 +23,6 @@ import { Videos, WatchProviders, } from '../types'; -import querystring from 'querystring'; const BASE_MOVIE = '/movie'; @@ -39,7 +40,9 @@ export class MoviesEndpoint extends BaseEndpoint{ } async changes(id: number, options?: ChangeOptions): Promise{ - const params = querystring.encode(options); + const params = options + ? new URLSearchParams(Object.entries(options)).toString() + : ''; return await this.api.get(`${BASE_MOVIE}/${id}/changes?${params}`); } @@ -59,13 +62,17 @@ export class MoviesEndpoint extends BaseEndpoint{ return await this.api.get(`${BASE_MOVIE}/${id}/keywords`); } - async lists(id: number, options?: {page?: number}): Promise{ - const params = querystring.encode(options); + async lists(id: number, options?: PageOptions): Promise{ + const params = options + ? new URLSearchParams(Object.entries(options)).toString() + : ''; return await this.api.get(`${BASE_MOVIE}/${id}/lists?${params}`); } - async recommendations(id: number, options?: {page?: number}): Promise{ - const params = querystring.encode(options); + async recommendations(id: number, options?: PageOptions): Promise{ + const params = options + ? new URLSearchParams(Object.entries(options)).toString() + : ''; return await this.api.get(`${BASE_MOVIE}/${id}/recommendations?${params}`); } @@ -73,13 +80,17 @@ export class MoviesEndpoint extends BaseEndpoint{ return await this.api.get(`${BASE_MOVIE}/${id}/release_dates`); } - async reviews(id: number, options?: {page?: number}): Promise{ - const params = querystring.encode(options); + async reviews(id: number, options?: PageOptions): Promise{ + const params = options + ? new URLSearchParams(Object.entries(options)).toString() + : ''; return await this.api.get(`${BASE_MOVIE}/${id}/reviews?${params}`); } - async similar(id: number, options?: {page?: number}): Promise{ - const params = querystring.encode(options); + async similar(id: number, options?: PageOptions): Promise{ + const params = options + ? new URLSearchParams(Object.entries(options)).toString() + : ''; return await this.api.get(`${BASE_MOVIE}/${id}/similar?${params}`); } @@ -103,23 +114,31 @@ export class MoviesEndpoint extends BaseEndpoint{ return await this.api.get(`${BASE_MOVIE}/latest`); } - async nowPlaying(options?: {page?: number, region?: string, language?: string}): Promise{ - const params = querystring.encode(options); + async nowPlaying(options?: LocaleOptions): Promise{ + const params = options + ? new URLSearchParams(Object.entries(options)).toString() + : ''; return await this.api.get(`${BASE_MOVIE}/now_playing?${params}`); } - async popular(options?: {page?: number}): Promise{ - const params = querystring.encode(options); + async popular(options?: PageOptions): Promise{ + const params = options + ? new URLSearchParams(Object.entries(options)).toString() + : ''; return await this.api.get(`${BASE_MOVIE}/popular?${params}`); } - async topRated(options?: {page?: number, region?: string, language?: string}): Promise{ - const params = querystring.encode(options); + async topRated(options?: LocaleOptions): Promise{ + const params = options + ? new URLSearchParams(Object.entries(options)).toString() + : ''; return await this.api.get(`${BASE_MOVIE}/top_rated?${params}`); } - async upcoming(options?: {page?: number, region?: string, language?: string}): Promise{ - const params = querystring.encode(options); + async upcoming(options?: LocaleOptions): Promise{ + const params = options + ? new URLSearchParams(Object.entries(options)).toString() + : ''; return await this.api.get(`${BASE_MOVIE}/upcoming?${params}`); } } diff --git a/src/endpoints/people.ts b/src/endpoints/people.ts index d5e4f68..a17b1f6 100644 --- a/src/endpoints/people.ts +++ b/src/endpoints/people.ts @@ -1,10 +1,8 @@ -import { ChangeOptions, ExternalIds, Image, PeopleTranslations, PersonChanges, PersonCombinedCredits, PersonDetail, PersonMovieCredit, PersonTvShowCredit, PopularPersons, TaggedImages } from '../types'; +import { ChangeOptions, ExternalIds, Image, PageOptions, PeopleTranslations, PersonChanges, PersonCombinedCredits, PersonDetail, PersonMovieCredit, PersonTvShowCredit, PopularPersons, TaggedImages } from '../types'; import { BaseEndpoint } from './base'; -import querystring from 'querystring'; const BASE_PERSON = '/person'; - export class PeopleEndpoint extends BaseEndpoint { constructor(accessToken: string) { super(accessToken); @@ -15,7 +13,9 @@ export class PeopleEndpoint extends BaseEndpoint { } async changes(id: number, options? : ChangeOptions): Promise { - const params = querystring.encode(options); + const params = options == undefined + ? undefined + : new URLSearchParams(Object.entries(options)).toString(); return await this.api.get(`${BASE_PERSON}/${id}/changes?${params}`); } @@ -39,8 +39,10 @@ export class PeopleEndpoint extends BaseEndpoint { return await this.api.get<{id: number, profiles: Image[]}>(`${BASE_PERSON}/${id}/images`) } - async taggedImages(id: number, options?: {page?: number}): Promise{ - const params = querystring.encode(options); + async taggedImages(id: number, options?: PageOptions): Promise{ + const params = options == undefined + ? undefined + : new URLSearchParams(Object.entries(options)).toString(); return await this.api.get(`${BASE_PERSON}/${id}/tagged_images?${params}`); } @@ -52,8 +54,10 @@ export class PeopleEndpoint extends BaseEndpoint { return await this.api.get(`${BASE_PERSON}/latest`); } - async popular(options?: {page?: number}): Promise{ - const params = querystring.encode(options); + async popular(options?: PageOptions): Promise{ + const params = options == undefined + ? undefined + : new URLSearchParams(Object.entries(options)).toString(); return await this.api.get(`${BASE_PERSON}/popular?${params}`); } } diff --git a/src/endpoints/search.ts b/src/endpoints/search.ts index 0fc8e99..03e3207 100644 --- a/src/endpoints/search.ts +++ b/src/endpoints/search.ts @@ -1,11 +1,10 @@ import { BaseEndpoint } from './base'; -import querystring, { ParsedUrlQueryInput } from 'querystring'; import { Search } from '../types/search'; import { Collection, Company, Movie, Person, TV } from '../types'; const BASE_SEARCH = '/search'; -export interface SearchOptions extends ParsedUrlQueryInput { +export interface SearchOptions { query: string; page?: number; } @@ -31,35 +30,34 @@ export class SearchEndpoint extends BaseEndpoint { } async companies(options: SearchOptions): Promise>{ - const params = querystring.encode(options); + const params = new URLSearchParams(Object.entries(options)).toString(); return await this.api.get>(`${BASE_SEARCH}/company?${params}`); } async collections(options: SearchOptions): Promise>{ - const params = querystring.encode(options); + const params = new URLSearchParams(Object.entries(options)).toString(); return await this.api.get>(`${BASE_SEARCH}/collection?${params}`); } async keywords(options: SearchOptions): Promise>{ - const params = querystring.encode(options); + const params = new URLSearchParams(Object.entries(options)).toString(); return await this.api.get>(`${BASE_SEARCH}/keyword?${params}`); } async movies(options: MovieSearchOptions): Promise>{ - const params = querystring.encode(options); + const params = new URLSearchParams(Object.entries(options)).toString(); return await this.api.get>(`${BASE_SEARCH}/movie?${params}`); } async people(options: PeopleSearchOptions): Promise>{ - const params = querystring.encode(options); + const params = new URLSearchParams(Object.entries(options)).toString(); return await this.api.get>(`${BASE_SEARCH}/person?${params}`); } // TODO: Multi search async tvShows(options: TvSearchOptions): Promise>{ - const params = querystring.encode(options); + const params = new URLSearchParams(Object.entries(options)).toString(); return await this.api.get>(`${BASE_SEARCH}/tv?${params}`); } - } diff --git a/src/endpoints/tv-shows.ts b/src/endpoints/tv-shows.ts index 439755e..f3d807d 100644 --- a/src/endpoints/tv-shows.ts +++ b/src/endpoints/tv-shows.ts @@ -9,7 +9,9 @@ import { Images, Keywords, LatestTvShows, + LocaleOptions, OnTheAir, + PageOptions, PopularTvShows, Recommendations, Reviews, @@ -24,7 +26,6 @@ import { Videos, WatchProviders, } from '../types'; -import querystring from 'querystring'; const BASE_TV = '/tv'; @@ -42,7 +43,9 @@ export class TvShowsEndpoint extends BaseEndpoint{ } async changes(id: number, options?: ChangeOptions): Promise{ - const params = querystring.encode(options); + const params = options == undefined + ? undefined + : new URLSearchParams(Object.entries(options)).toString(); return await this.api.get(`${BASE_TV}/${id}/changes?${params}`); } @@ -74,13 +77,17 @@ export class TvShowsEndpoint extends BaseEndpoint{ return await this.api.get(`${BASE_TV}/${id}/keywords`); } - async recommendations(id: number, options?: {page?: number}): Promise{ - const params = querystring.encode(options); + async recommendations(id: number, options?: PageOptions): Promise{ + const params = options == undefined + ? undefined + : new URLSearchParams(Object.entries(options)).toString(); return await this.api.get(`${BASE_TV}/${id}/recommendations?${params}`); } - async reviews(id: number, options?: {page?: number}): Promise{ - const params = querystring.encode(options); + async reviews(id: number, options?: PageOptions): Promise{ + const params = options == undefined + ? undefined + : new URLSearchParams(Object.entries(options)).toString(); return await this.api.get(`${BASE_TV}/${id}/reviews?${params}`); } @@ -88,8 +95,10 @@ export class TvShowsEndpoint extends BaseEndpoint{ return await this.api.get(`${BASE_TV}/${id}/screened_theatrically`); } - async similar(id: number, options?: {page?: number}): Promise{ - const params = querystring.encode(options); + async similar(id: number, options?: PageOptions): Promise{ + const params = options == undefined + ? undefined + : new URLSearchParams(Object.entries(options)).toString(); return await this.api.get(`${BASE_TV}/${id}/similar?${params}`); } @@ -117,21 +126,24 @@ export class TvShowsEndpoint extends BaseEndpoint{ return await this.api.get(`${BASE_TV}/on_the_air`); } - async airingToday(options?: {page?: number, region?: string, language?: string}): Promise{ - const params = querystring.encode(options); + async airingToday(options?: LocaleOptions): Promise{ + const params = options == undefined + ? undefined + : new URLSearchParams(Object.entries(options)).toString(); return await this.api.get(`${BASE_TV}/airing_today?${params}`); } - async popular(options?: {page?: number}): Promise{ - const params = querystring.encode(options); + async popular(options?: PageOptions): Promise{ + const params = options == undefined + ? undefined + : new URLSearchParams(Object.entries(options)).toString(); return await this.api.get(`${BASE_TV}/popular?${params}`); } - async topRated(options?: {page?: number, region?: string, language?: string}): Promise{ - const params = querystring.encode(options); + async topRated(options?: LocaleOptions): Promise{ + const params = options == undefined + ? undefined + : new URLSearchParams(Object.entries(options)).toString(); return await this.api.get(`${BASE_TV}/top_rated?${params}`); } - } - - diff --git a/src/types/changes.ts b/src/types/changes.ts index 04489ea..a92187d 100644 --- a/src/types/changes.ts +++ b/src/types/changes.ts @@ -1,5 +1,3 @@ -import { ParsedUrlQueryInput } from 'querystring'; - export interface Change { id: number; adult: boolean | undefined; @@ -12,7 +10,7 @@ export interface Changes{ total_results: number; } -export interface ChangeOptions extends ParsedUrlQueryInput { +export interface ChangeOptions { end_date?: string; start_date?: string; page?: number; diff --git a/src/types/find.ts b/src/types/find.ts index a4a3b8f..035e97d 100644 --- a/src/types/find.ts +++ b/src/types/find.ts @@ -1,4 +1,3 @@ -import { ParsedUrlQueryInput } from 'querystring'; import { Episode, Media, MediaType, Movie, Person, Season, TV } from '.'; export type ExternalSource = @@ -11,7 +10,7 @@ export type ExternalSource = | 'twitter_id' | 'instagram_id'; -export interface ExternalIdOptions extends ParsedUrlQueryInput { +export interface ExternalIdOptions { external_source: ExternalSource; language?: string; } diff --git a/src/types/index.ts b/src/types/index.ts index 783be6b..681f8af 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -6,6 +6,7 @@ export * from './movies'; export * from './search'; export * from './tv-shows'; export * from './watch-providers'; +export * from './page'; export * from './people'; export * from './discover'; export * from './review'; diff --git a/src/types/page.ts b/src/types/page.ts new file mode 100644 index 0000000..5d27852 --- /dev/null +++ b/src/types/page.ts @@ -0,0 +1,8 @@ +export interface PageOptions { + page?: number; +} + +export interface LocaleOptions extends PageOptions { + region?: string; + language?: string; +}