@cybearl/cypack 1.8.8 → 1.8.9

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.d.ts CHANGED
@@ -34,6 +34,181 @@ declare const CyCONSTANTS: {
34
34
  IMG_SIZES_LOW_QUALITY: string;
35
35
  };
36
36
 
37
+ /**
38
+ * The type definition for an error object.
39
+ */
40
+ type ErrorObj = {
41
+ status: number
42
+ name: string
43
+ message: string
44
+ data: unknown
45
+ }
46
+
47
+ /**
48
+ * The type for a successful request, containing the data of type T.
49
+ *
50
+ * The reason for the duplicate `success` field is to allow for the `SuccessfulRequest` type to be used
51
+ * directly.
52
+ */
53
+ type SuccessfulRequest<T> = {
54
+ success: true
55
+ data: T
56
+ }
57
+
58
+ /**
59
+ * The type for a failed request, containing the error message and the error object.
60
+ *
61
+ * The reason for the duplicate `success` field is to allow for the `FailedRequest` type to be used
62
+ * directly.
63
+ */
64
+ type FailedRequest = {
65
+ success: false
66
+ message: string
67
+ error: ErrorObj
68
+ }
69
+
70
+ /**
71
+ * Returns a failed request in case the `success` field is set to `false`,
72
+ * otherwise returns a successful request with a data object of type T.
73
+ *
74
+ * **Example**:
75
+ * ```ts
76
+ * export async function inviteUser(): Promise<RequestResult<Access>>
77
+ * ```
78
+ * - Will return the "Access" type if result.success is true.
79
+ * - Otherwise, will return the "FailedRequest" type.
80
+ */
81
+ type RequestResult<T> = ({ success: true } & SuccessfulRequest<T>) | ({ success: false } & FailedRequest)
82
+
83
+ /**
84
+ * Formats an `ErrorObj` into a standard error sent back by an API endpoint.
85
+ */
86
+ declare function formatErrorResponse(error: ErrorObj, customMessage?: string, additionalData?: unknown): {
87
+ success: boolean;
88
+ message: string;
89
+ error: ErrorObj;
90
+ };
91
+ /**
92
+ * Formats an `ErrorObj` and stringifies it for it to be supported by the `Error` class.
93
+ * @param error The `ErrorObj` object to format.
94
+ * @param message Replaces the standard error message with a custom one (optional).
95
+ * @param additionalData Additional data to include in the error (optional).
96
+ * @returns The formatted error string.
97
+ */
98
+ declare function stringifyError(error: ErrorObj, message?: string, additionalData?: unknown): string;
99
+ /**
100
+ * Parse the error of a CRUD call and return a standardized error.
101
+ * @param error The error to parse.
102
+ * @returns The standardized error object.
103
+ */
104
+ declare function parseCRUDError(error: unknown): FailedRequest;
105
+ /**
106
+ * Formats a message and an error object into a JSON string that follows the `FailedRequest` standard,
107
+ * the goal is to not end up with special characters such as newlines in the message, so it can be parsed
108
+ * back into an object without issues.
109
+ * @param message The message to format.
110
+ * @param error The error object to format.
111
+ * @returns The formatted JSON string.
112
+ */
113
+ declare function formatMessageAsStringifiedError(message: string, error?: unknown): string;
114
+ /**
115
+ * Contains all the standard available errors for the application, it serves as a base
116
+ * to extend with your custom errors.
117
+ *
118
+ * The recommended way is to create an `AppErrors` object that extends this one, preferably
119
+ * at a place similar to `lib/utils/errors.ts`:
120
+ * ```typescript
121
+ * import { BaseErrors } from "..."
122
+ *
123
+ * export const AppErrors = {
124
+ * ...BaseErrors,
125
+ * //=====//
126
+ * // 401 //
127
+ * //=====//
128
+ * BLAH_BLAH: {
129
+ * status: 401,
130
+ * name: "BlahBlah",
131
+ * message: "Blah blah blah.",
132
+ * data: null,
133
+ * },
134
+ * }
135
+ * ```
136
+ */
137
+ declare const BaseErrors: {
138
+ readonly BAD_REQUEST: {
139
+ readonly status: 400;
140
+ readonly name: "BadRequest";
141
+ readonly message: "Bad request.";
142
+ readonly data: null;
143
+ };
144
+ readonly UNAUTHORIZED: {
145
+ readonly status: 401;
146
+ readonly name: "Unauthorized";
147
+ readonly message: "Unauthorized.";
148
+ readonly data: null;
149
+ };
150
+ readonly PAYMENT_REQUIRED: {
151
+ readonly status: 402;
152
+ readonly name: "PaymentRequired";
153
+ readonly message: "Payment required.";
154
+ readonly data: null;
155
+ };
156
+ readonly FORBIDDEN: {
157
+ readonly status: 403;
158
+ readonly name: "Forbidden";
159
+ readonly message: "Forbidden.";
160
+ readonly data: null;
161
+ };
162
+ readonly NOT_FOUND: {
163
+ readonly status: 404;
164
+ readonly name: "NotFound";
165
+ readonly message: "Not found.";
166
+ readonly data: null;
167
+ };
168
+ readonly METHOD_NOT_ALLOWED: {
169
+ readonly status: 405;
170
+ readonly name: "MethodNotAllowed";
171
+ readonly message: "Method not allowed.";
172
+ readonly data: null;
173
+ };
174
+ readonly REQUEST_TIMEOUT: {
175
+ readonly status: 408;
176
+ readonly name: "RequestTimeout";
177
+ readonly message: "Request timed out.";
178
+ readonly data: null;
179
+ };
180
+ readonly CONFLICT: {
181
+ readonly status: 409;
182
+ readonly name: "Conflict";
183
+ readonly message: "Conflict.";
184
+ readonly data: null;
185
+ };
186
+ readonly INTERNAL_SERVER_ERROR: {
187
+ readonly status: 500;
188
+ readonly name: "InternalServerError";
189
+ readonly message: "Internal server error.";
190
+ readonly data: null;
191
+ };
192
+ readonly BACKEND_FUNCTION_RUNNING_ON_CLIENT: {
193
+ readonly status: 500;
194
+ readonly name: "BackendFunctionRunningOnClient";
195
+ readonly message: "A function reserved for the backend is running on the client.";
196
+ readonly data: null;
197
+ };
198
+ readonly NOT_IMPLEMENTED: {
199
+ readonly status: 501;
200
+ readonly name: "NotImplemented";
201
+ readonly message: "Not implemented.";
202
+ readonly data: null;
203
+ };
204
+ readonly BANDWIDTH_LIMIT_EXCEEDED: {
205
+ readonly status: 509;
206
+ readonly name: "BandwidthLimitExceeded";
207
+ readonly message: "Bandwidth limit exceeded.";
208
+ readonly data: null;
209
+ };
210
+ };
211
+
37
212
  /**
38
213
  * Format a number with an attached unit + an optional time unit.
39
214
  *
@@ -162,50 +337,4 @@ type CGASStatus = {
162
337
  message: string
163
338
  }
164
339
 
165
- /**
166
- * The type definition for an error object.
167
- */
168
- type ErrorObj = {
169
- status: number
170
- name: string
171
- message: string
172
- data: unknown
173
- }
174
-
175
- /**
176
- * The type for a successful request, containing the data of type T.
177
- *
178
- * The reason for the duplicate `success` field is to allow for the `SuccessfulRequest` type to be used
179
- * directly.
180
- */
181
- type SuccessfulRequest<T> = {
182
- success: true
183
- data: T
184
- }
185
-
186
- /**
187
- * The type for a failed request, containing the error message and the error object.
188
- *
189
- * The reason for the duplicate `success` field is to allow for the `FailedRequest` type to be used
190
- * directly.
191
- */
192
- type FailedRequest = {
193
- success: false
194
- message: string
195
- error: ErrorObj
196
- }
197
-
198
- /**
199
- * Returns a failed request in case the `success` field is set to `false`,
200
- * otherwise returns a successful request with a data object of type T.
201
- *
202
- * **Example**:
203
- * ```ts
204
- * export async function inviteUser(): Promise<RequestResult<Access>>
205
- * ```
206
- * - Will return the "Access" type if result.success is true.
207
- * - Otherwise, will return the "FailedRequest" type.
208
- */
209
- type RequestResult<T> = ({ success: true } & SuccessfulRequest<T>) | ({ success: false } & FailedRequest)
210
-
211
- export { type CGASStatus, type CGASStatusString, CyCONSTANTS, type ErrorObj, type FailedRequest, type RequestResult, type SuccessfulRequest, convertErrorToString, decodeObjectURIComponents, formatHRTime, formatJson, formatPercentage, formatTime, formatUnit, fullyPermissiveCspHeader, isClient, isServer, mapRange, shadeColor, stringify, truncateString };
340
+ export { BaseErrors, type CGASStatus, type CGASStatusString, CyCONSTANTS, type ErrorObj, type FailedRequest, type RequestResult, type SuccessfulRequest, convertErrorToString, decodeObjectURIComponents, formatErrorResponse, formatHRTime, formatJson, formatMessageAsStringifiedError, formatPercentage, formatTime, formatUnit, fullyPermissiveCspHeader, isClient, isServer, mapRange, parseCRUDError, shadeColor, stringify, stringifyError, truncateString };
package/index.js CHANGED
@@ -1,4 +1,5 @@
1
- function m(){return typeof window>"u"}function u(){return !m()}var S={HASH_SALT_ROUNDS:12,MIN_USERNAME_LENGTH:4,MAX_USERNAME_LENGTH:36,MIN_PASSWORD_LENGTH:8,MAX_PASSWORD_LENGTH:255,MAX_NAME_LENGTH:255,MAX_SLUG_LENGTH:255,MIN_FIRST_NAME_LENGTH:1,MAX_FIRST_NAME_LENGTH:36,MIN_LAST_NAME_LENGTH:1,MAX_LAST_NAME_LENGTH:36,MAX_DESCRIPTION_LENGTH:1024,MAX_URL_LENGTH:2048,MAX_MIME_TYPE_LENGTH:255,MAX_EXTERNAL_LINKS_COUNT:6,USERNAME_REGEX:/^[a-zA-Z0-9_.-]+$/,SLUG_REGEX:/^[a-zA-Z0-9-]+$/,IMG_SIZES_HIGH_QUALITY:"(max-width: 768px) 100vw, (max-width: 1200px) 75vw, 50vw",IMG_SIZES_MEDIUM_QUALITY:"(max-width: 768px) 100vw, (max-width: 1200px) 60vw, 40vw",IMG_SIZES_BASE_QUALITY:"(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw",IMG_SIZES_LOW_QUALITY:"(max-width: 768px) 100vw, (max-width: 1200px) 40vw, 25vw"},c=S;function g(t,i="Op",n="s",r=12,e=true){let a;typeof i=="string"&&typeof n=="string"?a=`${i}/${n}`:typeof i=="string"?a=i:a="";let o=e?" ":"";return t>=10**24?`${(t/10**24).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}${o}Y${a}`.padStart(r," "):t>=10**18?`${(t/10**18).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}${o}E${a}`.padStart(r," "):t>=10**15?`${(t/10**15).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}${o}P${a}`.padStart(r," "):t>=10**12?`${(t/10**12).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}${o}T${a}`.padStart(r," "):t>=10**9?`${(t/10**9).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}${o}G${a}`.padStart(r," "):t>=10**6?`${(t/10**6).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}${o}M${a}`.padStart(r," "):t>=10**3?`${(t/10**3).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}${o}k${a}`.padStart(r," "):`${t.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}${o}${a}`.padStart(r," ")}function f(t,i=8){return t>=3600000000000000n?`${(Number(t)/36e14).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}h`.padStart(i," "):t>=60000000000n?`${(Number(t)/6e10).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}m`.padStart(i," "):t>=1000000000n?`${(Number(t)/1e9).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}s`.padStart(i," "):t>=1000000n?`${(Number(t)/1e6).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}ms`.padStart(i," "):t>=1000n?`${(Number(t)/1e3).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}\xB5s`.padStart(i," "):`${t.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}ns`.padStart(i," ")}function l(t,i=10){return t>=36e5?`${(t/36e5).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}h`.padStart(i," "):t>=6e4?`${(t/6e4).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}m`.padStart(i," "):t>=1e3?`${(t/1e3).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}s`.padStart(i," "):`${t.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}ms`.padStart(i," ")}function p(t,i=7){return `${t.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}%`.padStart(i," ")}function _(t,i){return t.length<=i?t:`${t.slice(0,i)}...`}function x(t){return JSON.stringify(JSON.parse(t),null,4)}function b(t,i=4){return JSON.stringify(t,(n,r)=>typeof r=="function"||typeof r=="bigint"?r.toString():r,i)}function N(t,i,n,r,e,a=true){let o=(t-i)*(e-r)/(n-i)+r;return a?Math.min(Math.max(o,r),e):o}var $=`
1
+ function m(){return typeof window>"u"}function c(){return !m()}var g={HASH_SALT_ROUNDS:12,MIN_USERNAME_LENGTH:4,MAX_USERNAME_LENGTH:36,MIN_PASSWORD_LENGTH:8,MAX_PASSWORD_LENGTH:255,MAX_NAME_LENGTH:255,MAX_SLUG_LENGTH:255,MIN_FIRST_NAME_LENGTH:1,MAX_FIRST_NAME_LENGTH:36,MIN_LAST_NAME_LENGTH:1,MAX_LAST_NAME_LENGTH:36,MAX_DESCRIPTION_LENGTH:1024,MAX_URL_LENGTH:2048,MAX_MIME_TYPE_LENGTH:255,MAX_EXTERNAL_LINKS_COUNT:6,USERNAME_REGEX:/^[a-zA-Z0-9_.-]+$/,SLUG_REGEX:/^[a-zA-Z0-9-]+$/,IMG_SIZES_HIGH_QUALITY:"(max-width: 768px) 100vw, (max-width: 1200px) 75vw, 50vw",IMG_SIZES_MEDIUM_QUALITY:"(max-width: 768px) 100vw, (max-width: 1200px) 60vw, 40vw",IMG_SIZES_BASE_QUALITY:"(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw",IMG_SIZES_LOW_QUALITY:"(max-width: 768px) 100vw, (max-width: 1200px) 40vw, 25vw"},S=g;function l(t){return JSON.stringify(JSON.parse(t),null,4)}function o(t,r=4){return JSON.stringify(t,(e,n)=>typeof n=="function"||typeof n=="bigint"?n.toString():n,r)}function f(t,r,e){let n;return e?n={...t,data:e}:n=t,{success:false,message:r||t.message,error:n}}function E(t,r,e){r&&(t.message=r);let n;return e?n={...t,data:e}:n=t,JSON.stringify(n,(s,i)=>typeof i=="function"||typeof i=="bigint"?i.toString():i,4)}function p(t){let r="";try{try{r=t.toString();}catch{r=o(t);}}catch{r="Unknown error";}return {success:false,message:"An error occurred while performing a CRUD operation.",error:{status:500,name:"CRUD_ERROR",message:"CRUD operation failed.",data:{rawError:t,error:r}}}}function d(t,r){let e={status:500,name:"UNKNOWN_ERROR",message:"An unknown error occurred.",data:null};if(r)try{o(r,4),e=r;}catch{e={...e,data:{rawError:`${r}`}};}return o({success:false,message:t,error:e}).replaceAll("Error: ","").replaceAll(`
2
+ `," ")}var N={BAD_REQUEST:{status:400,name:"BadRequest",message:"Bad request.",data:null},UNAUTHORIZED:{status:401,name:"Unauthorized",message:"Unauthorized.",data:null},PAYMENT_REQUIRED:{status:402,name:"PaymentRequired",message:"Payment required.",data:null},FORBIDDEN:{status:403,name:"Forbidden",message:"Forbidden.",data:null},NOT_FOUND:{status:404,name:"NotFound",message:"Not found.",data:null},METHOD_NOT_ALLOWED:{status:405,name:"MethodNotAllowed",message:"Method not allowed.",data:null},REQUEST_TIMEOUT:{status:408,name:"RequestTimeout",message:"Request timed out.",data:null},CONFLICT:{status:409,name:"Conflict",message:"Conflict.",data:null},INTERNAL_SERVER_ERROR:{status:500,name:"InternalServerError",message:"Internal server error.",data:null},BACKEND_FUNCTION_RUNNING_ON_CLIENT:{status:500,name:"BackendFunctionRunningOnClient",message:"A function reserved for the backend is running on the client.",data:null},NOT_IMPLEMENTED:{status:501,name:"NotImplemented",message:"Not implemented.",data:null},BANDWIDTH_LIMIT_EXCEEDED:{status:509,name:"BandwidthLimitExceeded",message:"Bandwidth limit exceeded.",data:null}};function _(t,r="Op",e="s",n=12,a=true){let s;typeof r=="string"&&typeof e=="string"?s=`${r}/${e}`:typeof r=="string"?s=r:s="";let i=a?" ":"";return t>=10**24?`${(t/10**24).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}${i}Y${s}`.padStart(n," "):t>=10**18?`${(t/10**18).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}${i}E${s}`.padStart(n," "):t>=10**15?`${(t/10**15).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}${i}P${s}`.padStart(n," "):t>=10**12?`${(t/10**12).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}${i}T${s}`.padStart(n," "):t>=10**9?`${(t/10**9).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}${i}G${s}`.padStart(n," "):t>=10**6?`${(t/10**6).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}${i}M${s}`.padStart(n," "):t>=10**3?`${(t/10**3).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}${i}k${s}`.padStart(n," "):`${t.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}${i}${s}`.padStart(n," ")}function R(t,r=8){return t>=3600000000000000n?`${(Number(t)/36e14).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}h`.padStart(r," "):t>=60000000000n?`${(Number(t)/6e10).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}m`.padStart(r," "):t>=1000000000n?`${(Number(t)/1e9).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}s`.padStart(r," "):t>=1000000n?`${(Number(t)/1e6).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}ms`.padStart(r," "):t>=1000n?`${(Number(t)/1e3).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}\xB5s`.padStart(r," "):`${t.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}ns`.padStart(r," ")}function b(t,r=10){return t>=36e5?`${(t/36e5).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}h`.padStart(r," "):t>=6e4?`${(t/6e4).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}m`.padStart(r," "):t>=1e3?`${(t/1e3).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}s`.padStart(r," "):`${t.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}ms`.padStart(r," ")}function D(t,r=7){return `${t.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}%`.padStart(r," ")}function x(t,r){return t.length<=r?t:`${t.slice(0,r)}...`}function T(t,r,e,n,a,s=true){let i=(t-r)*(a-n)/(e-r)+n;return s?Math.min(Math.max(i,n),a):i}var U=`
2
3
  default-src * data: mediastream: blob: filesystem: about: ws: wss: 'unsafe-eval' 'wasm-unsafe-eval' 'unsafe-inline';
