@koine/api 2.0.0-beta.133 → 2.0.0-beta.135

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,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
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);}}
5
+ class ApiError extends Error{constructor(r){super(`Request failed with ${r.status} ${r.msg}`),this.name="ApiError",Object.assign(this,r);}}
12
6
 
13
7
  exports.ApiError = ApiError;
14
8
  exports.default = ApiError;
package/ApiError.esm.js CHANGED
@@ -1,9 +1,3 @@
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);}}
1
+ class ApiError extends Error{constructor(r){super(`Request failed with ${r.status} ${r.msg}`),this.name="ApiError",Object.assign(this,r);}}
8
2
 
9
3
  export { ApiError, ApiError as default };
package/createApi.cjs.js CHANGED
@@ -4,24 +4,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var utils = require('@koine/utils');
6
6
 
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:b=c,processReq:g,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(g){let e=g(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)// TODO: not the greatest assertion...
14
- q=q.replace(`{${e}}`,A[e]);let x=Number(b);C&&(v.body=JSON.stringify(C)),x>0&&(// TODO: combine multiple abort signals
15
- // @see https://dev.to/rashidshamloo/adding-timeout-and-multiple-abort-signals-to-fetch-typescriptreact-33bb
16
- $=new AbortController,m=setTimeout(()=>$.abort(),x),v.signal=$.signal),j&&// FIXME: ts-expect-error this assertion is not the best, but nevermind for now
17
- (q+=utils.buildUrlQueryString(j));let O=null,R=null,T="";try{O=await fetch(q,v);}catch(e){T=utils.errorToString(e);}if(m&&clearTimeout(m),O)try{R=E?await E(O,h||{}):await O.json();}catch(e){T=utils.errorToString(e);}if(null===R&&(R=N?await N(T,h||{}):// this error should only happen on network errors or wrong API urls
18
- // there is no specific HTTP error for this, we can consider these
19
- // two statuses though:
20
- // - [100 Continue](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/100)
21
- // - [501 Not Implemented](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/501)
22
- {data:null,msg:T,status:100,fail:!0,ok:!1}),k&&R?.fail)// throw new ApiError<Failed>(result);
23
- // I prefer to throw an object literal despite what eslint says
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),{})};
7
+ let o=["get","post","put","patch","delete"];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)=>(o[i]=async(o,h)=>{let $,m;let{request:w=n,headers:y=s,timeout:b=c,processReq:g,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(g){let e=g(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]);let x=Number(b);C&&(v.body=JSON.stringify(C)),x>0&&($=new AbortController,m=setTimeout(()=>$.abort(),x),v.signal=$.signal),j&&(q+=utils.buildUrlQueryString(j));let O=null,R=null,T="";try{O=await fetch(q,v);}catch(e){T=utils.errorToString(e);}if(m&&clearTimeout(m),O)try{R=E?await E(O,h||{}):await O.json();}catch(e){T=utils.errorToString(e);}if(null===R&&(R=N?await N(T,h||{}):{data:null,msg:T,status:100,fail:!0,ok:!1}),k&&R?.fail)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),{})};
25
8
 
26
9
  exports.createApi = createApi;
27
10
  exports.default = createApi;
package/createApi.esm.js CHANGED
@@ -1,22 +1,5 @@
1
1
  import { isFullObject, buildUrlQueryString, errorToString } from '@koine/utils';
