@wise-old-man/utils 1.0.25 → 2.0.0-beta.0
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/.prettierrc +7 -0
- package/dist/index.js +2217 -0
- package/package.json +14 -16
- package/prisma-transform.js +35 -0
- package/rollup.config.js +24 -0
- package/src/client.ts +18 -0
- package/src/clients/DeltasClient.ts +23 -0
- package/src/clients/EfficiencyClient.ts +37 -0
- package/src/clients/PlayersClient.ts +136 -0
- package/src/clients/RecordsClient.ts +18 -0
- package/src/config.ts +4 -0
- package/src/index.ts +10 -0
- package/src/sandbox.ts +26 -0
- package/src/utils.ts +159 -0
- package/tsconfig.json +13 -0
- package/dist/lib/competitions.d.ts +0 -33
- package/dist/lib/competitions.js +0 -51
- package/dist/lib/competitions.js.map +0 -1
- package/dist/lib/countries.d.ts +0 -17
- package/dist/lib/countries.js +0 -278
- package/dist/lib/countries.js.map +0 -1
- package/dist/lib/experience.d.ts +0 -9
- package/dist/lib/experience.js +0 -69
- package/dist/lib/experience.js.map +0 -1
- package/dist/lib/groups.d.ts +0 -1622
- package/dist/lib/groups.js +0 -564
- package/dist/lib/groups.js.map +0 -1
- package/dist/lib/index.d.ts +0 -9
- package/dist/lib/index.js +0 -22
- package/dist/lib/index.js.map +0 -1
- package/dist/lib/metrics.d.ts +0 -21470
- package/dist/lib/metrics.js +0 -540
- package/dist/lib/metrics.js.map +0 -1
- package/dist/lib/numbers.d.ts +0 -2
- package/dist/lib/numbers.js +0 -8
- package/dist/lib/numbers.js.map +0 -1
- package/dist/lib/periods.d.ts +0 -37
- package/dist/lib/periods.js +0 -66
- package/dist/lib/periods.js.map +0 -1
- package/dist/lib/players.d.ts +0 -59
- package/dist/lib/players.js +0 -72
- package/dist/lib/players.js.map +0 -1
- package/dist/lib/strings.d.ts +0 -3
- package/dist/lib/strings.js +0 -32
- package/dist/lib/strings.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,29 +1,27 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wise-old-man/utils",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "
|
|
5
|
-
"main": "dist/
|
|
6
|
-
"types": "dist/
|
|
7
|
-
"files": [
|
|
8
|
-
"dist/lib"
|
|
9
|
-
],
|
|
3
|
+
"version": "2.0.0-beta.0",
|
|
4
|
+
"description": "",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
10
7
|
"scripts": {
|
|
11
|
-
"prepublish": "
|
|
12
|
-
"
|
|
13
|
-
"
|
|
8
|
+
"prepublish": "npm run build",
|
|
9
|
+
"prebuild": "cd ../server && npm run prisma:generate",
|
|
10
|
+
"build": "rm -rf ./dist && npx rollup -c && node prisma-transform.js"
|
|
14
11
|
},
|
|
15
12
|
"keywords": [],
|
|
16
13
|
"author": "",
|
|
17
14
|
"license": "ISC",
|
|
18
15
|
"devDependencies": {
|
|
19
|
-
"@
|
|
20
|
-
"
|
|
21
|
-
"
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"typescript": "^4.4.3"
|
|
16
|
+
"@rollup/plugin-typescript": "^8.3.4",
|
|
17
|
+
"rollup": "^2.78.0",
|
|
18
|
+
"rollup-plugin-dts": "^4.2.2",
|
|
19
|
+
"tslib": "^2.4.0",
|
|
20
|
+
"typescript": "^4.7.4"
|
|
25
21
|
},
|
|
26
22
|
"dependencies": {
|
|
23
|
+
"axios": "^0.27.2",
|
|
24
|
+
"dayjs": "^1.11.5",
|
|
27
25
|
"lodash": "^4.17.21"
|
|
28
26
|
}
|
|
29
27
|
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This is an extremely hacky script that mashes up some of Prisma's type declarations with my own.
|
|
3
|
+
* I can't simply bundle up all type declarations with rollup because the dts plugin doesn't support namespaces.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const fs = require('fs');
|
|
7
|
+
|
|
8
|
+
const PRIVATE_MODEL_NAMES = ['Achievement', 'Record', 'Delta', 'Snapshot', 'Player'];
|
|
9
|
+
|
|
10
|
+
const START_TOKEN = 'export type Achievement';
|
|
11
|
+
const END_TOKEN = ' * Enums';
|
|
12
|
+
|
|
13
|
+
const PRISMA_DECLARATION_FILE_PATH = '../server/node_modules/.prisma/client/index.d.ts';
|
|
14
|
+
const BUILD_DECLARATION_FILE_PATH = './dist/index.d.ts';
|
|
15
|
+
|
|
16
|
+
const buildContent = fs.readFileSync(BUILD_DECLARATION_FILE_PATH, { encoding: 'utf8' });
|
|
17
|
+
const parsedBuildContent = buildContent.split('\n').splice(2).join('\n');
|
|
18
|
+
|
|
19
|
+
const prismaContent = fs.readFileSync(PRISMA_DECLARATION_FILE_PATH, { encoding: 'utf8' });
|
|
20
|
+
const parsedPrismaContent = prismaContent
|
|
21
|
+
.substring(prismaContent.indexOf(START_TOKEN), prismaContent.indexOf(END_TOKEN))
|
|
22
|
+
.replace(/\/\*[\s\S]*?\*\/|\/\/.*/g, '')
|
|
23
|
+
.replace('/**', '')
|
|
24
|
+
.split('\n')
|
|
25
|
+
.map(line => {
|
|
26
|
+
const privateModelMatch = PRIVATE_MODEL_NAMES.find(model => line.includes(`export type ${model} =`));
|
|
27
|
+
|
|
28
|
+
if (privateModelMatch) return line.replace(privateModelMatch, `${privateModelMatch}$1`);
|
|
29
|
+
return line;
|
|
30
|
+
})
|
|
31
|
+
.join('\n');
|
|
32
|
+
|
|
33
|
+
const finalContent = `${parsedPrismaContent}\n${parsedBuildContent}`;
|
|
34
|
+
|
|
35
|
+
fs.writeFileSync(BUILD_DECLARATION_FILE_PATH, finalContent);
|
package/rollup.config.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import dts from 'rollup-plugin-dts';
|
|
2
|
+
import typescript from '@rollup/plugin-typescript';
|
|
3
|
+
|
|
4
|
+
export default [
|
|
5
|
+
{
|
|
6
|
+
input: 'src/index.ts',
|
|
7
|
+
output: {
|
|
8
|
+
dir: 'dist',
|
|
9
|
+
format: 'cjs',
|
|
10
|
+
external: ['axios', 'dayjs', 'lodash'],
|
|
11
|
+
sourcemap: false
|
|
12
|
+
},
|
|
13
|
+
plugins: [
|
|
14
|
+
typescript({
|
|
15
|
+
tsconfig: './tsconfig.json'
|
|
16
|
+
})
|
|
17
|
+
]
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
input: 'src/index.ts',
|
|
21
|
+
output: [{ file: 'dist/index.d.ts', format: 'cjs' }],
|
|
22
|
+
plugins: [dts()]
|
|
23
|
+
}
|
|
24
|
+
];
|
package/src/client.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import PlayersClient from './clients/PlayersClient';
|
|
2
|
+
import RecordsClient from './clients/RecordsClient';
|
|
3
|
+
import DeltasClient from './clients/DeltasClient';
|
|
4
|
+
import EfficiencyClient from './clients/EfficiencyClient';
|
|
5
|
+
|
|
6
|
+
export default class WOMClient {
|
|
7
|
+
public players: PlayersClient;
|
|
8
|
+
public records: RecordsClient;
|
|
9
|
+
public deltas: DeltasClient;
|
|
10
|
+
public efficiency: EfficiencyClient;
|
|
11
|
+
|
|
12
|
+
constructor() {
|
|
13
|
+
this.players = new PlayersClient();
|
|
14
|
+
this.records = new RecordsClient();
|
|
15
|
+
this.deltas = new DeltasClient();
|
|
16
|
+
this.efficiency = new EfficiencyClient();
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Country, Metric, Period, Player, PlayerBuild, PlayerType } from '../../../server/src/utils';
|
|
2
|
+
import { sendGetRequest } from '../utils';
|
|
3
|
+
|
|
4
|
+
export interface DeltaLeaderboardFilter {
|
|
5
|
+
metric: Metric;
|
|
6
|
+
period: Period | string;
|
|
7
|
+
country?: Country;
|
|
8
|
+
playerType?: PlayerType;
|
|
9
|
+
playerBuild?: PlayerBuild;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export type GetDeltaLeaderboardResponse = Array<{
|
|
13
|
+
startDate: Date;
|
|
14
|
+
endDate: Date;
|
|
15
|
+
gained: number;
|
|
16
|
+
player: Player;
|
|
17
|
+
}>;
|
|
18
|
+
|
|
19
|
+
export default class DeltasClient {
|
|
20
|
+
getDeltaLeaderboard(filter: DeltaLeaderboardFilter) {
|
|
21
|
+
return sendGetRequest<GetDeltaLeaderboardResponse>('/deltas/leaderboard', filter);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Player,
|
|
3
|
+
Metric,
|
|
4
|
+
Country,
|
|
5
|
+
PlayerType,
|
|
6
|
+
PlayerBuild,
|
|
7
|
+
EfficiencyAlgorithmType,
|
|
8
|
+
SkillMetaConfig,
|
|
9
|
+
BossMetaConfig
|
|
10
|
+
} from '../../../server/src/utils';
|
|
11
|
+
import { PaginationOptions, sendGetRequest } from '../utils';
|
|
12
|
+
|
|
13
|
+
export interface EfficiencyLeaderboardsFilter {
|
|
14
|
+
metric: typeof Metric.EHP | typeof Metric.EHB | 'ehp+ehb';
|
|
15
|
+
country?: Country;
|
|
16
|
+
playerType?: PlayerType;
|
|
17
|
+
playerBuild?: PlayerBuild;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export type GetEfficiencyLeaderboardsResponse = Player[];
|
|
21
|
+
|
|
22
|
+
export default class EfficiencyClient {
|
|
23
|
+
getEfficiencyLeaderboards(filter: EfficiencyLeaderboardsFilter, pagination?: PaginationOptions) {
|
|
24
|
+
return sendGetRequest<GetEfficiencyLeaderboardsResponse>('/efficiency/leaderboard', {
|
|
25
|
+
...filter,
|
|
26
|
+
...pagination
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
getEHPRates(algorithmType: `${EfficiencyAlgorithmType}`) {
|
|
31
|
+
return sendGetRequest<SkillMetaConfig>('/efficiency/rates', { metric: Metric.EHP, type: algorithmType });
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
getEHBRates(algorithmType: `${EfficiencyAlgorithmType}`) {
|
|
35
|
+
return sendGetRequest<BossMetaConfig[]>('/efficiency/rates', { metric: Metric.EHB, type: algorithmType });
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AchievementProgress,
|
|
3
|
+
ExtendedAchievement,
|
|
4
|
+
FormattedSnapshot,
|
|
5
|
+
MembershipWithGroup,
|
|
6
|
+
Metric,
|
|
7
|
+
Record,
|
|
8
|
+
NameChange,
|
|
9
|
+
ParticipationWithCompetition,
|
|
10
|
+
Period,
|
|
11
|
+
Player,
|
|
12
|
+
PlayerDeltasArray,
|
|
13
|
+
PlayerDeltasMap,
|
|
14
|
+
PlayerDetails,
|
|
15
|
+
PlayerResolvable
|
|
16
|
+
} from '../../../server/src/utils';
|
|
17
|
+
import { PaginationOptions, sendGetRequest, sendPostRequest } from '../utils';
|
|
18
|
+
|
|
19
|
+
export type TimeRangeFilter =
|
|
20
|
+
| {
|
|
21
|
+
period: Period | string;
|
|
22
|
+
}
|
|
23
|
+
| {
|
|
24
|
+
startDate: Date;
|
|
25
|
+
endDate: Date;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export interface PlayerRecordsFilter {
|
|
29
|
+
period: Period | string;
|
|
30
|
+
metric: Metric;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface AssertPlayerTypeResponse {
|
|
34
|
+
player: Player;
|
|
35
|
+
changed: boolean;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface ImportPlayerResponse {
|
|
39
|
+
count: number;
|
|
40
|
+
message: string;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export type SearchPlayersResponse = Player[];
|
|
44
|
+
export type UpdatePlayerResponse = PlayerDetails;
|
|
45
|
+
export type GetPlayerDetailsResponse = PlayerDetails;
|
|
46
|
+
export type GetPlayerAchievementsResponse = ExtendedAchievement[];
|
|
47
|
+
export type GetPlayerAchievementProgressResponse = AchievementProgress[];
|
|
48
|
+
export type GetPlayerCompetitionsResponse = ParticipationWithCompetition[];
|
|
49
|
+
export type GetPlayerGroupsResponse = MembershipWithGroup[];
|
|
50
|
+
export type GetPlayerRecordsResponse = Record[];
|
|
51
|
+
export type GetPlayerNamesResponse = NameChange[];
|
|
52
|
+
export type GetPlayerSnapshotsResponse = FormattedSnapshot[];
|
|
53
|
+
|
|
54
|
+
export type GetPlayerGainsResponse<T extends PlayerDeltasArray | PlayerDeltasMap> = {
|
|
55
|
+
startsAt: Date;
|
|
56
|
+
endsAt: Date;
|
|
57
|
+
data: T;
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
function getPlayerURL(player: PlayerResolvable) {
|
|
61
|
+
if (typeof player === 'string') {
|
|
62
|
+
return `/players/${player}`;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (player.id) {
|
|
66
|
+
return `/players/id/${player.id}`;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return `/players/${player.username}`;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export default class PlayersClient {
|
|
73
|
+
searchPlayers(partialUsername: string, pagination?: PaginationOptions) {
|
|
74
|
+
return sendGetRequest<SearchPlayersResponse>('/players/search', {
|
|
75
|
+
username: partialUsername,
|
|
76
|
+
...pagination
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
updatePlayer(player: PlayerResolvable) {
|
|
81
|
+
return sendPostRequest<UpdatePlayerResponse>(getPlayerURL(player));
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
assertPlayerType(player: PlayerResolvable) {
|
|
85
|
+
return sendPostRequest<AssertPlayerTypeResponse>(`${getPlayerURL(player)}/assert-type`);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
importPlayer(player: PlayerResolvable) {
|
|
89
|
+
return sendPostRequest<ImportPlayerResponse>(`${getPlayerURL(player)}/import-history`);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
getPlayerDetails(player: PlayerResolvable) {
|
|
93
|
+
return sendGetRequest<GetPlayerDetailsResponse>(getPlayerURL(player));
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
getPlayerAchievements(player: PlayerResolvable) {
|
|
97
|
+
return sendGetRequest<GetPlayerAchievementsResponse>(`${getPlayerURL(player)}/achievements`);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
getPlayerAchievementProgress(player: PlayerResolvable) {
|
|
101
|
+
return sendGetRequest<GetPlayerAchievementProgressResponse>(
|
|
102
|
+
`${getPlayerURL(player)}/achievements/progress`
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
getPlayerCompetitions(player: PlayerResolvable, pagination?: PaginationOptions) {
|
|
107
|
+
return sendGetRequest<GetPlayerCompetitionsResponse>(`${getPlayerURL(player)}/competitions`, pagination);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
getPlayerGroups(player: PlayerResolvable, pagination?: PaginationOptions) {
|
|
111
|
+
return sendGetRequest<GetPlayerGroupsResponse>(`${getPlayerURL(player)}/groups`, pagination);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
getPlayerGains(player: PlayerResolvable, options: TimeRangeFilter) {
|
|
115
|
+
return sendGetRequest<GetPlayerGainsResponse<PlayerDeltasMap>>(`${getPlayerURL(player)}/gained`, options);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
getPlayerGainsAsArray(player: PlayerResolvable, options: TimeRangeFilter) {
|
|
119
|
+
return sendGetRequest<GetPlayerGainsResponse<PlayerDeltasArray>>(`${getPlayerURL(player)}/gained`, {
|
|
120
|
+
...options,
|
|
121
|
+
formatting: 'array'
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
getPlayerRecords(player: PlayerResolvable, options?: PlayerRecordsFilter) {
|
|
126
|
+
return sendGetRequest<GetPlayerRecordsResponse>(`${getPlayerURL(player)}/records`, options);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
getPlayerSnapshots(player: PlayerResolvable, options?: TimeRangeFilter) {
|
|
130
|
+
return sendGetRequest<GetPlayerSnapshotsResponse>(`${getPlayerURL(player)}/snapshots`, options);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
getPlayerNames(player: PlayerResolvable) {
|
|
134
|
+
return sendGetRequest<GetPlayerNamesResponse>(`${getPlayerURL(player)}/names`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Country, Metric, Record, Period, Player, PlayerBuild, PlayerType } from '../../../server/src/utils';
|
|
2
|
+
import { sendGetRequest } from '../utils';
|
|
3
|
+
|
|
4
|
+
export interface RecordLeaderboardFilter {
|
|
5
|
+
metric: Metric;
|
|
6
|
+
period: Period | string;
|
|
7
|
+
country?: Country;
|
|
8
|
+
playerType?: PlayerType;
|
|
9
|
+
playerBuild?: PlayerBuild;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export type GetRecordLeaderboardResponse = Array<Record & { player: Player }>;
|
|
13
|
+
|
|
14
|
+
export default class RecordsClient {
|
|
15
|
+
getRecordLeaderboard(filter: RecordLeaderboardFilter) {
|
|
16
|
+
return sendGetRequest<GetRecordLeaderboardResponse>('/records/leaderboard', filter);
|
|
17
|
+
}
|
|
18
|
+
}
|
package/src/config.ts
ADDED
package/src/index.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import WOMClient from './client';
|
|
2
|
+
|
|
3
|
+
export * from '../../server/src/utils';
|
|
4
|
+
|
|
5
|
+
export * from './clients/PlayersClient';
|
|
6
|
+
export * from './clients/RecordsClient';
|
|
7
|
+
export * from './clients/DeltasClient';
|
|
8
|
+
export * from './clients/EfficiencyClient';
|
|
9
|
+
|
|
10
|
+
export { WOMClient };
|
package/src/sandbox.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Country, GetRecordLeaderboardResponse, Metric, Period, RecordLeaderboardFilter, WOMClient } from '.';
|
|
2
|
+
|
|
3
|
+
async function run() {
|
|
4
|
+
try {
|
|
5
|
+
const womClient = new WOMClient();
|
|
6
|
+
|
|
7
|
+
console.log(await womClient.players.searchPlayers('psik'));
|
|
8
|
+
// console.log(await womClient.players.updatePlayer('psikoi'));
|
|
9
|
+
// console.log(await womClient.records.getRecordLeaderboard({ metric: 'zulrah', period: 'week' }));
|
|
10
|
+
|
|
11
|
+
// console.log(await womClient.deltas.getDeltaLeaderboard({ metric: 'zulrah', period: 'week' }));
|
|
12
|
+
|
|
13
|
+
console.log(
|
|
14
|
+
await womClient.efficiency.getEfficiencyLeaderboards({
|
|
15
|
+
metric: 'ehb',
|
|
16
|
+
playerType: 'ultimate'
|
|
17
|
+
})
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
console.log(await womClient.efficiency.getEHBRates('lvl3'));
|
|
21
|
+
} catch (error) {
|
|
22
|
+
console.log(error);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
run();
|
package/src/utils.ts
ADDED
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import axios, { AxiosError } from 'axios';
|
|
2
|
+
import dayjs from 'dayjs';
|
|
3
|
+
import customParseFormaPlugin from 'dayjs/plugin/customParseFormat';
|
|
4
|
+
import config from './config';
|
|
5
|
+
|
|
6
|
+
dayjs.extend(customParseFormaPlugin);
|
|
7
|
+
|
|
8
|
+
function traverseTransform(input: any, transformation: (i: any) => any): any {
|
|
9
|
+
if (Array.isArray(input)) {
|
|
10
|
+
return input.map(item => traverseTransform(item, transformation));
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
if (input !== null && typeof input === 'object') {
|
|
14
|
+
return Object.fromEntries(
|
|
15
|
+
Object.keys(input).map(key => [key, traverseTransform(input[key], transformation)])
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
return transformation(input);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function isValidISODate(input: any) {
|
|
23
|
+
if (!input || typeof input !== 'string') return false;
|
|
24
|
+
|
|
25
|
+
// DayJS has a bug with strict parsing with timezones https://github.com/iamkun/dayjs/issues/929
|
|
26
|
+
// So I'll just strip the "Z" timezone
|
|
27
|
+
return input.endsWith('Z') && dayjs(input.slice(0, -1), 'YYYY-MM-DDTHH:mm:ss.SSS', true).isValid();
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function transformDates(input: any) {
|
|
31
|
+
return traverseTransform(input, val => (isValidISODate(val) ? new Date(val) : val));
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export type PaginationOptions = Partial<{
|
|
35
|
+
limit: number;
|
|
36
|
+
offset: number;
|
|
37
|
+
}>;
|
|
38
|
+
|
|
39
|
+
function handleError(requestURL: string, e: AxiosError) {
|
|
40
|
+
if (!e.response?.data) return;
|
|
41
|
+
|
|
42
|
+
const data = e.response.data as APIErrorData;
|
|
43
|
+
|
|
44
|
+
if (e.response.status === 400) {
|
|
45
|
+
throw new BadRequestError(requestURL, data.message, data.data);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if (e.response.status === 403) {
|
|
49
|
+
throw new ForbiddenError(requestURL, data.message);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (e.response.status === 404) {
|
|
53
|
+
throw new NotFoundError(requestURL, data.message);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (e.response.status === 429) {
|
|
57
|
+
throw new RateLimitError(requestURL, data.message);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (e.response.status === 500) {
|
|
61
|
+
throw new InternalServerError(requestURL, data.message);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export async function sendPostRequest<T>(path: string, body?: any) {
|
|
66
|
+
const requestURL = `${config.apiBaseUrl}${path}`;
|
|
67
|
+
|
|
68
|
+
return axios
|
|
69
|
+
.post(requestURL, body || {})
|
|
70
|
+
.then(response => transformDates(response.data) as T)
|
|
71
|
+
.catch(e => {
|
|
72
|
+
if (axios.isAxiosError(e)) handleError(requestURL, e);
|
|
73
|
+
throw e;
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export async function sendGetRequest<T>(path: string, params?: any) {
|
|
78
|
+
const requestURL = `${config.apiBaseUrl}${path}`;
|
|
79
|
+
|
|
80
|
+
return axios
|
|
81
|
+
.get(requestURL, { params })
|
|
82
|
+
.then(response => transformDates(response.data) as T)
|
|
83
|
+
.catch(e => {
|
|
84
|
+
if (axios.isAxiosError(e)) handleError(requestURL, e);
|
|
85
|
+
throw e;
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
interface APIErrorData {
|
|
90
|
+
message: string;
|
|
91
|
+
data?: any;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
class BadRequestError extends Error {
|
|
95
|
+
name: string;
|
|
96
|
+
resource: string;
|
|
97
|
+
statusCode: number;
|
|
98
|
+
data?: any;
|
|
99
|
+
|
|
100
|
+
constructor(resource: string, message: string, data?: any) {
|
|
101
|
+
super(message);
|
|
102
|
+
this.name = 'BadRequestError';
|
|
103
|
+
this.resource = resource;
|
|
104
|
+
this.statusCode = 400;
|
|
105
|
+
this.data = data;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
class ForbiddenError extends Error {
|
|
110
|
+
name: string;
|
|
111
|
+
resource: string;
|
|
112
|
+
statusCode: number;
|
|
113
|
+
|
|
114
|
+
constructor(resource: string, message: string) {
|
|
115
|
+
super(message);
|
|
116
|
+
this.name = 'ForbiddenError';
|
|
117
|
+
this.resource = resource;
|
|
118
|
+
this.statusCode = 403;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
class NotFoundError extends Error {
|
|
123
|
+
name: string;
|
|
124
|
+
resource: string;
|
|
125
|
+
statusCode: number;
|
|
126
|
+
|
|
127
|
+
constructor(resource: string, message: string) {
|
|
128
|
+
super(message);
|
|
129
|
+
this.name = 'NotFoundError';
|
|
130
|
+
this.resource = resource;
|
|
131
|
+
this.statusCode = 404;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
class RateLimitError extends Error {
|
|
136
|
+
name: string;
|
|
137
|
+
resource: string;
|
|
138
|
+
statusCode: number;
|
|
139
|
+
|
|
140
|
+
constructor(resource: string, message: string) {
|
|
141
|
+
super(message);
|
|
142
|
+
this.name = 'RateLimitError';
|
|
143
|
+
this.resource = resource;
|
|
144
|
+
this.statusCode = 429;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
class InternalServerError extends Error {
|
|
149
|
+
name: string;
|
|
150
|
+
resource: string;
|
|
151
|
+
statusCode: number;
|
|
152
|
+
|
|
153
|
+
constructor(resource: string, message: string) {
|
|
154
|
+
super(message);
|
|
155
|
+
this.name = 'InternalServerError';
|
|
156
|
+
this.resource = resource;
|
|
157
|
+
this.statusCode = 500;
|
|
158
|
+
}
|
|
159
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"rootDir": "../../",
|
|
4
|
+
"esModuleInterop": true,
|
|
5
|
+
"forceConsistentCasingInFileNames": true,
|
|
6
|
+
"lib": ["es6", "dom", "es2019"],
|
|
7
|
+
"noImplicitAny": false,
|
|
8
|
+
"moduleResolution": "node",
|
|
9
|
+
"skipLibCheck": true,
|
|
10
|
+
"target": "es2015",
|
|
11
|
+
"outDir": "dist"
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
declare enum CompetitionType {
|
|
2
|
-
CLASSIC = "classic",
|
|
3
|
-
TEAM = "team"
|
|
4
|
-
}
|
|
5
|
-
declare enum CompetitionStatus {
|
|
6
|
-
UPCOMING = "upcoming",
|
|
7
|
-
ONGOING = "ongoing",
|
|
8
|
-
FINISHED = "finished"
|
|
9
|
-
}
|
|
10
|
-
declare const CompetitionTypeProps: {
|
|
11
|
-
classic: {
|
|
12
|
-
name: string;
|
|
13
|
-
};
|
|
14
|
-
team: {
|
|
15
|
-
name: string;
|
|
16
|
-
};
|
|
17
|
-
};
|
|
18
|
-
declare const CompetitionStatusProps: {
|
|
19
|
-
upcoming: {
|
|
20
|
-
name: string;
|
|
21
|
-
};
|
|
22
|
-
ongoing: {
|
|
23
|
-
name: string;
|
|
24
|
-
};
|
|
25
|
-
finished: {
|
|
26
|
-
name: string;
|
|
27
|
-
};
|
|
28
|
-
};
|
|
29
|
-
declare const COMPETITION_TYPES: CompetitionType[];
|
|
30
|
-
declare const COMPETITION_STATUSES: CompetitionStatus[];
|
|
31
|
-
declare function findCompetitionType(typeName: string): CompetitionType | null;
|
|
32
|
-
declare function findCompetitionStatus(statusName: string): CompetitionStatus | null;
|
|
33
|
-
export { CompetitionType, CompetitionStatus, CompetitionTypeProps, CompetitionStatusProps, COMPETITION_TYPES, COMPETITION_STATUSES, findCompetitionType, findCompetitionStatus };
|
package/dist/lib/competitions.js
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var _a, _b;
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.findCompetitionStatus = exports.findCompetitionType = exports.COMPETITION_STATUSES = exports.COMPETITION_TYPES = exports.CompetitionStatusProps = exports.CompetitionTypeProps = exports.CompetitionStatus = exports.CompetitionType = void 0;
|
|
5
|
-
var CompetitionType;
|
|
6
|
-
(function (CompetitionType) {
|
|
7
|
-
CompetitionType["CLASSIC"] = "classic";
|
|
8
|
-
CompetitionType["TEAM"] = "team";
|
|
9
|
-
})(CompetitionType || (CompetitionType = {}));
|
|
10
|
-
exports.CompetitionType = CompetitionType;
|
|
11
|
-
var CompetitionStatus;
|
|
12
|
-
(function (CompetitionStatus) {
|
|
13
|
-
CompetitionStatus["UPCOMING"] = "upcoming";
|
|
14
|
-
CompetitionStatus["ONGOING"] = "ongoing";
|
|
15
|
-
CompetitionStatus["FINISHED"] = "finished";
|
|
16
|
-
})(CompetitionStatus || (CompetitionStatus = {}));
|
|
17
|
-
exports.CompetitionStatus = CompetitionStatus;
|
|
18
|
-
var CompetitionTypeProps = (_a = {},
|
|
19
|
-
_a[CompetitionType.CLASSIC] = { name: 'Classic' },
|
|
20
|
-
_a[CompetitionType.TEAM] = { name: 'Team' },
|
|
21
|
-
_a);
|
|
22
|
-
exports.CompetitionTypeProps = CompetitionTypeProps;
|
|
23
|
-
var CompetitionStatusProps = (_b = {},
|
|
24
|
-
_b[CompetitionStatus.UPCOMING] = { name: 'Upcoming' },
|
|
25
|
-
_b[CompetitionStatus.ONGOING] = { name: 'Ongoing' },
|
|
26
|
-
_b[CompetitionStatus.FINISHED] = { name: 'Finished' },
|
|
27
|
-
_b);
|
|
28
|
-
exports.CompetitionStatusProps = CompetitionStatusProps;
|
|
29
|
-
var COMPETITION_TYPES = Object.values(CompetitionType);
|
|
30
|
-
exports.COMPETITION_TYPES = COMPETITION_TYPES;
|
|
31
|
-
var COMPETITION_STATUSES = Object.values(CompetitionStatus);
|
|
32
|
-
exports.COMPETITION_STATUSES = COMPETITION_STATUSES;
|
|
33
|
-
function findCompetitionType(typeName) {
|
|
34
|
-
for (var _i = 0, _a = Object.entries(CompetitionTypeProps); _i < _a.length; _i++) {
|
|
35
|
-
var _b = _a[_i], key = _b[0], value = _b[1];
|
|
36
|
-
if (value.name === typeName)
|
|
37
|
-
return key;
|
|
38
|
-
}
|
|
39
|
-
return null;
|
|
40
|
-
}
|
|
41
|
-
exports.findCompetitionType = findCompetitionType;
|
|
42
|
-
function findCompetitionStatus(statusName) {
|
|
43
|
-
for (var _i = 0, _a = Object.entries(CompetitionStatusProps); _i < _a.length; _i++) {
|
|
44
|
-
var _b = _a[_i], key = _b[0], value = _b[1];
|
|
45
|
-
if (value.name === statusName)
|
|
46
|
-
return key;
|
|
47
|
-
}
|
|
48
|
-
return null;
|
|
49
|
-
}
|
|
50
|
-
exports.findCompetitionStatus = findCompetitionStatus;
|
|
51
|
-
//# sourceMappingURL=competitions.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"competitions.js","sourceRoot":"","sources":["../../lib/competitions.ts"],"names":[],"mappings":";;;;AAAA,IAAK,eAGJ;AAHD,WAAK,eAAe;IAClB,sCAAmB,CAAA;IACnB,gCAAa,CAAA;AACf,CAAC,EAHI,eAAe,KAAf,eAAe,QAGnB;AAwCC,0CAAe;AAtCjB,IAAK,iBAIJ;AAJD,WAAK,iBAAiB;IACpB,0CAAqB,CAAA;IACrB,wCAAmB,CAAA;IACnB,0CAAqB,CAAA;AACvB,CAAC,EAJI,iBAAiB,KAAjB,iBAAiB,QAIrB;AAmCC,8CAAiB;AAjCnB,IAAM,oBAAoB;IACxB,GAAC,eAAe,CAAC,OAAO,IAAG,EAAE,IAAI,EAAE,SAAS,EAAE;IAC9C,GAAC,eAAe,CAAC,IAAI,IAAG,EAAE,IAAI,EAAE,MAAM,EAAE;OACzC,CAAC;AA+BA,oDAAoB;AA7BtB,IAAM,sBAAsB;IAC1B,GAAC,iBAAiB,CAAC,QAAQ,IAAG,EAAE,IAAI,EAAE,UAAU,EAAE;IAClD,GAAC,iBAAiB,CAAC,OAAO,IAAG,EAAE,IAAI,EAAE,SAAS,EAAE;IAChD,GAAC,iBAAiB,CAAC,QAAQ,IAAG,EAAE,IAAI,EAAE,UAAU,EAAE;OACnD,CAAC;AA0BA,wDAAsB;AAxBxB,IAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;AA0BvD,8CAAiB;AAzBnB,IAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;AA0B5D,oDAAoB;AAxBtB,SAAS,mBAAmB,CAAC,QAAgB;IAC3C,KAAyB,UAAoC,EAApC,KAAA,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAApC,cAAoC,EAApC,IAAoC,EAAE;QAAtD,IAAA,WAAY,EAAX,GAAG,QAAA,EAAE,KAAK,QAAA;QAClB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,GAAsB,CAAC;KAC5D;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAoBC,kDAAmB;AAlBrB,SAAS,qBAAqB,CAAC,UAAkB;IAC/C,KAAyB,UAAsC,EAAtC,KAAA,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,EAAtC,cAAsC,EAAtC,IAAsC,EAAE;QAAxD,IAAA,WAAY,EAAX,GAAG,QAAA,EAAE,KAAK,QAAA;QAClB,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU;YAAE,OAAO,GAAwB,CAAC;KAChE;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAaC,sDAAqB"}
|
package/dist/lib/countries.d.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
declare const COUNTRIES: {
|
|
2
|
-
code: string;
|
|
3
|
-
name: string;
|
|
4
|
-
}[];
|
|
5
|
-
declare function findCountry(countryIdentifier: string): {
|
|
6
|
-
code: string;
|
|
7
|
-
name: string;
|
|
8
|
-
} | undefined;
|
|
9
|
-
declare function findCountryByName(countryName: string): {
|
|
10
|
-
code: string;
|
|
11
|
-
name: string;
|
|
12
|
-
} | undefined;
|
|
13
|
-
declare function findCountryByCode(countryCode: string): {
|
|
14
|
-
code: string;
|
|
15
|
-
name: string;
|
|
16
|
-
} | undefined;
|
|
17
|
-
export { COUNTRIES, findCountry, findCountryByCode, findCountryByName };
|