3
4
  script-src * data: blob: 'unsafe-inline' 'unsafe-eval';
4
5
  script-src-elem * data: blob: 'unsafe-inline';
@@ -9,5 +10,5 @@ function m(){return typeof window>"u"}function u(){return !m()}var S={HASH_SALT_
9
10
  style-src * data: blob: 'unsafe-inline';
10
11
  font-src * data: blob: 'unsafe-inline';
11
12
  frame-ancestors * data: blob:;
12
- `.replace(/\s{2,}/g," ").trim();function E(t){if(typeof t=="string")return t;let i="";try{i=JSON.stringify(t);}catch{}return (i===""||i==="{}")&&(i=`${t}`),i}function L(t){for(let i in t)try{t[i]=decodeURIComponent(String(t[i]));}catch{}return t}function D(t,i){let n=Number.parseInt(t.substring(1,3),16),r=Number.parseInt(t.substring(3,5),16),e=Number.parseInt(t.substring(5,7),16);n=Math.round(n*(100+i)/100),r=Math.round(r*(100+i)/100),e=Math.round(e*(100+i)/100),n=n<255?n:255,r=r<255?r:255,e=e<255?e:255,n=Math.round(n),r=Math.round(r),e=Math.round(e);let a=n.toString(16).length===1?`0${n.toString(16)}`:n.toString(16),o=r.toString(16).length===1?`0${r.toString(16)}`:r.toString(16),s=e.toString(16).length===1?`0${e.toString(16)}`:e.toString(16);return `#${a}${o}${s}`}export{c as CyCONSTANTS,E as convertErrorToString,L as decodeObjectURIComponents,f as formatHRTime,x as formatJson,p as formatPercentage,l as formatTime,g as formatUnit,$ as fullyPermissiveCspHeader,u as isClient,m as isServer,N as mapRange,D as shadeColor,b as stringify,_ as truncateString};//# sourceMappingURL=index.js.map
13
+ `.replace(/\s{2,}/g," ").trim();function A(t){if(typeof t=="string")return t;let r="";try{r=JSON.stringify(t);}catch{}return (r===""||r==="{}")&&(r=`${t}`),r}function L(t){for(let r in t)try{t[r]=decodeURIComponent(String(t[r]));}catch{}return t}function F(t,r){let e=Number.parseInt(t.substring(1,3),16),n=Number.parseInt(t.substring(3,5),16),a=Number.parseInt(t.substring(5,7),16);e=Math.round(e*(100+r)/100),n=Math.round(n*(100+r)/100),a=Math.round(a*(100+r)/100),e=e<255?e:255,n=n<255?n:255,a=a<255?a:255,e=Math.round(e),n=Math.round(n),a=Math.round(a);let s=e.toString(16).length===1?`0${e.toString(16)}`:e.toString(16),i=n.toString(16).length===1?`0${n.toString(16)}`:n.toString(16),u=a.toString(16).length===1?`0${a.toString(16)}`:a.toString(16);return `#${s}${i}${u}`}export{N as BaseErrors,S as CyCONSTANTS,A as convertErrorToString,L as decodeObjectURIComponents,f as formatErrorResponse,R as formatHRTime,l as formatJson,d as formatMessageAsStringifiedError,D as formatPercentage,b as formatTime,_ as formatUnit,U as fullyPermissiveCspHeader,c as isClient,m as isServer,T as mapRange,p as parseCRUDError,F as shadeColor,o as stringify,E as stringifyError,x as truncateString};//# sourceMappingURL=index.js.map
13
14
  //# sourceMappingURL=index.js.map
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/main/checks.ts","../src/main/constants.ts","../src/main/formats.ts","../src/main/json.ts","../src/main/maths.ts","../src/main/middleware.ts","../src/main/strings.ts","../src/main/styling.ts"],"names":["isServer","isClient","CyCONSTANTS","constants_default","formatUnit","num","unit","timeUnit","padding","addSpaceBeforeUnit","strUnit","spaceOrNot","formatHRTime","hrtime","formatTime","time","formatPercentage","percentage","truncateString","str","len","formatJson","stringify","object","indent","_","value","mapRange","inMin","inMax","outMin","outMax","clamp","mappedValue","fullyPermissiveCspHeader","convertErrorToString","error","stringifiedError","decodeObjectURIComponents","obj","key","shadeColor","color","percent","R","G","B","RR","GG","BB"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Returns true if the code is running in a server environment.\n */\nexport function isServer() {\n\treturn typeof window === \"undefined\"\n}\n\n/**\n * Returns true if the code is running in a client environment.\n */\nexport function isClient() {\n\treturn !isServer()\n}\n","/**\n * A set of general constants.\n */\nconst CyCONSTANTS = {\n\t// Security\n\tHASH_SALT_ROUNDS: 12,\n\n\t// User\n\tMIN_USERNAME_LENGTH: 4,\n\tMAX_USERNAME_LENGTH: 36,\n\tMIN_PASSWORD_LENGTH: 8,\n\tMAX_PASSWORD_LENGTH: 255,\n\tMAX_NAME_LENGTH: 255,\n\tMAX_SLUG_LENGTH: 255,\n\tMIN_FIRST_NAME_LENGTH: 1,\n\tMAX_FIRST_NAME_LENGTH: 36,\n\tMIN_LAST_NAME_LENGTH: 1,\n\tMAX_LAST_NAME_LENGTH: 36,\n\tMAX_DESCRIPTION_LENGTH: 1024,\n\tMAX_URL_LENGTH: 2048,\n\tMAX_MIME_TYPE_LENGTH: 255,\n\tMAX_EXTERNAL_LINKS_COUNT: 6,\n\tUSERNAME_REGEX: /^[a-zA-Z0-9_.-]+$/,\n\tSLUG_REGEX: /^[a-zA-Z0-9-]+$/,\n\n\t// Image & Video sizes\n\tIMG_SIZES_HIGH_QUALITY: \"(max-width: 768px) 100vw, (max-width: 1200px) 75vw, 50vw\",\n\tIMG_SIZES_MEDIUM_QUALITY: \"(max-width: 768px) 100vw, (max-width: 1200px) 60vw, 40vw\",\n\tIMG_SIZES_BASE_QUALITY: \"(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw\",\n\tIMG_SIZES_LOW_QUALITY: \"(max-width: 768px) 100vw, (max-width: 1200px) 40vw, 25vw\",\n}\n\nexport default CyCONSTANTS\n","/**\n * Format a number with an attached unit + an optional time unit.\n *\n * **Note:** The time unit can be set to null to only display the unit.\n * @param num The number to format.\n * @param unit The unit to use (optional, defaults to \"Op\").\n * @param timeUnit The time unit to use (optional, defaults to \"s\").\n * @param padding The padding to use (optional, defaults to 12).\n * @param addSpaceBeforeUnit Whether to add a space before the unit (optional, defaults to `true`).\n * @returns The formatted string.\n */\nexport function formatUnit(\n\tnum: number,\n\tunit: string | null = \"Op\",\n\ttimeUnit: string | null = \"s\",\n\tpadding = 12,\n\taddSpaceBeforeUnit = true,\n): string {\n\tlet strUnit: string\n\n\tif (typeof unit === \"string\" && typeof timeUnit === \"string\") {\n\t\tstrUnit = `${unit}/${timeUnit}`\n\t} else if (typeof unit === \"string\") {\n\t\tstrUnit = unit\n\t} else {\n\t\tstrUnit = \"\"\n\t}\n\n\t// Add a space before the unit if needed\n\tconst spaceOrNot = addSpaceBeforeUnit ? \" \" : \"\"\n\n\t// Y = yotta\n\tif (num >= 10 ** 24) {\n\t\treturn `${(num / 10 ** 24).toLocaleString(\"en-US\", {\n\t\t\tminimumFractionDigits: 2,\n\t\t\tmaximumFractionDigits: 2,\n\t\t})}${spaceOrNot}Y${strUnit}`.padStart(padding, \" \")\n\t}\n\n\t// E = exa\n\tif (num >= 10 ** 18) {\n\t\treturn `${(num / 10 ** 18).toLocaleString(\"en-US\", {\n\t\t\tminimumFractionDigits: 2,\n\t\t\tmaximumFractionDigits: 2,\n\t\t})}${spaceOrNot}E${strUnit}`.padStart(padding, \" \")\n\t}\n\n\t// P = peta\n\tif (num >= 10 ** 15) {\n\t\treturn `${(num / 10 ** 15).toLocaleString(\"en-US\", {\n\t\t\tminimumFractionDigits: 2,\n\t\t\tmaximumFractionDigits: 2,\n\t\t})}${spaceOrNot}P${strUnit}`.padStart(padding, \" \")\n\t}\n\n\t// T = tera\n\tif (num >= 10 ** 12) {\n\t\treturn `${(num / 10 ** 12).toLocaleString(\"en-US\", {\n\t\t\tminimumFractionDigits: 2,\n\t\t\tmaximumFractionDigits: 2,\n\t\t})}${spaceOrNot}T${strUnit}`.padStart(padding, \" \")\n\t}\n\n\t// G = giga\n\tif (num >= 10 ** 9) {\n\t\treturn `${(num / 10 ** 9).toLocaleString(\"en-US\", {\n\t\t\tminimumFractionDigits: 2,\n\t\t\tmaximumFractionDigits: 2,\n\t\t})}${spaceOrNot}G${strUnit}`.padStart(padding, \" \")\n\t}\n\n\t// M = mega\n\tif (num >= 10 ** 6) {\n\t\treturn `${(num / 10 ** 6).toLocaleString(\"en-US\", {\n\t\t\tminimumFractionDigits: 2,\n\t\t\tmaximumFractionDigits: 2,\n\t\t})}${spaceOrNot}M${strUnit}`.padStart(padding, \" \")\n\t}\n\n\t// k = kilo\n\tif (num >= 10 ** 3) {\n\t\treturn `${(num / 10 ** 3).toLocaleString(\"en-US\", {\n\t\t\tminimumFractionDigits: 2,\n\t\t\tmaximumFractionDigits: 2,\n\t\t})}${spaceOrNot}k${strUnit}`.padStart(padding, \" \")\n\t}\n\n\treturn `${num.toLocaleString(\"en-US\", {\n\t\tminimumFractionDigits: 2,\n\t\tmaximumFractionDigits: 2,\n\t})}${spaceOrNot}${strUnit}`.padStart(padding, \" \")\n}\n\n/**\n * Format a high-resolution time, into a responsive string with the en-US locale format.\n * @param hrtime The hrtime in nanoseconds.\n * @param padding The padding to use (optional, defaults to 8).\n * @returns The formatted string.\n */\nexport function formatHRTime(hrtime: bigint | number, padding = 8): string {\n\t// Hours\n\tif (hrtime >= 3600000000000000n) {\n\t\treturn `${(Number(hrtime) / 3600000000000000).toLocaleString(\"en-US\", {\n\t\t\tminimumFractionDigits: 2,\n\t\t\tmaximumFractionDigits: 2,\n\t\t})}h`.padStart(padding, \" \")\n\t}\n\n\t// Minutes\n\tif (hrtime >= 60000000000n) {\n\t\treturn `${(Number(hrtime) / 60000000000).toLocaleString(\"en-US\", {\n\t\t\tminimumFractionDigits: 2,\n\t\t\tmaximumFractionDigits: 2,\n\t\t})}m`.padStart(padding, \" \")\n\t}\n\n\t// Seconds\n\tif (hrtime >= 1000000000n) {\n\t\treturn `${(Number(hrtime) / 1000000000).toLocaleString(\"en-US\", {\n\t\t\tminimumFractionDigits: 2,\n\t\t\tmaximumFractionDigits: 2,\n\t\t})}s`.padStart(padding, \" \")\n\t}\n\n\t// Milliseconds\n\tif (hrtime >= 1000000n) {\n\t\treturn `${(Number(hrtime) / 1000000).toLocaleString(\"en-US\", {\n\t\t\tminimumFractionDigits: 2,\n\t\t\tmaximumFractionDigits: 2,\n\t\t})}ms`.padStart(padding, \" \")\n\t}\n\n\t// Microseconds\n\tif (hrtime >= 1000n) {\n\t\treturn `${(Number(hrtime) / 1000).toLocaleString(\"en-US\", {\n\t\t\tminimumFractionDigits: 2,\n\t\t\tmaximumFractionDigits: 2,\n\t\t})}µs`.padStart(padding, \" \")\n\t}\n\n\t// Nanoseconds\n\treturn `${hrtime.toLocaleString(\"en-US\", {\n\t\tminimumFractionDigits: 2,\n\t\tmaximumFractionDigits: 2,\n\t})}ns`.padStart(padding, \" \")\n}\n\n/**\n * Format a time in milliseconds into a responsive string with the en-US locale format.\n * @param time The time in milliseconds.\n * @param padding The padding to use (optional, defaults to 10).\n * @returns The formatted string.\n */\nexport function formatTime(time: number, padding = 10): string {\n\t// Hours\n\tif (time >= 3600000) {\n\t\treturn `${(time / 3600000).toLocaleString(\"en-US\", {\n\t\t\tminimumFractionDigits: 2,\n\t\t\tmaximumFractionDigits: 2,\n\t\t})}h`.padStart(padding, \" \")\n\t}\n\n\t// Minutes\n\tif (time >= 60000) {\n\t\treturn `${(time / 60000).toLocaleString(\"en-US\", {\n\t\t\tminimumFractionDigits: 2,\n\t\t\tmaximumFractionDigits: 2,\n\t\t})}m`.padStart(padding, \" \")\n\t}\n\n\t// Seconds\n\tif (time >= 1000) {\n\t\treturn `${(time / 1000).toLocaleString(\"en-US\", {\n\t\t\tminimumFractionDigits: 2,\n\t\t\tmaximumFractionDigits: 2,\n\t\t})}s`.padStart(padding, \" \")\n\t}\n\n\t// Milliseconds\n\treturn `${time.toLocaleString(\"en-US\", {\n\t\tminimumFractionDigits: 2,\n\t\tmaximumFractionDigits: 2,\n\t})}ms`.padStart(padding, \" \")\n}\n\n/**\n * Format a percentage with the en-US locale format.\n * @param percentage The percentage to format.\n * @param padding The padding to use (optional, defaults to 7).\n * @returns The formatted string.\n */\nexport function formatPercentage(percentage: number, padding = 7): string {\n\treturn `${percentage.toLocaleString(\"en-US\", {\n\t\tminimumFractionDigits: 2,\n\t\tmaximumFractionDigits: 2,\n\t})}%`.padStart(padding, \" \")\n}\n\n/**\n * Truncate a string to a certain length.\n * @param str The string to truncate.\n * @param len The maximum length of the string.\n * @returns The truncated string.\n */\nexport function truncateString(str: string, len: number) {\n\tif (str.length <= len) return str\n\treturn `${str.slice(0, len)}...`\n}\n","/**\n * Format a JSON object with indentation.\n * @param str The JSON string to format.\n * @returns The formatted JSON string.\n */\nexport function formatJson(str: string): string {\n\treturn JSON.stringify(JSON.parse(str), null, 4)\n}\n\n/**\n * Stringify a JSON object with support for BigInt and functions.\n * @param object The object to stringify.\n * @param indent The number of spaces to indent (optional, defaults to 4)\n * @returns The stringified JSON object.\n */\nexport function stringify(object: unknown, indent = 4): string {\n\treturn JSON.stringify(\n\t\tobject,\n\t\t(_, value) => {\n\t\t\tif (typeof value === \"function\") return value.toString()\n\t\t\tif (typeof value === \"bigint\") return value.toString()\n\n\t\t\treturn value\n\t\t},\n\t\tindent,\n\t)\n}\n","/**\n * Map a number to a range of numbers.\n * @param value The number to map.\n * @param inMin The minimum value of the input range.\n * @param inMax The maximum value of the input range.\n * @param outMin The minimum value of the output range.\n * @param outMax The maximum value of the output range.\n * @param clamp Whether to clamp the output value to the output range (optional, defaults to true).\n * @returns The mapped number.\n */\nexport function mapRange(\n\tvalue: number,\n\tinMin: number,\n\tinMax: number,\n\toutMin: number,\n\toutMax: number,\n\tclamp = true,\n): number {\n\tconst mappedValue = ((value - inMin) * (outMax - outMin)) / (inMax - inMin) + outMin\n\n\tif (clamp) return Math.min(Math.max(mappedValue, outMin), outMax)\n\treturn mappedValue\n}\n","/**\n * A fully permissive Content Security Policy header that can be used for development purposes,\n * no need to say that this should **NEVER** be used in production...\n */\nexport const fullyPermissiveCspHeader = `\n default-src * data: mediastream: blob: filesystem: about: ws: wss: 'unsafe-eval' 'wasm-unsafe-eval' 'unsafe-inline';\n script-src * data: blob: 'unsafe-inline' 'unsafe-eval';\n script-src-elem * data: blob: 'unsafe-inline';\n connect-src * data: blob: 'unsafe-inline';\n img-src * data: blob: 'unsafe-inline';\n media-src * data: blob: 'unsafe-inline';\n frame-src * data: blob: ;\n style-src * data: blob: 'unsafe-inline';\n font-src * data: blob: 'unsafe-inline';\n frame-ancestors * data: blob:;\n`\n\t.replace(/\\s{2,}/g, \" \")\n\t.trim()\n","/**\n * Safely converts any error into a string for parsing/searching.\n * @param error The error to convert.\n * @returns The error as a string.\n */\nexport function convertErrorToString(error: unknown): string {\n\tif (typeof error === \"string\") return error\n\n\tlet stringifiedError = \"\"\n\ttry {\n\t\tstringifiedError = JSON.stringify(error)\n\t} catch (_) {\n\t\t// Ignore\n\t}\n\n\tif (stringifiedError === \"\" || stringifiedError === \"{}\") stringifiedError = `${error}`\n\treturn stringifiedError\n}\n\n/**\n * Decodes all components of an object as URI components (e.g., for decoding Next.js `req.query`).\n * @param obj The object to decode.\n * @returns The decoded object.\n */\nexport function decodeObjectURIComponents(\n\tobj: Partial<{ [key: string]: string | string[] }>,\n): Partial<{ [key: string]: string | string[] }> {\n\tfor (const key in obj) {\n\t\ttry {\n\t\t\tobj[key] = decodeURIComponent(String(obj[key]))\n\t\t} catch (_) {\n\t\t\t// Ignore decoding errors\n\t\t}\n\t}\n\n\treturn obj\n}\n","/**\n * Shades a color by a percentage.\n * @param color The color to shade.\n * @param percent The percentage to shade by.\n * @returns The shaded color.\n */\nexport function shadeColor(color: string, percent: number) {\n\tlet R = Number.parseInt(color.substring(1, 3), 16)\n\tlet G = Number.parseInt(color.substring(3, 5), 16)\n\tlet B = Number.parseInt(color.substring(5, 7), 16)\n\n\tR = Math.round((R * (100 + percent)) / 100)\n\tG = Math.round((G * (100 + percent)) / 100)\n\tB = Math.round((B * (100 + percent)) / 100)\n\n\tR = R < 255 ? R : 255\n\tG = G < 255 ? G : 255\n\tB = B < 255 ? B : 255\n\n\tR = Math.round(R)\n\tG = Math.round(G)\n\tB = Math.round(B)\n\n\tconst RR = R.toString(16).length === 1 ? `0${R.toString(16)}` : R.toString(16)\n\tconst GG = G.toString(16).length === 1 ? `0${G.toString(16)}` : G.toString(16)\n\tconst BB = B.toString(16).length === 1 ? `0${B.toString(16)}` : B.toString(16)\n\n\treturn `#${RR}${GG}${BB}`\n}\n"]}
1
+ {"version":3,"sources":["../src/main/checks.ts","../src/main/constants.ts","../src/main/json.ts","../src/main/errors.ts","../src/main/formats.ts","../src/main/maths.ts","../src/main/middleware.ts","../src/main/strings.ts","../src/main/styling.ts"],"names":["isServer","isClient","CyCONSTANTS","constants_default","formatJson","str","stringify","object","indent","_","value","formatErrorResponse","error","customMessage","additionalData","err","stringifyError","message","parseCRUDError","errorString","formatMessageAsStringifiedError","errorObj","BaseErrors","formatUnit","num","unit","timeUnit","padding","addSpaceBeforeUnit","strUnit","spaceOrNot","formatHRTime","hrtime","formatTime","time","formatPercentage","percentage","truncateString","len","mapRange","inMin","inMax","outMin","outMax","clamp","mappedValue","fullyPermissiveCspHeader","convertErrorToString","stringifiedError","decodeObjectURIComponents","obj","key","shadeColor","color","percent","R","G","B","RR","GG","BB"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Returns true if the code is running in a server environment.\n */\nexport function isServer() {\n\treturn typeof window === \"undefined\"\n}\n\n/**\n * Returns true if the code is running in a client environment.\n */\nexport function isClient() {\n\treturn !isServer()\n}\n","/**\n * A set of general constants.\n */\nconst CyCONSTANTS = {\n\t// Security\n\tHASH_SALT_ROUNDS: 12,\n\n\t// User\n\tMIN_USERNAME_LENGTH: 4,\n\tMAX_USERNAME_LENGTH: 36,\n\tMIN_PASSWORD_LENGTH: 8,\n\tMAX_PASSWORD_LENGTH: 255,\n\tMAX_NAME_LENGTH: 255,\n\tMAX_SLUG_LENGTH: 255,\n\tMIN_FIRST_NAME_LENGTH: 1,\n\tMAX_FIRST_NAME_LENGTH: 36,\n\tMIN_LAST_NAME_LENGTH: 1,\n\tMAX_LAST_NAME_LENGTH: 36,\n\tMAX_DESCRIPTION_LENGTH: 1024,\n\tMAX_URL_LENGTH: 2048,\n\tMAX_MIME_TYPE_LENGTH: 255,\n\tMAX_EXTERNAL_LINKS_COUNT: 6,\n\tUSERNAME_REGEX: /^[a-zA-Z0-9_.-]+$/,\n\tSLUG_REGEX: /^[a-zA-Z0-9-]+$/,\n\n\t// Image & Video sizes\n\tIMG_SIZES_HIGH_QUALITY: \"(max-width: 768px) 100vw, (max-width: 1200px) 75vw, 50vw\",\n\tIMG_SIZES_MEDIUM_QUALITY: \"(max-width: 768px) 100vw, (max-width: 1200px) 60vw, 40vw\",\n\tIMG_SIZES_BASE_QUALITY: \"(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw\",\n\tIMG_SIZES_LOW_QUALITY: \"(max-width: 768px) 100vw, (max-width: 1200px) 40vw, 25vw\",\n}\n\nexport default CyCONSTANTS\n","/**\n * Format a JSON object with indentation.\n * @param str The JSON string to format.\n * @returns The formatted JSON string.\n */\nexport function formatJson(str: string): string {\n\treturn JSON.stringify(JSON.parse(str), null, 4)\n}\n\n/**\n * Stringify a JSON object with support for BigInt and functions.\n * @param object The object to stringify.\n * @param indent The number of spaces to indent (optional, defaults to 4)\n * @returns The stringified JSON object.\n */\nexport function stringify(object: unknown, indent = 4): string {\n\treturn JSON.stringify(\n\t\tobject,\n\t\t(_, value) => {\n\t\t\tif (typeof value === \"function\") return value.toString()\n\t\t\tif (typeof value === \"bigint\") return value.toString()\n\n\t\t\treturn value\n\t\t},\n\t\tindent,\n\t)\n}\n","import { stringify } from \"@/main/json\"\nimport type { ErrorObj, FailedRequest } from \"@/main/types/requests\"\n\n/**\n * Formats an `ErrorObj` into a standard error sent back by an API endpoint.\n */\nexport function formatErrorResponse(error: ErrorObj, customMessage?: string, additionalData?: unknown) {\n\tlet err: ErrorObj\n\tif (additionalData) err = { ...error, data: additionalData }\n\telse err = error\n\n\treturn {\n\t\tsuccess: false,\n\t\tmessage: customMessage || error.message,\n\t\terror: err,\n\t}\n}\n\n/**\n * Formats an `ErrorObj` and stringifies it for it to be supported by the `Error` class.\n * @param error The `ErrorObj` object to format.\n * @param message Replaces the standard error message with a custom one (optional).\n * @param additionalData Additional data to include in the error (optional).\n * @returns The formatted error string.\n */\nexport function stringifyError(error: ErrorObj, message?: string, additionalData?: unknown): string {\n\tif (message) error.message = message\n\n\tlet err: ErrorObj\n\tif (additionalData) err = { ...error, data: additionalData }\n\telse err = error\n\n\t// Allow special keys in the JSON stringification\n\tconst allowSpecialKeys = (_: string, value: unknown) => {\n\t\tif (typeof value === \"function\") return value.toString()\n\t\tif (typeof value === \"bigint\") return value.toString()\n\n\t\treturn value\n\t}\n\n\treturn JSON.stringify(err, allowSpecialKeys, 4)\n}\n\n/**\n * Parse the error of a CRUD call and return a standardized error.\n * @param error The error to parse.\n * @returns The standardized error object.\n */\nexport function parseCRUDError(error: unknown): FailedRequest {\n\tlet errorString = \"\"\n\n\ttry {\n\t\ttry {\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Cannot infer the type of the error\n\t\t\terrorString = (error as any).toString()\n\t\t} catch (_) {\n\t\t\terrorString = stringify(error)\n\t\t}\n\t} catch (_) {\n\t\terrorString = \"Unknown error\"\n\t}\n\n\treturn {\n\t\tsuccess: false,\n\t\tmessage: \"An error occurred while performing a CRUD operation.\",\n\t\terror: {\n\t\t\tstatus: 500,\n\t\t\tname: \"CRUD_ERROR\",\n\t\t\tmessage: \"CRUD operation failed.\",\n\t\t\tdata: {\n\t\t\t\trawError: error,\n\t\t\t\terror: errorString,\n\t\t\t},\n\t\t},\n\t}\n}\n\n/**\n * Formats a message and an error object into a JSON string that follows the `FailedRequest` standard,\n * the goal is to not end up with special characters such as newlines in the message, so it can be parsed\n * back into an object without issues.\n * @param message The message to format.\n * @param error The error object to format.\n * @returns The formatted JSON string.\n */\nexport function formatMessageAsStringifiedError(message: string, error?: unknown): string {\n\tlet errorObj: ErrorObj = {\n\t\tstatus: 500,\n\t\tname: \"UNKNOWN_ERROR\",\n\t\tmessage: \"An unknown error occurred.\",\n\t\tdata: null,\n\t}\n\n\tif (error) {\n\t\ttry {\n\t\t\t// Testing with JSON.stringify to see if it's a valid JSON object\n\t\t\tstringify(error, 4)\n\n\t\t\terrorObj = error as ErrorObj\n\t\t} catch {\n\t\t\t// Convert the error to a basic non-escaped string\n\t\t\terrorObj = {\n\t\t\t\t...errorObj,\n\t\t\t\tdata: {\n\t\t\t\t\trawError: `${error}`,\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\t}\n\n\tconst res = stringify({\n\t\tsuccess: false,\n\t\tmessage,\n\t\terror: errorObj,\n\t})\n\n\t// Ensure that no \"Error: \" or line break ends up in the message\n\treturn res.replaceAll(\"Error: \", \"\").replaceAll(\"\\n\", \" \")\n}\n\n/**\n * Contains all the standard available errors for the application, it serves as a base\n * to extend with your custom errors.\n *\n * The recommended way is to create an `AppErrors` object that extends this one, preferably\n * at a place similar to `lib/utils/errors.ts`:\n * ```typescript\n * import { BaseErrors } from \"...\"\n *\n * export const AppErrors = {\n * ...BaseErrors,\n * //=====//\n *\t // 401 //\n *\t //=====//\n * BLAH_BLAH: {\n * status: 401,\n * name: \"BlahBlah\",\n * message: \"Blah blah blah.\",\n * data: null,\n * },\n * }\n * ```\n */\nexport const BaseErrors = {\n\t//=====//\n\t// 400 //\n\t//=====//\n\tBAD_REQUEST: {\n\t\tstatus: 400,\n\t\tname: \"BadRequest\",\n\t\tmessage: \"Bad request.\",\n\t\tdata: null,\n\t},\n\t//=====//\n\t// 401 //\n\t//=====//\n\tUNAUTHORIZED: {\n\t\tstatus: 401,\n\t\tname: \"Unauthorized\",\n\t\tmessage: \"Unauthorized.\",\n\t\tdata: null,\n\t},\n\t//=====//\n\t// 402 //\n\t//=====//\n\tPAYMENT_REQUIRED: {\n\t\tstatus: 402,\n\t\tname: \"PaymentRequired\",\n\t\tmessage: \"Payment required.\",\n\t\tdata: null,\n\t},\n\t//=====//\n\t// 403 //\n\t//=====//\n\tFORBIDDEN: {\n\t\tstatus: 403,\n\t\tname: \"Forbidden\",\n\t\tmessage: \"Forbidden.\",\n\t\tdata: null,\n\t},\n\t//=====//\n\t// 404 //\n\t//=====//\n\tNOT_FOUND: {\n\t\tstatus: 404,\n\t\tname: \"NotFound\",\n\t\tmessage: \"Not found.\",\n\t\tdata: null,\n\t},\n\t//=====//\n\t// 405 //\n\t//=====//\n\tMETHOD_NOT_ALLOWED: {\n\t\tstatus: 405,\n\t\tname: \"MethodNotAllowed\",\n\t\tmessage: \"Method not allowed.\",\n\t\tdata: null,\n\t},\n\t//=====//\n\t// 408 //\n\t//=====//\n\tREQUEST_TIMEOUT: {\n\t\tstatus: 408,\n\t\tname: \"RequestTimeout\",\n\t\tmessage: \"Request timed out.\",\n\t\tdata: null,\n\t},\n\t//=====//\n\t// 409 //\n\t//=====//\n\tCONFLICT: {\n\t\tstatus: 409,\n\t\tname: \"Conflict\",\n\t\tmessage: \"Conflict.\",\n\t\tdata: null,\n\t},\n\t//=====//\n\t// 500 //\n\t//=====//\n\tINTERNAL_SERVER_ERROR: {\n\t\tstatus: 500,\n\t\tname: \"InternalServerError\",\n\t\tmessage: \"Internal server error.\",\n\t\tdata: null,\n\t},\n\tBACKEND_FUNCTION_RUNNING_ON_CLIENT: {\n\t\tstatus: 500,\n\t\tname: \"BackendFunctionRunningOnClient\",\n\t\tmessage: \"A function reserved for the backend is running on the client.\",\n\t\tdata: null,\n\t},\n\t//=====//\n\t// 501 //\n\t//=====//\n\tNOT_IMPLEMENTED: {\n\t\tstatus: 501,\n\t\tname: \"NotImplemented\",\n\t\tmessage: \"Not implemented.\",\n\t\tdata: null,\n\t},\n\t//=====//\n\t// 509 //\n\t//=====//\n\tBANDWIDTH_LIMIT_EXCEEDED: {\n\t\tstatus: 509,\n\t\tname: \"BandwidthLimitExceeded\",\n\t\tmessage: \"Bandwidth limit exceeded.\",\n\t\tdata: null,\n\t},\n} as const satisfies Record<string, ErrorObj>\n","/**\n * Format a number with an attached unit + an optional time unit.\n *\n * **Note:** The time unit can be set to null to only display the unit.\n * @param num The number to format.\n * @param unit The unit to use (optional, defaults to \"Op\").\n * @param timeUnit The time unit to use (optional, defaults to \"s\").\n * @param padding The padding to use (optional, defaults to 12).\n * @param addSpaceBeforeUnit Whether to add a space before the unit (optional, defaults to `true`).\n * @returns The formatted string.\n */\nexport function formatUnit(\n\tnum: number,\n\tunit: string | null = \"Op\",\n\ttimeUnit: string | null = \"s\",\n\tpadding = 12,\n\taddSpaceBeforeUnit = true,\n): string {\n\tlet strUnit: string\n\n\tif (typeof unit === \"string\" && typeof timeUnit === \"string\") {\n\t\tstrUnit = `${unit}/${timeUnit}`\n\t} else if (typeof unit === \"string\") {\n\t\tstrUnit = unit\n\t} else {\n\t\tstrUnit = \"\"\n\t}\n\n\t// Add a space before the unit if needed\n\tconst spaceOrNot = addSpaceBeforeUnit ? \" \" : \"\"\n\n\t// Y = yotta\n\tif (num >= 10 ** 24) {\n\t\treturn `${(num / 10 ** 24).toLocaleString(\"en-US\", {\n\t\t\tminimumFractionDigits: 2,\n\t\t\tmaximumFractionDigits: 2,\n\t\t})}${spaceOrNot}Y${strUnit}`.padStart(padding, \" \")\n\t}\n\n\t// E = exa\n\tif (num >= 10 ** 18) {\n\t\treturn `${(num / 10 ** 18).toLocaleString(\"en-US\", {\n\t\t\tminimumFractionDigits: 2,\n\t\t\tmaximumFractionDigits: 2,\n\t\t})}${spaceOrNot}E${strUnit}`.padStart(padding, \" \")\n\t}\n\n\t// P = peta\n\tif (num >= 10 ** 15) {\n\t\treturn `${(num / 10 ** 15).toLocaleString(\"en-US\", {\n\t\t\tminimumFractionDigits: 2,\n\t\t\tmaximumFractionDigits: 2,\n\t\t})}${spaceOrNot}P${strUnit}`.padStart(padding, \" \")\n\t}\n\n\t// T = tera\n\tif (num >= 10 ** 12) {\n\t\treturn `${(num / 10 ** 12).toLocaleString(\"en-US\", {\n\t\t\tminimumFractionDigits: 2,\n\t\t\tmaximumFractionDigits: 2,\n\t\t})}${spaceOrNot}T${strUnit}`.padStart(padding, \" \")\n\t}\n\n\t// G = giga\n\tif (num >= 10 ** 9) {\n\t\treturn `${(num / 10 ** 9).toLocaleString(\"en-US\", {\n\t\t\tminimumFractionDigits: 2,\n\t\t\tmaximumFractionDigits: 2,\n\t\t})}${spaceOrNot}G${strUnit}`.padStart(padding, \" \")\n\t}\n\n\t// M = mega\n\tif (num >= 10 ** 6) {\n\t\treturn `${(num / 10 ** 6).toLocaleString(\"en-US\", {\n\t\t\tminimumFractionDigits: 2,\n\t\t\tmaximumFractionDigits: 2,\n\t\t})}${spaceOrNot}M${strUnit}`.padStart(padding, \" \")\n\t}\n\n\t// k = kilo\n\tif (num >= 10 ** 3) {\n\t\treturn `${(num / 10 ** 3).toLocaleString(\"en-US\", {\n\t\t\tminimumFractionDigits: 2,\n\t\t\tmaximumFractionDigits: 2,\n\t\t})}${spaceOrNot}k${strUnit}`.padStart(padding, \" \")\n\t}\n\n\treturn `${num.toLocaleString(\"en-US\", {\n\t\tminimumFractionDigits: 2,\n\t\tmaximumFractionDigits: 2,\n\t})}${spaceOrNot}${strUnit}`.padStart(padding, \" \")\n}\n\n/**\n * Format a high-resolution time, into a responsive string with the en-US locale format.\n * @param hrtime The hrtime in nanoseconds.\n * @param padding The padding to use (optional, defaults to 8).\n * @returns The formatted string.\n */\nexport function formatHRTime(hrtime: bigint | number, padding = 8): string {\n\t// Hours\n\tif (hrtime >= 3600000000000000n) {\n\t\treturn `${(Number(hrtime) / 3600000000000000).toLocaleString(\"en-US\", {\n\t\t\tminimumFractionDigits: 2,\n\t\t\tmaximumFractionDigits: 2,\n\t\t})}h`.padStart(padding, \" \")\n\t}\n\n\t// Minutes\n\tif (hrtime >= 60000000000n) {\n\t\treturn `${(Number(hrtime) / 60000000000).toLocaleString(\"en-US\", {\n\t\t\tminimumFractionDigits: 2,\n\t\t\tmaximumFractionDigits: 2,\n\t\t})}m`.padStart(padding, \" \")\n\t}\n\n\t// Seconds\n\tif (hrtime >= 1000000000n) {\n\t\treturn `${(Number(hrtime) / 1000000000).toLocaleString(\"en-US\", {\n\t\t\tminimumFractionDigits: 2,\n\t\t\tmaximumFractionDigits: 2,\n\t\t})}s`.padStart(padding, \" \")\n\t}\n\n\t// Milliseconds\n\tif (hrtime >= 1000000n) {\n\t\treturn `${(Number(hrtime) / 1000000).toLocaleString(\"en-US\", {\n\t\t\tminimumFractionDigits: 2,\n\t\t\tmaximumFractionDigits: 2,\n\t\t})}ms`.padStart(padding, \" \")\n\t}\n\n\t// Microseconds\n\tif (hrtime >= 1000n) {\n\t\treturn `${(Number(hrtime) / 1000).toLocaleString(\"en-US\", {\n\t\t\tminimumFractionDigits: 2,\n\t\t\tmaximumFractionDigits: 2,\n\t\t})}µs`.padStart(padding, \" \")\n\t}\n\n\t// Nanoseconds\n\treturn `${hrtime.toLocaleString(\"en-US\", {\n\t\tminimumFractionDigits: 2,\n\t\tmaximumFractionDigits: 2,\n\t})}ns`.padStart(padding, \" \")\n}\n\n/**\n * Format a time in milliseconds into a responsive string with the en-US locale format.\n * @param time The time in milliseconds.\n * @param padding The padding to use (optional, defaults to 10).\n * @returns The formatted string.\n */\nexport function formatTime(time: number, padding = 10): string {\n\t// Hours\n\tif (time >= 3600000) {\n\t\treturn `${(time / 3600000).toLocaleString(\"en-US\", {\n\t\t\tminimumFractionDigits: 2,\n\t\t\tmaximumFractionDigits: 2,\n\t\t})}h`.padStart(padding, \" \")\n\t}\n\n\t// Minutes\n\tif (time >= 60000) {\n\t\treturn `${(time / 60000).toLocaleString(\"en-US\", {\n\t\t\tminimumFractionDigits: 2,\n\t\t\tmaximumFractionDigits: 2,\n\t\t})}m`.padStart(padding, \" \")\n\t}\n\n\t// Seconds\n\tif (time >= 1000) {\n\t\treturn `${(time / 1000).toLocaleString(\"en-US\", {\n\t\t\tminimumFractionDigits: 2,\n\t\t\tmaximumFractionDigits: 2,\n\t\t})}s`.padStart(padding, \" \")\n\t}\n\n\t// Milliseconds\n\treturn `${time.toLocaleString(\"en-US\", {\n\t\tminimumFractionDigits: 2,\n\t\tmaximumFractionDigits: 2,\n\t})}ms`.padStart(padding, \" \")\n}\n\n/**\n * Format a percentage with the en-US locale format.\n * @param percentage The percentage to format.\n * @param padding The padding to use (optional, defaults to 7).\n * @returns The formatted string.\n */\nexport function formatPercentage(percentage: number, padding = 7): string {\n\treturn `${percentage.toLocaleString(\"en-US\", {\n\t\tminimumFractionDigits: 2,\n\t\tmaximumFractionDigits: 2,\n\t})}%`.padStart(padding, \" \")\n}\n\n/**\n * Truncate a string to a certain length.\n * @param str The string to truncate.\n * @param len The maximum length of the string.\n * @returns The truncated string.\n */\nexport function truncateString(str: string, len: number) {\n\tif (str.length <= len) return str\n\treturn `${str.slice(0, len)}...`\n}\n","/**\n * Map a number to a range of numbers.\n * @param value The number to map.\n * @param inMin The minimum value of the input range.\n * @param inMax The maximum value of the input range.\n * @param outMin The minimum value of the output range.\n * @param outMax The maximum value of the output range.\n * @param clamp Whether to clamp the output value to the output range (optional, defaults to true).\n * @returns The mapped number.\n */\nexport function mapRange(\n\tvalue: number,\n\tinMin: number,\n\tinMax: number,\n\toutMin: number,\n\toutMax: number,\n\tclamp = true,\n): number {\n\tconst mappedValue = ((value - inMin) * (outMax - outMin)) / (inMax - inMin) + outMin\n\n\tif (clamp) return Math.min(Math.max(mappedValue, outMin), outMax)\n\treturn mappedValue\n}\n","/**\n * A fully permissive Content Security Policy header that can be used for development purposes,\n * no need to say that this should **NEVER** be used in production...\n */\nexport const fullyPermissiveCspHeader = `\n default-src * data: mediastream: blob: filesystem: about: ws: wss: 'unsafe-eval' 'wasm-unsafe-eval' 'unsafe-inline';\n script-src * data: blob: 'unsafe-inline' 'unsafe-eval';\n script-src-elem * data: blob: 'unsafe-inline';\n connect-src * data: blob: 'unsafe-inline';\n img-src * data: blob: 'unsafe-inline';\n media-src * data: blob: 'unsafe-inline';\n frame-src * data: blob: ;\n style-src * data: blob: 'unsafe-inline';\n font-src * data: blob: 'unsafe-inline';\n frame-ancestors * data: blob:;\n`\n\t.replace(/\\s{2,}/g, \" \")\n\t.trim()\n","/**\n * Safely converts any error into a string for parsing/searching.\n * @param error The error to convert.\n * @returns The error as a string.\n */\nexport function convertErrorToString(error: unknown): string {\n\tif (typeof error === \"string\") return error\n\n\tlet stringifiedError = \"\"\n\ttry {\n\t\tstringifiedError = JSON.stringify(error)\n\t} catch (_) {\n\t\t// Ignore\n\t}\n\n\tif (stringifiedError === \"\" || stringifiedError === \"{}\") stringifiedError = `${error}`\n\treturn stringifiedError\n}\n\n/**\n * Decodes all components of an object as URI components (e.g., for decoding Next.js `req.query`).\n * @param obj The object to decode.\n * @returns The decoded object.\n */\nexport function decodeObjectURIComponents(\n\tobj: Partial<{ [key: string]: string | string[] }>,\n): Partial<{ [key: string]: string | string[] }> {\n\tfor (const key in obj) {\n\t\ttry {\n\t\t\tobj[key] = decodeURIComponent(String(obj[key]))\n\t\t} catch (_) {\n\t\t\t// Ignore decoding errors\n\t\t}\n\t}\n\n\treturn obj\n}\n","/**\n * Shades a color by a percentage.\n * @param color The color to shade.\n * @param percent The percentage to shade by.\n * @returns The shaded color.\n */\nexport function shadeColor(color: string, percent: number) {\n\tlet R = Number.parseInt(color.substring(1, 3), 16)\n\tlet G = Number.parseInt(color.substring(3, 5), 16)\n\tlet B = Number.parseInt(color.substring(5, 7), 16)\n\n\tR = Math.round((R * (100 + percent)) / 100)\n\tG = Math.round((G * (100 + percent)) / 100)\n\tB = Math.round((B * (100 + percent)) / 100)\n\n\tR = R < 255 ? R : 255\n\tG = G < 255 ? G : 255\n\tB = B < 255 ? B : 255\n\n\tR = Math.round(R)\n\tG = Math.round(G)\n\tB = Math.round(B)\n\n\tconst RR = R.toString(16).length === 1 ? `0${R.toString(16)}` : R.toString(16)\n\tconst GG = G.toString(16).length === 1 ? `0${G.toString(16)}` : G.toString(16)\n\tconst BB = B.toString(16).length === 1 ? `0${B.toString(16)}` : B.toString(16)\n\n\treturn `#${RR}${GG}${BB}`\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cybearl/cypack",
3
3
  "productName": "CyPack",
4
- "version": "1.8.8",
4
+ "version": "1.8.9",
5
5
  "description": "A set of general utilities for Cybearl projects.",
6
6
  "author": "Cybearl <contact@cybearl.com> (https://www.cybearl.com/)",
7
7
  "license": "MIT",