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