@koine/api 2.0.0-beta.2 → 2.0.0-beta.21

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.d.ts CHANGED
@@ -1,10 +1,4 @@
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
- */
1
+ /// <reference types="./typings.d.ts" />
8
2
  export declare class ApiError<TResponseFail extends Koine.Api.ResponseFail = unknown> extends Error {
9
3
  constructor(result: Koine.Api.ResultFail<TResponseFail>);
10
4
  }
package/ApiError.js CHANGED
@@ -1,16 +1,6 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ApiError = void 0;
4
- var tslib_1 = require("tslib");
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
- */
12
- var ApiError = /** @class */ (function (_super) {
13
- tslib_1.__extends(ApiError, _super);
1
+ import { __extends } from "tslib";
2
+ var ApiError = (function (_super) {
3
+ __extends(ApiError, _super);
14
4
  function ApiError(result) {
15
5
  var _this = _super.call(this, "Request failed with ".concat(result.status, " ").concat(result.msg)) || this;
16
6
  _this.name = "ApiError";
@@ -19,5 +9,5 @@ var ApiError = /** @class */ (function (_super) {
19
9
  }
20
10
  return ApiError;
21
11
  }(Error));
22
- exports.ApiError = ApiError;
23
- exports.default = ApiError;
12
+ export { ApiError };
13
+ export default ApiError;
@@ -0,0 +1,5 @@
1
+ /// <reference types="./typings.d.ts" />
2
+ export declare class ApiError<TResponseFail extends Koine.Api.ResponseFail = unknown> extends Error {
3
+ constructor(result: Koine.Api.ResultFail<TResponseFail>);
4
+ }
5
+ export default ApiError;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ApiError = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var ApiError = (function (_super) {
6
+ tslib_1.__extends(ApiError, _super);
7
+ function ApiError(result) {
8
+ var _this = _super.call(this, "Request failed with ".concat(result.status, " ").concat(result.msg)) || this;
9
+ _this.name = "ApiError";
10
+ Object.assign(_this, result);
11
+ return _this;
12
+ }
13
+ return ApiError;
14
+ }(Error));
15
+ exports.ApiError = ApiError;
16
+ exports.default = ApiError;
@@ -0,0 +1,2 @@
1
+ export declare const createApi: <TEndpoints extends Koine.Api.Endpoints>(apiName: string, baseUrl: string, options?: Koine.Api.ClientOptions) => Koine.Api.Client<TEndpoints>;
2
+ export default createApi;
@@ -1,32 +1,20 @@
1
- import { __assign, __awaiter, __generator } from "tslib";
2
- import buildUrlQueryString from "@koine/utils/buildUrlQueryString";
3
- import isFullObject from "@koine/utils/isFullObject";
4
- import errorToString from "@koine/utils/errorToString";
5
- /**
6
- * Create api client
7
- *
8
- * @param apiName Short name to use in debug logs
9
- * @param baseUrl Either relativ eor absolute, it must end without trailing slash
10
- */
11
- export var createApi = function (apiName, baseUrl, options) {
12
- var _a = options || {}, _b = _a.headers, headersBase = _b === void 0 ? {} : _b, _c = _a.request, requestBase = _c === void 0 ? {
13
- referrerPolicy: "no-referrer",
14
- // credentials: "include",
15
- // mode: "cors",
16
- // redirect: "follow",
17
- // cache: "no-cache",
18
- } : _c, throwErrBase = _a.throwErr, _d = _a.timeout, timeoutBase = _d === void 0 ? 10000 : _d, processReqBase = _a.processReq, processResBase = _a.processRes, processErrBase = _a.processErr;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createApi = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var utils_1 = require("@koine/utils");
6
+ var createApi = function (apiName, baseUrl, options) {
7
+ var _a = options || {}, _b = _a.headers, headersBase = _b === void 0 ? {} : _b, _c = _a.request, requestBase = _c === void 0 ? {} : _c, throwErrBase = _a.throwErr, _d = _a.timeout, timeoutBase = _d === void 0 ? 10000 : _d, processReqBase = _a.processReq, processResBase = _a.processRes, processErrBase = _a.processErr;
19
8
  return ["get", "post", "put", "patch", "delete"].reduce(function (api, method) {
20
- // @ts-expect-error FIXME: type
21
- api[method] = function (endpoint, options) { return __awaiter(void 0, void 0, void 0, function () {
9
+ api[method] = function (endpoint, options) { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
22
10
  var _a, _b, request, _c, headers, _d, timeout, processReq, _e, processRes, _f, processErr, _g, throwErr, _h, params, json, query, url, requestInit, transformed, transformed, key, timeoutNumber, controller, timeoutId, response, result, msg, e_1, e_2, logMsg;
23
- return __generator(this, function (_j) {
11
+ return tslib_1.__generator(this, function (_j) {
24
12
  switch (_j.label) {
25
13
  case 0:
26
14
  _a = options || {}, _b = _a.request, request = _b === void 0 ? requestBase : _b, _c = _a.headers, headers = _c === void 0 ? headersBase : _c, _d = _a.timeout, timeout = _d === void 0 ? timeoutBase : _d, processReq = _a.processReq, _e = _a.processRes, processRes = _e === void 0 ? processResBase : _e, _f = _a.processErr, processErr = _f === void 0 ? processErrBase : _f, _g = _a.throwErr, throwErr = _g === void 0 ? throwErrBase : _g;
27
15
  _h = options || {}, params = _h.params, json = _h.json, query = _h.query;
28
16
  url = "".concat(baseUrl, "/").concat(endpoint + "".replace(/^\/*/, ""));
29
- requestInit = __assign(__assign({ method: method.toUpperCase() }, request), { headers: __assign({ "content-type": "application/json" }, headers) });
17
+ requestInit = tslib_1.__assign(tslib_1.__assign({ method: method.toUpperCase() }, request), { headers: tslib_1.__assign({ "content-type": "application/json" }, headers) });
30
18
  if (processReqBase) {
31
19
  transformed = processReqBase(method, url, query, json, params, requestInit);
32
20
  url = transformed[0];
@@ -43,7 +31,7 @@ export var createApi = function (apiName, baseUrl, options) {
43
31
  params = transformed[3];
44
32
  requestInit = transformed[4];
45
33
  }
46
- if (isFullObject(params)) {
34
+ if ((0, utils_1.isFullObject)(params)) {
47
35
  for (key in params) {
48
36
  url = url.replace("{".concat(key, "}"), params[key].toString());
49
37
  }
@@ -58,8 +46,7 @@ export var createApi = function (apiName, baseUrl, options) {
58
46
  requestInit.signal = controller.signal;
59
47
  }
60
48
  if (query) {
61
- // FIXME: ts-expect-error this assertion is not the best, but nevermind for now
62
- url += buildUrlQueryString(query);
49
+ url += (0, utils_1.buildUrlQueryString)(query);
63
50
  }
64
51
  response = null;
65
52
  result = null;
@@ -67,49 +54,44 @@ export var createApi = function (apiName, baseUrl, options) {
67
54
  _j.label = 1;
68
55
  case 1:
69
56
  _j.trys.push([1, 3, , 4]);
70
- return [4 /*yield*/, fetch(url, requestInit)];
57
+ return [4, fetch(url, requestInit)];
71
58
  case 2:
72
59
  response = _j.sent();
73
- return [3 /*break*/, 4];
60
+ return [3, 4];
74
61
  case 3:
75
62
  e_1 = _j.sent();
76
- msg = errorToString(e_1);
77
- return [3 /*break*/, 4];
63
+ msg = (0, utils_1.errorToString)(e_1);
64
+ return [3, 4];
78
65
  case 4:
79
66
  if (timeoutId) {
80
67
  clearTimeout(timeoutId);
81
68
  }
82
- if (!response) return [3 /*break*/, 11];
69
+ if (!response) return [3, 11];
83
70
  _j.label = 5;
84
71
  case 5:
85
72
  _j.trys.push([5, 10, , 11]);
86
- if (!processRes) return [3 /*break*/, 7];
87
- return [4 /*yield*/, processRes(response, options || {})];
73
+ if (!processRes) return [3, 7];
74
+ return [4, processRes(response, options || {})];
88
75
  case 6:
89
76
  result = _j.sent();
90
- return [3 /*break*/, 9];
91
- case 7: return [4 /*yield*/, response.json()];
77
+ return [3, 9];
78
+ case 7: return [4, response.json()];
92
79
  case 8:
93
80
  result = _j.sent();
94
81
  _j.label = 9;
95
- case 9: return [3 /*break*/, 11];
82
+ case 9: return [3, 11];
96
83
  case 10:
97
84
  e_2 = _j.sent();
98
- msg = errorToString(e_2);
99
- return [3 /*break*/, 11];
85
+ msg = (0, utils_1.errorToString)(e_2);
86
+ return [3, 11];
100
87
  case 11:
101
- if (!(result === null)) return [3 /*break*/, 14];
102
- if (!processErr) return [3 /*break*/, 13];
103
- return [4 /*yield*/, processErr(msg, options || {})];
88
+ if (!(result === null)) return [3, 14];
89
+ if (!processErr) return [3, 13];
90
+ return [4, processErr(msg, options || {})];
104
91
  case 12:
105
92
  result = _j.sent();
106
- return [3 /*break*/, 14];
93
+ return [3, 14];
107
94
  case 13:
108
- // this error should only happen on network errors or wrong API urls
109
- // there is no specific HTTP error for this, we can consider these
110
- // two statuses though:
111
- // - [100 Continue](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/100)
112
- // - [501 Not Implemented](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/501)
113
95
  result = {
114
96
  data: null,
115
97
  msg: msg,
@@ -120,12 +102,9 @@ export var createApi = function (apiName, baseUrl, options) {
120
102
  _j.label = 14;
121
103
  case 14:
122
104
  if (throwErr && (result === null || result === void 0 ? void 0 : result.fail)) {
123
- // throw new ApiError<Failed>(result);
124
- // I prefer to throw an object literal despite what eslint says
125
- // eslint-disable-next-line no-throw-literal
126
105
  throw result;
127
106
  }
128
- if (process.env["NODE_ENV"] !== "production") {
107
+ if (process.env["NODE_ENV"] === "development") {
129
108
  logMsg = "".concat(result === null || result === void 0 ? void 0 : result.status, ": api[").concat(apiName, "] ").concat(method.toUpperCase(), " ").concat(url);
130
109
  if (result === null || result === void 0 ? void 0 : result.ok) {
131
110
  console.info("\uD83D\uDFE2 ".concat(logMsg));
@@ -134,11 +113,12 @@ export var createApi = function (apiName, baseUrl, options) {
134
113
  console.info("\uD83D\uDD34 ".concat(logMsg));
135
114
  }
136
115
  }
137
- return [2 /*return*/, result];
116
+ return [2, result];
138
117
  }
139
118
  });
140
119
  }); };
141
120
  return api;
142
121
  }, {});
143
122
  };
144
- export default createApi;
123
+ exports.createApi = createApi;
124
+ exports.default = exports.createApi;
@@ -0,0 +1,2 @@
1
+ export declare const createApiResultFail: <T>(data?: T, msg?: string, status?: number) => Koine.Api.ResultFail<T>;
2
+ export default createApiResultFail;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createApiResultFail = void 0;
4
+ var createApiResultFail = function (data, msg, status) {
5
+ if (data === void 0) { data = {}; }
6
+ return ({
7
+ fail: true,
8
+ data: data,
9
+ msg: msg || "",
10
+ status: status || 404,
11
+ });
12
+ };
13
+ exports.createApiResultFail = createApiResultFail;
14
+ exports.default = exports.createApiResultFail;
@@ -0,0 +1,2 @@
1
+ export declare const createApiResultOk: <T>(data?: T, msg?: string) => Koine.Api.ResultOk<T>;
2
+ export default createApiResultOk;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createApiResultOk = void 0;
4
+ var createApiResultOk = function (data, msg) {
5
+ if (data === void 0) { data = {}; }
6
+ return ({
7
+ ok: true,
8
+ fail: false,
9
+ data: data,
10
+ msg: msg || "",
11
+ status: 200,
12
+ });
13
+ };
14
+ exports.createApiResultOk = createApiResultOk;
15
+ exports.default = exports.createApiResultOk;
@@ -0,0 +1,15 @@
1
+ /// <reference types="./typings.d.ts" />
2
+ import { type BareFetcher, 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
+ when?: boolean | (() => boolean);
6
+ };
7
+ 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>;
8
+ export declare const createSwrApi: <TEndpoints extends Koine.Api.Endpoints>(apiName: string, baseUrl: string, options?: Koine.Api.ClientOptions | undefined) => Koine.Api.Client<TEndpoints> & {
9
+ useGet: KoineApiMethodHookSWR<"useGet", TEndpoints>;
10
+ usePost: KoineApiMethodHookSWR<"usePost", TEndpoints>;
11
+ usePut: KoineApiMethodHookSWR<"usePut", TEndpoints>;
12
+ usePatch: KoineApiMethodHookSWR<"usePatch", TEndpoints>;
13
+ useDelete: KoineApiMethodHookSWR<"useDelete", TEndpoints>;
14
+ };
15
+ export default createSwrApi;
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ "use client";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.createSwrApi = void 0;
5
+ var tslib_1 = require("tslib");
6
+ var swr_1 = require("swr");
7
+ var mutation_1 = require("swr/mutation");
8
+ var utils_1 = require("@koine/utils");
9
+ var createApi_1 = require("./createApi");
10
+ function createUseApi(api, method) {
11
+ return function useApi(endpoint, options, _config) {
12
+ var _this = this;
13
+ if (method === "get") {
14
+ var fetcher = function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
15
+ var data;
16
+ return tslib_1.__generator(this, function (_a) {
17
+ switch (_a.label) {
18
+ case 0: return [4, api[method](endpoint, tslib_1.__assign(tslib_1.__assign({}, (options || {})), { throwErr: true }))];
19
+ case 1:
20
+ data = (_a.sent()).data;
21
+ return [2, data];
22
+ }
23
+ });
24
+ }); };
25
+ var config_1 = _config;
26
+ var shouldNotFetch = (config_1 === null || config_1 === void 0 ? void 0 : config_1.when) === false ||
27
+ ((0, utils_1.isFunction)(config_1 === null || config_1 === void 0 ? void 0 : config_1.when) && (config_1 === null || config_1 === void 0 ? void 0 : config_1.when()) === false);
28
+ return (0, swr_1.default)(shouldNotFetch ? null : options ? [endpoint, options] : [endpoint], fetcher, config_1);
29
+ }
30
+ var config = _config;
31
+ var sender = function (_endpoint, _options) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
32
+ var endpoint, options, _a, ok, data;
33
+ return tslib_1.__generator(this, function (_b) {
34
+ switch (_b.label) {
35
+ case 0:
36
+ endpoint = Array.isArray(_endpoint) ? _endpoint[0] : _endpoint;
37
+ options = Array.isArray(_endpoint) ? _endpoint[1] : {};
38
+ return [4, api[method](endpoint, tslib_1.__assign(tslib_1.__assign(tslib_1.__assign({}, options), (_options.arg || {})), { throwErr: true }))];
39
+ case 1:
40
+ _a = _b.sent(), ok = _a.ok, data = _a.data;
41
+ return [2, ok ? data : data];
42
+ }
43
+ });
44
+ }); };
45
+ return (0, mutation_1.default)(options ? [endpoint, options] : endpoint, sender, config);
46
+ };
47
+ }
48
+ var createSwrApi = function () {
49
+ var args = [];
50
+ for (var _i = 0; _i < arguments.length; _i++) {
51
+ args[_i] = arguments[_i];
52
+ }
53
+ var api = createApi_1.default.apply(void 0, tslib_1.__spreadArray([], tslib_1.__read(args), false));
54
+ ["get", "post", "put", "patch", "delete"].forEach(function (method) {
55
+ var hookName = "use".concat(method.charAt(0).toUpperCase() + method.slice(1));
56
+ api[hookName] = createUseApi(api, method);
57
+ });
58
+ return api;
59
+ };
60
+ exports.createSwrApi = createSwrApi;
61
+ exports.default = exports.createSwrApi;
package/cjs/index.d.ts ADDED
@@ -0,0 +1,6 @@
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 { nextApiResponse12 } from "./nextApiResponse12";
package/cjs/index.js ADDED
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.nextApiResponse12 = exports.createSwrApi = exports.createApiResultOk = exports.createApiResultFail = exports.createApi = exports.ApiError = void 0;
4
+ var ApiError_1 = require("./ApiError");
5
+ Object.defineProperty(exports, "ApiError", { enumerable: true, get: function () { return ApiError_1.ApiError; } });
6
+ var createApi_1 = require("./createApi");
7
+ Object.defineProperty(exports, "createApi", { enumerable: true, get: function () { return createApi_1.createApi; } });
8
+ var createApiResultFail_1 = require("./createApiResultFail");
9
+ Object.defineProperty(exports, "createApiResultFail", { enumerable: true, get: function () { return createApiResultFail_1.createApiResultFail; } });
10
+ var createApiResultOk_1 = require("./createApiResultOk");
11
+ Object.defineProperty(exports, "createApiResultOk", { enumerable: true, get: function () { return createApiResultOk_1.createApiResultOk; } });
12
+ var createSwrApi_1 = require("./createSwrApi");
13
+ Object.defineProperty(exports, "createSwrApi", { enumerable: true, get: function () { return createSwrApi_1.createSwrApi; } });
14
+ var nextApiResponse12_1 = require("./nextApiResponse12");
15
+ Object.defineProperty(exports, "nextApiResponse12", { enumerable: true, get: function () { return nextApiResponse12_1.nextApiResponse12; } });
@@ -0,0 +1,6 @@
1
+ import { NextResponse } from "next/server";
2
+ export declare const nextApiResponse: {
3
+ ok<T>(data: T, msg?: string): NextResponse<Koine.Api.ResultOk<T>>;
4
+ fail<T_1>(data: T_1, msg?: string, status?: number): NextResponse<Koine.Api.ResultFail<T_1>>;
5
+ };
6
+ export default nextApiResponse;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.nextApiResponse = void 0;
4
+ var server_1 = require("next/server");
5
+ var createApiResultFail_1 = require("./createApiResultFail");
6
+ var createApiResultOk_1 = require("./createApiResultOk");
7
+ exports.nextApiResponse = {
8
+ ok: function (data, msg) {
9
+ return server_1.NextResponse.json((0, createApiResultOk_1.default)(data, msg));
10
+ },
11
+ fail: function (data, msg, status) {
12
+ return server_1.NextResponse.json((0, createApiResultFail_1.default)(data, msg, status));
13
+ },
14
+ };
15
+ exports.default = exports.nextApiResponse;
@@ -0,0 +1,6 @@
1
+ import type { NextApiResponse } from "next";
2
+ export declare const nextApiResponse12: (nextRes: NextApiResponse) => {
3
+ ok<T>(data: T, msg?: string): void;
4
+ fail<T_1>(data: T_1, msg?: string, status?: number): void;
5
+ };
6
+ export default nextApiResponse12;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.nextApiResponse12 = void 0;
4
+ var createApiResultFail_1 = require("./createApiResultFail");
5
+ var createApiResultOk_1 = require("./createApiResultOk");
6
+ var nextApiResponse12 = function (nextRes) {
7
+ return {
8
+ ok: function (data, msg) {
9
+ nextRes.status(200).json((0, createApiResultOk_1.default)(data, msg));
10
+ },
11
+ fail: function (data, msg, status) {
12
+ nextRes
13
+ .status(status || 404)
14
+ .json((0, createApiResultFail_1.default)(data, msg, status));
15
+ },
16
+ };
17
+ };
18
+ exports.nextApiResponse12 = nextApiResponse12;
19
+ exports.default = exports.nextApiResponse12;
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "@koine/api",
3
+ "sideEffects": false,
4
+ "dependencies": {
5
+ "@koine/utils": "*"
6
+ },
7
+ "peerDependenciesMeta": {
8
+ "next": {
9
+ "optional": true
10
+ },
11
+ "swr": {
12
+ "optional": true
13
+ }
14
+ },
15
+ "main": "./index.js",
16
+ "types": "./index.d.ts"
17
+ }
package/createApi.d.ts CHANGED
@@ -1,8 +1,2 @@
1
- /**
2
- * Create api client
3
- *
4
- * @param apiName Short name to use in debug logs
5
- * @param baseUrl Either relativ eor absolute, it must end without trailing slash
6
- */
7
1
  export declare const createApi: <TEndpoints extends Koine.Api.Endpoints>(apiName: string, baseUrl: string, options?: Koine.Api.ClientOptions) => Koine.Api.Client<TEndpoints>;
8
2
  export default createApi;
package/createApi.js CHANGED
@@ -1,35 +1,17 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createApi = void 0;
4
- var tslib_1 = require("tslib");
5
- var buildUrlQueryString_1 = require("@koine/utils/buildUrlQueryString");
6
- var isFullObject_1 = require("@koine/utils/isFullObject");
7
- var errorToString_1 = require("@koine/utils/errorToString");
8
- /**
9
- * Create api client
10
- *
11
- * @param apiName Short name to use in debug logs
12
- * @param baseUrl Either relativ eor absolute, it must end without trailing slash
13
- */
14
- var createApi = function (apiName, baseUrl, options) {
15
- var _a = options || {}, _b = _a.headers, headersBase = _b === void 0 ? {} : _b, _c = _a.request, requestBase = _c === void 0 ? {
16
- referrerPolicy: "no-referrer",
17
- // credentials: "include",
18
- // mode: "cors",
19
- // redirect: "follow",
20
- // cache: "no-cache",
21
- } : _c, throwErrBase = _a.throwErr, _d = _a.timeout, timeoutBase = _d === void 0 ? 10000 : _d, processReqBase = _a.processReq, processResBase = _a.processRes, processErrBase = _a.processErr;
1
+ import { __assign, __awaiter, __generator } from "tslib";
2
+ import { buildUrlQueryString, errorToString, isFullObject, } from "@koine/utils";
3
+ export var createApi = function (apiName, baseUrl, options) {
4
+ var _a = options || {}, _b = _a.headers, headersBase = _b === void 0 ? {} : _b, _c = _a.request, requestBase = _c === void 0 ? {} : _c, throwErrBase = _a.throwErr, _d = _a.timeout, timeoutBase = _d === void 0 ? 10000 : _d, processReqBase = _a.processReq, processResBase = _a.processRes, processErrBase = _a.processErr;
22
5
  return ["get", "post", "put", "patch", "delete"].reduce(function (api, method) {
23
- // @ts-expect-error FIXME: type
24
- api[method] = function (endpoint, options) { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
6
+ api[method] = function (endpoint, options) { return __awaiter(void 0, void 0, void 0, function () {
25
7
  var _a, _b, request, _c, headers, _d, timeout, processReq, _e, processRes, _f, processErr, _g, throwErr, _h, params, json, query, url, requestInit, transformed, transformed, key, timeoutNumber, controller, timeoutId, response, result, msg, e_1, e_2, logMsg;
26
- return tslib_1.__generator(this, function (_j) {
8
+ return __generator(this, function (_j) {
27
9
  switch (_j.label) {
28
10
  case 0:
29
11
  _a = options || {}, _b = _a.request, request = _b === void 0 ? requestBase : _b, _c = _a.headers, headers = _c === void 0 ? headersBase : _c, _d = _a.timeout, timeout = _d === void 0 ? timeoutBase : _d, processReq = _a.processReq, _e = _a.processRes, processRes = _e === void 0 ? processResBase : _e, _f = _a.processErr, processErr = _f === void 0 ? processErrBase : _f, _g = _a.throwErr, throwErr = _g === void 0 ? throwErrBase : _g;
30
12
  _h = options || {}, params = _h.params, json = _h.json, query = _h.query;
31
13
  url = "".concat(baseUrl, "/").concat(endpoint + "".replace(/^\/*/, ""));
32
- requestInit = tslib_1.__assign(tslib_1.__assign({ method: method.toUpperCase() }, request), { headers: tslib_1.__assign({ "content-type": "application/json" }, headers) });
14
+ requestInit = __assign(__assign({ method: method.toUpperCase() }, request), { headers: __assign({ "content-type": "application/json" }, headers) });
33
15
  if (processReqBase) {
34
16
  transformed = processReqBase(method, url, query, json, params, requestInit);
35
17
  url = transformed[0];
@@ -46,7 +28,7 @@ var createApi = function (apiName, baseUrl, options) {
46
28
  params = transformed[3];
47
29
  requestInit = transformed[4];
48
30
  }
49
- if ((0, isFullObject_1.default)(params)) {
31
+ if (isFullObject(params)) {
50
32
  for (key in params) {
51
33
  url = url.replace("{".concat(key, "}"), params[key].toString());
52
34
  }
@@ -61,8 +43,7 @@ var createApi = function (apiName, baseUrl, options) {
61
43
  requestInit.signal = controller.signal;
62
44
  }
63
45
  if (query) {
64
- // FIXME: ts-expect-error this assertion is not the best, but nevermind for now
65
- url += (0, buildUrlQueryString_1.default)(query);
46
+ url += buildUrlQueryString(query);
66
47
  }
67
48
  response = null;
68
49
  result = null;
@@ -70,49 +51,44 @@ var createApi = function (apiName, baseUrl, options) {
70
51
  _j.label = 1;
71
52
  case 1:
72
53
  _j.trys.push([1, 3, , 4]);
73
- return [4 /*yield*/, fetch(url, requestInit)];
54
+ return [4, fetch(url, requestInit)];
74
55
  case 2:
75
56
  response = _j.sent();
76
- return [3 /*break*/, 4];
57
+ return [3, 4];
77
58
  case 3:
78
59
  e_1 = _j.sent();
79
- msg = (0, errorToString_1.default)(e_1);
80
- return [3 /*break*/, 4];
60
+ msg = errorToString(e_1);
61
+ return [3, 4];
81
62
  case 4:
82
63
  if (timeoutId) {
83
64
  clearTimeout(timeoutId);
84
65
  }
85
- if (!response) return [3 /*break*/, 11];
66
+ if (!response) return [3, 11];
86
67
  _j.label = 5;
87
68
  case 5:
88
69
  _j.trys.push([5, 10, , 11]);
89
- if (!processRes) return [3 /*break*/, 7];
90
- return [4 /*yield*/, processRes(response, options || {})];
70
+ if (!processRes) return [3, 7];
71
+ return [4, processRes(response, options || {})];
91
72
  case 6:
92
73
  result = _j.sent();
93
- return [3 /*break*/, 9];
94
- case 7: return [4 /*yield*/, response.json()];
74
+ return [3, 9];
75
+ case 7: return [4, response.json()];
95
76
  case 8:
96
77
  result = _j.sent();
97
78
  _j.label = 9;
98
- case 9: return [3 /*break*/, 11];
79
+ case 9: return [3, 11];
99
80
  case 10:
100
81
  e_2 = _j.sent();
101
- msg = (0, errorToString_1.default)(e_2);
102
- return [3 /*break*/, 11];
82
+ msg = errorToString(e_2);
83
+ return [3, 11];
103
84
  case 11:
104
- if (!(result === null)) return [3 /*break*/, 14];
105
- if (!processErr) return [3 /*break*/, 13];
106
- return [4 /*yield*/, processErr(msg, options || {})];
85
+ if (!(result === null)) return [3, 14];
86
+ if (!processErr) return [3, 13];
87
+ return [4, processErr(msg, options || {})];
107
88
  case 12:
108
89
  result = _j.sent();
109
- return [3 /*break*/, 14];
90
+ return [3, 14];
110
91
  case 13:
111
- // this error should only happen on network errors or wrong API urls
112
- // there is no specific HTTP error for this, we can consider these
113
- // two statuses though:
114
- // - [100 Continue](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/100)
115
- // - [501 Not Implemented](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/501)
116
92
  result = {
117
93
  data: null,
118
94
  msg: msg,
@@ -123,12 +99,9 @@ var createApi = function (apiName, baseUrl, options) {
123
99
  _j.label = 14;
124
100
  case 14:
125
101
  if (throwErr && (result === null || result === void 0 ? void 0 : result.fail)) {
126
- // throw new ApiError<Failed>(result);
127
- // I prefer to throw an object literal despite what eslint says
128
- // eslint-disable-next-line no-throw-literal
129
102
  throw result;
130
103
  }
131
- if (process.env["NODE_ENV"] !== "production") {
104
+ if (process.env["NODE_ENV"] === "development") {
132
105
  logMsg = "".concat(result === null || result === void 0 ? void 0 : result.status, ": api[").concat(apiName, "] ").concat(method.toUpperCase(), " ").concat(url);
133
106
  if (result === null || result === void 0 ? void 0 : result.ok) {
134
107
  console.info("\uD83D\uDFE2 ".concat(logMsg));
@@ -137,12 +110,11 @@ var createApi = function (apiName, baseUrl, options) {
137
110
  console.info("\uD83D\uDD34 ".concat(logMsg));
138
111
  }
139
112
  }
140
- return [2 /*return*/, result];
113
+ return [2, result];
141
114
  }
142
115
  });
143
116
  }); };
144
117
  return api;
145
118
  }, {});
146
119
  };
147
- exports.createApi = createApi;
148
- exports.default = exports.createApi;
120
+ export default createApi;
@@ -0,0 +1,2 @@
1
+ export declare const createApiResultFail: <T>(data?: T, msg?: string, status?: number) => Koine.Api.ResultFail<T>;
2
+ export default createApiResultFail;
@@ -0,0 +1,10 @@
1
+ export var createApiResultFail = function (data, msg, status) {
2
+ if (data === void 0) { data = {}; }
3
+ return ({
4
+ fail: true,
5
+ data: data,
6
+ msg: msg || "",
7
+ status: status || 404,
8
+ });
9
+ };
10
+ export default createApiResultFail;
@@ -0,0 +1,2 @@
1
+ export declare const createApiResultOk: <T>(data?: T, msg?: string) => Koine.Api.ResultOk<T>;
2
+ export default createApiResultOk;