@cybearl/cypack 1.9.1 → 1.10.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.
package/frontend.d.ts CHANGED
@@ -18,24 +18,24 @@ type CGASStatusString = "enabled" | "disabled" | "in-maintenance" | "in-developm
18
18
  * - `in-development`: The application is in development mode and not available to the public.
19
19
  */
20
20
  type CGASStatus = {
21
- status: CGASStatusString
22
- marker: string
23
- timestamp: string
24
- version: {
25
- raw: string
26
- formatted: `v${string}` | "unavailable"
27
- }
28
- message: string
21
+ status: CGASStatusString
22
+ marker: string
23
+ timestamp: string
24
+ version: {
25
+ raw: string
26
+ formatted: `v${string}` | "unavailable"
27
+ }
28
+ message: string
29
29
  }
30
30
 
31
31
  /**
32
32
  * The type definition for an error object.
33
33
  */
34
34
  type ErrorObj = {
35
- status: number
36
- name: string
37
- message: string
38
- data: unknown
35
+ status: number
36
+ name: string
37
+ message: string
38
+ data: unknown
39
39
  }
40
40
 
41
41
  /**
@@ -45,8 +45,8 @@ type ErrorObj = {
45
45
  * directly.
46
46
  */
47
47
  type SuccessfulRequest<T> = {
48
- success: true
49
- data: T
48
+ success: true
49
+ data: T
50
50
  }
51
51
 
52
52
  /**
@@ -56,9 +56,9 @@ type SuccessfulRequest<T> = {
56
56
  * directly.
57
57
  */
58
58
  type FailedRequest = {
59
- success: false
60
- message: string
61
- error: ErrorObj
59
+ success: false
60
+ message: string
61
+ error: ErrorObj
62
62
  }
63
63
 
