@zayne-labs/callapi-plugins 3.0.2 → 3.1.0

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.
@@ -18,7 +18,15 @@ type LoggerOptions = {
18
18
  * Enable or disable the logger
19
19
  * @default true
20
20
  */
21
- enabled?: boolean;
21
+ enabled?: boolean | {
22
+ onRequest?: boolean;
23
+ onRequestError?: boolean;
24
+ onResponse?: boolean;
25
+ onResponseError?: boolean;
26
+ onRetry?: boolean;
27
+ onSuccess?: boolean;
28
+ onValidationError?: boolean;
29
+ };
22
30
  /**
23
31
  * Enable or disable verbose mode
24
32
  */
@@ -62,6 +70,10 @@ declare const loggerPlugin: (options?: LoggerOptions) => {
62
70
  data: never;
63
71
  response: Response;
64
72
  } & _zayne_labs_callapi0.PluginExtraOptions<unknown>) => void;
73
+ onValidationError: (ctx: _zayne_labs_callapi0.RequestContext & {
74
+ error: _zayne_labs_callapi0.ValidationError;
75
+ response: Response | null;
76
+ } & _zayne_labs_callapi0.PluginExtraOptions<unknown>) => void;
65
77
  };
66
78
  };
67
79
  //#endregion
package/dist/esm/index.js CHANGED
@@ -1,74 +1,79 @@
1
1
  import { definePlugin } from "@zayne-labs/callapi";
2
+ import { isBoolean } from "@zayne-labs/toolkit-type-helpers";
2
3
  import { createConsola } from "consola";
3
4
 
4
5
  //#region src/logger/constants.ts
