@retroachievements/api 0.0.0-development

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.
Files changed (225) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +103 -0
  3. package/dist/__playground.d.ts +7 -0
  4. package/dist/achievement/getAchievementUnlocks.d.ts +45 -0
  5. package/dist/achievement/index.d.ts +2 -0
  6. package/dist/achievement/models/achievement-unlock-entity.model.d.ts +6 -0
  7. package/dist/achievement/models/get-achievement-unlocks-response.model.d.ts +8 -0
  8. package/dist/achievement/models/index.d.ts +2 -0
  9. package/dist/api.cjs.development.js +2363 -0
  10. package/dist/api.cjs.development.js.map +1 -0
  11. package/dist/api.cjs.production.min.js +2 -0
  12. package/dist/api.cjs.production.min.js.map +1 -0
  13. package/dist/api.esm.js +2333 -0
  14. package/dist/api.esm.js.map +1 -0
  15. package/dist/console/getConsoleIds.d.ts +22 -0
  16. package/dist/console/getGameList.d.ts +52 -0
  17. package/dist/console/index.d.ts +3 -0
  18. package/dist/console/models/console-id.model.d.ts +4 -0
  19. package/dist/console/models/game-list.model.d.ts +15 -0
  20. package/dist/console/models/get-console-ids-response.model.d.ts +4 -0
  21. package/dist/console/models/get-game-list-response.model.d.ts +15 -0
  22. package/dist/console/models/index.d.ts +4 -0
  23. package/dist/feed/getAchievementOfTheWeek.d.ts +48 -0
  24. package/dist/feed/getActiveClaims.d.ts +38 -0
  25. package/dist/feed/getTicketData.d.ts +158 -0
  26. package/dist/feed/getTopTenUsers.d.ts +24 -0
  27. package/dist/feed/index.d.ts +5 -0
  28. package/dist/feed/models/achievement-of-the-week.model.d.ts +32 -0
  29. package/dist/feed/models/achievement-ticket-stats-response.model.d.ts +7 -0
  30. package/dist/feed/models/achievement-ticket-stats.model.d.ts +7 -0
  31. package/dist/feed/models/active-claim.model.d.ts +49 -0
  32. package/dist/feed/models/game-ticket-stats.model.d.ts +9 -0
  33. package/dist/feed/models/game-tickets-response.model.d.ts +7 -0
  34. package/dist/feed/models/get-achievement-of-the-week-response.model.d.ts +32 -0
  35. package/dist/feed/models/get-active-claims-response.model.d.ts +19 -0
  36. package/dist/feed/models/get-top-ten-users-response.model.d.ts +10 -0
  37. package/dist/feed/models/index.d.ts +19 -0
  38. package/dist/feed/models/most-ticketed-games-response.model.d.ts +12 -0
  39. package/dist/feed/models/most-ticketed-games.model.d.ts +12 -0
  40. package/dist/feed/models/recent-tickets-response.model.d.ts +6 -0
  41. package/dist/feed/models/recent-tickets.model.d.ts +6 -0
  42. package/dist/feed/models/response-ticket-entity.model.d.ts +24 -0
  43. package/dist/feed/models/ticket-entity.model.d.ts +24 -0
  44. package/dist/feed/models/tickets-by-user-response.model.d.ts +8 -0
  45. package/dist/feed/models/top-ten-users-entity.model.d.ts +5 -0
  46. package/dist/feed/models/top-ten-users.model.d.ts +2 -0
  47. package/dist/feed/models/user-ticket-stats.model.d.ts +8 -0
  48. package/dist/game/getAchievementCount.d.ts +31 -0
  49. package/dist/game/getAchievementDistribution.d.ts +57 -0
  50. package/dist/game/getGame.d.ts +48 -0
  51. package/dist/game/getGameExtended.d.ts +68 -0
  52. package/dist/game/getGameRankAndScore.d.ts +38 -0
  53. package/dist/game/getGameRating.d.ts +38 -0
  54. package/dist/game/index.d.ts +7 -0
  55. package/dist/game/models/achievement-count.model.d.ts +4 -0
  56. package/dist/game/models/achievement-distribution-flags.model.d.ts +4 -0
  57. package/dist/game/models/game-extended-achievement-entity.model.d.ts +15 -0
  58. package/dist/game/models/game-extended-claim-entity.model.d.ts +7 -0
  59. package/dist/game/models/game-extended.model.d.ts +25 -0
  60. package/dist/game/models/game-rank-and-score-entity.model.d.ts +6 -0
  61. package/dist/game/models/game-rating.model.d.ts +9 -0
  62. package/dist/game/models/game.model.d.ts +19 -0
  63. package/dist/game/models/get-achievement-count-response.model.d.ts +4 -0
  64. package/dist/game/models/get-achievement-distribution-response.model.d.ts +1 -0
  65. package/dist/game/models/get-game-extended-response.model.d.ts +50 -0
  66. package/dist/game/models/get-game-rank-and-score-response.model.d.ts +8 -0
  67. package/dist/game/models/get-game-rating-response.model.d.ts +9 -0
  68. package/dist/game/models/get-game-response.model.d.ts +19 -0
  69. package/dist/game/models/index.d.ts +14 -0
  70. package/dist/index.d.ts +6 -0
  71. package/dist/index.js +8 -0
  72. package/dist/user/getAchievementsEarnedBetween.d.ts +59 -0
  73. package/dist/user/getAchievementsEarnedOnDay.d.ts +57 -0
  74. package/dist/user/getGameInfoAndUserProgress.d.ts +80 -0
  75. package/dist/user/getUserGameRankAndScore.d.ts +44 -0
  76. package/dist/user/getUserPoints.d.ts +30 -0
  77. package/dist/user/getUserProgress.d.ts +49 -0
  78. package/dist/user/getUserRecentlyPlayedGames.d.ts +50 -0
  79. package/dist/user/getUserSummary.d.ts +32 -0
  80. package/dist/user/index.d.ts +9 -0
  81. package/dist/user/models/dated-user-achievement.model.d.ts +17 -0
  82. package/dist/user/models/dated-user-achievements-response.model.d.ts +19 -0
  83. package/dist/user/models/game-info-and-user-progress.model.d.ts +12 -0
  84. package/dist/user/models/get-game-info-and-user-progress-response.model.d.ts +14 -0
  85. package/dist/user/models/get-user-game-rank-and-score-response.model.d.ts +8 -0
  86. package/dist/user/models/get-user-points-response.model.d.ts +4 -0
  87. package/dist/user/models/get-user-progress-response.model.d.ts +10 -0
  88. package/dist/user/models/get-user-recently-played-games-response.model.d.ts +16 -0
  89. package/dist/user/models/get-user-summary-response.model.d.ts +82 -0
  90. package/dist/user/models/index.d.ts +14 -0
  91. package/dist/user/models/user-game-rank-and-score.model.d.ts +8 -0
  92. package/dist/user/models/user-points.model.d.ts +4 -0
  93. package/dist/user/models/user-progress.model.d.ts +10 -0
  94. package/dist/user/models/user-recently-played-games.model.d.ts +16 -0
  95. package/dist/user/models/user-summary.model.d.ts +83 -0
  96. package/dist/utils/internal/apiBaseUrl.d.ts +1 -0
  97. package/dist/utils/internal/buildRequestUrl.d.ts +2 -0
  98. package/dist/utils/internal/call.d.ts +20 -0
  99. package/dist/utils/internal/index.d.ts +4 -0
  100. package/dist/utils/internal/serializeProperties.d.ts +4 -0
  101. package/dist/utils/public/buildAuthorization.d.ts +22 -0
  102. package/dist/utils/public/index.d.ts +3 -0
  103. package/dist/utils/public/models/auth-object.model.d.ts +19 -0
  104. package/dist/utils/public/models/index.d.ts +1 -0
  105. package/package.json +117 -0
  106. package/src/__playground.ts +27 -0
  107. package/src/achievement/getAchievementUnlocks.test.ts +71 -0
  108. package/src/achievement/getAchievementUnlocks.ts +80 -0
  109. package/src/achievement/index.ts +2 -0
  110. package/src/achievement/models/achievement-unlock-entity.model.ts +6 -0
  111. package/src/achievement/models/get-achievement-unlocks-response.model.ts +8 -0
  112. package/src/achievement/models/index.ts +2 -0
  113. package/src/console/getConsoleIds.test.ts +53 -0
  114. package/src/console/getConsoleIds.ts +43 -0
  115. package/src/console/getGameList.test.ts +82 -0
  116. package/src/console/getGameList.ts +94 -0
  117. package/src/console/index.ts +3 -0
  118. package/src/console/models/console-id.model.ts +4 -0
  119. package/src/console/models/game-list.model.ts +16 -0
  120. package/src/console/models/get-console-ids-response.model.ts +1 -0
  121. package/src/console/models/get-game-list-response.model.ts +16 -0
  122. package/src/console/models/index.ts +4 -0
  123. package/src/feed/getAchievementOfTheWeek.test.ts +167 -0
  124. package/src/feed/getAchievementOfTheWeek.ts +80 -0
  125. package/src/feed/getActiveClaims.test.ts +81 -0
  126. package/src/feed/getActiveClaims.ts +68 -0
  127. package/src/feed/getTicketData.test.ts +349 -0
  128. package/src/feed/getTicketData.ts +286 -0
  129. package/src/feed/getTopTenUsers.test.ts +101 -0
  130. package/src/feed/getTopTenUsers.ts +51 -0
  131. package/src/feed/index.ts +5 -0
  132. package/src/feed/models/achievement-of-the-week.model.ts +27 -0
  133. package/src/feed/models/achievement-ticket-stats-response.model.ts +7 -0
  134. package/src/feed/models/achievement-ticket-stats.model.ts +7 -0
  135. package/src/feed/models/active-claim.model.ts +66 -0
  136. package/src/feed/models/game-ticket-stats.model.ts +11 -0
  137. package/src/feed/models/game-tickets-response.model.ts +7 -0
  138. package/src/feed/models/get-achievement-of-the-week-response.model.ts +27 -0
  139. package/src/feed/models/get-active-claims-response.model.ts +19 -0
  140. package/src/feed/models/get-top-ten-users-response.model.ts +12 -0
  141. package/src/feed/models/index.ts +19 -0
  142. package/src/feed/models/most-ticketed-games-response.model.ts +12 -0
  143. package/src/feed/models/most-ticketed-games.model.ts +12 -0
  144. package/src/feed/models/recent-tickets-response.model.ts +7 -0
  145. package/src/feed/models/recent-tickets.model.ts +7 -0
  146. package/src/feed/models/response-ticket-entity.model.ts +25 -0
  147. package/src/feed/models/ticket-entity.model.ts +24 -0
  148. package/src/feed/models/tickets-by-user-response.model.ts +8 -0
  149. package/src/feed/models/top-ten-users-entity.model.ts +5 -0
  150. package/src/feed/models/top-ten-users.model.ts +3 -0
  151. package/src/feed/models/user-ticket-stats.model.ts +8 -0
  152. package/src/game/getAchievementCount.test.ts +49 -0
  153. package/src/game/getAchievementCount.ts +52 -0
  154. package/src/game/getAchievementDistribution.test.ts +187 -0
  155. package/src/game/getAchievementDistribution.ts +88 -0
  156. package/src/game/getGame.test.ts +81 -0
  157. package/src/game/getGame.ts +74 -0
  158. package/src/game/getGameExtended.test.ts +121 -0
  159. package/src/game/getGameExtended.ts +103 -0
  160. package/src/game/getGameRankAndScore.test.ts +62 -0
  161. package/src/game/getGameRankAndScore.ts +66 -0
  162. package/src/game/getGameRating.test.ts +59 -0
  163. package/src/game/getGameRating.ts +59 -0
  164. package/src/game/index.ts +7 -0
  165. package/src/game/models/achievement-count.model.ts +4 -0
  166. package/src/game/models/achievement-distribution-flags.model.ts +4 -0
  167. package/src/game/models/game-extended-achievement-entity.model.ts +15 -0
  168. package/src/game/models/game-extended-claim-entity.model.ts +7 -0
  169. package/src/game/models/game-extended.model.ts +26 -0
  170. package/src/game/models/game-rank-and-score-entity.model.ts +6 -0
  171. package/src/game/models/game-rating.model.ts +9 -0
  172. package/src/game/models/game.model.ts +19 -0
  173. package/src/game/models/get-achievement-count-response.model.ts +4 -0
  174. package/src/game/models/get-achievement-distribution-response.model.ts +1 -0
  175. package/src/game/models/get-game-extended-response.model.ts +56 -0
  176. package/src/game/models/get-game-rank-and-score-response.model.ts +8 -0
  177. package/src/game/models/get-game-rating-response.model.ts +9 -0
  178. package/src/game/models/get-game-response.model.ts +19 -0
  179. package/src/game/models/index.ts +14 -0
  180. package/src/index.ts +8 -0
  181. package/src/user/getAchievementsEarnedBetween.test.ts +84 -0
  182. package/src/user/getAchievementsEarnedBetween.ts +88 -0
  183. package/src/user/getAchievementsEarnedOnDay.test.ts +83 -0
  184. package/src/user/getAchievementsEarnedOnDay.ts +87 -0
  185. package/src/user/getGameInfoAndUserProgress.test.ts +135 -0
  186. package/src/user/getGameInfoAndUserProgress.ts +118 -0
  187. package/src/user/getUserGameRankAndScore.test.ts +60 -0
  188. package/src/user/getUserGameRankAndScore.ts +69 -0
  189. package/src/user/getUserPoints.test.ts +49 -0
  190. package/src/user/getUserPoints.ts +51 -0
  191. package/src/user/getUserProgress.test.ts +80 -0
  192. package/src/user/getUserProgress.ts +78 -0
  193. package/src/user/getUserRecentlyPlayedGames.test.ts +76 -0
  194. package/src/user/getUserRecentlyPlayedGames.ts +93 -0
  195. package/src/user/getUserSummary.test.ts +251 -0
  196. package/src/user/getUserSummary.ts +96 -0
  197. package/src/user/index.ts +9 -0
  198. package/src/user/models/dated-user-achievement.model.ts +17 -0
  199. package/src/user/models/dated-user-achievements-response.model.ts +20 -0
  200. package/src/user/models/game-info-and-user-progress.model.ts +19 -0
  201. package/src/user/models/get-game-info-and-user-progress-response.model.ts +28 -0
  202. package/src/user/models/get-user-game-rank-and-score-response.model.ts +9 -0
  203. package/src/user/models/get-user-points-response.model.ts +4 -0
  204. package/src/user/models/get-user-progress-response.model.ts +13 -0
  205. package/src/user/models/get-user-recently-played-games-response.model.ts +17 -0
  206. package/src/user/models/get-user-summary-response.model.ts +92 -0
  207. package/src/user/models/index.ts +14 -0
  208. package/src/user/models/user-game-rank-and-score.model.ts +8 -0
  209. package/src/user/models/user-points.model.ts +4 -0
  210. package/src/user/models/user-progress.model.ts +10 -0
  211. package/src/user/models/user-recently-played-games.model.ts +16 -0
  212. package/src/user/models/user-summary.model.ts +92 -0
  213. package/src/utils/internal/apiBaseUrl.ts +1 -0
  214. package/src/utils/internal/buildRequestUrl.test.ts +51 -0
  215. package/src/utils/internal/buildRequestUrl.ts +32 -0
  216. package/src/utils/internal/call.test.ts +39 -0
  217. package/src/utils/internal/call.ts +29 -0
  218. package/src/utils/internal/index.ts +4 -0
  219. package/src/utils/internal/serializeProperties.test.ts +141 -0
  220. package/src/utils/internal/serializeProperties.ts +75 -0
  221. package/src/utils/public/buildAuthorization.test.ts +36 -0
  222. package/src/utils/public/buildAuthorization.ts +40 -0
  223. package/src/utils/public/index.ts +3 -0
  224. package/src/utils/public/models/auth-object.model.ts +20 -0
  225. package/src/utils/public/models/index.ts +1 -0
