ani-client 1.3.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.js CHANGED
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  // src/queries/index.ts
4
- var MEDIA_FIELDS = `
4
+ var MEDIA_FIELDS_BASE = `
5
5
  id
6
6
  idMal
7
7
  title { romaji english native userPreferred }
@@ -33,6 +33,10 @@ var MEDIA_FIELDS = `
33
33
  trending
34
34
  tags { id name description category rank isMediaSpoiler }
35
35
  studios { nodes { id name isAnimationStudio siteUrl } }
36
+ isAdult
37
+ siteUrl
38
+ `;
39
+ var RELATIONS_FIELDS = `
36
40
  relations {
37
41
  edges {
38
42
  relationType(version: 2)
@@ -47,10 +51,12 @@ var MEDIA_FIELDS = `
47
51
  }
48
52
  }
49
53
  }
50
- isAdult
51
- siteUrl
52
54
  `;
53
- var CHARACTER_FIELDS = `
55
+ var MEDIA_FIELDS = `
56
+ ${MEDIA_FIELDS_BASE}
57
+ ${RELATIONS_FIELDS}
58
+ `;
59
+ var CHARACTER_FIELDS_COMPACT = `
54
60
  id
55
61
  name { first middle last full native alternative }
56
62
  image { large medium }
@@ -61,6 +67,8 @@ var CHARACTER_FIELDS = `
61
67
  bloodType
62
68
  favourites
63
69
  siteUrl