64
64
  /**
package/frontend.js CHANGED
@@ -1,2 +1,2 @@
1
- async function a(n=false,s="/api/cgas"){return await(await fetch(`${s}/status?markerOnly=${n}`)).json()}var o={status:"disabled",marker:"fallback-marker",timestamp:new Date().toISOString(),version:{raw:"unavailable",formatted:"unavailable"},message:"This API is not available, please try again later."};function i(n,s){let e=n;for(let[r,t]of Object.entries(s))t==null||t===""||t==="null"||t==="undefined"||(e+=`${e.includes("?")?"&":"?"}${encodeURIComponent(r)}=${encodeURIComponent(t.toString())}`);return e}var u=typeof window<"u"&&window.location.origin?window.location.origin:null;export{i as addParamsToUrl,u as currentUrlOrigin,o as fallbackCGASStatus,a as getCGASStatus};//# sourceMappingURL=frontend.js.map
1
+ async function a(n=false,s="/api/cgas"){return await(await fetch(`${s}/status?markerOnly=${n}`)).json()}var o={status:"disabled",marker:"fallback-marker",timestamp:new Date().toISOString(),version:{raw:"unavailable",formatted:"unavailable"},message:"This API is not available, please try again later."};function i(n,s){let e=n;for(let[r,t]of Object.entries(s))t==null||t===""||t==="null"||t==="undefined"||(e+=`${e.includes("?")?"&":"?"}${encodeURIComponent(r)}=${encodeURIComponent(t.toString())}`);return e}var u=window?.location.origin?window.location.origin:null;export{i as addParamsToUrl,u as currentUrlOrigin,o as fallbackCGASStatus,a as getCGASStatus};//# sourceMappingURL=frontend.js.map
2
2
  //# sourceMappingURL=frontend.js.map
package/frontend.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/frontend/cgas/status.ts","../src/frontend/urls.ts"],"names":["getCGASStatus","markerOnly","baseUrl","fallbackCGASStatus","addParamsToUrl","params","url","key","value","currentUrlOrigin"],"mappings":"AAWA,eAAsBA,CAAAA,CACrBC,EAAa,KAAA,CACbC,CAAAA,CAAU,YACoC,CAG9C,OADe,MADE,MAAM,KAAA,CAAM,GAAGA,CAAO,CAAA,mBAAA,EAAsBD,CAAU,CAAA,CAAE,CAAA,EAC3C,MAE/B,CAKO,IAAME,CAAAA,CAAiC,CAC7C,MAAA,CAAQ,WACR,MAAA,CAAQ,iBAAA,CACR,UAAW,IAAI,IAAA,GAAO,WAAA,EAAY,CAClC,OAAA,CAAS,CACR,GAAA,CAAK,aAAA,CACL,UAAW,aACZ,CAAA,CACA,QAAS,oDACV,EC1BO,SAASC,CAAAA,CACfF,CAAAA,CACAG,CAAAA,CAGC,CACD,IAAIC,CAAAA,CAAMJ,EAEV,IAAA,GAAW,CAACK,EAAKC,CAAK,CAAA,GAAK,OAAO,OAAA,CAAQH,CAAM,CAAA,CACpBG,CAAAA,EAAU,IAAA,EAAQA,CAAAA,GAAU,IAAMA,CAAAA,GAAU,MAAA,EAAUA,IAAU,WAAA,GAI3FF,CAAAA,EAAO,GAAGA,CAAAA,CAAI,QAAA,CAAS,GAAG,CAAA,CAAI,GAAA,CAAM,GAAG,GAAG,kBAAA,CAAmBC,CAAG,CAAC,CAAA,CAAA,EAAI,kBAAA,CAAmBC,EAAM,QAAA,EAAU,CAAC,CAAA,CAAA,CAAA,CAG1G,OAAOF,CACR,CAKO,IAAMG,CAAAA,CAAmB,OAAO,MAAA,CAAW,GAAA,EAAe,OAAO,QAAA,CAAS,MAAA,CAAS,MAAA,CAAO,QAAA,CAAS,MAAA,CAAS","file":"frontend.js","sourcesContent":["import type { CGASStatus } from \"@/main/types/cgas\"\nimport type { RequestResult } from \"@/main/types/requests\"\n\n/**\n * Get the status of the application via the CGAS API endpoint (that itself uses the `getCGASStatus` function).\n * @param markerOnly Whether to only return the marker (optional, defaults to false).\n * @param baseUrl The base URL of the CGAS API (optional, defaults to \"/api/cgas\").\n * @returns The status of the application, or the marker if `markerOnly` is true.\n */\nexport async function getCGASStatus(markerOnly: true, baseUrl?: string): Promise<RequestResult<string>>\nexport async function getCGASStatus(markerOnly?: false, baseUrl?: string): Promise<RequestResult<CGASStatus>>\nexport async function getCGASStatus(\n\tmarkerOnly = false,\n\tbaseUrl = \"/api/cgas\",\n): Promise<RequestResult<CGASStatus | string>> {\n\tconst response = await fetch(`${baseUrl}/status?markerOnly=${markerOnly}`)\n\tconst result = await response.json()\n\treturn result as RequestResult<CGASStatus | string>\n}\n\n/**\n * The fallback CGAS status, used when the CGAS API is not available.\n */\nexport const fallbackCGASStatus: CGASStatus = {\n\tstatus: \"disabled\",\n\tmarker: \"fallback-marker\",\n\ttimestamp: new Date().toISOString(),\n\tversion: {\n\t\traw: \"unavailable\",\n\t\tformatted: \"unavailable\",\n\t},\n\tmessage: \"This API is not available, please try again later.\",\n}\n","/**\n * Allows to add query parameters to a URL.\n * @param baseUrl The base URL to add parameters to.\n * @param params The parameters to add, note that each parameter will be URL-encoded.\n * @returns The URL with the parameters added.\n */\nexport function addParamsToUrl(\n\tbaseUrl: string,\n\tparams: {\n\t\t[key: string]: string | number | boolean | undefined | null\n\t},\n) {\n\tlet url = baseUrl\n\n\tfor (const [key, value] of Object.entries(params)) {\n\t\tif (value === undefined || value === null || value === \"\" || value === \"null\" || value === \"undefined\") {\n\t\t\tcontinue\n\t\t}\n\n\t\turl += `${url.includes(\"?\") ? \"&\" : \"?\"}${encodeURIComponent(key)}=${encodeURIComponent(value.toString())}`\n\t}\n\n\treturn url\n}\n\n/**\n * Get the current URL origin or null if it's not available.\n */\nexport const currentUrlOrigin = typeof window !== \"undefined\" && window.location.origin ? window.location.origin : null\n"]}
1
+ {"version":3,"sources":["../src/frontend/cgas/status.ts","../src/frontend/urls.ts"],"names":["getCGASStatus","markerOnly","baseUrl","fallbackCGASStatus","addParamsToUrl","params","url","key","value","currentUrlOrigin"],"mappings":"AAWA,eAAsBA,CAAAA,CAClBC,EAAa,KAAA,CACbC,CAAAA,CAAU,YACiC,CAG3C,OADe,MADE,MAAM,KAAA,CAAM,GAAGA,CAAO,CAAA,mBAAA,EAAsBD,CAAU,CAAA,CAAE,CAAA,EAC3C,MAElC,CAKO,IAAME,CAAAA,CAAiC,CAC1C,MAAA,CAAQ,WACR,MAAA,CAAQ,iBAAA,CACR,UAAW,IAAI,IAAA,GAAO,WAAA,EAAY,CAClC,QAAS,CACL,GAAA,CAAK,cACL,SAAA,CAAW,aACf,EACA,OAAA,CAAS,oDACb,EC1BO,SAASC,CAAAA,CACZF,CAAAA,CACAG,CAAAA,CAGF,CACE,IAAIC,EAAMJ,CAAAA,CAEV,IAAA,GAAW,CAACK,CAAAA,CAAKC,CAAK,IAAK,MAAA,CAAO,OAAA,CAAQH,CAAM,CAAA,CACjBG,CAAAA,EAAU,MAAQA,CAAAA,GAAU,EAAA,EAAMA,IAAU,MAAA,EAAUA,CAAAA,GAAU,cAI3FF,CAAAA,EAAO,CAAA,EAAGA,CAAAA,CAAI,QAAA,CAAS,GAAG,CAAA,CAAI,IAAM,GAAG,CAAA,EAAG,mBAAmBC,CAAG,CAAC,IAAI,kBAAA,CAAmBC,CAAAA,CAAM,UAAU,CAAC,IAG7G,OAAOF,CACX,CAKO,IAAMG,CAAAA,CAAmB,QAAQ,QAAA,CAAS,MAAA,CAAS,MAAA,CAAO,QAAA,CAAS,MAAA,CAAS","file":"frontend.js","sourcesContent":["import type { CGASStatus } from \"@/main/types/cgas\"\nimport type { RequestResult } from \"@/main/types/requests\"\n\n/**\n * Get the status of the application via the CGAS API endpoint (that itself uses the `getCGASStatus` function).\n * @param markerOnly Whether to only return the marker (optional, defaults to false).\n * @param baseUrl The base URL of the CGAS API (optional, defaults to \"/api/cgas\").\n * @returns The status of the application, or the marker if `markerOnly` is true.\n */\nexport async function getCGASStatus(markerOnly: true, baseUrl?: string): Promise<RequestResult<string>>\nexport async function getCGASStatus(markerOnly?: false, baseUrl?: string): Promise<RequestResult<CGASStatus>>\nexport async function getCGASStatus(\n markerOnly = false,\n baseUrl = \"/api/cgas\",\n): Promise<RequestResult<CGASStatus | string>> {\n const response = await fetch(`${baseUrl}/status?markerOnly=${markerOnly}`)\n const result = await response.json()\n return result as RequestResult<CGASStatus | string>\n}\n\n/**\n * The fallback CGAS status, used when the CGAS API is not available.\n */\nexport const fallbackCGASStatus: CGASStatus = {\n status: \"disabled\",\n marker: \"fallback-marker\",\n timestamp: new Date().toISOString(),\n version: {\n raw: \"unavailable\",\n formatted: \"unavailable\",\n },\n message: \"This API is not available, please try again later.\",\n}\n","/**\n * Allows to add query parameters to a URL.\n * @param baseUrl The base URL to add parameters to.\n * @param params The parameters to add, note that each parameter will be URL-encoded.\n * @returns The URL with the parameters added.\n */\nexport function addParamsToUrl(\n baseUrl: string,\n params: {\n [key: string]: string | number | boolean | undefined | null\n },\n) {\n let url = baseUrl\n\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined || value === null || value === \"\" || value === \"null\" || value === \"undefined\") {\n continue\n }\n\n url += `${url.includes(\"?\") ? \"&\" : \"?\"}${encodeURIComponent(key)}=${encodeURIComponent(value.toString())}`\n }\n\n return url\n}\n\n/**\n * Get the current URL origin or null if it's not available.\n */\nexport const currentUrlOrigin = window?.location.origin ? window.location.origin : null\n"]}
package/index.d.ts CHANGED
@@ -38,10 +38,10 @@ declare const CyCONSTANTS: {
38
38
  * The type definition for an error object.
39
39
  */
40
40
  type ErrorObj = {
41
- status: number
42
- name: string
43
- message: string
44
- data: unknown
41
+ status: number
42
+ name: string
43
+ message: string
44
+ data: unknown
45
45
  }
46
46
 
47
47
  /**
@@ -51,8 +51,8 @@ type ErrorObj = {
51
51
  * directly.
52
52
  */
53
53
  type SuccessfulRequest<T> = {
54
- success: true
55
- data: T
54
+ success: true
55
+ data: T
56
56
  }
57
57
 
58
58
  /**
@@ -62,9 +62,9 @@ type SuccessfulRequest<T> = {
62
62
  * directly.
63
63
  */
64
64
  type FailedRequest = {
65
- success: false
66
- message: string
67
- error: ErrorObj
65
+ success: false
66
+ message: string
67
+ error: ErrorObj
68
68
  }
69
69
 
70
70
  /**
@@ -299,6 +299,25 @@ declare function stringify(object: unknown, indent?: number): string;
299
299
  * @returns The mapped number.
300
300
  */
301
301
  declare function mapRange(value: number, inMin: number, inMax: number, outMin: number, outMax: number, clamp?: boolean): number;
302
+ /**
303
+ * Safely creates an average value based on a total and count coming from
304
+ * a Lucid ORM / SQL query result.
305
+ * @param total The total value.
306
+ * @param count The count value.
307
+ * @returns The calculated average, or 0 if the count is zero or invalid.
308
+ */
309
+ declare function safeAverage(total?: string | number, count?: string | number): number;
310
+ /**
311
+ * Safely creates a percentage based on a numerator and denominator coming from
312
+ * a Lucid ORM / SQL query result.
313
+ *
314
+ * Note: If the denominator is zero, this function will return `-1` if the
315
+ * numerator is greater than zero, showing it as a growth from nothing to something.
316
+ * @param numerator The numerator value.
317
+ * @param denominator The denominator value.
318
+ * @returns The calculated percentage, or 0 if the denominator is zero or invalid.
319
+ */
320
+ declare function safePercentage(numerator?: string | number, denominator?: string | number): number;
302
321
 
303
322
  /**
304
323
  * A fully permissive Content Security Policy header that can be used for development purposes,
@@ -351,14 +370,14 @@ type CGASStatusString = "enabled" | "disabled" | "in-maintenance" | "in-developm
351
370
  * - `in-development`: The application is in development mode and not available to the public.
352
371
  */
353
372
  type CGASStatus = {
354
- status: CGASStatusString
355
- marker: string
356
- timestamp: string
357
- version: {
358
- raw: string
359
- formatted: `v${string}` | "unavailable"
360
- }
361
- message: string
373
+ status: CGASStatusString
374
+ marker: string
375
+ timestamp: string
376
+ version: {
377
+ raw: string
378
+ formatted: `v${string}` | "unavailable"
379
+ }
380
+ message: string
362
381
  }
363
382
 
364
- 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, isValidIntId, isValidSlug, mapRange, parseCRUDError, parseQueryNumberArray, parseQueryStringArray, shadeColor, stringify, stringifyError, truncateString };
383
+ 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, isValidIntId, isValidSlug, mapRange, parseCRUDError, parseQueryNumberArray, parseQueryStringArray, safeAverage, safePercentage, shadeColor, stringify, stringifyError, truncateString };
package/index.js CHANGED
@@ -1,5 +1,5 @@
1
- function u(){return typeof window>"u"}function g(){return !u()}var l={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"},m=l;function f(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 S(t,r,e){let n;return e?n={...t,data:e}:n=t,{success:false,message:r||t.message,error:n}}function p(t,r,e){r&&(t.message=r);let n;return e?n={...t,data:e}:n=t,JSON.stringify(n,(s,a)=>typeof a=="function"||typeof a=="bigint"?a.toString():a,4)}function E(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){return typeof t=="string"&&t.length>0&&Number.isInteger(Number(t))&&Number(t)>=0}function b(t){return typeof t=="string"&&t.length>0&&m.SLUG_REGEX.test(t)}function R(t,r="Op",e="s",n=12,i=true){let s;typeof r=="string"&&typeof e=="string"?s=`${r}/${e}`:typeof r=="string"?s=r:s="";let a=i?" ":"";return t>=10**24?`${(t/10**24).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}${a}Y${s}`.padStart(n," "):t>=10**18?`${(t/10**18).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}${a}E${s}`.padStart(n," "):t>=10**15?`${(t/10**15).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}${a}P${s}`.padStart(n," "):t>=10**12?`${(t/10**12).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}${a}T${s}`.padStart(n," "):t>=10**9?`${(t/10**9).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}${a}G${s}`.padStart(n," "):t>=10**6?`${(t/10**6).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}${a}M${s}`.padStart(n," "):t>=10**3?`${(t/10**3).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}${a}k${s}`.padStart(n," "):`${t.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}${a}${s}`.padStart(n," ")}function A(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 x(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 y(t,r){return t.length<=r?t:`${t.slice(0,r)}...`}function T(t){let r=[],e=Array.isArray(t)?t:t.split(",").map(n=>n.trim());for(let n of e){let i=Number.parseInt(n,10);Number.isNaN(i)||r.push(i);}return r}function U(t){let r=[],e=Array.isArray(t)?t:t.split(",").map(n=>n.trim());for(let n of e)n.length>0&&r.push(n);return r}function L(t,r,e,n,i,s=true){let a=(t-r)*(i-n)/(e-r)+n;return s?Math.min(Math.max(a,n),i):a}var F=`
1
+ function u(){return typeof window>"u"}function c(){return !u()}var f={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"},m=f;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 S(t,r,e){let n;return e?n={...t,data:e}:n=t,{success:false,message:r||t.message,error:n}}function p(t,r,e){r&&(t.message=r);let n;return e?n={...t,data:e}:n=t,JSON.stringify(n,(s,a)=>typeof a=="function"||typeof a=="bigint"?a.toString():a,4)}function E(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 b(t){return typeof t=="string"&&t.length>0&&Number.isInteger(Number(t))&&Number(t)>=0}function _(t){return typeof t=="string"&&t.length>0&&m.SLUG_REGEX.test(t)}function x(t,r="Op",e="s",n=12,i=true){let s;typeof r=="string"&&typeof e=="string"?s=`${r}/${e}`:typeof r=="string"?s=r:s="";let a=i?" ":"";return t>=10**24?`${(t/10**24).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}${a}Y${s}`.padStart(n," "):t>=10**18?`${(t/10**18).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}${a}E${s}`.padStart(n," "):t>=10**15?`${(t/10**15).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}${a}P${s}`.padStart(n," "):t>=10**12?`${(t/10**12).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}${a}T${s}`.padStart(n," "):t>=10**9?`${(t/10**9).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}${a}G${s}`.padStart(n," "):t>=10**6?`${(t/10**6).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}${a}M${s}`.padStart(n," "):t>=10**3?`${(t/10**3).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}${a}k${s}`.padStart(n," "):`${t.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}${a}${s}`.padStart(n," ")}function A(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 R(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 y(t,r=7){return `${t.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}%`.padStart(r," ")}function D(t,r){return t.length<=r?t:`${t.slice(0,r)}...`}function F(t){let r=[],e=Array.isArray(t)?t:t.split(",").map(n=>n.trim());for(let n of e){let i=Number.parseInt(n,10);Number.isNaN(i)||r.push(i);}return r}function T(t){let r=[],e=Array.isArray(t)?t:t.split(",").map(n=>n.trim());for(let n of e)n.length>0&&r.push(n);return r}function U(t,r,e,n,i,s=true){let a=(t-r)*(i-n)/(e-r)+n;return s?Math.min(Math.max(a,n),i):a}function L(t,r){if(!r)return 0;let e=typeof t=="string"?parseFloat(t):t,n=typeof r=="string"?parseFloat(r):r;return (e||0)/(n||1)}function I(t,r){if(!r)return 0;let e=typeof t=="string"?parseFloat(t):t,n=typeof r=="string"?parseFloat(r):r;return n?parseFloat((((e||0)-(n||0))/(n||1)*100).toFixed(2)):e&&e>0?-1:0}var $=`
3
3
  default-src * data: mediastream: blob: filesystem: about: ws: wss: 'unsafe-eval' 'wasm-unsafe-eval' 'unsafe-inline';
4
4
  script-src * data: blob: 'unsafe-inline' 'unsafe-eval';
5
5
  script-src-elem * data: blob: 'unsafe-inline';
@@ -10,5 +10,5 @@ function u(){return typeof window>"u"}function g(){return !u()}var l={HASH_SALT_
10
10
  style-src * data: blob: 'unsafe-inline';
11
11
  font-src * data: blob: 'unsafe-inline';
12
12
  frame-ancestors * data: blob:;
13
- `.replace(/\s{2,}/g," ").trim();function I(t){if(typeof t=="string")return t;let r="";try{r=JSON.stringify(t);}catch{}return (r===""||r==="{}")&&(r=`${t}`),r}function $(t){for(let r in t)try{t[r]=decodeURIComponent(String(t[r]));}catch{}return t}function O(t,r){let e=Number.parseInt(t.substring(1,3),16),n=Number.parseInt(t.substring(3,5),16),i=Number.parseInt(t.substring(5,7),16);e=Math.round(e*(100+r)/100),n=Math.round(n*(100+r)/100),i=Math.round(i*(100+r)/100),e=e<255?e:255,n=n<255?n:255,i=i<255?i:255,e=Math.round(e),n=Math.round(n),i=Math.round(i);let s=e.toString(16).length===1?`0${e.toString(16)}`:e.toString(16),a=n.toString(16).length===1?`0${n.toString(16)}`:n.toString(16),c=i.toString(16).length===1?`0${i.toString(16)}`:i.toString(16);return `#${s}${a}${c}`}export{N as BaseErrors,m as CyCONSTANTS,I as convertErrorToString,$ as decodeObjectURIComponents,S as formatErrorResponse,A as formatHRTime,f as formatJson,d as formatMessageAsStringifiedError,D as formatPercentage,x as formatTime,R as formatUnit,F as fullyPermissiveCspHeader,g as isClient,u as isServer,_ as isValidIntId,b as isValidSlug,L as mapRange,E as parseCRUDError,T as parseQueryNumberArray,U as parseQueryStringArray,O as shadeColor,o as stringify,p as stringifyError,y as truncateString};//# sourceMappingURL=index.js.map
13
+ `.replace(/\s{2,}/g," ").trim();function O(t){if(typeof t=="string")return t;let r="";try{r=JSON.stringify(t);}catch{}return (r===""||r==="{}")&&(r=`${t}`),r}function M(t){for(let r in t)try{t[r]=decodeURIComponent(String(t[r]));}catch{}return t}function w(t,r){let e=Number.parseInt(t.substring(1,3),16),n=Number.parseInt(t.substring(3,5),16),i=Number.parseInt(t.substring(5,7),16);e=Math.round(e*(100+r)/100),n=Math.round(n*(100+r)/100),i=Math.round(i*(100+r)/100),e=e<255?e:255,n=n<255?n:255,i=i<255?i:255,e=Math.round(e),n=Math.round(n),i=Math.round(i);let s=e.toString(16).length===1?`0${e.toString(16)}`:e.toString(16),a=n.toString(16).length===1?`0${n.toString(16)}`:n.toString(16),g=i.toString(16).length===1?`0${i.toString(16)}`:i.toString(16);return `#${s}${a}${g}`}export{N as BaseErrors,m as CyCONSTANTS,O as convertErrorToString,M as decodeObjectURIComponents,S as formatErrorResponse,A as formatHRTime,l as formatJson,d as formatMessageAsStringifiedError,y as formatPercentage,R as formatTime,x as formatUnit,$ as fullyPermissiveCspHeader,c as isClient,u as isServer,b as isValidIntId,_ as isValidSlug,U as mapRange,E as parseCRUDError,F as parseQueryNumberArray,T as parseQueryStringArray,L as safeAverage,I as safePercentage,w as shadeColor,o as stringify,p as stringifyError,D as truncateString};//# sourceMappingURL=index.js.map
14
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/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","isValidIntId","id","isValidSlug","slug","formatUnit","num","unit","timeUnit","padding","addSpaceBeforeUnit","strUnit","spaceOrNot","formatHRTime","hrtime","formatTime","time","formatPercentage","percentage","truncateString","len","parseQueryNumberArray","query","result","items","item","parseQueryStringArray","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","import CyCONSTANTS from \"@/main/constants\"\n\n/**\n * Validate a direct ID parameter (as integer for SQL DBs etc..).\n * @param id The ID to validate.\n * @returns True if the ID is valid, false otherwise.\n */\nexport function isValidIntId(id: string): boolean {\n\treturn typeof id === \"string\" && id.length > 0 && Number.isInteger(Number(id)) && Number(id) >= 0\n}\n\n/**\n * Validates a slug.\n * @param slug The slug to validate.\n * @returns True if the slug is valid, false otherwise.\n */\nexport function isValidSlug(slug: string): boolean {\n\treturn typeof slug === \"string\" && slug.length > 0 && CyCONSTANTS.SLUG_REGEX.test(slug)\n}\n\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/**\n * Parse a query containing either a number or numbers separated by commas and returns an array of numbers.\n * @param query The query string to parse.\n * @returns An array of numbers extracted from the query.\n */\nexport function parseQueryNumberArray(query: string | Array<string>): number[] {\n\tconst result: number[] = []\n\tconst items = Array.isArray(query) ? query : query.split(\",\").map(item => item.trim())\n\n\tfor (const item of items) {\n\t\tconst num = Number.parseInt(item, 10)\n\t\tif (!Number.isNaN(num)) result.push(num)\n\t}\n\n\treturn result\n}\n\n/**\n * Parse a query containing either a string or strings separated by commas and returns an array of strings.\n * @param query The query string to parse.\n * @returns An array of strings extracted from the query.\n */\nexport function parseQueryStringArray(query: string | Array<string>): string[] {\n\tconst result: string[] = []\n\tconst items = Array.isArray(query) ? query : query.split(\",\").map(item => item.trim())\n\n\tfor (const item of items) {\n\t\tif (item.length > 0) result.push(item)\n\t}\n\n\treturn result\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","isValidIntId","id","isValidSlug","slug","formatUnit","num","unit","timeUnit","padding","addSpaceBeforeUnit","strUnit","spaceOrNot","formatHRTime","hrtime","formatTime","time","formatPercentage","percentage","truncateString","len","parseQueryNumberArray","query","result","items","item","parseQueryStringArray","mapRange","inMin","inMax","outMin","outMax","clamp","mappedValue","safeAverage","total","count","parsedTotal","parsedCount","safePercentage","numerator","denominator","parsedNumerator","parsedDenominator","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 return typeof window === \"undefined\"\n}\n\n/**\n * Returns true if the code is running in a client environment.\n */\nexport function isClient() {\n return !isServer()\n}\n","/**\n * A set of general constants.\n */\nconst CyCONSTANTS = {\n // Security\n HASH_SALT_ROUNDS: 12,\n\n // User\n MIN_USERNAME_LENGTH: 4,\n MAX_USERNAME_LENGTH: 36,\n MIN_PASSWORD_LENGTH: 8,\n MAX_PASSWORD_LENGTH: 255,\n MAX_NAME_LENGTH: 255,\n MAX_SLUG_LENGTH: 255,\n MIN_FIRST_NAME_LENGTH: 1,\n MAX_FIRST_NAME_LENGTH: 36,\n MIN_LAST_NAME_LENGTH: 1,\n MAX_LAST_NAME_LENGTH: 36,\n MAX_DESCRIPTION_LENGTH: 1024,\n MAX_URL_LENGTH: 2048,\n MAX_MIME_TYPE_LENGTH: 255,\n MAX_EXTERNAL_LINKS_COUNT: 6,\n USERNAME_REGEX: /^[a-zA-Z0-9_.-]+$/,\n SLUG_REGEX: /^[a-zA-Z0-9-]+$/,\n\n // Image & Video sizes\n IMG_SIZES_HIGH_QUALITY: \"(max-width: 768px) 100vw, (max-width: 1200px) 75vw, 50vw\",\n IMG_SIZES_MEDIUM_QUALITY: \"(max-width: 768px) 100vw, (max-width: 1200px) 60vw, 40vw\",\n IMG_SIZES_BASE_QUALITY: \"(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw\",\n IMG_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 return 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 return JSON.stringify(\n object,\n (_, value) => {\n if (typeof value === \"function\") return value.toString()\n if (typeof value === \"bigint\") return value.toString()\n\n return value\n },\n indent,\n )\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 let err: ErrorObj\n if (additionalData) err = { ...error, data: additionalData }\n else err = error\n\n return {\n success: false,\n message: customMessage || error.message,\n error: err,\n }\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 if (message) error.message = message\n\n let err: ErrorObj\n if (additionalData) err = { ...error, data: additionalData }\n else err = error\n\n // Allow special keys in the JSON stringification\n const allowSpecialKeys = (_: string, value: unknown) => {\n if (typeof value === \"function\") return value.toString()\n if (typeof value === \"bigint\") return value.toString()\n\n return value\n }\n\n return 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 let errorString = \"\"\n\n try {\n try {\n errorString = (error as any).toString()\n } catch (_) {\n errorString = stringify(error)\n }\n } catch (_) {\n errorString = \"Unknown error\"\n }\n\n return {\n success: false,\n message: \"An error occurred while performing a CRUD operation.\",\n error: {\n status: 500,\n name: \"CRUD_ERROR\",\n message: \"CRUD operation failed.\",\n data: {\n rawError: error,\n error: errorString,\n },\n },\n }\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 let errorObj: ErrorObj = {\n status: 500,\n name: \"UNKNOWN_ERROR\",\n message: \"An unknown error occurred.\",\n data: null,\n }\n\n if (error) {\n try {\n // Testing with JSON.stringify to see if it's a valid JSON object\n stringify(error, 4)\n\n errorObj = error as ErrorObj\n } catch {\n // Convert the error to a basic non-escaped string\n errorObj = {\n ...errorObj,\n data: {\n rawError: `${error}`,\n },\n }\n }\n }\n\n const res = stringify({\n success: false,\n message,\n error: errorObj,\n })\n\n // Ensure that no \"Error: \" or line break ends up in the message\n return 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 //=====//\n // 400 //\n //=====//\n BAD_REQUEST: {\n status: 400,\n name: \"BadRequest\",\n message: \"Bad request.\",\n data: null,\n },\n //=====//\n // 401 //\n //=====//\n UNAUTHORIZED: {\n status: 401,\n name: \"Unauthorized\",\n message: \"Unauthorized.\",\n data: null,\n },\n //=====//\n // 402 //\n //=====//\n PAYMENT_REQUIRED: {\n status: 402,\n name: \"PaymentRequired\",\n message: \"Payment required.\",\n data: null,\n },\n //=====//\n // 403 //\n //=====//\n FORBIDDEN: {\n status: 403,\n name: \"Forbidden\",\n message: \"Forbidden.\",\n data: null,\n },\n //=====//\n // 404 //\n //=====//\n NOT_FOUND: {\n status: 404,\n name: \"NotFound\",\n message: \"Not found.\",\n data: null,\n },\n //=====//\n // 405 //\n //=====//\n METHOD_NOT_ALLOWED: {\n status: 405,\n name: \"MethodNotAllowed\",\n message: \"Method not allowed.\",\n data: null,\n },\n //=====//\n // 408 //\n //=====//\n REQUEST_TIMEOUT: {\n status: 408,\n name: \"RequestTimeout\",\n message: \"Request timed out.\",\n data: null,\n },\n //=====//\n // 409 //\n //=====//\n CONFLICT: {\n status: 409,\n name: \"Conflict\",\n message: \"Conflict.\",\n data: null,\n },\n //=====//\n // 500 //\n //=====//\n INTERNAL_SERVER_ERROR: {\n status: 500,\n name: \"InternalServerError\",\n message: \"Internal server error.\",\n data: null,\n },\n BACKEND_FUNCTION_RUNNING_ON_CLIENT: {\n status: 500,\n name: \"BackendFunctionRunningOnClient\",\n message: \"A function reserved for the backend is running on the client.\",\n data: null,\n },\n //=====//\n // 501 //\n //=====//\n NOT_IMPLEMENTED: {\n status: 501,\n name: \"NotImplemented\",\n message: \"Not implemented.\",\n data: null,\n },\n //=====//\n // 509 //\n //=====//\n BANDWIDTH_LIMIT_EXCEEDED: {\n status: 509,\n name: \"BandwidthLimitExceeded\",\n message: \"Bandwidth limit exceeded.\",\n data: null,\n },\n} as const satisfies Record<string, ErrorObj>\n","import CyCONSTANTS from \"@/main/constants\"\n\n/**\n * Validate a direct ID parameter (as integer for SQL DBs etc..).\n * @param id The ID to validate.\n * @returns True if the ID is valid, false otherwise.\n */\nexport function isValidIntId(id: string): boolean {\n return typeof id === \"string\" && id.length > 0 && Number.isInteger(Number(id)) && Number(id) >= 0\n}\n\n/**\n * Validates a slug.\n * @param slug The slug to validate.\n * @returns True if the slug is valid, false otherwise.\n */\nexport function isValidSlug(slug: string): boolean {\n return typeof slug === \"string\" && slug.length > 0 && CyCONSTANTS.SLUG_REGEX.test(slug)\n}\n\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 num: number,\n unit: string | null = \"Op\",\n timeUnit: string | null = \"s\",\n padding = 12,\n addSpaceBeforeUnit = true,\n): string {\n let strUnit: string\n\n if (typeof unit === \"string\" && typeof timeUnit === \"string\") {\n strUnit = `${unit}/${timeUnit}`\n } else if (typeof unit === \"string\") {\n strUnit = unit\n } else {\n strUnit = \"\"\n }\n\n // Add a space before the unit if needed\n const spaceOrNot = addSpaceBeforeUnit ? \" \" : \"\"\n\n // Y = yotta\n if (num >= 10 ** 24) {\n return `${(num / 10 ** 24).toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })}${spaceOrNot}Y${strUnit}`.padStart(padding, \" \")\n }\n\n // E = exa\n if (num >= 10 ** 18) {\n return `${(num / 10 ** 18).toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })}${spaceOrNot}E${strUnit}`.padStart(padding, \" \")\n }\n\n // P = peta\n if (num >= 10 ** 15) {\n return `${(num / 10 ** 15).toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })}${spaceOrNot}P${strUnit}`.padStart(padding, \" \")\n }\n\n // T = tera\n if (num >= 10 ** 12) {\n return `${(num / 10 ** 12).toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })}${spaceOrNot}T${strUnit}`.padStart(padding, \" \")\n }\n\n // G = giga\n if (num >= 10 ** 9) {\n return `${(num / 10 ** 9).toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })}${spaceOrNot}G${strUnit}`.padStart(padding, \" \")\n }\n\n // M = mega\n if (num >= 10 ** 6) {\n return `${(num / 10 ** 6).toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })}${spaceOrNot}M${strUnit}`.padStart(padding, \" \")\n }\n\n // k = kilo\n if (num >= 10 ** 3) {\n return `${(num / 10 ** 3).toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })}${spaceOrNot}k${strUnit}`.padStart(padding, \" \")\n }\n\n return `${num.toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })}${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 // Hours\n if (hrtime >= 3600000000000000n) {\n return `${(Number(hrtime) / 3600000000000000).toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })}h`.padStart(padding, \" \")\n }\n\n // Minutes\n if (hrtime >= 60000000000n) {\n return `${(Number(hrtime) / 60000000000).toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })}m`.padStart(padding, \" \")\n }\n\n // Seconds\n if (hrtime >= 1000000000n) {\n return `${(Number(hrtime) / 1000000000).toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })}s`.padStart(padding, \" \")\n }\n\n // Milliseconds\n if (hrtime >= 1000000n) {\n return `${(Number(hrtime) / 1000000).toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })}ms`.padStart(padding, \" \")\n }\n\n // Microseconds\n if (hrtime >= 1000n) {\n return `${(Number(hrtime) / 1000).toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })}µs`.padStart(padding, \" \")\n }\n\n // Nanoseconds\n return `${hrtime.toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })}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 // Hours\n if (time >= 3600000) {\n return `${(time / 3600000).toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })}h`.padStart(padding, \" \")\n }\n\n // Minutes\n if (time >= 60000) {\n return `${(time / 60000).toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })}m`.padStart(padding, \" \")\n }\n\n // Seconds\n if (time >= 1000) {\n return `${(time / 1000).toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })}s`.padStart(padding, \" \")\n }\n\n // Milliseconds\n return `${time.toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })}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 return `${percentage.toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })}%`.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 if (str.length <= len) return str\n return `${str.slice(0, len)}...`\n}\n\n/**\n * Parse a query containing either a number or numbers separated by commas and returns an array of numbers.\n * @param query The query string to parse.\n * @returns An array of numbers extracted from the query.\n */\nexport function parseQueryNumberArray(query: string | Array<string>): number[] {\n const result: number[] = []\n const items = Array.isArray(query) ? query : query.split(\",\").map(item => item.trim())\n\n for (const item of items) {\n const num = Number.parseInt(item, 10)\n if (!Number.isNaN(num)) result.push(num)\n }\n\n return result\n}\n\n/**\n * Parse a query containing either a string or strings separated by commas and returns an array of strings.\n * @param query The query string to parse.\n * @returns An array of strings extracted from the query.\n */\nexport function parseQueryStringArray(query: string | Array<string>): string[] {\n const result: string[] = []\n const items = Array.isArray(query) ? query : query.split(\",\").map(item => item.trim())\n\n for (const item of items) {\n if (item.length > 0) result.push(item)\n }\n\n return result\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 value: number,\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number,\n clamp = true,\n): number {\n const mappedValue = ((value - inMin) * (outMax - outMin)) / (inMax - inMin) + outMin\n\n if (clamp) return Math.min(Math.max(mappedValue, outMin), outMax)\n return mappedValue\n}\n\n/**\n * Safely creates an average value based on a total and count coming from\n * a Lucid ORM / SQL query result.\n * @param total The total value.\n * @param count The count value.\n * @returns The calculated average, or 0 if the count is zero or invalid.\n */\nexport function safeAverage(total?: string | number, count?: string | number): number {\n if (!count) return 0\n\n const parsedTotal = typeof total === \"string\" ? parseFloat(total) : total\n const parsedCount = typeof count === \"string\" ? parseFloat(count) : count\n\n return (parsedTotal || 0) / (parsedCount || 1)\n}\n\n/**\n * Safely creates a percentage based on a numerator and denominator coming from\n * a Lucid ORM / SQL query result.\n *\n * Note: If the denominator is zero, this function will return `-1` if the\n * numerator is greater than zero, showing it as a growth from nothing to something.\n * @param numerator The numerator value.\n * @param denominator The denominator value.\n * @returns The calculated percentage, or 0 if the denominator is zero or invalid.\n */\nexport function safePercentage(numerator?: string | number, denominator?: string | number): number {\n if (!denominator) return 0\n\n const parsedNumerator = typeof numerator === \"string\" ? parseFloat(numerator) : numerator\n const parsedDenominator = typeof denominator === \"string\" ? parseFloat(denominator) : denominator\n\n // -1 means growth from nothing to something\n if (!parsedDenominator) return parsedNumerator && parsedNumerator > 0 ? -1 : 0\n\n return parseFloat(\n ((((parsedNumerator || 0) - (parsedDenominator || 0)) / (parsedDenominator || 1)) * 100).toFixed(2),\n )\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 .replace(/\\s{2,}/g, \" \")\n .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 if (typeof error === \"string\") return error\n\n let stringifiedError = \"\"\n try {\n stringifiedError = JSON.stringify(error)\n } catch (_) {\n // Ignore\n }\n\n if (stringifiedError === \"\" || stringifiedError === \"{}\") stringifiedError = `${error}`\n return 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 obj: Partial<{ [key: string]: string | string[] }>,\n): Partial<{ [key: string]: string | string[] }> {\n for (const key in obj) {\n try {\n obj[key] = decodeURIComponent(String(obj[key]))\n } catch (_) {\n // Ignore decoding errors\n }\n }\n\n return 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 let R = Number.parseInt(color.substring(1, 3), 16)\n let G = Number.parseInt(color.substring(3, 5), 16)\n let B = Number.parseInt(color.substring(5, 7), 16)\n\n R = Math.round((R * (100 + percent)) / 100)\n G = Math.round((G * (100 + percent)) / 100)\n B = Math.round((B * (100 + percent)) / 100)\n\n R = R < 255 ? R : 255\n G = G < 255 ? G : 255\n B = B < 255 ? B : 255\n\n R = Math.round(R)\n G = Math.round(G)\n B = Math.round(B)\n\n const RR = R.toString(16).length === 1 ? `0${R.toString(16)}` : R.toString(16)\n const GG = G.toString(16).length === 1 ? `0${G.toString(16)}` : G.toString(16)\n const BB = B.toString(16).length === 1 ? `0${B.toString(16)}` : B.toString(16)\n\n return `#${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.9.1",
4
+ "version": "1.10.0",
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",
@@ -51,8 +51,8 @@
51
51
  },
52
52
  "scripts": {
53
53
  "knip": "knip",
54
- "lint": "biome lint . && biome format .",
55
- "lint:fix": "biome lint . --write && biome format --write .",
54
+ "lint": "biome check",
55
+ "lint:fix": "biome check --fix && biome format --write",
56
56
  "test:sandbox": "tsx ./tests/sandbox.ts",
57
57
  "test:bench": "tsx ./tests/benchmark.ts",
58
58
  "test:unit": "vitest",
@@ -64,23 +64,19 @@
64
64
  "colorette": "^2.0.20",
65
65
  "dateformat": "^5.0.3",
66
66
  "dedent-js": "^1.0.1",
67
- "pino": "^9.9.0",
67
+ "pino": "^9.12.0",
68
68
  "pino-pretty": "^13.1.1"
69
69
  },
70
70
  "peerDependencies": {
71
- "next": "^14.2.32",
72
- "next-auth": "^4.24.11",
73
- "react": "^18.3.1",
74
- "react-dom": "^18.3.1",
71
+ "next": "^15.5.4",
72
+ "react": "^19.1.1",
73
+ "react-dom": "^19.1.1",
75
74
  "typescript": ">=5.9.2"
76
75
  },
77
76
  "peerDependenciesMeta": {
78
77
  "next": {
79
78
  "optional": true
80
79
  },
81
- "next-auth": {
82
- "optional": true
83
- },
84
80
  "react": {
85
81
  "optional": true
86
82
  },
@@ -92,36 +88,36 @@
92
88
  }
93
89
  },
94
90
  "devDependencies": {
95
- "@biomejs/biome": "^1.9.4",
91
+ "@biomejs/biome": "^2.2.4",
96
92
  "@types/copyfiles": "^2.4.4",
97
93
  "@types/dateformat": "^5.0.3",
98
94
  "@types/minimist": "^1.2.5",
99
- "@types/node": "^24.3.0",
100
- "@types/react": "^18.3.23",
101
- "@types/react-dom": "^18.3.7",
95
+ "@types/node": "^24.6.0",
96
+ "@types/react": "^19.1.1",
97
+ "@types/react-dom": "^19.1.1",
102
98
  "copyfiles": "^2.4.1",
103
99
  "cz-conventional-changelog": "^3.0.1",
104
- "knip": "^5.62.0",
100
+ "knip": "^5.64.1",
105
101
  "minimist": "^1.2.8",
106
- "next": "14.2.32",
102
+ "next": "15.5.4",
107
103
  "next-auth": "^4.24.11",
108
- "react": "18.3.1",
109
- "react-dom": "18.3.1",
110
- "semantic-release": "^24.2.7",
104
+ "react": "19.1.1",
105
+ "react-dom": "19.1.1",
106
+ "semantic-release": "^24.2.9",
111
107
  "tsup": "^8.5.0",
112
- "tsx": "^4.20.4",
108
+ "tsx": "^4.20.6",
113
109
  "typescript": "^5.9.2",
114
- "vite": "^6.3.5",
110
+ "vite": "^6.3.6",
115
111
  "vite-tsconfig-paths": "^5.1.4",
116
112
  "vitest": "^3.2.4"
117
113
  },
118
114
  "optionalDependencies": {
119
- "@rollup/rollup-linux-x64-gnu": "^4.46.3",
120
- "@rollup/rollup-win32-x64-msvc": "^4.46.3"
115
+ "@rollup/rollup-linux-x64-gnu": "^4.52.3",
116
+ "@rollup/rollup-win32-x64-msvc": "^4.52.3"
121
117
  },
122
118
  "resolutions": {
123
- "@types/react": "^18.3.18",
124
- "@types/react-dom": "^18.3.5"
119
+ "@types/react": "^19.1.1",
120
+ "@types/react-dom": "^19.1.1"
125
121
  },
126
122
  "config": {
127
123
  "commitizen": {