{"version":3,"file":"index.cjs","names":["appendToResponse: string | undefined","ApiURL","ApiURL","ApiURL","newObj: Record<string, unknown>","config: IConfig","data: unknown","camelCase","Movies","People","Tv"],"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/utils/applyCaseMiddleware.ts","../src/index.ts"],"sourcesContent":["class ApiURL {\n  urlInstance: URL;\n  constructor(url: string) {\n    this.urlInstance = new URL(url, 'https://api.themoviedb.org/3/');\n  }\n\n  appendParam(key: string, value: string) {\n    this.urlInstance.searchParams.append(key, value);\n  }\n\n  toString() {\n    return this.urlInstance.toString();\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        }\n        throw new Error(`Failed to fetch ${endpoint}: ${error.message}`);\n      }\n      throw new Error(`Failed to fetch ${endpoint}: Something went wrong`);\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} from './types/MovieCast.js';\nimport { BaseService } from '../utils/BaseService';\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    return await this.apiClient.get<PopularMovies>('movie/popular?page=' + (page?.toString() ?? '1'));\n  }\n\n  async getTopRated() {\n    const response = await this.apiClient.get('movie/top_rated');\n    return response;\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) {\n    const response = await this.apiClient.get(`movie/${id.toString()}/similar`);\n    return response;\n  }\n\n  async getCredits(id: string | number) {\n    const response = await this.apiClient.get<MovieCredits>(`movie/${id.toString()}/credits`);\n    return response;\n  }\n\n  async getDetails(id: string | number) {\n    const response = await this.apiClient.get<Movie>(`movie/${id.toString()}`);\n    return response;\n  }\n\n  async getMovieCredits(id: string | number) {\n    const response = await this.apiClient.get<MovieCredits>(`movie/${id.toString()}/credits`);\n    return response;\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 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\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","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 { 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  private readonly version: string;\n  private readonly baseUrl: string;\n  private readonly language: string;\n\n  constructor(private 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  }\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 };\n"],"mappings":"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"}