{"version":3,"file":"index.cjs","names":["camelCase"],"sources":["../src/utils/apiURL.ts","../src/utils/caseConversion.ts","../src/utils/BaseService.ts","../src/movies/movies.ts","../src/people/people.ts","../src/tv/tv.ts","../src/genres/genres.ts","../src/configuration/configuration.ts","../src/trending/trending.ts","../src/search/search.ts","../src/discover/serializeQuery.ts","../src/discover/discover.ts","../src/utils/applyCaseMiddleware.ts","../src/index.ts"],"sourcesContent":["class ApiURL {\n  urlInstance: URL;\n  constructor(url: string) {\n    // Dummy base is required so the URL constructor accepts a relative input.\n    // We strip it back out in toString() so Client.get can resolve the path\n    // against its configured baseUrl.\n    this.urlInstance = new URL(url, 'https://placeholder.invalid/');\n  }\n\n  appendParam(key: string, value: string) {\n    this.urlInstance.searchParams.append(key, value);\n  }\n\n  toString() {\n    return this.urlInstance.pathname.replace(/^\\//, '') + this.urlInstance.search;\n  }\n\n  getURL() {\n    return this.urlInstance;\n  }\n}\n\nexport default ApiURL;\n","/**\n * Converts a camelCase string to snake_case\n * @param str The camelCase string to convert\n * @returns The snake_case version of the string\n */\nexport function camelToSnakeCase(str: string): string {\n  // Handle empty string\n  if (!str) return str;\n\n  let result = '';\n\n  for (let i = 0; i < str.length; i++) {\n    const char = str[i];\n    const prevChar = i > 0 ? str[i - 1] : '';\n    const nextChar = i < str.length - 1 ? str[i + 1] : '';\n\n    // Check if we need to insert an underscore\n    if (i > 0 && /[A-Z]/.test(char)) {\n      // Case 1: lowercase/digit followed by uppercase (camelCase -> camel_case)\n      if (/[a-z\\d]/.test(prevChar)) {\n        result += '_';\n      }\n      // Case 2: uppercase followed by uppercase+lowercase (XMLHttp -> xml_http)\n      else if (/[A-Z]/.test(prevChar) && nextChar && /[a-z]/.test(nextChar)) {\n        result += '_';\n      }\n    }\n\n    result += char.toLowerCase();\n  }\n\n  // Remove leading underscore if present\n  return result.replace(/^_/, '');\n}\n\n/**\n * Converts an array of camelCase strings to snake_case\n * @param arr The array of camelCase strings to convert\n * @returns The array with all strings converted to snake_case\n */\nexport function camelToSnakeCaseArray(arr: string[]): string[] {\n  return arr.map((item) => camelToSnakeCase(item));\n}\n","import { IApiClient } from '..';\nimport ApiURL from './apiURL';\nimport { camelToSnakeCaseArray } from './caseConversion';\n\nexport interface BaseOptions<T extends readonly string[]> {\n  include?: T;\n}\n\nexport type BaseAppendResponse<T extends readonly string[], TMap> = {\n  [K in T[number]]: K extends keyof TMap ? TMap[K] : never;\n};\n\nexport abstract class BaseService<TAppendOptions extends string, TAppendResponseMap> {\n  protected apiClient: IApiClient;\n\n  constructor(apiClient: IApiClient) {\n    this.apiClient = apiClient;\n  }\n\n  protected async getByIdWithAppendToResponse<T extends readonly TAppendOptions[], TResult = Record<string, unknown>>(\n    endpoint: string,\n    id: string | number,\n    options?: BaseOptions<T>,\n  ): Promise<TResult & BaseAppendResponse<T, TAppendResponseMap>> {\n    const { include } = options ?? {};\n\n    let appendToResponse: string | undefined;\n    if (include && include.length > 0) {\n      // Convert camelCase options to snake_case for the API\n      appendToResponse = camelToSnakeCaseArray([...include]).join(',');\n    }\n\n    const url = new ApiURL(endpoint.replace('{id}', id.toString()));\n    if (appendToResponse) {\n      url.appendParam('append_to_response', appendToResponse);\n    }\n\n    try {\n      return await this.apiClient.get<TResult & BaseAppendResponse<T, TAppendResponseMap>>(url.toString());\n    } catch (error) {\n      if (error instanceof Error) {\n        // Enhanced error handling for append_to_response specific errors\n        if (error.message.includes('append_to_response')) {\n          throw new Error(`Failed to fetch ${endpoint} with append_to_response options: ${error.message}`, {\n            cause: error,\n          });\n        }\n        throw new Error(`Failed to fetch ${endpoint}: ${error.message}`, { cause: error });\n      }\n      throw new Error(`Failed to fetch ${endpoint}: Something went wrong`, { cause: error });\n    }\n  }\n}\n","import {\n  AppendOptions,\n  AppendResponse,\n  MovieCredits,\n  Movie,\n  Options,\n  PopularMovies,\n  Reviews,\n  SimilarMovies,\n  Videos,\n  Images,\n  Recommendations,\n  Keywords,\n  Translations,\n  ReleaseDates,\n  ExternalIds,\n  AccountStates,\n  AlternativeTitles,\n  WatchProviders,\n} from './types/MovieCast.js';\nimport type { NowPlayingMovies, UpcomingMovies, MovieLists } from './types/Lists';\nimport type { MovieChanges } from './types/Changes';\nimport { BaseService } from '../utils/BaseService';\nimport ApiURL from '../utils/apiURL';\n\ntype MovieAppendResponseMap = {\n  credits: MovieCredits;\n  reviews: Reviews;\n  similar: SimilarMovies;\n  videos: Videos;\n  images: Images;\n  recommendations: Recommendations;\n  keywords: Keywords;\n  translations: Translations;\n  releaseDates: ReleaseDates;\n  externalIds: ExternalIds;\n  accountStates: AccountStates;\n};\n\nclass Movies extends BaseService<AppendOptions, MovieAppendResponseMap> {\n  async getPopular(page?: number) {\n    const url = new ApiURL('movie/popular');\n    if (page) url.appendParam('page', page.toString());\n    return this.apiClient.get<PopularMovies>(url.toString());\n  }\n\n  async getTopRated(page?: number): Promise<PopularMovies> {\n    const url = new ApiURL('movie/top_rated');\n    if (page) url.appendParam('page', page.toString());\n    return this.apiClient.get<PopularMovies>(url.toString());\n  }\n\n  async getById<T extends AppendOptions[]>(\n    id: string | number,\n    options?: Options<T>,\n  ): Promise<Movie & AppendResponse<T>> {\n    return this.getByIdWithAppendToResponse<T, Movie>('movie/{id}', id, options);\n  }\n\n  async getSimilar(id: string | number, page?: number): Promise<SimilarMovies> {\n    const url = new ApiURL(`movie/${id.toString()}/similar`);\n    if (page) url.appendParam('page', page.toString());\n    return this.apiClient.get<SimilarMovies>(url.toString());\n  }\n\n  async getCredits(id: string | number): Promise<MovieCredits> {\n    const url = new ApiURL(`movie/${id.toString()}/credits`);\n    return this.apiClient.get<MovieCredits>(url.toString());\n  }\n\n  async getDetails(id: string | number): Promise<Movie> {\n    const url = new ApiURL(`movie/${id.toString()}`);\n    return this.apiClient.get<Movie>(url.toString());\n  }\n\n  /**\n   * @deprecated Use {@link Movies.getCredits} instead. This duplicate will be removed in a future major release.\n   */\n  async getMovieCredits(id: string | number): Promise<MovieCredits> {\n    return this.getCredits(id);\n  }\n\n  async getNowPlaying(page?: number): Promise<NowPlayingMovies> {\n    const url = new ApiURL('movie/now_playing');\n    if (page) url.appendParam('page', page.toString());\n    return this.apiClient.get<NowPlayingMovies>(url.toString());\n  }\n\n  async getUpcoming(page?: number): Promise<UpcomingMovies> {\n    const url = new ApiURL('movie/upcoming');\n    if (page) url.appendParam('page', page.toString());\n    return this.apiClient.get<UpcomingMovies>(url.toString());\n  }\n\n  async getLatest(): Promise<Movie> {\n    const url = new ApiURL('movie/latest');\n    return this.apiClient.get<Movie>(url.toString());\n  }\n\n  async getImages(id: string | number): Promise<Images> {\n    const url = new ApiURL(`movie/${id.toString()}/images`);\n    return this.apiClient.get<Images>(url.toString());\n  }\n\n  async getVideos(id: string | number): Promise<Videos> {\n    const url = new ApiURL(`movie/${id.toString()}/videos`);\n    return this.apiClient.get<Videos>(url.toString());\n  }\n\n  async getReviews(id: string | number, page?: number): Promise<Reviews> {\n    const url = new ApiURL(`movie/${id.toString()}/reviews`);\n    if (page) url.appendParam('page', page.toString());\n    return this.apiClient.get<Reviews>(url.toString());\n  }\n\n  async getRecommendations(id: string | number, page?: number): Promise<Recommendations> {\n    const url = new ApiURL(`movie/${id.toString()}/recommendations`);\n    if (page) url.appendParam('page', page.toString());\n    return this.apiClient.get<Recommendations>(url.toString());\n  }\n\n  async getKeywords(id: string | number): Promise<Keywords> {\n    const url = new ApiURL(`movie/${id.toString()}/keywords`);\n    return this.apiClient.get<Keywords>(url.toString());\n  }\n\n  async getReleaseDates(id: string | number): Promise<ReleaseDates> {\n    const url = new ApiURL(`movie/${id.toString()}/release_dates`);\n    return this.apiClient.get<ReleaseDates>(url.toString());\n  }\n\n  async getTranslations(id: string | number): Promise<Translations> {\n    const url = new ApiURL(`movie/${id.toString()}/translations`);\n    return this.apiClient.get<Translations>(url.toString());\n  }\n\n  async getExternalIds(id: string | number): Promise<ExternalIds> {\n    const url = new ApiURL(`movie/${id.toString()}/external_ids`);\n    return this.apiClient.get<ExternalIds>(url.toString());\n  }\n\n  async getAlternativeTitles(id: string | number): Promise<AlternativeTitles> {\n    const url = new ApiURL(`movie/${id.toString()}/alternative_titles`);\n    return this.apiClient.get<AlternativeTitles>(url.toString());\n  }\n\n  async getWatchProviders(id: string | number): Promise<WatchProviders> {\n    const url = new ApiURL(`movie/${id.toString()}/watch/providers`);\n    return this.apiClient.get<WatchProviders>(url.toString());\n  }\n\n  async getLists(id: string | number, page?: number): Promise<MovieLists> {\n    const url = new ApiURL(`movie/${id.toString()}/lists`);\n    if (page) url.appendParam('page', page.toString());\n    return this.apiClient.get<MovieLists>(url.toString());\n  }\n\n  async getChanges(id: string | number, startDate?: string, endDate?: string, page?: number): Promise<MovieChanges> {\n    const url = new ApiURL(`movie/${id.toString()}/changes`);\n    if (startDate) url.appendParam('start_date', startDate);\n    if (endDate) url.appendParam('end_date', endDate);\n    if (page) url.appendParam('page', page.toString());\n    return this.apiClient.get<MovieChanges>(url.toString());\n  }\n\n  async getAccountStates(id: string | number): Promise<AccountStates> {\n    const url = new ApiURL(`movie/${id.toString()}/account_states`);\n    return this.apiClient.get<AccountStates>(url.toString());\n  }\n}\n\nexport default Movies;\n","import {\n  AppendOptions,\n  Options,\n  Person,\n  PopularPeople,\n  TvCredits,\n  CombinedCredits,\n  Images,\n  ExternalIds,\n  TaggedImages,\n  Translations,\n} from './types/Person';\nimport { MovieCredits } from './types/MovieCredit';\nimport type { PersonChanges } from './types/Changes';\nimport ApiURL from '../utils/apiURL';\nimport { BaseService, BaseAppendResponse } from '../utils/BaseService';\n\ntype PeopleAppendResponseMap = {\n  movieCredits: MovieCredits;\n  tvCredits: TvCredits;\n  combinedCredits: CombinedCredits;\n  images: Images;\n  latest: Person;\n  externalIds: ExternalIds;\n  taggedImages: TaggedImages;\n  translations: Translations;\n};\n\nclass People extends BaseService<AppendOptions, PeopleAppendResponseMap> {\n  async getPopular(page?: number): Promise<PopularPeople> {\n    const url = new ApiURL('person/popular');\n    if (page) {\n      url.appendParam('page', page.toString());\n    }\n    const response = await this.apiClient.get<PopularPeople>(url.toString());\n    return response;\n  }\n\n  async getById<T extends AppendOptions[]>(\n    id: string | number,\n    options?: Options<T>,\n  ): Promise<Person & BaseAppendResponse<T, PeopleAppendResponseMap>> {\n    return this.getByIdWithAppendToResponse<T, Person>('person/{id}', id, options);\n  }\n\n  async getMovieCredits(id: string | number): Promise<MovieCredits> {\n    const response = await this.apiClient.get<MovieCredits>(`person/${id.toString()}/movie_credits`);\n    return response;\n  }\n\n  async getTvCredits(id: string | number): Promise<TvCredits> {\n    const response = await this.apiClient.get<TvCredits>(`person/${id.toString()}/tv_credits`);\n    return response;\n  }\n\n  async getCombinedCredits(id: string | number): Promise<CombinedCredits> {\n    const response = await this.apiClient.get<CombinedCredits>(`person/${id.toString()}/combined_credits`);\n    return response;\n  }\n\n  async getImages(id: string | number): Promise<Images> {\n    const response = await this.apiClient.get<Images>(`person/${id.toString()}/images`);\n    return response;\n  }\n\n  /**\n   * @deprecated Use getImages instead\n   * @param id string | number\n   * @returns Promise<Images>\n   */\n  async getTaggedImages(id: string | number): Promise<Images> {\n    const response = await this.apiClient.get<Images>(`3/person/${id.toString()}/tagged_images`);\n    return response;\n  }\n\n  async getLatest(): Promise<Person> {\n    const url = new ApiURL('person/latest');\n    return this.apiClient.get<Person>(url.toString());\n  }\n\n  async getChanges(id: string | number, startDate?: string, endDate?: string, page?: number): Promise<PersonChanges> {\n    const url = new ApiURL(`person/${id.toString()}/changes`);\n    if (startDate) url.appendParam('start_date', startDate);\n    if (endDate) url.appendParam('end_date', endDate);\n    if (page) url.appendParam('page', page.toString());\n    return this.apiClient.get<PersonChanges>(url.toString());\n  }\n\n  async getExternalIds(id: string | number): Promise<ExternalIds> {\n    const url = new ApiURL(`person/${id.toString()}/external_ids`);\n    return this.apiClient.get<ExternalIds>(url.toString());\n  }\n\n  async getTranslations(id: string | number): Promise<Translations> {\n    const url = new ApiURL(`person/${id.toString()}/translations`);\n    return this.apiClient.get<Translations>(url.toString());\n  }\n}\n\nexport default People;\n","import {\n  TvAppendOptions,\n  Options,\n  TvShow,\n  PopularTvShows,\n  TopRatedTvShows,\n  AiringTodayTvShows,\n  OnTheAirTvShows,\n  TvCredits,\n  AggregateCredits,\n  TvExternalIds,\n  TvImages,\n  TvVideos,\n  TvReviews,\n  SimilarTvShows,\n  TvRecommendations,\n  TvKeywords,\n  TvTranslations,\n  TvContentRatings,\n  TvWatchProviders,\n  TvAlternativeTitles,\n  TvEpisodeGroups,\n  TvScreenedTheatrically,\n  TvLists,\n  TvChanges,\n  TvAccountStates,\n} from './types/TvShow';\nimport ApiURL from '../utils/apiURL';\nimport { BaseService, BaseAppendResponse } from '../utils/BaseService';\n\ntype TvAppendResponseMap = {\n  credits: TvCredits;\n  aggregateCredits: AggregateCredits;\n  reviews: TvReviews;\n  similar: SimilarTvShows;\n  videos: TvVideos;\n  images: TvImages;\n  recommendations: TvRecommendations;\n  keywords: TvKeywords;\n  translations: TvTranslations;\n  contentRatings: TvContentRatings;\n  externalIds: TvExternalIds;\n  accountStates: TvAccountStates;\n  watchProviders: TvWatchProviders;\n  alternativeTitles: TvAlternativeTitles;\n  episodeGroups: TvEpisodeGroups;\n  screenedTheatrically: TvScreenedTheatrically;\n  lists: TvLists;\n  changes: TvChanges;\n};\n\nclass Tv extends BaseService<TvAppendOptions, TvAppendResponseMap> {\n  async getPopular(page?: number): Promise<PopularTvShows> {\n    const url = new ApiURL('tv/popular');\n    if (page) {\n      url.appendParam('page', page.toString());\n    }\n    const response = await this.apiClient.get<PopularTvShows>(url.toString());\n    return response;\n  }\n\n  async getTopRated(page?: number): Promise<TopRatedTvShows> {\n    const url = new ApiURL('tv/top_rated');\n    if (page) {\n      url.appendParam('page', page.toString());\n    }\n    const response = await this.apiClient.get<TopRatedTvShows>(url.toString());\n    return response;\n  }\n\n  async getAiringToday(page?: number): Promise<AiringTodayTvShows> {\n    const url = new ApiURL('tv/airing_today');\n    if (page) {\n      url.appendParam('page', page.toString());\n    }\n    const response = await this.apiClient.get<AiringTodayTvShows>(url.toString());\n    return response;\n  }\n\n  async getOnTheAir(page?: number): Promise<OnTheAirTvShows> {\n    const url = new ApiURL('tv/on_the_air');\n    if (page) {\n      url.appendParam('page', page.toString());\n    }\n    const response = await this.apiClient.get<OnTheAirTvShows>(url.toString());\n    return response;\n  }\n\n  async getLatest(): Promise<TvShow> {\n    const response = await this.apiClient.get<TvShow>('tv/latest');\n    return response;\n  }\n\n  async getById<T extends TvAppendOptions[]>(\n    id: string | number,\n    options?: Options<T>,\n  ): Promise<TvShow & BaseAppendResponse<T, TvAppendResponseMap>> {\n    return this.getByIdWithAppendToResponse<T, TvShow>('tv/{id}', id, options);\n  }\n\n  async getCredits(id: string | number): Promise<TvCredits> {\n    const url = new ApiURL(`tv/${id.toString()}/credits`);\n    const response = await this.apiClient.get<TvCredits>(url.toString());\n    return response;\n  }\n\n  async getAggregateCredits(id: string | number): Promise<AggregateCredits> {\n    const url = new ApiURL(`tv/${id.toString()}/aggregate_credits`);\n    const response = await this.apiClient.get<AggregateCredits>(url.toString());\n    return response;\n  }\n\n  async getExternalIds(id: string | number): Promise<TvExternalIds> {\n    const url = new ApiURL(`tv/${id.toString()}/external_ids`);\n    const response = await this.apiClient.get<TvExternalIds>(url.toString());\n    return response;\n  }\n\n  async getImages(id: string | number): Promise<TvImages> {\n    const url = new ApiURL(`tv/${id.toString()}/images`);\n    const response = await this.apiClient.get<TvImages>(url.toString());\n    return response;\n  }\n\n  async getVideos(id: string | number): Promise<TvVideos> {\n    const url = new ApiURL(`tv/${id.toString()}/videos`);\n    const response = await this.apiClient.get<TvVideos>(url.toString());\n    return response;\n  }\n\n  async getReviews(id: string | number, page?: number): Promise<TvReviews> {\n    const url = new ApiURL(`tv/${id.toString()}/reviews`);\n    if (page) {\n      url.appendParam('page', page.toString());\n    }\n    const response = await this.apiClient.get<TvReviews>(url.toString());\n    return response;\n  }\n\n  async getSimilar(id: string | number, page?: number): Promise<SimilarTvShows> {\n    const url = new ApiURL(`tv/${id.toString()}/similar`);\n    if (page) {\n      url.appendParam('page', page.toString());\n    }\n    const response = await this.apiClient.get<SimilarTvShows>(url.toString());\n    return response;\n  }\n\n  async getRecommendations(id: string | number, page?: number): Promise<TvRecommendations> {\n    const url = new ApiURL(`tv/${id.toString()}/recommendations`);\n    if (page) {\n      url.appendParam('page', page.toString());\n    }\n    const response = await this.apiClient.get<TvRecommendations>(url.toString());\n    return response;\n  }\n\n  async getKeywords(id: string | number): Promise<TvKeywords> {\n    const url = new ApiURL(`tv/${id.toString()}/keywords`);\n    const response = await this.apiClient.get<TvKeywords>(url.toString());\n    return response;\n  }\n\n  async getTranslations(id: string | number): Promise<TvTranslations> {\n    const url = new ApiURL(`tv/${id.toString()}/translations`);\n    const response = await this.apiClient.get<TvTranslations>(url.toString());\n    return response;\n  }\n\n  async getContentRatings(id: string | number): Promise<TvContentRatings> {\n    const url = new ApiURL(`tv/${id.toString()}/content_ratings`);\n    const response = await this.apiClient.get<TvContentRatings>(url.toString());\n    return response;\n  }\n\n  async getWatchProviders(id: string | number): Promise<TvWatchProviders> {\n    const url = new ApiURL(`tv/${id.toString()}/watch/providers`);\n    const response = await this.apiClient.get<TvWatchProviders>(url.toString());\n    return response;\n  }\n\n  async getAlternativeTitles(id: string | number): Promise<TvAlternativeTitles> {\n    const url = new ApiURL(`tv/${id.toString()}/alternative_titles`);\n    const response = await this.apiClient.get<TvAlternativeTitles>(url.toString());\n    return response;\n  }\n\n  async getEpisodeGroups(id: string | number): Promise<TvEpisodeGroups> {\n    const url = new ApiURL(`tv/${id.toString()}/episode_groups`);\n    const response = await this.apiClient.get<TvEpisodeGroups>(url.toString());\n    return response;\n  }\n\n  async getScreenedTheatrically(id: string | number): Promise<TvScreenedTheatrically> {\n    const url = new ApiURL(`tv/${id.toString()}/screened_theatrically`);\n    const response = await this.apiClient.get<TvScreenedTheatrically>(url.toString());\n    return response;\n  }\n\n  async getLists(id: string | number, page?: number): Promise<TvLists> {\n    const url = new ApiURL(`tv/${id.toString()}/lists`);\n    if (page) {\n      url.appendParam('page', page.toString());\n    }\n    const response = await this.apiClient.get<TvLists>(url.toString());\n    return response;\n  }\n\n  async getChanges(id: string | number, startDate?: string, endDate?: string, page?: number): Promise<TvChanges> {\n    const url = new ApiURL(`tv/${id.toString()}/changes`);\n    if (startDate) {\n      url.appendParam('start_date', startDate);\n    }\n    if (endDate) {\n      url.appendParam('end_date', endDate);\n    }\n    if (page) {\n      url.appendParam('page', page.toString());\n    }\n    const response = await this.apiClient.get<TvChanges>(url.toString());\n    return response;\n  }\n\n  async getAccountStates(id: string | number): Promise<TvAccountStates> {\n    const url = new ApiURL(`tv/${id.toString()}/account_states`);\n    const response = await this.apiClient.get<TvAccountStates>(url.toString());\n    return response;\n  }\n}\n\nexport default Tv;\n","import type { IApiClient } from '..';\nimport ApiURL from '../utils/apiURL';\nimport type { GenreList } from './types/Genre';\n\nclass Genres {\n  constructor(private readonly apiClient: IApiClient) {}\n\n  async movies(): Promise<GenreList> {\n    const url = new ApiURL('genre/movie/list');\n    return this.apiClient.get<GenreList>(url.toString());\n  }\n\n  async tv(): Promise<GenreList> {\n    const url = new ApiURL('genre/tv/list');\n    return this.apiClient.get<GenreList>(url.toString());\n  }\n}\n\nexport default Genres;\n","import type { IApiClient } from '..';\nimport ApiURL from '../utils/apiURL';\nimport type {\n  ConfigurationDetails,\n  CountryConfig,\n  LanguageConfig,\n  JobConfig,\n  TimezoneConfig,\n} from './types/Configuration';\n\nclass Configuration {\n  constructor(private readonly apiClient: IApiClient) {}\n\n  async details(): Promise<ConfigurationDetails> {\n    const url = new ApiURL('configuration');\n    return this.apiClient.get<ConfigurationDetails>(url.toString());\n  }\n\n  async countries(): Promise<CountryConfig[]> {\n    const url = new ApiURL('configuration/countries');\n    return this.apiClient.get<CountryConfig[]>(url.toString());\n  }\n\n  async languages(): Promise<LanguageConfig[]> {\n    const url = new ApiURL('configuration/languages');\n    return this.apiClient.get<LanguageConfig[]>(url.toString());\n  }\n\n  async jobs(): Promise<JobConfig[]> {\n    const url = new ApiURL('configuration/jobs');\n    return this.apiClient.get<JobConfig[]>(url.toString());\n  }\n\n  async primaryTranslations(): Promise<string[]> {\n    const url = new ApiURL('configuration/primary_translations');\n    return this.apiClient.get<string[]>(url.toString());\n  }\n\n  async timezones(): Promise<TimezoneConfig[]> {\n    const url = new ApiURL('configuration/timezones');\n    return this.apiClient.get<TimezoneConfig[]>(url.toString());\n  }\n}\n\nexport default Configuration;\n","import type { IApiClient } from '..';\nimport ApiURL from '../utils/apiURL';\nimport type {\n  TrendingWindow,\n  TrendingAllResponse,\n  TrendingMoviesResponse,\n  TrendingTvResponse,\n  TrendingPeopleResponse,\n} from './types/Trending';\n\nclass Trending {\n  constructor(private readonly apiClient: IApiClient) {}\n\n  async all(window: TrendingWindow): Promise<TrendingAllResponse> {\n    const url = new ApiURL(`trending/all/${window}`);\n    return this.apiClient.get<TrendingAllResponse>(url.toString());\n  }\n\n  async movies(window: TrendingWindow): Promise<TrendingMoviesResponse> {\n    const url = new ApiURL(`trending/movie/${window}`);\n    return this.apiClient.get<TrendingMoviesResponse>(url.toString());\n  }\n\n  async tv(window: TrendingWindow): Promise<TrendingTvResponse> {\n    const url = new ApiURL(`trending/tv/${window}`);\n    return this.apiClient.get<TrendingTvResponse>(url.toString());\n  }\n\n  async people(window: TrendingWindow): Promise<TrendingPeopleResponse> {\n    const url = new ApiURL(`trending/person/${window}`);\n    return this.apiClient.get<TrendingPeopleResponse>(url.toString());\n  }\n}\n\nexport default Trending;\n","import type { IApiClient } from '..';\nimport ApiURL from '../utils/apiURL';\nimport type {\n  BaseSearchOptions,\n  MultiSearchResponse,\n  MovieSearchOptions,\n  MovieSearchResponse,\n  TvSearchOptions,\n  TvSearchResponse,\n  PeopleSearchOptions,\n  PeopleSearchResponse,\n  KeywordSearchResponse,\n  CompanySearchResponse,\n  CollectionSearchResponse,\n} from './types/Search';\n\nfunction applyBaseSearchParams(url: ApiURL, query: string, opts?: BaseSearchOptions): void {\n  url.appendParam('query', query);\n  if (opts?.page) url.appendParam('page', opts.page.toString());\n  if (opts?.includeAdult !== undefined) url.appendParam('include_adult', String(opts.includeAdult));\n}\n\nclass Search {\n  constructor(private readonly apiClient: IApiClient) {}\n\n  async multi(query: string, opts?: BaseSearchOptions): Promise<MultiSearchResponse> {\n    const url = new ApiURL('search/multi');\n    applyBaseSearchParams(url, query, opts);\n    return this.apiClient.get<MultiSearchResponse>(url.toString());\n  }\n\n  async movies(query: string, opts?: MovieSearchOptions): Promise<MovieSearchResponse> {\n    const url = new ApiURL('search/movie');\n    applyBaseSearchParams(url, query, opts);\n    if (opts?.region) url.appendParam('region', opts.region);\n    if (opts?.year !== undefined) url.appendParam('year', opts.year.toString());\n    if (opts?.primaryReleaseYear !== undefined)\n      url.appendParam('primary_release_year', opts.primaryReleaseYear.toString());\n    return this.apiClient.get<MovieSearchResponse>(url.toString());\n  }\n\n  async tv(query: string, opts?: TvSearchOptions): Promise<TvSearchResponse> {\n    const url = new ApiURL('search/tv');\n    applyBaseSearchParams(url, query, opts);\n    if (opts?.firstAirDateYear !== undefined) url.appendParam('first_air_date_year', opts.firstAirDateYear.toString());\n    return this.apiClient.get<TvSearchResponse>(url.toString());\n  }\n\n  async people(query: string, opts?: PeopleSearchOptions): Promise<PeopleSearchResponse> {\n    const url = new ApiURL('search/person');\n    applyBaseSearchParams(url, query, opts);\n    return this.apiClient.get<PeopleSearchResponse>(url.toString());\n  }\n\n  async keywords(query: string, opts?: BaseSearchOptions): Promise<KeywordSearchResponse> {\n    const url = new ApiURL('search/keyword');\n    applyBaseSearchParams(url, query, opts);\n    return this.apiClient.get<KeywordSearchResponse>(url.toString());\n  }\n\n  async companies(query: string, opts?: BaseSearchOptions): Promise<CompanySearchResponse> {\n    const url = new ApiURL('search/company');\n    applyBaseSearchParams(url, query, opts);\n    return this.apiClient.get<CompanySearchResponse>(url.toString());\n  }\n\n  async collections(query: string, opts?: BaseSearchOptions): Promise<CollectionSearchResponse> {\n    const url = new ApiURL('search/collection');\n    applyBaseSearchParams(url, query, opts);\n    return this.apiClient.get<CollectionSearchResponse>(url.toString());\n  }\n}\n\nexport default Search;\n","import ApiURL from '../utils/apiURL';\nimport { camelToSnakeCase } from '../utils/caseConversion';\n\nexport function serializeDiscoverQuery(url: ApiURL, query?: Record<string, unknown>): void {\n  if (!query) return;\n  for (const [key, value] of Object.entries(query)) {\n    if (value === undefined || value === null) continue;\n    const snakeKey = camelToSnakeCase(key);\n    if (Array.isArray(value)) {\n      url.appendParam(snakeKey, value.map(String).join(','));\n      continue;\n    }\n    if (typeof value === 'boolean') {\n      url.appendParam(snakeKey, value ? 'true' : 'false');\n      continue;\n    }\n    if (typeof value === 'string' || typeof value === 'number') {\n      url.appendParam(snakeKey, String(value));\n    }\n  }\n}\n","import type { IApiClient } from '..';\nimport ApiURL from '../utils/apiURL';\nimport { serializeDiscoverQuery } from './serializeQuery';\nimport type { MovieDiscoverQuery, TvDiscoverQuery, DiscoverMoviesResponse, DiscoverTvResponse } from './types/Discover';\n\nclass Discover {\n  constructor(private readonly apiClient: IApiClient) {}\n\n  async movies(query?: MovieDiscoverQuery): Promise<DiscoverMoviesResponse> {\n    const url = new ApiURL('discover/movie');\n    serializeDiscoverQuery(url, query as Record<string, unknown> | undefined);\n    return this.apiClient.get<DiscoverMoviesResponse>(url.toString());\n  }\n\n  async tv(query?: TvDiscoverQuery): Promise<DiscoverTvResponse> {\n    const url = new ApiURL('discover/tv');\n    serializeDiscoverQuery(url, query as Record<string, unknown> | undefined);\n    return this.apiClient.get<DiscoverTvResponse>(url.toString());\n  }\n}\n\nexport default Discover;\n","function applyCaseMiddleware<T>(input: T, caseFunction: (input: string) => string): T {\n  if (Array.isArray(input)) {\n    return input.map((i: unknown) => applyCaseMiddleware(i, caseFunction)) as T;\n  } else if (typeof input === 'object' && input !== null) {\n    const newObj: Record<string, unknown> = {};\n    for (const key in input) {\n      if (Object.prototype.hasOwnProperty.call(input, key)) {\n        newObj[caseFunction(key)] = applyCaseMiddleware(input[key], caseFunction);\n      }\n    }\n    return newObj as T;\n  } else {\n    return input;\n  }\n}\n\nexport { applyCaseMiddleware };\n","import Movies from './movies/movies';\nimport People from './people/people';\nimport Tv from './tv/tv';\nimport Genres from './genres/genres';\nimport Configuration from './configuration/configuration';\nimport Trending from './trending/trending';\nimport Search from './search/search';\nimport Discover from './discover/discover';\nimport { camelCase } from 'change-case';\nimport { applyCaseMiddleware } from './utils/applyCaseMiddleware';\nimport { Person } from './people/types/Person';\nimport { MovieCredits } from './people/types/MovieCredit';\nimport { TvShow, TvCredits } from './tv/types/TvShow';\n\ninterface IConfig {\n  apiKey: string;\n  version?: string;\n  baseUrl?: string;\n  language?: string;\n}\n\nexport interface IApiClient {\n  get: <T = unknown>(url: string, options?: RequestInit) => Promise<T>;\n}\n\nclass Client {\n  public apiClient: IApiClient;\n  movies: Movies;\n  people: People;\n  tv: Tv;\n  genres: Genres;\n  configuration: Configuration;\n  trending: Trending;\n  search: Search;\n  discover: Discover;\n  private readonly version: string;\n  private readonly baseUrl: string;\n  private readonly language: string;\n\n  constructor(private readonly config: IConfig) {\n    this.version = config.version ?? '3';\n    this.baseUrl = config.baseUrl ?? 'https://api.themoviedb.org';\n    this.language = config.language ?? 'en-US';\n\n    this.apiClient = {\n      get: async <T = unknown>(pathname: string, options: RequestInit = {}) => {\n        if (!this.config.apiKey) {\n          throw new Error('No API key provided');\n        }\n        const url = new URL(pathname, `${this.baseUrl}/${this.version}/`);\n        url.searchParams.append('language', this.language);\n\n        const response = await fetch(url, {\n          method: options.method,\n          body: options.body,\n          credentials: options.credentials,\n          headers: {\n            'Content-Type': 'application/json',\n            Authorization: `Bearer ${this.config.apiKey}`,\n            ...(options.headers\n              ? Object.fromEntries(Object.entries(options.headers).filter(([, value]) => value !== undefined))\n              : {}),\n          },\n        });\n\n        if (!response.ok) {\n          if (response.status === 401) {\n            throw new Error('Invalid API key');\n          }\n          if (response.status === 404) {\n            throw new Error('Resource not found');\n          }\n          if (response.status === 429) {\n            throw new Error('Too many requests');\n          }\n          throw new Error(`HTTP error! status: ${String(response.status)}`);\n        }\n\n        let data: unknown = await response.json();\n        data = applyCaseMiddleware(data, camelCase);\n        return data as T;\n      },\n    };\n    this.movies = new Movies(this.apiClient);\n    this.people = new People(this.apiClient);\n    this.tv = new Tv(this.apiClient);\n    this.genres = new Genres(this.apiClient);\n    this.configuration = new Configuration(this.apiClient);\n    this.trending = new Trending(this.apiClient);\n    this.search = new Search(this.apiClient);\n    this.discover = new Discover(this.apiClient);\n  }\n\n  getVersion(): string {\n    return this.version;\n  }\n\n  getLanguage(): string {\n    return this.language;\n  }\n}\n\nexport { Client };\nexport type { Person, MovieCredits, TvShow, TvCredits };\nexport type { Genre, GenreList } from './genres/types/Genre';\nexport type {\n  ConfigurationDetails,\n  CountryConfig,\n  LanguageConfig,\n  JobConfig,\n  TimezoneConfig,\n} from './configuration/types/Configuration';\nexport type {\n  TrendingWindow,\n  TrendingMulti,\n  TrendingAllResponse,\n  TrendingMoviesResponse,\n  TrendingTvResponse,\n  TrendingPeopleResponse,\n} from './trending/types/Trending';\nexport type {\n  BaseSearchOptions,\n  MovieSearchOptions,\n  TvSearchOptions,\n  PeopleSearchOptions,\n  MultiSearchResult,\n  MultiSearchResponse,\n  MovieSearchResponse,\n  TvSearchResponse,\n  PeopleSearchResponse,\n  KeywordSearchResponse,\n  CompanySearchResponse,\n  CollectionSearchResponse,\n} from './search/types/Search';\nexport type {\n  SortBy,\n  BaseDiscoverQuery,\n  MovieDiscoverQuery,\n  TvDiscoverQuery,\n  DiscoverMoviesResponse,\n  DiscoverTvResponse,\n} from './discover/types/Discover';\n"],"mappings":"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"}