@koine/api 2.0.0-beta.11 → 2.0.0-beta.111

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.
Files changed (67) hide show
  1. package/ApiError.cjs.d.ts +2 -0
  2. package/ApiError.cjs.default.js +1 -0
  3. package/ApiError.cjs.js +14 -0
  4. package/ApiError.cjs.mjs +2 -0
  5. package/ApiError.d.ts +3 -9
  6. package/ApiError.esm.js +9 -0
  7. package/createApi.cjs.d.ts +2 -0
  8. package/createApi.cjs.default.js +1 -0
  9. package/createApi.cjs.js +27 -0
  10. package/createApi.cjs.mjs +2 -0
  11. package/createApi.d.ts +2 -7
  12. package/createApi.esm.js +22 -0
  13. package/createApiResultFail.cjs.d.ts +2 -0
  14. package/createApiResultFail.cjs.default.js +1 -0
  15. package/createApiResultFail.cjs.js +9 -0
  16. package/createApiResultFail.cjs.mjs +2 -0
  17. package/createApiResultFail.d.ts +3 -1
  18. package/createApiResultFail.esm.js +3 -0
  19. package/createApiResultOk.cjs.d.ts +2 -0
  20. package/createApiResultOk.cjs.default.js +1 -0
  21. package/createApiResultOk.cjs.js +8 -0
  22. package/createApiResultOk.cjs.mjs +2 -0
  23. package/createApiResultOk.d.ts +2 -1
  24. package/createApiResultOk.esm.js +3 -0
  25. package/createSwrApi.cjs.js +50 -0
  26. package/createSwrApi.esm.js +43 -0
  27. package/index.cjs.d.ts +1 -0
  28. package/index.cjs.default.js +1 -0
  29. package/index.cjs.js +16 -0
  30. package/index.cjs.mjs +2 -0
  31. package/index.d.ts +1 -3
  32. package/index.esm.js +5 -0
  33. package/next/nextApiResponse.d.ts +6 -0
  34. package/{nextApiResponse12.d.ts → next/nextApiResponse12.d.ts} +1 -1
  35. package/next.cjs.d.ts +1 -0
  36. package/next.cjs.default.js +1 -0
  37. package/next.cjs.js +14 -0
  38. package/next.cjs.mjs +2 -0
  39. package/next.d.ts +2 -0
  40. package/next.esm.js +9 -0
  41. package/package.json +53 -12
  42. package/swr/createSwrApi.d.ts +10 -0
  43. package/swr-mutation/createSwrMutationApi.d.ts +15 -0
  44. package/swr-mutation.cjs.d.ts +1 -0
  45. package/swr-mutation.cjs.default.js +1 -0
  46. package/swr-mutation.cjs.js +26 -0
  47. package/swr-mutation.cjs.mjs +2 -0
  48. package/swr-mutation.d.ts +1 -0
  49. package/swr-mutation.esm.js +18 -0
  50. package/swr.cjs.d.ts +1 -0
  51. package/swr.cjs.default.js +1 -0
  52. package/swr.cjs.js +12 -0
  53. package/swr.cjs.mjs +2 -0
  54. package/swr.d.ts +1 -0
  55. package/swr.esm.js +4 -0
  56. package/types.d.ts +126 -0
  57. package/typings.d.ts +11 -532
  58. package/ApiError.mjs +0 -14
  59. package/createApi.mjs +0 -128
  60. package/createApiResultFail.mjs +0 -7
  61. package/createApiResultOk.mjs +0 -8
  62. package/createSwrApi.d.ts +0 -34
  63. package/createSwrApi.mjs +0 -82
  64. package/index.mjs +0 -7
  65. package/nextApiResponse.d.ts +0 -5
  66. package/nextApiResponse.mjs +0 -12
  67. package/nextApiResponse12.mjs +0 -13