@@ -0,0 +1,14 @@
1
+ import type { GameExtendedRawAchievementEntity, GetGameExtendedResponse } from "../../game/models";
2
+ declare type GetGameExtendedResponseWithoutClaims = Omit<GetGameExtendedResponse, "Claims">;
3
+ declare type GameExtendedRawAchievementEntityWithUserProgress = GameExtendedRawAchievementEntity & {
4
+ DateEarned: string;
5
+ DateEarnedHardcore: string;
6
+ };
7
+ export interface GetGameInfoAndUserProgressResponse extends GetGameExtendedResponseWithoutClaims {
8
+ Achievements: Record<number, GameExtendedRawAchievementEntityWithUserProgress>;
9
+ NumAwardedToUser: number;
10
+ NumAwardedToUserHardcore: number;
11
+ UserCompletion: string;
12
+ UserCompletionHardcore: string;
13
+ }
14
+ export {};
@@ -0,0 +1,8 @@
1
+ interface UserGameRankAndScoreResponseEntity {
2
+ User: string;
3
+ TotalScore: string;
4
+ LastAward: string;
5
+ UserRank: string;
6
+ }
7
+ export declare type GetUserGameRankAndScoreResponse = UserGameRankAndScoreResponseEntity[];
8
+ export {};
@@ -0,0 +1,4 @@
1
+ export interface GetUserPointsResponse {
2
+ Points: number;
3
+ SoftcorePoints: number;
4
+ }
@@ -0,0 +1,10 @@
1
+ interface UserProgressResponseEntity {
2
+ NumPossibleAchievements: string;
3
+ PossibleScore: string;
4
+ NumAchieved: number | string;
5
+ ScoreAchieved: number | string;
6
+ NumAchievedHardcore: number | string;
7
+ ScoreAchievedHardcore: number | string;
8
+ }
9
+ export declare type GetUserProgressResponse = Record<`${number}`, UserProgressResponseEntity>;
10
+ export {};
@@ -0,0 +1,16 @@
1
+ interface UserRecentlyPlayedGameResponseEntity {
2
+ GameID: string;
3
+ ConsoleID: string;
4
+ ConsoleName: string;
5
+ Title: string;
6
+ ImageIcon: string;
7
+ LastPlayed: string;
8
+ NumPossibleAchievements: string;
9
+ PossibleScore: string;
10
+ NumAchieved: string | number;
11
+ ScoreAchieved: string | number;
12
+ NumAchievedHardcore: string | number;
13
+ ScoreAchievedHardcore: string | number;
14
+ }
15
+ export declare type GetUserRecentlyPlayedGamesResponse = UserRecentlyPlayedGameResponseEntity[];
16
+ export {};
@@ -0,0 +1,82 @@
1
+ interface RecentlyPlayedGameEntity {
2
+ GameID: string;
3
+ ConsoleID: string;
4
+ ConsoleName: string;
5
+ Title: string;
6
+ ImageIcon: string;
7
+ LastPlayed: string;
8
+ }
9
+ interface RecentlyAwardedAchievementEntity {
10
+ NumPossibleAchievements: string;
11
+ PossibleScore: string;
12
+ NumAchieved: number | string;
13
+ ScoreAchieved: number | string;
14
+ NumAchievedHardcore: number | string;
15
+ ScoreAchievedHardcore: number | string;
16
+ }
17
+ interface ExtendedRecentAchievementEntity {
18
+ ID: string;
19
+ GameID: string;
20
+ GameTitle: string;
21
+ Title: string;
22
+ Description: string;
23
+ Points: string;
24
+ BadgeName: string;
25
+ IsAwarded: "1";
26
+ DateAwarded: string;
27
+ HardcoreAchieved: "0";
28
+ }
29
+ interface LastGameEntity {
30
+ ID: number;
31
+ Title: string;
32
+ ConsoleID: number;
33
+ ForumTopicID: number;
34
+ Flags: number;
35
+ ImageIcon: string;
36
+ ImageTitle: string;
37
+ ImageIngame: string;
38
+ ImageBoxArt: string;
39
+ Publisher: string;
40
+ Developer: string;
41
+ Genre: string;
42
+ Released: string;
43
+ IsFinal: boolean;
44
+ ConsoleName: string;
45
+ RichPresencePatch: string;
46
+ }
47
+ export interface GetUserSummaryResponse {
48
+ RecentlyPlayedCount: number;
49
+ RecentlyPlayed: RecentlyPlayedGameEntity[];
50
+ MemberSince: string;
51
+ LastActivity: {
52
+ ID: string;
53
+ timestamp: string;
54
+ lastupdate: string;
55
+ activitytype: string;
56
+ User: string;
57
+ data: string;
58
+ data2: string;
59
+ };
60
+ RichPresenceMsg: string;
61
+ LastGameID: string;
62
+ LastGame: LastGameEntity;
63
+ ContribCount: string;
64
+ ContribYield: string;
65
+ TotalPoints: string;
66
+ TotalSoftcorePoints: string;
67
+ TotalTruePoints: string;
68
+ Permissions: string;
69
+ Untracked: "0" | "1";
70
+ ID: string;
71
+ UserWallActive: "0" | "1";
72
+ Motto: string;
73
+ Rank: number;
74
+ Awarded: Record<`${number}`, RecentlyAwardedAchievementEntity>;
75
+ RecentAchievements: Record<`${number}`, Record<`${number}`, ExtendedRecentAchievementEntity>>;
76
+ Points: string;
77
+ SoftcorePoints: string;
78
+ UserPic: string;
79
+ TotalRanked: number;
80
+ Status: string;
81
+ }
82
+ export {};
@@ -0,0 +1,14 @@
1
+ export * from "./dated-user-achievement.model";
2
+ export * from "./dated-user-achievements-response.model";
3
+ export * from "./game-info-and-user-progress.model";
4
+ export * from "./get-game-info-and-user-progress-response.model";
5
+ export * from "./get-user-game-rank-and-score-response.model";
6
+ export * from "./get-user-points-response.model";
7
+ export * from "./get-user-progress-response.model";
8
+ export * from "./get-user-recently-played-games-response.model";
9
+ export * from "./get-user-summary-response.model";
10
+ export * from "./user-game-rank-and-score.model";
11
+ export * from "./user-points.model";
12
+ export * from "./user-progress.model";
13
+ export * from "./user-recently-played-games.model";
14
+ export * from "./user-summary.model";
@@ -0,0 +1,8 @@
1
+ interface UserGameRankAndScoreEntity {
2
+ user: string;
3
+ totalScore: number;
4
+ lastAward: string;
5
+ userRank: number;
6
+ }
7
+ export declare type UserGameRankAndScore = UserGameRankAndScoreEntity[];
8
+ export {};
@@ -0,0 +1,4 @@
1
+ export interface UserPoints {
2
+ points: number;
3
+ softcorePoints: number;
4
+ }
@@ -0,0 +1,10 @@
1
+ interface UserProgressEntity {
2
+ numPossibleAchievements: number;
3
+ possibleScore: number;
4
+ numAchieved: number;
5
+ scoreAchieved: number;
6
+ numAchievedHardcore: number;
7
+ scoreAchievedHardcore: number;
8
+ }
9
+ export declare type UserProgress = Record<`${number}`, UserProgressEntity>;
10
+ export {};
@@ -0,0 +1,16 @@
1
+ interface UserRecentlyPlayedGameEntity {
2
+ gameId: number;
3
+ consoleId: number;
4
+ consoleName: string;
5
+ title: string;
6
+ imageIcon: string;
7
+ lastPlayed: string;
8
+ numPossibleAchievements: number;
9
+ possibleScore: number;
10
+ numAchieved: number;
11
+ scoreAchieved: number;
12
+ numAchievedHardcore: number;
13
+ scoreAchievedHardcore: number;
14
+ }
15
+ export declare type UserRecentlyPlayedGames = UserRecentlyPlayedGameEntity[];
16
+ export {};
@@ -0,0 +1,83 @@
1
+ interface RecentlyPlayedGameEntity {
2
+ gameId: number;
3
+ consoleId: number;
4
+ consoleName: string;
5
+ title: string;
6
+ imageIcon: string;
7
+ lastPlayed: string;
8
+ }
9
+ interface LastActivityEntity {
10
+ id: number;
11
+ timestamp: string;
12
+ lastupdate: string;
13
+ activitytype: number;
14
+ user: string;
15
+ data: string;
16
+ data2: string;
17
+ }
18
+ interface LastGameEntity {
19
+ id: number;
20
+ title: string;
21
+ consoleId: number;
22
+ forumTopicId: number;
23
+ flags: number;
24
+ imageIcon: string;
25
+ imageTitle: string;
26
+ imageIngame: string;
27
+ imageBoxArt: string;
28
+ publisher: string;
29
+ developer: string;
30
+ genre: string;
31
+ released: string;
32
+ isFinal: boolean;
33
+ consoleName: string;
34
+ richPresencePatch: string;
35
+ }
36
+ interface AwardedGameEntity {
37
+ numPossibleAchievements: number;
38
+ possibleScore: number;
39
+ numAchieved: number;
40
+ scoreAchieved: number;
41
+ numAchievedHardcore: number;
42
+ scoreAchievedHardcore: number;
43
+ }
44
+ interface ExtendedRecentAchievementEntity {
45
+ id: number;
46
+ gameId: number;
47
+ gameTitle: string;
48
+ title: string;
49
+ description: string;
50
+ points: number;
51
+ badgeName: string;
52
+ isAwarded: true;
53
+ dateAwarded: string;
54
+ hardcoreAchieved: false;
55
+ }
56
+ export interface UserSummary {
57
+ recentlyPlayedCount: number;
58
+ recentlyPlayed: RecentlyPlayedGameEntity[];
59
+ memberSince: string;
60
+ lastActivity: LastActivityEntity;
61
+ richPresenceMsg: string;
62
+ lastGameId: number;
63
+ lastGame: LastGameEntity;
64
+ contribCount: number;
65
+ contribYield: number;
66
+ totalPoints: number;
67
+ totalSoftcorePoints: number;
68
+ totalTruePoints: number;
69
+ permissions: number;
70
+ untracked: boolean;
71
+ id: number;
72
+ userWallActive: boolean;
73
+ motto: string;
74
+ rank: number;
75
+ awarded: Record<`${number}`, AwardedGameEntity>;
76
+ recentAchievements: Record<`${number}`, Record<`${number}`, ExtendedRecentAchievementEntity>>;
77
+ points: number;
78
+ softcorePoints: number;
79
+ userPic: string;
80
+ totalRanked: number;
81
+ status: string;
82
+ }
83
+ export {};
@@ -0,0 +1 @@
1
+ export declare const apiBaseUrl = "https://retroachievements.org/API";
@@ -0,0 +1,2 @@
1
+ import type { AuthObject } from "../public/models";
2
+ export declare const buildRequestUrl: (baseUrl: string, endpointUrl: string, authObject: AuthObject, args?: Record<string, string | number>) => string;
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Fetch an HTTP resource. This is publicly exposed in the
3
+ * event you would like to access an endpoint that this
4
+ * library does not currently support.
5
+ *
6
+ * UNLESS YOU'RE SURE OF WHAT YOU'RE DOING, YOU PROBABLY
7
+ * SHOULDN'T USE THIS FUNCTION.
8
+ *
9
+ * 2022-10-09: At the time of writing, Node.js LTS (16.x)
10
+ * does not yet support fetch. As a result, we pull in
11
+ * isomorphic-unfetch for Node.js compatibility. Our support
12
+ * matrix includes 14.x and 16.x.
13
+ *
14
+ * @FIXME - When Node.js 20.x is released, remove the
15
+ * isomorphic-unfetch dependency. At that point we will have
16
+ * two major LTS versions that include a native fetch API.
17
+ */
18
+ export declare const call: <T extends readonly any[] | Record<string, any>>(config: {
19
+ url: string;
20
+ }) => Promise<T>;
@@ -0,0 +1,4 @@
1
+ export * from "./apiBaseUrl";
2
+ export * from "./buildRequestUrl";
3
+ export * from "./call";
4
+ export * from "./serializeProperties";
@@ -0,0 +1,4 @@
1
+ export declare const serializeProperties: (originalData: any, options?: Partial<{
2
+ shouldCastToNumbers: string[];
3
+ shouldMapToBooleans: string[];
4
+ }>) => any;
@@ -0,0 +1,22 @@
1
+ import type { AuthObject } from "./models";
2
+ /**
3
+ * Accepts your RetroAchievements.org userName and web API key. After
4
+ * receiving these inputs, the function returns you a value that can be
5
+ * used for the authentication parameter by any of the async calls in this
6
+ * library.
7
+ *
8
+ * Your account's personal Web API Key can be found on the Settings page
9
+ * of RetroAchievements.org. Do not use a Web API Key that is not associated
10
+ * with your account.
11
+ *
12
+ * @returns An `AuthObject` that you can pass to any of the API call functions.
13
+ *
14
+ * @example
15
+ * ```
16
+ * const authorization = buildAuthorization({
17
+ * userName: "Scott",
18
+ * webApiKey: "LtjCwW16nJI7cqOyPIQtXk8v1cfF0tmO"
19
+ * });
20
+ * ```
21
+ */
22
+ export declare const buildAuthorization: (options: AuthObject) => AuthObject;
@@ -0,0 +1,3 @@
1
+ export { call as unsafe_call } from "../internal/call";
2
+ export * from "./buildAuthorization";
3
+ export * from "./models";
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Each RetroAchievements API call is uniquely authenticated
3
+ * using a userName + API key combination. Your account's personal
4
+ * Web API Key can be found on the Settings page.
5
+ */
6
+ export interface AuthObject {
7
+ /**
8
+ * You or your app's exact username on the RetroAchievements.org website.
9
+ * For example, https://retroachievements.org/user/Scott would have a value
10
+ * of "Scott".
11
+ */
12
+ userName: string;
13
+ /**
14
+ * This can be found in the "Keys" section of your Settings page on the
15
+ * RetroAchievements.org website. This is a 32-digit alphanumeric key
16
+ * that is case-sensitive.
17
+ */
18
+ webApiKey: string;
19
+ }
@@ -0,0 +1 @@
1
+ export * from "./auth-object.model";
package/package.json ADDED
@@ -0,0 +1,117 @@
1
+ {
2
+ "name": "@retroachievements/api",
3
+ "description": "A well-tested library that lets you get achievement, user, and game data from RetroAchievements.",
4
+ "keywords": [
5
+ "retroachievements",
6
+ "achievements",
7
+ "trophies",
8
+ "raweb",
9
+ "retro gaming"
10
+ ],
11
+ "version": "0.0.0-development",
12
+ "main": "dist/index.js",
13
+ "module": "dist/api.esm.js",
14
+ "typings": "dist/index.d.ts",
15
+ "exports": {
16
+ ".": {
17
+ "require": "./dist/index.js",
18
+ "import": "./dist/api.esm.js"
19
+ }
20
+ },
21
+ "license": "MIT",
22
+ "files": [
23
+ "dist",
24
+ "src"
25
+ ],
26
+ "scripts": {
27
+ "dev": "esrun --watch src/__playground.ts",
28
+ "build": "dts build",
29
+ "prepare": "dts build",
30
+ "format": "prettier --write . '**/*.{json,md,js,ts,tsx}'",
31
+ "format:write": "prettier --write . '**/*.{json,md,js,ts,tsx}'",
32
+ "format:check": "prettier --check . '**/*.{json,md,js,ts,tsx}'",
33
+ "lint": "eslint --ignore-path .gitignore --ext .js,.ts,.tsx .",
34
+ "lint:fix": "eslint --ignore-path .gitignore --ext .js,.ts,.tsx . --fix",
35
+ "test": "jest --selectProjects UNIT",
36
+ "test:coverage": "jest --selectProjects UNIT --coverage",
37
+ "verify": "yarn format:check && yarn lint && yarn test:coverage && yarn build && yarn size",
38
+ "size": "size-limit",
39
+ "start": "dts watch"
40
+ },
41
+ "dependencies": {
42
+ "isomorphic-unfetch": "^3.1.0"
43
+ },
44
+ "peerDependencies": {},
45
+ "devDependencies": {
46
+ "@commitlint/cli": "^17.1.2",
47
+ "@commitlint/config-conventional": "^17.1.0",
48
+ "@digitak/esrun": "^3.2.13",
49
+ "@size-limit/preset-small-lib": "^8.1.0",
50
+ "@swc/core": "^1.3.10",
51
+ "@swc/jest": "^0.2.23",
52
+ "@tsconfig/recommended": "^1.0.1",
53
+ "@types/jest": "^29.2.0",
54
+ "@typescript-eslint/eslint-plugin": "^5.41.0",
55
+ "@typescript-eslint/parser": "^5.41.0",
56
+ "cz-conventional-changelog": "^3.3.0",
57
+ "dotenv-flow-cli": "^1.0.0",
58
+ "dts-cli": "^1.6.0",
59
+ "eslint": "^8.26.0",
60
+ "eslint-config-prettier": "^8.5.0",
61
+ "eslint-import-resolver-typescript": "^3.5.2",
62
+ "eslint-plugin-import": "^2.26.0",
63
+ "eslint-plugin-simple-import-sort": "^8.0.0",
64
+ "eslint-plugin-sonarjs": "^0.16.0",
65
+ "eslint-plugin-unicorn": "^44.0.2",
66
+ "husky": "^4.3.8",
67
+ "jest": "^29.2.1",
68
+ "msw": "^0.47.4",
69
+ "prettier": "2.7.1",
70
+ "pretty-quick": "3.1.3",
71
+ "size-limit": "^8.1.0",
72
+ "tslib": "^2.4.0",
73
+ "type-fest": "^3.1.0",
74
+ "typescript": "^4.8.4"
75
+ },
76
+ "size-limit": [
77
+ {
78
+ "path": "dist/api.cjs.production.min.js",
79
+ "limit": "10 KB"
80
+ },
81
+ {
82
+ "path": "dist/api.esm.js",
83
+ "limit": "10 KB"
84
+ }
85
+ ],
86
+ "husky": {
87
+ "hooks": {
88
+ "pre-commit": "pretty-quick --staged && yarn lint",
89
+ "commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
90
+ }
91
+ },
92
+ "config": {
93
+ "commitizen": {
94
+ "path": "./node_modules/cz-conventional-changelog"
95
+ }
96
+ },
97
+ "engines": {
98
+ "node": ">=14",
99
+ "npm": "please-use-yarn",
100
+ "yarn": ">= 1.19.1"
101
+ },
102
+ "release": {
103
+ "branches": [
104
+ "main",
105
+ "next"
106
+ ]
107
+ },
108
+ "repository": {
109
+ "type": "git",
110
+ "url": "git+https://github.com/RetroAchievements/retroachievements-api-js.git"
111
+ },
112
+ "bugs": {
113
+ "url": "https://github.com/RetroAchievements/retroachievements-api-js/issues"
114
+ },
115
+ "homepage": "https://github.com/RetroAchievements/retroachievements-api-js#readme",
116
+ "author": "RAWeb Team"
117
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * PLEASE ONLY COMMIT CHANGES TO THIS FILE IF YOU WANT THEM
3
+ * TO DIRECTLY IMPACT EVERY DEV WORKING ON THE PROJECT.
4
+ *
5
+ * Use this file to test and experiment with changes to the project.
6
+ */
7
+
8
+ // If you can't import what you want from "./index", users won't
9
+ // be able to import it either.
10
+ import { buildAuthorization, getTicketData } from "./index";
11
+
12
+ const main = async () => {
13
+ console.log("retroachievements-api-js playground is running.");
14
+ console.log(""); // newline
15
+
16
+ // -- Start testing stuff here --
17
+
18
+ const authorization = buildAuthorization({
19
+ userName: "WCopeland",
20
+ webApiKey: "gYPwmMOAIiGkOmk1qpNDrTfqBiGIeh7X"
21
+ });
22
+
23
+ const ticketData = await getTicketData(authorization, {});
24
+ console.log(ticketData);
25
+ };
26
+
27
+ main();
@@ -0,0 +1,71 @@
1
+ import { rest } from "msw";
2
+ import { setupServer } from "msw/node";
3
+
4
+ import { apiBaseUrl } from "../utils/internal";
5
+ import { buildAuthorization } from "../utils/public";
6
+ import { getAchievementUnlocks } from "./getAchievementUnlocks";
7
+ import type { GetAchievementUnlocksResponse } from "./models";
8
+
9
+ const server = setupServer();
10
+
11
+ describe("Function: getAchievementUnlocks", () => {
12
+ // MSW Setup
13
+ beforeAll(() => server.listen());
14
+ afterEach(() => server.resetHandlers());
15
+ afterAll(() => server.close());
16
+
17
+ it("is defined #sanity", () => {
18
+ // ASSERT
19
+ expect(getAchievementUnlocks).toBeDefined();
20
+ });
21
+
22
+ it("retrieves metadata about unlocks for a target achievement", async () => {
23
+ // ARRANGE
24
+ const authorization = buildAuthorization({
25
+ userName: "mockUserName",
26
+ webApiKey: "mockWebApiKey"
27
+ });
28
+
29
+ const mockResponse: GetAchievementUnlocksResponse = [
30
+ {
31
+ User: "Podgicus0305",
32
+ RAPoints: "15544",
33
+ DateAwarded: "2022-07-12 19:06:34",
34
+ HardcoreMode: "1"
35
+ }
36
+ ];
37
+
38
+ let searchParams = "";
39
+
40
+ server.use(
41
+ rest.get(
42
+ `${apiBaseUrl}/API_GetAchievementUnlocks.php`,
43
+ (req, res, ctx) => {
44
+ searchParams = req.url.search;
45
+ return res(ctx.json(mockResponse));
46
+ }
47
+ )
48
+ );
49
+
50
+ // ACT
51
+ const response = await getAchievementUnlocks(authorization, {
52
+ achievementId: 18_000,
53
+ count: 1,
54
+ offset: 1
55
+ });
56
+
57
+ // ASSERT
58
+ expect(searchParams).toContain("a=18000");
59
+ expect(searchParams).toContain("o=1");
60
+ expect(searchParams).toContain("c=1");
61
+
62
+ expect(response).toEqual([
63
+ {
64
+ user: "Podgicus0305",
65
+ raPoints: 15_544,
66
+ dateAwarded: "2022-07-12 19:06:34",
67
+ hardcoreMode: true
68
+ }
69
+ ]);
70
+ });
71
+ });
@@ -0,0 +1,80 @@
1
+ import {
2
+ apiBaseUrl,
3
+ buildRequestUrl,
4
+ call,
5
+ serializeProperties
6
+ } from "../utils/internal";
7
+ import type { AuthObject } from "../utils/public";
8
+ import type {
9
+ AchievementUnlockEntity,
10
+ GetAchievementUnlocksResponse
11
+ } from "./models";
12
+
13
+ /**
14
+ * A call to this function will retrieve a list of users who
15
+ * have earned the given achievementId.
16
+ *
17
+ * @param authorization An object containing your userName and webApiKey.
18
+ * This can be constructed with `buildAuthorization()`.
19
+ *
20
+ * @param payload.achievementId The target achievement we want to
21
+ * retrieve the unlocks list for. If unknown, this can be found
22
+ * by navigating to the achievement's page on the RetroAchievements.org
23
+ * website. eg: https://retroachievements.org/achievement/13876 has an
24
+ * ID of 13876.
25
+ *
26
+ * @param payload.offset Defaults to 0. The number of entries to skip.
27
+ *
28
+ * @param payload.count Defaults to 50, has a max of 500.
29
+ *
30
+ * @example
31
+ * ```
32
+ * const achievementUnlocks = await getAchievementUnlocks(
33
+ * authorization,
34
+ * { achievementId: 13876 }
35
+ * );
36
+ * ```
37
+ *
38
+ * @returns An array containing metadata about unlocks for
39
+ * the target achievement.
40
+ * ```
41
+ * [
42
+ * {
43
+ * user: 'Podgicus0305',
44
+ * raPoints: 15544,
45
+ * dateAwarded: '2022-07-12 19:06:34',
46
+ * hardcoreMode: true
47
+ * }
48
+ * ]
49
+ * ```
50
+ */
51
+ export const getAchievementUnlocks = async (
52
+ authorization: AuthObject,
53
+ payload: { achievementId: number; offset?: number; count?: number }
54
+ ): Promise<AchievementUnlockEntity[]> => {
55
+ const { achievementId, offset, count } = payload;
56
+
57
+ const queryParams: Record<string, number> = { a: achievementId };
58
+
59
+ if (offset) {
60
+ queryParams.o = offset;
61
+ }
62
+
63
+ if (count) {
64
+ queryParams.c = count;
65
+ }
66
+
67
+ const url = buildRequestUrl(
68
+ apiBaseUrl,
69
+ "/API_GetAchievementUnlocks.php",
70
+ authorization,
71
+ queryParams
72
+ );
73
+
74
+ const rawResponse = await call<GetAchievementUnlocksResponse>({ url });
75
+
76
+ return serializeProperties(rawResponse, {
77
+ shouldCastToNumbers: ["RAPoints"],
78
+ shouldMapToBooleans: ["HardcoreMode"]
79
+ });
80
+ };
@@ -0,0 +1,2 @@
1
+ export * from "./getAchievementUnlocks";
2
+ export * from "./models";