diff --git a/package-lock.json b/package-lock.json index 32a7b6b..ac44ea6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "tmdb-ts", - "version": "0.1.4", + "version": "0.1.6", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "tmdb-ts", - "version": "0.1.4", + "version": "0.1.6", "license": "MIT", "dependencies": { "cross-fetch": "^3.1.4" diff --git a/package.json b/package.json index 69f926c..2b6db84 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tmdb-ts", - "version": "0.1.4", + "version": "0.1.6", "description": "TMDB v3 library wrapper", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/src/endpoints/changes.ts b/src/endpoints/changes.ts index 4b74652..ea4818e 100644 --- a/src/endpoints/changes.ts +++ b/src/endpoints/changes.ts @@ -1,6 +1,6 @@ -import querystring from 'querystring'; import { BaseEndpoint } from './base'; import { ChangeOptions, Changes } from '../types/changes'; +import { parseOptions } from '../utils'; export class ChangeEndpoint extends BaseEndpoint { @@ -9,18 +9,17 @@ export class ChangeEndpoint extends BaseEndpoint { } async movies(options?: ChangeOptions): Promise { - const params = querystring.encode(options); + const params = parseOptions(options); return await this.api.get(`/movie/changes?${params}`); } async tvShows(options?: ChangeOptions): Promise { - const params = querystring.stringify(options); + const params = parseOptions(options); return await this.api.get(`/tv/changes?${params}`); } async person(options?: ChangeOptions): Promise { - const params = querystring.stringify(options); - + const params = parseOptions(options); return await this.api.get(`/person/changes${params}`); } } diff --git a/src/endpoints/collections.ts b/src/endpoints/collections.ts index 386fb6d..0f1237d 100644 --- a/src/endpoints/collections.ts +++ b/src/endpoints/collections.ts @@ -1,6 +1,6 @@ import { DetailedCollection, ImageCollection, LanguageOption, Translations } from '../types'; +import { parseOptions } from '../utils'; import { BaseEndpoint } from './base'; -import querystring from 'querystring'; const BASE_COLLECTION = '/collection'; @@ -10,18 +10,17 @@ export class CollectionsEndpoint extends BaseEndpoint { } async details(id: number, options? : LanguageOption): Promise { - const params = querystring.encode(options); + const params = parseOptions(options); return await this.api.get(`${BASE_COLLECTION}/${id}?${params}`); } async images(id: number, options? : LanguageOption): Promise { - const params = querystring.encode(options); + const params = parseOptions(options); return await this.api.get(`${BASE_COLLECTION}/${id}/images?${params}`); } async translations(id: number, options? : LanguageOption): Promise { - const params = querystring.encode(options); + const params = parseOptions(options); return await this.api.get(`${BASE_COLLECTION}/${id}/translations?${params}`); } - } \ No newline at end of file diff --git a/src/endpoints/discover.ts b/src/endpoints/discover.ts index c039978..027a4f2 100644 --- a/src/endpoints/discover.ts +++ b/src/endpoints/discover.ts @@ -1,10 +1,10 @@ import { MovieDiscoverResult, SortOption, TvShowDiscoverResult } from '../types'; +import { parseOptions } from '../utils'; 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; @@ -27,7 +27,7 @@ interface DiscoverQueryOptions extends ParsedUrlQueryInput{ } interface MovieQueryOptions extends DiscoverQueryOptions{ - region?: string; + region?: string; certification_country?: string; certification?: string; 'certification.lte'?: string; @@ -66,12 +66,12 @@ export class DiscoverEndpoint extends BaseEndpoint { } async movie(options?: MovieQueryOptions): Promise { - const params = querystring.encode(options); + const params = parseOptions(options); return await this.api.get(`${BASE_DISCOVER}/movie?${params}`); } async tvShow(options?: TvShowQueryOptions): Promise { - const params = querystring.encode(options); + const params = parseOptions(options); return await this.api.get(`${BASE_DISCOVER}/tv?${params}`); } } diff --git a/src/endpoints/find.ts b/src/endpoints/find.ts index 4df537d..fcae9ec 100644 --- a/src/endpoints/find.ts +++ b/src/endpoints/find.ts @@ -1,6 +1,6 @@ import { BaseEndpoint } from './base'; -import querystring from 'querystring'; import { ExternalIdOptions, FindResult } from '../types'; +import { parseOptions } from '../utils'; export class FindEndpoint extends BaseEndpoint { constructor(accessToken: string) { @@ -8,7 +8,7 @@ export class FindEndpoint extends BaseEndpoint { } async byId(externalId: string, options: ExternalIdOptions): Promise { - const params = querystring.encode(options); + const params = parseOptions(options); return await this.api.get(`/find/${externalId}?${params}`); } } diff --git a/src/endpoints/keywords.ts b/src/endpoints/keywords.ts index 818189e..0637a28 100644 --- a/src/endpoints/keywords.ts +++ b/src/endpoints/keywords.ts @@ -1,6 +1,6 @@ import { BaseEndpoint } from './base'; -import querystring from 'querystring'; import { BelongingMovies, Keyword, KeywordsOptions } from '../types'; +import { parseOptions } from '../utils'; const BASE_Keyword = '/keyword'; @@ -14,7 +14,7 @@ export class KeywordsEndpoint extends BaseEndpoint { } async belongingMovies(keywordId : number, options?: KeywordsOptions): Promise { - const params = querystring.encode(options); + const params = parseOptions(options); return await this.api.get(`${BASE_Keyword}/${keywordId}/movies?${params}`); } } diff --git a/src/endpoints/movies.ts b/src/endpoints/movies.ts index 92a2f7c..afb92b3 100644 --- a/src/endpoints/movies.ts +++ b/src/endpoints/movies.ts @@ -6,13 +6,16 @@ import { ExternalIds, Images, Keywords, + LanguageOption, LatestMovie, MovieChanges, MovieDetails, MovieLists, MoviesPlayingNow, + PageOption, PopularMovies, Recommendations, + RegionOption, ReleaseDates, Reviews, SimilarMovies, @@ -21,7 +24,7 @@ import { Videos, WatchProviders, } from '../types'; -import querystring from 'querystring'; +import { parseOptions } from '../utils'; const BASE_MOVIE = '/movie'; @@ -39,7 +42,7 @@ export class MoviesEndpoint extends BaseEndpoint{ } async changes(id: number, options?: ChangeOptions): Promise{ - const params = querystring.encode(options); + const params = parseOptions(options); return await this.api.get(`${BASE_MOVIE}/${id}/changes?${params}`); } @@ -59,13 +62,13 @@ 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?: LanguageOption | PageOption): Promise{ + const params = parseOptions(options); 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?: PageOption): Promise{ + const params = parseOptions(options); return await this.api.get(`${BASE_MOVIE}/${id}/recommendations?${params}`); } @@ -73,13 +76,13 @@ 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?: PageOption): Promise{ + const params = parseOptions(options); 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?: PageOption): Promise{ + const params = parseOptions(options); return await this.api.get(`${BASE_MOVIE}/${id}/similar?${params}`); } @@ -103,23 +106,23 @@ 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?: PageOption & LanguageOption & RegionOption): Promise{ + const params = parseOptions(options); return await this.api.get(`${BASE_MOVIE}/now_playing?${params}`); } - async popular(options?: {page?: number}): Promise{ - const params = querystring.encode(options); + async popular(options?: PageOption): Promise{ + const params = parseOptions(options); 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?: PageOption & LanguageOption & RegionOption): Promise{ + const params = parseOptions(options); 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?: PageOption & LanguageOption & RegionOption): Promise{ + const params = parseOptions(options); return await this.api.get(`${BASE_MOVIE}/upcoming?${params}`); } } diff --git a/src/endpoints/people.ts b/src/endpoints/people.ts index d5e4f68..6da72a0 100644 --- a/src/endpoints/people.ts +++ b/src/endpoints/people.ts @@ -1,10 +1,22 @@ -import { ChangeOptions, ExternalIds, Image, PeopleTranslations, PersonChanges, PersonCombinedCredits, PersonDetail, PersonMovieCredit, PersonTvShowCredit, PopularPersons, TaggedImages } from '../types'; +import { + ChangeOptions, + ExternalIds, + Image, + PageOption, + PeopleTranslations, + PersonChanges, + PersonCombinedCredits, + PersonDetail, + PersonMovieCredit, + PersonTvShowCredit, + PopularPersons, + TaggedImages +} from '../types'; +import { parseOptions } from '../utils'; import { BaseEndpoint } from './base'; -import querystring from 'querystring'; const BASE_PERSON = '/person'; - export class PeopleEndpoint extends BaseEndpoint { constructor(accessToken: string) { super(accessToken); @@ -15,7 +27,7 @@ export class PeopleEndpoint extends BaseEndpoint { } async changes(id: number, options? : ChangeOptions): Promise { - const params = querystring.encode(options); + const params = parseOptions(options); return await this.api.get(`${BASE_PERSON}/${id}/changes?${params}`); } @@ -39,8 +51,8 @@ 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?: PageOption): Promise{ + const params = parseOptions(options); return await this.api.get(`${BASE_PERSON}/${id}/tagged_images?${params}`); } @@ -52,8 +64,8 @@ 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?: PageOption): Promise{ + const params = parseOptions(options); return await this.api.get(`${BASE_PERSON}/popular?${params}`); } } diff --git a/src/endpoints/search.ts b/src/endpoints/search.ts index 0fc8e99..7a8ab78 100644 --- a/src/endpoints/search.ts +++ b/src/endpoints/search.ts @@ -1,11 +1,11 @@ import { BaseEndpoint } from './base'; -import querystring, { ParsedUrlQueryInput } from 'querystring'; import { Search } from '../types/search'; import { Collection, Company, Movie, Person, TV } from '../types'; +import { parseOptions } from '../utils'; const BASE_SEARCH = '/search'; -export interface SearchOptions extends ParsedUrlQueryInput { +export interface SearchOptions { query: string; page?: number; } @@ -31,35 +31,34 @@ export class SearchEndpoint extends BaseEndpoint { } async companies(options: SearchOptions): Promise>{ - const params = querystring.encode(options); + const params = parseOptions(options); return await this.api.get>(`${BASE_SEARCH}/company?${params}`); } async collections(options: SearchOptions): Promise>{ - const params = querystring.encode(options); + const params = parseOptions(options); return await this.api.get>(`${BASE_SEARCH}/collection?${params}`); } async keywords(options: SearchOptions): Promise>{ - const params = querystring.encode(options); + const params = parseOptions(options); return await this.api.get>(`${BASE_SEARCH}/keyword?${params}`); } async movies(options: MovieSearchOptions): Promise>{ - const params = querystring.encode(options); + const params = parseOptions(options); return await this.api.get>(`${BASE_SEARCH}/movie?${params}`); } async people(options: PeopleSearchOptions): Promise>{ - const params = querystring.encode(options); + const params = parseOptions(options); return await this.api.get>(`${BASE_SEARCH}/person?${params}`); } // TODO: Multi search async tvShows(options: TvSearchOptions): Promise>{ - const params = querystring.encode(options); + const params = parseOptions(options); 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..8b1fb2f 100644 --- a/src/endpoints/tv-shows.ts +++ b/src/endpoints/tv-shows.ts @@ -8,10 +8,13 @@ import { ExternalIds, Images, Keywords, + LanguageOption, LatestTvShows, OnTheAir, + PageOption, PopularTvShows, Recommendations, + RegionOption, Reviews, ScreenedTheatrically, SeasonDetails, @@ -24,7 +27,7 @@ import { Videos, WatchProviders, } from '../types'; -import querystring from 'querystring'; +import { parseOptions } from '../utils'; const BASE_TV = '/tv'; @@ -42,7 +45,7 @@ export class TvShowsEndpoint extends BaseEndpoint{ } async changes(id: number, options?: ChangeOptions): Promise{ - const params = querystring.encode(options); + const params = parseOptions(options); return await this.api.get(`${BASE_TV}/${id}/changes?${params}`); } @@ -74,13 +77,13 @@ 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?: PageOption): Promise{ + const params = parseOptions(options); 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?: PageOption): Promise{ + const params = parseOptions(options); return await this.api.get(`${BASE_TV}/${id}/reviews?${params}`); } @@ -88,8 +91,8 @@ 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?: PageOption): Promise{ + const params = parseOptions(options); return await this.api.get(`${BASE_TV}/${id}/similar?${params}`); } @@ -117,21 +120,18 @@ 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?: PageOption & LanguageOption & RegionOption): Promise{ + const params = parseOptions(options); return await this.api.get(`${BASE_TV}/airing_today?${params}`); } - async popular(options?: {page?: number}): Promise{ - const params = querystring.encode(options); + async popular(options?: PageOption & LanguageOption & RegionOption): Promise{ + const params = parseOptions(options); 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?: PageOption & LanguageOption & RegionOption): Promise{ + const params = parseOptions(options); 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/keywords.ts b/src/types/keywords.ts index f820bed..6393160 100644 --- a/src/types/keywords.ts +++ b/src/types/keywords.ts @@ -1,7 +1,6 @@ -import { ParsedUrlQueryInput } from 'querystring'; import { Movie } from '.'; -export interface KeywordsOptions extends ParsedUrlQueryInput { +export interface KeywordsOptions { include_adult?: boolean; language?: string; } diff --git a/src/types/options.ts b/src/types/options.ts index 2f30fb4..13af8ff 100644 --- a/src/types/options.ts +++ b/src/types/options.ts @@ -1,9 +1,11 @@ -import { ParsedUrlQueryInput } from 'querystring'; - -export interface LanguageOption extends ParsedUrlQueryInput { - language?: string; +export interface LanguageOption { + language?: string; } -export interface PageOption extends ParsedUrlQueryInput { - page?: number; +export interface RegionOption { + region?: string; +} + +export interface PageOption { + page?: number; } diff --git a/src/utils/index.ts b/src/utils/index.ts index eb42ebf..2107f61 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -1 +1,2 @@ export * from './getImagePath'; +export * from './parseOptions'; diff --git a/src/utils/parseOptions.ts b/src/utils/parseOptions.ts new file mode 100644 index 0000000..9066db5 --- /dev/null +++ b/src/utils/parseOptions.ts @@ -0,0 +1,7 @@ +export function parseOptions( + options?: { [s: string]: any }, +): string { + return options + ? new URLSearchParams(Object.entries(options)).toString() + : ''; +}