2
2
 
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:b=c,processReq:g,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(g){let e=g(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)// TODO: not the greatest assertion...
10
- q=q.replace(`{${e}}`,A[e]);let x=Number(b);C&&(v.body=JSON.stringify(C)),x>0&&(// TODO: combine multiple abort signals
11
- // @see https://dev.to/rashidshamloo/adding-timeout-and-multiple-abort-signals-to-fetch-typescriptreact-33bb
12
- $=new AbortController,m=setTimeout(()=>$.abort(),x),v.signal=$.signal),j&&// FIXME: ts-expect-error this assertion is not the best, but nevermind for now
13
- (q+=buildUrlQueryString(j));let O=null,R=null,T="";try{O=await fetch(q,v);}catch(e){T=errorToString(e);}if(m&&clearTimeout(m),O)try{R=E?await E(O,h||{}):await O.json();}catch(e){T=errorToString(e);}if(null===R&&(R=N?await N(T,h||{}):// this error should only happen on network errors or wrong API urls
14
- // there is no specific HTTP error for this, we can consider these
15
- // two statuses though:
16
- // - [100 Continue](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/100)
17
- // - [501 Not Implemented](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/501)
18
- {data:null,msg:T,status:100,fail:!0,ok:!1}),k&&R?.fail)// throw new ApiError<Failed>(result);
19
- // I prefer to throw an object literal despite what eslint says
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),{})};
3
+ let o=["get","post","put","patch","delete"];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)=>(o[i]=async(o,h)=>{let $,m;let{request:w=n,headers:y=s,timeout:b=c,processReq:g,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(g){let e=g(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]);let x=Number(b);C&&(v.body=JSON.stringify(C)),x>0&&($=new AbortController,m=setTimeout(()=>$.abort(),x),v.signal=$.signal),j&&(q+=buildUrlQueryString(j));let O=null,R=null,T="";try{O=await fetch(q,v);}catch(e){T=errorToString(e);}if(m&&clearTimeout(m),O)try{R=E?await E(O,h||{}):await O.json();}catch(e){T=errorToString(e);}if(null===R&&(R=N?await N(T,h||{}):{data:null,msg:T,status:100,fail:!0,ok:!1}),k&&R?.fail)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),{})};
21
4
 
22
5
  export { createApi, createApi as default };
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.133"
5
+ "@koine/utils": "2.0.0-beta.135"
6
6
  },
