{"version":3,"file":"yamusic-sdk.modern.mjs","sources":["../src/BaseApi.ts","../src/account/Account.api.ts","../src/utils/ResponseValidator.ts","../src/utils/ResponseDeserializer.ts","../src/albums/Albums.api.ts","../src/artists/Artists.api.ts","../src/playlists/Playlists.api.ts","../src/tracks/Tracks.api.ts","../src/users/Users.api.ts","../src/search/Search.api.ts","../src/genres/Genres.api.ts","../src/feed/Feed.api.ts","../src/YaMusicSDK.ts"],"sourcesContent":["import { YaMusicSDK } from './YaMusicSDK';\n\ntype Query = NodeJS.Dict<\n  | string\n  | number\n  | boolean\n  | readonly string[]\n  | readonly number[]\n  | readonly boolean[]\n  | null\n>;\n\nexport class BaseApi {\n  constructor(protected sdk: YaMusicSDK) {}\n\n  protected async getRequest<R>(\n    url: string,\n    args?: { query?: Query },\n  ): Promise<R> {\n    return await this.sdk.makeRequest<R>('GET', url, args);\n  }\n\n  protected async postRequest<R, B = unknown>(\n    url: string,\n    args?: {\n      body?: B;\n      formData?: FormData;\n      contentType?: string;\n    },\n  ): Promise<R> {\n    return await this.sdk.makeRequest<R>('POST', url, args);\n  }\n\n  protected async putRequest<R, B = unknown>(\n    url: string,\n    args?: {\n      body?: B;\n      formData?: FormData;\n      contentType?: string;\n    },\n  ): Promise<R> {\n    return await this.sdk.makeRequest<R>('PUT', url, args);\n  }\n\n  protected async deleteRequest<R, B = unknown>(\n    url: string,\n    args?: {\n      body?: B;\n      formData?: FormData;\n      contentType?: string;\n    },\n  ): Promise<R> {\n    return await this.sdk.makeRequest<R>('DELETE', url, args);\n  }\n}\n","import { BaseApi } from '../BaseApi';\nimport { AccountSettings, AccountStatus } from './Account.types';\n\nexport class AccountApi extends BaseApi {\n  public async status(): Promise<AccountStatus> {\n    return this.getRequest<AccountStatus>(`account/status`);\n  }\n\n  public async settings(): Promise<AccountSettings> {\n    return this.getRequest<AccountSettings>(`account/settings`);\n  }\n\n  // TODO Currently fields not updating, but modified data updates\n  public async setSettings(body: unknown): Promise<AccountSettings> {\n    return this.postRequest<AccountSettings, unknown>(`account/settings`, {\n      body: body,\n    });\n  }\n}\n","export default class DefaultResponseValidator {\n  public async validateResponse(response: Response): Promise<void> {\n    switch (response.status) {\n      default:\n        if (!response.status.toString().startsWith('20')) {\n          const body = await response.text();\n          throw new Error(\n            `Unrecognised response code: ${response.status} - ${response.statusText}. Body: ${body}`,\n          );\n        }\n    }\n  }\n}\n","import { Nullable } from './Nullable';\n\nexport default class DefaultResponseDeserializer {\n  public async deserialize<R>(response: Response): Promise<Nullable<R>> {\n    const text = await response.text();\n\n    if (text.length > 0) {\n      const json = JSON.parse(text);\n      return json.result as R;\n    }\n\n    return null;\n  }\n}\n","import { BaseApi } from '../BaseApi';\nimport { Album, AlbumWithTracks } from './Albums.types';\n\nexport class AlbumsApi extends BaseApi {\n  public album(args: { uid: number | string }): Promise<Album> {\n    return this.getRequest<Album>(`albums/${args.uid}`);\n  }\n\n  public albums(args: { uid: (number | string)[] }): Promise<Album[]> {\n    return this.getRequest<Album[]>(`albums`, {\n      query: {\n        albumIds: args.uid.toString(),\n      },\n    });\n  }\n\n  public albumWithTracks(args: {\n    uid: number | string;\n  }): Promise<AlbumWithTracks> {\n    return this.getRequest<AlbumWithTracks>(`albums/${args.uid}/with-tracks`);\n  }\n}\n","import { BaseApi } from '../BaseApi';\nimport {\n  ArtistAlbums,\n  ArtistDetailed,\n  ArtistResponse,\n  ArtistTracks,\n} from './Artists.types';\n\nexport class ArtistsApi extends BaseApi {\n  public artist(args: { uid: number | string }): Promise<ArtistResponse> {\n    return this.getRequest<ArtistResponse>(`artists/${args.uid}`);\n  }\n\n  public artists(args: {\n    uid: (number | string)[];\n  }): Promise<ArtistDetailed[]> {\n    return this.getRequest<ArtistDetailed[]>(`artists`, {\n      query: {\n        artistIds: args.uid.toString(),\n      },\n    });\n  }\n\n  public artistTracks(args: {\n    uid: number | string;\n    page?: number;\n    pageSize?: number;\n  }): Promise<ArtistTracks> {\n    return this.getRequest<ArtistTracks>(`artists/${args.uid}/tracks`, {\n      query: {\n        page: args.page,\n        pageSize: args.pageSize,\n      },\n    });\n  }\n\n  public artistAlbums(args: {\n    uid: number | string;\n    page?: number;\n    pageSize?: number;\n  }): Promise<ArtistAlbums> {\n    return this.getRequest<ArtistAlbums>(`artists/${args.uid}/direct-albums`, {\n      query: {\n        page: args.page,\n        pageSize: args.pageSize,\n      },\n    });\n  }\n}\n","import { BaseApi } from '../BaseApi';\nimport {\n  Playlist,\n  PlaylistRecommendations,\n  PlaylistVisibility,\n  PlaylistWithTracks,\n} from './Playlists.types';\n\nexport class PlaylistsApi extends BaseApi {\n  public createPlaylist(args: {\n    loginOrId: string | number;\n    title: string;\n    visibility: PlaylistVisibility;\n  }) {\n    const formData = new FormData();\n    formData.append('title', args.title);\n    formData.append('visibility', args.visibility);\n\n    return this.postRequest<Playlist>(\n      `users/${args.loginOrId}/playlists/create`,\n      {\n        formData: formData,\n      },\n    );\n  }\n\n  public deletePlaylist(args: {\n    loginOrId: string | number;\n    kind: number | string;\n  }): Promise<string> {\n    return this.postRequest(\n      `users/${args.loginOrId}/playlists/${args.kind}/delete`,\n    );\n  }\n\n  public updatePlaylistName(args: {\n    loginOrId: string | number;\n    kind: number | string;\n    newName: string;\n  }): Promise<Playlist> {\n    const formData = new FormData();\n    formData.append('value', args.newName);\n\n    return this.postRequest<Playlist>(\n      `users/${args.loginOrId}/playlists/${args.kind}/name`,\n      {\n        formData: formData,\n      },\n    );\n  }\n\n  public updatePlaylistVisibility(args: {\n    loginOrId: string | number;\n    kind: number | string;\n    newVisibility: PlaylistVisibility;\n  }): Promise<Playlist> {\n    const formData = new FormData();\n    formData.append('value', args.newVisibility);\n\n    return this.postRequest<Playlist>(\n      `users/${args.loginOrId}/playlists/${args.kind}/visibility`,\n      {\n        formData: formData,\n      },\n    );\n  }\n\n  public playlist(args: {\n    loginOrId: string | number;\n    kind: number | string;\n  }): Promise<PlaylistWithTracks> {\n    return this.getRequest<PlaylistWithTracks>(\n      `users/${args.loginOrId}/playlists/${args.kind}`,\n    );\n  }\n\n  public recommendations(args: {\n    loginOrId: string | number;\n    kind: number | string;\n  }): Promise<PlaylistRecommendations> {\n    return this.getRequest<PlaylistRecommendations>(\n      `users/${args.loginOrId}/playlists/${args.kind}/recommendations`,\n    );\n  }\n}\n","import { BaseApi } from '../BaseApi';\nimport {\n  SimilarTracks,\n  Track,\n  TrackDownloadInfo,\n  TrackSupplement,\n} from './Track.types';\n\nexport class TracksApi extends BaseApi {\n  public track(args: { uid: number | string }): Promise<Track> {\n    return this.getRequest<Track>(`tracks/${args.uid}`);\n  }\n\n  public tracks(args: { uid: (number | string)[] }): Promise<Track[]> {\n    return this.getRequest<Track[]>(`tracks`, {\n      query: {\n        trackIds: args.uid.toString(),\n      },\n    });\n  }\n\n  public similar(args: { uid: number | string }): Promise<SimilarTracks> {\n    return this.getRequest<SimilarTracks>(`tracks/${args.uid}/similar`);\n  }\n\n  public supplement(args: { uid: number | string }): Promise<TrackSupplement> {\n    return this.getRequest<TrackSupplement>(`tracks/${args.uid}/supplement`);\n  }\n\n  public downloadInfo(args: {\n    uid: number | string;\n  }): Promise<TrackDownloadInfo[]> {\n    return this.getRequest<TrackDownloadInfo[]>(\n      `tracks/${args.uid}/download-info`,\n    );\n  }\n}\n","import { BaseApi } from '../BaseApi';\nimport {\n  User,\n  UserLikedAlbum,\n  UserLikedArtist,\n  UserLikedPlaylist,\n  UserLikedTracks,\n  UserPlaylist,\n} from './User.types';\nimport {\n  PlaylistWithTrackIds,\n  PlaylistWithTracks,\n} from '../playlists/Playlists.types';\n\nexport class UsersApi extends BaseApi {\n  public info(args: { loginOrId: string | number }): Promise<User> {\n    return this.getRequest<User>(`users/${args.loginOrId}`);\n  }\n\n  public playlists(args: {\n    loginOrId: string | number;\n  }): Promise<UserPlaylist[]> {\n    return this.getRequest<UserPlaylist[]>(\n      `users/${args.loginOrId}/playlists/list`,\n    );\n  }\n\n  public playlist(args: {\n    loginOrId: number | string;\n    kind: number | string;\n  }): Promise<PlaylistWithTracks> {\n    return this.getRequest<PlaylistWithTracks>(\n      `users/${args.loginOrId}/playlists/${args.kind}`,\n    );\n  }\n\n  public playlistsByIds(args: {\n    loginOrId: string | number;\n    kinds: (number | string)[];\n  }): Promise<PlaylistWithTrackIds[]> {\n    return this.getRequest<PlaylistWithTrackIds[]>(\n      `users/${args.loginOrId}/playlists`,\n      { query: { kinds: args.kinds.toString() } },\n    );\n  }\n\n  public likedPlaylists(args: {\n    loginOrId: string | number;\n  }): Promise<UserLikedPlaylist[]> {\n    return this.getRequest<UserLikedPlaylist[]>(\n      `users/${args.loginOrId}/likes/playlist`,\n    );\n  }\n\n  public likedArtists(args: {\n    loginOrId: string | number;\n  }): Promise<UserLikedArtist[]> {\n    return this.getRequest<UserLikedArtist[]>(\n      `users/${args.loginOrId}/likes/artists`,\n    );\n  }\n\n  public likedAlbums(args: {\n    loginOrId: string | number;\n  }): Promise<UserLikedAlbum[]> {\n    return this.getRequest<UserLikedAlbum[]>(\n      `users/${args.loginOrId}/likes/albums`,\n    );\n  }\n\n  public likedTracks(args: {\n    loginOrId: string | number;\n  }): Promise<UserLikedTracks> {\n    return this.getRequest<UserLikedTracks>(\n      `users/${args.loginOrId}/likes/tracks`,\n    );\n  }\n}\n","import { BaseApi } from '../BaseApi';\nimport { Search, SearchSuggest, SearchType } from './Search.types';\n\nexport class SearchApi extends BaseApi {\n  public search(args: {\n    text: string;\n    page: number;\n    type: SearchType;\n    nocorrect?: boolean;\n    playlistInBest?: boolean;\n  }): Promise<Search> {\n    return this.getRequest<Search>(`search`, {\n      query: {\n        text: args.text,\n        page: args.page,\n        type: args.type,\n        nocorrect: args.nocorrect,\n        playlistInBest: args.playlistInBest,\n      },\n    });\n  }\n\n  public searchSuggest(part: string): Promise<SearchSuggest> {\n    return this.getRequest<SearchSuggest>(`search/suggest`, {\n      query: {\n        part: part,\n      },\n    });\n  }\n}\n","import { BaseApi } from '../BaseApi';\nimport { Genre } from './Genres.types';\n\nexport class GenresApi extends BaseApi {\n  public genres(args?: { language?: string }): Promise<Genre[]> {\n    return this.getRequest<Genre[]>(`genres`, {\n      query: {\n        language: args?.language,\n      },\n    });\n  }\n}\n","import { BaseApi } from '../BaseApi';\nimport { FeedResponse } from './Feed.types';\n\nexport class FeedApi extends BaseApi {\n  public feed(): Promise<FeedResponse> {\n    return this.getRequest<FeedResponse>(`feed`);\n  }\n\n  // TODO Feed wizard is passed\n}\n","import { AccountApi } from './account/Account.api';\nimport DefaultResponseValidator from './utils/ResponseValidator';\nimport DefaultResponseDeserializer from './utils/ResponseDeserializer';\nimport { AlbumsApi } from './albums/Albums.api';\nimport { ArtistsApi } from './artists/Artists.api';\nimport { PlaylistsApi } from './playlists/Playlists.api';\nimport { TracksApi } from './tracks/Tracks.api';\nimport { UsersApi } from './users/Users.api';\nimport { SearchApi } from './search/Search.api';\nimport { GenresApi } from './genres/Genres.api';\nimport { FeedApi } from './feed/Feed.api';\nimport querystring from 'querystring';\n\nexport type * from './account/Account.types';\nexport type * from './albums/Albums.types';\nexport type * from './artists/Artists.types';\nexport type * from './common/Common.types';\nexport type * from './genres/Genres.types';\nexport type * from './playlists/Playlists.types';\nexport type * from './search/Search.types';\nexport type * from './tracks/Track.types';\nexport type * from './users/User.types';\n\nexport type SdkConfig = {\n  url: string;\n  fetch: (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;\n  token: string;\n};\n\nexport class YaMusicSDK {\n  public account: AccountApi;\n  public albums: AlbumsApi;\n  public artists: ArtistsApi;\n  public playlists: PlaylistsApi;\n  public tracks: TracksApi;\n  public users: UsersApi;\n  public search: SearchApi;\n  public genres: GenresApi;\n  public feed: FeedApi;\n\n  private configuration: SdkConfig;\n  private validator = new DefaultResponseValidator();\n  private deserializer = new DefaultResponseDeserializer();\n\n  private constructor(config?: Partial<SdkConfig>) {\n    this.configuration = this.initialize(config);\n\n    this.account = new AccountApi(this);\n    this.albums = new AlbumsApi(this);\n    this.artists = new ArtistsApi(this);\n    this.playlists = new PlaylistsApi(this);\n    this.tracks = new TracksApi(this);\n    this.users = new UsersApi(this);\n    this.search = new SearchApi(this);\n    this.genres = new GenresApi(this);\n    this.feed = new FeedApi(this);\n  }\n\n  public static create(config?: Partial<SdkConfig>): YaMusicSDK {\n    return new YaMusicSDK(config);\n  }\n\n  public async makeRequest<R>(\n    method: 'GET' | 'POST' | 'PUT' | 'DELETE',\n    url: string,\n    args?: {\n      query?: NodeJS.Dict<\n        | string\n        | number\n        | boolean\n        | readonly string[]\n        | readonly number[]\n        | readonly boolean[]\n        | null\n      >;\n      formData?: FormData;\n      body?: unknown;\n      contentType?: string;\n    },\n  ): Promise<R> {\n    const token = this.configuration.token;\n    let fullUrl = this.configuration.url + url;\n\n    if (args?.query !== undefined) {\n      fullUrl += `?${querystring.stringify(args.query)}`;\n    }\n\n    const opts: RequestInit = {\n      method: method,\n      headers: {\n        Authorization: `OAuth ${token}`,\n      },\n      body:\n        args?.formData ??\n        (args?.body\n          ? typeof args?.body === 'string'\n            ? args?.body\n            : JSON.stringify(args?.body)\n          : undefined),\n    };\n    if (args?.formData === undefined) {\n      opts.headers = {\n        ...opts.headers,\n        'Content-type': args?.contentType ?? 'application/json',\n      };\n    }\n\n    const result = await this.configuration.fetch(fullUrl, opts);\n\n    await this.validator.validateResponse(result);\n    return this.deserializer.deserialize<R>(result).then((result) => {\n      if (!result) {\n        throw new Error('Unable to deserialize content');\n      }\n\n      return result;\n    });\n  }\n\n  private initialize(config?: Partial<SdkConfig>) {\n    //const isBrowser = typeof window !== 'undefined';\n    //const isNode = typeof process === 'object';\n\n    const defaultConfig: SdkConfig = {\n      fetch: (req: RequestInfo | URL, init: RequestInit | undefined) =>\n        fetch(req, init),\n      url: 'https://api.music.yandex.net/',\n      token: '',\n    };\n\n    return { ...defaultConfig, ...config };\n  }\n}\n"],"names":["BaseApi","constructor","sdk","this","getRequest","url","args","makeRequest","postRequest","putRequest","deleteRequest","AccountApi","status","settings","setSettings","body","DefaultResponseValidator","validateResponse","response","toString","startsWith","text","Error","statusText","DefaultResponseDeserializer","deserialize","length","JSON","parse","result","AlbumsApi","album","uid","albums","query","albumIds","albumWithTracks","ArtistsApi","artist","artists","artistIds","artistTracks","page","pageSize","artistAlbums","PlaylistsApi","createPlaylist","formData","FormData","append","title","visibility","loginOrId","deletePlaylist","kind","updatePlaylistName","newName","updatePlaylistVisibility","newVisibility","playlist","recommendations","TracksApi","track","tracks","trackIds","similar","supplement","downloadInfo","UsersApi","info","playlists","playlistsByIds","kinds","likedPlaylists","likedArtists","likedAlbums","likedTracks","SearchApi","search","type","nocorrect","playlistInBest","searchSuggest","part","GenresApi","genres","language","FeedApi","feed","YaMusicSDK","config","account","users","configuration","validator","deserializer","initialize","create","method","_args$formData","token","fullUrl","undefined","querystring","stringify","opts","headers","Authorization","_args$contentType","_extends","contentType","fetch","then","req","init"],"mappings":"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"}