speedruncom.js 1.1.1 → 1.2.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/Client.js ADDED
@@ -0,0 +1,664 @@
1
+ import axios from 'axios';
2
+ const BASE_USER_AGENT = 'speedruncom.js';
3
+ const BASE_URL = 'https://www.speedrun.com/api/v2/';
4
+ const HEADERS = {
5
+ 'Accept-Language': 'en',
6
+ 'Accept': 'application/json'
7
+ };
8
+ const isBrowser = typeof window !== 'undefined';
9
+ const objectToBase64 = (obj) => {
10
+ const jsonString = JSON.stringify(obj).replace(/\s+/g, '');
11
+ return Buffer.from(jsonString).toString('base64');
12
+ };
13
+ class APIError extends Error {
14
+ constructor(message, status) {
15
+ super(message);
16
+ this.message = message;
17
+ this.status = status;
18
+ }
19
+ }
20
+ class Client {
21
+ constructor(config) {
22
+ /**
23
+ * `AxiosInstance` used on instance-called methods (called with `POST`).
24
+ */
25
+ this.axiosClient = axios.create({
26
+ baseURL: BASE_URL,
27
+ method: 'POST',
28
+ withCredentials: true,
29
+ headers: HEADERS
30
+ });
31
+ this.headers = this.axiosClient.defaults.headers.common;
32
+ if (config)
33
+ this.config(config);
34
+ this.axiosClient.interceptors.response.use((response) => response, (error) => {
35
+ const data = error.response.data;
36
+ throw new APIError(data.error || 'Unknown error', error.response.status);
37
+ });
38
+ }
39
+ config(config) {
40
+ if (!isBrowser)
41
+ this.headers['User-Agent'] = BASE_USER_AGENT + (config.userAgent ? `/${config.userAgent}` : '');
42
+ if (config.PHPSESSID) {
43
+ if (isBrowser) {
44
+ console.error('You cannot use a PHPSESSID to authenticate in a browser environment.');
45
+ }
46
+ else {
47
+ this.headers['Cookie'] = `PHPSESSID=${config.PHPSESSID}`;
48
+ }
49
+ }
50
+ }
51
+ async request(endpoint, params = {}) {
52
+ const response = await this.axiosClient.post(endpoint, params);
53
+ const cookie = response.headers['set-cookie'];
54
+ if (cookie && !isBrowser)
55
+ this.headers['Cookie'] = cookie[0].split(';')[0];
56
+ return response.data;
57
+ }
58
+ static async request(endpoint, params = {}) {
59
+ return (await this.axiosClient.get(`${endpoint}?_r=${objectToBase64(params)}`)).data;
60
+ }
61
+ //Built-in endpoints for auth
62
+ /**
63
+ * Attempts to authorize your cookies if using a browser, or authorizes this Client if otherwise.
64
+ * If the account has two factor authentication, you have to use `setToken` with the token sent to the account's email address.
65
+ */
66
+ async login(username, password) {
67
+ this.username = username;
68
+ this.password = password;
69
+ return await this.request('PutAuthLogin', {
70
+ name: username,
71
+ password
72
+ });
73
+ }
74
+ /**
75
+ * Attempts to authorize your cookies if using a browser, or authorizes this Client if otherwise, with the token that `login()` sent to the account's email address.
76
+ * @param token The 5-digit code sent to your email after a successful `login()`.
77
+ */
78
+ async setToken(token) {
79
+ return await this.request('PutAuthLogin', {
80
+ name: this.username,
81
+ password: this.password,
82
+ token
83
+ });
84
+ }
85
+ /**
86
+ * Attempts to remove the PHPSESSID cookie if using a browser, otherwise removes your Client's authentication.
87
+ */
88
+ async logout() {
89
+ if (isBrowser)
90
+ return await this.request('PutAuthLogout');
91
+ delete this.headers['Cookie'];
92
+ }
93
+ // Endpoints (auto-generated with build-client)
94
+ async GetGameLeaderboard2(params) {
95
+ return await this.request('GetGameLeaderboard2', params);
96
+ }
97
+ static async GetGameLeaderboard2(params) {
98
+ return await this.request('GetGameLeaderboard2', params);
99
+ }
100
+ async GetGameLeaderboard(params) {
101
+ return await this.request('GetGameLeaderboard', params);
102
+ }
103
+ static async GetGameLeaderboard(params) {
104
+ return await this.request('GetGameLeaderboard', params);
105
+ }
106
+ async GetGameData(params) {
107
+ return await this.request('GetGameData', params);
108
+ }
109
+ static async GetGameData(params) {
110
+ return await this.request('GetGameData', params);
111
+ }
112
+ async GetGameSummary(params) {
113
+ return await this.request('GetGameSummary', params);
114
+ }
115
+ static async GetGameSummary(params) {
116
+ return await this.request('GetGameSummary', params);
117
+ }
118
+ async GetGameRecordHistory(params) {
119
+ return await this.request('GetGameRecordHistory', params);
120
+ }
121
+ static async GetGameRecordHistory(params) {
122
+ return await this.request('GetGameRecordHistory', params);
123
+ }
124
+ async GetSearch(params) {
125
+ return await this.request('GetSearch', params);
126
+ }
127
+ static async GetSearch(params) {
128
+ return await this.request('GetSearch', params);
129
+ }
130
+ async GetLatestLeaderboard(params) {
131
+ return await this.request('GetLatestLeaderboard', params);
132
+ }
133
+ static async GetLatestLeaderboard(params) {
134
+ return await this.request('GetLatestLeaderboard', params);
135
+ }
136
+ async GetRun(params) {
137
+ return await this.request('GetRun', params);
138
+ }
139
+ static async GetRun(params) {
140
+ return await this.request('GetRun', params);
141
+ }
142
+ async GetUserSummary(params) {
143
+ return await this.request('GetUserSummary', params);
144
+ }
145
+ static async GetUserSummary(params) {
146
+ return await this.request('GetUserSummary', params);
147
+ }
148
+ async GetUserComments(params) {
149
+ return await this.request('GetUserComments', params);
150
+ }
151
+ static async GetUserComments(params) {
152
+ return await this.request('GetUserComments', params);
153
+ }
154
+ async GetUserThreads(params) {
155
+ return await this.request('GetUserThreads', params);
156
+ }
157
+ static async GetUserThreads(params) {
158
+ return await this.request('GetUserThreads', params);
159
+ }
160
+ async GetUserPopoverData(params) {
161
+ return await this.request('GetUserPopoverData', params);
162
+ }
163
+ static async GetUserPopoverData(params) {
164
+ return await this.request('GetUserPopoverData', params);
165
+ }
166
+ async GetTitleList() {
167
+ return await this.request('GetTitleList');
168
+ }
169
+ static async GetTitleList() {
170
+ return await this.request('GetTitleList');
171
+ }
172
+ async GetTitle(params) {
173
+ return await this.request('GetTitle', params);
174
+ }
175
+ static async GetTitle(params) {
176
+ return await this.request('GetTitle', params);
177
+ }
178
+ async GetArticleList(params) {
179
+ return await this.request('GetArticleList', params);
180
+ }
181
+ static async GetArticleList(params) {
182
+ return await this.request('GetArticleList', params);
183
+ }
184
+ async GetArticle(params) {
185
+ return await this.request('GetArticle', params);
186
+ }
187
+ static async GetArticle(params) {
188
+ return await this.request('GetArticle', params);
189
+ }
190
+ async GetGameList(params) {
191
+ return await this.request('GetGameList', params);
192
+ }
193
+ static async GetGameList(params) {
194
+ return await this.request('GetGameList', params);
195
+ }
196
+ async GetPlatformList() {
197
+ return await this.request('GetPlatformList');
198
+ }
199
+ static async GetPlatformList() {
200
+ return await this.request('GetPlatformList');
201
+ }
202
+ async GetHomeSummary() {
203
+ return await this.request('GetHomeSummary');
204
+ }
205
+ static async GetHomeSummary() {
206
+ return await this.request('GetHomeSummary');
207
+ }
208
+ async GetSeriesList(params) {
209
+ return await this.request('GetSeriesList', params);
210
+ }
211
+ static async GetSeriesList(params) {
212
+ return await this.request('GetSeriesList', params);
213
+ }
214
+ async GetSeriesSummary(params) {
215
+ return await this.request('GetSeriesSummary', params);
216
+ }
217
+ static async GetSeriesSummary(params) {
218
+ return await this.request('GetSeriesSummary', params);
219
+ }
220
+ async GetGameLevelSummary(params) {
221
+ return await this.request('GetGameLevelSummary', params);
222
+ }
223
+ static async GetGameLevelSummary(params) {
224
+ return await this.request('GetGameLevelSummary', params);
225
+ }
226
+ async GetGameRandom() {
227
+ return await this.request('GetGameRandom');
228
+ }
229
+ static async GetGameRandom() {
230
+ return await this.request('GetGameRandom');
231
+ }
232
+ async GetGuideList(params) {
233
+ return await this.request('GetGuideList', params);
234
+ }
235
+ static async GetGuideList(params) {
236
+ return await this.request('GetGuideList', params);
237
+ }
238
+ async GetGuide(params) {
239
+ return await this.request('GetGuide', params);
240
+ }
241
+ static async GetGuide(params) {
242
+ return await this.request('GetGuide', params);
243
+ }
244
+ async GetNewsList(params) {
245
+ return await this.request('GetNewsList', params);
246
+ }
247
+ static async GetNewsList(params) {
248
+ return await this.request('GetNewsList', params);
249
+ }
250
+ async GetNews(params) {
251
+ return await this.request('GetNews', params);
252
+ }
253
+ static async GetNews(params) {
254
+ return await this.request('GetNews', params);
255
+ }
256
+ async GetResourceList(params) {
257
+ return await this.request('GetResourceList', params);
258
+ }
259
+ static async GetResourceList(params) {
260
+ return await this.request('GetResourceList', params);
261
+ }
262
+ async GetStreamList(params) {
263
+ return await this.request('GetStreamList', params);
264
+ }
265
+ static async GetStreamList(params) {
266
+ return await this.request('GetStreamList', params);
267
+ }
268
+ async GetThreadList(params) {
269
+ return await this.request('GetThreadList', params);
270
+ }
271
+ static async GetThreadList(params) {
272
+ return await this.request('GetThreadList', params);
273
+ }
274
+ async GetThreadStateByCommentId(params) {
275
+ return await this.request('GetThreadStateByCommentId', params);
276
+ }
277
+ static async GetThreadStateByCommentId(params) {
278
+ return await this.request('GetThreadStateByCommentId', params);
279
+ }
280
+ async GetChallenge(params) {
281
+ return await this.request('GetChallenge', params);
282
+ }
283
+ static async GetChallenge(params) {
284
+ return await this.request('GetChallenge', params);
285
+ }
286
+ async GetChallengeLeaderboard(params) {
287
+ return await this.request('GetChallengeLeaderboard', params);
288
+ }
289
+ static async GetChallengeLeaderboard(params) {
290
+ return await this.request('GetChallengeLeaderboard', params);
291
+ }
292
+ async GetChallengeGlobalRankingList() {
293
+ return await this.request('GetChallengeGlobalRankingList');
294
+ }
295
+ static async GetChallengeGlobalRankingList() {
296
+ return await this.request('GetChallengeGlobalRankingList');
297
+ }
298
+ async GetChallengeRun(params) {
299
+ return await this.request('GetChallengeRun', params);
300
+ }
301
+ static async GetChallengeRun(params) {
302
+ return await this.request('GetChallengeRun', params);
303
+ }
304
+ async GetUserLeaderboard(params) {
305
+ return await this.request('GetUserLeaderboard', params);
306
+ }
307
+ static async GetUserLeaderboard(params) {
308
+ return await this.request('GetUserLeaderboard', params);
309
+ }
310
+ async GetUserModeration(params) {
311
+ return await this.request('GetUserModeration', params);
312
+ }
313
+ static async GetUserModeration(params) {
314
+ return await this.request('GetUserModeration', params);
315
+ }
316
+ async GetCommentList(params) {
317
+ return await this.request('GetCommentList', params);
318
+ }
319
+ static async GetCommentList(params) {
320
+ return await this.request('GetCommentList', params);
321
+ }
322
+ async GetThread(params) {
323
+ return await this.request('GetThread', params);
324
+ }
325
+ static async GetThread(params) {
326
+ return await this.request('GetThread', params);
327
+ }
328
+ async GetStaticData() {
329
+ return await this.request('GetStaticData');
330
+ }
331
+ static async GetStaticData() {
332
+ return await this.request('GetStaticData');
333
+ }
334
+ async GetForumList() {
335
+ return await this.request('GetForumList');
336
+ }
337
+ static async GetForumList() {
338
+ return await this.request('GetForumList');
339
+ }
340
+ async PutAuthLogin(params) {
341
+ return await this.request('PutAuthLogin', params);
342
+ }
343
+ async GetSession() {
344
+ return await this.request('GetSession');
345
+ }
346
+ async PutSessionPing() {
347
+ return await this.request('PutSessionPing');
348
+ }
349
+ async GetAuditLogList(params) {
350
+ return await this.request('GetAuditLogList', params);
351
+ }
352
+ async GetGameSettings(params) {
353
+ return await this.request('GetGameSettings', params);
354
+ }
355
+ async PutGameSettings(params) {
356
+ return await this.request('PutGameSettings', params);
357
+ }
358
+ async PutCategory(params) {
359
+ return await this.request('PutCategory', params);
360
+ }
361
+ async PutCategoryUpdate(params) {
362
+ return await this.request('PutCategoryUpdate', params);
363
+ }
364
+ async PutCategoryArchive(params) {
365
+ return await this.request('PutCategoryArchive', params);
366
+ }
367
+ async PutCategoryRestore(params) {
368
+ return await this.request('PutCategoryRestore', params);
369
+ }
370
+ async PutCategoryOrder(params) {
371
+ return await this.request('PutCategoryOrder', params);
372
+ }
373
+ async PutLevel(params) {
374
+ return await this.request('PutLevel', params);
375
+ }
376
+ async PutLevelUpdate(params) {
377
+ return await this.request('PutLevelUpdate', params);
378
+ }
379
+ async PutLevelArchive(params) {
380
+ return await this.request('PutLevelArchive', params);
381
+ }
382
+ async PutLevelRestore(params) {
383
+ return await this.request('PutLevelRestore', params);
384
+ }
385
+ async PutLevelOrder(params) {
386
+ return await this.request('PutLevelOrder', params);
387
+ }
388
+ async PutVariable(params) {
389
+ return await this.request('PutVariable', params);
390
+ }
391
+ async PutVariableUpdate(params) {
392
+ return await this.request('PutVariableUpdate', params);
393
+ }
394
+ async PutVariableArchive(params) {
395
+ return await this.request('PutVariableArchive', params);
396
+ }
397
+ async PutVariableRestore(params) {
398
+ return await this.request('PutVariableRestore', params);
399
+ }
400
+ async PutVariableOrder(params) {
401
+ return await this.request('PutVariableOrder', params);
402
+ }
403
+ async PutVariableApplyDefault(params) {
404
+ return await this.request('PutVariableApplyDefault', params);
405
+ }
406
+ async PutNews(params) {
407
+ return await this.request('PutNews', params);
408
+ }
409
+ async PutNewsUpdate(params) {
410
+ return await this.request('PutNewsUpdate', params);
411
+ }
412
+ async PutNewsDelete(params) {
413
+ return await this.request('PutNewsDelete', params);
414
+ }
415
+ async PutGuide(params) {
416
+ return await this.request('PutGuide', params);
417
+ }
418
+ async PutGuideUpdate(params) {
419
+ return await this.request('PutGuideUpdate', params);
420
+ }
421
+ async PutGuideDelete(params) {
422
+ return await this.request('PutGuideDelete', params);
423
+ }
424
+ async PutResource(params) {
425
+ return await this.request('PutResource', params);
426
+ }
427
+ async PutResourceUpdate(params) {
428
+ return await this.request('PutResourceUpdate', params);
429
+ }
430
+ async PutResourceDelete(params) {
431
+ return await this.request('PutResourceDelete', params);
432
+ }
433
+ async GetModerationGames() {
434
+ return await this.request('GetModerationGames');
435
+ }
436
+ async GetModerationRuns(params) {
437
+ return await this.request('GetModerationRuns', params);
438
+ }
439
+ async PutRunAssignee(params) {
440
+ return await this.request('PutRunAssignee', params);
441
+ }
442
+ async PutRunDelete(params) {
443
+ return await this.request('PutRunDelete', params);
444
+ }
445
+ async PutRunVerification(params) {
446
+ return await this.request('PutRunVerification', params);
447
+ }
448
+ async PutRunVideoState(params) {
449
+ return await this.request('PutRunVideoState', params);
450
+ }
451
+ async GetRunSettings(params) {
452
+ return await this.request('GetRunSettings', params);
453
+ }
454
+ async PutRunSettings(params) {
455
+ return await this.request('PutRunSettings', params);
456
+ }
457
+ async GetConversations() {
458
+ return await this.request('GetConversations');
459
+ }
460
+ async GetConversationMessages(params) {
461
+ return await this.request('GetConversationMessages', params);
462
+ }
463
+ async PutConversation(params) {
464
+ return await this.request('PutConversation', params);
465
+ }
466
+ async PutConversationMessage(params) {
467
+ return await this.request('PutConversationMessage', params);
468
+ }
469
+ async PutConversationLeave(params) {
470
+ return await this.request('PutConversationLeave', params);
471
+ }
472
+ async PutConversationReport(params) {
473
+ return await this.request('PutConversationReport', params);
474
+ }
475
+ async GetNotifications() {
476
+ return await this.request('GetNotifications');
477
+ }
478
+ async PutNotificationsRead() {
479
+ return await this.request('PutNotificationsRead');
480
+ }
481
+ async PutGameFollower(params) {
482
+ return await this.request('PutGameFollower', params);
483
+ }
484
+ async PutGameFollowerDelete(params) {
485
+ return await this.request('PutGameFollowerDelete', params);
486
+ }
487
+ async PutUserFollower(params) {
488
+ return await this.request('PutUserFollower', params);
489
+ }
490
+ async PutUserFollowerDelete(params) {
491
+ return await this.request('PutUserFollowerDelete', params);
492
+ }
493
+ async GetUserSettings(params) {
494
+ return await this.request('GetUserSettings', params);
495
+ }
496
+ async PutUserSettings(params) {
497
+ return await this.request('PutUserSettings', params);
498
+ }
499
+ async PutUserUpdateFeaturedRun(params) {
500
+ return await this.request('PutUserUpdateFeaturedRun', params);
501
+ }
502
+ async PutUserUpdateGameOrdering(params) {
503
+ return await this.request('PutUserUpdateGameOrdering', params);
504
+ }
505
+ async GetUserApiKey(params) {
506
+ return await this.request('GetUserApiKey', params);
507
+ }
508
+ async GetUserFollowers(params) {
509
+ return await this.request('GetUserFollowers', params);
510
+ }
511
+ async GetUserFollowingGames(params) {
512
+ return await this.request('GetUserFollowingGames', params);
513
+ }
514
+ async GetUserFollowingUsers(params) {
515
+ return await this.request('GetUserFollowingUsers', params);
516
+ }
517
+ async GetUserGameBoostData(params) {
518
+ return await this.request('GetUserGameBoostData', params);
519
+ }
520
+ async GetUserDataExport(params) {
521
+ return await this.request('GetUserDataExport', params);
522
+ }
523
+ async PutGameFollowerOrder(params) {
524
+ return await this.request('PutGameFollowerOrder', params);
525
+ }
526
+ async PutArticleSubmission(params) {
527
+ return await this.request('PutArticleSubmission', params);
528
+ }
529
+ async GetCommentable(params) {
530
+ return await this.request('GetCommentable', params);
531
+ }
532
+ async PutComment(params) {
533
+ return await this.request('PutComment', params);
534
+ }
535
+ async PutLike(params) {
536
+ return await this.request('PutLike', params);
537
+ }
538
+ async PutCommentableSettings(params) {
539
+ return await this.request('PutCommentableSettings', params);
540
+ }
541
+ async GetThreadReadStatus(params) {
542
+ return await this.request('GetThreadReadStatus', params);
543
+ }
544
+ async PutThreadRead(params) {
545
+ return await this.request('PutThreadRead', params);
546
+ }
547
+ async GetForumReadStatus(params) {
548
+ return await this.request('GetForumReadStatus', params);
549
+ }
550
+ async GetThemeSettings(params) {
551
+ return await this.request('GetThemeSettings', params);
552
+ }
553
+ async PutThemeSettings(params) {
554
+ return await this.request('PutThemeSettings', params);
555
+ }
556
+ async GetUserSupporterData(params) {
557
+ return await this.request('GetUserSupporterData', params);
558
+ }
559
+ async PutUserSupporterNewSubscription(params) {
560
+ return await this.request('PutUserSupporterNewSubscription', params);
561
+ }
562
+ async PutGameBoostGrant(params) {
563
+ return await this.request('PutGameBoostGrant', params);
564
+ }
565
+ async PutAdvertiseContact(params) {
566
+ return await this.request('PutAdvertiseContact', params);
567
+ }
568
+ async GetTickets(params) {
569
+ return await this.request('GetTickets', params);
570
+ }
571
+ async GetSeriesSettings(params) {
572
+ return await this.request('GetSeriesSettings', params);
573
+ }
574
+ async GetUserBlocks() {
575
+ return await this.request('GetUserBlocks');
576
+ }
577
+ async PutUserBlock(params) {
578
+ return await this.request('PutUserBlock', params);
579
+ }
580
+ async PutGame(params) {
581
+ return await this.request('PutGame', params);
582
+ }
583
+ async PutGameModerator() {
584
+ return await this.request('PutGameModerator');
585
+ }
586
+ async PutGameModeratorDelete(params) {
587
+ return await this.request('PutGameModeratorDelete', params);
588
+ }
589
+ async PutSeriesGame(params) {
590
+ return await this.request('PutSeriesGame', params);
591
+ }
592
+ async PutSeriesGameDelete(params) {
593
+ return await this.request('PutSeriesGameDelete', params);
594
+ }
595
+ async PutSeriesModerator() {
596
+ return await this.request('PutSeriesModerator');
597
+ }
598
+ async PutSeriesModeratorUpdate() {
599
+ return await this.request('PutSeriesModeratorUpdate');
600
+ }
601
+ async PutSeriesModeratorDelete() {
602
+ return await this.request('PutSeriesModeratorDelete');
603
+ }
604
+ async PutSeriesSettings(params) {
605
+ return await this.request('PutSeriesSettings', params);
606
+ }
607
+ async PutTicket(params) {
608
+ return await this.request('PutTicket', params);
609
+ }
610
+ async PutTicketNote(params) {
611
+ return await this.request('PutTicketNote', params);
612
+ }
613
+ async PutUserSocialConnection(params) {
614
+ return await this.request('PutUserSocialConnection', params);
615
+ }
616
+ async PutUserSocialConnectionDelete(params) {
617
+ return await this.request('PutUserSocialConnectionDelete', params);
618
+ }
619
+ async PutUserSocialConnectionSsoExchange(params) {
620
+ return await this.request('PutUserSocialConnectionSsoExchange', params);
621
+ }
622
+ async PutUserUpdatePassword(params) {
623
+ return await this.request('PutUserUpdatePassword', params);
624
+ }
625
+ async PutUserUpdateEmail(params) {
626
+ return await this.request('PutUserUpdateEmail', params);
627
+ }
628
+ async PutUserUpdateName(params) {
629
+ return await this.request('PutUserUpdateName', params);
630
+ }
631
+ async PutUserDelete(params) {
632
+ return await this.request('PutUserDelete', params);
633
+ }
634
+ async PutCommentUpdate(params) {
635
+ return await this.request('PutCommentUpdate', params);
636
+ }
637
+ async PutCommentDelete(params) {
638
+ return await this.request('PutCommentDelete', params);
639
+ }
640
+ async PutCommentRestore(params) {
641
+ return await this.request('PutCommentRestore', params);
642
+ }
643
+ async PutThread(params) {
644
+ return await this.request('PutThread', params);
645
+ }
646
+ async PutThreadLocked(params) {
647
+ return await this.request('PutThreadLocked', params);
648
+ }
649
+ async PutThreadSticky(params) {
650
+ return await this.request('PutThreadSticky', params);
651
+ }
652
+ async PutThreadDelete(params) {
653
+ return await this.request('PutThreadDelete', params);
654
+ }
655
+ }
656
+ /**
657
+ * `AxiosInstance` used on Client-called methods (called with `GET`).
658
+ */
659
+ Client.axiosClient = axios.create({
660
+ baseURL: BASE_URL,
661
+ method: 'GET',
662
+ headers: HEADERS
663
+ });
664
+ export default Client;
@@ -0,0 +1 @@
1
+ export {};