@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 CHANGED
@@ -2,13 +2,13 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- class ApiError extends Error {
6
- constructor(result) {
7
- super(`Request failed with ${result.status} ${result.msg}`);
8
- this.name = "ApiError";
9
- Object.assign(this, result);
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
- class ApiError extends Error {
2
- constructor(result) {
3
- super(`Request failed with ${result.status} ${result.msg}`);
4
- this.name = "ApiError";
5
- Object.assign(this, result);
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 apiMethods = [
8
- "get",
9
- "post",
10
- "put",
11
- "patch",
12
- "delete",
13
- ];
14
- let createApi = (apiName, baseUrl, options) => {
15
- const { headers: headersBase = {}, request: requestBase = {}, throwErr: throwErrBase, timeout: timeoutBase = 10000, processReq: processReqBase, processRes: processResBase, processErr: processErrBase, } = options || {};
16
- return apiMethods.reduce((api, method) => {
17
- api[method] = async (endpoint, options) => {
18
- const { request = requestBase, headers = headersBase, timeout = timeoutBase, processReq, processRes = processResBase, processErr = processErrBase, throwErr = throwErrBase, } = options || {};
19
- let { params, json, query } = options || {};
20
- let url = `${baseUrl}/${endpoint + "".replace(/^\/*/, "")}`;
21
- let requestInit = {
22
- method: method.toUpperCase(),
23
- ...request,
24
- headers: {
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 apiMethods = [
4
- "get",
5
- "post",
6
- "put",
7
- "patch",
8
- "delete",
9
- ];
10
- let createApi = (apiName, baseUrl, options) => {
11
- const { headers: headersBase = {}, request: requestBase = {}, throwErr: throwErrBase, timeout: timeoutBase = 10000, processReq: processReqBase, processRes: processResBase, processErr: processErrBase, } = options || {};
12
- return apiMethods.reduce((api, method) => {
13
- api[method] = async (endpoint, options) => {
14
- const { request = requestBase, headers = headersBase, timeout = timeoutBase, processReq, processRes = processResBase, processErr = processErrBase, throwErr = throwErrBase, } = options || {};
15
- let { params, json, query } = options || {};
16
- let url = `${baseUrl}/${endpoint + "".replace(/^\/*/, "")}`;
17
- let requestInit = {
18
- method: method.toUpperCase(),
19
- ...request,
20
- headers: {
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 = (data = {}, msg) => ({
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 = (data = {}, msg) => ({
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 };
@@ -2,13 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- let createApiResultOk = (data = {}, msg) => ({
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;
@@ -1,9 +1,3 @@
1
- let createApiResultOk = (data = {}, msg) => ({
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 };
@@ -1,30 +1,52 @@
1
1
  'use strict';
2
2
 
3
- var useSWR = require('swr');
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 useSWR__default = /*#__PURE__*/_interopDefaultLegacy(useSWR);
9
+ var e__default = /*#__PURE__*/_interopDefaultLegacy(e);
10
10
 
11
- let createUseApi = (api) => (endpoint, options, config) => {
12
- const fetcher = async () => {
13
- const { data } = await api.get(endpoint, {
14
- ...(options || {}),
15
- throwErr: true,
16
- });
17
- return data;
18
- };
19
- const shouldNotFetch = config?.when === false ||
20
- (utils.isFunction(config?.when) && config?.when() === false);
21
- return useSWR__default["default"](shouldNotFetch ? null : options ? [endpoint, options] : [endpoint], fetcher, config);
22
- };
23
- let createSwrApi = (...args) => {
24
- const api = createApi.createApi(...args);
25
- api.use = createUseApi(api);
26
- return api;
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;
@@ -1,23 +1,45 @@
1
- import useSWR from 'swr';
1
+ import e from 'swr';
2
2
  import { isFunction } from '@koine/utils';
3
3
  import { createApi } from './createApi.esm.js';
4
4
 
5
- let createUseApi = (api) => (endpoint, options, config) => {
6
- const fetcher = async () => {
7
- const { data } = await api.get(endpoint, {
8
- ...(options || {}),
9
- throwErr: true,
10
- });
11
- return data;
12
- };
13
- const shouldNotFetch = config?.when === false ||
14
- (isFunction(config?.when) && config?.when() === false);
15
- return useSWR(shouldNotFetch ? null : options ? [endpoint, options] : [endpoint], fetcher, config);
16
- };
17
- let createSwrApi = (...args) => {
18
- const api = createApi(...args);
19
- api.use = createUseApi(api);
20
- return api;
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 = (nextRes) => ({
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 = (nextRes) => ({
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.80"
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.80"
64
+ "version": "2.0.0-beta.83"
65
65
  }
@@ -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: <TEndpoint extends Extract<keyof TEndpoints, string>>(endpoint: TEndpoint, options?: Api.EndpointOptions<TEndpoints, TEndpoint, "get"> | undefined, config?: SWRConfigurationExtended<Api.GetDataType<TEndpoints, TEndpoint, "get", "ok">, Api.GetDataType<TEndpoints, TEndpoint, "get", "fail">, BareFetcher<any>> | undefined) => SWRResponse<Api.GetDataType<TEndpoints, TEndpoint, "get", "ok">, Api.GetDataType<TEndpoints, TEndpoint, "get", "fail">, any>;
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 { createUseApi } from "../swr/createSwrApi";
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: <TEndpoint extends Extract<keyof TEndpoints, string>>(endpoint: TEndpoint, options?: Api.EndpointOptions<TEndpoints, TEndpoint, "get"> | undefined, config?: (Partial<import("swr/dist/_internal").PublicConfiguration<Api.GetDataType<TEndpoints, TEndpoint, "get", "ok">, Api.GetDataType<TEndpoints, TEndpoint, "get", "fail">, import("swr/dist/_internal").BareFetcher<any>>> & Partial<import("swr/dist/_internal").ProviderConfiguration> & {
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;
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var useSWRMutation = require('swr/mutation');
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 useSWRMutation__default = /*#__PURE__*/_interopDefaultLegacy(useSWRMutation);
13
+ var r__default = /*#__PURE__*/_interopDefaultLegacy(r);
14
14
 
15
- let createUseMutationApi = (api, method) => (endpoint, options, config) => {
16
- const sender = async (_endpoint, _options) => {
17
- const endpoint = Array.isArray(_endpoint) ? _endpoint[0] : _endpoint;
18
- const options = Array.isArray(_endpoint) ? _endpoint[1] : {};
19
- const { ok, data } = await api[method](endpoint, {
20
- ...options,
21
- ...(_options.arg || {}),
22
- throwErr: true,
23
- });
24
- return ok ? data : data;
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;
@@ -1,30 +1,18 @@
1
- import useSWRMutation from 'swr/mutation';
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 createUseMutationApi = (api, method) => (endpoint, options, config) => {
8
- const sender = async (_endpoint, _options) => {
9
- const endpoint = Array.isArray(_endpoint) ? _endpoint[0] : _endpoint;
10
- const options = Array.isArray(_endpoint) ? _endpoint[1] : {};
11
- const { ok, data } = await api[method](endpoint, {
12
- ...options,
13
- ...(_options.arg || {}),
14
- throwErr: true,
15
- });
16
- return ok ? data : data;
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 };