7
7
  "exports": {
8
8
  "./swr/createSwrApi": {
@@ -88,5 +88,5 @@
88
88
  "module": "./index.esm.js",
89
89
  "main": "./index.cjs.js",
90
90
  "types": "./index.esm.d.ts",
91
- "version": "2.0.0-beta.133"
91
+ "version": "2.0.0-beta.135"
92
92
  }
@@ -6,42 +6,7 @@ var e = require('swr');
6
6
  var utils = require('@koine/utils');
7
7
  var createApi = require('../createApi.cjs.js');
8
8
 
9
- /**
10
- * Conditional fetching as option
11
- *
12
- * Moving this to an option allows us to keep the endpoints typed dictionary,
13
- * e.g. we can write:
14
- *
15
- * ```js
16
- * const { data, mutate } = myApi.use("User/{id}",
17
- * { params: { id: aVariableMaybeContainingAnId || "" }, },
18
- * { when: !!aVariableMaybeContainingAnId }
19
- * );
20
- *
21
- * // we still have typed `data`, `mutate`
22
- * ```
23
- * @see https://swr.vercel.app/docs/conditional-fetching
24
- *//**
25
- * @private
26
- */let createUseApi=t=>(i,o,p)=>{// const fetcher = async (_endpoint: TEndpoint) => {
27
- // try {
28
- // const { ok, data } = await api.get(_endpoint, {
29
- // ...(options || {}),
30
- // throwErr: true,
31
- // });
32
- // if (ok) {
33
- // return data;
34
- // }
35
- // throw new Error() as unknown as Api.EndpointResponseFail<TEndpoints, TEndpoint, TMethod>;
36
- // } catch(e) {
37
- // throw new Error() as unknown as Api.EndpointResponseFail<TEndpoints, TEndpoint, TMethod>;;
38
- // }
39
- // };
40
- // }
41
- 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>;
42
- return e(p?.when===!1||utils.isFunction(p?.when)&&p?.when()===!1?null:o?[i,o]:[i],a,p)};/**
43
- * It creates an api client extended with auto-generated SWR wrapper hooks
44
- */let createSwrApi=(...e)=>{let r=createApi.createApi(...e);return r.use=createUseApi(r),r};
9
+ let createUseApi=t=>(i,o,p)=>{let a=async()=>{let{data:e}=await t.get(i,{...o||{},throwErr:!0});return e};return e(p?.when===!1||utils.isFunction(p?.when)&&p?.when()===!1?null:o?[i,o]:[i],a,p)};let createSwrApi=(...e)=>{let r=createApi.createApi(...e);return r.use=createUseApi(r),r};
45
10
 
46
11
  exports.createSwrApi = createSwrApi;
47
12
  exports.createUseApi = createUseApi;
@@ -2,41 +2,6 @@ import e from 'swr';
2
2
  import { isFunction } from '@koine/utils';
3
3
  import { createApi } from '../createApi.esm.js';
4
4
 
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
- */let createUseApi=t=>(i,o,p)=>{// const fetcher = async (_endpoint: TEndpoint) => {
23
- // try {
24
- // const { ok, data } = await api.get(_endpoint, {
25
- // ...(options || {}),
26
- // throwErr: true,
27
- // });
28
- // if (ok) {
29
- // return data;
30
- // }
31
- // throw new Error() as unknown as Api.EndpointResponseFail<TEndpoints, TEndpoint, TMethod>;
32
- // } catch(e) {
33
- // throw new Error() as unknown as Api.EndpointResponseFail<TEndpoints, TEndpoint, TMethod>;;
34
- // }
35
- // };
36
- // }
37
- 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>;
38
- return e(p?.when===!1||isFunction(p?.when)&&p?.when()===!1?null:o?[i,o]:[i],a,p)};/**
39
- * It creates an api client extended with auto-generated SWR wrapper hooks
40
- */let createSwrApi=(...e)=>{let r=createApi(...e);return r.use=createUseApi(r),r};
5
+ let createUseApi=t=>(i,o,p)=>{let a=async()=>{let{data:e}=await t.get(i,{...o||{},throwErr:!0});return e};return e(p?.when===!1||isFunction(p?.when)&&p?.when()===!1?null:o?[i,o]:[i],a,p)};let createSwrApi=(...e)=>{let r=createApi(...e);return r.use=createUseApi(r),r};
41
6
 
42
7
  export { createSwrApi, createUseApi, createSwrApi as default };
@@ -6,15 +6,7 @@ var r = require('swr/mutation');
6
6
  var createApi = require('../createApi.cjs.js');
7
7
  var createSwrApi = require('../swr/createSwrApi.cjs.js');
8
8
 
9
- let a=(t,e)=>(a,o,i)=>// config.fetcher = sender;
10
- r(// @ts-expect-error FIXME: I can't get it...
11
- o?[a,o]:a,async(// if the first argument is an array the second one are the base options
12
- // defined when calling the usePost/Put/etc. hook, these will be overriden
13
- // by the _options just here below
14
- r,// these are the options arriving when calling `trigger({ json, query, etc... })
15
- 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);/**
16
- * It creates an api client extended with auto-generated SWR wrapper hooks
17
- */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};
9
+ let a=(t,e)=>(a,o,i)=>r(o?[a,o]:a,async(r,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);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};
18
10
 
19
11
  exports.createSwrMutationApi = createSwrMutationApi;
20
12
  exports.default = createSwrMutationApi;
@@ -2,14 +2,6 @@ import r from 'swr/mutation';
2
2
  import { createApi } from '../createApi.esm.js';
3
3
  import { createUseApi } from '../swr/createSwrApi.esm.js';
4
4
 
5
- let a=(t,e)=>(a,o,i)=>// config.fetcher = sender;
6
- r(// @ts-expect-error FIXME: I can't get it...
7
- o?[a,o]:a,async(// if the first argument is an array the second one are the base options
8
- // defined when calling the usePost/Put/etc. hook, these will be overriden
9
- // by the _options just here below
10
- r,// these are the options arriving when calling `trigger({ json, query, etc... })
11
- 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);/**
12
- * It creates an api client extended with auto-generated SWR wrapper hooks
13
- */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};
5
+ let a=(t,e)=>(a,o,i)=>r(o?[a,o]:a,async(r,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);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};
14
6
 
15
7
  export { createSwrMutationApi, createSwrMutationApi as default };