package/createApi.mjs DELETED
@@ -1,128 +0,0 @@
1
- import buildUrlQueryString from "@koine/utils/buildUrlQueryString";
2
- import errorToString from "@koine/utils/errorToString";
3
- import isFullObject from "@koine/utils/isFullObject";
4
- /**
5
- * Create api client
6
- *
7
- * @param apiName Short name to use in debug logs
8
- * @param baseUrl Either relativ eor absolute, it must end without trailing slash
9
- */ export const createApi = (apiName, baseUrl, options)=>{
10
- const { headers: headersBase = {}, request: requestBase = {
11
- referrerPolicy: "no-referrer"
12
- }, throwErr: throwErrBase, timeout: timeoutBase = 10000, processReq: processReqBase, processRes: processResBase, processErr: processErrBase } = options || {};
13
- return [
14
- "get",
15
- "post",
16
- "put",
17
- "patch",
18
- "delete"
19
- ].reduce((api, method)=>{
20
- // @ts-expect-error FIXME: type
21
- api[method] = async (endpoint, options)=>{
22
- const { request = requestBase, headers = headersBase, timeout = timeoutBase, processReq, processRes = processResBase, processErr = processErrBase, throwErr = throwErrBase } = options || {};
23
- let { params, json, query } = options || {};
24
- let url = `${baseUrl}/${endpoint + "".replace(/^\/*/, "")}`;
25
- let requestInit = {
26
- method: method.toUpperCase(),
27
- ...request,
28
- headers: {
29
- "content-type": "application/json",
30
- ...headers
31
- }
32
- };
33
- if (processReqBase) {
34
- const transformed = processReqBase(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 (processReq) {
42
- const transformed = processReq(method, url, query, json, params, requestInit);
43
- url = transformed[0];
44
- query = transformed[1];
45
- json = transformed[2];
46
- params = transformed[3];
47
- requestInit = transformed[4];
48
- }
49
- if (isFullObject(params)) {
50
- for(const key in params){
51
- url = url.replace(`{${key}}`, params[key].toString());
52
- }
53
- }
54
- const timeoutNumber = Number(timeout);
55
- let controller;
56
- let timeoutId;
57
- if (json) {
58
- requestInit.body = JSON.stringify(json);
59
- }
60
- if (timeoutNumber > 0) {
61
- controller = new AbortController();
62
- timeoutId = setTimeout(()=>controller.abort(), timeoutNumber);
63
- requestInit.signal = controller.signal;
64
- }
65
- if (query) {
66
- // FIXME: ts-expect-error this assertion is not the best, but nevermind for now
67
- url += buildUrlQueryString(query);
68
- }
69
- let response = null;
70
- let result = null;
71
- let msg = "";
72
- try {
73
- response = await fetch(url, requestInit);
74
- } catch (e) {
75
- msg = errorToString(e);
76
- }
77
- if (timeoutId) {
78
- clearTimeout(timeoutId);
79
- }
80
- if (response) {
81
- try {
82
- if (processRes) {
83
- result = await processRes(response, options || {});
84
- } else {
85
- result = await response.json();
86
- }
87
- } catch (e) {
88
- msg = errorToString(e);
89
- }
90
- }
91
- if (result === null) {
92
- if (processErr) {
93
- result = await processErr(msg, options || {});
94
- } else {
95
- // this error should only happen on network errors or wrong API urls
96
- // there is no specific HTTP error for this, we can consider these
97
- // two statuses though:
98
- // - [100 Continue](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/100)
99
- // - [501 Not Implemented](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/501)
100
- result = {
101
- data: null,
102
- msg,
103
- status: 100,
104
- fail: true,
105
- ok: false
106
- };
107
- }
108
- }
109
- if (throwErr && result?.fail) {
110
- // throw new ApiError<Failed>(result);
111
- // I prefer to throw an object literal despite what eslint says
112
- // eslint-disable-next-line no-throw-literal
113
- throw result;
114
- }
115
- if (process.env["NODE_ENV"] !== "production") {
116
- const logMsg = `${result?.status}: api[${apiName}] ${method.toUpperCase()} ${url}`;
117
- if (result?.ok) {
118
- console.info(`🟢 ${logMsg}`);
119
- } else {
120
- console.info(`🔴 ${logMsg}`);
121
- }
122
- }
123
- return result;
124
- };
125
- return api;
126
- }, {});
127
- };
128
- export default createApi;
@@ -1,7 +0,0 @@
1
- export const createApiResultFail = (data = {}, msg, status)=>({
2
- fail: true,
3
- data,
4
- msg: msg || "",
5
- status: status || 404
6
- });
7
- export default createApiResultFail;
@@ -1,8 +0,0 @@
1
- export const createApiResultOk = (data = {}, msg)=>({
2
- ok: true,
3
- fail: false,
4
- data,
5
- msg: msg || "",
6
- status: 200
7
- });
8
- export default createApiResultOk;
package/createSwrApi.d.ts DELETED
@@ -1,34 +0,0 @@
1
- import { type BareFetcher, // type Fetcher,
2
- type SWRConfiguration, type SWRResponse } from "swr";
3
- import { type SWRMutationConfiguration, type SWRMutationResponse } from "swr/mutation";
4
- type SWRConfigurationExtended<Data = any, Error = any, Fn extends BareFetcher<any> = BareFetcher<any>> = SWRConfiguration<Data, Error, Fn> & {
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.useGet("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
- when?: boolean | (() => boolean);
22
- };
23
- type KoineApiMethodHookSWR<THookName extends keyof Koine.Api.HooksMapsByName, TEndpoints extends Koine.Api.Endpoints> = <TEndpoint extends Koine.Api.EndpointUrl<TEndpoints>, TMethod extends Koine.Api.RequestMethod = Koine.Api.HooksMapsByName[THookName]>(endpoint: TEndpoint, options?: Koine.Api.EndpointOptions<TEndpoints, TEndpoint, TMethod>, config?: THookName extends "useGet" ? SWRConfigurationExtended<Koine.Api.EndpointResponseOk<TEndpoints, TEndpoint, TMethod>, Koine.Api.EndpointResponseFail<TEndpoints, TEndpoint, TMethod>> : SWRMutationConfiguration<Koine.Api.EndpointResponseOk<TEndpoints, TEndpoint, TMethod>, Koine.Api.EndpointResponseFail<TEndpoints, TEndpoint, TMethod>, Koine.Api.EndpointOptions<TEndpoints, TEndpoint, TMethod>, TEndpoint>) => THookName extends "useGet" ? SWRResponse<Koine.Api.EndpointResponseOk<TEndpoints, TEndpoint, TMethod>, Koine.Api.EndpointResponseFail<TEndpoints, TEndpoint, TMethod>> : SWRMutationResponse<Koine.Api.EndpointResponseOk<TEndpoints, TEndpoint, TMethod>, Koine.Api.EndpointResponseFail<TEndpoints, TEndpoint, TMethod>, Koine.Api.EndpointOptions<TEndpoints, TEndpoint, TMethod>, TEndpoint>;
24
- /**
25
- * It creates an api client extended with auto-generated SWR wrapper hooks
26
- */
27
- export declare const createSwrApi: <TEndpoints extends Koine.Api.Endpoints>(apiName: string, baseUrl: string, options?: Koine.Api.ClientOptions | undefined) => Koine.Api.Client<TEndpoints> & {
28
- useGet: KoineApiMethodHookSWR<"useGet", TEndpoints>;
29
- usePost: KoineApiMethodHookSWR<"usePost", TEndpoints>;
30
- usePut: KoineApiMethodHookSWR<"usePut", TEndpoints>;
31
- usePatch: KoineApiMethodHookSWR<"usePatch", TEndpoints>;
32
- useDelete: KoineApiMethodHookSWR<"useDelete", TEndpoints>;
33
- };
34
- export default createSwrApi;
package/createSwrApi.mjs DELETED
@@ -1,82 +0,0 @@
1
- "use client";
2
- import useSWR from "swr";
3
- import useSWRMutation from "swr/mutation";
4
- import isFunction from "@koine/utils/isFunction";
5
- import createApi from "./createApi";
6
- function createUseApi(api, method) {
7
- return function useApi(endpoint, options, _config) {
8
- if (method === "get") {
9
- // const fetcher = async (_endpoint: TEndpoint) => {
10
- // try {
11
- // const { ok, data } = await api[method](_endpoint, {
12
- // ...(options || {}),
13
- // throwErr: true,
14
- // });
15
- // if (ok) {
16
- // return data;
17
- // }
18
- // throw new Error() as unknown as Koine.Api.EndpointResponseFail<TEndpoints, TEndpoint, TMethod>;
19
- // } catch(e) {
20
- // throw new Error() as unknown as Koine.Api.EndpointResponseFail<TEndpoints, TEndpoint, TMethod>;;
21
- // }
22
- // };
23
- // }
24
- const fetcher = async ()=>{
25
- const { data } = await api[method](endpoint, {
26
- ...options || {},
27
- throwErr: true
28
- });
29
- return data;
30
- };
31
- const config = _config;
32
- const shouldNotFetch = config?.when === false || isFunction(config?.when) && config?.when() === false;
33
- // <Data = any, Error = any>(key: Key, config: SWRConfigurationExtended<Data, Error, Fetcher<Data>> | undefined): SWRResponse<Data, Error>;
34
- // eslint-disable-next-line react-hooks/rules-of-hooks
35
- return useSWR(shouldNotFetch ? null : options ? [
36
- endpoint,
37
- options
38
- ] : [
39
- endpoint
40
- ], fetcher, config);
41
- }
42
- const config = _config;
43
- const sender = async (// if the first argument is an array the second tem are the base options
44
- // defined when calling the usePost/Put/etc. hook, these will be overriden
45
- // by the _options just here below
46
- _endpoint, // these are the options arriving when calling `trigger({ json, query, etc... })
47
- _options)=>{
48
- const endpoint = Array.isArray(_endpoint) ? _endpoint[0] : _endpoint;
49
- const options = Array.isArray(_endpoint) ? _endpoint[1] : {};
50
- const { ok, data } = await api[method](endpoint, {
51
- ...options,
52
- ..._options.arg || {},
53
- throwErr: true
54
- });
55
- return ok ? data : data;
56
- };
57
- // config.fetcher = sender;
58
- // eslint-disable-next-line react-hooks/rules-of-hooks
59
- return useSWRMutation(// @ts-expect-error FIXME: I can't get it...
60
- options ? [
61
- endpoint,
62
- options
63
- ] : endpoint, sender, config);
64
- };
65
- }
66
- /**
67
- * It creates an api client extended with auto-generated SWR wrapper hooks
68
- */ export const createSwrApi = (...args)=>{
69
- const api = createApi(...args);
70
- [
71
- "get",
72
- "post",
73
- "put",
74
- "patch",
75
- "delete"
76
- ].forEach((method)=>{
77
- const hookName = `use${method.charAt(0).toUpperCase() + method.slice(1)}`;
78
- api[hookName] = createUseApi(api, method);
79
- });
80
- return api;
81
- };
82
- export default createSwrApi;
package/index.mjs DELETED
@@ -1,7 +0,0 @@
1
- export { ApiError } from "./ApiError";
2
- export { createApi } from "./createApi";
3
- export { createApiResultFail } from "./createApiResultFail";
4
- export { createApiResultOk } from "./createApiResultOk";
5
- export { createSwrApi } from "./createSwrApi";
6
- export { nextApiResponse } from "./nextApiResponse";
7
- export { nextApiResponse12 } from "./nextApiResponse12";
@@ -1,5 +0,0 @@
1
- export declare const nextApiResponse: {
2
- ok<T>(data: T, msg?: string): void;
3
- fail<T_1>(data: T_1, msg?: string, status?: number): void;
4
- };
5
- export default nextApiResponse;
@@ -1,12 +0,0 @@
1
- import { NextResponse } from "next/server";
2
- import createApiResultFail from "./createApiResultFail";
3
- import createApiResultOk from "./createApiResultOk";
4
- export const nextApiResponse = {
5
- ok (data, msg) {
6
- NextResponse.json(createApiResultOk(data, msg));
7
- },
8
- fail (data, msg, status) {
9
- NextResponse.json(createApiResultFail(data, msg, status));
10
- }
11
- };
12
- export default nextApiResponse;
@@ -1,13 +0,0 @@
1
- import createApiResultFail from "./createApiResultFail";
2
- import createApiResultOk from "./createApiResultOk";
3
- export const nextApiResponse12 = (nextRes)=>{
4
- return {
5
- ok (data, msg) {
6
- nextRes.status(200).json(createApiResultOk(data, msg));
7
- },
8
- fail (data, msg, status) {
9
- nextRes.status(status || 404).json(createApiResultFail(data, msg, status));
10
- }
11
- };
12
- };
13
- export default nextApiResponse12;