5
- const statusTextMap = new Map([
6
- [100, "Continue"],
7
- [101, "Switching Protocols"],
8
- [102, "Processing"],
9
- [200, "OK"],
10
- [201, "Created"],
11
- [202, "Accepted"],
12
- [203, "Non-Authoritative Information"],
13
- [204, "No Content"],
14
- [205, "Reset Content"],
15
- [206, "Partial Content"],
16
- [207, "Multi-Status"],
17
- [208, "Already Reported"],
18
- [226, "IM Used"],
19
- [300, "Multiple Choices"],
20
- [301, "Moved Permanently"],
21
- [302, "Found"],
22
- [303, "See Other"],
23
- [304, "Not Modified"],
24
- [305, "Use Proxy"],
25
- [307, "Temporary Redirect"],
26
- [308, "Permanent Redirect"],
27
- [400, "Bad Request"],
28
- [401, "Unauthorized"],
29
- [402, "Payment Required"],
30
- [403, "Forbidden"],
31
- [404, "Not Found"],
32
- [405, "Method Not Allowed"],
33
- [406, "Not Acceptable"],
34
- [407, "Proxy Authentication Required"],
35
- [408, "Request Timeout"],
36
- [409, "Conflict"],
37
- [410, "Gone"],
38
- [411, "Length Required"],
39
- [412, "Precondition Failed"],
40
- [413, "Payload Too Large"],
41
- [414, "URI Too Long"],
42
- [415, "Unsupported Media Type"],
43
- [416, "Range Not Satisfiable"],
44
- [417, "Expectation Failed"],
45
- [418, "I'm a teapot"],
46
- [421, "Misdirected Request"],
47
- [422, "Unprocessable Entity"],
48
- [423, "Locked"],
49
- [424, "Failed Dependency"],
50
- [425, "Too Early"],
51
- [426, "Upgrade Required"],
52
- [428, "Precondition Required"],
53
- [429, "Too Many Requests"],
54
- [431, "Request Header Fields Too Large"],
55
- [451, "Unavailable For Legal Reasons"],
56
- [500, "Internal Server Error"],
57
- [501, "Not Implemented"],
58
- [502, "Bad Gateway"],
59
- [503, "Service Unavailable"],
60
- [504, "Gateway Timeout"],
61
- [505, "HTTP Version Not Supported"],
62
- [506, "Variant Also Negotiates"],
63
- [507, "Insufficient Storage"],
64
- [508, "Loop Detected"],
65
- [510, "Not Extended"],
66
- [511, "Network Authentication Required"]
67
- ]);
6
+ const getStatusTextMap = () => {
7
+ return new Map([
8
+ [100, "Continue"],
9
+ [101, "Switching Protocols"],
10
+ [102, "Processing"],
11
+ [200, "OK"],
12
+ [201, "Created"],
13
+ [202, "Accepted"],
14
+ [203, "Non-Authoritative Information"],
15
+ [204, "No Content"],
16
+ [205, "Reset Content"],
17
+ [206, "Partial Content"],
18
+ [207, "Multi-Status"],
19
+ [208, "Already Reported"],
20
+ [226, "IM Used"],
21
+ [300, "Multiple Choices"],
22
+ [301, "Moved Permanently"],
23
+ [302, "Found"],
24
+ [303, "See Other"],
25
+ [304, "Not Modified"],
26
+ [305, "Use Proxy"],
27
+ [307, "Temporary Redirect"],
28
+ [308, "Permanent Redirect"],
29
+ [400, "Bad Request"],
30
+ [401, "Unauthorized"],
31
+ [402, "Payment Required"],
32
+ [403, "Forbidden"],
33
+ [404, "Not Found"],
34
+ [405, "Method Not Allowed"],
35
+ [406, "Not Acceptable"],
36
+ [407, "Proxy Authentication Required"],
37
+ [408, "Request Timeout"],
38
+ [409, "Conflict"],
39
+ [410, "Gone"],
40
+ [411, "Length Required"],
41
+ [412, "Precondition Failed"],
42
+ [413, "Payload Too Large"],
43
+ [414, "URI Too Long"],
44
+ [415, "Unsupported Media Type"],
45
+ [416, "Range Not Satisfiable"],
46
+ [417, "Expectation Failed"],
47
+ [418, "I'm a teapot"],
48
+ [421, "Misdirected Request"],
49
+ [422, "Unprocessable Entity"],
50
+ [423, "Locked"],
51
+ [424, "Failed Dependency"],
52
+ [425, "Too Early"],
53
+ [426, "Upgrade Required"],
54
+ [428, "Precondition Required"],
55
+ [429, "Too Many Requests"],
56
+ [431, "Request Header Fields Too Large"],
57
+ [451, "Unavailable For Legal Reasons"],
58
+ [500, "Internal Server Error"],
59
+ [501, "Not Implemented"],
60
+ [502, "Bad Gateway"],
61
+ [503, "Service Unavailable"],
62
+ [504, "Gateway Timeout"],
63
+ [505, "HTTP Version Not Supported"],
64
+ [506, "Variant Also Negotiates"],
65
+ [507, "Insufficient Storage"],
66
+ [508, "Loop Detected"],
67
+ [510, "Not Extended"],
68
+ [511, "Network Authentication Required"]
69
+ ]);
70
+ };
68
71
 
69
72
  //#endregion
70
73
  //#region src/logger/utils.ts
71
- const getStatusText = (status) => statusTextMap.get(status) ?? "Unknown";
74
+ const getStatusText = (status) => {
75
+ return getStatusTextMap().get(status) ?? "Unknown";
76
+ };
72
77
 
73
78
  //#endregion
74
79
  //#region src/logger/logger.ts
