-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.ts
112 lines (92 loc) · 2.65 KB
/
index.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/* global fetch */
import qs from "qs";
// shim "fetch" if it isn't available
if (!global.fetch) require("isomorphic-fetch");
const defaults = {
apiUrl: "https://api.fridgecms.com/v2",
};
type FridgeOptions = {
apiUrl?: string;
fridgeId?: string;
token?: string;
};
type FridgeGetRequestOptions = Record<string, string | string[] | undefined> & {
body?: BodyInit | null;
credentials?: RequestCredentials;
headers?: HeadersInit;
};
type FridgeUpdateRequestOptions = FridgeGetRequestOptions & {
body?: BodyInit | null;
};
export default class Fridge {
options: FridgeOptions;
constructor(options?: FridgeOptions) {
this.options = { ...defaults, ...options };
}
static client(options?: FridgeOptions) {
return new Fridge(options);
}
get<T>(url: string, options: FridgeGetRequestOptions = {}) {
return this._request<T>("get", url, null, options);
}
post<T>(
url: string,
json: any = {},
options: FridgeUpdateRequestOptions = {}
) {
return this._request<T>("post", url, json, options);
}
put<T>(
url: string,
json: any = {},
options: FridgeUpdateRequestOptions = {}
) {
return this._request<T>("put", url, json, options);
}
delete(url: string, options: FridgeGetRequestOptions = {}) {
return this._request("delete", url, null, options);
}
async _request<T>(
method: string,
path: string,
json: any,
options: FridgeGetRequestOptions | FridgeUpdateRequestOptions
): Promise<T> {
const requestOptions: any = { headers: {}, method };
if (this.options.token) {
requestOptions.headers["Authorization"] = this.options.token;
}
if (this.options.fridgeId) {
options.site_id = this.options.fridgeId;
}
if (json && (method === "post" || method === "put")) {
requestOptions.headers["Content-Type"] = "application/json";
requestOptions.body = JSON.stringify(json);
}
if (options.body) {
requestOptions.body = options.body;
delete options.body;
}
if (options.headers) {
requestOptions.headers = {
...requestOptions.headers,
...options.headers,
};
delete options.headers;
}
if (options.credentials) {
requestOptions.credentials = options.credentials;
delete options.credentials;
}
const q = qs.stringify(options);
const url = `${this.options.apiUrl}/${path.replace(/^\//g, "")}${
q.length ? `?${q}` : ""
}`;
const res = await fetch(url, requestOptions);
// seems easier to deal with errors without `throw`
// await checkStatus(res)
return res.headers.get("Content-Type")?.match(/json/)
? res.json()
: res.text();
}
}