@cybearl/cypack 1.11.9 → 1.11.11
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/README.md +1 -0
- package/backend.d.ts +48 -122
- package/backend.js +4 -4
- package/backend.js.map +1 -1
- package/frontend.d.ts +4 -20
- package/frontend.js.map +1 -1
- package/index.d.ts +50 -56
- package/index.js +4 -4
- package/index.js.map +1 -1
- package/package.json +33 -26
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/main/checks.ts","../src/main/constants.ts","../src/main/countries.ts","../src/main/json.ts","../src/main/nextLogger.ts","../src/main/env.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","arrayEqual","array1","array2","length","index","CyCONSTANTS","constants_default","Country","formatCountryName","name","COUNTRIES_SELECT_FIELD","code","getCountryNameFromCode","entry","value","countries_default","formatJson","str","stringify","object","indent","_","NEXT_LOG_INDICATORS","createNextLogger","defaultPrefix","prefixColumnWidth","emit","indicator","fn","message","options","paddedPrefix","prefix","paddingLength","formattedLog","dataString","line","width","nextLogger","generateNextLoggerPrefix","uuid","checkEnvironmentVariables","requiredVars","runtimeValues","environment","missingVars","leakedVars","formatErrorResponse","error","customMessage","additionalData","err","stringifyError","parseCRUDError","errorString","formatMessageAsStringifiedError","errorObj","BaseErrors","slugify","slugifyLib","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","slugifyOptions","slugifyName","previousSlug","match","number","baseSlug","formatRelativeTime","date","diffSec","diffMin","diffHour","formatDate","bigintToScientific","precision","digits","exponent","bigintToMetricFormatted","isNegative","absValue","units","valueString","unitIndex","divisor","paddedScaledStr","integerPart","decimalPart","sign","formatBytes","bytes","decimalPlaces","sizes","i","mapRange","inMin","inMax","outMin","outMax","clamp","mappedValue","safeAverage","total","count","parsedTotal","parsedCount","safePercentage","numerator","denominator","parsedNumerator","parsedDenominator","fullyPermissiveCspHeader","convertErrorToString","stringifiedError","decodeObjectURIComponents","obj","key","invertHexColor","hexColor","strippedHex","g","b","applyHexColorOpacity","opacity","clampedOpacity","alpha","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/**\n * Compares two arrays for equality.\n * @param array1 The first array to compare.\n * @param array2 The second array to compare.\n * @returns True if the arrays are equal, false otherwise.\n */\nexport function arrayEqual(array1: Array<any>, array2: Array<any>): boolean {\n if (array1 === array2) return true\n\n const { length } = array1\n if (length !== array2.length) return false\n\n for (let index = 0; index < length; index++) {\n if (array1[index] !== array2[index]) return false\n }\n\n return true\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 * ISO 3166-1 alpha-2 country codes.\n * @see https://gist.github.com/kyranjamie/646386d5edc174e8b549111572897f81?permalink_comment_id=4321789#gistcomment-4321789\n */\nenum Country {\n Afghanistan = \"AF\",\n AlandIslands = \"AX\",\n Albania = \"AL\",\n Algeria = \"DZ\",\n AmericanSamoa = \"AS\",\n Andorra = \"AD\",\n Angola = \"AO\",\n Anguilla = \"AI\",\n Antarctica = \"AQ\",\n AntiguaAndBarbuda = \"AG\",\n Argentina = \"AR\",\n Armenia = \"AM\",\n Aruba = \"AW\",\n Australia = \"AU\",\n Austria = \"AT\",\n Azerbaijan = \"AZ\",\n Bahamas = \"BS\",\n Bahrain = \"BH\",\n Bangladesh = \"BD\",\n Barbados = \"BB\",\n Belarus = \"BY\",\n Belgium = \"BE\",\n Belize = \"BZ\",\n Benin = \"BJ\",\n Bermuda = \"BM\",\n Bhutan = \"BT\",\n Bolivia = \"BO\",\n BonaireSintEustatiusSaba = \"BQ\",\n BosniaAndHerzegovina = \"BA\",\n Botswana = \"BW\",\n BouvetIsland = \"BV\",\n Brazil = \"BR\",\n BritishIndianOceanTerritory = \"IO\",\n BruneiDarussalam = \"BN\",\n Bulgaria = \"BG\",\n BurkinaFaso = \"BF\",\n Burundi = \"BI\",\n Cambodia = \"KH\",\n Cameroon = \"CM\",\n Canada = \"CA\",\n CapeVerde = \"CV\",\n CaymanIslands = \"KY\",\n CentralAfricanRepublic = \"CF\",\n Chad = \"TD\",\n Chile = \"CL\",\n China = \"CN\",\n ChristmasIsland = \"CX\",\n CocosKeelingIslands = \"CC\",\n Colombia = \"CO\",\n Comoros = \"KM\",\n Congo = \"CG\",\n CongoDemocraticRepublic = \"CD\",\n CookIslands = \"CK\",\n CostaRica = \"CR\",\n CoteDIvoire = \"CI\",\n Croatia = \"HR\",\n Cuba = \"CU\",\n Curacao = \"CW\",\n Cyprus = \"CY\",\n CzechRepublic = \"CZ\",\n Denmark = \"DK\",\n Djibouti = \"DJ\",\n Dominica = \"DM\",\n DominicanRepublic = \"DO\",\n Ecuador = \"EC\",\n Egypt = \"EG\",\n ElSalvador = \"SV\",\n EquatorialGuinea = \"GQ\",\n Eritrea = \"ER\",\n Estonia = \"EE\",\n Ethiopia = \"ET\",\n FalklandIslands = \"FK\",\n FaroeIslands = \"FO\",\n Fiji = \"FJ\",\n Finland = \"FI\",\n France = \"FR\",\n FrenchGuiana = \"GF\",\n FrenchPolynesia = \"PF\",\n FrenchSouthernTerritories = \"TF\",\n Gabon = \"GA\",\n Gambia = \"GM\",\n Georgia = \"GE\",\n Germany = \"DE\",\n Ghana = \"GH\",\n Gibraltar = \"GI\",\n Greece = \"GR\",\n Greenland = \"GL\",\n Grenada = \"GD\",\n Guadeloupe = \"GP\",\n Guam = \"GU\",\n Guatemala = \"GT\",\n Guernsey = \"GG\",\n Guinea = \"GN\",\n GuineaBissau = \"GW\",\n Guyana = \"GY\",\n Haiti = \"HT\",\n HeardIslandMcdonaldIslands = \"HM\",\n HolySeeVaticanCityState = \"VA\",\n Honduras = \"HN\",\n HongKong = \"HK\",\n Hungary = \"HU\",\n Iceland = \"IS\",\n India = \"IN\",\n Indonesia = \"ID\",\n Iran = \"IR\",\n Iraq = \"IQ\",\n Ireland = \"IE\",\n IsleOfMan = \"IM\",\n Israel = \"IL\",\n Italy = \"IT\",\n Jamaica = \"JM\",\n Japan = \"JP\",\n Jersey = \"JE\",\n Jordan = \"JO\",\n Kazakhstan = \"KZ\",\n Kenya = \"KE\",\n Kiribati = \"KI\",\n Korea = \"KR\",\n KoreaDemocraticPeoplesRepublic = \"KP\",\n Kuwait = \"KW\",\n Kyrgyzstan = \"KG\",\n LaoPeoplesDemocraticRepublic = \"LA\",\n Latvia = \"LV\",\n Lebanon = \"LB\",\n Lesotho = \"LS\",\n Liberia = \"LR\",\n LibyanArabJamahiriya = \"LY\",\n Liechtenstein = \"LI\",\n Lithuania = \"LT\",\n Luxembourg = \"LU\",\n Macao = \"MO\",\n Macedonia = \"MK\",\n Madagascar = \"MG\",\n Malawi = \"MW\",\n Malaysia = \"MY\",\n Maldives = \"MV\",\n Mali = \"ML\",\n Malta = \"MT\",\n MarshallIslands = \"MH\",\n Martinique = \"MQ\",\n Mauritania = \"MR\",\n Mauritius = \"MU\",\n Mayotte = \"YT\",\n Mexico = \"MX\",\n Micronesia = \"FM\",\n Moldova = \"MD\",\n Monaco = \"MC\",\n Mongolia = \"MN\",\n Montenegro = \"ME\",\n Montserrat = \"MS\",\n Morocco = \"MA\",\n Mozambique = \"MZ\",\n Myanmar = \"MM\",\n Namibia = \"NA\",\n Nauru = \"NR\",\n Nepal = \"NP\",\n Netherlands = \"NL\",\n NewCaledonia = \"NC\",\n NewZealand = \"NZ\",\n Nicaragua = \"NI\",\n Niger = \"NE\",\n Nigeria = \"NG\",\n Niue = \"NU\",\n NorfolkIsland = \"NF\",\n NorthernMarianaIslands = \"MP\",\n Norway = \"NO\",\n Oman = \"OM\",\n Pakistan = \"PK\",\n Palau = \"PW\",\n PalestinianTerritory = \"PS\",\n Panama = \"PA\",\n PapuaNewGuinea = \"PG\",\n Paraguay = \"PY\",\n Peru = \"PE\",\n Philippines = \"PH\",\n Pitcairn = \"PN\",\n Poland = \"PL\",\n Portugal = \"PT\",\n PuertoRico = \"PR\",\n Qatar = \"QA\",\n Reunion = \"RE\",\n Romania = \"RO\",\n RussianFederation = \"RU\",\n Rwanda = \"RW\",\n SaintBarthelemy = \"BL\",\n SaintHelena = \"SH\",\n SaintKittsAndNevis = \"KN\",\n SaintLucia = \"LC\",\n SaintMartin = \"MF\",\n SaintPierreAndMiquelon = \"PM\",\n SaintVincentAndGrenadines = \"VC\",\n Samoa = \"WS\",\n SanMarino = \"SM\",\n SaoTomeAndPrincipe = \"ST\",\n SaudiArabia = \"SA\",\n Senegal = \"SN\",\n Serbia = \"RS\",\n Seychelles = \"SC\",\n SierraLeone = \"SL\",\n Singapore = \"SG\",\n SintMaarten = \"SX\",\n Slovakia = \"SK\",\n Slovenia = \"SI\",\n SolomonIslands = \"SB\",\n Somalia = \"SO\",\n SouthAfrica = \"ZA\",\n SouthGeorgiaAndSandwichIsl = \"GS\",\n SouthSudan = \"SS\",\n Spain = \"ES\",\n SriLanka = \"LK\",\n Sudan = \"SD\",\n Suriname = \"SR\",\n SvalbardAndJanMayen = \"SJ\",\n Swaziland = \"SZ\",\n Sweden = \"SE\",\n Switzerland = \"CH\",\n SyrianArabRepublic = \"SY\",\n Taiwan = \"TW\",\n Tajikistan = \"TJ\",\n Tanzania = \"TZ\",\n Thailand = \"TH\",\n TimorLeste = \"TL\",\n Togo = \"TG\",\n Tokelau = \"TK\",\n Tonga = \"TO\",\n TrinidadAndTobago = \"TT\",\n Tunisia = \"TN\",\n Turkey = \"TR\",\n Turkmenistan = \"TM\",\n TurksAndCaicosIslands = \"TC\",\n Tuvalu = \"TV\",\n Uganda = \"UG\",\n Ukraine = \"UA\",\n UnitedArabEmirates = \"AE\",\n UnitedKingdom = \"GB\",\n UnitedStates = \"US\",\n UnitedStatesOutlyingIslands = \"UM\",\n Uruguay = \"UY\",\n Uzbekistan = \"UZ\",\n Vanuatu = \"VU\",\n Venezuela = \"VE\",\n Vietnam = \"VN\",\n VirginIslandsBritish = \"VG\",\n VirginIslandsUS = \"VI\",\n WallisAndFutuna = \"WF\",\n WesternSahara = \"EH\",\n Yemen = \"YE\",\n Zambia = \"ZM\",\n Zimbabwe = \"ZW\",\n}\n\n/**\n * Formats a country name from camel case to a spaced name.\n *\n * Exceptions:\n * - \"CoteDIvoire\" becomes \"Cote D'Ivoire\".\n * - \"VirginIslandsUS\" becomes \"Virgin Islands US\".\n * @param name The country name in camel case.\n * @returns The country name with spaces.\n */\nexport function formatCountryName(name: string): string {\n if (name === \"CoteDIvoire\") return \"Cote D'Ivoire\"\n if (name === \"VirginIslandsUS\") return \"Virgin Islands US\"\n return name.replace(/([A-Z])/g, \" $1\").trim()\n}\n\n/**\n * An array of countries formatted for use in select fields.\n */\nexport const COUNTRIES_SELECT_FIELD = Object.entries(Country).map(([name, code]) => ({\n label: formatCountryName(name),\n value: code,\n}))\n\n/**\n * Get the country name from its ISO 3166-1 alpha-2 code.\n * @param code The ISO 3166-1 alpha-2 country code.\n * @returns The country name or undefined if not found.\n */\nexport function getCountryNameFromCode(code: string): string | undefined {\n const entry = Object.entries(Country).find(([, value]) => value === code)\n return entry ? formatCountryName(entry[0]) : undefined\n}\n\nexport default Country\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\"\n\n/**\n * A set of colored Next.js-compatible ANSI indicators for console log messages.\n */\nexport const NEXT_LOG_INDICATORS = {\n success: \"\\x1b[32m ✓ \\x1b[0m\",\n warning: \"\\x1b[35m ⚠ \\x1b[0m\",\n error: \"\\x1b[31m ✗ \\x1b[0m\",\n info: \"\\x1b[33m ○ \\x1b[0m\",\n debug: \"\\x1b[34m ▷ \\x1b[0m\",\n}\n\n/**\n * Options accepted by each log method.\n */\nexport type NextLoggerOptions = {\n /** Overrides the logger's default prefix for this call. */\n prefix?: string\n /** Additional data to log alongside the message (e.g., an Error object). */\n data?: unknown\n}\n\n/**\n * A logger instance returned by `createNextLogger` or `withPrefix`.\n */\nexport type NextLoggerInstance = {\n success: (message: string, options?: NextLoggerOptions) => void\n warn: (message: string, options?: NextLoggerOptions) => void\n error: (message: string, options?: NextLoggerOptions) => void\n info: (message: string, options?: NextLoggerOptions) => void\n debug: (message: string, options?: NextLoggerOptions) => void\n /**\n * Returns a new logger instance with the given prefix fixed as its default.\n * @param prefix The prefix to use for the new logger instance.\n * @param prefixColumnWidth Total character width reserved for the `[prefix]` block, used to align\n * messages across loggers with different prefix lengths (optional, inherits from the parent logger).\n * @returns A new logger instance with the specified prefix.\n */\n withPrefix: (prefix: string, prefixColumnWidth?: number) => NextLoggerInstance\n}\n\n/**\n * Creates an isomorphic Next.js-compatible logger that works in both browser and Node.js environments.\n * ANSI indicators are automatically hidden in browser environments.\n * @param defaultPrefix An optional prefix prepended to all messages as `[prefix]`.\n * @param prefixColumnWidth Total character width reserved for the `[prefix]` block (brackets included),\n * used to align messages across loggers with different prefix lengths (optional, defaults to 10).\n * For example, with a width of 10, `[success] A` and `[error] A` line up on the `A`.\n */\nexport function createNextLogger(defaultPrefix?: string, prefixColumnWidth = 10): NextLoggerInstance {\n function emit(indicator: string, fn: (...args: unknown[]) => void, message: string, options?: NextLoggerOptions) {\n const isClient = typeof window !== \"undefined\"\n\n let paddedPrefix = \"\"\n\n const prefix = options?.prefix ?? defaultPrefix\n const paddingLength = Math.max(prefixColumnWidth - (prefix?.length ?? 0) - 2, 0)\n if (prefix) paddedPrefix = `[${prefix}]${isClient ? \" \" : \" \".repeat(paddingLength)}`\n\n const formattedLog = `${isClient ? \"\" : indicator}${paddedPrefix}${message}`\n\n if (options?.data === undefined) {\n fn(formattedLog)\n } else {\n const dataString = stringify(options.data, 2)\n .split(\"\\n\")\n .map(line => (isClient ? line : ` ${line}`))\n .join(\"\\n\")\n\n fn(`${formattedLog}:`, `\\n${dataString}`)\n }\n }\n\n return {\n success: (message, options) => emit(NEXT_LOG_INDICATORS.success, console.log, message, options),\n warn: (message, options) => emit(NEXT_LOG_INDICATORS.warning, console.warn, message, options),\n error: (message, options) => emit(NEXT_LOG_INDICATORS.error, console.error, message, options),\n info: (message, options) => emit(NEXT_LOG_INDICATORS.info, console.log, message, options),\n debug: (message, options) => emit(NEXT_LOG_INDICATORS.debug, console.debug, message, options),\n withPrefix: (prefix, width) => createNextLogger(prefix, width ?? prefixColumnWidth),\n }\n}\n\n/**\n * A thin isomorphic Next.js-compatible logger instance usable in both browser and Node.js environments.\n */\nexport const nextLogger = createNextLogger()\n\n/**\n * Generates a short logger prefix from a UUID, optionally scoped by a label.\n * @param uuid The UUID to derive the prefix from.\n * @param prefix An optional label to prepend (e.g., \"worker\" -> \"worker-a1b\").\n * @returns A short prefix string like \"a1b\" or \"worker-a1b\".\n */\nexport function generateNextLoggerPrefix(uuid: string, prefix?: string): string {\n return `${prefix ? `${prefix}-` : \"\"}${uuid.replaceAll(\"-\", \"\").slice(0, 3)}`\n}\n","import { nextLogger } from \"@/main/nextLogger\"\n\n/**\n * The shape of the required environment variables config, split by visibility scope.\n */\nexport type RequiredEnvVars = {\n /**\n * Variable names that must be present in both server and client environments.\n */\n public: string[]\n\n /**\n * Variable names that must be present on the server but must NOT be exposed to the client.\n */\n private: string[]\n}\n\n/**\n * Checks for required environment variables and warns or throws if any are missing\n * or if private variables are leaking into the client bundle.\n *\n * Pass your app's required-var names as `requiredVars` and a flat record of their\n * actual runtime values as `runtimeValues`. The `runtimeValues` object must inline\n * `process.env.X` calls directly, dynamic key access (`process.env[name]`) is\n * dead-code eliminated by most bundlers and will not work.\n * @param requiredVars The required variable names split into `public` and `private`.\n * @param runtimeValues A flat map of the variable names.\n */\nexport function checkEnvironmentVariables(\n requiredVars: RequiredEnvVars,\n runtimeValues: Record<string, string | undefined>,\n): void {\n if (requiredVars.public.length === 0 && requiredVars.private.length === 0) return\n\n // `typeof window` returns \"undefined\" on the server and \"object\" on the client\n const environment = typeof window === \"undefined\" ? \"server\" : \"client\"\n\n // Determine which environment variables to check based on the current environment\n const toCheck = environment === \"server\" ? requiredVars.private : requiredVars.public\n const missingVars = toCheck.filter(name => runtimeValues[name] === undefined)\n\n if (missingVars.length > 0) {\n const message = `Missing required environment variables: ${missingVars.join(\", \")}`\n\n if (process.env.NODE_ENV === \"production\") nextLogger.error(message)\n else throw new Error(message)\n } else {\n nextLogger.success(`All required environment variables are set for the '${environment}' environment.`)\n }\n\n if (environment === \"client\") {\n const leakedVars = requiredVars.private.filter(name => runtimeValues[name] !== undefined)\n\n if (leakedVars.length > 0) {\n const message = `Private environment variables exposed to the client: ${leakedVars.join(\", \")}`\n\n if (process.env.NODE_ENV === \"production\") nextLogger.error(message)\n else throw new Error(message)\n }\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 slugifyLib from \"slugify\"\nimport CyCONSTANTS from \"@/main/constants\"\n\n/**\n * The slugify function from the slugify library.\n */\nconst slugify = (slugifyLib as any).default || slugifyLib\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/**\n * The options for the `slugify` function.\n */\nconst slugifyOptions = {\n lower: true,\n strict: true,\n}\n\n/**\n * Slugify a given name with support for automatic number incrementing.\n * @param name The name to slugify.\n * @param previousSlug An optional previous slug to compare against,\n * the previous slug should ends with `-<number>`, this slug will automatically\n * increment the number if the slug already exists.\n * @returns The slugified version of the name.\n */\nexport function slugifyName(name: string, previousSlug?: string): string {\n if (previousSlug) {\n // If the previous slug ends with a number, we increment it\n const match = previousSlug.match(/-(\\d+)$/)\n\n if (match) {\n const number = Number.parseInt(match[1], 10)\n const baseSlug = previousSlug.slice(0, -match[0].length)\n return slugify(`${baseSlug}-${number + 1}`, slugifyOptions)\n }\n }\n\n return slugify(name, slugifyOptions)\n}\n\n/**\n * Formats a date as a human-readable relative time string.\n * Falls back to a locale date string for dates older than 24 hours.\n * @param date The date to format.\n * @returns A string like \"just now\", \"5m ago\", \"3h ago\", or a locale date string.\n */\nexport function formatRelativeTime(date: Date): string {\n const diffSec = Math.floor((Date.now() - date.getTime()) / 1000)\n if (diffSec < 60) return \"just now\"\n\n const diffMin = Math.floor(diffSec / 60)\n if (diffMin < 60) return `${diffMin}m ago`\n\n const diffHour = Math.floor(diffMin / 60)\n if (diffHour < 24) return `${diffHour}h ago`\n\n return date.toLocaleDateString()\n}\n\n/**\n * Formats a date into a locale-aware datetime string using the runtime's default locale.\n * @param date The date to format.\n * @returns The formatted date string (e.g., \"04/25/2026, 03:45:00 PM\").\n */\nexport function formatDate(date: Date): string {\n return date.toLocaleString(undefined, {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hour12: true,\n })\n}\n\n/**\n * Formats a bigint as scientific notation using only integer arithmetic,\n * supporting arbitrarily large values (e.g., up to 2^256).\n *\n * Returns a tuple `[coefficient, exponent]` so callers can render the\n * exponent as a superscript (e.g., `[\"4.61\", 18]` for ~4.61 × 10^18).\n * @param value The bigint to format.\n * @param precision Number of decimal digits in the coefficient (default 2).\n */\nexport function bigintToScientific(value: bigint, precision = 2): [coefficient: string, exponent: number] {\n if (value === 0n) return [\"0\", 0]\n\n const digits = value.toString()\n const exponent = digits.length - 1\n\n if (exponent === 0) return [digits, 0]\n\n const raw = `${digits[0]}.${digits.slice(1, precision + 1).padEnd(precision, \"0\")}`\n const coefficient = raw.replace(/\\.?0+$/, \"\")\n\n return [coefficient, exponent]\n}\n\n/**\n * Converts a bigint to an en-US formatted string with metric prefixes (e.g., 1500 -> \"1.5k\").\n * Supports values up to exa (E).\n * @param value The bigint to format.\n * @returns The formatted string with metric prefix.\n */\nexport function bigintToMetricFormatted(value: bigint): string {\n const isNegative = value < 0n\n const absValue = value < 0n ? -value : value\n\n const units = [\"\", \"k\", \"M\", \"G\", \"T\", \"P\", \"E\"]\n const valueString = absValue.toString()\n let unitIndex = Math.floor((valueString.length - 1) / 3)\n\n if (unitIndex >= units.length) unitIndex = units.length - 1\n if (unitIndex <= 0) return value.toString()\n\n const divisor = 1000n ** BigInt(unitIndex)\n const scaled = (absValue * 10n) / divisor\n const scaledStr = scaled.toString()\n const paddedScaledStr = scaledStr.padStart(2, \"0\")\n const integerPart = paddedScaledStr.slice(0, -1) || \"0\"\n const decimalPart = paddedScaledStr.slice(-1)\n\n const sign = isNegative ? \"-\" : \"\"\n const unit = units[unitIndex]\n\n return decimalPart === \"0\" ? `${sign}${integerPart}${unit}` : `${sign}${integerPart}.${decimalPart}${unit}`\n}\n\n/**\n * Formats a number of bytes into a human-readable string with appropriate units.\n * @param bytes The number of bytes.\n * @param decimalPlaces The number of decimal places to include (optional, defaults to 2).\n * @returns The formatted string.\n */\nexport function formatBytes(bytes: number, decimalPlaces = 2): string {\n if (bytes === 0) return \"0 Bytes\"\n\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\", \"EB\", \"ZB\", \"YB\"]\n\n const i = Math.floor(Math.log(bytes) / Math.log(1024))\n return `${parseFloat((bytes / 1024 ** i).toFixed(decimalPlaces < 0 ? 0 : decimalPlaces))} ${sizes[i]}`\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 * @param decimalPlaces The number of decimal places to round to (optional, defaults to 2).\n * @returns The calculated average, or 0 if the count is zero or invalid.\n */\nexport function safeAverage(total?: string | number, count?: string | number, decimalPlaces = 2): 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 parseFloat(((parsedTotal || 0) / (parsedCount || 1)).toFixed(decimalPlaces))\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 * @param decimalPlaces The number of decimal places to round to (optional, defaults to 2).\n * @returns The calculated percentage, or 0 if the denominator is zero or invalid.\n */\nexport function safePercentage(numerator?: string | number, denominator?: string | number, decimalPlaces = 2): 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(decimalPlaces),\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 * Returns the inverse of a hex color string (e.g., \"#aabbcc\" -> \"#554433\").\n * @param hexColor The hex color string to invert.\n * @returns The inverted hex color string, or the original if the format is invalid.\n */\nexport function invertHexColor(hexColor: string): string {\n const strippedHex = hexColor.replace(/^#/, \"\")\n if (strippedHex.length !== 6) return hexColor\n\n const r = (255 - parseInt(strippedHex.slice(0, 2), 16)).toString(16).padStart(2, \"0\")\n const g = (255 - parseInt(strippedHex.slice(2, 4), 16)).toString(16).padStart(2, \"0\")\n const b = (255 - parseInt(strippedHex.slice(4, 6), 16)).toString(16).padStart(2, \"0\")\n\n return `#${r}${g}${b}`\n}\n\n/**\n * Applies an opacity factor to a hex color, returning a 4-channel hex string.\n * @param hexColor The hex color string to modify.\n * @param opacity The opacity factor (0–1) to apply.\n * @returns The 8-character hex color string with applied opacity, or the original if the format is invalid.\n */\nexport function applyHexColorOpacity(hexColor: string, opacity: number): string {\n const clampedOpacity = Math.min(Math.max(opacity, 0), 1)\n const strippedHex = hexColor.replace(/^#/, \"\")\n if (strippedHex.length !== 6) return hexColor\n\n const alpha = Math.round(clampedOpacity * 255)\n .toString(16)\n .padStart(2, \"0\")\n\n return `#${strippedHex}${alpha}`\n}\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/main/checks.ts","../src/main/constants.ts","../src/main/countries.ts","../src/main/json.ts","../src/main/nextLogger.ts","../src/main/env.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","arrayEqual","array1","array2","index","CyCONSTANTS","constants_default","Country","formatCountryName","name","COUNTRIES_SELECT_FIELD","code","getCountryNameFromCode","entry","value","countries_default","formatJson","str","stringify","object","indent","_","NEXT_LOG_INDICATORS","createNextLogger","defaultPrefix","prefixColumnWidth","emit","indicator","fn","message","options","paddedPrefix","prefix","paddingLength","formattedLog","dataString","line","width","nextLogger","generateNextLoggerPrefix","uuid","checkEnvironmentVariables","requiredVars","runtimeValues","environment","missingVars","leakedVars","formatErrorResponse","error","customMessage","additionalData","err","stringifyError","parseCRUDError","errorString","formatMessageAsStringifiedError","errorObj","BaseErrors","slugify","slugifyLib","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","slugifyOptions","slugifyName","previousSlug","match","number","baseSlug","formatRelativeTime","date","diffSec","diffMin","diffHour","formatDate","bigintToScientific","precision","digits","exponent","bigintToMetricFormatted","isNegative","absValue","units","valueString","unitIndex","divisor","paddedScaledStr","integerPart","decimalPart","sign","formatBytes","bytes","decimalPlaces","sizes","i","mapRange","inMin","inMax","outMin","outMax","clamp","mappedValue","safeAverage","total","count","parsedTotal","parsedCount","safePercentage","numerator","denominator","parsedNumerator","parsedDenominator","fullyPermissiveCspHeader","convertErrorToString","stringifiedError","decodeObjectURIComponents","obj","key","invertHexColor","hexColor","strippedHex","g","b","applyHexColorOpacity","opacity","clampedOpacity","alpha","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 * @returns True if running on the server, false otherwise.\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 * @returns True if running on the client, false otherwise.\n */\nexport function isClient() {\n return !isServer()\n}\n\n/**\n * Compares two arrays for equality.\n * @param array1 The first array to compare.\n * @param array2 The second array to compare.\n * @returns True if the arrays are equal, false otherwise.\n */\nexport function arrayEqual(array1: Array<any>, array2: Array<any>): boolean {\n if (array1 === array2) return true\n\n if (array1.length !== array2.length) return false\n\n for (let index = 0; index < array1.length; index++) {\n if (array1[index] !== array2[index]) return false\n }\n\n return true\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 // HTTP\n NO_BODY_HTTP_STATUSES: [204, 304],\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 * ISO 3166-1 alpha-2 country codes.\n * @see https://gist.github.com/kyranjamie/646386d5edc174e8b549111572897f81?permalink_comment_id=4321789#gistcomment-4321789\n */\nenum Country {\n Afghanistan = \"AF\",\n AlandIslands = \"AX\",\n Albania = \"AL\",\n Algeria = \"DZ\",\n AmericanSamoa = \"AS\",\n Andorra = \"AD\",\n Angola = \"AO\",\n Anguilla = \"AI\",\n Antarctica = \"AQ\",\n AntiguaAndBarbuda = \"AG\",\n Argentina = \"AR\",\n Armenia = \"AM\",\n Aruba = \"AW\",\n Australia = \"AU\",\n Austria = \"AT\",\n Azerbaijan = \"AZ\",\n Bahamas = \"BS\",\n Bahrain = \"BH\",\n Bangladesh = \"BD\",\n Barbados = \"BB\",\n Belarus = \"BY\",\n Belgium = \"BE\",\n Belize = \"BZ\",\n Benin = \"BJ\",\n Bermuda = \"BM\",\n Bhutan = \"BT\",\n Bolivia = \"BO\",\n BonaireSintEustatiusSaba = \"BQ\",\n BosniaAndHerzegovina = \"BA\",\n Botswana = \"BW\",\n BouvetIsland = \"BV\",\n Brazil = \"BR\",\n BritishIndianOceanTerritory = \"IO\",\n BruneiDarussalam = \"BN\",\n Bulgaria = \"BG\",\n BurkinaFaso = \"BF\",\n Burundi = \"BI\",\n Cambodia = \"KH\",\n Cameroon = \"CM\",\n Canada = \"CA\",\n CapeVerde = \"CV\",\n CaymanIslands = \"KY\",\n CentralAfricanRepublic = \"CF\",\n Chad = \"TD\",\n Chile = \"CL\",\n China = \"CN\",\n ChristmasIsland = \"CX\",\n CocosKeelingIslands = \"CC\",\n Colombia = \"CO\",\n Comoros = \"KM\",\n Congo = \"CG\",\n CongoDemocraticRepublic = \"CD\",\n CookIslands = \"CK\",\n CostaRica = \"CR\",\n CoteDIvoire = \"CI\",\n Croatia = \"HR\",\n Cuba = \"CU\",\n Curacao = \"CW\",\n Cyprus = \"CY\",\n CzechRepublic = \"CZ\",\n Denmark = \"DK\",\n Djibouti = \"DJ\",\n Dominica = \"DM\",\n DominicanRepublic = \"DO\",\n Ecuador = \"EC\",\n Egypt = \"EG\",\n ElSalvador = \"SV\",\n EquatorialGuinea = \"GQ\",\n Eritrea = \"ER\",\n Estonia = \"EE\",\n Ethiopia = \"ET\",\n FalklandIslands = \"FK\",\n FaroeIslands = \"FO\",\n Fiji = \"FJ\",\n Finland = \"FI\",\n France = \"FR\",\n FrenchGuiana = \"GF\",\n FrenchPolynesia = \"PF\",\n FrenchSouthernTerritories = \"TF\",\n Gabon = \"GA\",\n Gambia = \"GM\",\n Georgia = \"GE\",\n Germany = \"DE\",\n Ghana = \"GH\",\n Gibraltar = \"GI\",\n Greece = \"GR\",\n Greenland = \"GL\",\n Grenada = \"GD\",\n Guadeloupe = \"GP\",\n Guam = \"GU\",\n Guatemala = \"GT\",\n Guernsey = \"GG\",\n Guinea = \"GN\",\n GuineaBissau = \"GW\",\n Guyana = \"GY\",\n Haiti = \"HT\",\n HeardIslandMcdonaldIslands = \"HM\",\n HolySeeVaticanCityState = \"VA\",\n Honduras = \"HN\",\n HongKong = \"HK\",\n Hungary = \"HU\",\n Iceland = \"IS\",\n India = \"IN\",\n Indonesia = \"ID\",\n Iran = \"IR\",\n Iraq = \"IQ\",\n Ireland = \"IE\",\n IsleOfMan = \"IM\",\n Israel = \"IL\",\n Italy = \"IT\",\n Jamaica = \"JM\",\n Japan = \"JP\",\n Jersey = \"JE\",\n Jordan = \"JO\",\n Kazakhstan = \"KZ\",\n Kenya = \"KE\",\n Kiribati = \"KI\",\n Korea = \"KR\",\n KoreaDemocraticPeoplesRepublic = \"KP\",\n Kuwait = \"KW\",\n Kyrgyzstan = \"KG\",\n LaoPeoplesDemocraticRepublic = \"LA\",\n Latvia = \"LV\",\n Lebanon = \"LB\",\n Lesotho = \"LS\",\n Liberia = \"LR\",\n LibyanArabJamahiriya = \"LY\",\n Liechtenstein = \"LI\",\n Lithuania = \"LT\",\n Luxembourg = \"LU\",\n Macao = \"MO\",\n Macedonia = \"MK\",\n Madagascar = \"MG\",\n Malawi = \"MW\",\n Malaysia = \"MY\",\n Maldives = \"MV\",\n Mali = \"ML\",\n Malta = \"MT\",\n MarshallIslands = \"MH\",\n Martinique = \"MQ\",\n Mauritania = \"MR\",\n Mauritius = \"MU\",\n Mayotte = \"YT\",\n Mexico = \"MX\",\n Micronesia = \"FM\",\n Moldova = \"MD\",\n Monaco = \"MC\",\n Mongolia = \"MN\",\n Montenegro = \"ME\",\n Montserrat = \"MS\",\n Morocco = \"MA\",\n Mozambique = \"MZ\",\n Myanmar = \"MM\",\n Namibia = \"NA\",\n Nauru = \"NR\",\n Nepal = \"NP\",\n Netherlands = \"NL\",\n NewCaledonia = \"NC\",\n NewZealand = \"NZ\",\n Nicaragua = \"NI\",\n Niger = \"NE\",\n Nigeria = \"NG\",\n Niue = \"NU\",\n NorfolkIsland = \"NF\",\n NorthernMarianaIslands = \"MP\",\n Norway = \"NO\",\n Oman = \"OM\",\n Pakistan = \"PK\",\n Palau = \"PW\",\n PalestinianTerritory = \"PS\",\n Panama = \"PA\",\n PapuaNewGuinea = \"PG\",\n Paraguay = \"PY\",\n Peru = \"PE\",\n Philippines = \"PH\",\n Pitcairn = \"PN\",\n Poland = \"PL\",\n Portugal = \"PT\",\n PuertoRico = \"PR\",\n Qatar = \"QA\",\n Reunion = \"RE\",\n Romania = \"RO\",\n RussianFederation = \"RU\",\n Rwanda = \"RW\",\n SaintBarthelemy = \"BL\",\n SaintHelena = \"SH\",\n SaintKittsAndNevis = \"KN\",\n SaintLucia = \"LC\",\n SaintMartin = \"MF\",\n SaintPierreAndMiquelon = \"PM\",\n SaintVincentAndGrenadines = \"VC\",\n Samoa = \"WS\",\n SanMarino = \"SM\",\n SaoTomeAndPrincipe = \"ST\",\n SaudiArabia = \"SA\",\n Senegal = \"SN\",\n Serbia = \"RS\",\n Seychelles = \"SC\",\n SierraLeone = \"SL\",\n Singapore = \"SG\",\n SintMaarten = \"SX\",\n Slovakia = \"SK\",\n Slovenia = \"SI\",\n SolomonIslands = \"SB\",\n Somalia = \"SO\",\n SouthAfrica = \"ZA\",\n SouthGeorgiaAndSandwichIsl = \"GS\",\n SouthSudan = \"SS\",\n Spain = \"ES\",\n SriLanka = \"LK\",\n Sudan = \"SD\",\n Suriname = \"SR\",\n SvalbardAndJanMayen = \"SJ\",\n Swaziland = \"SZ\",\n Sweden = \"SE\",\n Switzerland = \"CH\",\n SyrianArabRepublic = \"SY\",\n Taiwan = \"TW\",\n Tajikistan = \"TJ\",\n Tanzania = \"TZ\",\n Thailand = \"TH\",\n TimorLeste = \"TL\",\n Togo = \"TG\",\n Tokelau = \"TK\",\n Tonga = \"TO\",\n TrinidadAndTobago = \"TT\",\n Tunisia = \"TN\",\n Turkey = \"TR\",\n Turkmenistan = \"TM\",\n TurksAndCaicosIslands = \"TC\",\n Tuvalu = \"TV\",\n Uganda = \"UG\",\n Ukraine = \"UA\",\n UnitedArabEmirates = \"AE\",\n UnitedKingdom = \"GB\",\n UnitedStates = \"US\",\n UnitedStatesOutlyingIslands = \"UM\",\n Uruguay = \"UY\",\n Uzbekistan = \"UZ\",\n Vanuatu = \"VU\",\n Venezuela = \"VE\",\n Vietnam = \"VN\",\n VirginIslandsBritish = \"VG\",\n VirginIslandsUS = \"VI\",\n WallisAndFutuna = \"WF\",\n WesternSahara = \"EH\",\n Yemen = \"YE\",\n Zambia = \"ZM\",\n Zimbabwe = \"ZW\",\n}\n\n/**\n * Formats a country name from camel case to a spaced name.\n *\n * Exceptions:\n * - \"CoteDIvoire\" becomes \"Cote D'Ivoire\".\n * - \"VirginIslandsUS\" becomes \"Virgin Islands US\".\n * @param name The country name in camel case.\n * @returns The country name with spaces.\n */\nexport function formatCountryName(name: string): string {\n if (name === \"CoteDIvoire\") return \"Cote D'Ivoire\"\n if (name === \"VirginIslandsUS\") return \"Virgin Islands US\"\n return name.replace(/([A-Z])/g, \" $1\").trim()\n}\n\n/**\n * An array of countries formatted for use in select fields.\n */\nexport const COUNTRIES_SELECT_FIELD = Object.entries(Country).map(([name, code]) => ({\n label: formatCountryName(name),\n value: code,\n}))\n\n/**\n * Get the country name from its ISO 3166-1 alpha-2 code.\n * @param code The ISO 3166-1 alpha-2 country code.\n * @returns The country name or undefined if not found.\n */\nexport function getCountryNameFromCode(code: string): string | undefined {\n const entry = Object.entries(Country).find(([, value]) => value === code)\n return entry ? formatCountryName(entry[0]) : undefined\n}\n\nexport default Country\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\"\n\n/**\n * A set of colored Next.js-compatible ANSI indicators for console log messages.\n */\nexport const NEXT_LOG_INDICATORS = {\n success: \"\\x1b[32m ✓ \\x1b[0m\",\n warning: \"\\x1b[35m ⚠ \\x1b[0m\",\n error: \"\\x1b[31m ✗ \\x1b[0m\",\n info: \"\\x1b[33m ○ \\x1b[0m\",\n debug: \"\\x1b[34m ▷ \\x1b[0m\",\n}\n\n/**\n * Options accepted by each log method.\n */\nexport type NextLoggerOptions = {\n /**\n * Overrides the logger's default prefix for this call.\n */\n prefix?: string\n\n /**\n * Additional data to log alongside the message (e.g., an Error object).\n */\n data?: unknown\n}\n\n/**\n * A logger instance returned by `createNextLogger` or `withPrefix`.\n */\nexport type NextLoggerInstance = {\n /**\n * Logs a success message.\n * @param message The message to log.\n * @param options The logging options (optional).\n */\n success: (message: string, options?: NextLoggerOptions) => void\n\n /**\n * Logs a warning message.\n * @param message The message to log.\n * @param options The logging options (optional).\n */\n warn: (message: string, options?: NextLoggerOptions) => void\n\n /**\n * Logs an error message.\n * @param message The message to log.\n * @param options The logging options (optional).\n */\n error: (message: string, options?: NextLoggerOptions) => void\n\n /**\n * Logs an info message.\n * @param message The message to log.\n * @param options The logging options (optional).\n */\n info: (message: string, options?: NextLoggerOptions) => void\n\n /**\n * Logs a debug message.\n * @param message The message to log.\n * @param options The logging options (optional).\n */\n debug: (message: string, options?: NextLoggerOptions) => void\n\n /**\n * Returns a new logger instance with the given prefix fixed as its default.\n * @param prefix The prefix to use for the new logger instance.\n * @param prefixColumnWidth Total character width reserved for the `[prefix]` block, used to align\n * messages across loggers with different prefix lengths (optional, inherits from the parent logger).\n * @returns A new logger instance with the specified prefix.\n */\n withPrefix: (prefix: string, prefixColumnWidth?: number) => NextLoggerInstance\n}\n\n/**\n * Creates an isomorphic Next.js-compatible logger that works in both browser and Node.js environments.\n * ANSI indicators are automatically hidden in browser environments.\n * @param defaultPrefix An optional prefix prepended to all messages as `[prefix]`.\n * @param prefixColumnWidth Total character width reserved for the `[prefix]` block (brackets included),\n * used to align messages across loggers with different prefix lengths (optional, defaults to 10).\n * @returns A new logger instance.\n */\nexport function createNextLogger(defaultPrefix?: string, prefixColumnWidth = 10): NextLoggerInstance {\n /**\n * Formats and emits a log message through the given console function.\n * @param indicator The level indicator to display.\n * @param fn The console function used to output the message.\n * @param message The message to log.\n * @param options The logging options (optional).\n */\n function emit(indicator: string, fn: (...args: unknown[]) => void, message: string, options?: NextLoggerOptions) {\n const isClient = typeof window !== \"undefined\"\n\n let paddedPrefix = \"\"\n\n const prefix = options?.prefix ?? defaultPrefix\n const paddingLength = Math.max(prefixColumnWidth - (prefix?.length ?? 0) - 2, 1)\n if (prefix) paddedPrefix = `[${prefix}]${isClient ? \" \" : \" \".repeat(paddingLength)}`\n\n const formattedLog = `${isClient ? \"\" : indicator}${paddedPrefix}${message}`\n\n if (options?.data === undefined) {\n fn(formattedLog)\n } else {\n const dataString = stringify(options.data, 2)\n .split(\"\\n\")\n .map(line => (isClient ? line : ` ${line}`))\n .join(\"\\n\")\n\n fn(`${formattedLog}:`, `\\n${dataString}`)\n }\n }\n\n return {\n success: (message, options) => emit(NEXT_LOG_INDICATORS.success, console.log, message, options),\n warn: (message, options) => emit(NEXT_LOG_INDICATORS.warning, console.warn, message, options),\n error: (message, options) => emit(NEXT_LOG_INDICATORS.error, console.error, message, options),\n info: (message, options) => emit(NEXT_LOG_INDICATORS.info, console.log, message, options),\n debug: (message, options) => emit(NEXT_LOG_INDICATORS.debug, console.debug, message, options),\n withPrefix: (prefix, width) => createNextLogger(prefix, width ?? prefixColumnWidth),\n }\n}\n\n/**\n * A thin isomorphic Next.js-compatible logger instance usable in both browser and Node.js environments.\n */\nexport const nextLogger = createNextLogger()\n\n/**\n * Generates a short logger prefix from a UUID, optionally scoped by a label.\n * @param uuid The UUID to derive the prefix from.\n * @param prefix An optional label to prepend (e.g., \"worker\" -> \"worker-a1b\").\n * @returns A short prefix string like \"a1b\" or \"worker-a1b\".\n */\nexport function generateNextLoggerPrefix(uuid: string, prefix?: string): string {\n return `${prefix ? `${prefix}-` : \"\"}${uuid.replaceAll(\"-\", \"\").slice(0, 3)}`\n}\n","import { nextLogger } from \"@/main/nextLogger\"\n\n/**\n * The shape of the required environment variables config, split by visibility scope.\n */\nexport type RequiredEnvVars = {\n /**\n * Variable names that must be present in both server and client environments.\n */\n public: string[]\n\n /**\n * Variable names that must be present on the server but must NOT be exposed to the client.\n */\n private: string[]\n}\n\n/**\n * Checks for required environment variables and warns or throws if any are missing\n * or if private variables are leaking into the client bundle.\n * @param requiredVars The required variable names split into `public` and `private`.\n * @param runtimeValues A flat map of the variable names to their runtime values, it must inline\n * `process.env.X` calls directly as dynamic key access (`process.env[name]`) is\n * dead-code eliminated by most bundlers and will not work.\n */\nexport function checkEnvironmentVariables(\n requiredVars: RequiredEnvVars,\n runtimeValues: Record<string, string | undefined>,\n): void {\n if (requiredVars.public.length === 0 && requiredVars.private.length === 0) return\n\n // \"typeof window\" returns \"undefined\" on the server and \"object\" on the client\n const environment = typeof window === \"undefined\" ? \"server\" : \"client\"\n\n // Determine which environment variables to check based on the current environment\n const toCheck = environment === \"server\" ? requiredVars.private : requiredVars.public\n const missingVars = toCheck.filter(name => runtimeValues[name] === undefined)\n\n if (missingVars.length > 0) {\n const message = `Missing required environment variables: ${missingVars.join(\", \")}`\n\n if (process.env.NODE_ENV === \"production\") nextLogger.error(message)\n else throw new Error(message)\n } else {\n nextLogger.success(`All required environment variables are set for the '${environment}' environment.`)\n }\n\n if (environment === \"client\") {\n const leakedVars = requiredVars.private.filter(name => runtimeValues[name] !== undefined)\n\n if (leakedVars.length > 0) {\n const message = `Private environment variables exposed to the client: ${leakedVars.join(\", \")}`\n\n if (process.env.NODE_ENV === \"production\") nextLogger.error(message)\n else throw new Error(message)\n }\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 * @param error The `ErrorObj` object to format.\n * @param customMessage 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 response.\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 /**\n * Allow special keys (functions and bigints) in the JSON stringification.\n * @param _ The key being stringified (unused).\n * @param value The value being stringified.\n * @returns The value converted to a string if it is a function or a bigint, otherwise the value itself.\n */\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 (e.g. an \"AppErrors\" object spreading \"BaseErrors\").\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 slugifyLib from \"slugify\"\nimport CyCONSTANTS from \"@/main/constants\"\n\n/**\n * The slugify function from the slugify library.\n */\nconst slugify = (slugifyLib as any).default || slugifyLib\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/**\n * The options for the `slugify` function.\n */\nconst slugifyOptions = {\n lower: true,\n strict: true,\n}\n\n/**\n * Slugify a given name with support for automatic number incrementing.\n * @param name The name to slugify.\n * @param previousSlug An optional previous slug to compare against,\n * the previous slug should ends with `-<number>`, this slug will automatically\n * increment the number if the slug already exists.\n * @returns The slugified version of the name.\n */\nexport function slugifyName(name: string, previousSlug?: string): string {\n if (previousSlug) {\n // If the previous slug ends with a number, we increment it\n const match = previousSlug.match(/-(\\d+)$/)\n\n if (match) {\n const number = Number.parseInt(match[1], 10)\n const baseSlug = previousSlug.slice(0, -match[0].length)\n return slugify(`${baseSlug}-${number + 1}`, slugifyOptions)\n }\n }\n\n return slugify(name, slugifyOptions)\n}\n\n/**\n * Formats a date as a human-readable relative time string.\n * Falls back to a locale date string for dates older than 24 hours.\n * @param date The date to format.\n * @returns A string like \"just now\", \"5m ago\", \"3h ago\", or a locale date string.\n */\nexport function formatRelativeTime(date: Date): string {\n const diffSec = Math.floor((Date.now() - date.getTime()) / 1000)\n if (diffSec < 60) return \"just now\"\n\n const diffMin = Math.floor(diffSec / 60)\n if (diffMin < 60) return `${diffMin}m ago`\n\n const diffHour = Math.floor(diffMin / 60)\n if (diffHour < 24) return `${diffHour}h ago`\n\n return date.toLocaleDateString()\n}\n\n/**\n * Formats a date into a locale-aware datetime string using the runtime's default locale.\n * @param date The date to format.\n * @returns The formatted date string (e.g., \"04/25/2026, 03:45:00 PM\").\n */\nexport function formatDate(date: Date): string {\n return date.toLocaleString(undefined, {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hour12: true,\n })\n}\n\n/**\n * Formats a bigint as scientific notation using only integer arithmetic,\n * supporting arbitrarily large values (e.g., up to 2^256).\n * @param value The bigint to format.\n * @param precision Number of decimal digits in the coefficient (default 2).\n * @returns A tuple `[coefficient, exponent]` (e.g., `[\"4.61\", 18]` for ~4.61 × 10^18).\n */\nexport function bigintToScientific(value: bigint, precision = 2): [coefficient: string, exponent: number] {\n if (value === 0n) return [\"0\", 0]\n\n const digits = value.toString()\n const exponent = digits.length - 1\n\n if (exponent === 0) return [digits, 0]\n\n const raw = `${digits[0]}.${digits.slice(1, precision + 1).padEnd(precision, \"0\")}`\n const coefficient = raw.replace(/\\.?0+$/, \"\")\n\n return [coefficient, exponent]\n}\n\n/**\n * Converts a bigint to an en-US formatted string with metric prefixes (e.g., 1500 -> \"1.5k\").\n * Supports values up to exa (E).\n * @param value The bigint to format.\n * @returns The formatted string with metric prefix.\n */\nexport function bigintToMetricFormatted(value: bigint): string {\n const isNegative = value < 0n\n const absValue = value < 0n ? -value : value\n\n const units = [\"\", \"k\", \"M\", \"G\", \"T\", \"P\", \"E\"]\n const valueString = absValue.toString()\n let unitIndex = Math.floor((valueString.length - 1) / 3)\n\n if (unitIndex >= units.length) unitIndex = units.length - 1\n if (unitIndex <= 0) return value.toString()\n\n const divisor = 1000n ** BigInt(unitIndex)\n const scaled = (absValue * 10n) / divisor\n const scaledStr = scaled.toString()\n\n const paddedScaledStr = scaledStr.padStart(2, \"0\")\n const integerPart = paddedScaledStr.slice(0, -1) || \"0\"\n const decimalPart = paddedScaledStr.slice(-1)\n\n const sign = isNegative ? \"-\" : \"\"\n const unit = units[unitIndex]\n\n return decimalPart === \"0\" ? `${sign}${integerPart}${unit}` : `${sign}${integerPart}.${decimalPart}${unit}`\n}\n\n/**\n * Formats a number of bytes into a human-readable string with appropriate units.\n * @param bytes The number of bytes.\n * @param decimalPlaces The number of decimal places to include (optional, defaults to 2).\n * @returns The formatted string.\n */\nexport function formatBytes(bytes: number, decimalPlaces = 2): string {\n if (bytes === 0) return \"0 Bytes\"\n\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\", \"EB\", \"ZB\", \"YB\"]\n\n const i = Math.floor(Math.log(bytes) / Math.log(1024))\n return `${parseFloat((bytes / 1024 ** i).toFixed(decimalPlaces < 0 ? 0 : decimalPlaces))} ${sizes[i]}`\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 * @param decimalPlaces The number of decimal places to round to (optional, defaults to 2).\n * @returns The calculated average, or 0 if the count is zero or invalid.\n */\nexport function safeAverage(total?: string | number, count?: string | number, decimalPlaces = 2): 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 parseFloat(((parsedTotal || 0) / (parsedCount || 1)).toFixed(decimalPlaces))\n}\n\n/**\n * Safely creates a percentage based on a numerator and denominator coming from\n * a Lucid ORM / SQL query result, returning `-1` for a zero denominator with a\n * positive numerator (growth from nothing to something).\n * @param numerator The numerator value.\n * @param denominator The denominator value.\n * @param decimalPlaces The number of decimal places to round to (optional, defaults to 2).\n * @returns The calculated percentage, or 0 if the denominator is zero or invalid.\n */\nexport function safePercentage(numerator?: string | number, denominator?: string | number, decimalPlaces = 2): 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(decimalPlaces),\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\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 * Returns the inverse of a hex color string (e.g., \"#aabbcc\" -> \"#554433\").\n * @param hexColor The hex color string to invert.\n * @returns The inverted hex color string, or the original if the format is invalid.\n */\nexport function invertHexColor(hexColor: string): string {\n const strippedHex = hexColor.replace(/^#/, \"\")\n if (strippedHex.length !== 6) return hexColor\n\n const r = (255 - parseInt(strippedHex.slice(0, 2), 16)).toString(16).padStart(2, \"0\")\n const g = (255 - parseInt(strippedHex.slice(2, 4), 16)).toString(16).padStart(2, \"0\")\n const b = (255 - parseInt(strippedHex.slice(4, 6), 16)).toString(16).padStart(2, \"0\")\n\n return `#${r}${g}${b}`\n}\n\n/**\n * Applies an opacity factor to a hex color, returning a 4-channel hex string.\n * @param hexColor The hex color string to modify.\n * @param opacity The opacity factor (0–1) to apply.\n * @returns The 8-character hex color string with applied opacity, or the original if the format is invalid.\n */\nexport function applyHexColorOpacity(hexColor: string, opacity: number): string {\n const clampedOpacity = Math.min(Math.max(opacity, 0), 1)\n const strippedHex = hexColor.replace(/^#/, \"\")\n if (strippedHex.length !== 6) return hexColor\n\n const alpha = Math.round(clampedOpacity * 255)\n .toString(16)\n .padStart(2, \"0\")\n\n return `#${strippedHex}${alpha}`\n}\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,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cybearl/cypack",
|
|
3
|
-
"
|
|
4
|
-
"version": "1.11.9",
|
|
3
|
+
"version": "1.11.11",
|
|
5
4
|
"description": "A set of general utilities for Cybearl projects.",
|
|
6
5
|
"author": "Cybearl <contact@cybearl.com> (https://www.cybearl.com/)",
|
|
7
6
|
"license": "MIT",
|
|
@@ -54,15 +53,17 @@
|
|
|
54
53
|
},
|
|
55
54
|
"scripts": {
|
|
56
55
|
"knip": "knip",
|
|
57
|
-
"lint": "biome check",
|
|
58
|
-
"lint:fix": "biome check --fix && biome format --write",
|
|
56
|
+
"lint": "biome check && npm run lint:nitpicker",
|
|
57
|
+
"lint:fix": "npm run lint:nitpicker:fix && biome check --fix && biome format --write",
|
|
58
|
+
"lint:nitpicker": "eslint \"{src,tests}/**/*.ts\"",
|
|
59
|
+
"lint:nitpicker:fix": "eslint \"{src,tests}/**/*.ts\" --fix",
|
|
59
60
|
"test:sandbox": "tsx ./tests/sandbox.ts",
|
|
60
61
|
"test:bench": "tsx ./tests/benchmark.ts",
|
|
61
62
|
"test:unit": "vitest",
|
|
62
63
|
"test": "npm run test:unit",
|
|
63
64
|
"build": "tsup",
|
|
64
65
|
"release": "npx semantic-release",
|
|
65
|
-
"hooks:install": "node -e \"require('fs').existsSync('.git')
|
|
66
|
+
"hooks:install": "node -e \"if(require('fs').existsSync('.git'))require('child_process').execSync('git config core.hooksPath .githooks',{stdio:'inherit'})\"",
|
|
66
67
|
"prepare": "npm run hooks:install"
|
|
67
68
|
},
|
|
68
69
|
"dependencies": {
|
|
@@ -73,10 +74,10 @@
|
|
|
73
74
|
"pino": "^10.3.1",
|
|
74
75
|
"pino-pretty": "^13.1.3",
|
|
75
76
|
"slugify": "^1.6.9",
|
|
76
|
-
"tailwind-merge": "^3.
|
|
77
|
+
"tailwind-merge": "^3.7.0"
|
|
77
78
|
},
|
|
78
79
|
"peerDependencies": {
|
|
79
|
-
"next": "^15.5.15",
|
|
80
|
+
"next": "^15.5.15 || ^16.0.0",
|
|
80
81
|
"react": "^19.1.1",
|
|
81
82
|
"react-dom": "^19.2.5",
|
|
82
83
|
"typescript": ">=5.8.3"
|
|
@@ -96,36 +97,42 @@
|
|
|
96
97
|
}
|
|
97
98
|
},
|
|
98
99
|
"devDependencies": {
|
|
99
|
-
"@
|
|
100
|
+
"@alien_intelligence/eslint-plugin-nitpicker": "^0.11.0",
|
|
101
|
+
"@biomejs/biome": "^2.5.14",
|
|
100
102
|
"@types/copyfiles": "^2.4.4",
|
|
101
103
|
"@types/dateformat": "^5.0.3",
|
|
102
104
|
"@types/minimist": "^1.2.5",
|
|
103
|
-
"@types/node": "^24.
|
|
104
|
-
"@types/react": "^19.
|
|
105
|
-
"@types/react-dom": "^19.
|
|
105
|
+
"@types/node": "^24.13.6",
|
|
106
|
+
"@types/react": "^19.3.0",
|
|
107
|
+
"@types/react-dom": "^19.3.0",
|
|
108
|
+
"@typescript-eslint/parser": "^8.70.1",
|
|
106
109
|
"copyfiles": "^2.4.1",
|
|
107
110
|
"cz-conventional-changelog": "^3.3.0",
|
|
108
|
-
"
|
|
111
|
+
"eslint": "^10.11.0",
|
|
112
|
+
"knip": "^6.38.0",
|
|
109
113
|
"minimist": "^1.2.8",
|
|
110
|
-
"next": "16.
|
|
111
|
-
"next-auth": "^4.24.
|
|
112
|
-
"react": "19.
|
|
113
|
-
"react-dom": "19.
|
|
114
|
-
"semantic-release": "^25.0.
|
|
114
|
+
"next": "16.3.6",
|
|
115
|
+
"next-auth": "^4.24.15",
|
|
116
|
+
"react": "19.3.0",
|
|
117
|
+
"react-dom": "19.3.0",
|
|
118
|
+
"semantic-release": "^25.0.9",
|
|
115
119
|
"tsup": "^8.5.1",
|
|
116
|
-
"tsx": "^4.
|
|
117
|
-
"typescript": "^5.
|
|
118
|
-
"vite": "^8.0
|
|
120
|
+
"tsx": "^4.23.15",
|
|
121
|
+
"typescript": "^5.9.3",
|
|
122
|
+
"vite": "^8.3.0",
|
|
119
123
|
"vite-tsconfig-paths": "^6.1.1",
|
|
120
|
-
"vitest": "^
|
|
124
|
+
"vitest": "^5.0.1"
|
|
121
125
|
},
|
|
122
126
|
"optionalDependencies": {
|
|
123
|
-
"@rollup/rollup-linux-x64-gnu": "^4.
|
|
124
|
-
"@rollup/rollup-win32-x64-msvc": "^4.
|
|
127
|
+
"@rollup/rollup-linux-x64-gnu": "^4.63.4",
|
|
128
|
+
"@rollup/rollup-win32-x64-msvc": "^4.63.4"
|
|
125
129
|
},
|
|
126
|
-
"
|
|
127
|
-
"@types/react": "
|
|
128
|
-
"@types/react-dom": "
|
|
130
|
+
"overrides": {
|
|
131
|
+
"@types/react": "$@types/react",
|
|
132
|
+
"@types/react-dom": "$@types/react-dom",
|
|
133
|
+
"tsup": {
|
|
134
|
+
"esbuild": "^0.28.2"
|
|
135
|
+
}
|
|
129
136
|
},
|
|
130
137
|
"config": {
|
|
131
138
|
"commitizen": {
|