@@ -91,29 +96,34 @@ const loggerPlugin = definePlugin((options) => {
91
96
  return {
92
97
  id: "logger",
93
98
  name: "Logger",
94
- version: "1.0.0",
99
+ version: "1.1.0",
95
100
  hooks: {
96
101
  onRequest: (ctx) => {
97
- if (!enabled) return;
102
+ if (!(isBoolean(enabled) ? enabled : enabled.onRequest === true)) return;
98
103
  consoleObject.log(`Request being sent to: ${ctx.options.fullURL}`);
99
104
  },
100
105
  onRequestError: (ctx) => {
101
- if (!enabled) return;
106
+ if (!(isBoolean(enabled) ? enabled : enabled.onRequestError === true)) return;
102
107
  (consoleObject.fail ?? consoleObject.error)(`Request to failed with error: ${ctx.error.name}`);
103
108
  verbose && consoleObject.error(ctx.error.errorData);
104
109
  },
105
110
  onResponseError: (ctx) => {
106
- if (!enabled) return;
111
+ if (!(isBoolean(enabled) ? enabled : enabled.onResponseError === true)) return;
107
112
  (consoleObject.fail ?? consoleObject.error)("Request failed with status: ", ctx.response.status, `(${ctx.response.statusText || getStatusText(ctx.response.status)})`);
108
113
  verbose && consoleObject.error(ctx.error.errorData);
109
114
  },
110
115
  onRetry: (ctx) => {
111
- if (!enabled) return;
116
+ if (!(isBoolean(enabled) ? enabled : enabled.onRetry === true)) return;
112
117
  (consoleObject.warn ?? consoleObject.log)(`Retrying request... Attempt: `, ctx.retryAttemptCount);
113
118
  },
114
119
  onSuccess: (ctx) => {
115
- if (!enabled) return;
120
+ if (!(isBoolean(enabled) ? enabled : enabled.onSuccess === true)) return;
116
121
  (consoleObject.success ?? consoleObject.log)("Request succeeded", ctx.data);
122
+ },
123
+ onValidationError: (ctx) => {
124
+ if (!(isBoolean(enabled) ? enabled : enabled.onValidationError === true)) return;
125
+ (consoleObject.fail ?? consoleObject.error)(`Request validation failed with error: ${ctx.error.name}`);
126
+ verbose && consoleObject.error(ctx.error.errorData);
117
127
  }
118
128
  }
119
129
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["defaultConsoleObject: ConsoleLikeObject"],"sources":["../../src/logger/constants.ts","../../src/logger/utils.ts","../../src/logger/logger.ts"],"sourcesContent":["export const statusTextMap = new Map<number, string>([\n\t[100, \"Continue\"],\n\t[101, \"Switching Protocols\"],\n\t[102, \"Processing\"],\n\t[200, \"OK\"],\n\t[201, \"Created\"],\n\t[202, \"Accepted\"],\n\t[203, \"Non-Authoritative Information\"],\n\t[204, \"No Content\"],\n\t[205, \"Reset Content\"],\n\t[206, \"Partial Content\"],\n\t[207, \"Multi-Status\"],\n\t[208, \"Already Reported\"],\n\t[226, \"IM Used\"],\n\t[300, \"Multiple Choices\"],\n\t[301, \"Moved Permanently\"],\n\t[302, \"Found\"],\n\t[303, \"See Other\"],\n\t[304, \"Not Modified\"],\n\t[305, \"Use Proxy\"],\n\t[307, \"Temporary Redirect\"],\n\t[308, \"Permanent Redirect\"],\n\t[400, \"Bad Request\"],\n\t[401, \"Unauthorized\"],\n\t[402, \"Payment Required\"],\n\t[403, \"Forbidden\"],\n\t[404, \"Not Found\"],\n\t[405, \"Method Not Allowed\"],\n\t[406, \"Not Acceptable\"],\n\t[407, \"Proxy Authentication Required\"],\n\t[408, \"Request Timeout\"],\n\t[409, \"Conflict\"],\n\t[410, \"Gone\"],\n\t[411, \"Length Required\"],\n\t[412, \"Precondition Failed\"],\n\t[413, \"Payload Too Large\"],\n\t[414, \"URI Too Long\"],\n\t[415, \"Unsupported Media Type\"],\n\t[416, \"Range Not Satisfiable\"],\n\t[417, \"Expectation Failed\"],\n\t[418, \"I'm a teapot\"],\n\t[421, \"Misdirected Request\"],\n\t[422, \"Unprocessable Entity\"],\n\t[423, \"Locked\"],\n\t[424, \"Failed Dependency\"],\n\t[425, \"Too Early\"],\n\t[426, \"Upgrade Required\"],\n\t[428, \"Precondition Required\"],\n\t[429, \"Too Many Requests\"],\n\t[431, \"Request Header Fields Too Large\"],\n\t[451, \"Unavailable For Legal Reasons\"],\n\t[500, \"Internal Server Error\"],\n\t[501, \"Not Implemented\"],\n\t[502, \"Bad Gateway\"],\n\t[503, \"Service Unavailable\"],\n\t[504, \"Gateway Timeout\"],\n\t[505, \"HTTP Version Not Supported\"],\n\t[506, \"Variant Also Negotiates\"],\n\t[507, \"Insufficient Storage\"],\n\t[508, \"Loop Detected\"],\n\t[510, \"Not Extended\"],\n\t[511, \"Network Authentication Required\"],\n]);\n","import { statusTextMap } from \"./constants\";\n\nexport const getStatusText = (status: number) => statusTextMap.get(status) ?? \"Unknown\";\n","import { definePlugin } from \"@zayne-labs/callapi\";\nimport type { AnyFunction } from \"@zayne-labs/toolkit-type-helpers\";\nimport { createConsola } from \"consola\";\nimport { getStatusText } from \"./utils\";\n\ntype ConsoleLikeObject = {\n\terror: AnyFunction<void>;\n\tfail?: AnyFunction<void>;\n\tlog: AnyFunction<void>;\n\tsuccess?: AnyFunction<void>;\n\twarn?: AnyFunction<void>;\n};\n\nconst consola = createConsola({\n\tformatOptions: {\n\t\tcolors: true,\n\t\tcolumns: 80,\n\t\tcompact: 10,\n\t\tdate: false,\n\t\tfancy: true,\n\t},\n});\n\nexport type LoggerOptions = {\n\t/**\n\t * Custom console object\n\t */\n\tconsoleObject?: ConsoleLikeObject;\n\t/**\n\t * Enable or disable the logger\n\t * @default true\n\t */\n\tenabled?: boolean;\n\t/**\n\t * Enable or disable verbose mode\n\t */\n\tverbose?: boolean;\n};\n\n/* eslint-disable ts-eslint/no-unsafe-argument -- Ignore for now */\nexport const defaultConsoleObject: ConsoleLikeObject = {\n\terror: (...args) => consola.error(\"\", ...args),\n\tfail: (...args) => consola.fail(\"\", ...args),\n\tlog: (...args) => consola.info(\"\", ...args),\n\tsuccess: (...args) => consola.success(\"\", ...args),\n\twarn: (...args) => consola.warn(\"\", ...args),\n};\n/* eslint-enable ts-eslint/no-unsafe-argument -- Ignore for now */\n\nexport const loggerPlugin = definePlugin((options?: LoggerOptions) => {\n\tconst { consoleObject = defaultConsoleObject, enabled = true, verbose } = options ?? {};\n\n\treturn {\n\t\t/* eslint-disable perfectionist/sort-objects -- Ignore for now */\n\t\tid: \"logger\",\n\t\tname: \"Logger\",\n\t\tversion: \"1.0.0\",\n\n\t\thooks: {\n\t\t\t/* eslint-enable perfectionist/sort-objects -- Ignore */\n\t\t\tonRequest: (ctx) => {\n\t\t\t\tif (!enabled) return;\n\n\t\t\t\tconsoleObject.log(`Request being sent to: ${ctx.options.fullURL}`);\n\t\t\t},\n\n\t\t\tonRequestError: (ctx) => {\n\t\t\t\tif (!enabled) return;\n\n\t\t\t\tconst log = consoleObject.fail ?? consoleObject.error;\n\n\t\t\t\tlog(`Request to failed with error: ${ctx.error.name}`);\n\n\t\t\t\tverbose && consoleObject.error(ctx.error.errorData);\n\t\t\t},\n\n\t\t\tonResponseError: (ctx) => {\n\t\t\t\tif (!enabled) return;\n\n\t\t\t\tconst log = consoleObject.fail ?? consoleObject.error;\n\n\t\t\t\tlog(\n\t\t\t\t\t\"Request failed with status: \",\n\t\t\t\t\tctx.response.status,\n\t\t\t\t\t`(${ctx.response.statusText || getStatusText(ctx.response.status)})`\n\t\t\t\t);\n\n\t\t\t\tverbose && consoleObject.error(ctx.error.errorData);\n\t\t\t},\n\n\t\t\tonRetry: (ctx) => {\n\t\t\t\tif (!enabled) return;\n\n\t\t\t\tconst log = consoleObject.warn ?? consoleObject.log;\n\n\t\t\t\tlog(`Retrying request... Attempt: `, ctx.retryAttemptCount);\n\t\t\t},\n\n\t\t\tonSuccess: (ctx) => {\n\t\t\t\tif (!enabled) return;\n\n\t\t\t\tconst log = consoleObject.success ?? consoleObject.log;\n\n\t\t\t\tlog(\"Request succeeded\", ctx.data);\n\t\t\t},\n\t\t},\n\t};\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["defaultConsoleObject: ConsoleLikeObject"],"sources":["../../src/logger/constants.ts","../../src/logger/utils.ts","../../src/logger/logger.ts"],"sourcesContent":["export const getStatusTextMap = () => {\n\treturn new Map<number, string>([\n\t\t[100, \"Continue\"],\n\t\t[101, \"Switching Protocols\"],\n\t\t[102, \"Processing\"],\n\t\t[200, \"OK\"],\n\t\t[201, \"Created\"],\n\t\t[202, \"Accepted\"],\n\t\t[203, \"Non-Authoritative Information\"],\n\t\t[204, \"No Content\"],\n\t\t[205, \"Reset Content\"],\n\t\t[206, \"Partial Content\"],\n\t\t[207, \"Multi-Status\"],\n\t\t[208, \"Already Reported\"],\n\t\t[226, \"IM Used\"],\n\t\t[300, \"Multiple Choices\"],\n\t\t[301, \"Moved Permanently\"],\n\t\t[302, \"Found\"],\n\t\t[303, \"See Other\"],\n\t\t[304, \"Not Modified\"],\n\t\t[305, \"Use Proxy\"],\n\t\t[307, \"Temporary Redirect\"],\n\t\t[308, \"Permanent Redirect\"],\n\t\t[400, \"Bad Request\"],\n\t\t[401, \"Unauthorized\"],\n\t\t[402, \"Payment Required\"],\n\t\t[403, \"Forbidden\"],\n\t\t[404, \"Not Found\"],\n\t\t[405, \"Method Not Allowed\"],\n\t\t[406, \"Not Acceptable\"],\n\t\t[407, \"Proxy Authentication Required\"],\n\t\t[408, \"Request Timeout\"],\n\t\t[409, \"Conflict\"],\n\t\t[410, \"Gone\"],\n\t\t[411, \"Length Required\"],\n\t\t[412, \"Precondition Failed\"],\n\t\t[413, \"Payload Too Large\"],\n\t\t[414, \"URI Too Long\"],\n\t\t[415, \"Unsupported Media Type\"],\n\t\t[416, \"Range Not Satisfiable\"],\n\t\t[417, \"Expectation Failed\"],\n\t\t[418, \"I'm a teapot\"],\n\t\t[421, \"Misdirected Request\"],\n\t\t[422, \"Unprocessable Entity\"],\n\t\t[423, \"Locked\"],\n\t\t[424, \"Failed Dependency\"],\n\t\t[425, \"Too Early\"],\n\t\t[426, \"Upgrade Required\"],\n\t\t[428, \"Precondition Required\"],\n\t\t[429, \"Too Many Requests\"],\n\t\t[431, \"Request Header Fields Too Large\"],\n\t\t[451, \"Unavailable For Legal Reasons\"],\n\t\t[500, \"Internal Server Error\"],\n\t\t[501, \"Not Implemented\"],\n\t\t[502, \"Bad Gateway\"],\n\t\t[503, \"Service Unavailable\"],\n\t\t[504, \"Gateway Timeout\"],\n\t\t[505, \"HTTP Version Not Supported\"],\n\t\t[506, \"Variant Also Negotiates\"],\n\t\t[507, \"Insufficient Storage\"],\n\t\t[508, \"Loop Detected\"],\n\t\t[510, \"Not Extended\"],\n\t\t[511, \"Network Authentication Required\"],\n\t]);\n};\n","import { getStatusTextMap } from \"./constants\";\n\nexport const getStatusText = (status: number) => {\n\tconst statusTextMap = getStatusTextMap();\n\n\tconst statusText = statusTextMap.get(status) ?? \"Unknown\";\n\n\treturn statusText;\n};\n","import { definePlugin } from \"@zayne-labs/callapi\";\nimport { type AnyFunction, isBoolean } from \"@zayne-labs/toolkit-type-helpers\";\nimport { createConsola } from \"consola\";\nimport { getStatusText } from \"./utils\";\n\ntype ConsoleLikeObject = {\n\terror: AnyFunction<void>;\n\tfail?: AnyFunction<void>;\n\tlog: AnyFunction<void>;\n\tsuccess?: AnyFunction<void>;\n\twarn?: AnyFunction<void>;\n};\n\nconst consola = createConsola({\n\tformatOptions: {\n\t\tcolors: true,\n\t\tcolumns: 80,\n\t\tcompact: 10,\n\t\tdate: false,\n\t\tfancy: true,\n\t},\n});\n\nexport type LoggerOptions = {\n\t/**\n\t * Custom console object\n\t */\n\tconsoleObject?: ConsoleLikeObject;\n\t/**\n\t * Enable or disable the logger\n\t * @default true\n\t */\n\tenabled?:\n\t\t| boolean\n\t\t| {\n\t\t\t\tonRequest?: boolean;\n\t\t\t\tonRequestError?: boolean;\n\t\t\t\tonResponse?: boolean;\n\t\t\t\tonResponseError?: boolean;\n\t\t\t\tonRetry?: boolean;\n\t\t\t\tonSuccess?: boolean;\n\t\t\t\tonValidationError?: boolean;\n\t\t };\n\t/**\n\t * Enable or disable verbose mode\n\t */\n\tverbose?: boolean;\n};\n\n/* eslint-disable ts-eslint/no-unsafe-argument -- Ignore for now */\nexport const defaultConsoleObject: ConsoleLikeObject = {\n\terror: (...args) => consola.error(\"\", ...args),\n\tfail: (...args) => consola.fail(\"\", ...args),\n\tlog: (...args) => consola.info(\"\", ...args),\n\tsuccess: (...args) => consola.success(\"\", ...args),\n\twarn: (...args) => consola.warn(\"\", ...args),\n};\n/* eslint-enable ts-eslint/no-unsafe-argument -- Ignore for now */\n\nexport const loggerPlugin = definePlugin((options?: LoggerOptions) => {\n\tconst { consoleObject = defaultConsoleObject, enabled = true, verbose } = options ?? {};\n\n\treturn {\n\t\t/* eslint-disable perfectionist/sort-objects -- Ignore for now */\n\t\tid: \"logger\",\n\t\tname: \"Logger\",\n\t\tversion: \"1.1.0\",\n\n\t\thooks: {\n\t\t\t/* eslint-enable perfectionist/sort-objects -- Ignore */\n\t\t\tonRequest: (ctx) => {\n\t\t\t\tconst isEnabled = isBoolean(enabled) ? enabled : enabled.onRequest === true;\n\n\t\t\t\tif (!isEnabled) return;\n\n\t\t\t\tconsoleObject.log(`Request being sent to: ${ctx.options.fullURL}`);\n\t\t\t},\n\n\t\t\tonRequestError: (ctx) => {\n\t\t\t\tconst isEnabled = isBoolean(enabled) ? enabled : enabled.onRequestError === true;\n\n\t\t\t\tif (!isEnabled) return;\n\n\t\t\t\tconst log = consoleObject.fail ?? consoleObject.error;\n\n\t\t\t\tlog(`Request to failed with error: ${ctx.error.name}`);\n\n\t\t\t\tverbose && consoleObject.error(ctx.error.errorData);\n\t\t\t},\n\n\t\t\tonResponseError: (ctx) => {\n\t\t\t\tconst isEnabled = isBoolean(enabled) ? enabled : enabled.onResponseError === true;\n\n\t\t\t\tif (!isEnabled) return;\n\n\t\t\t\tconst log = consoleObject.fail ?? consoleObject.error;\n\n\t\t\t\tlog(\n\t\t\t\t\t\"Request failed with status: \",\n\t\t\t\t\tctx.response.status,\n\t\t\t\t\t`(${ctx.response.statusText || getStatusText(ctx.response.status)})`\n\t\t\t\t);\n\n\t\t\t\tverbose && consoleObject.error(ctx.error.errorData);\n\t\t\t},\n\n\t\t\tonRetry: (ctx) => {\n\t\t\t\tconst isEnabled = isBoolean(enabled) ? enabled : enabled.onRetry === true;\n\n\t\t\t\tif (!isEnabled) return;\n\n\t\t\t\tconst log = consoleObject.warn ?? consoleObject.log;\n\n\t\t\t\tlog(`Retrying request... Attempt: `, ctx.retryAttemptCount);\n\t\t\t},\n\n\t\t\tonSuccess: (ctx) => {\n\t\t\t\tconst isEnabled = isBoolean(enabled) ? enabled : enabled.onSuccess === true;\n\n\t\t\t\tif (!isEnabled) return;\n\n\t\t\t\tconst log = consoleObject.success ?? consoleObject.log;\n\n\t\t\t\tlog(\"Request succeeded\", ctx.data);\n\t\t\t},\n\n\t\t\tonValidationError: (ctx) => {\n\t\t\t\tconst isEnabled = isBoolean(enabled) ? enabled : enabled.onValidationError === true;\n\n\t\t\t\tif (!isEnabled) return;\n\n\t\t\t\tconst log = consoleObject.fail ?? consoleObject.error;\n\n\t\t\t\tlog(`Request validation failed with error: ${ctx.error.name}`);\n\n\t\t\t\tverbose && consoleObject.error(ctx.error.errorData);\n\t\t\t},\n\t\t},\n\t};\n});\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@zayne-labs/callapi-plugins",
3
3
  "type": "module",
4
- "version": "3.0.2",
4
+ "version": "3.1.0",
5
5
  "description": "A collection of plugins for callapi",
6
6
  "author": "Ryan Zayne",
7
7
  "license": "MIT",
@@ -33,7 +33,7 @@
33
33
  "concurrently": "^9.2.1",
34
34
  "consola": "3.4.2",
35
35
  "cross-env": "^10.0.0",
36
- "publint": "^0.3.12",
36
+ "publint": "^0.3.13",
37
37
  "size-limit": "11.2.0",
38
38
  "tsdown": "^0.15.2",
39
39
  "typescript": "5.9.2",