ani-client 1.4.0 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -66,8 +66,7 @@ var CHARACTER_FIELDS_COMPACT = `
66
66
  favourites
67
67
  siteUrl
68
68
  `;
69
- var CHARACTER_FIELDS = `
70
- ${CHARACTER_FIELDS_COMPACT}
69
+ var CHARACTER_MEDIA_NODES = `
71
70
  media(perPage: 10) {
72
71
  nodes {
73
72
  id
@@ -78,6 +77,39 @@ var CHARACTER_FIELDS = `
78
77
  }
79
78
  }
80
79
  `;
80
+ var VOICE_ACTOR_FIELDS_COMPACT = `
81
+ id
82
+ name { first middle last full native userPreferred }
83
+ languageV2
84
+ image { large medium }
85
+ gender
86
+ primaryOccupations
87
+ siteUrl
88
+ `;
89
+ var CHARACTER_MEDIA_EDGES_WITH_VA = `
90
+ media(perPage: 10) {
91
+ edges {
92
+ voiceActors {
93
+ ${VOICE_ACTOR_FIELDS_COMPACT}
94
+ }
95
+ node {
96
+ id
97
+ title { romaji english native userPreferred }
98
+ type
99
+ coverImage { large medium }
100
+ siteUrl
101
+ }
102
+ }
103
+ }
104
+ `;
105
+ var CHARACTER_FIELDS = `
106
+ ${CHARACTER_FIELDS_COMPACT}
107
+ ${CHARACTER_MEDIA_NODES}
108
+ `;
109
+ var CHARACTER_FIELDS_WITH_VA = `
110
+ ${CHARACTER_FIELDS_COMPACT}
111
+ ${CHARACTER_MEDIA_EDGES_WITH_VA}
112
+ `;
81
113
  var STAFF_FIELDS = `
82
114
  id
83
115
  name { first middle last full native }
@@ -166,6 +198,12 @@ query ($id: Int!) {
166
198
  ${CHARACTER_FIELDS}
167
199
  }
168
200
  }`;
201
+ var QUERY_CHARACTER_BY_ID_WITH_VA = `
202
+ query ($id: Int!) {
203
+ Character(id: $id) {
204
+ ${CHARACTER_FIELDS_WITH_VA}
205
+ }
206
+ }`;
169
207
  var QUERY_CHARACTER_SEARCH = `
170
208
  query ($search: String, $sort: [CharacterSort], $page: Int, $perPage: Int) {
171
209
  Page(page: $page, perPage: $perPage) {
@@ -175,6 +213,15 @@ query ($search: String, $sort: [CharacterSort], $page: Int, $perPage: Int) {
175
213
  }
176
214
  }
177
215
  }`;
216
+ var QUERY_CHARACTER_SEARCH_WITH_VA = `
217
+ query ($search: String, $sort: [CharacterSort], $page: Int, $perPage: Int) {
218
+ Page(page: $page, perPage: $perPage) {
219
+ pageInfo { total perPage currentPage lastPage hasNextPage }
220
+ characters(search: $search, sort: $sort) {
221
+ ${CHARACTER_FIELDS_WITH_VA}
222
+ }
223
+ }
224
+ }`;
178
225
  var QUERY_STAFF_BY_ID = `
179
226
  query ($id: Int!) {
180
227
  Staff(id: $id) {
@@ -182,7 +229,7 @@ query ($id: Int!) {
182
229
  }
183
230
  }`;
184
231
  var QUERY_STAFF_SEARCH = `
185
- query ($search: String, $sort: [CharacterSort], $page: Int, $perPage: Int) {
232
+ query ($search: String, $sort: [StaffSort], $page: Int, $perPage: Int) {
186
233
  Page(page: $page, perPage: $perPage) {
187
234
  pageInfo { total perPage currentPage lastPage hasNextPage }
188
235
  staff(search: $search, sort: $sort) {
@@ -364,13 +411,17 @@ function buildMediaByIdQuery(include) {
364
411
  const opts = typeof include.characters === "object" ? include.characters : {};
365
412
  const perPage = opts.perPage ?? 25;
366
413
  const sortClause = opts.sort !== false ? ", sort: [ROLE, RELEVANCE, ID]" : "";
414
+ const voiceActorBlock = opts.voiceActors ? `
415
+ voiceActors {
416
+ ${VOICE_ACTOR_FIELDS_COMPACT}
417
+ }` : "";
367
418
  extra.push(`
368
419
  characters(perPage: ${perPage}${sortClause}) {
369
420
  edges {
370
421
  role
371
422
  node {
372
423
  ${CHARACTER_FIELDS_COMPACT}
373
- }
424
+ }${voiceActorBlock}
374
425
  }
375
426
  }`);
376
427
  }
@@ -890,6 +941,9 @@ var AniListClient = class {
890
941
  * // Include characters sorted by role, 25 results
891
942
  * const anime = await client.getMedia(1, { characters: true });
892
943
  *
944
+ * // Include characters with voice actors
945
+ * const anime = await client.getMedia(1, { characters: { voiceActors: true } });
946
+ *
893
947
  * // Full control
894
948
  * const anime = await client.getMedia(1, {
895
949
  * characters: { perPage: 50, sort: true },
@@ -927,7 +981,11 @@ var AniListClient = class {
927
981
  */
928
982
  async searchMedia(options = {}) {
929
983
  const { query: search, page = 1, perPage = 20, ...filters } = options;
930
- return this.pagedRequest(QUERY_MEDIA_SEARCH, { search, ...filters, page, perPage: this.clampPerPage(perPage) }, "media");
984
+ return this.pagedRequest(
985
+ QUERY_MEDIA_SEARCH,
986
+ { search, ...filters, page, perPage: this.clampPerPage(perPage) },
987
+ "media"
988
+ );
931
989
  }
932
990
  /**
933
991
  * Get currently trending anime or manga.
@@ -943,32 +1001,49 @@ var AniListClient = class {
943
1001
  * Fetch a character by AniList ID.
944
1002
  *
945
1003
  * @param id - The AniList character ID
1004
+ * @param include - Optional include options (e.g. voice actors)
946
1005
  * @returns The character object
947
1006
  *
948
1007
  * @example
949
1008
  * ```ts
950
1009
  * const spike = await client.getCharacter(1);
951
1010
  * console.log(spike.name.full); // "Spike Spiegel"
1011
+ *
1012
+ * // With voice actors
1013
+ * const spike = await client.getCharacter(1, { voiceActors: true });
1014
+ * spike.media?.edges?.forEach((e) => {
1015
+ * console.log(e.node.title.romaji);
1016
+ * e.voiceActors?.forEach((va) => console.log(` VA: ${va.name.full}`));
1017
+ * });
952
1018
  * ```
953
1019
  */
954
- async getCharacter(id) {
955
- const data = await this.request(QUERY_CHARACTER_BY_ID, { id });
1020
+ async getCharacter(id, include) {
1021
+ const query = include?.voiceActors ? QUERY_CHARACTER_BY_ID_WITH_VA : QUERY_CHARACTER_BY_ID;
1022
+ const data = await this.request(query, { id });
956
1023
  return data.Character;
957
1024
  }
958
1025
  /**
959
1026
  * Search for characters by name.
960
1027
  *
961
- * @param options - Search / pagination parameters
1028
+ * @param options - Search / pagination parameters (includes optional `voiceActors`)
962
1029
  * @returns Paginated results with matching characters
963
1030
  *
964
1031
  * @example
965
1032
  * ```ts
966
1033
  * const result = await client.searchCharacters({ query: "Luffy", perPage: 5 });
1034
+ *
1035
+ * // With voice actors
1036
+ * const result = await client.searchCharacters({ query: "Luffy", voiceActors: true });
967
1037
  * ```
968
1038
  */
969
1039
  async searchCharacters(options = {}) {
970
- const { query: search, page = 1, perPage = 20, ...rest } = options;
971
- return this.pagedRequest(QUERY_CHARACTER_SEARCH, { search, ...rest, page, perPage: this.clampPerPage(perPage) }, "characters");
1040
+ const { query: search, page = 1, perPage = 20, voiceActors, ...rest } = options;
1041
+ const gqlQuery = voiceActors ? QUERY_CHARACTER_SEARCH_WITH_VA : QUERY_CHARACTER_SEARCH;
1042
+ return this.pagedRequest(
1043
+ gqlQuery,
1044
+ { search, ...rest, page, perPage: this.clampPerPage(perPage) },
1045
+ "characters"
1046
+ );
972
1047
  }
973
1048
  /**
974
1049
  * Fetch a staff member by AniList ID.
@@ -999,7 +1074,11 @@ var AniListClient = class {
999
1074
  */
1000
1075
  async searchStaff(options = {}) {
1001
1076
  const { query: search, page = 1, perPage = 20, sort } = options;
1002
- return this.pagedRequest(QUERY_STAFF_SEARCH, { search, sort, page, perPage: this.clampPerPage(perPage) }, "staff");
1077
+ return this.pagedRequest(
1078
+ QUERY_STAFF_SEARCH,
1079
+ { search, sort, page, perPage: this.clampPerPage(perPage) },
1080
+ "staff"
1081
+ );
1003
1082
  }
1004
1083
  /**
1005
1084
  * Fetch a user by AniList ID.