@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,20 @@
1
+ interface DatedUserAchievementResponseEntity {
2
+ Date: string;
3
+ HardcoreMode: string;
4
+ AchievementID: string;
5
+ Title: string;
6
+ Description: string;
7
+ BadgeName: string;
8
+ Points: string;
9
+ Author: string;
10
+ GameTitle: string;
11
+ GameIcon: string;
12
+ GameID: string;
13
+ ConsoleName: string;
14
+ CumulScore: number;
15
+ BadgeURL: string;
16
+ GameURL: string;
17
+ }
18
+
19
+ export type DatedUserAchievementsResponse =
20
+ DatedUserAchievementResponseEntity[];
@@ -0,0 +1,19 @@
1
+ import type {
2
+ GameExtended,
3
+ GameExtendedAchievementEntity
4
+ } from "../../game/models";
5
+
6
+ export type GameExtendedAchievementEntityWithUserProgress =
7
+ GameExtendedAchievementEntity & {
8
+ dateEarned: string;
9
+ dateEarnedHardcore: string;
10
+ };
11
+
12
+ export interface GameInfoAndUserProgress extends GameExtended {
13
+ achievements: Record<number, GameExtendedAchievementEntityWithUserProgress>;
14
+
15
+ numAwardedToUser: number;
16
+ numAwardedToUserHardcore: number;
17
+ userCompletion: string;
18
+ userCompletionHardcore: string;
19
+ }
@@ -0,0 +1,28 @@
1
+ import type {
2
+ GameExtendedRawAchievementEntity,
3
+ GetGameExtendedResponse
4
+ } from "../../game/models";
5
+
6
+ type GetGameExtendedResponseWithoutClaims = Omit<
7
+ GetGameExtendedResponse,
8
+ "Claims"
9
+ >;
10
+
11
+ type GameExtendedRawAchievementEntityWithUserProgress =
12
+ GameExtendedRawAchievementEntity & {
13
+ DateEarned: string;
14
+ DateEarnedHardcore: string;
15
+ };
16
+
17
+ export interface GetGameInfoAndUserProgressResponse
18
+ extends GetGameExtendedResponseWithoutClaims {
19
+ Achievements: Record<
20
+ number,
21
+ GameExtendedRawAchievementEntityWithUserProgress
22
+ >;
23
+
24
+ NumAwardedToUser: number;
25
+ NumAwardedToUserHardcore: number;
26
+ UserCompletion: string;
27
+ UserCompletionHardcore: string;
28
+ }
@@ -0,0 +1,9 @@
1
+ interface UserGameRankAndScoreResponseEntity {
2
+ User: string;
3
+ TotalScore: string;
4
+ LastAward: string;
5
+ UserRank: string;
6
+ }
7
+
8
+ export type GetUserGameRankAndScoreResponse =
9
+ UserGameRankAndScoreResponseEntity[];
@@ -0,0 +1,4 @@
1
+ export interface GetUserPointsResponse {
2
+ Points: number;
3
+ SoftcorePoints: number;
4
+ }
@@ -0,0 +1,13 @@
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
+
10
+ export type GetUserProgressResponse = Record<
11
+ `${number}`,
12
+ UserProgressResponseEntity
13
+ >;
@@ -0,0 +1,17 @@
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
+
16
+ export type GetUserRecentlyPlayedGamesResponse =
17
+ UserRecentlyPlayedGameResponseEntity[];
@@ -0,0 +1,92 @@
1
+ interface RecentlyPlayedGameEntity {
2
+ GameID: string;
3
+ ConsoleID: string;
4
+ ConsoleName: string;
5
+ Title: string;
6
+ ImageIcon: string;
7
+ LastPlayed: string;
8
+ }
9
+
10
+ interface RecentlyAwardedAchievementEntity {
11
+ NumPossibleAchievements: string;
12
+ PossibleScore: string;
13
+ NumAchieved: number | string;
14
+ ScoreAchieved: number | string;
15
+ NumAchievedHardcore: number | string;
16
+ ScoreAchievedHardcore: number | string;
17
+ }
18
+
19
+ interface ExtendedRecentAchievementEntity {
20
+ ID: string;
21
+ GameID: string;
22
+ GameTitle: string;
23
+ Title: string;
24
+ Description: string;
25
+ Points: string;
26
+ BadgeName: string;
27
+ IsAwarded: "1";
28
+ DateAwarded: string;
29
+ HardcoreAchieved: "0";
30
+ }
31
+
32
+ interface LastGameEntity {
33
+ ID: number;
34
+ Title: string;
35
+ ConsoleID: number;
36
+ ForumTopicID: number;
37
+ Flags: number;
38
+ ImageIcon: string;
39
+ ImageTitle: string;
40
+ ImageIngame: string;
41
+ ImageBoxArt: string;
42
+ Publisher: string;
43
+ Developer: string;
44
+ Genre: string;
45
+ Released: string;
46
+ IsFinal: boolean;
47
+ ConsoleName: string;
48
+ RichPresencePatch: string;
49
+ }
50
+
51
+ export interface GetUserSummaryResponse {
52
+ RecentlyPlayedCount: number;
53
+ RecentlyPlayed: RecentlyPlayedGameEntity[];
54
+ MemberSince: string;
55
+
56
+ LastActivity: {
57
+ ID: string;
58
+ timestamp: string;
59
+ lastupdate: string;
60
+ activitytype: string;
61
+ User: string;
62
+ data: string;
63
+ data2: string;
64
+ };
65
+
66
+ RichPresenceMsg: string;
67
+ LastGameID: string;
68
+ LastGame: LastGameEntity;
69
+ ContribCount: string;
70
+ ContribYield: string;
71
+ TotalPoints: string;
72
+ TotalSoftcorePoints: string;
73
+ TotalTruePoints: string;
74
+ Permissions: string;
75
+ Untracked: "0" | "1";
76
+ ID: string;
77
+ UserWallActive: "0" | "1";
78
+ Motto: string;
79
+ Rank: number;
80
+ Awarded: Record<`${number}`, RecentlyAwardedAchievementEntity>;
81
+
82
+ RecentAchievements: Record<
83
+ `${number}`,
84
+ Record<`${number}`, ExtendedRecentAchievementEntity>
85
+ >;
86
+
87
+ Points: string;
88
+ SoftcorePoints: string;
89
+ UserPic: string;
90
+ TotalRanked: number;
91
+ Status: string;
92
+ }
@@ -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
+
8
+ export type UserGameRankAndScore = UserGameRankAndScoreEntity[];
@@ -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
+
10
+ export type UserProgress = Record<`${number}`, UserProgressEntity>;
@@ -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
+
16
+ export type UserRecentlyPlayedGames = UserRecentlyPlayedGameEntity[];
@@ -0,0 +1,92 @@
1
+ interface RecentlyPlayedGameEntity {
2
+ gameId: number;
3
+ consoleId: number;
4
+ consoleName: string;
5
+ title: string;
6
+ imageIcon: string;
7
+ lastPlayed: string;
8
+ }
9
+
10
+ interface LastActivityEntity {
11
+ id: number;
12
+ timestamp: string;
13
+ lastupdate: string;
14
+ activitytype: number;
15
+ user: string;
16
+ data: string;
17
+ data2: string;
18
+ }
19
+
20
+ interface LastGameEntity {
21
+ id: number;
22
+ title: string;
23
+ consoleId: number;
24
+ forumTopicId: number;
25
+ flags: number;
26
+ imageIcon: string;
27
+ imageTitle: string;
28
+ imageIngame: string;
29
+ imageBoxArt: string;
30
+ publisher: string;
31
+ developer: string;
32
+ genre: string;
33
+ released: string;
34
+ isFinal: boolean;
35
+ consoleName: string;
36
+ richPresencePatch: string;
37
+ }
38
+
39
+ interface AwardedGameEntity {
40
+ numPossibleAchievements: number;
41
+ possibleScore: number;
42
+ numAchieved: number;
43
+ scoreAchieved: number;
44
+ numAchievedHardcore: number;
45
+ scoreAchievedHardcore: number;
46
+ }
47
+
48
+ interface ExtendedRecentAchievementEntity {
49
+ id: number;
50
+ gameId: number;
51
+ gameTitle: string;
52
+ title: string;
53
+ description: string;
54
+ points: number;
55
+ badgeName: string;
56
+ isAwarded: true;
57
+ dateAwarded: string;
58
+ hardcoreAchieved: false;
59
+ }
60
+
61
+ export interface UserSummary {
62
+ recentlyPlayedCount: number;
63
+ recentlyPlayed: RecentlyPlayedGameEntity[];
64
+ memberSince: string;
65
+ lastActivity: LastActivityEntity;
66
+ richPresenceMsg: string;
67
+ lastGameId: number;
68
+ lastGame: LastGameEntity;
69
+ contribCount: number;
70
+ contribYield: number;
71
+ totalPoints: number;
72
+ totalSoftcorePoints: number;
73
+ totalTruePoints: number;
74
+ permissions: number;
75
+ untracked: boolean;
76
+ id: number;
77
+ userWallActive: boolean;
78
+ motto: string;
79
+ rank: number;
80
+ awarded: Record<`${number}`, AwardedGameEntity>;
81
+
82
+ recentAchievements: Record<
83
+ `${number}`,
84
+ Record<`${number}`, ExtendedRecentAchievementEntity>
85
+ >;
86
+
87
+ points: number;
88
+ softcorePoints: number;
89
+ userPic: string;
90
+ totalRanked: number;
91
+ status: string;
92
+ }
@@ -0,0 +1 @@
1
+ export const apiBaseUrl = "https://retroachievements.org/API";
@@ -0,0 +1,51 @@
1
+ import { buildRequestUrl } from "./buildRequestUrl";
2
+
3
+ describe("Util: buildRequestUrl", () => {
4
+ it("is defined #sanity", () => {
5
+ // ASSERT
6
+ expect(buildRequestUrl).toBeDefined();
7
+ });
8
+
9
+ it("given a baseUrl, endpointUrl, and some arguments, returns a correctly-constructed URL", () => {
10
+ // ARRANGE
11
+ const baseUrl = "https://retroachievements.org/API/";
12
+ const endpointUrl = "/:baz/API_GetConsoleIDs.php";
13
+
14
+ const args = {
15
+ baz: "myBazValue",
16
+ limit: 10,
17
+ offset: 2,
18
+ notDefined: undefined
19
+ };
20
+
21
+ // ACT
22
+ const requestUrl = buildRequestUrl(
23
+ baseUrl,
24
+ endpointUrl,
25
+ { userName: "TestUser", webApiKey: "mockWebApiKey" },
26
+ args as any
27
+ );
28
+
29
+ // ASSERT
30
+ expect(requestUrl).toEqual(
31
+ "https://retroachievements.org/API/myBazValue/API_GetConsoleIDs.php?z=TestUser&y=mockWebApiKey&limit=10&offset=2"
32
+ );
33
+ });
34
+
35
+ it("given no arguments, returns a correctly-constructed URL", () => {
36
+ // ARRANGE
37
+ const baseUrl = "https://retroachievements.org/API/";
38
+ const endpointUrl = "/:baz/API_GetConsoleIDs.php";
39
+
40
+ // ACT
41
+ const requestUrl = buildRequestUrl(baseUrl, endpointUrl, {
42
+ userName: "TestUser",
43
+ webApiKey: "mockWebApiKey"
44
+ });
45
+
46
+ // ASSERT
47
+ expect(requestUrl).toEqual(
48
+ "https://retroachievements.org/API/:baz/API_GetConsoleIDs.php?z=TestUser&y=mockWebApiKey"
49
+ );
50
+ });
51
+ });
@@ -0,0 +1,32 @@
1
+ import type { AuthObject } from "../public/models";
2
+
3
+ export const buildRequestUrl = (
4
+ baseUrl: string,
5
+ endpointUrl: string,
6
+ authObject: AuthObject,
7
+ args: Record<string, string | number> = {}
8
+ ) => {
9
+ const concatenated = `${baseUrl}/${endpointUrl}`;
10
+ const withoutDoubleSlashes = concatenated.replace(/([^:]\/)\/+/g, "$1");
11
+
12
+ let withArgs = withoutDoubleSlashes;
13
+
14
+ // `z` and `y` are expected query params from the RA API.
15
+ // Authentication is handled purely by query params.
16
+ const queryParamValues: Record<string, string> = {
17
+ z: authObject.userName,
18
+ y: authObject.webApiKey
19
+ };
20
+
21
+ for (const [argKey, argValue] of Object.entries(args)) {
22
+ // "abc.com/some-route/:foo/some-path" & {"foo": 4} --> "abc.com/some-route/4/some-path"
23
+ if (withArgs.includes(`:${argKey}`)) {
24
+ withArgs = withArgs.replace(`:${argKey}`, String(argValue));
25
+ } else if (argValue !== undefined) {
26
+ queryParamValues[argKey] = String(argValue);
27
+ }
28
+ }
29
+
30
+ const queryString = new URLSearchParams(queryParamValues).toString();
31
+ return `${withArgs}?${queryString}`;
32
+ };
@@ -0,0 +1,39 @@
1
+ import { rest } from "msw";
2
+ import { setupServer } from "msw/node";
3
+
4
+ import { call } from "./call";
5
+
6
+ const server = setupServer();
7
+
8
+ describe("Util: call", () => {
9
+ // MSW Setup
10
+ beforeAll(() => server.listen());
11
+ afterEach(() => server.resetHandlers());
12
+ afterAll(() => server.close());
13
+
14
+ it("is defined #sanity", () => {
15
+ // ASSERT
16
+ expect(call).toBeDefined();
17
+ });
18
+
19
+ it("given a url, makes a GET call", async () => {
20
+ // ARRANGE
21
+ let receivedMethod = "";
22
+
23
+ const mockRequestUrl = "https://abc.xyz/v1/endpoint";
24
+
25
+ server.use(
26
+ rest.get(mockRequestUrl, (req, res, ctx) => {
27
+ receivedMethod = req.method;
28
+ return res(ctx.json({ foo: "bar" }));
29
+ })
30
+ );
31
+
32
+ // ACT
33
+ const response = await call({ url: mockRequestUrl });
34
+
35
+ // ASSERT
36
+ expect(response).toEqual({ foo: "bar" });
37
+ expect(receivedMethod).toEqual("GET");
38
+ });
39
+ });
@@ -0,0 +1,29 @@
1
+ import unfetch from "isomorphic-unfetch";
2
+
3
+ /**
4
+ * Fetch an HTTP resource. This is publicly exposed in the
5
+ * event you would like to access an endpoint that this
6
+ * library does not currently support.
7
+ *
8
+ * UNLESS YOU'RE SURE OF WHAT YOU'RE DOING, YOU PROBABLY
9
+ * SHOULDN'T USE THIS FUNCTION.
10
+ *
11
+ * 2022-10-09: At the time of writing, Node.js LTS (16.x)
12
+ * does not yet support fetch. As a result, we pull in
13
+ * isomorphic-unfetch for Node.js compatibility. Our support
14
+ * matrix includes 14.x and 16.x.
15
+ *
16
+ * @FIXME - When Node.js 20.x is released, remove the
17
+ * isomorphic-unfetch dependency. At that point we will have
18
+ * two major LTS versions that include a native fetch API.
19
+ */
20
+ export const call = async <
21
+ T extends readonly any[] | Record<string, any>
22
+ >(config: {
23
+ url: string;
24
+ }) => {
25
+ const { url } = config;
26
+
27
+ const rawResponse = await unfetch(url);
28
+ return (await rawResponse.json()) as T;
29
+ };
@@ -0,0 +1,4 @@
1
+ export * from "./apiBaseUrl";
2
+ export * from "./buildRequestUrl";
3
+ export * from "./call";
4
+ export * from "./serializeProperties";
@@ -0,0 +1,141 @@
1
+ /* eslint-disable sonarjs/no-duplicate-string */
2
+
3
+ import { serializeProperties } from "./serializeProperties";
4
+
5
+ describe("Util: serializeProperties", () => {
6
+ it("is defined #sanity", () => {
7
+ // ASSERT
8
+ expect(serializeProperties).toBeDefined();
9
+ });
10
+
11
+ it("can serialize a simple object", () => {
12
+ // ARRANGE
13
+ const originalObject = {
14
+ ID: 1,
15
+ GameID: 100,
16
+ AchievementIDs: [1, 2, 3, 4, 5],
17
+ RAPoints: 100,
18
+ ConsoleName: "PlayStation Portable"
19
+ };
20
+
21
+ // ACT
22
+ const sanitizedObject = serializeProperties(originalObject);
23
+
24
+ // ASSERT
25
+ expect(sanitizedObject).toEqual({
26
+ id: 1,
27
+ gameId: 100,
28
+ achievementIds: [1, 2, 3, 4, 5],
29
+ raPoints: 100,
30
+ consoleName: "PlayStation Portable"
31
+ });
32
+ });
33
+
34
+ it("can serialize an array of objects", () => {
35
+ // ARRANGE
36
+ const originalArray = [
37
+ {
38
+ ID: 1,
39
+ GameID: 100,
40
+ AchievementIDs: [1, 2, 3, 4, 5],
41
+ RAPoints: 100,
42
+ ConsoleName: "PlayStation Portable"
43
+ }
44
+ ];
45
+
46
+ // ACT
47
+ const sanitizedArray = serializeProperties(originalArray);
48
+
49
+ // ASSERT
50
+ expect(sanitizedArray).toEqual([
51
+ {
52
+ id: 1,
53
+ gameId: 100,
54
+ achievementIds: [1, 2, 3, 4, 5],
55
+ raPoints: 100,
56
+ consoleName: "PlayStation Portable"
57
+ }
58
+ ]);
59
+ });
60
+
61
+ it("can serialize an object that contains nested objects", () => {
62
+ // ARRANGE
63
+ const originalObject = {
64
+ ID: 1,
65
+ GameID: 100,
66
+ AchievementIDs: [1, 2, 3, 4, 5],
67
+ RAPoints: 100,
68
+ ConsoleName: "PlayStation Portable",
69
+ UserMeta: {
70
+ Name: "xelnia",
71
+ Points: 100
72
+ }
73
+ };
74
+
75
+ // ACT
76
+ const sanitizedObject = serializeProperties(originalObject);
77
+
78
+ // ASSERT
79
+ expect(sanitizedObject).toEqual({
80
+ id: 1,
81
+ gameId: 100,
82
+ achievementIds: [1, 2, 3, 4, 5],
83
+ raPoints: 100,
84
+ consoleName: "PlayStation Portable",
85
+ userMeta: {
86
+ name: "xelnia",
87
+ points: 100
88
+ }
89
+ });
90
+ });
91
+
92
+ it("can be instructed to cast values of certain keys to numbers", () => {
93
+ // ARRANGE
94
+ const originalObject = {
95
+ UserName: "xelnia",
96
+ Points: "500",
97
+ Metadata: {
98
+ TitleID: "100"
99
+ }
100
+ };
101
+
102
+ // ACT
103
+ const sanitizedObject = serializeProperties(originalObject, {
104
+ shouldCastToNumbers: ["TitleID", "Points"]
105
+ });
106
+
107
+ // ASSERT
108
+ expect(sanitizedObject).toEqual({
109
+ userName: "xelnia",
110
+ points: 500,
111
+ metadata: {
112
+ titleId: 100
113
+ }
114
+ });
115
+ });
116
+
117
+ it("can be instructed to map values of certain keys to booleans", () => {
118
+ // ARRANGE
119
+ const originalObject = {
120
+ UserName: "xelnia",
121
+ HardcoreMode: "0",
122
+ Metadata: {
123
+ IsCoolGuy: "1"
124
+ }
125
+ };
126
+
127
+ // ACT
128
+ const sanitizedObject = serializeProperties(originalObject, {
129
+ shouldMapToBooleans: ["HardcoreMode", "IsCoolGuy"]
130
+ });
131
+
132
+ // ASSERT
133
+ expect(sanitizedObject).toEqual({
134
+ userName: "xelnia",
135
+ hardcoreMode: false,
136
+ metadata: {
137
+ isCoolGuy: true
138
+ }
139
+ });
140
+ });
141
+ });