70
+ `;
71
+ var CHARACTER_MEDIA_NODES = `
64
72
  media(perPage: 10) {
65
73
  nodes {
66
74
  id
@@ -71,6 +79,39 @@ var CHARACTER_FIELDS = `
71
79
  }
72
80
  }
73
81
  `;
82
+ var VOICE_ACTOR_FIELDS_COMPACT = `
83
+ id
84
+ name { first middle last full native userPreferred }
85
+ languageV2
86
+ image { large medium }
87
+ gender
88
+ primaryOccupations
89
+ siteUrl
90
+ `;
91
+ var CHARACTER_MEDIA_EDGES_WITH_VA = `
92
+ media(perPage: 10) {
93
+ edges {
94
+ voiceActors {
95
+ ${VOICE_ACTOR_FIELDS_COMPACT}
96
+ }
97
+ node {
98
+ id
99
+ title { romaji english native userPreferred }
100
+ type
101
+ coverImage { large medium }
102
+ siteUrl
103
+ }
104
+ }
105
+ }
106
+ `;
107
+ var CHARACTER_FIELDS = `
108
+ ${CHARACTER_FIELDS_COMPACT}
109
+ ${CHARACTER_MEDIA_NODES}
110
+ `;
111
+ var CHARACTER_FIELDS_WITH_VA = `
112
+ ${CHARACTER_FIELDS_COMPACT}
113
+ ${CHARACTER_MEDIA_EDGES_WITH_VA}
114
+ `;
74
115
  var STAFF_FIELDS = `
75
116
  id
76
117
  name { first middle last full native }
@@ -140,7 +181,7 @@ query (
140
181
  isAdult: $isAdult,
141
182
  sort: $sort
142
183
  ) {
143
- ${MEDIA_FIELDS}
184
+ ${MEDIA_FIELDS_BASE}
144
185
  }
145
186
  }
146
187
  }`;
@@ -149,7 +190,7 @@ query ($type: MediaType, $page: Int, $perPage: Int) {
149
190
  Page(page: $page, perPage: $perPage) {
150
191
  pageInfo { total perPage currentPage lastPage hasNextPage }
151
192
  media(type: $type, sort: TRENDING_DESC) {
152
- ${MEDIA_FIELDS}
193
+ ${MEDIA_FIELDS_BASE}
153
194
  }
154
195
  }
155
196
  }`;
@@ -159,6 +200,12 @@ query ($id: Int!) {
159
200
  ${CHARACTER_FIELDS}
160
201
  }
161
202
  }`;
203
+ var QUERY_CHARACTER_BY_ID_WITH_VA = `
204
+ query ($id: Int!) {
205
+ Character(id: $id) {
206
+ ${CHARACTER_FIELDS_WITH_VA}
207
+ }
208
+ }`;
162
209
  var QUERY_CHARACTER_SEARCH = `
163
210
  query ($search: String, $sort: [CharacterSort], $page: Int, $perPage: Int) {
164
211
  Page(page: $page, perPage: $perPage) {
@@ -168,6 +215,15 @@ query ($search: String, $sort: [CharacterSort], $page: Int, $perPage: Int) {
168
215
  }
169
216
  }
170
217
  }`;
218
+ var QUERY_CHARACTER_SEARCH_WITH_VA = `
219
+ query ($search: String, $sort: [CharacterSort], $page: Int, $perPage: Int) {
220
+ Page(page: $page, perPage: $perPage) {
221
+ pageInfo { total perPage currentPage lastPage hasNextPage }
222
+ characters(search: $search, sort: $sort) {
223
+ ${CHARACTER_FIELDS_WITH_VA}
224
+ }
225
+ }
226
+ }`;
171
227
  var QUERY_STAFF_BY_ID = `
172
228
  query ($id: Int!) {
173
229
  Staff(id: $id) {
@@ -175,10 +231,10 @@ query ($id: Int!) {
175
231
  }
176
232
  }`;
177
233
  var QUERY_STAFF_SEARCH = `
178
- query ($search: String, $page: Int, $perPage: Int) {
234
+ query ($search: String, $sort: [StaffSort], $page: Int, $perPage: Int) {
179
235
  Page(page: $page, perPage: $perPage) {
180
236
  pageInfo { total perPage currentPage lastPage hasNextPage }
181
- staff(search: $search) {
237
+ staff(search: $search, sort: $sort) {
182
238
  ${STAFF_FIELDS}
183
239
  }
184
240
  }
@@ -206,7 +262,7 @@ query ($airingAt_greater: Int, $airingAt_lesser: Int, $sort: [AiringSort], $page
206
262
  episode
207
263
  mediaId
208
264
  media {
209
- ${MEDIA_FIELDS}
265
+ ${MEDIA_FIELDS_BASE}
210
266
  }
211
267
  }
212
268
  }
@@ -216,7 +272,7 @@ query ($page: Int, $perPage: Int) {
216
272
  Page(page: $page, perPage: $perPage) {
217
273
  pageInfo { total perPage currentPage lastPage hasNextPage }
218
274
  media(type: MANGA, status: RELEASING, sort: UPDATED_AT_DESC) {
219
- ${MEDIA_FIELDS}
275
+ ${MEDIA_FIELDS_BASE}
220
276
  }
221
277
  }
222
278
  }`;
@@ -225,7 +281,7 @@ query ($type: MediaType, $sort: [MediaSort], $page: Int, $perPage: Int) {
225
281
  Page(page: $page, perPage: $perPage) {
226
282
  pageInfo { total perPage currentPage lastPage hasNextPage }
227
283
  media(type: $type, status: NOT_YET_RELEASED, sort: $sort) {
228
- ${MEDIA_FIELDS}
284
+ ${MEDIA_FIELDS_BASE}
229
285
  }
230
286
  }
231
287
  }`;
@@ -234,7 +290,7 @@ query ($season: MediaSeason!, $seasonYear: Int!, $type: MediaType, $sort: [Media
234
290
  Page(page: $page, perPage: $perPage) {
235
291
  pageInfo { total perPage currentPage lastPage hasNextPage }
236
292
  media(season: $season, seasonYear: $seasonYear, type: $type, sort: $sort) {
237
- ${MEDIA_FIELDS}
293
+ ${MEDIA_FIELDS_BASE}
238
294
  }
239
295
  }
240
296
  }`;
@@ -254,7 +310,7 @@ var MEDIA_LIST_FIELDS = `
254
310
  updatedAt
255
311
  createdAt
256
312
  media {
257
- ${MEDIA_FIELDS}
313
+ ${MEDIA_FIELDS_BASE}
258
314
  }
259
315
  `;
260
316
  var QUERY_RECOMMENDATIONS = `
@@ -347,13 +403,105 @@ query {
347
403
  isAdult
348
404
  }
349
405
  }`;
406
+ function buildMediaByIdQuery(include) {
407
+ if (!include) return QUERY_MEDIA_BY_ID;
408
+ const extra = [];
409
+ if (include.relations !== false) {
410
+ extra.push(RELATIONS_FIELDS);
411
+ }
412
+ if (include.characters) {
413
+ const opts = typeof include.characters === "object" ? include.characters : {};
414
+ const perPage = opts.perPage ?? 25;
415
+ const sortClause = opts.sort !== false ? ", sort: [ROLE, RELEVANCE, ID]" : "";
416
+ const voiceActorBlock = opts.voiceActors ? `
417
+ voiceActors {
418
+ ${VOICE_ACTOR_FIELDS_COMPACT}
419
+ }` : "";
420
+ extra.push(`
421
+ characters(perPage: ${perPage}${sortClause}) {
422
+ edges {
423
+ role
424
+ node {
425
+ ${CHARACTER_FIELDS_COMPACT}
426
+ }${voiceActorBlock}
427
+ }
428
+ }`);
429
+ }
430
+ if (include.staff) {
431
+ const opts = typeof include.staff === "object" ? include.staff : {};
432
+ const perPage = opts.perPage ?? 25;
433
+ const sortClause = opts.sort !== false ? ", sort: [RELEVANCE, ID]" : "";
434
+ extra.push(`
435
+ staff(perPage: ${perPage}${sortClause}) {
436
+ edges {
437
+ role
438
+ node {
439
+ ${STAFF_FIELDS}
440
+ }
441
+ }
442
+ }`);
443
+ }
444
+ if (include.recommendations) {
445
+ const perPage = typeof include.recommendations === "object" ? include.recommendations.perPage ?? 10 : 10;
446
+ extra.push(`
447
+ recommendations(perPage: ${perPage}, sort: [RATING_DESC]) {
448
+ nodes {
449
+ id
450
+ rating
451
+ mediaRecommendation {
452
+ id
453
+ title { romaji english native userPreferred }
454
+ type
455
+ format
456
+ coverImage { large medium }
457
+ averageScore
458
+ siteUrl
459
+ }
460
+ }
461
+ }`);
462
+ }
463
+ if (include.streamingEpisodes) {
464
+ extra.push(`
465
+ streamingEpisodes {
466
+ title
467
+ thumbnail
468
+ url
469
+ site
470
+ }`);
471
+ }
472
+ if (include.externalLinks) {
473
+ extra.push(`
474
+ externalLinks {
475
+ id
476
+ url
477
+ site
478
+ type
479
+ icon
480
+ color
481
+ }`);
482
+ }
483
+ if (include.stats) {
484
+ extra.push(`
485
+ stats {
486
+ scoreDistribution { score amount }
487
+ statusDistribution { status amount }
488
+ }`);
489
+ }
490
+ return `
491
+ query ($id: Int!) {
492
+ Media(id: $id) {
493
+ ${MEDIA_FIELDS_BASE}
494
+ ${extra.join("\n")}
495
+ }
496
+ }`;
497
+ }
350
498
  function buildBatchQuery(ids, typeName, fields, prefix) {
351
499
  const aliases = ids.map((id, i) => `${prefix}${i}: ${typeName}(id: ${id}) { ${fields} }`).join("\n ");
352
500
  return `query {
353
501
  ${aliases}
354
502
  }`;
355
503
  }
356
- var buildBatchMediaQuery = (ids) => buildBatchQuery(ids, "Media", MEDIA_FIELDS, "m");
504
+ var buildBatchMediaQuery = (ids) => buildBatchQuery(ids, "Media", MEDIA_FIELDS_BASE, "m");
357
505
  var buildBatchCharacterQuery = (ids) => buildBatchQuery(ids, "Character", CHARACTER_FIELDS, "c");
358
506
  var buildBatchStaffQuery = (ids) => buildBatchQuery(ids, "Staff", STAFF_FIELDS, "s");
359
507
 
@@ -368,7 +516,8 @@ var MemoryCache = class {
368
516
  }
369
517
  /** Build a deterministic cache key from a query + variables pair. */
370
518
  static key(query, variables) {
371
- return `${query.trim()}|${JSON.stringify(variables, Object.keys(variables).sort())}`;
519
+ const normalized = query.replace(/\s+/g, " ").trim();
520
+ return `${normalized}|${JSON.stringify(variables, Object.keys(variables).sort())}`;
372
521
  }
373
522
  /** Retrieve a cached value, or `undefined` if missing / expired. */
374
523
  get(key) {
@@ -405,9 +554,9 @@ var MemoryCache = class {
405
554
  get size() {
406
555
  return this.store.size;
407
556
  }
408
- /** Return an iterator over all cache keys. */
557
+ /** Return all cache keys. */
409
558
  keys() {
410
- return this.store.keys();
559
+ return [...this.store.keys()];
411
560
  }
412
561
  /**
413
562
  * Remove all entries whose key matches the given pattern.
@@ -416,25 +565,26 @@ var MemoryCache = class {
416
565
  * @returns Number of entries removed.
417
566
  */
418
567
  invalidate(pattern) {
419
- const regex = typeof pattern === "string" ? new RegExp(pattern) : pattern;
420
- let count = 0;
421
- for (const key of [...this.store.keys()]) {
422
- if (regex.test(key)) {
423
- this.store.delete(key);
424
- count++;
425
- }
568
+ const regex = typeof pattern === "string" ? new RegExp(pattern.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")) : pattern;
569
+ const toDelete = [];
570
+ for (const key of this.store.keys()) {
571
+ if (regex.test(key)) toDelete.push(key);
426
572
  }
427
- return count;
573
+ for (const key of toDelete) this.store.delete(key);
574
+ return toDelete.length;
428
575
  }
429
576
  };
430
577
 
431
578
  // src/errors/index.ts
432
- var AniListError = class extends Error {
579
+ var AniListError = class _AniListError extends Error {
433
580
  constructor(message, status, errors = []) {
434
581
  super(message);
435
582
  this.name = "AniListError";
436
583
  this.status = status;
437
584
  this.errors = errors;
585
+ if (Error.captureStackTrace) {
586
+ Error.captureStackTrace(this, _AniListError);
587
+ }
438
588
  }
439
589
  };
440
590
 
@@ -533,6 +683,169 @@ function isNetworkError(err) {
533
683
  return false;
534
684
  }
535
685
 
686
+ // src/types/index.ts
687
+ var MediaType = /* @__PURE__ */ ((MediaType2) => {
688
+ MediaType2["ANIME"] = "ANIME";
689
+ MediaType2["MANGA"] = "MANGA";
690
+ return MediaType2;
691
+ })(MediaType || {});
692
+ var MediaFormat = /* @__PURE__ */ ((MediaFormat2) => {
693
+ MediaFormat2["TV"] = "TV";
694
+ MediaFormat2["TV_SHORT"] = "TV_SHORT";
695
+ MediaFormat2["MOVIE"] = "MOVIE";
696
+ MediaFormat2["SPECIAL"] = "SPECIAL";
697
+ MediaFormat2["OVA"] = "OVA";
698
+ MediaFormat2["ONA"] = "ONA";
699
+ MediaFormat2["MUSIC"] = "MUSIC";
700
+ MediaFormat2["MANGA"] = "MANGA";
701
+ MediaFormat2["NOVEL"] = "NOVEL";
702
+ MediaFormat2["ONE_SHOT"] = "ONE_SHOT";
703
+ return MediaFormat2;
704
+ })(MediaFormat || {});
705
+ var MediaStatus = /* @__PURE__ */ ((MediaStatus2) => {
706
+ MediaStatus2["FINISHED"] = "FINISHED";
707
+ MediaStatus2["RELEASING"] = "RELEASING";
708
+ MediaStatus2["NOT_YET_RELEASED"] = "NOT_YET_RELEASED";
709
+ MediaStatus2["CANCELLED"] = "CANCELLED";
710
+ MediaStatus2["HIATUS"] = "HIATUS";
711
+ return MediaStatus2;
712
+ })(MediaStatus || {});
713
+ var MediaSeason = /* @__PURE__ */ ((MediaSeason2) => {
714
+ MediaSeason2["WINTER"] = "WINTER";
715
+ MediaSeason2["SPRING"] = "SPRING";
716
+ MediaSeason2["SUMMER"] = "SUMMER";
717
+ MediaSeason2["FALL"] = "FALL";
718
+ return MediaSeason2;
719
+ })(MediaSeason || {});
720
+ var MediaSort = /* @__PURE__ */ ((MediaSort2) => {
721
+ MediaSort2["ID"] = "ID";
722
+ MediaSort2["ID_DESC"] = "ID_DESC";
723
+ MediaSort2["TITLE_ROMAJI"] = "TITLE_ROMAJI";
724
+ MediaSort2["TITLE_ROMAJI_DESC"] = "TITLE_ROMAJI_DESC";
725
+ MediaSort2["TITLE_ENGLISH"] = "TITLE_ENGLISH";
726
+ MediaSort2["TITLE_ENGLISH_DESC"] = "TITLE_ENGLISH_DESC";
727
+ MediaSort2["TITLE_NATIVE"] = "TITLE_NATIVE";
728
+ MediaSort2["TITLE_NATIVE_DESC"] = "TITLE_NATIVE_DESC";
729
+ MediaSort2["TYPE"] = "TYPE";
730
+ MediaSort2["TYPE_DESC"] = "TYPE_DESC";
731
+ MediaSort2["FORMAT"] = "FORMAT";
732
+ MediaSort2["FORMAT_DESC"] = "FORMAT_DESC";
733
+ MediaSort2["START_DATE"] = "START_DATE";
734
+ MediaSort2["START_DATE_DESC"] = "START_DATE_DESC";
735
+ MediaSort2["END_DATE"] = "END_DATE";
736
+ MediaSort2["END_DATE_DESC"] = "END_DATE_DESC";
737
+ MediaSort2["SCORE"] = "SCORE";
738
+ MediaSort2["SCORE_DESC"] = "SCORE_DESC";
739
+ MediaSort2["POPULARITY"] = "POPULARITY";
740
+ MediaSort2["POPULARITY_DESC"] = "POPULARITY_DESC";
741
+ MediaSort2["TRENDING"] = "TRENDING";
742
+ MediaSort2["TRENDING_DESC"] = "TRENDING_DESC";
743
+ MediaSort2["EPISODES"] = "EPISODES";
744
+ MediaSort2["EPISODES_DESC"] = "EPISODES_DESC";
745
+ MediaSort2["DURATION"] = "DURATION";
746
+ MediaSort2["DURATION_DESC"] = "DURATION_DESC";
747
+ MediaSort2["STATUS"] = "STATUS";
748
+ MediaSort2["STATUS_DESC"] = "STATUS_DESC";
749
+ MediaSort2["FAVOURITES"] = "FAVOURITES";
750
+ MediaSort2["FAVOURITES_DESC"] = "FAVOURITES_DESC";
751
+ MediaSort2["UPDATED_AT"] = "UPDATED_AT";
752
+ MediaSort2["UPDATED_AT_DESC"] = "UPDATED_AT_DESC";
753
+ MediaSort2["SEARCH_MATCH"] = "SEARCH_MATCH";
754
+ return MediaSort2;
755
+ })(MediaSort || {});
756
+ var AiringSort = /* @__PURE__ */ ((AiringSort2) => {
757
+ AiringSort2["ID"] = "ID";
758
+ AiringSort2["ID_DESC"] = "ID_DESC";
759
+ AiringSort2["MEDIA_ID"] = "MEDIA_ID";
760
+ AiringSort2["MEDIA_ID_DESC"] = "MEDIA_ID_DESC";
761
+ AiringSort2["TIME"] = "TIME";
762
+ AiringSort2["TIME_DESC"] = "TIME_DESC";
763
+ AiringSort2["EPISODE"] = "EPISODE";
764
+ AiringSort2["EPISODE_DESC"] = "EPISODE_DESC";
765
+ return AiringSort2;
766
+ })(AiringSort || {});
767
+ var CharacterSort = /* @__PURE__ */ ((CharacterSort2) => {
768
+ CharacterSort2["ID"] = "ID";
769
+ CharacterSort2["ID_DESC"] = "ID_DESC";
770
+ CharacterSort2["ROLE"] = "ROLE";
771
+ CharacterSort2["ROLE_DESC"] = "ROLE_DESC";
772
+ CharacterSort2["SEARCH_MATCH"] = "SEARCH_MATCH";
773
+ CharacterSort2["FAVOURITES"] = "FAVOURITES";
774
+ CharacterSort2["FAVOURITES_DESC"] = "FAVOURITES_DESC";
775
+ return CharacterSort2;
776
+ })(CharacterSort || {});
777
+ var CharacterRole = /* @__PURE__ */ ((CharacterRole2) => {
778
+ CharacterRole2["MAIN"] = "MAIN";
779
+ CharacterRole2["SUPPORTING"] = "SUPPORTING";
780
+ CharacterRole2["BACKGROUND"] = "BACKGROUND";
781
+ return CharacterRole2;
782
+ })(CharacterRole || {});
783
+ var MediaRelationType = /* @__PURE__ */ ((MediaRelationType2) => {
784
+ MediaRelationType2["ADAPTATION"] = "ADAPTATION";
785
+ MediaRelationType2["PREQUEL"] = "PREQUEL";
786
+ MediaRelationType2["SEQUEL"] = "SEQUEL";
787
+ MediaRelationType2["PARENT"] = "PARENT";
788
+ MediaRelationType2["SIDE_STORY"] = "SIDE_STORY";
789
+ MediaRelationType2["CHARACTER"] = "CHARACTER";
790
+ MediaRelationType2["SUMMARY"] = "SUMMARY";
791
+ MediaRelationType2["ALTERNATIVE"] = "ALTERNATIVE";
792
+ MediaRelationType2["SPIN_OFF"] = "SPIN_OFF";
793
+ MediaRelationType2["OTHER"] = "OTHER";
794
+ MediaRelationType2["SOURCE"] = "SOURCE";
795
+ MediaRelationType2["COMPILATION"] = "COMPILATION";
796
+ MediaRelationType2["CONTAINS"] = "CONTAINS";
797
+ return MediaRelationType2;
798
+ })(MediaRelationType || {});
799
+ var RecommendationSort = /* @__PURE__ */ ((RecommendationSort2) => {
800
+ RecommendationSort2["ID"] = "ID";
801
+ RecommendationSort2["ID_DESC"] = "ID_DESC";
802
+ RecommendationSort2["RATING"] = "RATING";
803
+ RecommendationSort2["RATING_DESC"] = "RATING_DESC";
804
+ return RecommendationSort2;
805
+ })(RecommendationSort || {});
806
+ var MediaListStatus = /* @__PURE__ */ ((MediaListStatus2) => {
807
+ MediaListStatus2["CURRENT"] = "CURRENT";
808
+ MediaListStatus2["PLANNING"] = "PLANNING";
809
+ MediaListStatus2["COMPLETED"] = "COMPLETED";
810
+ MediaListStatus2["DROPPED"] = "DROPPED";
811
+ MediaListStatus2["PAUSED"] = "PAUSED";
812
+ MediaListStatus2["REPEATING"] = "REPEATING";
813
+ return MediaListStatus2;
814
+ })(MediaListStatus || {});
815
+ var MediaListSort = /* @__PURE__ */ ((MediaListSort2) => {
816
+ MediaListSort2["MEDIA_ID"] = "MEDIA_ID";
817
+ MediaListSort2["MEDIA_ID_DESC"] = "MEDIA_ID_DESC";
818
+ MediaListSort2["SCORE"] = "SCORE";
819
+ MediaListSort2["SCORE_DESC"] = "SCORE_DESC";
820
+ MediaListSort2["STATUS"] = "STATUS";
821
+ MediaListSort2["STATUS_DESC"] = "STATUS_DESC";
822
+ MediaListSort2["PROGRESS"] = "PROGRESS";
823
+ MediaListSort2["PROGRESS_DESC"] = "PROGRESS_DESC";
824
+ MediaListSort2["PROGRESS_VOLUMES"] = "PROGRESS_VOLUMES";
825
+ MediaListSort2["PROGRESS_VOLUMES_DESC"] = "PROGRESS_VOLUMES_DESC";
826
+ MediaListSort2["REPEAT"] = "REPEAT";
827
+ MediaListSort2["REPEAT_DESC"] = "REPEAT_DESC";
828
+ MediaListSort2["PRIORITY"] = "PRIORITY";
829
+ MediaListSort2["PRIORITY_DESC"] = "PRIORITY_DESC";
830
+ MediaListSort2["STARTED_ON"] = "STARTED_ON";
831
+ MediaListSort2["STARTED_ON_DESC"] = "STARTED_ON_DESC";
832
+ MediaListSort2["FINISHED_ON"] = "FINISHED_ON";
833
+ MediaListSort2["FINISHED_ON_DESC"] = "FINISHED_ON_DESC";
834
+ MediaListSort2["ADDED_TIME"] = "ADDED_TIME";
835
+ MediaListSort2["ADDED_TIME_DESC"] = "ADDED_TIME_DESC";
836
+ MediaListSort2["UPDATED_TIME"] = "UPDATED_TIME";
837
+ MediaListSort2["UPDATED_TIME_DESC"] = "UPDATED_TIME_DESC";
838
+ MediaListSort2["MEDIA_TITLE_ROMAJI"] = "MEDIA_TITLE_ROMAJI";
839
+ MediaListSort2["MEDIA_TITLE_ROMAJI_DESC"] = "MEDIA_TITLE_ROMAJI_DESC";
840
+ MediaListSort2["MEDIA_TITLE_ENGLISH"] = "MEDIA_TITLE_ENGLISH";
841
+ MediaListSort2["MEDIA_TITLE_ENGLISH_DESC"] = "MEDIA_TITLE_ENGLISH_DESC";
842
+ MediaListSort2["MEDIA_TITLE_NATIVE"] = "MEDIA_TITLE_NATIVE";
843
+ MediaListSort2["MEDIA_TITLE_NATIVE_DESC"] = "MEDIA_TITLE_NATIVE_DESC";
844
+ MediaListSort2["MEDIA_POPULARITY"] = "MEDIA_POPULARITY";
845
+ MediaListSort2["MEDIA_POPULARITY_DESC"] = "MEDIA_POPULARITY_DESC";
846
+ return MediaListSort2;
847
+ })(MediaListSort || {});
848
+
536
849
  // src/client/index.ts
537
850
  var DEFAULT_API_URL = "https://graphql.anilist.co";
538
851
  var AniListClient = class {
@@ -600,16 +913,57 @@ var AniListClient = class {
600
913
  */
601
914
  async pagedRequest(query, variables, field) {
602
915
  const data = await this.request(query, variables);
603
- return { pageInfo: data.Page.pageInfo, results: data.Page[field] };
916
+ const results = data.Page[field];
917
+ if (!Array.isArray(results)) {
918
+ throw new AniListError(`Unexpected response: missing field "${field}" in Page`, 0, []);
919
+ }
920
+ return { pageInfo: data.Page.pageInfo, results };
921
+ }
922
+ /**
923
+ * @internal
924
+ * Clamp perPage to AniList's maximum of 50.
925
+ */
926
+ clampPerPage(value) {
927
+ return Math.min(Math.max(value, 1), 50);
604
928
  }
605
929
  /**
606
930
  * Fetch a single media entry by its AniList ID.
607
931
  *
932
+ * Optionally include related data (characters, staff, relations, etc.) via the `include` parameter.
933
+ *
608
934
  * @param id - The AniList media ID
935
+ * @param include - Optional related data to include
609
936
  * @returns The media object
937
+ *
938
+ * @example
939
+ * ```ts
940
+ * // Basic usage — same as before (includes relations by default)
941
+ * const anime = await client.getMedia(1);
942
+ *
943
+ * // Include characters sorted by role, 25 results
944
+ * const anime = await client.getMedia(1, { characters: true });
945
+ *
946
+ * // Include characters with voice actors
947
+ * const anime = await client.getMedia(1, { characters: { voiceActors: true } });
948
+ *
949
+ * // Full control
950
+ * const anime = await client.getMedia(1, {
951
+ * characters: { perPage: 50, sort: true },
952
+ * staff: true,
953
+ * relations: true,
954
+ * streamingEpisodes: true,
955
+ * externalLinks: true,
956
+ * stats: true,
957
+ * recommendations: { perPage: 5 },
958
+ * });
959
+ *
960
+ * // Exclude relations for a lighter response
961
+ * const anime = await client.getMedia(1, { characters: true, relations: false });
962
+ * ```
610
963
  */
611
- async getMedia(id) {
612
- const data = await this.request(QUERY_MEDIA_BY_ID, { id });
964
+ async getMedia(id, include) {
965
+ const query = include ? buildMediaByIdQuery(include) : QUERY_MEDIA_BY_ID;
966
+ const data = await this.request(query, { id });
613
967
  return data.Media;
614
968
  }
615
969
  /**
@@ -629,7 +983,11 @@ var AniListClient = class {
629
983
  */
630
984
  async searchMedia(options = {}) {
631
985
  const { query: search, page = 1, perPage = 20, ...filters } = options;
632
- return this.pagedRequest(QUERY_MEDIA_SEARCH, { search, ...filters, page, perPage }, "media");
986
+ return this.pagedRequest(
987
+ QUERY_MEDIA_SEARCH,
988
+ { search, ...filters, page, perPage: this.clampPerPage(perPage) },
989
+ "media"
990
+ );
633
991
  }
634
992
  /**
635
993
  * Get currently trending anime or manga.
@@ -638,25 +996,68 @@ var AniListClient = class {
638
996
  * @param page - Page number (default 1)
639
997
  * @param perPage - Results per page (default 20, max 50)
640
998
  */
641
- async getTrending(type = "ANIME", page = 1, perPage = 20) {
642
- return this.pagedRequest(QUERY_TRENDING, { type, page, perPage }, "media");
999
+ async getTrending(type = "ANIME" /* ANIME */, page = 1, perPage = 20) {
1000
+ return this.pagedRequest(QUERY_TRENDING, { type, page, perPage: this.clampPerPage(perPage) }, "media");
643
1001
  }
644
1002
  /**
645
1003
  * Fetch a character by AniList ID.
1004
+ *
1005
+ * @param id - The AniList character ID
1006
+ * @param include - Optional include options (e.g. voice actors)
1007
+ * @returns The character object
1008
+ *
1009
+ * @example
1010
+ * ```ts
1011
+ * const spike = await client.getCharacter(1);
1012
+ * console.log(spike.name.full); // "Spike Spiegel"
1013
+ *
1014
+ * // With voice actors
1015
+ * const spike = await client.getCharacter(1, { voiceActors: true });
1016
+ * spike.media?.edges?.forEach((e) => {
1017
+ * console.log(e.node.title.romaji);
1018
+ * e.voiceActors?.forEach((va) => console.log(` VA: ${va.name.full}`));
1019
+ * });
1020
+ * ```
646
1021
  */
647
- async getCharacter(id) {
648
- const data = await this.request(QUERY_CHARACTER_BY_ID, { id });
1022
+ async getCharacter(id, include) {
1023
+ const query = include?.voiceActors ? QUERY_CHARACTER_BY_ID_WITH_VA : QUERY_CHARACTER_BY_ID;
1024
+ const data = await this.request(query, { id });
649
1025
  return data.Character;
650
1026
  }
651
1027
  /**
652
1028
  * Search for characters by name.
1029
+ *
1030
+ * @param options - Search / pagination parameters (includes optional `voiceActors`)
1031
+ * @returns Paginated results with matching characters
1032
+ *
1033
+ * @example
1034
+ * ```ts
1035
+ * const result = await client.searchCharacters({ query: "Luffy", perPage: 5 });
1036
+ *
1037
+ * // With voice actors
1038
+ * const result = await client.searchCharacters({ query: "Luffy", voiceActors: true });
1039
+ * ```
653
1040
  */
654
1041
  async searchCharacters(options = {}) {
655
- const { query: search, page = 1, perPage = 20, ...rest } = options;
656
- return this.pagedRequest(QUERY_CHARACTER_SEARCH, { search, ...rest, page, perPage }, "characters");
1042
+ const { query: search, page = 1, perPage = 20, voiceActors, ...rest } = options;
1043
+ const gqlQuery = voiceActors ? QUERY_CHARACTER_SEARCH_WITH_VA : QUERY_CHARACTER_SEARCH;
1044
+ return this.pagedRequest(
1045
+ gqlQuery,
1046
+ { search, ...rest, page, perPage: this.clampPerPage(perPage) },
1047
+ "characters"
1048
+ );
657
1049
  }
658
1050
  /**
659
1051
  * Fetch a staff member by AniList ID.
1052
+ *
1053
+ * @param id - The AniList staff ID
1054
+ * @returns The staff object
1055
+ *
1056
+ * @example
1057
+ * ```ts
1058
+ * const staff = await client.getStaff(95001);
1059
+ * console.log(staff.name.full);
1060
+ * ```
660
1061
  */
661
1062
  async getStaff(id) {
662
1063
  const data = await this.request(QUERY_STAFF_BY_ID, { id });
@@ -664,13 +1065,34 @@ var AniListClient = class {
664
1065
  }
665
1066
  /**
666
1067
  * Search for staff (voice actors, directors, etc.).
1068
+ *
1069
+ * @param options - Search / pagination parameters
1070
+ * @returns Paginated results with matching staff
1071
+ *
1072
+ * @example
1073
+ * ```ts
1074
+ * const result = await client.searchStaff({ query: "Miyazaki", perPage: 5 });
1075
+ * ```
667
1076
  */
668
1077
  async searchStaff(options = {}) {
669
- const { query: search, page = 1, perPage = 20 } = options;
670
- return this.pagedRequest(QUERY_STAFF_SEARCH, { search, page, perPage }, "staff");
1078
+ const { query: search, page = 1, perPage = 20, sort } = options;
1079
+ return this.pagedRequest(
1080
+ QUERY_STAFF_SEARCH,
1081
+ { search, sort, page, perPage: this.clampPerPage(perPage) },
1082
+ "staff"
1083
+ );
671
1084
  }
672
1085
  /**
673
1086
  * Fetch a user by AniList ID.
1087
+ *
1088
+ * @param id - The AniList user ID
1089
+ * @returns The user object
1090
+ *
1091
+ * @example
1092
+ * ```ts
1093
+ * const user = await client.getUser(1);
1094
+ * console.log(user.name);
1095
+ * ```
674
1096
  */
675
1097
  async getUser(id) {
676
1098
  const data = await this.request(QUERY_USER_BY_ID, { id });
@@ -678,6 +1100,15 @@ var AniListClient = class {
678
1100
  }
679
1101
  /**
680
1102
  * Fetch a user by username.
1103
+ *
1104
+ * @param name - The AniList username
1105
+ * @returns The user object
1106
+ *
1107
+ * @example
1108
+ * ```ts
1109
+ * const user = await client.getUserByName("AniList");
1110
+ * console.log(user.statistics);
1111
+ * ```
681
1112
  */
682
1113
  async getUserByName(name) {
683
1114
  const data = await this.request(QUERY_USER_BY_NAME, { name });
@@ -716,7 +1147,7 @@ var AniListClient = class {
716
1147
  airingAt_lesser: options.airingAtLesser ?? now,
717
1148
  sort: options.sort ?? ["TIME_DESC"],
718
1149
  page: options.page ?? 1,
719
- perPage: options.perPage ?? 20
1150
+ perPage: this.clampPerPage(options.perPage ?? 20)
720
1151
  };
721
1152
  return this.pagedRequest(QUERY_AIRING_SCHEDULE, variables, "airingSchedules");
722
1153
  }
@@ -739,7 +1170,7 @@ var AniListClient = class {
739
1170
  QUERY_RECENT_CHAPTERS,
740
1171
  {
741
1172
  page: options.page ?? 1,
742
- perPage: options.perPage ?? 20
1173
+ perPage: this.clampPerPage(options.perPage ?? 20)
743
1174
  },
744
1175
  "media"
745
1176
  );
@@ -765,7 +1196,7 @@ var AniListClient = class {
765
1196
  type: options.type,
766
1197
  sort: options.sort ?? ["POPULARITY_DESC"],
767
1198
  page: options.page ?? 1,
768
- perPage: options.perPage ?? 20
1199
+ perPage: this.clampPerPage(options.perPage ?? 20)
769
1200
  },
770
1201
  "media"
771
1202
  );
@@ -827,7 +1258,7 @@ var AniListClient = class {
827
1258
  type: options.type ?? "ANIME",
828
1259
  sort: options.sort ?? ["POPULARITY_DESC"],
829
1260
  page: options.page ?? 1,
830
- perPage: options.perPage ?? 20
1261
+ perPage: this.clampPerPage(options.perPage ?? 20)
831
1262
  },
832
1263
  "media"
833
1264
  );
@@ -869,7 +1300,7 @@ var AniListClient = class {
869
1300
  status: options.status,
870
1301
  sort: options.sort,
871
1302
  page: options.page ?? 1,
872
- perPage: options.perPage ?? 20
1303
+ perPage: this.clampPerPage(options.perPage ?? 20)
873
1304
  },
874
1305
  "mediaList"
875
1306
  );
@@ -902,7 +1333,7 @@ var AniListClient = class {
902
1333
  {
903
1334
  search: options.query,
904
1335
  page: options.page ?? 1,
905
- perPage: options.perPage ?? 20
1336
+ perPage: this.clampPerPage(options.perPage ?? 20)
906
1337
  },
907
1338
  "studios"
908
1339
  );
@@ -1003,13 +1434,14 @@ var AniListClient = class {
1003
1434
  /** @internal */
1004
1435
  async executeBatch(ids, buildQuery, prefix) {
1005
1436
  const chunks = this.chunk(ids, 50);
1006
- const results = [];
1007
- for (const chunk of chunks) {
1008
- const query = buildQuery(chunk);
1009
- const data = await this.request(query);
1010
- results.push(...chunk.map((_, i) => data[`${prefix}${i}`]));
1011
- }
1012
- return results;
1437
+ const chunkResults = await Promise.all(
1438
+ chunks.map(async (chunk) => {
1439
+ const query = buildQuery(chunk);
1440
+ const data = await this.request(query);
1441
+ return chunk.map((_, i) => data[`${prefix}${i}`]);
1442
+ })
1443
+ );
1444
+ return chunkResults.flat();
1013
1445
  }
1014
1446
  /** @internal */
1015
1447
  chunk(arr, size) {
@@ -1082,8 +1514,25 @@ var RedisCache = class {
1082
1514
  const count = await this.client.del(this.prefixedKey(key));
1083
1515
  return count > 0;
1084
1516
  }
1517
+ /**
1518
+ * Collect keys matching a pattern. Uses SCAN when available, falls back to KEYS.
1519
+ *
1520
+ * **Warning:** The `KEYS` fallback is O(N) and blocks the Redis server.
1521
+ * Provide a client with `scanIterator` support for production use.
1522
+ * @internal
1523
+ */
1524
+ async collectKeys(pattern) {
1525
+ if (this.client.scanIterator) {
1526
+ const keys = [];
1527
+ for await (const key of this.client.scanIterator({ MATCH: pattern, COUNT: 100 })) {
1528
+ keys.push(key);
1529
+ }
1530
+ return keys;
1531
+ }
1532
+ return this.client.keys(pattern);
1533
+ }
1085
1534
  async clear() {
1086
- const keys = await this.client.keys(`${this.prefix}*`);
1535
+ const keys = await this.collectKeys(`${this.prefix}*`);
1087
1536
  if (keys.length > 0) {
1088
1537
  await this.client.del(...keys);
1089
1538
  }
@@ -1101,7 +1550,7 @@ var RedisCache = class {
1101
1550
  return keys.length;
1102
1551
  }
1103
1552
  async keys() {
1104
- const raw = await this.client.keys(`${this.prefix}*`);
1553
+ const raw = await this.collectKeys(`${this.prefix}*`);
1105
1554
  return raw.map((k) => k.slice(this.prefix.length));
1106
1555
  }
1107
1556
  /**
@@ -1111,153 +1560,22 @@ var RedisCache = class {
1111
1560
  * @returns Number of entries removed.
1112
1561
  */
1113
1562
  async invalidate(pattern) {
1114
- const keys = await this.client.keys(`${this.prefix}${pattern}`);
1115
- if (keys.length === 0) return 0;
1116
- return this.client.del(...keys);
1563
+ if (typeof pattern === "string") {
1564
+ const keys = await this.collectKeys(`${this.prefix}${pattern}`);
1565
+ if (keys.length === 0) return 0;
1566
+ return this.client.del(...keys);
1567
+ }
1568
+ const allKeys = await this.collectKeys(`${this.prefix}*`);
1569
+ const matching = allKeys.filter((k) => pattern.test(k.slice(this.prefix.length)));
1570
+ if (matching.length === 0) return 0;
1571
+ return this.client.del(...matching);
1117
1572
  }
1118
1573
  };
1119
1574
 
1120
- // src/types/index.ts
1121
- var MediaType = /* @__PURE__ */ ((MediaType2) => {
1122
- MediaType2["ANIME"] = "ANIME";
1123
- MediaType2["MANGA"] = "MANGA";
1124
- return MediaType2;
1125
- })(MediaType || {});
1126
- var MediaFormat = /* @__PURE__ */ ((MediaFormat2) => {
1127
- MediaFormat2["TV"] = "TV";
1128
- MediaFormat2["TV_SHORT"] = "TV_SHORT";
1129
- MediaFormat2["MOVIE"] = "MOVIE";
1130
- MediaFormat2["SPECIAL"] = "SPECIAL";
1131
- MediaFormat2["OVA"] = "OVA";
1132
- MediaFormat2["ONA"] = "ONA";
1133
- MediaFormat2["MUSIC"] = "MUSIC";
1134
- MediaFormat2["MANGA"] = "MANGA";
1135
- MediaFormat2["NOVEL"] = "NOVEL";
1136
- MediaFormat2["ONE_SHOT"] = "ONE_SHOT";
1137
- return MediaFormat2;
1138
- })(MediaFormat || {});
1139
- var MediaStatus = /* @__PURE__ */ ((MediaStatus2) => {
1140
- MediaStatus2["FINISHED"] = "FINISHED";
1141
- MediaStatus2["RELEASING"] = "RELEASING";
1142
- MediaStatus2["NOT_YET_RELEASED"] = "NOT_YET_RELEASED";
1143
- MediaStatus2["CANCELLED"] = "CANCELLED";
1144
- MediaStatus2["HIATUS"] = "HIATUS";
1145
- return MediaStatus2;
1146
- })(MediaStatus || {});
1147
- var MediaSeason = /* @__PURE__ */ ((MediaSeason2) => {
1148
- MediaSeason2["WINTER"] = "WINTER";
1149
- MediaSeason2["SPRING"] = "SPRING";
1150
- MediaSeason2["SUMMER"] = "SUMMER";
1151
- MediaSeason2["FALL"] = "FALL";
1152
- return MediaSeason2;
1153
- })(MediaSeason || {});
1154
- var MediaSort = /* @__PURE__ */ ((MediaSort2) => {
1155
- MediaSort2["ID"] = "ID";
1156
- MediaSort2["TITLE_ROMAJI"] = "TITLE_ROMAJI";
1157
- MediaSort2["TITLE_ENGLISH"] = "TITLE_ENGLISH";
1158
- MediaSort2["TITLE_NATIVE"] = "TITLE_NATIVE";
1159
- MediaSort2["TYPE"] = "TYPE";
1160
- MediaSort2["FORMAT"] = "FORMAT";
1161
- MediaSort2["START_DATE"] = "START_DATE";
1162
- MediaSort2["END_DATE"] = "END_DATE";
1163
- MediaSort2["SCORE"] = "SCORE";
1164
- MediaSort2["POPULARITY"] = "POPULARITY";
1165
- MediaSort2["TRENDING"] = "TRENDING";
1166
- MediaSort2["EPISODES"] = "EPISODES";
1167
- MediaSort2["DURATION"] = "DURATION";
1168
- MediaSort2["STATUS"] = "STATUS";
1169
- MediaSort2["FAVOURITES"] = "FAVOURITES";
1170
- MediaSort2["UPDATED_AT"] = "UPDATED_AT";
1171
- MediaSort2["SEARCH_MATCH"] = "SEARCH_MATCH";
1172
- return MediaSort2;
1173
- })(MediaSort || {});
1174
- var AiringSort = /* @__PURE__ */ ((AiringSort2) => {
1175
- AiringSort2["ID"] = "ID";
1176
- AiringSort2["ID_DESC"] = "ID_DESC";
1177
- AiringSort2["MEDIA_ID"] = "MEDIA_ID";
1178
- AiringSort2["MEDIA_ID_DESC"] = "MEDIA_ID_DESC";
1179
- AiringSort2["TIME"] = "TIME";
1180
- AiringSort2["TIME_DESC"] = "TIME_DESC";
1181
- AiringSort2["EPISODE"] = "EPISODE";
1182
- AiringSort2["EPISODE_DESC"] = "EPISODE_DESC";
1183
- return AiringSort2;
1184
- })(AiringSort || {});
1185
- var CharacterSort = /* @__PURE__ */ ((CharacterSort2) => {
1186
- CharacterSort2["ID"] = "ID";
1187
- CharacterSort2["ROLE"] = "ROLE";
1188
- CharacterSort2["SEARCH_MATCH"] = "SEARCH_MATCH";
1189
- CharacterSort2["FAVOURITES"] = "FAVOURITES";
1190
- return CharacterSort2;
1191
- })(CharacterSort || {});
1192
- var MediaRelationType = /* @__PURE__ */ ((MediaRelationType2) => {
1193
- MediaRelationType2["ADAPTATION"] = "ADAPTATION";
1194
- MediaRelationType2["PREQUEL"] = "PREQUEL";
1195
- MediaRelationType2["SEQUEL"] = "SEQUEL";
1196
- MediaRelationType2["PARENT"] = "PARENT";
1197
- MediaRelationType2["SIDE_STORY"] = "SIDE_STORY";
1198
- MediaRelationType2["CHARACTER"] = "CHARACTER";
1199
- MediaRelationType2["SUMMARY"] = "SUMMARY";
1200
- MediaRelationType2["ALTERNATIVE"] = "ALTERNATIVE";
1201
- MediaRelationType2["SPIN_OFF"] = "SPIN_OFF";
1202
- MediaRelationType2["OTHER"] = "OTHER";
1203
- MediaRelationType2["SOURCE"] = "SOURCE";
1204
- MediaRelationType2["COMPILATION"] = "COMPILATION";
1205
- MediaRelationType2["CONTAINS"] = "CONTAINS";
1206
- return MediaRelationType2;
1207
- })(MediaRelationType || {});
1208
- var RecommendationSort = /* @__PURE__ */ ((RecommendationSort2) => {
1209
- RecommendationSort2["ID"] = "ID";
1210
- RecommendationSort2["ID_DESC"] = "ID_DESC";
1211
- RecommendationSort2["RATING"] = "RATING";
1212
- RecommendationSort2["RATING_DESC"] = "RATING_DESC";
1213
- return RecommendationSort2;
1214
- })(RecommendationSort || {});
1215
- var MediaListStatus = /* @__PURE__ */ ((MediaListStatus2) => {
1216
- MediaListStatus2["CURRENT"] = "CURRENT";
1217
- MediaListStatus2["PLANNING"] = "PLANNING";
1218
- MediaListStatus2["COMPLETED"] = "COMPLETED";
1219
- MediaListStatus2["DROPPED"] = "DROPPED";
1220
- MediaListStatus2["PAUSED"] = "PAUSED";
1221
- MediaListStatus2["REPEATING"] = "REPEATING";
1222
- return MediaListStatus2;
1223
- })(MediaListStatus || {});
1224
- var MediaListSort = /* @__PURE__ */ ((MediaListSort2) => {
1225
- MediaListSort2["MEDIA_ID"] = "MEDIA_ID";
1226
- MediaListSort2["MEDIA_ID_DESC"] = "MEDIA_ID_DESC";
1227
- MediaListSort2["SCORE"] = "SCORE";
1228
- MediaListSort2["SCORE_DESC"] = "SCORE_DESC";
1229
- MediaListSort2["STATUS"] = "STATUS";
1230
- MediaListSort2["STATUS_DESC"] = "STATUS_DESC";
1231
- MediaListSort2["PROGRESS"] = "PROGRESS";
1232
- MediaListSort2["PROGRESS_DESC"] = "PROGRESS_DESC";
1233
- MediaListSort2["PROGRESS_VOLUMES"] = "PROGRESS_VOLUMES";
1234
- MediaListSort2["PROGRESS_VOLUMES_DESC"] = "PROGRESS_VOLUMES_DESC";
1235
- MediaListSort2["REPEAT"] = "REPEAT";
1236
- MediaListSort2["REPEAT_DESC"] = "REPEAT_DESC";
1237
- MediaListSort2["PRIORITY"] = "PRIORITY";
1238
- MediaListSort2["PRIORITY_DESC"] = "PRIORITY_DESC";
1239
- MediaListSort2["STARTED_ON"] = "STARTED_ON";
1240
- MediaListSort2["STARTED_ON_DESC"] = "STARTED_ON_DESC";
1241
- MediaListSort2["FINISHED_ON"] = "FINISHED_ON";
1242
- MediaListSort2["FINISHED_ON_DESC"] = "FINISHED_ON_DESC";
1243
- MediaListSort2["ADDED_TIME"] = "ADDED_TIME";
1244
- MediaListSort2["ADDED_TIME_DESC"] = "ADDED_TIME_DESC";
1245
- MediaListSort2["UPDATED_TIME"] = "UPDATED_TIME";
1246
- MediaListSort2["UPDATED_TIME_DESC"] = "UPDATED_TIME_DESC";
1247
- MediaListSort2["MEDIA_TITLE_ROMAJI"] = "MEDIA_TITLE_ROMAJI";
1248
- MediaListSort2["MEDIA_TITLE_ROMAJI_DESC"] = "MEDIA_TITLE_ROMAJI_DESC";
1249
- MediaListSort2["MEDIA_TITLE_ENGLISH"] = "MEDIA_TITLE_ENGLISH";
1250
- MediaListSort2["MEDIA_TITLE_ENGLISH_DESC"] = "MEDIA_TITLE_ENGLISH_DESC";
1251
- MediaListSort2["MEDIA_TITLE_NATIVE"] = "MEDIA_TITLE_NATIVE";
1252
- MediaListSort2["MEDIA_TITLE_NATIVE_DESC"] = "MEDIA_TITLE_NATIVE_DESC";
1253
- MediaListSort2["MEDIA_POPULARITY"] = "MEDIA_POPULARITY";
1254
- MediaListSort2["MEDIA_POPULARITY_DESC"] = "MEDIA_POPULARITY_DESC";
1255
- return MediaListSort2;
1256
- })(MediaListSort || {});
1257
-
1258
1575
  exports.AiringSort = AiringSort;
1259
1576
  exports.AniListClient = AniListClient;
1260
1577
  exports.AniListError = AniListError;
1578
+ exports.CharacterRole = CharacterRole;
1261
1579
  exports.CharacterSort = CharacterSort;
1262
1580
  exports.MediaFormat = MediaFormat;
1263
1581
  exports.MediaListSort = MediaListSort;