@cubicweb/client 1.1.0 → 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/lib/api/Api.d.ts +5 -4
- package/lib/api/Api.d.ts.map +1 -1
- package/lib/api/Api.js +52 -21
- package/lib/api/Api.js.map +1 -1
- package/lib/api/Client.js +1 -1
- package/lib/api/Client.js.map +1 -1
- package/package.json +1 -1
- package/src/api/Api.ts +85 -26
- package/src/api/Client.ts +1 -1
package/lib/api/Api.d.ts
CHANGED
|
@@ -5,9 +5,10 @@ export interface RQLParams {
|
|
|
5
5
|
}
|
|
6
6
|
export declare type RqlRow = Array<string | number | boolean | null>;
|
|
7
7
|
export declare type ResultSet = Array<RqlRow>;
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
declare type ApiError = {
|
|
9
|
+
title: string;
|
|
10
10
|
message: string;
|
|
11
|
+
data?: Record<string, unknown>;
|
|
11
12
|
};
|
|
12
13
|
export declare type ApiErrorResponse = {
|
|
13
14
|
status: number;
|
|
@@ -17,12 +18,12 @@ export default class Api {
|
|
|
17
18
|
private transactionApiUrl;
|
|
18
19
|
constructor(apiUrl: string);
|
|
19
20
|
execute(query: string, params: RQLParams): Promise<ResultSet>;
|
|
20
|
-
schema(): Promise<RawSchema
|
|
21
|
+
schema(): Promise<RawSchema>;
|
|
21
22
|
login(login: string, password: string): Promise<boolean>;
|
|
22
23
|
transactionBegin(): Promise<string>;
|
|
23
24
|
transactionExecute(uuid: string, query: string, params: RQLParams): Promise<ResultSet>;
|
|
24
25
|
transactionCommit(uuid: string): Promise<null>;
|
|
25
26
|
transactionRollback(uuid: string): Promise<null>;
|
|
26
27
|
}
|
|
27
|
-
export
|
|
28
|
+
export {};
|
|
28
29
|
//# sourceMappingURL=Api.d.ts.map
|
package/lib/api/Api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Api.d.ts","sourceRoot":"","sources":["../../src/api/Api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,oBAAY,QAAQ,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAE3C,MAAM,WAAW,SAAS;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;CAChC;AAED,oBAAY,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC;AAC7D,oBAAY,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;AACtC,
|
|
1
|
+
{"version":3,"file":"Api.d.ts","sourceRoot":"","sources":["../../src/api/Api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,oBAAY,QAAQ,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAE3C,MAAM,WAAW,SAAS;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;CAChC;AAED,oBAAY,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC;AAC7D,oBAAY,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;AACtC,aAAK,QAAQ,GAAG;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC,CAAC;AACF,oBAAY,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,QAAQ,CAAC;AAEb,MAAM,CAAC,OAAO,OAAO,GAAG;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,iBAAiB,CAKvB;gBAEU,MAAM,EAAE,MAAM;IAUpB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IAQ7D,MAAM,IAAI,OAAO,CAAC,SAAS,CAAC;IAO5B,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAaxD,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAOnC,kBAAkB,CACtB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,SAAS,GAChB,OAAO,CAAC,SAAS,CAAC;IAQf,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ9C,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAOvD"}
|
package/lib/api/Api.js
CHANGED
|
@@ -9,15 +9,20 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.fetchApi = void 0;
|
|
13
12
|
class Api {
|
|
14
13
|
constructor(apiUrl) {
|
|
14
|
+
this.transactionApiUrl = {
|
|
15
|
+
begin: "",
|
|
16
|
+
execute: "",
|
|
17
|
+
commit: "",
|
|
18
|
+
rollback: "",
|
|
19
|
+
};
|
|
15
20
|
this.apiUrl = `${apiUrl}/v1`;
|
|
16
|
-
this.transactionApiUrl = `${this.apiUrl}/transaction
|
|
21
|
+
Object.keys(this.transactionApiUrl).forEach((k) => (this.transactionApiUrl[k] = `${this.apiUrl}/transaction/${k}`));
|
|
17
22
|
}
|
|
18
23
|
execute(query, params) {
|
|
19
24
|
return __awaiter(this, void 0, void 0, function* () {
|
|
20
|
-
return (
|
|
25
|
+
return nonNullFetchApi(`${this.apiUrl}/rql`, {
|
|
21
26
|
method: "POST",
|
|
22
27
|
body: JSON.stringify({ query, params }),
|
|
23
28
|
credentials: "include", // FIXME is it secure?
|
|
@@ -26,7 +31,7 @@ class Api {
|
|
|
26
31
|
}
|
|
27
32
|
schema() {
|
|
28
33
|
return __awaiter(this, void 0, void 0, function* () {
|
|
29
|
-
return (
|
|
34
|
+
return nonNullFetchApi(`${this.apiUrl}/schema`, {
|
|
30
35
|
method: "GET",
|
|
31
36
|
credentials: "include",
|
|
32
37
|
});
|
|
@@ -34,7 +39,7 @@ class Api {
|
|
|
34
39
|
}
|
|
35
40
|
login(login, password) {
|
|
36
41
|
return __awaiter(this, void 0, void 0, function* () {
|
|
37
|
-
return
|
|
42
|
+
return fetchApi(`${this.apiUrl}/login`, {
|
|
38
43
|
method: "POST",
|
|
39
44
|
body: JSON.stringify({
|
|
40
45
|
login,
|
|
@@ -48,58 +53,84 @@ class Api {
|
|
|
48
53
|
}
|
|
49
54
|
transactionBegin() {
|
|
50
55
|
return __awaiter(this, void 0, void 0, function* () {
|
|
51
|
-
return (
|
|
56
|
+
return nonNullFetchApi(this.transactionApiUrl.begin, {
|
|
52
57
|
method: "POST",
|
|
53
|
-
body: JSON.stringify({ action: "begin" }),
|
|
54
58
|
credentials: "include",
|
|
55
59
|
});
|
|
56
60
|
});
|
|
57
61
|
}
|
|
58
62
|
transactionExecute(uuid, query, params) {
|
|
59
63
|
return __awaiter(this, void 0, void 0, function* () {
|
|
60
|
-
return (
|
|
64
|
+
return nonNullFetchApi(this.transactionApiUrl.execute, {
|
|
61
65
|
method: "POST",
|
|
62
|
-
body: JSON.stringify({
|
|
66
|
+
body: JSON.stringify({ uuid, query, params }),
|
|
63
67
|
credentials: "include",
|
|
64
68
|
});
|
|
65
69
|
});
|
|
66
70
|
}
|
|
67
71
|
transactionCommit(uuid) {
|
|
68
72
|
return __awaiter(this, void 0, void 0, function* () {
|
|
69
|
-
return
|
|
73
|
+
return fetchApi(this.transactionApiUrl.commit, {
|
|
70
74
|
method: "POST",
|
|
71
|
-
body: JSON.stringify({
|
|
75
|
+
body: JSON.stringify({ uuid }),
|
|
72
76
|
credentials: "include",
|
|
73
77
|
});
|
|
74
78
|
});
|
|
75
79
|
}
|
|
76
80
|
transactionRollback(uuid) {
|
|
77
81
|
return __awaiter(this, void 0, void 0, function* () {
|
|
78
|
-
return
|
|
82
|
+
return fetchApi(this.transactionApiUrl.rollback, {
|
|
79
83
|
method: "POST",
|
|
80
|
-
body: JSON.stringify({
|
|
84
|
+
body: JSON.stringify({ uuid }),
|
|
81
85
|
credentials: "include",
|
|
82
86
|
});
|
|
83
87
|
});
|
|
84
88
|
}
|
|
85
89
|
}
|
|
86
90
|
exports.default = Api;
|
|
91
|
+
const nonNullFetchApi = (input, init) => {
|
|
92
|
+
return new Promise((resolve, reject) => fetchApi(input, init)
|
|
93
|
+
.then((v) => {
|
|
94
|
+
if (v == null) {
|
|
95
|
+
const error = {
|
|
96
|
+
status: 500,
|
|
97
|
+
title: "Unexpected null response",
|
|
98
|
+
message: "Response was null but a value was expected",
|
|
99
|
+
};
|
|
100
|
+
reject(error);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
resolve(v);
|
|
104
|
+
}
|
|
105
|
+
})
|
|
106
|
+
.catch(reject));
|
|
107
|
+
};
|
|
87
108
|
const fetchApi = (input, init) => {
|
|
88
|
-
|
|
109
|
+
let headers = init === null || init === void 0 ? void 0 : init.headers;
|
|
110
|
+
if ((init === null || init === void 0 ? void 0 : init.method) && init.method !== "GET" && init.method !== "DELETE") {
|
|
111
|
+
headers = Object.assign({ "Content-Type": "application/json;charset=UTF-8" }, init === null || init === void 0 ? void 0 : init.headers);
|
|
112
|
+
}
|
|
113
|
+
return new Promise((resolve, reject) => fetch(input, Object.assign(Object.assign({}, init), { headers })).then((response) => {
|
|
89
114
|
const status = response.status;
|
|
90
115
|
if (status >= 200 && status < 300) {
|
|
91
|
-
|
|
116
|
+
if (status === 204) {
|
|
117
|
+
resolve(null);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
response
|
|
121
|
+
.json()
|
|
122
|
+
.then(resolve)
|
|
123
|
+
.catch((e) => {
|
|
124
|
+
console.error(e);
|
|
125
|
+
resolve(null);
|
|
126
|
+
});
|
|
127
|
+
}
|
|
92
128
|
}
|
|
93
129
|
else {
|
|
94
130
|
response.json().then((data) => {
|
|
95
|
-
reject({
|
|
96
|
-
status,
|
|
97
|
-
error: data.error,
|
|
98
|
-
message: data.message,
|
|
99
|
-
});
|
|
131
|
+
reject(Object.assign({ status }, data));
|
|
100
132
|
});
|
|
101
133
|
}
|
|
102
134
|
}));
|
|
103
135
|
};
|
|
104
|
-
exports.fetchApi = fetchApi;
|
|
105
136
|
//# sourceMappingURL=Api.js.map
|
package/lib/api/Api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Api.js","sourceRoot":"","sources":["../../src/api/Api.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Api.js","sourceRoot":"","sources":["../../src/api/Api.ts"],"names":[],"mappings":"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"}
|
package/lib/api/Client.js
CHANGED
package/lib/api/Client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Client.js","sourceRoot":"","sources":["../../src/api/Client.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,6CAA0C;AAC1C,gDAAuC;AACvC,gEAAwC;AAExC,MAAqB,MAAM;IAGzB,YAAY,MAAc;QACxB,IAAI,CAAC,GAAG,GAAG,IAAI,aAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAEK,OAAO,CAAC,KAAa,EAAE,SAAoB,EAAE;;YACjD,OAAO,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC/C,CAAC;KAAA;IAEK,MAAM;;YACV,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YACvC,OAAO,IAAI,eAAM,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;KAAA;IAEK,KAAK,CAAC,KAAa,EAAE,QAAgB;;YACzC,OAAO,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC/C,CAAC;KAAA;IAEK,WAAW,CAAI,QAAyC;;YAC5D,MAAM,WAAW,GAAG,IAAI,qBAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9C,MAAM,WAAW,CAAC,KAAK,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,CAAC;YAC3C,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE;gBAC3B,WAAW,CAAC,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"Client.js","sourceRoot":"","sources":["../../src/api/Client.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,6CAA0C;AAC1C,gDAAuC;AACvC,gEAAwC;AAExC,MAAqB,MAAM;IAGzB,YAAY,MAAc;QACxB,IAAI,CAAC,GAAG,GAAG,IAAI,aAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAEK,OAAO,CAAC,KAAa,EAAE,SAAoB,EAAE;;YACjD,OAAO,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC/C,CAAC;KAAA;IAEK,MAAM;;YACV,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YACvC,OAAO,IAAI,eAAM,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;KAAA;IAEK,KAAK,CAAC,KAAa,EAAE,QAAgB;;YACzC,OAAO,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC/C,CAAC;KAAA;IAEK,WAAW,CAAI,QAAyC;;YAC5D,MAAM,WAAW,GAAG,IAAI,qBAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9C,MAAM,WAAW,CAAC,KAAK,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,CAAC;YAC3C,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE;gBAC3B,MAAM,WAAW,CAAC,MAAM,EAAE,CAAC;aAC5B;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;KAAA;CACF;AA7BD,yBA6BC"}
|
package/package.json
CHANGED
package/src/api/Api.ts
CHANGED
|
@@ -8,37 +8,51 @@ export interface RQLParams {
|
|
|
8
8
|
|
|
9
9
|
export type RqlRow = Array<string | number | boolean | null>;
|
|
10
10
|
export type ResultSet = Array<RqlRow>;
|
|
11
|
-
|
|
11
|
+
type ApiError = {
|
|
12
|
+
title: string;
|
|
13
|
+
message: string;
|
|
14
|
+
data?: Record<string, unknown>;
|
|
15
|
+
};
|
|
12
16
|
export type ApiErrorResponse = {
|
|
13
17
|
status: number;
|
|
14
18
|
} & ApiError;
|
|
15
19
|
|
|
16
20
|
export default class Api {
|
|
17
21
|
private apiUrl: string;
|
|
18
|
-
private transactionApiUrl
|
|
22
|
+
private transactionApiUrl = {
|
|
23
|
+
begin: "",
|
|
24
|
+
execute: "",
|
|
25
|
+
commit: "",
|
|
26
|
+
rollback: "",
|
|
27
|
+
};
|
|
19
28
|
|
|
20
29
|
constructor(apiUrl: string) {
|
|
21
30
|
this.apiUrl = `${apiUrl}/v1`;
|
|
22
|
-
this.transactionApiUrl
|
|
31
|
+
Object.keys(this.transactionApiUrl).forEach(
|
|
32
|
+
(k) =>
|
|
33
|
+
(this.transactionApiUrl[
|
|
34
|
+
k as keyof typeof this.transactionApiUrl
|
|
35
|
+
] = `${this.apiUrl}/transaction/${k}`)
|
|
36
|
+
);
|
|
23
37
|
}
|
|
24
38
|
|
|
25
|
-
async execute(query: string, params: RQLParams) {
|
|
26
|
-
return
|
|
39
|
+
async execute(query: string, params: RQLParams): Promise<ResultSet> {
|
|
40
|
+
return nonNullFetchApi<ResultSet>(`${this.apiUrl}/rql`, {
|
|
27
41
|
method: "POST",
|
|
28
42
|
body: JSON.stringify({ query, params }),
|
|
29
43
|
credentials: "include", // FIXME is it secure?
|
|
30
44
|
});
|
|
31
45
|
}
|
|
32
46
|
|
|
33
|
-
async schema() {
|
|
34
|
-
return
|
|
47
|
+
async schema(): Promise<RawSchema> {
|
|
48
|
+
return nonNullFetchApi<RawSchema>(`${this.apiUrl}/schema`, {
|
|
35
49
|
method: "GET",
|
|
36
50
|
credentials: "include",
|
|
37
51
|
});
|
|
38
52
|
}
|
|
39
53
|
|
|
40
|
-
async login(login: string, password: string) {
|
|
41
|
-
return fetchApi<
|
|
54
|
+
async login(login: string, password: string): Promise<boolean> {
|
|
55
|
+
return fetchApi<null>(`${this.apiUrl}/login`, {
|
|
42
56
|
method: "POST",
|
|
43
57
|
body: JSON.stringify({
|
|
44
58
|
login,
|
|
@@ -50,55 +64,100 @@ export default class Api {
|
|
|
50
64
|
.catch(() => false);
|
|
51
65
|
}
|
|
52
66
|
|
|
53
|
-
async transactionBegin() {
|
|
54
|
-
return
|
|
67
|
+
async transactionBegin(): Promise<string> {
|
|
68
|
+
return nonNullFetchApi<string>(this.transactionApiUrl.begin, {
|
|
55
69
|
method: "POST",
|
|
56
|
-
body: JSON.stringify({ action: "begin" }),
|
|
57
70
|
credentials: "include",
|
|
58
71
|
});
|
|
59
72
|
}
|
|
60
73
|
|
|
61
|
-
async transactionExecute(
|
|
62
|
-
|
|
74
|
+
async transactionExecute(
|
|
75
|
+
uuid: string,
|
|
76
|
+
query: string,
|
|
77
|
+
params: RQLParams
|
|
78
|
+
): Promise<ResultSet> {
|
|
79
|
+
return nonNullFetchApi<ResultSet>(this.transactionApiUrl.execute, {
|
|
63
80
|
method: "POST",
|
|
64
|
-
body: JSON.stringify({
|
|
81
|
+
body: JSON.stringify({ uuid, query, params }),
|
|
65
82
|
credentials: "include",
|
|
66
83
|
});
|
|
67
84
|
}
|
|
68
85
|
|
|
69
|
-
async transactionCommit(uuid: string) {
|
|
70
|
-
return fetchApi<null>(this.transactionApiUrl, {
|
|
86
|
+
async transactionCommit(uuid: string): Promise<null> {
|
|
87
|
+
return fetchApi<null>(this.transactionApiUrl.commit, {
|
|
71
88
|
method: "POST",
|
|
72
|
-
body: JSON.stringify({
|
|
89
|
+
body: JSON.stringify({ uuid }),
|
|
73
90
|
credentials: "include",
|
|
74
91
|
});
|
|
75
92
|
}
|
|
76
93
|
|
|
77
|
-
async transactionRollback(uuid: string) {
|
|
78
|
-
return fetchApi<null>(this.transactionApiUrl, {
|
|
94
|
+
async transactionRollback(uuid: string): Promise<null> {
|
|
95
|
+
return fetchApi<null>(this.transactionApiUrl.rollback, {
|
|
79
96
|
method: "POST",
|
|
80
|
-
body: JSON.stringify({
|
|
97
|
+
body: JSON.stringify({ uuid }),
|
|
81
98
|
credentials: "include",
|
|
82
99
|
});
|
|
83
100
|
}
|
|
84
101
|
}
|
|
85
102
|
|
|
86
|
-
|
|
103
|
+
const nonNullFetchApi = <R = unknown>(
|
|
87
104
|
input: RequestInfo,
|
|
88
105
|
init?: RequestInit
|
|
89
106
|
) => {
|
|
90
107
|
return new Promise(
|
|
91
108
|
(resolve: (value: R) => void, reject: (reason: ApiErrorResponse) => void) =>
|
|
92
|
-
|
|
109
|
+
fetchApi<R>(input, init)
|
|
110
|
+
.then((v) => {
|
|
111
|
+
if (v == null) {
|
|
112
|
+
const error: ApiErrorResponse = {
|
|
113
|
+
status: 500,
|
|
114
|
+
title: "Unexpected null response",
|
|
115
|
+
message: "Response was null but a value was expected",
|
|
116
|
+
};
|
|
117
|
+
reject(error);
|
|
118
|
+
} else {
|
|
119
|
+
resolve(v);
|
|
120
|
+
}
|
|
121
|
+
})
|
|
122
|
+
.catch(reject)
|
|
123
|
+
);
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
const fetchApi = <R = unknown>(input: RequestInfo, init?: RequestInit) => {
|
|
127
|
+
let headers = init?.headers;
|
|
128
|
+
if (init?.method && init.method !== "GET" && init.method !== "DELETE") {
|
|
129
|
+
headers = {
|
|
130
|
+
"Content-Type": "application/json;charset=UTF-8",
|
|
131
|
+
...init?.headers,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
return new Promise(
|
|
135
|
+
(
|
|
136
|
+
resolve: (value: R | null) => void,
|
|
137
|
+
reject: (reason: ApiErrorResponse) => void
|
|
138
|
+
) =>
|
|
139
|
+
fetch(input, {
|
|
140
|
+
...init,
|
|
141
|
+
headers,
|
|
142
|
+
}).then((response) => {
|
|
93
143
|
const status = response.status;
|
|
94
144
|
if (status >= 200 && status < 300) {
|
|
95
|
-
|
|
145
|
+
if (status === 204) {
|
|
146
|
+
resolve(null);
|
|
147
|
+
} else {
|
|
148
|
+
response
|
|
149
|
+
.json()
|
|
150
|
+
.then(resolve)
|
|
151
|
+
.catch((e) => {
|
|
152
|
+
console.error(e);
|
|
153
|
+
resolve(null);
|
|
154
|
+
});
|
|
155
|
+
}
|
|
96
156
|
} else {
|
|
97
157
|
response.json().then((data: ApiError) => {
|
|
98
158
|
reject({
|
|
99
159
|
status,
|
|
100
|
-
|
|
101
|
-
message: data.message,
|
|
160
|
+
...data,
|
|
102
161
|
});
|
|
103
162
|
});
|
|
104
163
|
}
|