@koine/api 2.0.0-beta.80 → 2.0.0-beta.83
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/ApiError.cjs.js +7 -7
- package/ApiError.esm.js +7 -7
- package/createApi.cjs.js +18 -113
- package/createApi.esm.js +18 -113
- package/createApiResultFail.cjs.js +1 -13
- package/createApiResultFail.esm.js +1 -13
- package/createApiResultOk.cjs.js +1 -7
- package/createApiResultOk.esm.js +1 -7
- package/createSwrApi.cjs.js +41 -19
- package/createSwrApi.esm.js +40 -18
- package/next.cjs.js +2 -16
- package/next.esm.js +2 -16
- package/package.json +2 -2
- package/swr/createSwrApi.d.ts +3 -1
- package/swr-mutation/createSwrMutationApi.d.ts +2 -6
- package/swr-mutation.cjs.js +12 -24
- package/swr-mutation.esm.js +11 -23
package/ApiError.cjs.js
CHANGED
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
}
|
|
5
|
+
/**
|
|
6
|
+
* Custom `ApiError` class extending `Error` to throw in failed response.
|
|
7
|
+
*
|
|
8
|
+
* @see https://eslint.org/docs/rules/no-throw-literal
|
|
9
|
+
* @see https://github.com/sindresorhus/ky/blob/main/source/errors/HTTPError.ts
|
|
10
|
+
*
|
|
11
|
+
*/class ApiError extends Error{constructor(r){super(`Request failed with ${r.status} ${r.msg}`),this.name="ApiError",Object.assign(this,r);}}
|
|
12
12
|
|
|
13
13
|
exports.ApiError = ApiError;
|
|
14
14
|
exports["default"] = ApiError;
|
package/ApiError.esm.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Custom `ApiError` class extending `Error` to throw in failed response.
|
|
3
|
+
*
|
|
4
|
+
* @see https://eslint.org/docs/rules/no-throw-literal
|
|
5
|
+
* @see https://github.com/sindresorhus/ky/blob/main/source/errors/HTTPError.ts
|
|
6
|
+
*
|
|
7
|
+
*/class ApiError extends Error{constructor(r){super(`Request failed with ${r.status} ${r.msg}`),this.name="ApiError",Object.assign(this,r);}}
|
|
8
8
|
|
|
9
9
|
export { ApiError, ApiError as default };
|
package/createApi.cjs.js
CHANGED
|
@@ -4,119 +4,24 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
4
4
|
|
|
5
5
|
var utils = require('@koine/utils');
|
|
6
6
|
|
|
7
|
-
let
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
];
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
"content-type": "application/json",
|
|
26
|
-
...headers,
|
|
27
|
-
},
|
|
28
|
-
};
|
|
29
|
-
if (processReqBase) {
|
|
30
|
-
const transformed = processReqBase(method, url, query, json, params, requestInit);
|
|
31
|
-
url = transformed[0];
|
|
32
|
-
query = transformed[1];
|
|
33
|
-
json = transformed[2];
|
|
34
|
-
params = transformed[3];
|
|
35
|
-
requestInit = transformed[4];
|
|
36
|
-
}
|
|
37
|
-
if (processReq) {
|
|
38
|
-
const transformed = processReq(method, url, query, json, params, requestInit);
|
|
39
|
-
url = transformed[0];
|
|
40
|
-
query = transformed[1];
|
|
41
|
-
json = transformed[2];
|
|
42
|
-
params = transformed[3];
|
|
43
|
-
requestInit = transformed[4];
|
|
44
|
-
}
|
|
45
|
-
if (utils.isFullObject(params)) {
|
|
46
|
-
for (const key in params) {
|
|
47
|
-
url = url.replace(`{${key}}`, params[key].toString());
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
const timeoutNumber = Number(timeout);
|
|
51
|
-
let controller;
|
|
52
|
-
let timeoutId;
|
|
53
|
-
if (json) {
|
|
54
|
-
requestInit.body = JSON.stringify(json);
|
|
55
|
-
}
|
|
56
|
-
if (timeoutNumber > 0) {
|
|
57
|
-
controller = new AbortController();
|
|
58
|
-
timeoutId = setTimeout(() => controller.abort(), timeoutNumber);
|
|
59
|
-
requestInit.signal = controller.signal;
|
|
60
|
-
}
|
|
61
|
-
if (query) {
|
|
62
|
-
url += utils.buildUrlQueryString(query);
|
|
63
|
-
}
|
|
64
|
-
let response = null;
|
|
65
|
-
let result = null;
|
|
66
|
-
let msg = "";
|
|
67
|
-
try {
|
|
68
|
-
response = await fetch(url, requestInit);
|
|
69
|
-
}
|
|
70
|
-
catch (e) {
|
|
71
|
-
msg = utils.errorToString(e);
|
|
72
|
-
}
|
|
73
|
-
if (timeoutId) {
|
|
74
|
-
clearTimeout(timeoutId);
|
|
75
|
-
}
|
|
76
|
-
if (response) {
|
|
77
|
-
try {
|
|
78
|
-
if (processRes) {
|
|
79
|
-
result = await processRes(response, options || {});
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
result = await response.json();
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
catch (e) {
|
|
86
|
-
msg = utils.errorToString(e);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
if (result === null) {
|
|
90
|
-
if (processErr) {
|
|
91
|
-
result = await processErr(msg, options || {});
|
|
92
|
-
}
|
|
93
|
-
else {
|
|
94
|
-
result = {
|
|
95
|
-
data: null,
|
|
96
|
-
msg,
|
|
97
|
-
status: 100,
|
|
98
|
-
fail: true,
|
|
99
|
-
ok: false,
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
if (throwErr && result?.fail) {
|
|
104
|
-
throw result;
|
|
105
|
-
}
|
|
106
|
-
if (process.env["NODE_ENV"] === "development") {
|
|
107
|
-
const logMsg = `${result?.status}: api[${apiName}] ${method.toUpperCase()} ${url}`;
|
|
108
|
-
if (result?.ok) {
|
|
109
|
-
console.info(`🟢 ${logMsg}`);
|
|
110
|
-
}
|
|
111
|
-
else {
|
|
112
|
-
console.info(`🔴 ${logMsg}`);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
return result;
|
|
116
|
-
};
|
|
117
|
-
return api;
|
|
118
|
-
}, {});
|
|
119
|
-
};
|
|
7
|
+
let o=["get","post","put","patch","delete"];/**
|
|
8
|
+
* Create api client
|
|
9
|
+
*
|
|
10
|
+
* @param apiName Short name to use in debug logs
|
|
11
|
+
* @param baseUrl Either relativ eor absolute, it must end without trailing slash
|
|
12
|
+
*/let createApi=(l,a,i)=>{let{headers:s={},request:n={},throwErr:p,timeout:c=1e4,processReq:u,processRes:f,processErr:d}=i||{};return o.reduce((o,i)=>(// @ts-expect-error FIXME: type
|
|
13
|
+
o[i]=async(o,h)=>{let $,m;let{request:w=n,headers:y=s,timeout:g=c,processReq:b,processRes:E=f,processErr:N=d,throwErr:k=p}=h||{},{params:A,json:C,query:j}=h||{},q=`${a}/${o+"".replace(/^\/*/,"")}`,v={method:i.toUpperCase(),...w,headers:{"content-type":"application/json",...y}};if(u){let e=u(i,q,j,C,A,v);q=e[0],j=e[1],C=e[2],A=e[3],v=e[4];}if(b){let e=b(i,q,j,C,A,v);q=e[0],j=e[1],C=e[2],A=e[3],v=e[4];}if(utils.isFullObject(A))for(let e in A)q=q.replace(`{${e}}`,A[e].toString());let x=Number(g);C&&(v.body=JSON.stringify(C)),x>0&&(// TODO: combine multiple abort signals
|
|
14
|
+
// @see https://dev.to/rashidshamloo/adding-timeout-and-multiple-abort-signals-to-fetch-typescriptreact-33bb
|
|
15
|
+
$=new AbortController,m=setTimeout(()=>$.abort(),x),v.signal=$.signal),j&&// FIXME: ts-expect-error this assertion is not the best, but nevermind for now
|
|
16
|
+
(q+=utils.buildUrlQueryString(j));let O=null,R=null,S="";try{O=await fetch(q,v);}catch(e){S=utils.errorToString(e);}if(m&&clearTimeout(m),O)try{R=E?await E(O,h||{}):await O.json();}catch(e){S=utils.errorToString(e);}if(null===R&&(R=N?await N(S,h||{}):// this error should only happen on network errors or wrong API urls
|
|
17
|
+
// there is no specific HTTP error for this, we can consider these
|
|
18
|
+
// two statuses though:
|
|
19
|
+
// - [100 Continue](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/100)
|
|
20
|
+
// - [501 Not Implemented](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/501)
|
|
21
|
+
{data:null,msg:S,status:100,fail:!0,ok:!1}),k&&R?.fail)// throw new ApiError<Failed>(result);
|
|
22
|
+
// I prefer to throw an object literal despite what eslint says
|
|
23
|
+
// eslint-disable-next-line no-throw-literal
|
|
24
|
+
throw R;if("development"===process.env.NODE_ENV){let e=`${R?.status}: api[${l}] ${i.toUpperCase()} ${q}`;R?.ok?console.info(`🟢 ${e}`):console.info(`🔴 ${e}`);}return R},o),{})};
|
|
120
25
|
|
|
121
26
|
exports.createApi = createApi;
|
|
122
27
|
exports["default"] = createApi;
|
package/createApi.esm.js
CHANGED
|
@@ -1,117 +1,22 @@
|
|
|
1
1
|
import { isFullObject, buildUrlQueryString, errorToString } from '@koine/utils';
|
|
2
2
|
|
|
3
|
-
let
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
];
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
"content-type": "application/json",
|
|
22
|
-
...headers,
|
|
23
|
-
},
|
|
24
|
-
};
|
|
25
|
-
if (processReqBase) {
|
|
26
|
-
const transformed = processReqBase(method, url, query, json, params, requestInit);
|
|
27
|
-
url = transformed[0];
|
|
28
|
-
query = transformed[1];
|
|
29
|
-
json = transformed[2];
|
|
30
|
-
params = transformed[3];
|
|
31
|
-
requestInit = transformed[4];
|
|
32
|
-
}
|
|
33
|
-
if (processReq) {
|
|
34
|
-
const transformed = processReq(method, url, query, json, params, requestInit);
|
|
35
|
-
url = transformed[0];
|
|
36
|
-
query = transformed[1];
|
|
37
|
-
json = transformed[2];
|
|
38
|
-
params = transformed[3];
|
|
39
|
-
requestInit = transformed[4];
|
|
40
|
-
}
|
|
41
|
-
if (isFullObject(params)) {
|
|
42
|
-
for (const key in params) {
|
|
43
|
-
url = url.replace(`{${key}}`, params[key].toString());
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
const timeoutNumber = Number(timeout);
|
|
47
|
-
let controller;
|
|
48
|
-
let timeoutId;
|
|
49
|
-
if (json) {
|
|
50
|
-
requestInit.body = JSON.stringify(json);
|
|
51
|
-
}
|
|
52
|
-
if (timeoutNumber > 0) {
|
|
53
|
-
controller = new AbortController();
|
|
54
|
-
timeoutId = setTimeout(() => controller.abort(), timeoutNumber);
|
|
55
|
-
requestInit.signal = controller.signal;
|
|
56
|
-
}
|
|
57
|
-
if (query) {
|
|
58
|
-
url += buildUrlQueryString(query);
|
|
59
|
-
}
|
|
60
|
-
let response = null;
|
|
61
|
-
let result = null;
|
|
62
|
-
let msg = "";
|
|
63
|
-
try {
|
|
64
|
-
response = await fetch(url, requestInit);
|
|
65
|
-
}
|
|
66
|
-
catch (e) {
|
|
67
|
-
msg = errorToString(e);
|
|
68
|
-
}
|
|
69
|
-
if (timeoutId) {
|
|
70
|
-
clearTimeout(timeoutId);
|
|
71
|
-
}
|
|
72
|
-
if (response) {
|
|
73
|
-
try {
|
|
74
|
-
if (processRes) {
|
|
75
|
-
result = await processRes(response, options || {});
|
|
76
|
-
}
|
|
77
|
-
else {
|
|
78
|
-
result = await response.json();
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
catch (e) {
|
|
82
|
-
msg = errorToString(e);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
if (result === null) {
|
|
86
|
-
if (processErr) {
|
|
87
|
-
result = await processErr(msg, options || {});
|
|
88
|
-
}
|
|
89
|
-
else {
|
|
90
|
-
result = {
|
|
91
|
-
data: null,
|
|
92
|
-
msg,
|
|
93
|
-
status: 100,
|
|
94
|
-
fail: true,
|
|
95
|
-
ok: false,
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
if (throwErr && result?.fail) {
|
|
100
|
-
throw result;
|
|
101
|
-
}
|
|
102
|
-
if (process.env["NODE_ENV"] === "development") {
|
|
103
|
-
const logMsg = `${result?.status}: api[${apiName}] ${method.toUpperCase()} ${url}`;
|
|
104
|
-
if (result?.ok) {
|
|
105
|
-
console.info(`🟢 ${logMsg}`);
|
|
106
|
-
}
|
|
107
|
-
else {
|
|
108
|
-
console.info(`🔴 ${logMsg}`);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
return result;
|
|
112
|
-
};
|
|
113
|
-
return api;
|
|
114
|
-
}, {});
|
|
115
|
-
};
|
|
3
|
+
let o=["get","post","put","patch","delete"];/**
|
|
4
|
+
* Create api client
|
|
5
|
+
*
|
|
6
|
+
* @param apiName Short name to use in debug logs
|
|
7
|
+
* @param baseUrl Either relativ eor absolute, it must end without trailing slash
|
|
8
|
+
*/let createApi=(l,a,i)=>{let{headers:s={},request:n={},throwErr:p,timeout:c=1e4,processReq:u,processRes:f,processErr:d}=i||{};return o.reduce((o,i)=>(// @ts-expect-error FIXME: type
|
|
9
|
+
o[i]=async(o,h)=>{let $,m;let{request:w=n,headers:y=s,timeout:g=c,processReq:b,processRes:E=f,processErr:N=d,throwErr:k=p}=h||{},{params:A,json:C,query:j}=h||{},q=`${a}/${o+"".replace(/^\/*/,"")}`,v={method:i.toUpperCase(),...w,headers:{"content-type":"application/json",...y}};if(u){let e=u(i,q,j,C,A,v);q=e[0],j=e[1],C=e[2],A=e[3],v=e[4];}if(b){let e=b(i,q,j,C,A,v);q=e[0],j=e[1],C=e[2],A=e[3],v=e[4];}if(isFullObject(A))for(let e in A)q=q.replace(`{${e}}`,A[e].toString());let x=Number(g);C&&(v.body=JSON.stringify(C)),x>0&&(// TODO: combine multiple abort signals
|
|
10
|
+
// @see https://dev.to/rashidshamloo/adding-timeout-and-multiple-abort-signals-to-fetch-typescriptreact-33bb
|
|
11
|
+
$=new AbortController,m=setTimeout(()=>$.abort(),x),v.signal=$.signal),j&&// FIXME: ts-expect-error this assertion is not the best, but nevermind for now
|
|
12
|
+
(q+=buildUrlQueryString(j));let O=null,R=null,S="";try{O=await fetch(q,v);}catch(e){S=errorToString(e);}if(m&&clearTimeout(m),O)try{R=E?await E(O,h||{}):await O.json();}catch(e){S=errorToString(e);}if(null===R&&(R=N?await N(S,h||{}):// this error should only happen on network errors or wrong API urls
|
|
13
|
+
// there is no specific HTTP error for this, we can consider these
|
|
14
|
+
// two statuses though:
|
|
15
|
+
// - [100 Continue](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/100)
|
|
16
|
+
// - [501 Not Implemented](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/501)
|
|
17
|
+
{data:null,msg:S,status:100,fail:!0,ok:!1}),k&&R?.fail)// throw new ApiError<Failed>(result);
|
|
18
|
+
// I prefer to throw an object literal despite what eslint says
|
|
19
|
+
// eslint-disable-next-line no-throw-literal
|
|
20
|
+
throw R;if("development"===process.env.NODE_ENV){let e=`${R?.status}: api[${l}] ${i.toUpperCase()} ${q}`;R?.ok?console.info(`🟢 ${e}`):console.info(`🔴 ${e}`);}return R},o),{})};
|
|
116
21
|
|
|
117
22
|
export { createApi, createApi as default };
|
|
@@ -2,19 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
|
-
let createApiResultOk
|
|
6
|
-
ok: true,
|
|
7
|
-
fail: false,
|
|
8
|
-
data,
|
|
9
|
-
msg: msg || "",
|
|
10
|
-
status: 200,
|
|
11
|
-
});
|
|
12
|
-
let createApiResultFail = (data = {}, msg, status) => ({
|
|
13
|
-
fail: true,
|
|
14
|
-
data,
|
|
15
|
-
msg: msg || "",
|
|
16
|
-
status: status || 404,
|
|
17
|
-
});
|
|
5
|
+
let createApiResultOk=(t={},e)=>({ok:!0,fail:!1,data:t,msg:e||"",status:200});let createApiResultFail=(t={},e,a)=>({fail:!0,data:t,msg:e||"",status:a||404});
|
|
18
6
|
|
|
19
7
|
exports.createApiResultFail = createApiResultFail;
|
|
20
8
|
exports.createApiResultOk = createApiResultOk;
|
|
@@ -1,15 +1,3 @@
|
|
|
1
|
-
let createApiResultOk
|
|
2
|
-
ok: true,
|
|
3
|
-
fail: false,
|
|
4
|
-
data,
|
|
5
|
-
msg: msg || "",
|
|
6
|
-
status: 200,
|
|
7
|
-
});
|
|
8
|
-
let createApiResultFail = (data = {}, msg, status) => ({
|
|
9
|
-
fail: true,
|
|
10
|
-
data,
|
|
11
|
-
msg: msg || "",
|
|
12
|
-
status: status || 404,
|
|
13
|
-
});
|
|
1
|
+
let createApiResultOk=(t={},e)=>({ok:!0,fail:!1,data:t,msg:e||"",status:200});let createApiResultFail=(t={},e,a)=>({fail:!0,data:t,msg:e||"",status:a||404});
|
|
14
2
|
|
|
15
3
|
export { createApiResultFail, createApiResultOk, createApiResultFail as default };
|
package/createApiResultOk.cjs.js
CHANGED
|
@@ -2,13 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
|
-
let createApiResultOk
|
|
6
|
-
ok: true,
|
|
7
|
-
fail: false,
|
|
8
|
-
data,
|
|
9
|
-
msg: msg || "",
|
|
10
|
-
status: 200,
|
|
11
|
-
});
|
|
5
|
+
let createApiResultOk=(e={},t)=>({ok:!0,fail:!1,data:e,msg:t||"",status:200});
|
|
12
6
|
|
|
13
7
|
exports.createApiResultOk = createApiResultOk;
|
|
14
8
|
exports["default"] = createApiResultOk;
|
package/createApiResultOk.esm.js
CHANGED
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
let createApiResultOk
|
|
2
|
-
ok: true,
|
|
3
|
-
fail: false,
|
|
4
|
-
data,
|
|
5
|
-
msg: msg || "",
|
|
6
|
-
status: 200,
|
|
7
|
-
});
|
|
1
|
+
let createApiResultOk=(e={},t)=>({ok:!0,fail:!1,data:e,msg:t||"",status:200});
|
|
8
2
|
|
|
9
3
|
export { createApiResultOk, createApiResultOk as default };
|
package/createSwrApi.cjs.js
CHANGED
|
@@ -1,30 +1,52 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var e = require('swr');
|
|
4
4
|
var utils = require('@koine/utils');
|
|
5
5
|
var createApi = require('./createApi.cjs.js');
|
|
6
6
|
|
|
7
7
|
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
8
8
|
|
|
9
|
-
var
|
|
9
|
+
var e__default = /*#__PURE__*/_interopDefaultLegacy(e);
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
11
|
+
/**
|
|
12
|
+
* Conditional fetching as option
|
|
13
|
+
*
|
|
14
|
+
* Moving this to an option allows us to keep the endpoints typed dictionary,
|
|
15
|
+
* e.g. we can write:
|
|
16
|
+
*
|
|
17
|
+
* ```js
|
|
18
|
+
* const { data, mutate } = myApi.use("User/{id}",
|
|
19
|
+
* { params: { id: aVariableMaybeContainingAnId || "" }, },
|
|
20
|
+
* { when: !!aVariableMaybeContainingAnId }
|
|
21
|
+
* );
|
|
22
|
+
*
|
|
23
|
+
* // we still have typed `data`, `mutate`
|
|
24
|
+
* ```
|
|
25
|
+
* @see https://swr.vercel.app/docs/conditional-fetching
|
|
26
|
+
*//**
|
|
27
|
+
* @private
|
|
28
|
+
*//**
|
|
29
|
+
* @private
|
|
30
|
+
*/let createUseApi=t=>(i,o,p)=>{// const fetcher = async (_endpoint: TEndpoint) => {
|
|
31
|
+
// try {
|
|
32
|
+
// const { ok, data } = await api.get(_endpoint, {
|
|
33
|
+
// ...(options || {}),
|
|
34
|
+
// throwErr: true,
|
|
35
|
+
// });
|
|
36
|
+
// if (ok) {
|
|
37
|
+
// return data;
|
|
38
|
+
// }
|
|
39
|
+
// throw new Error() as unknown as Api.EndpointResponseFail<TEndpoints, TEndpoint, TMethod>;
|
|
40
|
+
// } catch(e) {
|
|
41
|
+
// throw new Error() as unknown as Api.EndpointResponseFail<TEndpoints, TEndpoint, TMethod>;;
|
|
42
|
+
// }
|
|
43
|
+
// };
|
|
44
|
+
// }
|
|
45
|
+
let a=async()=>{let{data:e}=await t.get(i,{...o||{},throwErr:!0});return e};// <Data = any, Error = any>(key: Key, config: SWRConfigurationExtended<Data, Error, Fetcher<Data>> | undefined): SWRResponse<Data, Error>;
|
|
46
|
+
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
47
|
+
return e__default["default"](p?.when===!1||utils.isFunction(p?.when)&&p?.when()===!1?null:o?[i,o]:[i],a,p)};/**
|
|
48
|
+
* It creates an api client extended with auto-generated SWR wrapper hooks
|
|
49
|
+
*/let createSwrApi=(...e)=>{let r=createApi.createApi(...e);return r.use=createUseApi(r),r};
|
|
28
50
|
|
|
29
51
|
exports.createSwrApi = createSwrApi;
|
|
30
52
|
exports.createUseApi = createUseApi;
|
package/createSwrApi.esm.js
CHANGED
|
@@ -1,23 +1,45 @@
|
|
|
1
|
-
import
|
|
1
|
+
import e from 'swr';
|
|
2
2
|
import { isFunction } from '@koine/utils';
|
|
3
3
|
import { createApi } from './createApi.esm.js';
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
5
|
+
/**
|
|
6
|
+
* Conditional fetching as option
|
|
7
|
+
*
|
|
8
|
+
* Moving this to an option allows us to keep the endpoints typed dictionary,
|
|
9
|
+
* e.g. we can write:
|
|
10
|
+
*
|
|
11
|
+
* ```js
|
|
12
|
+
* const { data, mutate } = myApi.use("User/{id}",
|
|
13
|
+
* { params: { id: aVariableMaybeContainingAnId || "" }, },
|
|
14
|
+
* { when: !!aVariableMaybeContainingAnId }
|
|
15
|
+
* );
|
|
16
|
+
*
|
|
17
|
+
* // we still have typed `data`, `mutate`
|
|
18
|
+
* ```
|
|
19
|
+
* @see https://swr.vercel.app/docs/conditional-fetching
|
|
20
|
+
*//**
|
|
21
|
+
* @private
|
|
22
|
+
*//**
|
|
23
|
+
* @private
|
|
24
|
+
*/let createUseApi=t=>(i,o,p)=>{// const fetcher = async (_endpoint: TEndpoint) => {
|
|
25
|
+
// try {
|
|
26
|
+
// const { ok, data } = await api.get(_endpoint, {
|
|
27
|
+
// ...(options || {}),
|
|
28
|
+
// throwErr: true,
|
|
29
|
+
// });
|
|
30
|
+
// if (ok) {
|
|
31
|
+
// return data;
|
|
32
|
+
// }
|
|
33
|
+
// throw new Error() as unknown as Api.EndpointResponseFail<TEndpoints, TEndpoint, TMethod>;
|
|
34
|
+
// } catch(e) {
|
|
35
|
+
// throw new Error() as unknown as Api.EndpointResponseFail<TEndpoints, TEndpoint, TMethod>;;
|
|
36
|
+
// }
|
|
37
|
+
// };
|
|
38
|
+
// }
|
|
39
|
+
let a=async()=>{let{data:e}=await t.get(i,{...o||{},throwErr:!0});return e};// <Data = any, Error = any>(key: Key, config: SWRConfigurationExtended<Data, Error, Fetcher<Data>> | undefined): SWRResponse<Data, Error>;
|
|
40
|
+
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
41
|
+
return e(p?.when===!1||isFunction(p?.when)&&p?.when()===!1?null:o?[i,o]:[i],a,p)};/**
|
|
42
|
+
* It creates an api client extended with auto-generated SWR wrapper hooks
|
|
43
|
+
*/let createSwrApi=(...e)=>{let r=createApi(...e);return r.use=createUseApi(r),r};
|
|
22
44
|
|
|
23
45
|
export { createUseApi as a, createSwrApi as c };
|
package/next.cjs.js
CHANGED
|
@@ -6,23 +6,9 @@ var server = require('next/server');
|
|
|
6
6
|
var createApiResultFail = require('./createApiResultFail.cjs.js');
|
|
7
7
|
var createApiResultOk = require('./createApiResultOk.cjs.js');
|
|
8
8
|
|
|
9
|
-
let nextApiResponse
|
|
10
|
-
ok(data, msg) {
|
|
11
|
-
return server.NextResponse.json(createApiResultOk.createApiResultOk(data, msg));
|
|
12
|
-
},
|
|
13
|
-
fail(data, msg, status) {
|
|
14
|
-
return server.NextResponse.json(createApiResultFail.createApiResultFail(data, msg, status));
|
|
15
|
-
},
|
|
16
|
-
};
|
|
9
|
+
let nextApiResponse={ok:(t,r)=>server.NextResponse.json(createApiResultOk.createApiResultOk(t,r)),fail:(o,r,p)=>server.NextResponse.json(createApiResultFail.createApiResultFail(o,r,p))};
|
|
17
10
|
|
|
18
|
-
let nextApiResponse12
|
|
19
|
-
ok(data, msg) {
|
|
20
|
-
nextRes.status(200).json(createApiResultOk.createApiResultOk(data, msg));
|
|
21
|
-
},
|
|
22
|
-
fail(data, msg, status) {
|
|
23
|
-
nextRes.status(status || 404).json(createApiResultFail.createApiResultFail(data, msg, status));
|
|
24
|
-
},
|
|
25
|
-
});
|
|
11
|
+
let nextApiResponse12=s=>({ok(e,o){s.status(200).json(createApiResultOk.createApiResultOk(e,o));},fail(t,o,p){s.status(p||404).json(createApiResultFail.createApiResultFail(t,o,p));}});
|
|
26
12
|
|
|
27
13
|
exports.nextApiResponse = nextApiResponse;
|
|
28
14
|
exports.nextApiResponse12 = nextApiResponse12;
|
package/next.esm.js
CHANGED
|
@@ -2,22 +2,8 @@ import { NextResponse } from 'next/server';
|
|
|
2
2
|
import { createApiResultFail } from './createApiResultFail.esm.js';
|
|
3
3
|
import { createApiResultOk } from './createApiResultOk.esm.js';
|
|
4
4
|
|
|
5
|
-
let nextApiResponse
|
|
6
|
-
ok(data, msg) {
|
|
7
|
-
return NextResponse.json(createApiResultOk(data, msg));
|
|
8
|
-
},
|
|
9
|
-
fail(data, msg, status) {
|
|
10
|
-
return NextResponse.json(createApiResultFail(data, msg, status));
|
|
11
|
-
},
|
|
12
|
-
};
|
|
5
|
+
let nextApiResponse={ok:(t,r)=>NextResponse.json(createApiResultOk(t,r)),fail:(o,r,p)=>NextResponse.json(createApiResultFail(o,r,p))};
|
|
13
6
|
|
|
14
|
-
let nextApiResponse12
|
|
15
|
-
ok(data, msg) {
|
|
16
|
-
nextRes.status(200).json(createApiResultOk(data, msg));
|
|
17
|
-
},
|
|
18
|
-
fail(data, msg, status) {
|
|
19
|
-
nextRes.status(status || 404).json(createApiResultFail(data, msg, status));
|
|
20
|
-
},
|
|
21
|
-
});
|
|
7
|
+
let nextApiResponse12=s=>({ok(e,o){s.status(200).json(createApiResultOk(e,o));},fail(t,o,p){s.status(p||404).json(createApiResultFail(t,o,p));}});
|
|
22
8
|
|
|
23
9
|
export { nextApiResponse, nextApiResponse12 };
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@koine/api",
|
|
3
3
|
"sideEffects": false,
|
|
4
4
|
"dependencies": {
|
|
5
|
-
"@koine/utils": "2.0.0-beta.
|
|
5
|
+
"@koine/utils": "2.0.0-beta.83"
|
|
6
6
|
},
|
|
7
7
|
"peerDependencies": {
|
|
8
8
|
"next": "^14.0.4",
|
|
@@ -61,5 +61,5 @@
|
|
|
61
61
|
},
|
|
62
62
|
"module": "./index.esm.js",
|
|
63
63
|
"main": "./index.cjs.js",
|
|
64
|
-
"version": "2.0.0-beta.
|
|
64
|
+
"version": "2.0.0-beta.83"
|
|
65
65
|
}
|
package/swr/createSwrApi.d.ts
CHANGED
|
@@ -3,7 +3,9 @@ import type { Api } from "../types";
|
|
|
3
3
|
type SWRConfigurationExtended<Data = any, Error = any, Fn extends BareFetcher<any> = BareFetcher<any>> = SWRConfiguration<Data, Error, Fn> & {
|
|
4
4
|
when?: boolean | (() => boolean);
|
|
5
5
|
};
|
|
6
|
+
export type CreatedUseApi<TEndpoints extends Api.Endpoints> = ReturnType<typeof createUseApi<TEndpoints>>;
|
|
7
|
+
export declare let createUseApi: <TEndpoints extends Api.Endpoints>(api: Api.Client<TEndpoints>) => <TEndpoint extends Extract<keyof TEndpoints, string>>(endpoint: TEndpoint, options?: Api.EndpointOptions<TEndpoints, TEndpoint, "get">, config?: SWRConfigurationExtended<Api.EndpointResponseOk<TEndpoints, TEndpoint, "get">, Api.EndpointResponseFail<TEndpoints, TEndpoint, "get">>) => SWRResponse<Api.GetDataType<TEndpoints, TEndpoint, "get", "ok">, Api.GetDataType<TEndpoints, TEndpoint, "get", "fail">, any>;
|
|
6
8
|
export declare let createSwrApi: <TEndpoints extends Api.Endpoints>(apiName: string, baseUrl: string, options?: Api.ClientOptions | undefined) => Api.Client<TEndpoints> & {
|
|
7
|
-
use: <
|
|
9
|
+
use: CreatedUseApi<TEndpoints>;
|
|
8
10
|
};
|
|
9
11
|
export default createSwrApi;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type SWRMutationConfiguration, type SWRMutationResponse } from "swr/mutation";
|
|
2
|
-
import {
|
|
2
|
+
import { type CreatedUseApi } from "../swr/createSwrApi";
|
|
3
3
|
import type { Api } from "../types";
|
|
4
4
|
type MutationRequestMethod = Exclude<Api.RequestMethod, "get">;
|
|
5
5
|
type MutationHookName = Exclude<keyof Api.HooksMapsByName, "use">;
|
|
@@ -10,10 +10,6 @@ export declare let createSwrMutationApi: <TEndpoints extends Api.Endpoints>(apiN
|
|
|
10
10
|
usePatch: KoineApiMethodHookSWR<"usePatch", TEndpoints>;
|
|
11
11
|
useDelete: KoineApiMethodHookSWR<"useDelete", TEndpoints>;
|
|
12
12
|
} & {
|
|
13
|
-
use: <
|
|
14
|
-
provider?: ((cache: Readonly<import("swr/dist/_internal").Cache<any>>) => import("swr/dist/_internal").Cache<any>) | undefined;
|
|
15
|
-
} & {
|
|
16
|
-
when?: boolean | (() => boolean) | undefined;
|
|
17
|
-
}) | undefined) => import("swr/dist/_internal").SWRResponse<Api.GetDataType<TEndpoints, TEndpoint, "get", "ok">, Api.GetDataType<TEndpoints, TEndpoint, "get", "fail">, any>;
|
|
13
|
+
use: CreatedUseApi<TEndpoints>;
|
|
18
14
|
};
|
|
19
15
|
export default createSwrMutationApi;
|
package/swr-mutation.cjs.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
|
-
var
|
|
5
|
+
var r = require('swr/mutation');
|
|
6
6
|
var createApi = require('./createApi.cjs.js');
|
|
7
7
|
var createSwrApi = require('./createSwrApi.cjs.js');
|
|
8
8
|
require('@koine/utils');
|
|
@@ -10,29 +10,17 @@ require('swr');
|
|
|
10
10
|
|
|
11
11
|
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
12
12
|
|
|
13
|
-
var
|
|
13
|
+
var r__default = /*#__PURE__*/_interopDefaultLegacy(r);
|
|
14
14
|
|
|
15
|
-
let
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
};
|
|
26
|
-
return useSWRMutation__default["default"](options ? [endpoint, options] : endpoint, sender, config);
|
|
27
|
-
};
|
|
28
|
-
let createSwrMutationApi = (...args) => {
|
|
29
|
-
const api = createApi.createApi(...args);
|
|
30
|
-
api.use = createSwrApi.createUseApi(api);
|
|
31
|
-
["post", "put", "patch", "delete"].forEach((method) => {
|
|
32
|
-
const hookName = `use${method.charAt(0).toUpperCase() + method.slice(1)}`;
|
|
33
|
-
api[hookName] = createUseMutationApi(api, method);
|
|
34
|
-
});
|
|
35
|
-
return api;
|
|
36
|
-
};
|
|
15
|
+
let a=(t,e)=>(a,o,i)=>// config.fetcher = sender;
|
|
16
|
+
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
17
|
+
r__default["default"](// @ts-expect-error FIXME: I can't get it...
|
|
18
|
+
o?[a,o]:a,async(// if the first argument is an array the second one are the base options
|
|
19
|
+
// defined when calling the usePost/Put/etc. hook, these will be overriden
|
|
20
|
+
// by the _options just here below
|
|
21
|
+
r,// these are the options arriving when calling `trigger({ json, query, etc... })
|
|
22
|
+
a)=>{let o=Array.isArray(r)?r[0]:r,i=Array.isArray(r)?r[1]:{},{ok:p,data:s}=await t[e](o,{...i,...a.arg||{},throwErr:!0});return s},i);/**
|
|
23
|
+
* It creates an api client extended with auto-generated SWR wrapper hooks
|
|
24
|
+
*/let createSwrMutationApi=(...r)=>{let o=createApi.createApi(...r);return o.use=createSwrApi.createUseApi(o),["post","put","patch","delete"].forEach(r=>{o[`use${r.charAt(0).toUpperCase()+r.slice(1)}`]=a(o,r);}),o};
|
|
37
25
|
|
|
38
26
|
exports.createSwrMutationApi = createSwrMutationApi;
|
package/swr-mutation.esm.js
CHANGED
|
@@ -1,30 +1,18 @@
|
|
|
1
|
-
import
|
|
1
|
+
import r from 'swr/mutation';
|
|
2
2
|
import { createApi } from './createApi.esm.js';
|
|
3
3
|
import { a as createUseApi } from './createSwrApi.esm.js';
|
|
4
4
|
import '@koine/utils';
|
|
5
5
|
import 'swr';
|
|
6
6
|
|
|
7
|
-
let
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
};
|
|
18
|
-
return useSWRMutation(options ? [endpoint, options] : endpoint, sender, config);
|
|
19
|
-
};
|
|
20
|
-
let createSwrMutationApi = (...args) => {
|
|
21
|
-
const api = createApi(...args);
|
|
22
|
-
api.use = createUseApi(api);
|
|
23
|
-
["post", "put", "patch", "delete"].forEach((method) => {
|
|
24
|
-
const hookName = `use${method.charAt(0).toUpperCase() + method.slice(1)}`;
|
|
25
|
-
api[hookName] = createUseMutationApi(api, method);
|
|
26
|
-
});
|
|
27
|
-
return api;
|
|
28
|
-
};
|
|
7
|
+
let a=(t,e)=>(a,o,i)=>// config.fetcher = sender;
|
|
8
|
+
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
9
|
+
r(// @ts-expect-error FIXME: I can't get it...
|
|
10
|
+
o?[a,o]:a,async(// if the first argument is an array the second one are the base options
|
|
11
|
+
// defined when calling the usePost/Put/etc. hook, these will be overriden
|
|
12
|
+
// by the _options just here below
|
|
13
|
+
r,// these are the options arriving when calling `trigger({ json, query, etc... })
|
|
14
|
+
a)=>{let o=Array.isArray(r)?r[0]:r,i=Array.isArray(r)?r[1]:{},{ok:p,data:s}=await t[e](o,{...i,...a.arg||{},throwErr:!0});return s},i);/**
|
|
15
|
+
* It creates an api client extended with auto-generated SWR wrapper hooks
|
|
16
|
+
*/let createSwrMutationApi=(...r)=>{let o=createApi(...r);return o.use=createUseApi(o),["post","put","patch","delete"].forEach(r=>{o[`use${r.charAt(0).toUpperCase()+r.slice(1)}`]=a(o,r);}),o};
|
|
29
17
|
|
|
30
18
|
export { createSwrMutationApi };
|