Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pterodactyl
GitHub Repository: pterodactyl/panel
Path: blob/1.0-develop/resources/scripts/api/definitions/helpers.ts
7461 views
1
import {
2
FractalPaginatedResponse,
3
FractalResponseData,
4
FractalResponseList,
5
getPaginationSet,
6
PaginatedResult,
7
} from '@/api/http';
8
import { Model } from '@definitions/index';
9
10
type TransformerFunc<T> = (callback: FractalResponseData) => T;
11
12
const isList = (data: FractalResponseList | FractalResponseData): data is FractalResponseList => data.object === 'list';
13
14
function transform<T, M>(data: null | undefined, transformer: TransformerFunc<T>, missing?: M): M;
15
function transform<T, M>(
16
data: FractalResponseData | null | undefined,
17
transformer: TransformerFunc<T>,
18
missing?: M
19
): T | M;
20
function transform<T, M>(
21
data: FractalResponseList | FractalPaginatedResponse | null | undefined,
22
transformer: TransformerFunc<T>,
23
missing?: M
24
): T[] | M;
25
function transform<T>(
26
data: FractalResponseData | FractalResponseList | FractalPaginatedResponse | null | undefined,
27
transformer: TransformerFunc<T>,
28
missing = undefined
29
) {
30
if (data === undefined || data === null) {
31
return missing;
32
}
33
34
if (isList(data)) {
35
return data.data.map(transformer);
36
}
37
38
if (!data || !data.attributes || data.object === 'null_resource') {
39
return missing;
40
}
41
42
return transformer(data);
43
}
44
45
function toPaginatedSet<T extends TransformerFunc<Model>>(
46
response: FractalPaginatedResponse,
47
transformer: T
48
): PaginatedResult<ReturnType<T>> {
49
return {
50
items: transform(response, transformer) as ReturnType<T>[],
51
pagination: getPaginationSet(response.meta.pagination),
52
};
53
}
54
55
export { transform, toPaginatedSet };
56
57