@koine/api 2.0.0-beta.7 → 2.0.0-beta.71
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/index.cjs.d.ts +1 -0
- package/index.cjs.default.js +1 -0
- package/index.cjs.js +12 -0
- package/index.cjs.mjs +2 -0
- package/index.d.ts +8 -4
- package/index.esm.js +5 -0
- package/next.cjs.d.ts +1 -0
- package/next.cjs.default.js +1 -0
- package/next.cjs.js +12 -0
- package/next.cjs.mjs +2 -0
- package/next.d.ts +10 -0
- package/next.esm.js +7 -0
- package/package.json +33 -8
- package/swr-mutation.cjs.d.ts +1 -0
- package/swr-mutation.cjs.default.js +1 -0
- package/swr-mutation.cjs.js +17 -0
- package/swr-mutation.cjs.mjs +2 -0
- package/swr-mutation.d.ts +17 -0
- package/swr-mutation.esm.js +9 -0
- package/swr.cjs.d.ts +1 -0
- package/swr.cjs.default.js +1 -0
- package/swr.cjs.js +16 -0
- package/swr.cjs.mjs +2 -0
- package/swr.d.ts +10 -0
- package/swr.esm.js +7 -0
- package/types.d.ts +126 -0
- package/typings.d.ts +11 -508
- package/ApiError.d.ts +0 -11
- package/ApiError.js +0 -32
- package/ApiError.mjs +0 -14
- package/createApi.d.ts +0 -8
- package/createApi.js +0 -142
- package/createApi.mjs +0 -128
- package/createSwrApi.d.ts +0 -34
- package/createSwrApi.js +0 -99
- package/createSwrApi.mjs +0 -82
- package/index.js +0 -28
- package/index.mjs +0 -4
- package/nextApiResponse.d.ts +0 -3
- package/nextApiResponse.js +0 -23
- package/nextApiResponse.mjs +0 -5
package/index.cjs.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./index";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
exports._default = require('./index.cjs.js').default;
|
package/index.cjs.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var utils = require('@koine/utils');
|
|
6
|
+
|
|
7
|
+
class ApiError extends Error{constructor(e){super(`Request failed with ${e.status} ${e.msg}`),this.name="ApiError",Object.assign(this,e);}}let createApiResultOk=(e={},t)=>({ok:!0,fail:!1,data:e,msg:t||"",status:200});let createApiResultFail=(e={},t,r)=>({fail:!0,data:e,msg:t||"",status:r||404});let s=["get","post","put","patch","delete"];let createApi=(o,a,l)=>{let{headers:i={},request:n={},throwErr:p,timeout:c=1e4,processReq:u,processRes:f,processErr:h}=l||{};return s.reduce((s,l)=>(s[l]=async(s,m)=>{let $,d;let{request:g=n,headers:w=i,timeout:E=c,processReq:y,processRes:A=f,processErr:b=h,throwErr:k=p}=m||{},{params:x,json:R,query:N}=m||{},O=`${a}/${s+"".replace(/^\/*/,"")}`,j={method:l.toUpperCase(),...g,headers:{"content-type":"application/json",...w}};if(u){let e=u(l,O,N,R,x,j);O=e[0],N=e[1],R=e[2],x=e[3],j=e[4];}if(y){let e=y(l,O,N,R,x,j);O=e[0],N=e[1],R=e[2],x=e[3],j=e[4];}if(utils.isFullObject(x))for(let e in x)O=O.replace(`{${e}}`,x[e].toString());let q=Number(E);R&&(j.body=JSON.stringify(R)),q>0&&($=new AbortController,d=setTimeout(()=>$.abort(),q),j.signal=$.signal),N&&(O+=utils.buildUrlQueryString(N));let C=null,v=null,S="";try{C=await fetch(O,j);}catch(e){S=utils.errorToString(e);}if(d&&clearTimeout(d),C)try{v=A?await A(C,m||{}):await C.json();}catch(e){S=utils.errorToString(e);}if(null===v&&(v=b?await b(S,m||{}):{data:null,msg:S,status:100,fail:!0,ok:!1}),k&&v?.fail)throw v;if("development"===process.env.NODE_ENV){let e=`${v?.status}: api[${o}] ${l.toUpperCase()} ${O}`;v?.ok?console.info(`🟢 ${e}`):console.info(`🔴 ${e}`);}return v},s),{})};
|
|
8
|
+
|
|
9
|
+
exports.ApiError = ApiError;
|
|
10
|
+
exports.createApi = createApi;
|
|
11
|
+
exports.createApiResultFail = createApiResultFail;
|
|
12
|
+
exports.createApiResultOk = createApiResultOk;
|
package/index.cjs.mjs
ADDED
package/index.d.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
export
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import type { Api } from "./types";
|
|
2
|
+
export declare class ApiError<TResponseFail extends Api.ResponseFail = unknown> extends Error {
|
|
3
|
+
constructor(result: Api.ResultFail<TResponseFail>);
|
|
4
|
+
}
|
|
5
|
+
export declare let createApiResultOk: <T>(data?: T, msg?: string) => Api.ResultOk<T>;
|
|
6
|
+
export declare let createApiResultFail: <T>(data?: T, msg?: string, status?: number) => Api.ResultFail<T>;
|
|
7
|
+
export declare let createApi: <TEndpoints extends Api.Endpoints>(apiName: string, baseUrl: string, options?: Api.ClientOptions) => Api.Client<TEndpoints>;
|
|
8
|
+
export type { Api } from "./types";
|
package/index.esm.js
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { isFullObject, buildUrlQueryString, errorToString } from '@koine/utils';
|
|
2
|
+
|
|
3
|
+
class ApiError extends Error{constructor(e){super(`Request failed with ${e.status} ${e.msg}`),this.name="ApiError",Object.assign(this,e);}}let createApiResultOk=(e={},t)=>({ok:!0,fail:!1,data:e,msg:t||"",status:200});let createApiResultFail=(e={},t,r)=>({fail:!0,data:e,msg:t||"",status:r||404});let s=["get","post","put","patch","delete"];let createApi=(o,a,l)=>{let{headers:i={},request:n={},throwErr:p,timeout:c=1e4,processReq:u,processRes:f,processErr:h}=l||{};return s.reduce((s,l)=>(s[l]=async(s,m)=>{let $,d;let{request:g=n,headers:w=i,timeout:E=c,processReq:y,processRes:A=f,processErr:b=h,throwErr:k=p}=m||{},{params:x,json:R,query:N}=m||{},O=`${a}/${s+"".replace(/^\/*/,"")}`,j={method:l.toUpperCase(),...g,headers:{"content-type":"application/json",...w}};if(u){let e=u(l,O,N,R,x,j);O=e[0],N=e[1],R=e[2],x=e[3],j=e[4];}if(y){let e=y(l,O,N,R,x,j);O=e[0],N=e[1],R=e[2],x=e[3],j=e[4];}if(isFullObject(x))for(let e in x)O=O.replace(`{${e}}`,x[e].toString());let q=Number(E);R&&(j.body=JSON.stringify(R)),q>0&&($=new AbortController,d=setTimeout(()=>$.abort(),q),j.signal=$.signal),N&&(O+=buildUrlQueryString(N));let C=null,v=null,S="";try{C=await fetch(O,j);}catch(e){S=errorToString(e);}if(d&&clearTimeout(d),C)try{v=A?await A(C,m||{}):await C.json();}catch(e){S=errorToString(e);}if(null===v&&(v=b?await b(S,m||{}):{data:null,msg:S,status:100,fail:!0,ok:!1}),k&&v?.fail)throw v;if("development"===process.env.NODE_ENV){let e=`${v?.status}: api[${o}] ${l.toUpperCase()} ${O}`;v?.ok?console.info(`🟢 ${e}`):console.info(`🔴 ${e}`);}return v},s),{})};
|
|
4
|
+
|
|
5
|
+
export { ApiError, createApi, createApiResultFail, createApiResultOk };
|
package/next.cjs.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./next";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
exports._default = require('./next.cjs.js').default;
|
package/next.cjs.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var server = require('next/server');
|
|
6
|
+
var index = require('./index.cjs.js');
|
|
7
|
+
require('@koine/utils');
|
|
8
|
+
|
|
9
|
+
let nextApiResponse={ok:(o,t)=>server.NextResponse.json(index.createApiResultOk(o,t)),fail:(s,t,n)=>server.NextResponse.json(index.createApiResultFail(s,t,n))};let nextApiResponse12=e=>({ok(o,t){e.status(200).json(index.createApiResultOk(o,t));},fail(s,t,n){e.status(n||404).json(index.createApiResultFail(s,t,n));}});
|
|
10
|
+
|
|
11
|
+
exports.nextApiResponse = nextApiResponse;
|
|
12
|
+
exports.nextApiResponse12 = nextApiResponse12;
|
package/next.cjs.mjs
ADDED
package/next.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { NextApiResponse } from "next";
|
|
2
|
+
import { NextResponse } from "next/server";
|
|
3
|
+
export declare let nextApiResponse: {
|
|
4
|
+
ok<T>(data: T, msg?: string): NextResponse<import("./types").Api.ResultOk<T>>;
|
|
5
|
+
fail<T_1>(data: T_1, msg?: string, status?: number): NextResponse<import("./types").Api.ResultFail<T_1>>;
|
|
6
|
+
};
|
|
7
|
+
export declare let nextApiResponse12: (nextRes: NextApiResponse) => {
|
|
8
|
+
ok<T>(data: T, msg?: string): void;
|
|
9
|
+
fail<T_1>(data: T_1, msg?: string, status?: number): void;
|
|
10
|
+
};
|
package/next.esm.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { NextResponse } from 'next/server';
|
|
2
|
+
import { createApiResultOk, createApiResultFail } from './index.esm.js';
|
|
3
|
+
import '@koine/utils';
|
|
4
|
+
|
|
5
|
+
let nextApiResponse={ok:(o,t)=>NextResponse.json(createApiResultOk(o,t)),fail:(s,t,n)=>NextResponse.json(createApiResultFail(s,t,n))};let nextApiResponse12=e=>({ok(o,t){e.status(200).json(createApiResultOk(o,t));},fail(s,t,n){e.status(n||404).json(createApiResultFail(s,t,n));}});
|
|
6
|
+
|
|
7
|
+
export { nextApiResponse, nextApiResponse12 };
|
package/package.json
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@koine/api",
|
|
3
3
|
"sideEffects": false,
|
|
4
|
+
"dependencies": {
|
|
5
|
+
"@koine/utils": "2.0.0-beta.71"
|
|
6
|
+
},
|
|
7
|
+
"peerDependencies": {
|
|
8
|
+
"next": "^14.0.4",
|
|
9
|
+
"swr": "^2.2.4"
|
|
10
|
+
},
|
|
4
11
|
"peerDependenciesMeta": {
|
|
5
12
|
"next": {
|
|
6
13
|
"optional": true
|
|
@@ -9,12 +16,30 @@
|
|
|
9
16
|
"optional": true
|
|
10
17
|
}
|
|
11
18
|
},
|
|
12
|
-
"
|
|
13
|
-
"
|
|
19
|
+
"exports": {
|
|
20
|
+
"./package.json": "./package.json",
|
|
21
|
+
".": {
|
|
22
|
+
"module": "./index.esm.js",
|
|
23
|
+
"import": "./index.cjs.mjs",
|
|
24
|
+
"default": "./index.cjs.js"
|
|
25
|
+
},
|
|
26
|
+
"./next": {
|
|
27
|
+
"module": "./next.esm.js",
|
|
28
|
+
"import": "./next.cjs.mjs",
|
|
29
|
+
"default": "./next.cjs.js"
|
|
30
|
+
},
|
|
31
|
+
"./swr-mutation": {
|
|
32
|
+
"module": "./swr-mutation.esm.js",
|
|
33
|
+
"import": "./swr-mutation.cjs.mjs",
|
|
34
|
+
"default": "./swr-mutation.cjs.js"
|
|
35
|
+
},
|
|
36
|
+
"./swr": {
|
|
37
|
+
"module": "./swr.esm.js",
|
|
38
|
+
"import": "./swr.cjs.mjs",
|
|
39
|
+
"default": "./swr.cjs.js"
|
|
40
|
+
}
|
|
14
41
|
},
|
|
15
|
-
"module": "./index.
|
|
16
|
-
"main": "./index.js",
|
|
17
|
-
"
|
|
18
|
-
|
|
19
|
-
"version": "2.0.0-beta.7"
|
|
20
|
-
}
|
|
42
|
+
"module": "./index.esm.js",
|
|
43
|
+
"main": "./index.cjs.js",
|
|
44
|
+
"version": "2.0.0-beta.71"
|
|
45
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./swr-mutation";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
exports._default = require('./swr-mutation.cjs.js').default;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var r = require('swr/mutation');
|
|
6
|
+
var index = require('./index.cjs.js');
|
|
7
|
+
var swr = require('./swr.cjs.js');
|
|
8
|
+
require('@koine/utils');
|
|
9
|
+
require('swr');
|
|
10
|
+
|
|
11
|
+
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
12
|
+
|
|
13
|
+
var r__default = /*#__PURE__*/_interopDefaultLegacy(r);
|
|
14
|
+
|
|
15
|
+
let a=(t,e)=>(a,o,i)=>r__default["default"](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=index.createApi(...r);return o.use=swr.createUseApi(o),["post","put","patch","delete"].forEach(r=>{o[`use${r.charAt(0).toUpperCase()+r.slice(1)}`]=a(o,r);}),o};
|
|
16
|
+
|
|
17
|
+
exports.createSwrMutationApi = createSwrMutationApi;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type SWRMutationConfiguration, type SWRMutationResponse } from "swr/mutation";
|
|
2
|
+
import { createUseApi } from "./swr";
|
|
3
|
+
import type { Api } from "./types";
|
|
4
|
+
type MutationRequestMethod = Exclude<Api.RequestMethod, "get">;
|
|
5
|
+
type MutationHookName = Exclude<keyof Api.HooksMapsByName, "use">;
|
|
6
|
+
type KoineApiMethodHookSWR<THookName extends MutationHookName, TEndpoints extends Api.Endpoints> = <TEndpoint extends Api.EndpointUrl<TEndpoints>, TMethod extends MutationRequestMethod = Api.HooksMapsByName[THookName]>(endpoint: TEndpoint, options?: Api.EndpointOptions<TEndpoints, TEndpoint, TMethod>, config?: SWRMutationConfiguration<Api.EndpointResponseOk<TEndpoints, TEndpoint, TMethod>, Api.EndpointResponseFail<TEndpoints, TEndpoint, TMethod>, TEndpoint, Api.EndpointOptions<TEndpoints, TEndpoint, TMethod>>) => SWRMutationResponse<Api.EndpointResponseOk<TEndpoints, TEndpoint, TMethod>, Api.EndpointResponseFail<TEndpoints, TEndpoint, TMethod>, TEndpoint, Api.EndpointOptions<TEndpoints, TEndpoint, TMethod>>;
|
|
7
|
+
export declare let createSwrMutationApi: <TEndpoints extends Api.Endpoints>(apiName: string, baseUrl: string, options?: Api.ClientOptions | undefined) => Api.Client<TEndpoints> & {
|
|
8
|
+
usePost: KoineApiMethodHookSWR<"usePost", TEndpoints>;
|
|
9
|
+
usePut: KoineApiMethodHookSWR<"usePut", TEndpoints>;
|
|
10
|
+
usePatch: KoineApiMethodHookSWR<"usePatch", TEndpoints>;
|
|
11
|
+
useDelete: KoineApiMethodHookSWR<"useDelete", TEndpoints>;
|
|
12
|
+
} & {
|
|
13
|
+
use: <TEndpoint extends Extract<keyof TEndpoints, string>>(endpoint: TEndpoint, options?: Api.EndpointOptions<TEndpoints, TEndpoint, "get"> | undefined, config?: (Partial<import("swr/_internal").PublicConfiguration<Api.EndpointResponseOk<TEndpoints, TEndpoint, "get">, Api.EndpointResponseFail<TEndpoints, TEndpoint, "get">, import("swr/_internal").BareFetcher<any>>> & {
|
|
14
|
+
when?: boolean | (() => boolean) | undefined;
|
|
15
|
+
}) | undefined) => import("swr/_internal").SWRResponse<Api.EndpointResponseOk<TEndpoints, TEndpoint, "get">, Api.EndpointResponseFail<TEndpoints, TEndpoint, "get">, any>;
|
|
16
|
+
};
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import r from 'swr/mutation';
|
|
2
|
+
import { createApi } from './index.esm.js';
|
|
3
|
+
import { createUseApi } from './swr.esm.js';
|
|
4
|
+
import '@koine/utils';
|
|
5
|
+
import 'swr';
|
|
6
|
+
|
|
7
|
+
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};
|
|
8
|
+
|
|
9
|
+
export { createSwrMutationApi };
|
package/swr.cjs.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./swr";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
exports._default = require('./swr.cjs.js').default;
|
package/swr.cjs.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var e = require('swr');
|
|
6
|
+
var utils = require('@koine/utils');
|
|
7
|
+
var index = require('./index.cjs.js');
|
|
8
|
+
|
|
9
|
+
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
10
|
+
|
|
11
|
+
var e__default = /*#__PURE__*/_interopDefaultLegacy(e);
|
|
12
|
+
|
|
13
|
+
let createUseApi=t=>(i,n,o)=>{let l=async()=>{let{data:e}=await t.get(i,{...n||{},throwErr:!0});return e};return e__default["default"](o?.when===!1||utils.isFunction(o?.when)&&o?.when()===!1?null:n?[i,n]:[i],l,o)};let createSwrApi=(...e)=>{let r=index.createApi(...e);return r.use=createUseApi(r),r};
|
|
14
|
+
|
|
15
|
+
exports.createSwrApi = createSwrApi;
|
|
16
|
+
exports.createUseApi = createUseApi;
|
package/swr.cjs.mjs
ADDED
package/swr.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type BareFetcher, type SWRConfiguration, type SWRResponse } from "swr";
|
|
2
|
+
import type { Api } from "./types";
|
|
3
|
+
type SWRConfigurationExtended<Data = any, Error = any, Fn extends BareFetcher<any> = BareFetcher<any>> = SWRConfiguration<Data, Error, Fn> & {
|
|
4
|
+
when?: boolean | (() => boolean);
|
|
5
|
+
};
|
|
6
|
+
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"> | undefined, config?: SWRConfigurationExtended<Api.EndpointResponseOk<TEndpoints, TEndpoint, "get">, Api.EndpointResponseFail<TEndpoints, TEndpoint, "get">, BareFetcher<any>> | undefined) => SWRResponse<Api.EndpointResponseOk<TEndpoints, TEndpoint, "get">, Api.EndpointResponseFail<TEndpoints, TEndpoint, "get">, any>;
|
|
7
|
+
export declare let createSwrApi: <TEndpoints extends Api.Endpoints>(apiName: string, baseUrl: string, options?: Api.ClientOptions | undefined) => Api.Client<TEndpoints> & {
|
|
8
|
+
use: <TEndpoint extends Extract<keyof TEndpoints, string>>(endpoint: TEndpoint, options?: Api.EndpointOptions<TEndpoints, TEndpoint, "get"> | undefined, config?: SWRConfigurationExtended<Api.EndpointResponseOk<TEndpoints, TEndpoint, "get">, Api.EndpointResponseFail<TEndpoints, TEndpoint, "get">, BareFetcher<any>> | undefined) => SWRResponse<Api.EndpointResponseOk<TEndpoints, TEndpoint, "get">, Api.EndpointResponseFail<TEndpoints, TEndpoint, "get">, any>;
|
|
9
|
+
};
|
|
10
|
+
export {};
|
package/swr.esm.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import e from 'swr';
|
|
2
|
+
import { isFunction } from '@koine/utils';
|
|
3
|
+
import { createApi } from './index.esm.js';
|
|
4
|
+
|
|
5
|
+
let createUseApi=t=>(i,n,o)=>{let l=async()=>{let{data:e}=await t.get(i,{...n||{},throwErr:!0});return e};return e(o?.when===!1||isFunction(o?.when)&&o?.when()===!1?null:n?[i,n]:[i],l,o)};let createSwrApi=(...e)=>{let r=createApi(...e);return r.use=createUseApi(r),r};
|
|
6
|
+
|
|
7
|
+
export { createSwrApi, createUseApi };
|
package/types.d.ts
ADDED
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
type _Response = Response;
|
|
2
|
+
type ExtractEndpointParams<T extends string> = string extends T ? Record<string, string> : T extends `${infer _Start}{${infer Param}}${infer Rest}` ? {
|
|
3
|
+
[k in Param | keyof ExtractEndpointParams<Rest>]: string | number;
|
|
4
|
+
} : T extends `${infer _Start}{${infer Param}}` ? {
|
|
5
|
+
[k in Param]: string | number;
|
|
6
|
+
} : never;
|
|
7
|
+
export declare namespace Api {
|
|
8
|
+
export type ClientOptions = {
|
|
9
|
+
headers?: RequestInit["headers"];
|
|
10
|
+
request?: Omit<RequestInit, "body" | "headers" | "method">;
|
|
11
|
+
throwErr?: boolean;
|
|
12
|
+
timeout?: number | false | null;
|
|
13
|
+
processReq?: RequestProcessor;
|
|
14
|
+
processRes?: ResponseProcessorRes;
|
|
15
|
+
processErr?: ResponseProcessorErr;
|
|
16
|
+
};
|
|
17
|
+
type ClientMethod<TMethod extends RequestMethod, TEndpoints extends Endpoints> = <TEndpoint extends EndpointUrl<TEndpoints>, TOptions extends EndpointOptions<TEndpoints, TEndpoint, TMethod>, TOk extends ResponseOk = EndpointResponseOk<TEndpoints, TEndpoint, TMethod>, TFail extends ResponseFail = EndpointResponseFail<TEndpoints, TEndpoint, TMethod>>(endpoint: TEndpoint, options?: TOptions) => Promise<EndpointResult<TEndpoints, TEndpoint, TMethod>>;
|
|
18
|
+
export type Client<TEndpoints extends Endpoints> = {
|
|
19
|
+
[TMethod in RequestMethod]: ClientMethod<TMethod, TEndpoints>;
|
|
20
|
+
};
|
|
21
|
+
export type GetDataType<TEndpoints extends Endpoints, TEndpoint extends EndpointUrl<TEndpoints>, TMethod extends RequestMethod, TDataType extends keyof DataTypes<Uppercase<TMethod>>> = TEndpoints[TEndpoint][Uppercase<TMethod>] extends DataTypes<Uppercase<TMethod>> ? TEndpoints[TEndpoint][Uppercase<TMethod>][TDataType] : never;
|
|
22
|
+
export type EndpointOptions<TEndpoints extends Endpoints, TEndpoint extends EndpointUrl<TEndpoints>, TMethod extends RequestMethod> = RequestOptions<TEndpoints, TEndpoint, TMethod, GetDataType<TEndpoints, TEndpoint, TMethod, "json">, GetDataType<TEndpoints, TEndpoint, TMethod, "query">>;
|
|
23
|
+
export type EndpointResponseOk<TEndpoints extends Endpoints, TEndpoint extends EndpointUrl<TEndpoints>, TMethod extends RequestMethod> = GetDataType<TEndpoints, TEndpoint, TMethod, "ok">;
|
|
24
|
+
export type EndpointResponseFail<TEndpoints extends Endpoints, TEndpoint extends EndpointUrl<TEndpoints>, TMethod extends RequestMethod> = GetDataType<TEndpoints, TEndpoint, TMethod, "fail">;
|
|
25
|
+
type EndpointResult<TEndpoints extends Endpoints, TEndpoint extends EndpointUrl<TEndpoints>, TMethod extends RequestMethod> = Result<EndpointResponseOk<TEndpoints, TEndpoint, TMethod>, EndpointResponseFail<TEndpoints, TEndpoint, TMethod>>;
|
|
26
|
+
export type Endpoints = Record<string, Endpoint>;
|
|
27
|
+
type Endpoint = {
|
|
28
|
+
[TMethod in Uppercase<RequestMethod>]?: DataTypes<TMethod>;
|
|
29
|
+
};
|
|
30
|
+
export type EndpointUrl<TEndpoints extends Endpoints> = Extract<keyof TEndpoints, string>;
|
|
31
|
+
type DataTypes<TMethod extends Uppercase<RequestMethod>> = {
|
|
32
|
+
json?: RequestJson;
|
|
33
|
+
query?: RequestQuery;
|
|
34
|
+
ok?: null | unknown;
|
|
35
|
+
fail?: null | unknown;
|
|
36
|
+
};
|
|
37
|
+
export type RequestMethod = "get" | "post" | "put" | "patch" | "delete";
|
|
38
|
+
type RequestJson = unknown;
|
|
39
|
+
type RequestQuery = unknown;
|
|
40
|
+
type RequestParams = unknown;
|
|
41
|
+
type RequestOptions<TEndpoints extends Endpoints, TEndpoint extends EndpointUrl<TEndpoints>, TMethod extends RequestMethod, TJson extends RequestJson, TQuery extends RequestQuery> = Omit<ClientOptions, "processReq"> & {
|
|
42
|
+
processReq?: EndpointRequestProcessor<TEndpoints, TEndpoint, TMethod>;
|
|
43
|
+
params?: ExtractEndpointParams<TEndpoint>;
|
|
44
|
+
query?: TQuery;
|
|
45
|
+
json?: TJson;
|
|
46
|
+
};
|
|
47
|
+
export type ResponseOk = unknown;
|
|
48
|
+
export type ResponseFail = unknown;
|
|
49
|
+
export type ResultOk<TResponse extends ResponseOk = ResponseOk> = {
|
|
50
|
+
status: _Response["status"];
|
|
51
|
+
msg: _Response["statusText"];
|
|
52
|
+
ok: true;
|
|
53
|
+
fail?: false;
|
|
54
|
+
data: TResponse;
|
|
55
|
+
};
|
|
56
|
+
export type ResultFail<TResponse extends ResponseFail = ResponseFail> = {
|
|
57
|
+
status: _Response["status"];
|
|
58
|
+
msg: Error["message"] | _Response["statusText"];
|
|
59
|
+
ok?: false;
|
|
60
|
+
fail: true;
|
|
61
|
+
data: TResponse;
|
|
62
|
+
};
|
|
63
|
+
export type Result<TResponseOk extends ResponseOk, TResponseFail extends ResponseFail> = {
|
|
64
|
+
status: _Response["status"];
|
|
65
|
+
msg: _Response["statusText"];
|
|
66
|
+
ok: true;
|
|
67
|
+
fail?: false;
|
|
68
|
+
data: TResponseOk;
|
|
69
|
+
} | {
|
|
70
|
+
status: _Response["status"];
|
|
71
|
+
msg: Error["message"] | _Response["statusText"];
|
|
72
|
+
ok?: false;
|
|
73
|
+
fail: true;
|
|
74
|
+
data: TResponseFail;
|
|
75
|
+
};
|
|
76
|
+
export type RequestProcessor = (method: RequestMethod, url: string, query: any, json: any, params: any, requestInit: RequestInit) => [
|
|
77
|
+
string,
|
|
78
|
+
RequestQuery,
|
|
79
|
+
RequestJson,
|
|
80
|
+
RequestParams,
|
|
81
|
+
RequestInit
|
|
82
|
+
];
|
|
83
|
+
export type EndpointRequestProcessor<TEndpoints extends Endpoints, TEndpoint extends EndpointUrl<TEndpoints>, TMethod extends RequestMethod> = (method: TMethod, url: string, query: EndpointOptions<TEndpoints, TEndpoint, TMethod>["query"], json: EndpointOptions<TEndpoints, TEndpoint, TMethod>["json"], params: EndpointOptions<TEndpoints, TEndpoint, TMethod>["params"], requestInit: RequestInit) => [
|
|
84
|
+
string,
|
|
85
|
+
EndpointOptions<TEndpoints, TEndpoint, TMethod>["query"],
|
|
86
|
+
EndpointOptions<TEndpoints, TEndpoint, TMethod>["json"],
|
|
87
|
+
EndpointOptions<TEndpoints, TEndpoint, TMethod>["params"],
|
|
88
|
+
RequestInit
|
|
89
|
+
];
|
|
90
|
+
type ResponseProcessorRes = <TResponseOk extends ResponseOk = ResponseOk, TResponseFail extends ResponseFail = ResponseFail>(response: _Response, options: any) => Promise<Result<TResponseOk, TResponseFail>>;
|
|
91
|
+
type ResponseProcessorErr = <TResponseOk extends ResponseOk = ResponseOk, TResponseFail extends ResponseFail = ResponseFail>(msg: string, options: any) => Promise<Result<TResponseOk, TResponseFail>>;
|
|
92
|
+
type HooksMaps = {
|
|
93
|
+
[TMethod in RequestMethod]: `use${TMethod extends "get" ? "" : Capitalize<TMethod>}`;
|
|
94
|
+
};
|
|
95
|
+
export type HooksMapsByName = {
|
|
96
|
+
[K in keyof HooksMaps as HooksMaps[K]]: K;
|
|
97
|
+
};
|
|
98
|
+
export {};
|
|
99
|
+
}
|
|
100
|
+
export declare namespace Api.Generate {
|
|
101
|
+
type ResultShortcuts<TEndpoints extends Endpoints> = {
|
|
102
|
+
[TMethod in RequestMethod]: {
|
|
103
|
+
[TEndpoint in Extract<keyof TEndpoints, string>]: {
|
|
104
|
+
ok: GetDataType<TEndpoints, TEndpoint, TMethod, "ok">;
|
|
105
|
+
fail: GetDataType<TEndpoints, TEndpoint, TMethod, "fail">;
|
|
106
|
+
};
|
|
107
|
+
};
|
|
108
|
+
};
|
|
109
|
+
type ResponseShortcuts<TEndpoints extends Endpoints> = {
|
|
110
|
+
[TMethod in RequestMethod]: {
|
|
111
|
+
[TEndpoint in Extract<keyof TEndpoints, string>]: GetDataType<TEndpoints, TEndpoint, TMethod, "ok">;
|
|
112
|
+
};
|
|
113
|
+
};
|
|
114
|
+
type RequestShortcuts<TEndpoints extends Endpoints> = {
|
|
115
|
+
[TMethod in RequestMethod]: {
|
|
116
|
+
[TEndpoint in Extract<keyof TEndpoints, string>]: TMethod extends "get" ? GetDataType<TEndpoints, TEndpoint, TMethod, "query"> : GetDataType<TEndpoints, TEndpoint, TMethod, "json">;
|
|
117
|
+
};
|
|
118
|
+
};
|
|
119
|
+
type GetShortcuts<TEndpoints extends Endpoints> = {
|
|
120
|
+
[TEndpoint in Extract<keyof TEndpoints, string>]: GetDataType<TEndpoints, TEndpoint, "get", "ok">;
|
|
121
|
+
};
|
|
122
|
+
type PostShortcuts<TEndpoints extends Endpoints> = {
|
|
123
|
+
[TEndpoint in Extract<keyof TEndpoints, string>]: GetDataType<TEndpoints, TEndpoint, "post", "ok">;
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
export {};
|