@salespark/toolkit 2.1.10 → 2.1.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/dist/index.cjs +3 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/array.ts","../src/utils/bool.ts","../src/utils/object.ts","../src/utils/string.ts","../src/utils/number.ts","../src/utils/func.ts","../src/utils/validations.ts","../src/utils/iban.ts","../src/utils/security.ts","../src/index.ts"],"names":["chunk"],"mappings":"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","file":"index.js","sourcesContent":["/******************************************************\r\n * ##: Unique by Key\r\n * Returns unique items in an array based on a computed key\r\n * @param {Array<T>} arr - The array to process\r\n * @param {Function} key - Function to compute the key for uniqueness\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function uniqBy<T, K>(arr: T[], key: (v: T) => K): T[] {\r\n const seen = new Set<K>();\r\n const out: T[] = [];\r\n for (const item of arr) {\r\n const k = key(item);\r\n if (!seen.has(k)) {\r\n seen.add(k);\r\n out.push(item);\r\n }\r\n }\r\n return out;\r\n}\r\n\r\n/******************************************************\r\n * ##: Array Chunk\r\n * Splits an array into equally sized pieces\r\n * @param {Array<T>} arr - The array to chunk\r\n * @param {Number} size - Size of each chunk\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function chunk<T>(arr: T[], size: number): T[][] {\r\n if (size <= 0) return [arr.slice()];\r\n const res: T[][] = [];\r\n for (let i = 0; i < arr.length; i += size) res.push(arr.slice(i, i + size));\r\n return res;\r\n}\r\n\r\n/******************************************************\r\n * ##: Deep Array Equality\r\n * Deeply compares two arrays for equality, ignoring element order and property order in nested objects\r\n *\r\n * Notes:\r\n * - Uses JSON.stringify as the final canonical representation.\r\n * - Will return false on non-serializable inputs (e.g., circular structures).\r\n * - For primitives like NaN/Infinity, JSON.stringify follows JS semantics (NaN -> null).\r\n * @param {Array<T>} arr1 - First array to compare\r\n * @param {Array<T>} arr2 - Second array to compare\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function areArraysEqual<T = unknown>(arr1: T[], arr2: T[]): boolean {\r\n try {\r\n // Quick length check\r\n if (!Array.isArray(arr1) || !Array.isArray(arr2)) return false;\r\n if (arr1.length !== arr2.length) return false;\r\n\r\n // Canonicalize: sort object keys recursively\r\n const normalize = (value: unknown): unknown => {\r\n if (Array.isArray(value)) {\r\n // Normalize each element; order is handled later by sorting the stringified list\r\n return value.map(normalize);\r\n }\r\n if (value && typeof value === \"object\") {\r\n const entries = Object.entries(value as Record<string, unknown>)\r\n .map(([k, v]) => [k, normalize(v)] as const)\r\n .sort(([k1], [k2]) => (k1 < k2 ? -1 : k1 > k2 ? 1 : 0));\r\n return Object.fromEntries(entries);\r\n }\r\n return value;\r\n };\r\n\r\n // Stringify each normalized element and sort → order-independent comparison\r\n const a = arr1.map((el) => JSON.stringify(normalize(el))).sort();\r\n const b = arr2.map((el) => JSON.stringify(normalize(el))).sort();\r\n\r\n // Compare element-wise\r\n for (let i = 0; i < a.length; i++) {\r\n if (a[i] !== b[i]) return false;\r\n }\r\n return true;\r\n } catch {\r\n // Any unexpected error → treat as not equal\r\n return false;\r\n }\r\n}\r\n\r\n/* ======================================================================================\r\n * Deprecated aliases (backward-compatibility)\r\n * Keep until downstream code is migrated. Remove in a major release.\r\n * ====================================================================================*/\r\n/**\r\n * @deprecated Use `areArraysEqual` instead.\r\n */\r\nexport const areArraysDeepEqualUnordered = areArraysEqual;\r\n\r\n/******************************************************\r\n * ##: Unique Values\r\n * Removes duplicate values from an array\r\n * @param {Array<T>} arr - The array to process\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function uniq<T>(arr: T[]): T[] {\r\n return Array.from(new Set(arr));\r\n}\r\n\r\n/******************************************************\r\n * ##: Flatten Array\r\n * Flattens nested arrays into a single array (1 level deep)\r\n * @param {Array<any>} arr - The array to flatten\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function flatten<T>(arr: any[]): T[] {\r\n return arr.flat ? arr.flat() : [].concat(...arr);\r\n}\r\n\r\n/******************************************************\r\n * ##: Group By\r\n * Groups array items by a key or function\r\n * @param {Array<T>} arr - The array to group\r\n * @param {Function|String} key - Key or function to group by\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function groupBy<T, K extends keyof any>(\r\n arr: T[],\r\n key: ((item: T) => K) | K\r\n): Record<string, T[]> {\r\n return arr.reduce((acc, item) => {\r\n const group = typeof key === \"function\" ? key(item) : (item as any)[key];\r\n (acc[group] = acc[group] || []).push(item);\r\n return acc;\r\n }, {} as Record<string, T[]>);\r\n}\r\n\r\n/******************************************************\r\n * ##: Sort By\r\n * Sorts array by a key or function\r\n * @param {Array<T>} arr - The array to sort\r\n * @param {Function|String} key - Key or function to sort by\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function sortBy<T>(arr: T[], key: ((item: T) => any) | keyof T): T[] {\r\n return [...arr].sort((a, b) => {\r\n const aKey = typeof key === \"function\" ? key(a) : a[key];\r\n const bKey = typeof key === \"function\" ? key(b) : b[key];\r\n if (aKey < bKey) return -1;\r\n if (aKey > bKey) return 1;\r\n return 0;\r\n });\r\n}\r\n\r\n/******************************************************\r\n * ##: Array Difference\r\n * Returns elements in arr1 not present in arr2\r\n * @param {Array<T>} arr1 - First array\r\n * @param {Array<T>} arr2 - Second array\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function difference<T>(arr1: T[], arr2: T[]): T[] {\r\n const set2 = new Set(arr2);\r\n return arr1.filter((x) => !set2.has(x));\r\n}\r\n\r\n/******************************************************\r\n * ##: Array Intersection\r\n * Returns elements common to both arrays\r\n * @param {Array<T>} arr1 - First array\r\n * @param {Array<T>} arr2 - Second array\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function intersection<T>(arr1: T[], arr2: T[]): T[] {\r\n const set2 = new Set(arr2);\r\n return arr1.filter((x) => set2.has(x));\r\n}\r\n\r\n/******************************************************\r\n * ##: Compact Array\r\n * Removes falsy values from array\r\n * @param {Array<T>} arr - The array to compact\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function compact<T>(arr: T[]): T[] {\r\n return arr.filter(Boolean);\r\n}\r\n\r\n/******************************************************\r\n * ##: Pluck Property\r\n * Extracts a property from each object in array\r\n * @param {Array<T>} arr - The array of objects\r\n * @param {String} key - Property name to extract\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function pluck<T, K extends keyof T>(arr: T[], key: K): Array<T[K]> {\r\n return arr.map((item) => item[key]);\r\n}\r\n\r\n/******************************************************\r\n * ##: Shuffle Array\r\n * Shuffles array elements randomly\r\n * @param {Array<T>} arr - The array to shuffle\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function shuffle<T>(arr: T[]): T[] {\r\n const a = [...arr];\r\n for (let i = a.length - 1; i > 0; i--) {\r\n const j = Math.floor(Math.random() * (i + 1));\r\n [a[i], a[j]] = [a[j], a[i]];\r\n }\r\n return a;\r\n}\r\n\r\n/**\r\n ****************************************************\r\n * ##: Flattenable Value Checker\r\n * Checks if a value can be flattened (array, arguments, or marked spreadable)\r\n *\r\n * Notes:\r\n * Mirrors lodash's behavior: checks Array.isArray, arguments object, and Symbol.isConcatSpreadable.\r\n * @param {unknown} value - Value to check for flattenability\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function isFlattenable(value: unknown): value is readonly unknown[] {\r\n // Quick path: arrays\r\n if (Array.isArray(value)) return true;\r\n\r\n // Check for arguments object\r\n const isArgs = Object.prototype.toString.call(value) === \"[object Arguments]\";\r\n\r\n if (isArgs) return true;\r\n\r\n // Respect Symbol.isConcatSpreadable when present\r\n // (some iterables/array-likes may opt-in)\r\n const spreadable = (Symbol as any).isConcatSpreadable as symbol | undefined;\r\n // Using bracket access to avoid TS downlevel issues\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n return spreadable ? !!(value as any)?.[spreadable] : false;\r\n}\r\n\r\n/**\r\n ****************************************************\r\n * ##: Array Push All\r\n * Appends all values into array in-place (similar to lodash arrayPush)\r\n * @param {Array<T>} array - Target array\r\n * @param {Array<T>} values - Values to append\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function pushAll<T>(array: T[], values: readonly T[]): T[] {\r\n let index = -1;\r\n const length = values.length;\r\n const offset = array.length;\r\n\r\n while (++index < length) {\r\n array[offset + index] = values[index] as T;\r\n }\r\n return array;\r\n}\r\n\r\n/**\r\n ****************************************************\r\n * ##: Base Array Flatten\r\n * Base flatten routine with configurable depth and predicate\r\n *\r\n * Notes:\r\n * Allows control of depth, predicate, and strict mode. Used internally for flattening.\r\n * @param {Array} array - Input array\r\n * @param {Number} depth - Maximum recursion depth\r\n * @param {Function} predicate - Function to determine if value is flattenable\r\n * @param {Boolean} isStrict - If true, only flattenable values are kept\r\n * @param {Array} result - Optional accumulator (internal)\r\n * @returns {Array} New flattened array\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function flattenDepthBase<T>(\r\n array: readonly unknown[],\r\n depth: number,\r\n predicate: (v: unknown) => boolean = isFlattenable,\r\n isStrict = false,\r\n result: T[] = []\r\n): T[] {\r\n let index = -1;\r\n const length = array.length;\r\n\r\n while (++index < length) {\r\n const value = array[index];\r\n if (depth > 0 && predicate(value)) {\r\n if (depth > 1) {\r\n // Recursively flatten (susceptible to call stack limits on huge nests).\r\n flattenDepthBase<T>(\r\n value as readonly unknown[],\r\n depth - 1,\r\n predicate,\r\n isStrict,\r\n result\r\n );\r\n } else {\r\n pushAll(result, value as T[]);\r\n }\r\n } else if (!isStrict) {\r\n // Keep non-flattenables when not strict\r\n (result as unknown[])[result.length] = value as unknown as T;\r\n }\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n ****************************************************\r\n * ##: Flatten Array Once\r\n * Flattens array a single level deep (equivalent to lodash _.flatten)\r\n *\r\n * Notes:\r\n * Example: flattenOnce([1, [2, [3, [4]], 5]]) => [1, 2, [3, [4]], 5]\r\n * @param {Array} array - Array to flatten\r\n * @returns {Array} Flattened array (1 level)\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function flattenOnce<T>(\r\n array: ReadonlyArray<T | ReadonlyArray<T>>\r\n): T[] {\r\n // Type note: `flattenDepthBase` returns `unknown[]` at compile-time,\r\n // but we constrain inputs so a cast to `T[]` is safe here.\r\n return flattenDepthBase<T>(array as readonly unknown[], 1) as T[];\r\n}\r\n\r\n/******************************************************\r\n * ##: Flatten Array to Depth\r\n * Flattens array up to the specified depth (friendly wrapper, default 1)\r\n *\r\n * Notes:\r\n * Example: flattenDepth([1, [2, [3, [4]], 5]], 2) => [1, 2, 3, [4], 5]\r\n * @param {Array} array - Array to flatten\r\n * @param {Number} depth - Maximum depth\r\n * @param {Object} options - Options: predicate, isStrict\r\n * @returns {Array} Flattened array up to depth\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function flattenDepth<T = unknown>(\r\n array: readonly unknown[],\r\n depth = 1,\r\n options?: {\r\n predicate?: (v: unknown) => boolean;\r\n isStrict?: boolean;\r\n }\r\n): T[] {\r\n const { predicate = isFlattenable, isStrict = false } = options ?? {};\r\n return flattenDepthBase<T>(array, depth, predicate, isStrict);\r\n}\r\n","/****************************************************\r\n * ##: Boolean Parser\r\n * Converts a value to boolean, supporting common string/number representations\r\n *\r\n * Notes:\r\n * - Accepts \"true\", \"yes\", \"1\", \"false\", \"no\", \"0\" (case/whitespace-insensitive)\r\n * - Returns default value if not recognized or on error\r\n * @param {unknown} value - Input value (string | number | boolean | null | undefined)\r\n * @param {Boolean} def - Default value if input cannot be parsed (default: false)\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport const toBool = (value: unknown, def: boolean = false): boolean => {\r\n try {\r\n if (value === null || value === undefined) return def;\r\n\r\n if (typeof value === \"boolean\") return value;\r\n if (typeof value === \"number\") return value === 1;\r\n\r\n if (typeof value === \"string\") {\r\n switch (value.toLowerCase().trim()) {\r\n case \"true\":\r\n case \"yes\":\r\n case \"1\":\r\n return true;\r\n case \"false\":\r\n case \"no\":\r\n case \"0\":\r\n return false;\r\n default:\r\n return def;\r\n }\r\n }\r\n\r\n return def;\r\n } catch {\r\n return false;\r\n }\r\n};\r\n\r\n/* ======================================================================================\r\n * Deprecated aliases (backward-compatibility)\r\n * Keep until downstream code is migrated. Remove in a major release.\r\n * ====================================================================================*/\r\n/**\r\n * @deprecated Use `toBool` instead.\r\n */\r\nexport const parseToBool = toBool;\r\n","/**\r\n****************************************************\r\n * ##: Object Property Picker\r\n * Picks specified properties from an object and returns a new object\r\n * @param {Object} obj - Source object\r\n * @param {Array} keys - Array of keys to pick\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function pick<T extends object, K extends keyof T>(\r\n obj: T,\r\n keys: K[]\r\n): Pick<T, K> {\r\n const out = {} as Pick<T, K>;\r\n for (const k of keys) if (k in obj) out[k] = obj[k];\r\n return out;\r\n}\r\n\r\n/**\r\n****************************************************\r\n * ##: Object Property Omitter\r\n * Omits specified properties from an object and returns a new object\r\n * @param {Object} obj - Source object\r\n * @param {Array} keys - Array of keys to omit\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function omit<T extends object, K extends keyof T>(\r\n obj: T,\r\n keys: K[]\r\n): Omit<T, K> {\r\n const set = new Set<keyof T>(keys);\r\n const out = {} as any;\r\n for (const k in obj) if (!set.has(k)) out[k] = obj[k];\r\n return out;\r\n}\r\n\r\n/**\r\n****************************************************\r\n * ##: Object to Clean String\r\n * Converts an object or value to a clean string without JSON braces and quotes\r\n *\r\n * Notes:\r\n * Examples: { a: 1, b: \"x\" } -> \"a=1_b=x\", null -> \"\", 42 -> \"42\"\r\n * @param {unknown} obj - Object or value to convert\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function objectToString(obj: unknown): string {\r\n try {\r\n if (obj === null || obj === undefined) return \"\";\r\n if (typeof obj !== \"object\") return String(obj);\r\n\r\n return JSON.stringify(obj)\r\n .replace(/[{}\"]/g, \"\") // remove { } \"\r\n .replace(/:/g, \"=\") // replace : with =\r\n .replace(/,/g, \"_\"); // replace , with _\r\n } catch {\r\n // Fallback: best-effort stringify\r\n try {\r\n return String(obj);\r\n } catch {\r\n return \"\";\r\n }\r\n }\r\n}\r\n\r\n/**\r\n****************************************************\r\n * ##: Deep Object Cleaner\r\n * Deep-cleans an input by removing null, undefined, \"null\", \"undefined\" and recursively cleaning arrays/objects\r\n *\r\n * Notes:\r\n * - Falsy values like 0, false, \"\" are kept.\r\n * - Non-plain objects (e.g., Date, Map) are treated as generic objects via Object.entries.\r\n * - Prunes empty objects/arrays produced by the cleaning step.\r\n * - Optionally removes empty strings (\"\") when configured.\r\n * @param {unknown} obj - Object or array to clean\r\n * @param {boolean} removeEmptyString - When true, also removes empty strings\r\n * History:\r\n * 21-08-2025: Created\r\n * 11-12-2025: Added optional removeEmptyString flag\r\n ****************************************************/\r\ntype Removable = null | undefined | \"null\" | \"undefined\" | \"\";\r\n\r\nconst isRemovable = (\r\n v: unknown,\r\n removeEmptyString?: boolean\r\n): v is Removable =>\r\n v === null ||\r\n v === undefined ||\r\n v === \"null\" ||\r\n v === \"undefined\" ||\r\n (removeEmptyString && v === \"\");\r\n\r\nexport function cleanObject<T = unknown>(\r\n obj: T,\r\n removeEmptyString = false\r\n): any {\r\n // Handle arrays: map + clean each item, then filter removable values\r\n if (Array.isArray(obj)) {\r\n const cleanedArray = obj\r\n .map((item) => cleanObject(item, removeEmptyString))\r\n .filter((item) => !isRemovable(item, removeEmptyString));\r\n return cleanedArray;\r\n }\r\n\r\n // Handle objects (and only objects, excluding null)\r\n if (obj !== null && typeof obj === \"object\") {\r\n const cleaned: Record<string, any> = {};\r\n\r\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\r\n // Skip removable raw values fast\r\n if (isRemovable(value, removeEmptyString)) continue;\r\n\r\n // Recursively clean nested values\r\n const nested = cleanObject(value, removeEmptyString);\r\n\r\n // After cleaning, skip if still removable\r\n if (isRemovable(nested, removeEmptyString)) continue;\r\n\r\n // Prune empty objects/arrays (to mirror original behavior)\r\n const isObj = typeof nested === \"object\" && nested !== null;\r\n const isEmptyObj =\r\n isObj && !Array.isArray(nested) && Object.keys(nested).length === 0;\r\n const isEmptyArr = Array.isArray(nested) && nested.length === 0;\r\n if (isEmptyObj || isEmptyArr) continue;\r\n\r\n cleaned[key] = nested;\r\n }\r\n\r\n return cleaned;\r\n }\r\n\r\n // Primitives (and functions) are returned as-is\r\n return obj as any;\r\n}\r\n","type Locale = string | string[] | undefined;\r\n\r\nexport type CapitalizeFirstOptions = {\r\n lowerRest?: boolean;\r\n locale?: Locale;\r\n};\r\n\r\nexport type CapitalizeWordsOptions = {\r\n lowerRest?: boolean;\r\n locale?: Locale;\r\n treatHyphenAsSeparator?: boolean;\r\n};\r\n\r\nexport type SentenceCaseOptions = {\r\n lowerRest?: boolean;\r\n locale?: Locale;\r\n};\r\n\r\nfunction upper(value: string, locale?: Locale) {\r\n return locale ? value.toLocaleUpperCase(locale) : value.toUpperCase();\r\n}\r\n\r\nfunction lower(value: string, locale?: Locale) {\r\n return locale ? value.toLocaleLowerCase(locale) : value.toLowerCase();\r\n}\r\n\r\n/******************************************************\r\n * ##: Slugify String\r\n * Converts a string to a URL-friendly slug (basic ASCII, keeps numbers and dashes)\r\n * @param {String} input - String to slugify\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function slugify(input: string) {\r\n return input\r\n .normalize(\"NFKD\")\r\n .replace(/[\\u0300-\\u036f]/g, \"\")\r\n .toLowerCase()\r\n .replace(/[^a-z0-9]+/g, \"-\")\r\n .replace(/^-+|-+$/g, \"\");\r\n}\r\n\r\n/******************************************************\r\n * ##: Simple String Template Filler\r\n * Fills a template string with values (e.g., \"Hello, {name}!\")\r\n * @param {String} template - Template string\r\n * @param {Object} values - Key-value pairs to fill\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function fill(\r\n template: string,\r\n values: Record<string, string | number>\r\n) {\r\n return template.replace(/\\{(\\w+)\\}/g, (_, k) => String(values[k] ?? \"\"));\r\n}\r\n\r\n/******************************************************\r\n * ##: Remove Diacritics\r\n * Removes diacritic marks from a string using NFD normalization\r\n *\r\n * Notes:\r\n * Examples: \"ação\" -> \"acao\", \"coração\" -> \"coracao\", \"résumé\" -> \"resume\", \"naïve\" -> \"naive\"\r\n * @param {String} str - String to deburr\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function deburr(str: string): string {\r\n try {\r\n return str.normalize(\"NFD\").replace(/[\\u0300-\\u036f]/g, \"\");\r\n } catch {\r\n return str;\r\n }\r\n}\r\n\r\n/******************************************************\r\n * ##: Capitalize First Letter\r\n * Capitalizes only the first character of a string; optionally lowercases the rest\r\n * @param {String} input - Input string\r\n * @param {Object} options - { lowerRest = true, locale }\r\n * History:\r\n * 19-12-2025: Created\r\n ****************************************************/\r\nexport function capitalizeFirst(\r\n input: unknown,\r\n options?: CapitalizeFirstOptions\r\n): string {\r\n if (typeof input !== \"string\" || input.length === 0) return \"\";\r\n\r\n const { lowerRest = true, locale } = options ?? {};\r\n const first = upper(input[0], locale);\r\n const rest = lowerRest ? lower(input.slice(1), locale) : input.slice(1);\r\n\r\n return first + rest;\r\n}\r\n\r\n/******************************************************\r\n * ##: Capitalize Words\r\n * Capitalizes each word in a string with options for hyphens and locale\r\n * @param {String} input - Input string\r\n * @param {Object} options - { lowerRest = true, locale, treatHyphenAsSeparator = false }\r\n * History:\r\n * 19-12-2025: Created\r\n ****************************************************/\r\nexport function capitalizeWords(\r\n input: unknown,\r\n options?: CapitalizeWordsOptions\r\n): string {\r\n if (typeof input !== \"string\" || input.length === 0) return \"\";\r\n\r\n const {\r\n lowerRest = true,\r\n locale,\r\n treatHyphenAsSeparator = false,\r\n } = options ?? {};\r\n\r\n const wordPattern = treatHyphenAsSeparator\r\n ? /[\\p{L}\\p{N}]+(?:['’][\\p{L}\\p{N}]+)*/gu\r\n : /[\\p{L}\\p{N}]+(?:['’\\-][\\p{L}\\p{N}]+)*/gu;\r\n\r\n return input.replace(wordPattern, (word) => {\r\n const first = upper(word[0], locale);\r\n const rest = lowerRest ? lower(word.slice(1), locale) : word.slice(1);\r\n\r\n return first + rest;\r\n });\r\n}\r\n\r\n/******************************************************\r\n * ##: Sentence Case\r\n * Capitalizes the first letter of each sentence (. ! ?) with optional lowercasing of the rest\r\n * @param {String} input - Input string\r\n * @param {Object} options - { lowerRest = true, locale }\r\n * History:\r\n * 19-12-2025: Created\r\n ****************************************************/\r\nexport function sentenceCase(\r\n input: unknown,\r\n options?: SentenceCaseOptions\r\n): string {\r\n if (typeof input !== \"string\" || input.length === 0) return \"\";\r\n\r\n const { lowerRest = true, locale } = options ?? {};\r\n const base = lowerRest ? lower(input, locale) : input;\r\n const sentencePattern = /(^\\s*[\\p{L}])|([.!?]\\s*[\\p{L}])/gu;\r\n\r\n return base.replace(sentencePattern, (match) => {\r\n const lastChar = match[match.length - 1];\r\n const upperChar = upper(lastChar, locale);\r\n return match.slice(0, -1) + upperChar;\r\n });\r\n}\r\n\r\n/* ======================================================================================\r\n * Deprecated aliases (backward-compatibility)\r\n * Keep until downstream code is migrated. Remove in a major release.\r\n * ====================================================================================*/\r\n/**\r\n * @deprecated Use `deburr` instead.\r\n */\r\nexport const removeDiacritics = deburr;\r\n\r\n/******************************************************\r\n * ##: Basic String Sanitizer\r\n * Sanitizes input by removing control chars, HTML/script/style/iframe blocks, dangerous URL schemes, and keeps letters/numbers/spaces/punctuation\r\n *\r\n * Notes:\r\n * Non-string inputs return \"\". This is a light, generic sanitizer (not a full HTML sanitizer).\r\n * @param {unknown} input - Input to sanitize\r\n * @param {Number} maxLength - Optional max length for output\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function sanitize(input: unknown, maxLength?: number): string {\r\n if (typeof input !== \"string\") return \"\";\r\n\r\n // 1. Remove invisible spaces and control characters\r\n let cleaned = input.replace(/[\\u0000-\\u001F\\u007F-\\u009F]/g, \"\");\r\n\r\n // 2. Remove embedded script/style/iframe blocks\r\n cleaned = cleaned.replace(/<(script|style|iframe)[^>]*>.*?<\\/\\1>/gis, \"\");\r\n\r\n // 3. Remove event handler attributes (e.g., onclick, onerror)\r\n cleaned = cleaned.replace(/on\\w+\\s*=\\s*(['\"]).*?\\1/gi, \"\");\r\n\r\n // 4. Remove CSS expressions (expression(...))\r\n cleaned = cleaned.replace(/expression\\s*\\([^)]*\\)/gi, \"\");\r\n\r\n // 5. Remove blocks between dangerous HTML entities (e.g., <script>...</script>)\r\n cleaned = cleaned.replace(\r\n /<script>[\\s\\S]*?<\\/script>/gi,\r\n \"\"\r\n );\r\n cleaned = cleaned.replace(/<.*?>/gi, \"\");\r\n\r\n // 6. Strip all remaining HTML tags\r\n cleaned = cleaned.replace(/<[^>]+>/g, \"\");\r\n\r\n // 7. Remove dangerous URL schemes\r\n cleaned = cleaned.replace(/\\b(javascript:|data:|vbscript:|file:|ftp:)/gi, \"\");\r\n\r\n // 8. Keep letters/numbers/spaces and basic punctuation\r\n cleaned = cleaned.replace(/[^\\p{L}\\p{N}\\s\\-.,!?@#%&()]/gu, \"\");\r\n // 9. Apply maxLength only if explicitly passed\r\n if (typeof maxLength === \"number\" && maxLength > 0) {\r\n cleaned = cleaned.substring(0, maxLength);\r\n }\r\n\r\n // 10. Trim\r\n cleaned = cleaned.trim();\r\n\r\n return cleaned;\r\n}\r\n\r\n/* ======================================================================================\r\n * Deprecated aliases (backward-compatibility)\r\n * Keep until downstream code is migrated. Remove in a major release.\r\n * ====================================================================================*/\r\n/**\r\n * @deprecated Use `sanitize` instead.\r\n */\r\nexport const basicSanitize = sanitize;\r\n","/******************************************************\r\n * ##: Clamp Number\r\n * Restricts a number to be within the min and max bounds\r\n * @param {number} n - Number to clamp\r\n * @param {number} min - Minimum value\r\n * @param {number} max - Maximum value\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport const clamp = (n: number, min: number, max: number) =>\r\n Math.min(Math.max(n, min), max);\r\n\r\n/******************************************************\r\n * ##: Fixed Decimal Rounding\r\n * Rounds a number to a fixed number of decimals without floating point surprises\r\n * @param {number} n - Number to round\r\n * @param {number} decimals - Number of decimal places\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function round(n: number, decimals = 0) {\r\n const f = Math.pow(10, decimals);\r\n return Math.round((n + Number.EPSILON) * f) / f;\r\n}\r\n\r\n/******************************************************\r\n * ##: Safe Integer Conversion\r\n * Safely converts a value to an integer. Returns defaultValue if parsing fails or results in NaN.\r\n *\r\n * Notes:\r\n * Examples: safeParseInt(\"42\") -> 42, safeParseInt(\"abc\", 10) -> 10, safeParseInt(undefined) -> 0, safeParseInt(3.9) -> 3\r\n * @param {unknown} value - Value to convert\r\n * @param {number} defaultValue - Default value if parsing fails\r\n * History:\r\n * 21-08-2025: Created\r\n * 29-10-2025: Renamed from toInteger to safeParseInt\r\n ****************************************************/\r\nexport function safeParseInt(value: unknown, defaultValue = 0): number {\r\n try {\r\n const safeValue = parseInt(String(value), 10);\r\n return isNaN(safeValue) ? defaultValue : safeValue;\r\n } catch {\r\n return defaultValue;\r\n }\r\n}\r\n\r\n/******************************************************\r\n * ##: Decimal Precision Normalization\r\n * Ensures decimal precision values are finite, clamped to a safe integer range (0-100).\r\n *\r\n * Notes:\r\n * Used internally by safe arithmetic helpers to avoid invalid toFixed ranges.\r\n * @param {number} decimals - Requested decimal precision\r\n * @returns {number} Clamped integer precision between 0 and 100\r\n * History:\r\n * 01-12-2025: Created\r\n ****************************************************/\r\nfunction normalizeDecimals(decimals: number): number {\r\n if (!Number.isFinite(decimals)) return 0;\r\n const int = Math.floor(decimals);\r\n if (int < 0) return 0;\r\n if (int > 100) return 100;\r\n return int;\r\n}\r\n\r\n/******************************************************\r\n * ##: Operand Sanitization\r\n * Confirms operands are finite numbers before performing arithmetic.\r\n *\r\n * Notes:\r\n * Returns false if any operand is NaN or infinite.\r\n * @param {number[]} values - Numbers to validate\r\n * @returns {boolean} True when all operands are finite\r\n * History:\r\n * 01-12-2025: Created\r\n ****************************************************/\r\nfunction sanitizeOperands(...values: number[]): boolean {\r\n return values.every((value) => Number.isFinite(value));\r\n}\r\n\r\n/******************************************************\r\n * ##: Safe Addition\r\n * Adds two numbers with precision normalization and operand validation.\r\n *\r\n * Notes:\r\n * Returns 0 when operands are invalid or if toFixed throws.\r\n * Examples: safeAdd(0.1, 0.2, 2) -> 0.3, safeAdd(NaN, 5) -> 0\r\n * @param {number} a - Augend\r\n * @param {number} b - Addend\r\n * @param {number} decimals - Decimal places for rounding (default 2)\r\n * History:\r\n * 01-12-2025: Created\r\n ****************************************************/\r\nexport function safeAdd(a: number, b: number, decimals = 2): number {\r\n try {\r\n if (!sanitizeOperands(a, b)) return 0;\r\n const precision = normalizeDecimals(decimals);\r\n return Number((a + b).toFixed(precision));\r\n } catch {\r\n return 0;\r\n }\r\n}\r\n\r\n/******************************************************\r\n * ##: Safe Multiplication\r\n * Multiplies two numbers with precision normalization and operand validation.\r\n *\r\n * Notes:\r\n * Returns 0 when operands are invalid or on computation errors.\r\n * Examples: safeMultiply(0.1, 0.2, 4) -> 0.02, safeMultiply(Infinity, 2) -> 0\r\n * @param {number} a - First factor\r\n * @param {number} b - Second factor\r\n * @param {number} decimals - Decimal places for rounding (default 2)\r\n * History:\r\n * 01-12-2025: Created\r\n ****************************************************/\r\nexport function safeMultiply(a: number, b: number, decimals = 2): number {\r\n try {\r\n if (!sanitizeOperands(a, b)) return 0;\r\n const precision = normalizeDecimals(decimals);\r\n return Number((a * b).toFixed(precision));\r\n } catch {\r\n return 0;\r\n }\r\n}\r\n\r\n/******************************************************\r\n * ##: Safe Subtraction\r\n * Subtracts two numbers with precision normalization and operand validation.\r\n *\r\n * Notes:\r\n * Returns 0 when operands are invalid or on computation errors.\r\n * Examples: safeSubtract(10, 3.3333, 2) -> 6.67, safeSubtract(5, NaN) -> 0\r\n * @param {number} a - Minuend\r\n * @param {number} b - Subtrahend\r\n * @param {number} decimals - Decimal places for rounding (default 2)\r\n * History:\r\n * 01-12-2025: Created\r\n ****************************************************/\r\nexport function safeSubtract(a: number, b: number, decimals = 2): number {\r\n try {\r\n if (!sanitizeOperands(a, b)) return 0;\r\n const precision = normalizeDecimals(decimals);\r\n return Number((a - b).toFixed(precision));\r\n } catch {\r\n return 0;\r\n }\r\n}\r\n\r\n/******************************************************\r\n * ##: Safe Division\r\n * Divides two numbers with precision normalization, operand validation, and zero checks.\r\n *\r\n * Notes:\r\n * Returns 0 when operands are invalid or divisor is zero.\r\n * Examples: safeDivide(1, 3, 3) -> 0.333, safeDivide(10, 0) -> 0\r\n * @param {number} a - Dividend\r\n * @param {number} b - Divisor\r\n * @param {number} decimals - Decimal places for rounding (default 2)\r\n * History:\r\n * 01-12-2025: Created\r\n ****************************************************/\r\nexport function safeDivide(a: number, b: number, decimals = 2): number {\r\n try {\r\n if (!sanitizeOperands(a, b) || b === 0) return 0;\r\n const precision = normalizeDecimals(decimals);\r\n return Number((a / b).toFixed(precision));\r\n } catch {\r\n return 0;\r\n }\r\n}\r\n\r\n/******************************************************\r\n * ##: Safe Number Comparison\r\n * Compares two numbers using fixed decimal precision with operand validation.\r\n *\r\n * Notes:\r\n * Returns false when operands are invalid.\r\n * Examples: numbersEqual(0.1 + 0.2, 0.3) -> true, numbersEqual(NaN, 1) -> false\r\n * @param {number} a - First number\r\n * @param {number} b - Second number\r\n * @param {number} decimals - Decimal places for comparison (default 2)\r\n * History:\r\n * 01-12-2025: Created\r\n ****************************************************/\r\nexport function numbersEqual(a: number, b: number, decimals = 2): boolean {\r\n try {\r\n if (!sanitizeOperands(a, b)) return false;\r\n const precision = normalizeDecimals(decimals);\r\n return a.toFixed(precision) === b.toFixed(precision);\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/* ======================================================================================\r\n * Deprecated aliases (backward-compatibility)\r\n * Keep until downstream code is migrated. Remove in a major release.\r\n * ====================================================================================*/\r\n/**\r\n * @deprecated Use `safeParseFloat` instead.\r\n */\r\nexport const toInteger = safeParseInt;\r\n\r\n/******************************************************\r\n * ##: Safe Number Conversion\r\n * Safely parses a value into a number with optional decimal precision\r\n *\r\n * Notes:\r\n * Handles commas as decimal/thousands separators. Returns 0 for null/undefined/empty string or invalid parsing.\r\n * Examples: safeParseFloat(\"123.45\") -> 123.45, safeParseFloat(\"123,45\") -> 123.45, safeParseFloat(\"1,234.56\") -> 1234.56, safeParseFloat(\"abc\", 2) -> 0, safeParseFloat(42) -> 42\r\n * @param {unknown} value - Value to convert\r\n * @param {number} decimals - Number of decimal places\r\n * History:\r\n * 21-08-2025: Created\r\n * 29-10-2025: Renamed from toNumber to safeParseFloat\r\n * 01-12-2025: Fixed space-separated thousands handling and improved number parsing logic\r\n ****************************************************/\r\nexport function safeParseFloat(value: unknown, decimals = 6): number {\r\n try {\r\n // Fast path for numbers\r\n if (typeof value === \"number\") {\r\n return isNaN(value) ? 0 : Number(value.toFixed(decimals));\r\n }\r\n\r\n // Return 0 for null/undefined/empty\r\n if (value === undefined || value === null || value === \"\") return 0;\r\n\r\n let str = String(value).trim();\r\n if (!str) return 0;\r\n\r\n // Remove all spaces (can be used as thousands separators)\r\n str = str.replace(/\\s+/g, \"\");\r\n\r\n // Normalize separators\r\n let normalized: string;\r\n\r\n if (str.includes(\",\") && str.includes(\".\")) {\r\n // Determine which is decimal separator (rightmost one)\r\n const lastComma = str.lastIndexOf(\",\");\r\n const lastDot = str.lastIndexOf(\".\");\r\n\r\n if (lastDot > lastComma) {\r\n // \"1,234.56\" -> remove commas\r\n normalized = str.replace(/,/g, \"\");\r\n } else {\r\n // \"1.234,56\" -> swap separators\r\n normalized = str.replace(/\\./g, \"\").replace(\",\", \".\");\r\n }\r\n } else if (str.includes(\",\")) {\r\n // Check if comma is thousands separator or decimal separator\r\n const parts = str.split(\",\");\r\n if (parts.length === 2 && parts[1].length <= 2) {\r\n // \"123,45\" -> decimal separator\r\n normalized = str.replace(\",\", \".\");\r\n } else {\r\n // \"1,234\" or \"1,234,567\" -> thousands separator\r\n normalized = str.replace(/,/g, \"\");\r\n }\r\n } else {\r\n normalized = str;\r\n }\r\n\r\n const num = parseFloat(normalized);\r\n if (!isFinite(num)) return 0;\r\n\r\n const precision = normalizeDecimals(decimals);\r\n return Number(num.toFixed(precision));\r\n\r\n // Error handling\r\n } catch {\r\n return 0;\r\n }\r\n}\r\n\r\n/* ======================================================================================\r\n * Deprecated aliases (backward-compatibility)\r\n * Keep until downstream code is migrated. Remove in a major release.\r\n * ====================================================================================*/\r\n/**\r\n * @deprecated Use `safeParseFloat` instead.\r\n */\r\nexport const toNumber = safeParseFloat;\r\n\r\n/**\r\n * @deprecated Use `safeParseFloat` instead.\r\n */\r\nexport const parseToNumber = safeParseFloat;\r\n\r\n/******************************************************\r\n * ##: Secure Random Index\r\n * Generates a uniformly distributed integer in [0, max) using Web Crypto when available\r\n *\r\n * Notes:\r\n * Falls back to Math.random() if crypto is unavailable (not cryptographically secure)\r\n * @param {number} max - Upper bound (exclusive)\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nfunction secureRandomIndex(max: number): number {\r\n if (max <= 0) return 0;\r\n\r\n const g: any = globalThis as any;\r\n const crypto = g?.crypto;\r\n\r\n // Prefer Web Crypto (browser + Node 18+ expose crypto.getRandomValues)\r\n if (crypto && typeof crypto.getRandomValues === \"function\") {\r\n // Rejection sampling to avoid modulo bias\r\n const range = 0x100000000; // 2^32\r\n const threshold = range - (range % max);\r\n const buf = new Uint32Array(1);\r\n\r\n // Loop until we hit a value in the unbiased range\r\n // In practice this loops rarely (expected < 2 iterations).\r\n do {\r\n crypto.getRandomValues(buf);\r\n } while (buf[0] >= threshold);\r\n\r\n return buf[0] % max;\r\n }\r\n\r\n // Fallback (NOT cryptographically secure)\r\n return Math.floor(Math.random() * max);\r\n}\r\n\r\n/******************************************************\r\n * ##: Random Digits Generator\r\n * Generates a random string of digits with secure randomness when available\r\n *\r\n * Notes:\r\n * Options: length (default 6), charset (default \"0123456789\"), noLeadingZero (if true, first char not \"0\"). Returns a string to preserve leading zeros. Uses Web Crypto when possible; otherwise falls back to Math.random().\r\n * @param {number} length - Number of digits\r\n * @param {object} options - Options: charset, noLeadingZero\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function randomDigits(\r\n length = 6,\r\n options?: { charset?: string; noLeadingZero?: boolean }\r\n): string {\r\n const charset = options?.charset ?? \"0123456789\";\r\n if (length <= 0 || charset.length === 0) return \"\";\r\n\r\n let out = \"\";\r\n\r\n for (let i = 0; i < length; i++) {\r\n if (i === 0 && options?.noLeadingZero && charset.includes(\"0\")) {\r\n // Pick from charset without \"0\"\r\n const pool = charset.replace(/0/g, \"\");\r\n if (pool.length === 0) return \"\"; // nothing to pick\r\n out += pool[secureRandomIndex(pool.length)];\r\n } else {\r\n out += charset[secureRandomIndex(charset.length)];\r\n }\r\n }\r\n\r\n return out;\r\n}\r\n\r\n/* ======================================================================================\r\n * Deprecated aliases (backward-compatibility)\r\n * Keep until downstream code is migrated. Remove in a major release.\r\n * ====================================================================================*/\r\n/**\r\n * @deprecated Use `randomDigits` instead.\r\n */\r\n\r\nexport const otp = randomDigits;\r\n\r\n/******************************************************\r\n * ##: Decimal Number Formatter\r\n * Formats a number with specified decimal places, handling comma/dot normalization.\r\n *\r\n * Intelligently handles European number formats (1.234,56) and US formats (1,234.56).\r\n * Converts strings to numbers and applies decimal formatting.\r\n * @param {number|string|null|undefined} value Number value to format\r\n * @param {number} decimals - Number of decimal places (default: 2)\r\n * @returns {string} Formatted number string with specified decimals\r\n * History:\r\n * 16-10-2025: Created\r\n ****************************************************/\r\nexport const formatDecimalNumber = (\r\n value: number | string | null | undefined,\r\n decimals: number = 2\r\n): string => {\r\n try {\r\n // Handle nil values\r\n let processedValue: string | number = value ?? 0;\r\n\r\n // Handle string normalization for comma/dot formats\r\n if (typeof processedValue === \"string\") {\r\n const trimmed = processedValue.trim();\r\n\r\n if (trimmed.includes(\",\") && trimmed.includes(\".\")) {\r\n const lastComma = trimmed.lastIndexOf(\",\");\r\n const lastDot = trimmed.lastIndexOf(\".\");\r\n\r\n processedValue =\r\n lastComma > lastDot\r\n ? trimmed.replace(/\\./g, \"\").replace(\",\", \".\") // European style\r\n : trimmed.replace(/,/g, \"\"); // US style\r\n } else if (trimmed.includes(\",\")) {\r\n processedValue = trimmed.replace(/,/g, \".\");\r\n } else {\r\n processedValue = trimmed;\r\n }\r\n }\r\n\r\n const numValue = parseFloat(String(processedValue));\r\n\r\n // Handle invalid numbers\r\n if (isNaN(numValue)) {\r\n return (0).toFixed(Math.max(0, Math.floor(decimals)));\r\n }\r\n\r\n return numValue.toFixed(Math.max(0, Math.floor(decimals)));\r\n } catch (error) {\r\n /* c8 ignore start */\r\n return (0).toFixed(Math.max(0, Math.floor(decimals)));\r\n /* c8 ignore end */\r\n }\r\n};\r\n","/******************************************************\r\n * ##: Safe JSON Parse\r\n * Safely parses a JSON string or returns the object if already parsed. Falls back to default value on failure.\r\n * @param {unknown} input - The value to parse (string or object)\r\n * @param {T} defaultValue - The default value to return if parsing fails or input is invalid\r\n * @returns {T} The parsed object or default value\r\n * History:\r\n * 21-12-2025: Created\r\n ****************************************************/\r\nexport function safeJSONParse<T>(input: unknown, defaultValue: T): T {\r\n if (typeof input === 'object' && input !== null) {\r\n return input as T;\r\n }\r\n if (typeof input === 'string') {\r\n try {\r\n const parsed = JSON.parse(input);\r\n return parsed as T;\r\n } catch {\r\n return defaultValue;\r\n }\r\n }\r\n return defaultValue;\r\n}\r\n\r\n/******************************************************\r\n * ##: Debounce Function\r\n * Returns a debounced version of a function that delays execution until after wait ms\r\n * @param {Function} fn - Function to debounce\r\n * @param {Number} wait - Delay in milliseconds\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function debounce<T extends (...args: any[]) => any>(fn: T, wait = 250) {\r\n let t: any;\r\n return function (this: any, ...args: Parameters<T>) {\r\n clearTimeout(t);\r\n t = setTimeout(() => fn.apply(this, args), wait);\r\n } as T;\r\n}\r\n\r\n/******************************************************\r\n * ##: Throttle Function\r\n * Returns a throttled version of a function that only executes once per wait ms\r\n * @param {Function} fn - Function to throttle\r\n * @param {Number} wait - Delay in milliseconds\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function throttle<T extends (...args: any[]) => any>(fn: T, wait = 250) {\r\n let last = 0;\r\n let timer: any;\r\n return function (this: any, ...args: Parameters<T>) {\r\n const now = Date.now();\r\n const remaining = wait - (now - last);\r\n if (remaining <= 0) {\r\n last = now;\r\n fn.apply(this, args);\r\n } else if (!timer) {\r\n timer = setTimeout(() => {\r\n last = Date.now();\r\n timer = null;\r\n fn.apply(this, args);\r\n }, remaining);\r\n }\r\n } as T;\r\n}\r\n\r\n/******************************************************\r\n * ##: Nil Value Check\r\n * Checks if a value is null or undefined (Type Guard)\r\n * @param {unknown} value - Value to check\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport const isNil = (value: unknown): value is null | undefined =>\r\n value === null || value === undefined;\r\n\r\n/******************************************************\r\n * ##: Nil or Nil Text Check\r\n * Checks if value is null/undefined or the text \"null\"/\"undefined\"\r\n * @param {unknown} value - Value to check\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport const isNilText = (value: unknown): boolean => {\r\n if (value === null || value === undefined) return true;\r\n if (typeof value === \"string\") {\r\n const v = value.trim().toLowerCase();\r\n return v === \"null\" || v === \"undefined\";\r\n }\r\n return false;\r\n};\r\n\r\n/******************************************************\r\n * ##: Nil or Empty String Check\r\n * Checks if value is null/undefined or an empty string \"\"\r\n * @param {unknown} value - Value to check\r\n * History:\r\n * 21-08-2025: Created\r\n * 18-10-2025: Trim before checking empty\r\n ****************************************************/\r\nexport const isNilOrEmpty = (value: unknown): boolean => {\r\n try {\r\n return isNil(value) || (typeof value === \"string\" && value?.trim() === \"\");\r\n /* c8 ignore next -- defensive fallback (should never throw) */\r\n } catch {\r\n return true;\r\n }\r\n};\r\n\r\n/******************************************************\r\n * ##: Array Nil or Empty Element Check\r\n * Checks if any element in array is nil or empty (\"\"). Returns true if input is not an array.\r\n * @param {unknown} array - Array to check\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport const hasNilOrEmpty = (array: unknown): boolean => {\r\n try {\r\n if (!Array.isArray(array)) return true;\r\n for (const item of array) {\r\n if (isNilOrEmpty(item)) return true;\r\n }\r\n return false;\r\n } catch {\r\n return true;\r\n }\r\n};\r\n\r\n/******************************************************\r\n * ##: Nil, Empty, or Zero Length Check\r\n * Checks if value is nil, empty string, or has zero length (applies to arrays, strings, typed arrays, buffers)\r\n * @param {unknown} value - Value to check\r\n * History:\r\n * 21-08-2025: Created\r\n * 08-11-2025: Fixed type-safety and logic - added proper 'length' property check using 'in' operator,\r\n * changed catch block to return false (don't assume error means empty), added explicit\r\n * false return for values without length property\r\n ****************************************************/\r\nexport const isNilEmptyOrZeroLength = (value: unknown): boolean => {\r\n try {\r\n // Check for nil first\r\n if (isNil(value)) return true;\r\n\r\n // Check if value is empty string\r\n if (value === \"\") return true;\r\n\r\n // Check if value is string with length > 0\r\n if (typeof value === \"string\" && value.length > 0) return false;\r\n\r\n // Check if is array and has length > 0\r\n if (Array.isArray(value) && value.length > 0) return false;\r\n\r\n // For other types\r\n return true;\r\n\r\n // Error handling\r\n } catch {\r\n // fallback\r\n return true;\r\n }\r\n};\r\n\r\n/**\r\n * @deprecated Use `isNilEmptyOrZeroLength` instead.\r\n */\r\nexport const isNilEmptyOrZeroLen = isNilEmptyOrZeroLength;\r\n\r\n/******************************************************\r\n * ##: Nil or Zero Length Check\r\n * Checks if value is nil or has zero length (.length === 0). Does NOT treat \"\" specially.\r\n * @param {unknown} value - Value to check\r\n * History:\r\n * 21-08-2025: Created\r\n * 08-11-2025: Fixed type-safety and logic - added proper 'length' property check using 'in' operator,\r\n * changed catch block to return false (don't assume error means empty), added explicit\r\n * false return for values without length property\r\n ****************************************************/\r\nexport const isNilOrZeroLength = (value: unknown): boolean => {\r\n try {\r\n // Check for nil first\r\n if (isNil(value)) return true;\r\n\r\n // Check if is array and has length > 0\r\n if (Array.isArray(value) && value.length > 0) return false;\r\n\r\n // For other types\r\n return true;\r\n\r\n // Error handling\r\n } catch {\r\n // fallback\r\n return true;\r\n }\r\n};\r\n\r\n/**\r\n * @deprecated Use `isNilOrZeroLength` instead.\r\n */\r\nexport const isNilOrZeroLen = isNilOrZeroLength;\r\n\r\n/******************************************************\r\n * ##: Nil or NaN Check\r\n * Checks if value is nil OR NaN (coercive, matches global isNaN)\r\n *\r\n * Notes:\r\n * Uses global isNaN for parity with JS behavior (coerces strings). Example: isNaN(\"foo\") === true.\r\n * @param {unknown} value - Value to check\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport const isNilOrNaN = (value: unknown): boolean => {\r\n try {\r\n return isNil(value) || isNaN(value as number);\r\n } catch {\r\n return true;\r\n }\r\n};\r\n\r\n/* ======================================================================================\r\n * Deprecated aliases (backward-compatibility)\r\n * Keep until downstream code is migrated. Remove in a major release.\r\n * ====================================================================================*/\r\n\r\n/**\r\n * @deprecated Use `isNil` instead.\r\n */\r\nexport const isNullOrUndefined = isNil;\r\n\r\n/**\r\n * @deprecated Use `isNilText` instead.\r\n */\r\nexport const isNullOrUndefinedTextInc = isNilText;\r\n\r\n/**\r\n * @deprecated Use `isNilOrEmpty` instead.\r\n */\r\nexport const isNullUndefinedOrEmpty = isNilOrEmpty;\r\n\r\n/**\r\n * @deprecated Use `hasNilOrEmpty` instead.\r\n */\r\nexport const isNullOrUndefinedInArray = hasNilOrEmpty;\r\n\r\n/**\r\n * @deprecated Use `isNilEmptyOrZeroLen` instead.\r\n */\r\nexport const isNullOrUndefinedEmptyOrZero = isNilEmptyOrZeroLen;\r\n\r\n/**\r\n * @deprecated Use `isNilOrZeroLen` instead.\r\n */\r\nexport const isNullUndefinedOrZero = isNilOrZeroLen;\r\n\r\n/**\r\n * @deprecated Use `isNilOrNaN` instead.\r\n */\r\nexport const isNullOrUndefinedOrNaN = isNilOrNaN;\r\n\r\n/******************************************************\r\n * ##: Human-Readable Byte Formatter\r\n * Formats bytes as human-readable text (e.g., kB, MB, KiB, MiB)\r\n *\r\n * Notes:\r\n * SI (kB, MB, ...) uses 1000; IEC (KiB, MiB, ...) uses 1024. Negative values supported.\r\n * @param {Number} bytes - Number of bytes to format\r\n * @param {Boolean} si - True for metric (SI, base 1000), false for binary (IEC, base 1024)\r\n * @param {Number} dp - Decimal places\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport const formatBytes = (\r\n bytes: number,\r\n si: boolean = false,\r\n dp: number = 1\r\n): string => {\r\n // Guard invalid numbers\r\n if (!Number.isFinite(bytes)) return \"NaN\";\r\n\r\n const thresh = si ? 1000 : 1024;\r\n const abs = Math.abs(bytes);\r\n\r\n // Bytes (no unit scaling)\r\n if (abs < thresh) return `${bytes} B`;\r\n\r\n const units = si\r\n ? [\"kB\", \"MB\", \"GB\", \"TB\", \"PB\", \"EB\", \"ZB\", \"YB\"]\r\n : [\"KiB\", \"MiB\", \"GiB\", \"TiB\", \"PiB\", \"EiB\", \"ZiB\", \"YiB\"];\r\n\r\n let u = -1;\r\n const r = 10 ** dp;\r\n let value = bytes;\r\n\r\n do {\r\n value /= thresh;\r\n ++u;\r\n // keep dividing while rounded value still reaches next threshold\r\n } while (\r\n Math.round(Math.abs(value) * r) / r >= thresh &&\r\n u < units.length - 1\r\n );\r\n\r\n return `${value.toFixed(dp)} ${units[u]}`;\r\n};\r\n\r\n/* ======================================================================================\r\n * Deprecated aliases (backward-compatibility)\r\n * Keep until downstream code is migrated. Remove in a major release.\r\n * ====================================================================================*/\r\n/**\r\n * @deprecated Use `formatBytes` instead.\r\n */\r\nexport const humanFileSize = formatBytes;\r\n\r\n/******************************************************\r\n * ##: Levenshtein Distance\r\n * Calculates the Levenshtein distance between two strings (O(n*m), O(min(n,m)) space)\r\n * @param {String} a - First string\r\n * @param {String} b - Second string\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nconst levenshtein = (a: string, b: string): number => {\r\n if (a === b) return 0;\r\n const al = a.length;\r\n const bl = b.length;\r\n if (al === 0) return bl;\r\n if (bl === 0) return al;\r\n\r\n // Ensure `a` is the shorter to minimize memory\r\n if (al > bl) {\r\n const tmp = a;\r\n a = b;\r\n b = tmp;\r\n }\r\n\r\n const n = a.length;\r\n const m = b.length;\r\n\r\n let prev = new Array<number>(n + 1);\r\n let curr = new Array<number>(n + 1);\r\n\r\n for (let i = 0; i <= n; i++) prev[i] = i;\r\n\r\n for (let j = 1; j <= m; j++) {\r\n curr[0] = j;\r\n const bj = b.charCodeAt(j - 1);\r\n for (let i = 1; i <= n; i++) {\r\n const cost = a.charCodeAt(i - 1) === bj ? 0 : 1;\r\n const del = prev[i] + 1;\r\n const ins = curr[i - 1] + 1;\r\n const sub = prev[i - 1] + cost;\r\n curr[i] = del < ins ? (del < sub ? del : sub) : ins < sub ? ins : sub;\r\n }\r\n // swap\r\n const tmp = prev;\r\n prev = curr;\r\n curr = tmp;\r\n }\r\n\r\n return prev[n];\r\n};\r\n\r\n/******************************************************\r\n * ##: String Similarity\r\n * Returns the similarity between two strings (0..1)\r\n *\r\n * Notes:\r\n * Similarity = (|longer|-levenshtein(longer, shorter)) / |longer| ∈ [0, 1]. Safe for empty strings; if both empty => 1.0\r\n * @param {String} s1 - First string\r\n * @param {String} s2 - Second string\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport const stringSimilarity = (s1: string, s2: string): number => {\r\n const a = s1 ?? \"\";\r\n const b = s2 ?? \"\";\r\n\r\n let longer = a;\r\n let shorter = b;\r\n if (a.length < b.length) {\r\n longer = b;\r\n shorter = a;\r\n }\r\n\r\n const L = longer.length;\r\n if (L === 0) return 1.0;\r\n\r\n const dist = levenshtein(longer, shorter);\r\n return (L - dist) / L;\r\n};\r\n\r\n/* ======================================================================================\r\n * Deprecated aliases (backward-compatibility)\r\n * Keep until downstream code is migrated. Remove in a major release.\r\n * ====================================================================================*/\r\n/**\r\n * @deprecated Use `stringSimilarity` instead.\r\n */\r\nexport const getStringSimilarity = stringSimilarity;\r\n\r\n/******************************************************\r\n * ##: Thousand Separator Formatter\r\n * Adds spaces between thousands in a number (e.g., 1234567 -> \"1 234 567\")\r\n * @param {Number|String} value - Number or string to format\r\n * @returns {String} Formatted string with spaces as thousand separators\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport const addThousandsSpace = (value: number | string): string => {\r\n try {\r\n const str = value.toString();\r\n const [intPart, decimalPart] = str.split(\".\");\r\n\r\n const formattedInt = intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, \" \");\r\n return decimalPart ? `${formattedInt}.${decimalPart}` : formattedInt;\r\n } catch {\r\n return value as string;\r\n }\r\n};\r\n\r\n/******************************************************\r\n * ##: Delay Function\r\n * Creates a promise that resolves after the specified number of milliseconds\r\n * @param {Number} ms - Delay in milliseconds (negative values are treated as 0)\r\n * @returns {Promise<void>} Promise that resolves after the delay\r\n * History:\r\n * 25-09-2025: Created\r\n ****************************************************/\r\nexport const delay = (ms: number): Promise<void> =>\r\n new Promise((resolve) => setTimeout(resolve, Math.max(0, ms)));\r\n\r\n/******************************************************\r\n * ##: Enforced Nil/Empty/Textual Null Check\r\n * Checks if value is null/undefined/empty string or the text values \"null\" / \"undefined\" (case-insensitive)\r\n * @param {unknown} value - Value to check\r\n * @returns {Boolean} true if value is considered empty-like\r\n * History:\r\n * 25-09-2025: Created\r\n ****************************************************/\r\nexport const isNilTextOrEmpty = (value: unknown): boolean => {\r\n try {\r\n if (value === null || value === undefined || value === \"\") return true;\r\n if (typeof value === \"string\") {\r\n const v = value.trim().toLowerCase();\r\n return v === \"null\" || v === \"undefined\";\r\n }\r\n return false;\r\n /* c8 ignore next -- defensive fallback (should never throw) */\r\n } catch {\r\n return true; // safest fallback\r\n }\r\n};\r\n\r\n/******************************************************\r\n * ##: Modern Currency Formatter (Intl.NumberFormat)\r\n * Formats currency values using modern Intl.NumberFormat API with configurable locale and currency.\r\n *\r\n * Provides flexible currency formatting with optional symbol display,\r\n * proper decimal handling, and graceful fallback for errors.\r\n * @param {number|string|null|undefined} value Currency value to format\r\n * @param {boolean} withoutCurrencySymbol Hide currency symbol (show as decimal)\r\n * @param {string} currency Currency code (ISO 4217, e.g., \"EUR\", \"USD\")\r\n * @param {string} locale Locale string (e.g., \"pt-PT\", \"en-US\")\r\n * @returns {string} Formatted currency string (e.g., \"1.234,56 €\" or \"1.234,56\")\r\n * History:\r\n * 25-09-2025: Created\r\n ****************************************************/\r\nexport const formatCurrency = (\r\n value: number | string | null | undefined,\r\n withoutCurrencySymbol: boolean = false,\r\n currency: string = \"EUR\",\r\n locale: string = \"pt-PT\"\r\n): string => {\r\n try {\r\n // Normalize input value\r\n const numValue =\r\n value === undefined || value === null || value === \"\" ? 0 : Number(value);\r\n\r\n if (isNaN(numValue) || !isFinite(numValue)) {\r\n return withoutCurrencySymbol ? \"0,00\" : \"0,00 €\";\r\n }\r\n\r\n const intlOptions: Intl.NumberFormatOptions = {\r\n style: withoutCurrencySymbol ? \"decimal\" : \"currency\",\r\n currency: currency,\r\n minimumFractionDigits: 2,\r\n maximumFractionDigits: 2,\r\n };\r\n\r\n return new Intl.NumberFormat(locale, intlOptions).format(numValue);\r\n } catch (error) {\r\n /* c8 ignore start */\r\n // Fallback to simple formatting if Intl fails\r\n const numValue = Number(value) || 0;\r\n const formatted = numValue.toFixed(2).replace(\".\", \",\");\r\n return withoutCurrencySymbol ? formatted : `${formatted} €`;\r\n /* c8 ignore end */\r\n }\r\n};\r\n\r\n/******************************************************\r\n * ##: Parse Name into First and Last Components\r\n * Extracts first and last name from a full name string.\r\n *\r\n * Handles edge cases like single names, empty inputs, and multi-word names.\r\n * Returns first word as firstName and last word as lastName.\r\n * @param {string|null|undefined} name Full name string to parse\r\n * @returns {{firstName: string, lastName: string}} Object with firstName and lastName properties\r\n * History:\r\n * 25-09-2025: Created\r\n ****************************************************/\r\nexport const parseName = (\r\n name: string | null | undefined\r\n): { firstName: string; lastName: string } => {\r\n try {\r\n // Handle nil or empty inputs\r\n if (name === undefined || name === null || name === \"\") {\r\n return { firstName: \"\", lastName: \"\" };\r\n }\r\n\r\n // Trim whitespace and normalize spacing\r\n const cleanName = name.toString().trim().replace(/\\s+/g, \" \");\r\n\r\n if (cleanName === \"\") {\r\n return { firstName: \"\", lastName: \"\" };\r\n }\r\n\r\n // Single name case\r\n if (!cleanName.includes(\" \")) {\r\n return { firstName: cleanName, lastName: \"\" };\r\n }\r\n\r\n // Multiple names case - get first and last\r\n const nameParts = cleanName.split(\" \");\r\n const firstName = nameParts[0];\r\n const lastName = nameParts[nameParts.length - 1];\r\n\r\n return { firstName, lastName };\r\n } catch (error) {\r\n /* c8 ignore start */\r\n // Defensive fallback: try to use original input as firstName\r\n const fallbackName = name ? String(name).trim() : \"\";\r\n return { firstName: fallbackName, lastName: \"\" };\r\n /* c8 ignore end */\r\n }\r\n};\r\n\r\n/******************************************************\r\n * ##: Currency Symbol to ISO Code Converter\r\n * Converts currency symbols (€, £, $) to ISO 4217 currency codes.\r\n *\r\n * Maps common currency symbols to their corresponding three-letter codes.\r\n * Returns \"EUR\" as fallback for unknown symbols.\r\n * @param {string|null|undefined} symbol Currency symbol to convert (e.g., \"€\", \"£\", \"$\")\r\n * @returns {string} ISO 4217 currency code (e.g., \"EUR\", \"GBP\", \"USD\")\r\n * History:\r\n * 25-09-2025: Created\r\n ****************************************************/\r\nexport const symbolToCurrency = (symbol: string | null | undefined): string => {\r\n try {\r\n if (!symbol || typeof symbol !== \"string\") {\r\n return \"EUR\";\r\n }\r\n\r\n const normalizedSymbol = symbol.trim();\r\n\r\n switch (normalizedSymbol) {\r\n case \"€\":\r\n return \"EUR\";\r\n case \"£\":\r\n return \"GBP\";\r\n case \"$\":\r\n return \"USD\";\r\n case \"¥\":\r\n case \"¥\":\r\n return \"JPY\";\r\n case \"₹\":\r\n return \"INR\";\r\n case \"₽\":\r\n return \"RUB\";\r\n case \"¢\":\r\n return \"USD\"; // US cents\r\n case \"₩\":\r\n return \"KRW\"; // South Korean Won\r\n case \"₪\":\r\n return \"ILS\"; // Israeli Shekel\r\n case \"₦\":\r\n return \"NGN\"; // Nigerian Naira\r\n case \"₨\":\r\n return \"PKR\"; // Pakistani Rupee\r\n case \"₱\":\r\n return \"PHP\"; // Philippine Peso\r\n case \"₫\":\r\n return \"VND\"; // Vietnamese Dong\r\n case \"₡\":\r\n return \"CRC\"; // Costa Rican Colon\r\n case \"₲\":\r\n return \"PYG\"; // Paraguayan Guarani\r\n case \"₴\":\r\n return \"UAH\"; // Ukrainian Hryvnia\r\n case \"₵\":\r\n return \"GHS\"; // Ghanaian Cedi\r\n case \"₶\":\r\n return \"EUR\"; // Livre tournois (historical, fallback to EUR)\r\n case \"₸\":\r\n return \"KZT\"; // Kazakhstani Tenge\r\n case \"₺\":\r\n return \"TRY\"; // Turkish Lira\r\n case \"₻\":\r\n return \"EUR\"; // Nordic mark (historical, fallback to EUR)\r\n case \"₼\":\r\n return \"AZN\"; // Azerbaijani Manat\r\n case \"₾\":\r\n return \"GEL\"; // Georgian Lari\r\n case \"₿\":\r\n return \"BTC\"; // Bitcoin\r\n case \"﷼\":\r\n return \"SAR\"; // Saudi Riyal\r\n case \"$\":\r\n return \"USD\"; // Full-width dollar sign\r\n case \"¢\":\r\n return \"USD\"; // Full-width cent sign\r\n case \"£\":\r\n return \"GBP\"; // Full-width pound sign\r\n case \"¬\":\r\n return \"GBP\"; // Full-width not sign (sometimes used for pound)\r\n case \" ̄\":\r\n return \"JPY\"; // Full-width macron (sometimes used for yen)\r\n case \"¦\":\r\n return \"EUR\"; // Full-width lira sign\r\n case \"₩\":\r\n return \"KRW\"; // Full-width won sign\r\n // Additional common symbols\r\n case \"R\":\r\n return \"ZAR\"; // South African Rand (when used as symbol)\r\n case \"R$\":\r\n return \"BRL\"; // Brazilian Real\r\n case \"C$\":\r\n return \"CAD\"; // Canadian Dollar\r\n case \"A$\":\r\n return \"AUD\"; // Australian Dollar\r\n case \"S$\":\r\n return \"SGD\"; // Singapore Dollar\r\n case \"HK$\":\r\n return \"HKD\"; // Hong Kong Dollar\r\n case \"NZ$\":\r\n return \"NZD\"; // New Zealand Dollar\r\n case \"kr\":\r\n case \"Kr\":\r\n return \"SEK\"; // Swedish Krona (fallback, could be NOK or DKK)\r\n case \"zł\":\r\n return \"PLN\"; // Polish Zloty\r\n case \"Kč\":\r\n return \"CZK\"; // Czech Koruna\r\n case \"Ft\":\r\n return \"HUF\"; // Hungarian Forint\r\n case \"lei\":\r\n return \"RON\"; // Romanian Leu\r\n case \"лв\":\r\n return \"BGN\"; // Bulgarian Lev\r\n case \"kn\":\r\n return \"HRK\"; // Croatian Kuna\r\n case \"din\":\r\n return \"RSD\"; // Serbian Dinar\r\n case \"ден\":\r\n return \"MKD\"; // Macedonian Denar\r\n default:\r\n return \"EUR\"; // fallback\r\n }\r\n } catch (error) {\r\n /* c8 ignore start */\r\n return \"EUR\"; // safe fallback\r\n /* c8 ignore end */\r\n }\r\n};\r\n\r\n/******************************************************\r\n * ##: ISO Currency Code to Symbol Converter\r\n * Converts ISO 4217 currency codes to their corresponding symbols.\r\n *\r\n * Maps three-letter currency codes to common currency symbols.\r\n * Returns \"€\" as fallback for unknown currencies.\r\n * @param {string|null|undefined} currency ISO 4217 currency code (e.g., \"EUR\", \"GBP\", \"USD\")\r\n * @returns {string} Currency symbol (e.g., \"€\", \"£\", \"$\")\r\n * History:\r\n * 25-09-2025: Created\r\n ****************************************************/\r\nexport const currencyToSymbol = (\r\n currency: string | null | undefined\r\n): string => {\r\n try {\r\n if (!currency || typeof currency !== \"string\") {\r\n return \"€\";\r\n }\r\n\r\n const normalizedCurrency = currency.trim().toUpperCase();\r\n\r\n switch (normalizedCurrency) {\r\n case \"EUR\":\r\n return \"€\";\r\n case \"GBP\":\r\n return \"£\";\r\n case \"USD\":\r\n return \"$\";\r\n case \"JPY\":\r\n return \"¥\";\r\n case \"INR\":\r\n return \"₹\";\r\n case \"RUB\":\r\n return \"₽\";\r\n case \"CNY\":\r\n return \"¥\";\r\n case \"KRW\":\r\n return \"₩\"; // South Korean Won\r\n case \"ILS\":\r\n return \"₪\"; // Israeli Shekel\r\n case \"NGN\":\r\n return \"₦\"; // Nigerian Naira\r\n case \"PKR\":\r\n return \"₨\"; // Pakistani Rupee\r\n case \"PHP\":\r\n return \"₱\"; // Philippine Peso\r\n case \"VND\":\r\n return \"₫\"; // Vietnamese Dong\r\n case \"CRC\":\r\n return \"₡\"; // Costa Rican Colon\r\n case \"PYG\":\r\n return \"₲\"; // Paraguayan Guarani\r\n case \"UAH\":\r\n return \"₴\"; // Ukrainian Hryvnia\r\n case \"GHS\":\r\n return \"₵\"; // Ghanaian Cedi\r\n case \"KZT\":\r\n return \"₸\"; // Kazakhstani Tenge\r\n case \"TRY\":\r\n return \"₺\"; // Turkish Lira\r\n case \"AZN\":\r\n return \"₼\"; // Azerbaijani Manat\r\n case \"GEL\":\r\n return \"₾\"; // Georgian Lari\r\n case \"BTC\":\r\n return \"₿\"; // Bitcoin\r\n case \"SAR\":\r\n return \"﷼\"; // Saudi Riyal\r\n case \"ZAR\":\r\n return \"R\"; // South African Rand\r\n case \"BRL\":\r\n return \"R$\"; // Brazilian Real\r\n case \"CAD\":\r\n return \"C$\"; // Canadian Dollar\r\n case \"AUD\":\r\n return \"A$\"; // Australian Dollar\r\n case \"SGD\":\r\n return \"S$\"; // Singapore Dollar\r\n case \"HKD\":\r\n return \"HK$\"; // Hong Kong Dollar\r\n case \"NZD\":\r\n return \"NZ$\"; // New Zealand Dollar\r\n case \"SEK\":\r\n return \"kr\"; // Swedish Krona\r\n case \"NOK\":\r\n return \"kr\"; // Norwegian Krone\r\n case \"DKK\":\r\n return \"kr\"; // Danish Krone\r\n case \"PLN\":\r\n return \"zł\"; // Polish Zloty\r\n case \"CZK\":\r\n return \"Kč\"; // Czech Koruna\r\n case \"HUF\":\r\n return \"Ft\"; // Hungarian Forint\r\n case \"RON\":\r\n return \"lei\"; // Romanian Leu\r\n case \"BGN\":\r\n return \"лв\"; // Bulgarian Lev\r\n case \"HRK\":\r\n return \"kn\"; // Croatian Kuna\r\n case \"RSD\":\r\n return \"din\"; // Serbian Dinar\r\n case \"MKD\":\r\n return \"ден\"; // Macedonian Denar\r\n case \"CHF\":\r\n return \"CHF\"; // Swiss Franc (commonly written as CHF)\r\n case \"THB\":\r\n return \"฿\"; // Thai Baht\r\n case \"MYR\":\r\n return \"RM\"; // Malaysian Ringgit\r\n case \"IDR\":\r\n return \"Rp\"; // Indonesian Rupiah\r\n case \"CLP\":\r\n return \"$\"; // Chilean Peso (uses $ symbol)\r\n case \"COP\":\r\n return \"$\"; // Colombian Peso (uses $ symbol)\r\n case \"MXN\":\r\n return \"$\"; // Mexican Peso (uses $ symbol)\r\n case \"ARS\":\r\n return \"$\"; // Argentine Peso (uses $ symbol)\r\n case \"UYU\":\r\n return \"$\"; // Uruguayan Peso (uses $ symbol)\r\n case \"PEN\":\r\n return \"S/\"; // Peruvian Sol\r\n case \"BOB\":\r\n return \"Bs\"; // Bolivian Boliviano\r\n case \"EGP\":\r\n return \"£\"; // Egyptian Pound (uses £ symbol)\r\n case \"LBP\":\r\n return \"£\"; // Lebanese Pound (uses £ symbol)\r\n case \"SYP\":\r\n return \"£\"; // Syrian Pound (uses £ symbol)\r\n default:\r\n return \"€\"; // fallback\r\n }\r\n } catch (error) {\r\n /* c8 ignore start */\r\n return \"€\"; // safe fallback\r\n /* c8 ignore end */\r\n }\r\n};\r\n\r\n/* ======================================================================================\r\n * Deprecated aliases (backward-compatibility) - new function alias (if needed later)\r\n * ====================================================================================*/\r\n// Deprecated alias for previous provisional name\r\n/**\r\n * @deprecated Use `isNilTextOrEmpty` instead.\r\n */\r\nexport const isNullUndefinedOrEmptyEnforced = isNilTextOrEmpty;\r\n\r\n/* ======================================================================================\r\n * Deprecated aliases (backward-compatibility)\r\n * Keep until downstream code is migrated. Remove in a major release.\r\n * ====================================================================================*/\r\n/**\r\n * @deprecated Use `addThousandsSpace` instead.\r\n */\r\nexport const addSpaceBetweenNumbers = addThousandsSpace;\r\n","/******************************************************\r\n * ##: Portuguese Tax ID (NIF) Validator\r\n * Validates a Portuguese tax identification number (\"NIF\").\r\n *\r\n * Rules / Notes:\r\n * - Exactly 9 digits.\r\n * - Check digit (last digit) via Mod11 weights 9..2 over first 8 digits.\r\n * sum = Σ(d[i]*w[i]); mod = sum % 11; check = (mod < 2 ? 0 : 11 - mod).\r\n * - Allowed leading digits: 1,2,3,5,6,8,9.\r\n * - Strips non-digit characters.\r\n * - Rejects repeated digit sequences (e.g., 000000000).\r\n * @param value Raw input to validate (string or number)\r\n * @returns true if valid, otherwise false.\r\n * History:\r\n * 25-09-2025: Created as isValidPTTaxId\r\n ****************************************************/\r\nexport function isPTTaxId(value: string | number): boolean {\r\n try {\r\n if (value === null || value === undefined) return false;\r\n\r\n let nif = String(value).trim();\r\n // Strip any non-digit characters\r\n nif = nif.replace(/[^0-9]/g, \"\");\r\n\r\n if (nif.length !== 9) return false;\r\n if (!/^\\d{9}$/.test(nif)) return false;\r\n\r\n // Reject repeated digit sequences (all digits identical)\r\n if (/^(\\d)\\1{8}$/.test(nif)) return false;\r\n\r\n const first = nif[0];\r\n const defaultAllowed = new Set([\"1\", \"2\", \"3\", \"5\", \"6\", \"8\", \"9\"]);\r\n if (!defaultAllowed.has(first)) return false;\r\n\r\n // Compute control digit with weights 9..2\r\n let sum = 0;\r\n for (let i = 0; i < 8; i++) {\r\n const digit = parseInt(nif[i], 10);\r\n const weight = 9 - i; // i=0 => 9 ... i=7 => 2\r\n sum += digit * weight;\r\n }\r\n const mod11 = sum % 11;\r\n const checkDigit = mod11 < 2 ? 0 : 11 - mod11;\r\n return checkDigit === parseInt(nif[8], 10);\r\n } catch {\r\n /* c8 ignore start */\r\n return false; // Defensive fallback: any unexpected error results in invalid\r\n /* c8 ignore end */\r\n }\r\n}\r\n\r\n/**\r\n * @deprecated Use isPTTaxId instead.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport const isValidPTTaxId = isPTTaxId;\r\n","/******************************************************\r\n * ##: IBAN (International Bank Account Number) Validator\r\n * Validates International Bank Account Numbers according to ISO 13616.\r\n *\r\n * Rules / Notes:\r\n * - Country-specific format and length validation\r\n * - MOD-97 checksum validation\r\n * - BBAN (Basic Bank Account Number) format validation\r\n * - Supports all IBAN registry countries\r\n * - Strips spaces and formatting automatically\r\n * @param value Raw IBAN input to validate (string)\r\n * @returns true if valid IBAN, otherwise false.\r\n * History:\r\n * 25-09-2025: Adapted from ibantools library for SalesPark toolkit\r\n ****************************************************/\r\nexport function isValidIBAN(value: string): boolean {\r\n try {\r\n if (!value || typeof value !== \"string\") return false;\r\n\r\n // Strip formatting and convert to uppercase\r\n const iban = value.replace(/[\\s-]/g, \"\").toUpperCase();\r\n\r\n // Basic length and format check\r\n if (iban.length < 15 || iban.length > 34) return false;\r\n if (!/^[A-Z]{2}[0-9]{2}[A-Z0-9]+$/.test(iban)) return false;\r\n\r\n const countryCode = iban.slice(0, 2);\r\n const spec = countrySpecs[countryCode];\r\n\r\n // Check if country is supported\r\n if (!spec?.bban_regexp || !spec.chars) return false;\r\n\r\n // Verify length matches country specification\r\n if (spec.chars !== iban.length) return false;\r\n\r\n // Verify checksum digits are numeric\r\n if (!/^[0-9]{2}$/.test(iban.slice(2, 4))) return false;\r\n\r\n // Validate BBAN format\r\n const bban = iban.slice(4);\r\n if (!new RegExp(spec.bban_regexp).test(bban)) return false;\r\n\r\n // Validate BBAN with country-specific rules if available\r\n if (spec.bban_validation_func && !spec.bban_validation_func(bban))\r\n return false;\r\n\r\n // Validate IBAN checksum using MOD-97\r\n return isValidIBANChecksum(iban);\r\n } catch {\r\n /* c8 ignore start */\r\n return false; // Defensive fallback for any unexpected errors\r\n /* c8 ignore end */\r\n }\r\n}\r\n\r\n/******************************************************\r\n * ##: IBAN Checksum Validator\r\n * Validates IBAN checksum using MOD-97 algorithm per ISO 13616.\r\n *\r\n * Algorithm:\r\n * 1. Move country code and check digits to end\r\n * 2. Replace letters with numbers (A=10, B=11, ..., Z=35)\r\n * 3. Calculate MOD-97 of the resulting number\r\n * 4. Valid if remainder equals 1\r\n * @param iban Complete IBAN string to validate\r\n * @returns true if checksum is valid, otherwise false\r\n * History:\r\n * 25-09-2025: Created for IBAN validation\r\n ****************************************************/\r\nfunction isValidIBANChecksum(iban: string): boolean {\r\n // Rearrange: move first 4 chars to end\r\n const rearranged = iban.slice(4) + iban.slice(0, 4);\r\n\r\n // Replace letters with numbers (A=10, B=11, ..., Z=35)\r\n const numericString = rearranged\r\n .split(\"\")\r\n .map((char) => {\r\n const code = char.charCodeAt(0);\r\n return code >= 65 ? (code - 55).toString() : char;\r\n })\r\n .join(\"\");\r\n\r\n // Calculate MOD-97\r\n return mod97(numericString) === 1;\r\n}\r\n\r\n/******************************************************\r\n * ##: MOD-97 Calculator\r\n * Calculates MOD-97 for large numbers as strings to avoid overflow.\r\n *\r\n * Process chunks of max 9 digits to stay within JavaScript number limits\r\n * while maintaining precision for the modulo operation.\r\n * @param numStr Numeric string to calculate MOD-97 for\r\n * @returns MOD-97 remainder\r\n * History:\r\n * 25-09-2025: Created for IBAN checksum validation\r\n ****************************************************/\r\nfunction mod97(numStr: string): number {\r\n let remainder = numStr;\r\n\r\n while (remainder.length > 2) {\r\n const chunk = remainder.slice(0, 9); // Max 9 digits to avoid overflow\r\n const chunkNum = parseInt(chunk, 10);\r\n\r\n if (isNaN(chunkNum)) return NaN;\r\n\r\n remainder = (chunkNum % 97) + remainder.slice(chunk.length);\r\n }\r\n\r\n return parseInt(remainder, 10) % 97;\r\n}\r\n\r\n/******************************************************\r\n * ##: Country Specification Interface\r\n * Defines structure for IBAN country specifications.\r\n * History:\r\n * 25-09-2025: Created for IBAN validation\r\n ****************************************************/\r\ninterface CountrySpec {\r\n chars?: number; // Total IBAN length for country\r\n bban_regexp?: string; // BBAN format regex\r\n bban_validation_func?: (bban: string) => boolean; // Custom validation\r\n IBANRegistry?: boolean; // Official IBAN registry member\r\n SEPA?: boolean; // SEPA member country\r\n}\r\n\r\n/******************************************************\r\n * ##: IBAN Country Specifications\r\n * Country-specific IBAN format definitions and validation rules.\r\n * Based on IBAN Registry and includes SEPA membership status.\r\n * History:\r\n * 25-09-2025: Adapted from ibantools library\r\n ****************************************************/\r\nconst countrySpecs: Record<string, CountrySpec> = {\r\n AD: {\r\n chars: 24,\r\n bban_regexp: \"^[0-9]{8}[A-Z0-9]{12}$\",\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n AE: { chars: 23, bban_regexp: \"^[0-9]{3}[0-9]{16}$\", IBANRegistry: true },\r\n AL: { chars: 28, bban_regexp: \"^[0-9]{8}[A-Z0-9]{16}$\", IBANRegistry: true },\r\n AT: { chars: 20, bban_regexp: \"^[0-9]{16}$\", IBANRegistry: true, SEPA: true },\r\n AZ: { chars: 28, bban_regexp: \"^[A-Z]{4}[A-Z0-9]{20}$\", IBANRegistry: true },\r\n BA: {\r\n chars: 20,\r\n bban_regexp: \"^[0-9]{16}$\",\r\n bban_validation_func: checkMod97BBAN,\r\n IBANRegistry: true,\r\n },\r\n BE: {\r\n chars: 16,\r\n bban_regexp: \"^[0-9]{12}$\",\r\n bban_validation_func: checkBelgianBBAN,\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n BG: {\r\n chars: 22,\r\n bban_regexp: \"^[A-Z]{4}[0-9]{6}[A-Z0-9]{8}$\",\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n BH: { chars: 22, bban_regexp: \"^[A-Z]{4}[A-Z0-9]{14}$\", IBANRegistry: true },\r\n BR: {\r\n chars: 29,\r\n bban_regexp: \"^[0-9]{23}[A-Z]{1}[A-Z0-9]{1}$\",\r\n IBANRegistry: true,\r\n },\r\n BY: {\r\n chars: 28,\r\n bban_regexp: \"^[A-Z]{4}[0-9]{4}[A-Z0-9]{16}$\",\r\n IBANRegistry: true,\r\n },\r\n CH: {\r\n chars: 21,\r\n bban_regexp: \"^[0-9]{5}[A-Z0-9]{12}$\",\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n CR: { chars: 22, bban_regexp: \"^[0-9]{18}$\", IBANRegistry: true },\r\n CY: {\r\n chars: 28,\r\n bban_regexp: \"^[0-9]{8}[A-Z0-9]{16}$\",\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n CZ: {\r\n chars: 24,\r\n bban_regexp: \"^[0-9]{20}$\",\r\n bban_validation_func: checkCzechSlovakBBAN,\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n DE: { chars: 22, bban_regexp: \"^[0-9]{18}$\", IBANRegistry: true, SEPA: true },\r\n DK: { chars: 18, bban_regexp: \"^[0-9]{14}$\", IBANRegistry: true, SEPA: true },\r\n DO: { chars: 28, bban_regexp: \"^[A-Z]{4}[0-9]{20}$\", IBANRegistry: true },\r\n EE: {\r\n chars: 20,\r\n bban_regexp: \"^[0-9]{16}$\",\r\n bban_validation_func: checkEstonianBBAN,\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n EG: { chars: 29, bban_regexp: \"^[0-9]{25}$\", IBANRegistry: true },\r\n ES: {\r\n chars: 24,\r\n bban_regexp: \"^[0-9]{20}$\",\r\n bban_validation_func: checkSpanishBBAN,\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n FI: { chars: 18, bban_regexp: \"^[0-9]{14}$\", IBANRegistry: true, SEPA: true },\r\n FO: { chars: 18, bban_regexp: \"^[0-9]{14}$\", IBANRegistry: true },\r\n FR: {\r\n chars: 27,\r\n bban_regexp: \"^[0-9]{10}[A-Z0-9]{11}[0-9]{2}$\",\r\n bban_validation_func: checkFrenchBBAN,\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n GB: {\r\n chars: 22,\r\n bban_regexp: \"^[A-Z]{4}[0-9]{14}$\",\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n GE: { chars: 22, bban_regexp: \"^[A-Z0-9]{2}[0-9]{16}$\", IBANRegistry: true },\r\n GI: {\r\n chars: 23,\r\n bban_regexp: \"^[A-Z]{4}[A-Z0-9]{15}$\",\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n GL: { chars: 18, bban_regexp: \"^[0-9]{14}$\", IBANRegistry: true },\r\n GR: {\r\n chars: 27,\r\n bban_regexp: \"^[0-9]{7}[A-Z0-9]{16}$\",\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n GT: { chars: 28, bban_regexp: \"^[A-Z0-9]{24}$\", IBANRegistry: true },\r\n HR: {\r\n chars: 21,\r\n bban_regexp: \"^[0-9]{17}$\",\r\n bban_validation_func: checkCroatianBBAN,\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n HU: {\r\n chars: 28,\r\n bban_regexp: \"^[0-9]{24}$\",\r\n bban_validation_func: checkHungarianBBAN,\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n IE: {\r\n chars: 22,\r\n bban_regexp: \"^[A-Z0-9]{4}[0-9]{14}$\",\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n IL: { chars: 23, bban_regexp: \"^[0-9]{19}$\", IBANRegistry: true },\r\n IS: { chars: 26, bban_regexp: \"^[0-9]{22}$\", IBANRegistry: true, SEPA: true },\r\n IT: {\r\n chars: 27,\r\n bban_regexp: \"^[A-Z]{1}[0-9]{10}[A-Z0-9]{12}$\",\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n JO: {\r\n chars: 30,\r\n bban_regexp: \"^[A-Z]{4}[0-9]{4}[A-Z0-9]{18}$\",\r\n IBANRegistry: true,\r\n },\r\n KW: { chars: 30, bban_regexp: \"^[A-Z]{4}[A-Z0-9]{22}$\", IBANRegistry: true },\r\n KZ: { chars: 20, bban_regexp: \"^[0-9]{3}[A-Z0-9]{13}$\", IBANRegistry: true },\r\n LB: { chars: 28, bban_regexp: \"^[0-9]{4}[A-Z0-9]{20}$\", IBANRegistry: true },\r\n LC: { chars: 32, bban_regexp: \"^[A-Z]{4}[A-Z0-9]{24}$\", IBANRegistry: true },\r\n LI: {\r\n chars: 21,\r\n bban_regexp: \"^[0-9]{5}[A-Z0-9]{12}$\",\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n LT: { chars: 20, bban_regexp: \"^[0-9]{16}$\", IBANRegistry: true, SEPA: true },\r\n LU: {\r\n chars: 20,\r\n bban_regexp: \"^[0-9]{3}[A-Z0-9]{13}$\",\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n LV: {\r\n chars: 21,\r\n bban_regexp: \"^[A-Z]{4}[A-Z0-9]{13}$\",\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n MC: {\r\n chars: 27,\r\n bban_regexp: \"^[0-9]{10}[A-Z0-9]{11}[0-9]{2}$\",\r\n bban_validation_func: checkFrenchBBAN,\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n MD: {\r\n chars: 24,\r\n bban_regexp: \"^[A-Z0-9]{2}[A-Z0-9]{18}$\",\r\n IBANRegistry: true,\r\n },\r\n ME: {\r\n chars: 22,\r\n bban_regexp: \"^[0-9]{18}$\",\r\n bban_validation_func: checkMod97BBAN,\r\n IBANRegistry: true,\r\n },\r\n MK: {\r\n chars: 19,\r\n bban_regexp: \"^[0-9]{3}[A-Z0-9]{10}[0-9]{2}$\",\r\n bban_validation_func: checkMod97BBAN,\r\n IBANRegistry: true,\r\n },\r\n MR: { chars: 27, bban_regexp: \"^[0-9]{23}$\", IBANRegistry: true },\r\n MT: {\r\n chars: 31,\r\n bban_regexp: \"^[A-Z]{4}[0-9]{5}[A-Z0-9]{18}$\",\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n MU: {\r\n chars: 30,\r\n bban_regexp: \"^[A-Z]{4}[0-9]{19}[A-Z]{3}$\",\r\n IBANRegistry: true,\r\n },\r\n NL: {\r\n chars: 18,\r\n bban_regexp: \"^[A-Z]{4}[0-9]{10}$\",\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n NO: {\r\n chars: 15,\r\n bban_regexp: \"^[0-9]{11}$\",\r\n bban_validation_func: checkNorwegianBBAN,\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n PK: { chars: 24, bban_regexp: \"^[A-Z0-9]{4}[0-9]{16}$\", IBANRegistry: true },\r\n PL: {\r\n chars: 28,\r\n bban_regexp: \"^[0-9]{24}$\",\r\n bban_validation_func: checkPolishBBAN,\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n PS: { chars: 29, bban_regexp: \"^[A-Z0-9]{4}[0-9]{21}$\", IBANRegistry: true },\r\n PT: {\r\n chars: 25,\r\n bban_regexp: \"^[0-9]{21}$\",\r\n bban_validation_func: checkMod97BBAN,\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n QA: { chars: 29, bban_regexp: \"^[A-Z]{4}[A-Z0-9]{21}$\", IBANRegistry: true },\r\n RO: {\r\n chars: 24,\r\n bban_regexp: \"^[A-Z]{4}[A-Z0-9]{16}$\",\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n RS: {\r\n chars: 22,\r\n bban_regexp: \"^[0-9]{18}$\",\r\n bban_validation_func: checkMod97BBAN,\r\n IBANRegistry: true,\r\n },\r\n SA: { chars: 24, bban_regexp: \"^[0-9]{2}[A-Z0-9]{18}$\", IBANRegistry: true },\r\n SE: { chars: 24, bban_regexp: \"^[0-9]{20}$\", IBANRegistry: true, SEPA: true },\r\n SI: {\r\n chars: 19,\r\n bban_regexp: \"^[0-9]{15}$\",\r\n bban_validation_func: checkMod97BBAN,\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n SK: {\r\n chars: 24,\r\n bban_regexp: \"^[0-9]{20}$\",\r\n bban_validation_func: checkCzechSlovakBBAN,\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n SM: {\r\n chars: 27,\r\n bban_regexp: \"^[A-Z]{1}[0-9]{10}[A-Z0-9]{12}$\",\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n TN: { chars: 24, bban_regexp: \"^[0-9]{20}$\", IBANRegistry: true },\r\n TR: { chars: 26, bban_regexp: \"^[0-9]{5}[A-Z0-9]{17}$\", IBANRegistry: true },\r\n UA: { chars: 29, bban_regexp: \"^[0-9]{6}[A-Z0-9]{19}$\", IBANRegistry: true },\r\n VG: { chars: 24, bban_regexp: \"^[A-Z0-9]{4}[0-9]{16}$\", IBANRegistry: true },\r\n XK: { chars: 20, bban_regexp: \"^[0-9]{16}$\", IBANRegistry: true },\r\n};\r\n\r\n/******************************************************\r\n * ##: MOD-97 BBAN Validator\r\n * Validates BBAN using MOD-97 algorithm for specific countries.\r\n *\r\n * Used by countries like Portugal, Slovenia, Serbia, etc.\r\n * that use MOD-97 checksum validation for their BBAN format.\r\n * @param bban Basic Bank Account Number to validate\r\n * @returns true if BBAN passes MOD-97 validation, otherwise false\r\n * History:\r\n * 25-09-2025: Created for country-specific IBAN validation\r\n ****************************************************/\r\nfunction checkMod97BBAN(bban: string): boolean {\r\n const stripped = bban.replace(/[\\s.]+/g, \"\");\r\n return mod97(stripped) === 1;\r\n}\r\n\r\n/******************************************************\r\n * ##: Belgian BBAN Validator\r\n * Validates Belgian BBAN format using national checksum algorithm.\r\n *\r\n * Belgian IBANs use a specific checksum calculation where the\r\n * remainder of account number divided by 97 must equal the control digits.\r\n * @param bban Basic Bank Account Number to validate (12 digits)\r\n * @returns true if BBAN passes Belgian validation, otherwise false\r\n * History:\r\n * 25-09-2025: Created for Belgian IBAN validation\r\n ****************************************************/\r\nfunction checkBelgianBBAN(bban: string): boolean {\r\n const stripped = bban.replace(/[\\s.]+/g, \"\");\r\n const checkingPart = parseInt(stripped.substring(0, stripped.length - 2), 10);\r\n const checksum = parseInt(stripped.substring(stripped.length - 2), 10);\r\n const remainder = checkingPart % 97 === 0 ? 97 : checkingPart % 97;\r\n return remainder === checksum;\r\n}\r\n\r\n/******************************************************\r\n * ##: Czech/Slovak BBAN Validator\r\n * Validates Czech Republic and Slovakia BBAN format using weighted checksums.\r\n *\r\n * Both countries use similar validation with weighted digit calculations\r\n * for prefix (positions 4-9) and suffix (positions 10-19) sections.\r\n * @param bban Basic Bank Account Number to validate (20 digits)\r\n * @returns true if BBAN passes Czech/Slovak validation, otherwise false\r\n * History:\r\n * 25-09-2025: Created for Czech Republic and Slovakia IBAN validation\r\n ****************************************************/\r\nfunction checkCzechSlovakBBAN(bban: string): boolean {\r\n const weightsPrefix = [10, 5, 8, 4, 2, 1];\r\n const weightsSuffix = [6, 3, 7, 9, 10, 5, 8, 4, 2, 1];\r\n const controlPrefix = parseInt(bban.charAt(9), 10);\r\n const controlSuffix = parseInt(bban.charAt(19), 10);\r\n const prefix = bban.substring(4, 9);\r\n const suffix = bban.substring(10, 19);\r\n\r\n let sum = 0;\r\n for (let i = 0; i < prefix.length; i++) {\r\n sum += parseInt(prefix.charAt(i), 10) * weightsPrefix[i];\r\n }\r\n let remainder = sum % 11;\r\n if (\r\n controlPrefix !==\r\n (remainder === 0 ? 0 : remainder === 1 ? 1 : 11 - remainder)\r\n ) {\r\n return false;\r\n }\r\n\r\n sum = 0;\r\n for (let i = 0; i < suffix.length; i++) {\r\n sum += parseInt(suffix.charAt(i), 10) * weightsSuffix[i];\r\n }\r\n remainder = sum % 11;\r\n return (\r\n controlSuffix ===\r\n (remainder === 0 ? 0 : remainder === 1 ? 1 : 11 - remainder)\r\n );\r\n}\r\n\r\n/******************************************************\r\n * ##: Estonian BBAN Validator\r\n * Validates Estonian BBAN format using weighted checksum algorithm.\r\n *\r\n * Estonian IBANs use weighted digit calculation with specific weights\r\n * applied to positions 2-14, with control digit at position 15.\r\n * @param bban Basic Bank Account Number to validate (16 digits)\r\n * @returns true if BBAN passes Estonian validation, otherwise false\r\n * History:\r\n * 25-09-2025: Created for Estonian IBAN validation\r\n ****************************************************/\r\nfunction checkEstonianBBAN(bban: string): boolean {\r\n const weights = [7, 1, 3, 7, 1, 3, 7, 1, 3, 7, 1, 3, 7];\r\n const controlDigit = parseInt(bban.charAt(15), 10);\r\n const toCheck = bban.substring(2, 15);\r\n let sum = 0;\r\n for (let i = 0; i < toCheck.length; i++) {\r\n sum += parseInt(toCheck.charAt(i), 10) * weights[i];\r\n }\r\n const remainder = sum % 10;\r\n return controlDigit === (remainder === 0 ? 0 : 10 - remainder);\r\n}\r\n\r\n/******************************************************\r\n * ##: Spanish BBAN Validator\r\n * Validates Spanish BBAN format using dual checksum algorithm.\r\n *\r\n * Spanish IBANs have two control digits: one for bank/branch (position 8)\r\n * and one for account number (position 9), each with specific weights.\r\n * @param bban Basic Bank Account Number to validate (20 digits)\r\n * @returns true if BBAN passes Spanish validation, otherwise false\r\n * History:\r\n * 25-09-2025: Created for Spanish IBAN validation\r\n ****************************************************/\r\nfunction checkSpanishBBAN(bban: string): boolean {\r\n const weightsBankBranch = [4, 8, 5, 10, 9, 7, 3, 6];\r\n const weightsAccount = [1, 2, 4, 8, 5, 10, 9, 7, 3, 6];\r\n const controlBankBranch = parseInt(bban.charAt(8), 10);\r\n const controlAccount = parseInt(bban.charAt(9), 10);\r\n const bankBranch = bban.substring(0, 8);\r\n const account = bban.substring(10, 20);\r\n\r\n let sum = 0;\r\n for (let i = 0; i < 8; i++) {\r\n sum += parseInt(bankBranch.charAt(i), 10) * weightsBankBranch[i];\r\n }\r\n let remainder = sum % 11;\r\n if (\r\n controlBankBranch !==\r\n (remainder === 0 ? 0 : remainder === 1 ? 1 : 11 - remainder)\r\n ) {\r\n return false;\r\n }\r\n\r\n sum = 0;\r\n for (let i = 0; i < 10; i++) {\r\n sum += parseInt(account.charAt(i), 10) * weightsAccount[i];\r\n }\r\n remainder = sum % 11;\r\n return (\r\n controlAccount ===\r\n (remainder === 0 ? 0 : remainder === 1 ? 1 : 11 - remainder)\r\n );\r\n}\r\n\r\n/******************************************************\r\n * ##: French/Monaco BBAN Validator\r\n * Validates French and Monaco BBAN format using character conversion and MOD-97.\r\n *\r\n * French IBANs convert letters to numbers using specific mapping (A/J=1, B/K/S=2, etc.)\r\n * then apply MOD-97 validation. Also used by Monaco (MC).\r\n * @param bban Basic Bank Account Number to validate (23 characters)\r\n * @returns true if BBAN passes French validation, otherwise false\r\n * History:\r\n * 25-09-2025: Created for French and Monaco IBAN validation\r\n ****************************************************/\r\nfunction checkFrenchBBAN(bban: string): boolean {\r\n const stripped = bban.replace(/[\\s.]+/g, \"\");\r\n const normalized = Array.from(stripped);\r\n\r\n for (let i = 0; i < stripped.length; i++) {\r\n const c = normalized[i].charCodeAt(0);\r\n if (c >= 65) {\r\n switch (c) {\r\n case 65:\r\n case 74:\r\n normalized[i] = \"1\";\r\n break;\r\n case 66:\r\n case 75:\r\n case 83:\r\n normalized[i] = \"2\";\r\n break;\r\n case 67:\r\n case 76:\r\n case 84:\r\n normalized[i] = \"3\";\r\n break;\r\n case 68:\r\n case 77:\r\n case 85:\r\n normalized[i] = \"4\";\r\n break;\r\n case 69:\r\n case 78:\r\n case 86:\r\n normalized[i] = \"5\";\r\n break;\r\n case 70:\r\n case 79:\r\n case 87:\r\n normalized[i] = \"6\";\r\n break;\r\n case 71:\r\n case 80:\r\n case 88:\r\n normalized[i] = \"7\";\r\n break;\r\n case 72:\r\n case 81:\r\n case 89:\r\n normalized[i] = \"8\";\r\n break;\r\n case 73:\r\n case 82:\r\n case 90:\r\n normalized[i] = \"9\";\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return mod97(normalized.join(\"\")) === 0;\r\n}\r\n\r\n/******************************************************\r\n * ##: Croatian BBAN Validator\r\n * Validates Croatian BBAN format using dual MOD-11 checksums.\r\n *\r\n * Croatian IBANs have two control digits: one for bank/branch (position 6)\r\n * and one for account number (position 16), both using MOD-11 algorithm.\r\n * @param bban Basic Bank Account Number to validate (17 digits)\r\n * @returns true if BBAN passes Croatian validation, otherwise false\r\n * History:\r\n * 25-09-2025: Created for Croatian IBAN validation\r\n ****************************************************/\r\nfunction checkCroatianBBAN(bban: string): boolean {\r\n const controlBankBranch = parseInt(bban.charAt(6), 10);\r\n const controlAccount = parseInt(bban.charAt(16), 10);\r\n const bankBranch = bban.substring(0, 6);\r\n const account = bban.substring(7, 16);\r\n\r\n return (\r\n checkMod11(bankBranch, controlBankBranch) &&\r\n checkMod11(account, controlAccount)\r\n );\r\n}\r\n\r\n/******************************************************\r\n * ##: MOD-11 Checksum Validator\r\n * Validates number sequence using MOD-11 algorithm with specific rules.\r\n *\r\n * Implementation of MOD-11 algorithm used by Croatian and other\r\n * banking systems for account number validation.\r\n * @param toCheck Number sequence to validate (string of digits)\r\n * @param control Expected control digit for validation\r\n * @returns true if control digit matches MOD-11 calculation, otherwise false\r\n * History:\r\n * 25-09-2025: Created for Croatian IBAN validation\r\n ****************************************************/\r\nfunction checkMod11(toCheck: string, control: number): boolean {\r\n let nr = 10;\r\n for (let i = 0; i < toCheck.length; i++) {\r\n nr += parseInt(toCheck.charAt(i), 10);\r\n if (nr % 10 !== 0) {\r\n nr = nr % 10;\r\n }\r\n nr = nr * 2;\r\n nr = nr % 11;\r\n }\r\n return control === (11 - nr === 10 ? 0 : 11 - nr);\r\n}\r\n\r\n/******************************************************\r\n * ##: Hungarian BBAN Validator\r\n * Validates Hungarian BBAN format using weighted checksums with special rules.\r\n *\r\n * Hungarian IBANs use weighted digit validation for bank/branch control\r\n * and different logic for account validation based on account type.\r\n * @param bban Basic Bank Account Number to validate (24 digits)\r\n * @returns true if BBAN passes Hungarian validation, otherwise false\r\n * History:\r\n * 25-09-2025: Created for Hungarian IBAN validation\r\n ****************************************************/\r\nfunction checkHungarianBBAN(bban: string): boolean {\r\n const weights = [9, 7, 3, 1, 9, 7, 3, 1, 9, 7, 3, 1, 9, 7, 3];\r\n const controlDigitBankBranch = parseInt(bban.charAt(7), 10);\r\n const toCheckBankBranch = bban.substring(0, 7);\r\n\r\n let sum = 0;\r\n for (let i = 0; i < toCheckBankBranch.length; i++) {\r\n sum += parseInt(toCheckBankBranch.charAt(i), 10) * weights[i];\r\n }\r\n const remainder = sum % 10;\r\n if (controlDigitBankBranch !== (remainder === 0 ? 0 : 10 - remainder)) {\r\n return false;\r\n }\r\n\r\n if (bban.endsWith(\"00000000\")) {\r\n const toCheckAccount = bban.substring(8, 15);\r\n const controlDigitAccount = parseInt(bban.charAt(15), 10);\r\n sum = 0;\r\n for (let i = 0; i < toCheckAccount.length; i++) {\r\n sum += parseInt(toCheckAccount.charAt(i), 10) * weights[i];\r\n }\r\n const accountRemainder = sum % 10;\r\n return (\r\n controlDigitAccount ===\r\n (accountRemainder === 0 ? 0 : 10 - accountRemainder)\r\n );\r\n } else {\r\n const toCheckAccount = bban.substring(8, 23);\r\n const controlDigitAccount = parseInt(bban.charAt(23), 10);\r\n sum = 0;\r\n for (let i = 0; i < toCheckAccount.length; i++) {\r\n sum += parseInt(toCheckAccount.charAt(i), 10) * weights[i];\r\n }\r\n const accountRemainder = sum % 10;\r\n return (\r\n controlDigitAccount ===\r\n (accountRemainder === 0 ? 0 : 10 - accountRemainder)\r\n );\r\n }\r\n}\r\n\r\n/******************************************************\r\n * ##: Norwegian BBAN Validator\r\n * Validates Norwegian BBAN format using weighted checksum algorithm.\r\n *\r\n * Norwegian IBANs use weighted digit calculation with specific weights\r\n * applied to first 10 digits, with control digit at position 10.\r\n * @param bban Basic Bank Account Number to validate (11 digits)\r\n * @returns true if BBAN passes Norwegian validation, otherwise false\r\n * History:\r\n * 25-09-2025: Created for Norwegian IBAN validation\r\n ****************************************************/\r\nfunction checkNorwegianBBAN(bban: string): boolean {\r\n const weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2];\r\n const stripped = bban.replace(/[\\s.]+/g, \"\");\r\n const controlDigit = parseInt(stripped.charAt(10), 10);\r\n const toCheck = stripped.substring(0, 10);\r\n\r\n let sum = 0;\r\n for (let i = 0; i < 10; i++) {\r\n sum += parseInt(toCheck.charAt(i), 10) * weights[i];\r\n }\r\n const remainder = sum % 11;\r\n return controlDigit === (remainder === 0 ? 0 : 11 - remainder);\r\n}\r\n\r\n/******************************************************\r\n * ##: Polish BBAN Validator\r\n * Validates Polish BBAN format using weighted checksum algorithm.\r\n *\r\n * Polish IBANs use weighted digit calculation with specific weights\r\n * applied to first 7 digits, with control digit at position 7.\r\n * @param bban Basic Bank Account Number to validate (24 digits)\r\n * @returns true if BBAN passes Polish validation, otherwise false\r\n * History:\r\n * 25-09-2025: Created for Polish IBAN validation\r\n ****************************************************/\r\nfunction checkPolishBBAN(bban: string): boolean {\r\n const weights = [3, 9, 7, 1, 3, 9, 7];\r\n const controlDigit = parseInt(bban.charAt(7), 10);\r\n const toCheck = bban.substring(0, 7);\r\n\r\n let sum = 0;\r\n for (let i = 0; i < 7; i++) {\r\n sum += parseInt(toCheck.charAt(i), 10) * weights[i];\r\n }\r\n const remainder = sum % 10;\r\n return controlDigit === (remainder === 0 ? 0 : 10 - remainder);\r\n}\r\n","/******************************************************\r\n * ##: Markdown Security Checker\r\n * Analyzes markdown text for potential security risks and XSS vulnerabilities.\r\n *\r\n * Detects dangerous HTML tags, JavaScript injection attempts, suspicious protocols,\r\n * and other security threats. Provides sanitized output with detailed risk assessment.\r\n * @param {string|null|undefined} markdownText Markdown content to analyze\r\n * @returns {{isValid: boolean, text: string, risks: Array}} Security analysis result\r\n * History:\r\n * 25-09-2025: Created\r\n ****************************************************/\r\n\r\nexport interface SecurityRisk {\r\n type: string;\r\n description: string;\r\n severity?: 'low' | 'medium' | 'high' | 'critical';\r\n}\r\n\r\nexport interface SecurityCheckResult {\r\n isValid: boolean;\r\n text: string;\r\n risks: SecurityRisk[];\r\n sanitized: boolean;\r\n}\r\n\r\nexport const checkMarkdownSecurity = (\r\n markdownText: string | null | undefined\r\n): SecurityCheckResult => {\r\n // Early return if no text is provided\r\n if (!markdownText || typeof markdownText !== 'string') {\r\n return { \r\n isValid: true, \r\n text: \"\", \r\n risks: [],\r\n sanitized: false\r\n };\r\n }\r\n\r\n // Initialize security check result\r\n const securityCheck: SecurityCheckResult = {\r\n isValid: true,\r\n text: markdownText,\r\n risks: [],\r\n sanitized: false,\r\n };\r\n\r\n // Enhanced security patterns with severity levels\r\n const securityPatterns = {\r\n // Critical risks\r\n scriptTags: {\r\n pattern: /<\\s*script\\b[^>]*>[\\s\\S]*?<\\s*\\/\\s*script\\s*>/gi,\r\n severity: 'critical' as const,\r\n description: 'Script tags detected - high XSS risk',\r\n },\r\n eventHandlers: {\r\n pattern: /on\\w+\\s*=\\s*[\"'][^\"']*[\"']/gi,\r\n severity: 'critical' as const,\r\n description: 'JavaScript event handlers detected',\r\n },\r\n javascriptUrls: {\r\n pattern: /javascript\\s*:[^\"'\\s>]*/gi,\r\n severity: 'critical' as const,\r\n description: 'JavaScript URLs detected',\r\n },\r\n\r\n // High risks\r\n iframes: {\r\n pattern: /<\\s*iframe\\b[^>]*>[\\s\\S]*?<\\s*\\/\\s*iframe\\s*>/gi,\r\n severity: 'high' as const,\r\n description: 'Iframe elements detected - potential embedding risk',\r\n },\r\n objectTags: {\r\n pattern: /<\\s*object\\b[^>]*>[\\s\\S]*?<\\s*\\/\\s*object\\s*>/gi,\r\n severity: 'high' as const,\r\n description: 'Object tags detected - potential code execution',\r\n },\r\n embedTags: {\r\n pattern: /<\\s*embed\\b[^>]*>[\\s\\S]*?<\\s*\\/\\s*embed\\s*>/gi,\r\n severity: 'high' as const,\r\n description: 'Embed tags detected - potential code execution',\r\n },\r\n formTags: {\r\n pattern: /<\\s*form\\b[^>]*>[\\s\\S]*?<\\s*\\/\\s*form\\s*>/gi,\r\n severity: 'high' as const,\r\n description: 'Form elements detected - potential data submission risk',\r\n },\r\n\r\n // Medium risks\r\n dataUrls: {\r\n pattern: /data:\\s*[^,\\s]+,[^\"'\\s)>]*/gi,\r\n severity: 'medium' as const,\r\n description: 'Data URLs detected - potential data exfiltration',\r\n },\r\n baseTags: {\r\n pattern: /<\\s*base\\b[^>]*\\/?>/gi,\r\n severity: 'medium' as const,\r\n description: 'Base tags detected - potential URL hijacking',\r\n },\r\n styleTags: {\r\n pattern: /<\\s*style\\b[^>]*>[\\s\\S]*?<\\s*\\/\\s*style\\s*>/gi,\r\n severity: 'medium' as const,\r\n description: 'Style tags detected - potential CSS injection',\r\n },\r\n linkTags: {\r\n pattern: /<\\s*link\\b[^>]*\\/?>/gi,\r\n severity: 'medium' as const,\r\n description: 'Link tags detected - potential resource hijacking',\r\n },\r\n\r\n // Low risks\r\n metaTags: {\r\n pattern: /<\\s*meta\\b[^>]*\\/?>/gi,\r\n severity: 'low' as const,\r\n description: 'Meta tags detected - potential information disclosure',\r\n },\r\n };\r\n\r\n // Additional security checks\r\n const additionalChecks = [\r\n {\r\n pattern: /(file|ftp|ws|wss|gopher|ldap|telnet):/gi,\r\n type: \"suspiciousProtocol\",\r\n description: \"Suspicious URL protocol detected\",\r\n severity: 'high' as const,\r\n },\r\n {\r\n pattern: /(contenteditable|autofocus|formaction|srcdoc|srclang)/gi,\r\n type: \"dangerousAttributes\",\r\n description: \"Potentially dangerous HTML attributes detected\",\r\n severity: 'medium' as const,\r\n },\r\n {\r\n pattern: /(expression|eval|setTimeout|setInterval|Function|constructor)/gi,\r\n type: \"dangerousJavaScript\",\r\n description: \"Potentially dangerous JavaScript functions detected\",\r\n severity: 'high' as const,\r\n },\r\n {\r\n pattern: /(vbscript|livescript|mocha):/gi,\r\n type: \"dangerousScriptProtocol\",\r\n description: \"Dangerous scripting protocols detected\",\r\n severity: 'critical' as const,\r\n },\r\n {\r\n pattern: /<!--[\\s\\S]*?-->/g,\r\n type: \"htmlComments\",\r\n description: \"HTML comments detected - potential information leakage\",\r\n severity: 'low' as const,\r\n },\r\n ];\r\n\r\n // Function to sanitize detected risks\r\n const sanitizeContent = (text: string, pattern: RegExp, replacement = \"\"): string => {\r\n return text.replace(pattern, replacement);\r\n };\r\n\r\n let contentWasSanitized = false;\r\n\r\n // Check for each security pattern\r\n Object.entries(securityPatterns).forEach(([riskType, config]) => {\r\n if (config.pattern.test(markdownText)) {\r\n securityCheck.isValid = false;\r\n securityCheck.risks.push({\r\n type: riskType,\r\n description: config.description,\r\n severity: config.severity,\r\n });\r\n\r\n // Sanitize the content\r\n securityCheck.text = sanitizeContent(securityCheck.text, config.pattern);\r\n contentWasSanitized = true;\r\n }\r\n });\r\n\r\n // Apply additional security checks\r\n additionalChecks.forEach((check) => {\r\n if (check.pattern.test(markdownText)) {\r\n securityCheck.isValid = false;\r\n securityCheck.risks.push({\r\n type: check.type,\r\n description: check.description,\r\n severity: check.severity,\r\n });\r\n securityCheck.text = sanitizeContent(securityCheck.text, check.pattern);\r\n contentWasSanitized = true;\r\n }\r\n });\r\n\r\n securityCheck.sanitized = contentWasSanitized;\r\n\r\n // Sort risks by severity (critical -> high -> medium -> low)\r\n const severityOrder = { critical: 0, high: 1, medium: 2, low: 3 };\r\n securityCheck.risks.sort((a, b) => {\r\n const aSeverity = severityOrder[a.severity || 'low'];\r\n const bSeverity = severityOrder[b.severity || 'low'];\r\n return aSeverity - bSeverity;\r\n });\r\n\r\n return securityCheck;\r\n};\r\n\r\n/******************************************************\r\n * ##: HTML/Markdown Sanitizer\r\n * Removes potentially dangerous HTML elements and attributes from text.\r\n *\r\n * More aggressive sanitization for when security is paramount.\r\n * Strips all HTML tags and suspicious content.\r\n * @param {string|null|undefined} text Text to sanitize\r\n * @returns {string} Sanitized text with dangerous content removed\r\n * History:\r\n * 25-09-2025: Created\r\n ****************************************************/\r\nexport const sanitizeMarkdown = (text: string | null | undefined): string => {\r\n if (!text || typeof text !== 'string') {\r\n return '';\r\n }\r\n\r\n try {\r\n return text\r\n // Remove all HTML tags\r\n .replace(/<[^>]*>/g, '')\r\n // Remove JavaScript protocols\r\n .replace(/javascript:/gi, '')\r\n // Remove data URLs\r\n .replace(/data:[^,]*,[^\"'\\s>)]*/gi, '')\r\n // Remove suspicious protocols\r\n .replace(/(file|ftp|ws|wss|vbscript|livescript|mocha):/gi, '')\r\n // Remove HTML entities that could be used for obfuscation\r\n .replace(/&[#\\w]+;/g, '')\r\n // Remove potential CSS expressions\r\n .replace(/expression\\s*\\([^)]*\\)/gi, '')\r\n // Clean up extra whitespace\r\n .replace(/\\s+/g, ' ')\r\n .trim();\r\n } catch (error) {\r\n /* c8 ignore start */\r\n // Defensive fallback\r\n return '';\r\n /* c8 ignore end */\r\n }\r\n};\r\n\r\n/******************************************************\r\n * ##: Security Risk Assessment\r\n * Provides a security risk score and recommendations based on detected risks.\r\n *\r\n * Calculates risk score and provides actionable security recommendations.\r\n * @param {SecurityRisk[]} risks Array of detected security risks\r\n * @returns {{score: number, level: string, recommendations: string[]}} Risk assessment\r\n * History:\r\n * 25-09-2025: Created\r\n ****************************************************/\r\nexport const assessSecurityRisks = (risks: SecurityRisk[]): {\r\n score: number;\r\n level: 'safe' | 'low' | 'medium' | 'high' | 'critical';\r\n recommendations: string[];\r\n} => {\r\n if (!risks || risks.length === 0) {\r\n return {\r\n score: 0,\r\n level: 'safe',\r\n recommendations: ['Content appears safe to use'],\r\n };\r\n }\r\n\r\n // Calculate risk score based on severity\r\n const severityScores = { critical: 100, high: 50, medium: 20, low: 5 };\r\n const score = risks.reduce((total, risk) => {\r\n return total + (severityScores[risk.severity || 'low'] || 5);\r\n }, 0);\r\n\r\n // Determine risk level\r\n let level: 'safe' | 'low' | 'medium' | 'high' | 'critical';\r\n if (score >= 100) level = 'critical';\r\n else if (score >= 50) level = 'high';\r\n else if (score >= 20) level = 'medium';\r\n else if (score >= 5) level = 'low';\r\n else level = 'safe';\r\n\r\n // Generate recommendations\r\n const recommendations: string[] = [];\r\n const hasCritical = risks.some(r => r.severity === 'critical');\r\n const hasHigh = risks.some(r => r.severity === 'high');\r\n\r\n if (hasCritical) {\r\n recommendations.push('URGENT: Critical security risks detected - do not render this content');\r\n recommendations.push('Use aggressive sanitization before any processing');\r\n }\r\n\r\n if (hasHigh) {\r\n recommendations.push('High security risks detected - sanitization strongly recommended');\r\n recommendations.push('Consider rejecting this content or applying strict filtering');\r\n }\r\n\r\n if (level === 'medium') {\r\n recommendations.push('Medium security risks detected - apply sanitization');\r\n recommendations.push('Review content carefully before use');\r\n }\r\n\r\n if (level === 'low') {\r\n recommendations.push('Low security risks detected - basic sanitization recommended');\r\n }\r\n\r\n recommendations.push('Always validate content from untrusted sources');\r\n recommendations.push('Consider implementing Content Security Policy (CSP)');\r\n\r\n return { score, level, recommendations };\r\n};","export * from \"./utils/array\";\r\nexport * from \"./utils/bool\";\r\nexport * from \"./utils/object\";\r\nexport * from \"./utils/string\";\r\nexport * from \"./utils/number\";\r\nexport * from \"./utils/func\";\r\nexport * from \"./utils/validations\";\r\nexport * from \"./utils/iban\";\r\nexport * from \"./utils/security\";\r\n\r\n/** Environment helpers (runtime-agnostic checks) */\r\nexport const isBrowser =\r\n typeof globalThis !== \"undefined\" &&\r\n typeof (globalThis as any).document !== \"undefined\";\r\nexport const isNode =\r\n typeof process !== \"undefined\" && !!process.versions?.node;\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/array.ts","../src/utils/bool.ts","../src/utils/object.ts","../src/utils/string.ts","../src/utils/number.ts","../src/utils/func.ts","../src/utils/validations.ts","../src/utils/iban.ts","../src/utils/security.ts","../src/index.ts"],"names":["chunk"],"mappings":"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","file":"index.js","sourcesContent":["/******************************************************\r\n * ##: Unique by Key\r\n * Returns unique items in an array based on a computed key\r\n * @param {Array<T>} arr - The array to process\r\n * @param {Function} key - Function to compute the key for uniqueness\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function uniqBy<T, K>(arr: T[], key: (v: T) => K): T[] {\r\n const seen = new Set<K>();\r\n const out: T[] = [];\r\n for (const item of arr) {\r\n const k = key(item);\r\n if (!seen.has(k)) {\r\n seen.add(k);\r\n out.push(item);\r\n }\r\n }\r\n return out;\r\n}\r\n\r\n/******************************************************\r\n * ##: Array Chunk\r\n * Splits an array into equally sized pieces\r\n * @param {Array<T>} arr - The array to chunk\r\n * @param {Number} size - Size of each chunk\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function chunk<T>(arr: T[], size: number): T[][] {\r\n if (size <= 0) return [arr.slice()];\r\n const res: T[][] = [];\r\n for (let i = 0; i < arr.length; i += size) res.push(arr.slice(i, i + size));\r\n return res;\r\n}\r\n\r\n/******************************************************\r\n * ##: Deep Array Equality\r\n * Deeply compares two arrays for equality, ignoring element order and property order in nested objects\r\n *\r\n * Notes:\r\n * - Uses JSON.stringify as the final canonical representation.\r\n * - Will return false on non-serializable inputs (e.g., circular structures).\r\n * - For primitives like NaN/Infinity, JSON.stringify follows JS semantics (NaN -> null).\r\n * @param {Array<T>} arr1 - First array to compare\r\n * @param {Array<T>} arr2 - Second array to compare\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function areArraysEqual<T = unknown>(arr1: T[], arr2: T[]): boolean {\r\n try {\r\n // Quick length check\r\n if (!Array.isArray(arr1) || !Array.isArray(arr2)) return false;\r\n if (arr1.length !== arr2.length) return false;\r\n\r\n // Canonicalize: sort object keys recursively\r\n const normalize = (value: unknown): unknown => {\r\n if (Array.isArray(value)) {\r\n // Normalize each element; order is handled later by sorting the stringified list\r\n return value.map(normalize);\r\n }\r\n if (value && typeof value === \"object\") {\r\n const entries = Object.entries(value as Record<string, unknown>)\r\n .map(([k, v]) => [k, normalize(v)] as const)\r\n .sort(([k1], [k2]) => (k1 < k2 ? -1 : k1 > k2 ? 1 : 0));\r\n return Object.fromEntries(entries);\r\n }\r\n return value;\r\n };\r\n\r\n // Stringify each normalized element and sort → order-independent comparison\r\n const a = arr1.map((el) => JSON.stringify(normalize(el))).sort();\r\n const b = arr2.map((el) => JSON.stringify(normalize(el))).sort();\r\n\r\n // Compare element-wise\r\n for (let i = 0; i < a.length; i++) {\r\n if (a[i] !== b[i]) return false;\r\n }\r\n return true;\r\n } catch {\r\n // Any unexpected error → treat as not equal\r\n return false;\r\n }\r\n}\r\n\r\n/* ======================================================================================\r\n * Deprecated aliases (backward-compatibility)\r\n * Keep until downstream code is migrated. Remove in a major release.\r\n * ====================================================================================*/\r\n/**\r\n * @deprecated Use `areArraysEqual` instead.\r\n */\r\nexport const areArraysDeepEqualUnordered = areArraysEqual;\r\n\r\n/******************************************************\r\n * ##: Unique Values\r\n * Removes duplicate values from an array\r\n * @param {Array<T>} arr - The array to process\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function uniq<T>(arr: T[]): T[] {\r\n return Array.from(new Set(arr));\r\n}\r\n\r\n/******************************************************\r\n * ##: Flatten Array\r\n * Flattens nested arrays into a single array (1 level deep)\r\n * @param {Array<any>} arr - The array to flatten\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function flatten<T>(arr: any[]): T[] {\r\n return arr.flat ? arr.flat() : [].concat(...arr);\r\n}\r\n\r\n/******************************************************\r\n * ##: Group By\r\n * Groups array items by a key or function\r\n * @param {Array<T>} arr - The array to group\r\n * @param {Function|String} key - Key or function to group by\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function groupBy<T, K extends keyof any>(\r\n arr: T[],\r\n key: ((item: T) => K) | K\r\n): Record<string, T[]> {\r\n return arr.reduce((acc, item) => {\r\n const group = typeof key === \"function\" ? key(item) : (item as any)[key];\r\n (acc[group] = acc[group] || []).push(item);\r\n return acc;\r\n }, {} as Record<string, T[]>);\r\n}\r\n\r\n/******************************************************\r\n * ##: Sort By\r\n * Sorts array by a key or function\r\n * @param {Array<T>} arr - The array to sort\r\n * @param {Function|String} key - Key or function to sort by\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function sortBy<T>(arr: T[], key: ((item: T) => any) | keyof T): T[] {\r\n return [...arr].sort((a, b) => {\r\n const aKey = typeof key === \"function\" ? key(a) : a[key];\r\n const bKey = typeof key === \"function\" ? key(b) : b[key];\r\n if (aKey < bKey) return -1;\r\n if (aKey > bKey) return 1;\r\n return 0;\r\n });\r\n}\r\n\r\n/******************************************************\r\n * ##: Array Difference\r\n * Returns elements in arr1 not present in arr2\r\n * @param {Array<T>} arr1 - First array\r\n * @param {Array<T>} arr2 - Second array\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function difference<T>(arr1: T[], arr2: T[]): T[] {\r\n const set2 = new Set(arr2);\r\n return arr1.filter((x) => !set2.has(x));\r\n}\r\n\r\n/******************************************************\r\n * ##: Array Intersection\r\n * Returns elements common to both arrays\r\n * @param {Array<T>} arr1 - First array\r\n * @param {Array<T>} arr2 - Second array\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function intersection<T>(arr1: T[], arr2: T[]): T[] {\r\n const set2 = new Set(arr2);\r\n return arr1.filter((x) => set2.has(x));\r\n}\r\n\r\n/******************************************************\r\n * ##: Compact Array\r\n * Removes falsy values from array\r\n * @param {Array<T>} arr - The array to compact\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function compact<T>(arr: T[]): T[] {\r\n return arr.filter(Boolean);\r\n}\r\n\r\n/******************************************************\r\n * ##: Pluck Property\r\n * Extracts a property from each object in array\r\n * @param {Array<T>} arr - The array of objects\r\n * @param {String} key - Property name to extract\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function pluck<T, K extends keyof T>(arr: T[], key: K): Array<T[K]> {\r\n return arr.map((item) => item[key]);\r\n}\r\n\r\n/******************************************************\r\n * ##: Shuffle Array\r\n * Shuffles array elements randomly\r\n * @param {Array<T>} arr - The array to shuffle\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function shuffle<T>(arr: T[]): T[] {\r\n const a = [...arr];\r\n for (let i = a.length - 1; i > 0; i--) {\r\n const j = Math.floor(Math.random() * (i + 1));\r\n [a[i], a[j]] = [a[j], a[i]];\r\n }\r\n return a;\r\n}\r\n\r\n/**\r\n ****************************************************\r\n * ##: Flattenable Value Checker\r\n * Checks if a value can be flattened (array, arguments, or marked spreadable)\r\n *\r\n * Notes:\r\n * Mirrors lodash's behavior: checks Array.isArray, arguments object, and Symbol.isConcatSpreadable.\r\n * @param {unknown} value - Value to check for flattenability\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function isFlattenable(value: unknown): value is readonly unknown[] {\r\n // Quick path: arrays\r\n if (Array.isArray(value)) return true;\r\n\r\n // Check for arguments object\r\n const isArgs = Object.prototype.toString.call(value) === \"[object Arguments]\";\r\n\r\n if (isArgs) return true;\r\n\r\n // Respect Symbol.isConcatSpreadable when present\r\n // (some iterables/array-likes may opt-in)\r\n const spreadable = (Symbol as any).isConcatSpreadable as symbol | undefined;\r\n // Using bracket access to avoid TS downlevel issues\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n return spreadable ? !!(value as any)?.[spreadable] : false;\r\n}\r\n\r\n/**\r\n ****************************************************\r\n * ##: Array Push All\r\n * Appends all values into array in-place (similar to lodash arrayPush)\r\n * @param {Array<T>} array - Target array\r\n * @param {Array<T>} values - Values to append\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function pushAll<T>(array: T[], values: readonly T[]): T[] {\r\n let index = -1;\r\n const length = values.length;\r\n const offset = array.length;\r\n\r\n while (++index < length) {\r\n array[offset + index] = values[index] as T;\r\n }\r\n return array;\r\n}\r\n\r\n/**\r\n ****************************************************\r\n * ##: Base Array Flatten\r\n * Base flatten routine with configurable depth and predicate\r\n *\r\n * Notes:\r\n * Allows control of depth, predicate, and strict mode. Used internally for flattening.\r\n * @param {Array} array - Input array\r\n * @param {Number} depth - Maximum recursion depth\r\n * @param {Function} predicate - Function to determine if value is flattenable\r\n * @param {Boolean} isStrict - If true, only flattenable values are kept\r\n * @param {Array} result - Optional accumulator (internal)\r\n * @returns {Array} New flattened array\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function flattenDepthBase<T>(\r\n array: readonly unknown[],\r\n depth: number,\r\n predicate: (v: unknown) => boolean = isFlattenable,\r\n isStrict = false,\r\n result: T[] = []\r\n): T[] {\r\n let index = -1;\r\n const length = array.length;\r\n\r\n while (++index < length) {\r\n const value = array[index];\r\n if (depth > 0 && predicate(value)) {\r\n if (depth > 1) {\r\n // Recursively flatten (susceptible to call stack limits on huge nests).\r\n flattenDepthBase<T>(\r\n value as readonly unknown[],\r\n depth - 1,\r\n predicate,\r\n isStrict,\r\n result\r\n );\r\n } else {\r\n pushAll(result, value as T[]);\r\n }\r\n } else if (!isStrict) {\r\n // Keep non-flattenables when not strict\r\n (result as unknown[])[result.length] = value as unknown as T;\r\n }\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n ****************************************************\r\n * ##: Flatten Array Once\r\n * Flattens array a single level deep (equivalent to lodash _.flatten)\r\n *\r\n * Notes:\r\n * Example: flattenOnce([1, [2, [3, [4]], 5]]) => [1, 2, [3, [4]], 5]\r\n * @param {Array} array - Array to flatten\r\n * @returns {Array} Flattened array (1 level)\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function flattenOnce<T>(\r\n array: ReadonlyArray<T | ReadonlyArray<T>>\r\n): T[] {\r\n // Type note: `flattenDepthBase` returns `unknown[]` at compile-time,\r\n // but we constrain inputs so a cast to `T[]` is safe here.\r\n return flattenDepthBase<T>(array as readonly unknown[], 1) as T[];\r\n}\r\n\r\n/******************************************************\r\n * ##: Flatten Array to Depth\r\n * Flattens array up to the specified depth (friendly wrapper, default 1)\r\n *\r\n * Notes:\r\n * Example: flattenDepth([1, [2, [3, [4]], 5]], 2) => [1, 2, 3, [4], 5]\r\n * @param {Array} array - Array to flatten\r\n * @param {Number} depth - Maximum depth\r\n * @param {Object} options - Options: predicate, isStrict\r\n * @returns {Array} Flattened array up to depth\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function flattenDepth<T = unknown>(\r\n array: readonly unknown[],\r\n depth = 1,\r\n options?: {\r\n predicate?: (v: unknown) => boolean;\r\n isStrict?: boolean;\r\n }\r\n): T[] {\r\n const { predicate = isFlattenable, isStrict = false } = options ?? {};\r\n return flattenDepthBase<T>(array, depth, predicate, isStrict);\r\n}\r\n","/****************************************************\r\n * ##: Boolean Parser\r\n * Converts a value to boolean, supporting common string/number representations\r\n *\r\n * Notes:\r\n * - Accepts \"true\", \"yes\", \"1\", \"false\", \"no\", \"0\" (case/whitespace-insensitive)\r\n * - Returns default value if not recognized or on error\r\n * @param {unknown} value - Input value (string | number | boolean | null | undefined)\r\n * @param {Boolean} def - Default value if input cannot be parsed (default: false)\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport const toBool = (value: unknown, def: boolean = false): boolean => {\r\n try {\r\n if (value === null || value === undefined) return def;\r\n\r\n if (typeof value === \"boolean\") return value;\r\n if (typeof value === \"number\") return value === 1;\r\n\r\n if (typeof value === \"string\") {\r\n switch (value.toLowerCase().trim()) {\r\n case \"true\":\r\n case \"yes\":\r\n case \"1\":\r\n return true;\r\n case \"false\":\r\n case \"no\":\r\n case \"0\":\r\n return false;\r\n default:\r\n return def;\r\n }\r\n }\r\n\r\n return def;\r\n } catch {\r\n return false;\r\n }\r\n};\r\n\r\n/* ======================================================================================\r\n * Deprecated aliases (backward-compatibility)\r\n * Keep until downstream code is migrated. Remove in a major release.\r\n * ====================================================================================*/\r\n/**\r\n * @deprecated Use `toBool` instead.\r\n */\r\nexport const parseToBool = toBool;\r\n","/**\r\n****************************************************\r\n * ##: Object Property Picker\r\n * Picks specified properties from an object and returns a new object\r\n * @param {Object} obj - Source object\r\n * @param {Array} keys - Array of keys to pick\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function pick<T extends object, K extends keyof T>(\r\n obj: T,\r\n keys: K[]\r\n): Pick<T, K> {\r\n const out = {} as Pick<T, K>;\r\n for (const k of keys) if (k in obj) out[k] = obj[k];\r\n return out;\r\n}\r\n\r\n/**\r\n****************************************************\r\n * ##: Object Property Omitter\r\n * Omits specified properties from an object and returns a new object\r\n * @param {Object} obj - Source object\r\n * @param {Array} keys - Array of keys to omit\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function omit<T extends object, K extends keyof T>(\r\n obj: T,\r\n keys: K[]\r\n): Omit<T, K> {\r\n const set = new Set<keyof T>(keys);\r\n const out = {} as any;\r\n for (const k in obj) if (!set.has(k)) out[k] = obj[k];\r\n return out;\r\n}\r\n\r\n/**\r\n****************************************************\r\n * ##: Object to Clean String\r\n * Converts an object or value to a clean string without JSON braces and quotes\r\n *\r\n * Notes:\r\n * Examples: { a: 1, b: \"x\" } -> \"a=1_b=x\", null -> \"\", 42 -> \"42\"\r\n * @param {unknown} obj - Object or value to convert\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function objectToString(obj: unknown): string {\r\n try {\r\n if (obj === null || obj === undefined) return \"\";\r\n if (typeof obj !== \"object\") return String(obj);\r\n\r\n return JSON.stringify(obj)\r\n .replace(/[{}\"]/g, \"\") // remove { } \"\r\n .replace(/:/g, \"=\") // replace : with =\r\n .replace(/,/g, \"_\"); // replace , with _\r\n } catch {\r\n // Fallback: best-effort stringify\r\n try {\r\n return String(obj);\r\n } catch {\r\n return \"\";\r\n }\r\n }\r\n}\r\n\r\n/**\r\n****************************************************\r\n * ##: Deep Object Cleaner\r\n * Deep-cleans an input by removing null, undefined, \"null\", \"undefined\" and recursively cleaning arrays/objects\r\n *\r\n * Notes:\r\n * - Falsy values like 0, false, \"\" are kept.\r\n * - Non-plain objects (e.g., Date, Map) are treated as generic objects via Object.entries.\r\n * - Prunes empty objects/arrays produced by the cleaning step.\r\n * - Optionally removes empty strings (\"\") when configured.\r\n * @param {unknown} obj - Object or array to clean\r\n * @param {boolean} removeEmptyString - When true, also removes empty strings\r\n * History:\r\n * 21-08-2025: Created\r\n * 11-12-2025: Added optional removeEmptyString flag\r\n ****************************************************/\r\ntype Removable = null | undefined | \"null\" | \"undefined\" | \"\";\r\n\r\nconst isRemovable = (\r\n v: unknown,\r\n removeEmptyString?: boolean\r\n): v is Removable =>\r\n v === null ||\r\n v === undefined ||\r\n v === \"null\" ||\r\n v === \"undefined\" ||\r\n (removeEmptyString && v === \"\");\r\n\r\nexport function cleanObject<T = unknown>(\r\n obj: T,\r\n removeEmptyString = false\r\n): any {\r\n // Handle arrays: map + clean each item, then filter removable values\r\n if (Array.isArray(obj)) {\r\n const cleanedArray = obj\r\n .map((item) => cleanObject(item, removeEmptyString))\r\n .filter((item) => !isRemovable(item, removeEmptyString));\r\n return cleanedArray;\r\n }\r\n\r\n // Handle objects (and only objects, excluding null)\r\n if (obj !== null && typeof obj === \"object\") {\r\n const cleaned: Record<string, any> = {};\r\n\r\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\r\n // Skip removable raw values fast\r\n if (isRemovable(value, removeEmptyString)) continue;\r\n\r\n // Recursively clean nested values\r\n const nested = cleanObject(value, removeEmptyString);\r\n\r\n // After cleaning, skip if still removable\r\n if (isRemovable(nested, removeEmptyString)) continue;\r\n\r\n // Prune empty objects/arrays (to mirror original behavior)\r\n const isObj = typeof nested === \"object\" && nested !== null;\r\n const isEmptyObj =\r\n isObj && !Array.isArray(nested) && Object.keys(nested).length === 0;\r\n const isEmptyArr = Array.isArray(nested) && nested.length === 0;\r\n if (isEmptyObj || isEmptyArr) continue;\r\n\r\n cleaned[key] = nested;\r\n }\r\n\r\n return cleaned;\r\n }\r\n\r\n // Primitives (and functions) are returned as-is\r\n return obj as any;\r\n}\r\n","type Locale = string | string[] | undefined;\r\n\r\nexport type CapitalizeFirstOptions = {\r\n lowerRest?: boolean;\r\n locale?: Locale;\r\n};\r\n\r\nexport type CapitalizeWordsOptions = {\r\n lowerRest?: boolean;\r\n locale?: Locale;\r\n treatHyphenAsSeparator?: boolean;\r\n};\r\n\r\nexport type SentenceCaseOptions = {\r\n lowerRest?: boolean;\r\n locale?: Locale;\r\n};\r\n\r\nfunction upper(value: string, locale?: Locale) {\r\n return locale ? value.toLocaleUpperCase(locale) : value.toUpperCase();\r\n}\r\n\r\nfunction lower(value: string, locale?: Locale) {\r\n return locale ? value.toLocaleLowerCase(locale) : value.toLowerCase();\r\n}\r\n\r\n/******************************************************\r\n * ##: Slugify String\r\n * Converts a string to a URL-friendly slug (basic ASCII, keeps numbers and dashes)\r\n * @param {String} input - String to slugify\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function slugify(input: string) {\r\n return input\r\n .normalize(\"NFKD\")\r\n .replace(/[\\u0300-\\u036f]/g, \"\")\r\n .toLowerCase()\r\n .replace(/[^a-z0-9]+/g, \"-\")\r\n .replace(/^-+|-+$/g, \"\");\r\n}\r\n\r\n/******************************************************\r\n * ##: Simple String Template Filler\r\n * Fills a template string with values (e.g., \"Hello, {name}!\")\r\n * @param {String} template - Template string\r\n * @param {Object} values - Key-value pairs to fill\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function fill(\r\n template: string,\r\n values: Record<string, string | number>\r\n) {\r\n return template.replace(/\\{(\\w+)\\}/g, (_, k) => String(values[k] ?? \"\"));\r\n}\r\n\r\n/******************************************************\r\n * ##: Remove Diacritics\r\n * Removes diacritic marks from a string using NFD normalization\r\n *\r\n * Notes:\r\n * Examples: \"ação\" -> \"acao\", \"coração\" -> \"coracao\", \"résumé\" -> \"resume\", \"naïve\" -> \"naive\"\r\n * @param {String} str - String to deburr\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function deburr(str: string): string {\r\n try {\r\n return str.normalize(\"NFD\").replace(/[\\u0300-\\u036f]/g, \"\");\r\n } catch {\r\n return str;\r\n }\r\n}\r\n\r\n/******************************************************\r\n * ##: Capitalize First Letter\r\n * Capitalizes only the first character of a string; optionally lowercases the rest\r\n * @param {String} input - Input string\r\n * @param {Object} options - { lowerRest = true, locale }\r\n * History:\r\n * 19-12-2025: Created\r\n ****************************************************/\r\nexport function capitalizeFirst(\r\n input: unknown,\r\n options?: CapitalizeFirstOptions\r\n): string {\r\n if (typeof input !== \"string\" || input.length === 0) return \"\";\r\n\r\n const { lowerRest = true, locale } = options ?? {};\r\n const first = upper(input[0], locale);\r\n const rest = lowerRest ? lower(input.slice(1), locale) : input.slice(1);\r\n\r\n return first + rest;\r\n}\r\n\r\n/******************************************************\r\n * ##: Capitalize Words\r\n * Capitalizes each word in a string with options for hyphens and locale\r\n * @param {String} input - Input string\r\n * @param {Object} options - { lowerRest = true, locale, treatHyphenAsSeparator = false }\r\n * History:\r\n * 19-12-2025: Created\r\n ****************************************************/\r\nexport function capitalizeWords(\r\n input: unknown,\r\n options?: CapitalizeWordsOptions\r\n): string {\r\n if (typeof input !== \"string\" || input.length === 0) return \"\";\r\n\r\n const {\r\n lowerRest = true,\r\n locale,\r\n treatHyphenAsSeparator = false,\r\n } = options ?? {};\r\n\r\n const wordPattern = treatHyphenAsSeparator\r\n ? /[\\p{L}\\p{N}]+(?:['’][\\p{L}\\p{N}]+)*/gu\r\n : /[\\p{L}\\p{N}]+(?:['’\\-][\\p{L}\\p{N}]+)*/gu;\r\n\r\n return input.replace(wordPattern, (word) => {\r\n const first = upper(word[0], locale);\r\n const rest = lowerRest ? lower(word.slice(1), locale) : word.slice(1);\r\n\r\n return first + rest;\r\n });\r\n}\r\n\r\n/******************************************************\r\n * ##: Sentence Case\r\n * Capitalizes the first letter of each sentence (. ! ?) with optional lowercasing of the rest\r\n * @param {String} input - Input string\r\n * @param {Object} options - { lowerRest = true, locale }\r\n * History:\r\n * 19-12-2025: Created\r\n ****************************************************/\r\nexport function sentenceCase(\r\n input: unknown,\r\n options?: SentenceCaseOptions\r\n): string {\r\n if (typeof input !== \"string\" || input.length === 0) return \"\";\r\n\r\n const { lowerRest = true, locale } = options ?? {};\r\n const base = lowerRest ? lower(input, locale) : input;\r\n const sentencePattern = /(^\\s*[\\p{L}])|([.!?]\\s*[\\p{L}])/gu;\r\n\r\n return base.replace(sentencePattern, (match) => {\r\n const lastChar = match[match.length - 1];\r\n const upperChar = upper(lastChar, locale);\r\n return match.slice(0, -1) + upperChar;\r\n });\r\n}\r\n\r\n/* ======================================================================================\r\n * Deprecated aliases (backward-compatibility)\r\n * Keep until downstream code is migrated. Remove in a major release.\r\n * ====================================================================================*/\r\n/**\r\n * @deprecated Use `deburr` instead.\r\n */\r\nexport const removeDiacritics = deburr;\r\n\r\n/******************************************************\r\n * ##: Basic String Sanitizer\r\n * Sanitizes input by removing control chars, HTML/script/style/iframe blocks, dangerous URL schemes, and keeps letters/numbers/spaces/punctuation\r\n *\r\n * Notes:\r\n * Non-string inputs return \"\". This is a light, generic sanitizer (not a full HTML sanitizer).\r\n * @param {unknown} input - Input to sanitize\r\n * @param {Number} maxLength - Optional max length for output\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function sanitize(input: unknown, maxLength?: number): string {\r\n if (typeof input !== \"string\") return \"\";\r\n\r\n // 1. Remove invisible spaces and control characters\r\n let cleaned = input.replace(/[\\u0000-\\u001F\\u007F-\\u009F]/g, \"\");\r\n\r\n // 2. Remove embedded script/style/iframe blocks\r\n cleaned = cleaned.replace(/<(script|style|iframe)[^>]*>.*?<\\/\\1>/gis, \"\");\r\n\r\n // 3. Remove event handler attributes (e.g., onclick, onerror)\r\n cleaned = cleaned.replace(/on\\w+\\s*=\\s*(['\"]).*?\\1/gi, \"\");\r\n\r\n // 4. Remove CSS expressions (expression(...))\r\n cleaned = cleaned.replace(/expression\\s*\\([^)]*\\)/gi, \"\");\r\n\r\n // 5. Remove blocks between dangerous HTML entities (e.g., <script>...</script>)\r\n cleaned = cleaned.replace(\r\n /<script>[\\s\\S]*?<\\/script>/gi,\r\n \"\"\r\n );\r\n cleaned = cleaned.replace(/<.*?>/gi, \"\");\r\n\r\n // 6. Strip all remaining HTML tags\r\n cleaned = cleaned.replace(/<[^>]+>/g, \"\");\r\n\r\n // 7. Remove dangerous URL schemes\r\n cleaned = cleaned.replace(/\\b(javascript:|data:|vbscript:|file:|ftp:)/gi, \"\");\r\n\r\n // 8. Keep letters/numbers/spaces and basic punctuation\r\n cleaned = cleaned.replace(/[^\\p{L}\\p{N}\\s\\-.,!?@#%&()]/gu, \"\");\r\n // 9. Apply maxLength only if explicitly passed\r\n if (typeof maxLength === \"number\" && maxLength > 0) {\r\n cleaned = cleaned.substring(0, maxLength);\r\n }\r\n\r\n // 10. Trim\r\n cleaned = cleaned.trim();\r\n\r\n return cleaned;\r\n}\r\n\r\n/* ======================================================================================\r\n * Deprecated aliases (backward-compatibility)\r\n * Keep until downstream code is migrated. Remove in a major release.\r\n * ====================================================================================*/\r\n/**\r\n * @deprecated Use `sanitize` instead.\r\n */\r\nexport const basicSanitize = sanitize;\r\n","/******************************************************\r\n * ##: Clamp Number\r\n * Restricts a number to be within the min and max bounds\r\n * @param {number} n - Number to clamp\r\n * @param {number} min - Minimum value\r\n * @param {number} max - Maximum value\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport const clamp = (n: number, min: number, max: number) =>\r\n Math.min(Math.max(n, min), max);\r\n\r\n/******************************************************\r\n * ##: Fixed Decimal Rounding\r\n * Rounds a number to a fixed number of decimals without floating point surprises\r\n * @param {number} n - Number to round\r\n * @param {number} decimals - Number of decimal places\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function round(n: number, decimals = 0) {\r\n const f = Math.pow(10, decimals);\r\n return Math.round((n + Number.EPSILON) * f) / f;\r\n}\r\n\r\n/******************************************************\r\n * ##: Safe Integer Conversion\r\n * Safely converts a value to an integer. Returns defaultValue if parsing fails or results in NaN.\r\n *\r\n * Notes:\r\n * Examples: safeParseInt(\"42\") -> 42, safeParseInt(\"abc\", 10) -> 10, safeParseInt(undefined) -> 0, safeParseInt(3.9) -> 3\r\n * @param {unknown} value - Value to convert\r\n * @param {number} defaultValue - Default value if parsing fails\r\n * History:\r\n * 21-08-2025: Created\r\n * 29-10-2025: Renamed from toInteger to safeParseInt\r\n ****************************************************/\r\nexport function safeParseInt(value: unknown, defaultValue = 0): number {\r\n try {\r\n const safeValue = parseInt(String(value), 10);\r\n return isNaN(safeValue) ? defaultValue : safeValue;\r\n } catch {\r\n return defaultValue;\r\n }\r\n}\r\n\r\n/******************************************************\r\n * ##: Decimal Precision Normalization\r\n * Ensures decimal precision values are finite, clamped to a safe integer range (0-100).\r\n *\r\n * Notes:\r\n * Used internally by safe arithmetic helpers to avoid invalid toFixed ranges.\r\n * @param {number} decimals - Requested decimal precision\r\n * @returns {number} Clamped integer precision between 0 and 100\r\n * History:\r\n * 01-12-2025: Created\r\n ****************************************************/\r\nfunction normalizeDecimals(decimals: number): number {\r\n if (!Number.isFinite(decimals)) return 0;\r\n const int = Math.floor(decimals);\r\n if (int < 0) return 0;\r\n if (int > 100) return 100;\r\n return int;\r\n}\r\n\r\n/******************************************************\r\n * ##: Operand Sanitization\r\n * Confirms operands are finite numbers before performing arithmetic.\r\n *\r\n * Notes:\r\n * Returns false if any operand is NaN or infinite.\r\n * @param {number[]} values - Numbers to validate\r\n * @returns {boolean} True when all operands are finite\r\n * History:\r\n * 01-12-2025: Created\r\n ****************************************************/\r\nfunction sanitizeOperands(...values: number[]): boolean {\r\n return values.every((value) => Number.isFinite(value));\r\n}\r\n\r\n/******************************************************\r\n * ##: Safe Addition\r\n * Adds two numbers with precision normalization and operand validation.\r\n *\r\n * Notes:\r\n * Returns 0 when operands are invalid or if toFixed throws.\r\n * Examples: safeAdd(0.1, 0.2, 2) -> 0.3, safeAdd(NaN, 5) -> 0\r\n * @param {number} a - Augend\r\n * @param {number} b - Addend\r\n * @param {number} decimals - Decimal places for rounding (default 2)\r\n * History:\r\n * 01-12-2025: Created\r\n ****************************************************/\r\nexport function safeAdd(a: number, b: number, decimals = 2): number {\r\n try {\r\n if (!sanitizeOperands(a, b)) return 0;\r\n const precision = normalizeDecimals(decimals);\r\n return Number((a + b).toFixed(precision));\r\n } catch {\r\n return 0;\r\n }\r\n}\r\n\r\n/******************************************************\r\n * ##: Safe Multiplication\r\n * Multiplies two numbers with precision normalization and operand validation.\r\n *\r\n * Notes:\r\n * Returns 0 when operands are invalid or on computation errors.\r\n * Examples: safeMultiply(0.1, 0.2, 4) -> 0.02, safeMultiply(Infinity, 2) -> 0\r\n * @param {number} a - First factor\r\n * @param {number} b - Second factor\r\n * @param {number} decimals - Decimal places for rounding (default 2)\r\n * History:\r\n * 01-12-2025: Created\r\n ****************************************************/\r\nexport function safeMultiply(a: number, b: number, decimals = 2): number {\r\n try {\r\n if (!sanitizeOperands(a, b)) return 0;\r\n const precision = normalizeDecimals(decimals);\r\n return Number((a * b).toFixed(precision));\r\n } catch {\r\n return 0;\r\n }\r\n}\r\n\r\n/******************************************************\r\n * ##: Safe Subtraction\r\n * Subtracts two numbers with precision normalization and operand validation.\r\n *\r\n * Notes:\r\n * Returns 0 when operands are invalid or on computation errors.\r\n * Examples: safeSubtract(10, 3.3333, 2) -> 6.67, safeSubtract(5, NaN) -> 0\r\n * @param {number} a - Minuend\r\n * @param {number} b - Subtrahend\r\n * @param {number} decimals - Decimal places for rounding (default 2)\r\n * History:\r\n * 01-12-2025: Created\r\n ****************************************************/\r\nexport function safeSubtract(a: number, b: number, decimals = 2): number {\r\n try {\r\n if (!sanitizeOperands(a, b)) return 0;\r\n const precision = normalizeDecimals(decimals);\r\n return Number((a - b).toFixed(precision));\r\n } catch {\r\n return 0;\r\n }\r\n}\r\n\r\n/******************************************************\r\n * ##: Safe Division\r\n * Divides two numbers with precision normalization, operand validation, and zero checks.\r\n *\r\n * Notes:\r\n * Returns 0 when operands are invalid or divisor is zero.\r\n * Examples: safeDivide(1, 3, 3) -> 0.333, safeDivide(10, 0) -> 0\r\n * @param {number} a - Dividend\r\n * @param {number} b - Divisor\r\n * @param {number} decimals - Decimal places for rounding (default 2)\r\n * History:\r\n * 01-12-2025: Created\r\n ****************************************************/\r\nexport function safeDivide(a: number, b: number, decimals = 2): number {\r\n try {\r\n if (!sanitizeOperands(a, b) || b === 0) return 0;\r\n const precision = normalizeDecimals(decimals);\r\n return Number((a / b).toFixed(precision));\r\n } catch {\r\n return 0;\r\n }\r\n}\r\n\r\n/******************************************************\r\n * ##: Safe Number Comparison\r\n * Compares two numbers using fixed decimal precision with operand validation.\r\n *\r\n * Notes:\r\n * Returns false when operands are invalid.\r\n * Examples: numbersEqual(0.1 + 0.2, 0.3) -> true, numbersEqual(NaN, 1) -> false\r\n * @param {number} a - First number\r\n * @param {number} b - Second number\r\n * @param {number} decimals - Decimal places for comparison (default 2)\r\n * History:\r\n * 01-12-2025: Created\r\n ****************************************************/\r\nexport function numbersEqual(a: number, b: number, decimals = 2): boolean {\r\n try {\r\n if (!sanitizeOperands(a, b)) return false;\r\n const precision = normalizeDecimals(decimals);\r\n return a.toFixed(precision) === b.toFixed(precision);\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/* ======================================================================================\r\n * Deprecated aliases (backward-compatibility)\r\n * Keep until downstream code is migrated. Remove in a major release.\r\n * ====================================================================================*/\r\n/**\r\n * @deprecated Use `safeParseFloat` instead.\r\n */\r\nexport const toInteger = safeParseInt;\r\n\r\n/******************************************************\r\n * ##: Safe Number Conversion\r\n * Safely parses a value into a number with optional decimal precision\r\n *\r\n * Notes:\r\n * Handles commas as decimal/thousands separators. Returns 0 for null/undefined/empty string or invalid parsing.\r\n * Examples: safeParseFloat(\"123.45\") -> 123.45, safeParseFloat(\"123,45\") -> 123.45, safeParseFloat(\"1,234.56\") -> 1234.56, safeParseFloat(\"abc\", 2) -> 0, safeParseFloat(42) -> 42\r\n * @param {unknown} value - Value to convert\r\n * @param {number} decimals - Number of decimal places\r\n * History:\r\n * 21-08-2025: Created\r\n * 29-10-2025: Renamed from toNumber to safeParseFloat\r\n * 01-12-2025: Fixed space-separated thousands handling and improved number parsing logic\r\n ****************************************************/\r\nexport function safeParseFloat(value: unknown, decimals = 6): number {\r\n try {\r\n // Fast path for numbers\r\n if (typeof value === \"number\") {\r\n return isNaN(value) ? 0 : Number(value.toFixed(decimals));\r\n }\r\n\r\n // Return 0 for null/undefined/empty\r\n if (value === undefined || value === null || value === \"\") return 0;\r\n\r\n let str = String(value).trim();\r\n if (!str) return 0;\r\n\r\n // Remove all spaces (can be used as thousands separators)\r\n str = str.replace(/\\s+/g, \"\");\r\n\r\n // Normalize separators\r\n let normalized: string;\r\n\r\n if (str.includes(\",\") && str.includes(\".\")) {\r\n // Determine which is decimal separator (rightmost one)\r\n const lastComma = str.lastIndexOf(\",\");\r\n const lastDot = str.lastIndexOf(\".\");\r\n\r\n if (lastDot > lastComma) {\r\n // \"1,234.56\" -> remove commas\r\n normalized = str.replace(/,/g, \"\");\r\n } else {\r\n // \"1.234,56\" -> swap separators\r\n normalized = str.replace(/\\./g, \"\").replace(\",\", \".\");\r\n }\r\n } else if (str.includes(\",\")) {\r\n // Check if comma is thousands separator or decimal separator\r\n const parts = str.split(\",\");\r\n if (parts.length === 2 && parts[1].length <= 2) {\r\n // \"123,45\" -> decimal separator\r\n normalized = str.replace(\",\", \".\");\r\n } else {\r\n // \"1,234\" or \"1,234,567\" -> thousands separator\r\n normalized = str.replace(/,/g, \"\");\r\n }\r\n } else {\r\n normalized = str;\r\n }\r\n\r\n const num = parseFloat(normalized);\r\n if (!isFinite(num)) return 0;\r\n\r\n const precision = normalizeDecimals(decimals);\r\n return Number(num.toFixed(precision));\r\n\r\n // Error handling\r\n } catch {\r\n return 0;\r\n }\r\n}\r\n\r\n/* ======================================================================================\r\n * Deprecated aliases (backward-compatibility)\r\n * Keep until downstream code is migrated. Remove in a major release.\r\n * ====================================================================================*/\r\n/**\r\n * @deprecated Use `safeParseFloat` instead.\r\n */\r\nexport const toNumber = safeParseFloat;\r\n\r\n/**\r\n * @deprecated Use `safeParseFloat` instead.\r\n */\r\nexport const parseToNumber = safeParseFloat;\r\n\r\n/******************************************************\r\n * ##: Secure Random Index\r\n * Generates a uniformly distributed integer in [0, max) using Web Crypto when available\r\n *\r\n * Notes:\r\n * Falls back to Math.random() if crypto is unavailable (not cryptographically secure)\r\n * @param {number} max - Upper bound (exclusive)\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nfunction secureRandomIndex(max: number): number {\r\n if (max <= 0) return 0;\r\n\r\n const g: any = globalThis as any;\r\n const crypto = g?.crypto;\r\n\r\n // Prefer Web Crypto (browser + Node 18+ expose crypto.getRandomValues)\r\n if (crypto && typeof crypto.getRandomValues === \"function\") {\r\n // Rejection sampling to avoid modulo bias\r\n const range = 0x100000000; // 2^32\r\n const threshold = range - (range % max);\r\n const buf = new Uint32Array(1);\r\n\r\n // Loop until we hit a value in the unbiased range\r\n // In practice this loops rarely (expected < 2 iterations).\r\n do {\r\n crypto.getRandomValues(buf);\r\n } while (buf[0] >= threshold);\r\n\r\n return buf[0] % max;\r\n }\r\n\r\n // Fallback (NOT cryptographically secure)\r\n return Math.floor(Math.random() * max);\r\n}\r\n\r\n/******************************************************\r\n * ##: Random Digits Generator\r\n * Generates a random string of digits with secure randomness when available\r\n *\r\n * Notes:\r\n * Options: length (default 6), charset (default \"0123456789\"), noLeadingZero (if true, first char not \"0\"). Returns a string to preserve leading zeros. Uses Web Crypto when possible; otherwise falls back to Math.random().\r\n * @param {number} length - Number of digits\r\n * @param {object} options - Options: charset, noLeadingZero\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function randomDigits(\r\n length = 6,\r\n options?: { charset?: string; noLeadingZero?: boolean }\r\n): string {\r\n const charset = options?.charset ?? \"0123456789\";\r\n if (length <= 0 || charset.length === 0) return \"\";\r\n\r\n let out = \"\";\r\n\r\n for (let i = 0; i < length; i++) {\r\n if (i === 0 && options?.noLeadingZero && charset.includes(\"0\")) {\r\n // Pick from charset without \"0\"\r\n const pool = charset.replace(/0/g, \"\");\r\n if (pool.length === 0) return \"\"; // nothing to pick\r\n out += pool[secureRandomIndex(pool.length)];\r\n } else {\r\n out += charset[secureRandomIndex(charset.length)];\r\n }\r\n }\r\n\r\n return out;\r\n}\r\n\r\n/* ======================================================================================\r\n * Deprecated aliases (backward-compatibility)\r\n * Keep until downstream code is migrated. Remove in a major release.\r\n * ====================================================================================*/\r\n/**\r\n * @deprecated Use `randomDigits` instead.\r\n */\r\n\r\nexport const otp = randomDigits;\r\n\r\n/******************************************************\r\n * ##: Decimal Number Formatter\r\n * Formats a number with specified decimal places, handling comma/dot normalization.\r\n *\r\n * Intelligently handles European number formats (1.234,56) and US formats (1,234.56).\r\n * Converts strings to numbers and applies decimal formatting.\r\n * @param {number|string|null|undefined} value Number value to format\r\n * @param {number} decimals - Number of decimal places (default: 2)\r\n * @returns {string} Formatted number string with specified decimals\r\n * History:\r\n * 16-10-2025: Created\r\n ****************************************************/\r\nexport const formatDecimalNumber = (\r\n value: number | string | null | undefined,\r\n decimals: number = 2\r\n): string => {\r\n try {\r\n // Handle nil values\r\n let processedValue: string | number = value ?? 0;\r\n\r\n // Handle string normalization for comma/dot formats\r\n if (typeof processedValue === \"string\") {\r\n const trimmed = processedValue.trim();\r\n\r\n if (trimmed.includes(\",\") && trimmed.includes(\".\")) {\r\n const lastComma = trimmed.lastIndexOf(\",\");\r\n const lastDot = trimmed.lastIndexOf(\".\");\r\n\r\n processedValue =\r\n lastComma > lastDot\r\n ? trimmed.replace(/\\./g, \"\").replace(\",\", \".\") // European style\r\n : trimmed.replace(/,/g, \"\"); // US style\r\n } else if (trimmed.includes(\",\")) {\r\n processedValue = trimmed.replace(/,/g, \".\");\r\n } else {\r\n processedValue = trimmed;\r\n }\r\n }\r\n\r\n const numValue = parseFloat(String(processedValue));\r\n\r\n // Handle invalid numbers\r\n if (isNaN(numValue)) {\r\n return (0).toFixed(Math.max(0, Math.floor(decimals)));\r\n }\r\n\r\n return numValue.toFixed(Math.max(0, Math.floor(decimals)));\r\n } catch (error) {\r\n /* c8 ignore start */\r\n return (0).toFixed(Math.max(0, Math.floor(decimals)));\r\n /* c8 ignore end */\r\n }\r\n};\r\n","/******************************************************\r\n * ##: Safe JSON Parse\r\n * Safely parses a JSON string or returns the object if already parsed. Falls back to default value on failure.\r\n * @param {unknown} input - The value to parse (string or object)\r\n * @param {T} [defaultValue] - The default value to return if parsing fails or input is invalid, defaults to {}\r\n * @returns {T} The parsed object or default value\r\n * History:\r\n * 21-12-2025: Created\r\n ******************************************************/\r\nexport function safeJSONParse<T>(input: unknown, defaultValue?: T): T {\r\n const def = isNilOrEmpty(defaultValue) === false ? defaultValue : ({} as T);\r\n if (typeof input === \"object\" && input !== null) {\r\n return input as T;\r\n }\r\n if (typeof input === \"string\") {\r\n try {\r\n const parsed = JSON.parse(input);\r\n return parsed as T;\r\n } catch {\r\n return def;\r\n }\r\n }\r\n return def;\r\n}\r\n\r\n/******************************************************\r\n * ##: Debounce Function\r\n * Returns a debounced version of a function that delays execution until after wait ms\r\n * @param {Function} fn - Function to debounce\r\n * @param {Number} wait - Delay in milliseconds\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function debounce<T extends (...args: any[]) => any>(fn: T, wait = 250) {\r\n let t: any;\r\n return function (this: any, ...args: Parameters<T>) {\r\n clearTimeout(t);\r\n t = setTimeout(() => fn.apply(this, args), wait);\r\n } as T;\r\n}\r\n\r\n/******************************************************\r\n * ##: Throttle Function\r\n * Returns a throttled version of a function that only executes once per wait ms\r\n * @param {Function} fn - Function to throttle\r\n * @param {Number} wait - Delay in milliseconds\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport function throttle<T extends (...args: any[]) => any>(fn: T, wait = 250) {\r\n let last = 0;\r\n let timer: any;\r\n return function (this: any, ...args: Parameters<T>) {\r\n const now = Date.now();\r\n const remaining = wait - (now - last);\r\n if (remaining <= 0) {\r\n last = now;\r\n fn.apply(this, args);\r\n } else if (!timer) {\r\n timer = setTimeout(() => {\r\n last = Date.now();\r\n timer = null;\r\n fn.apply(this, args);\r\n }, remaining);\r\n }\r\n } as T;\r\n}\r\n\r\n/******************************************************\r\n * ##: Nil Value Check\r\n * Checks if a value is null or undefined (Type Guard)\r\n * @param {unknown} value - Value to check\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport const isNil = (value: unknown): value is null | undefined =>\r\n value === null || value === undefined;\r\n\r\n/******************************************************\r\n * ##: Nil or Nil Text Check\r\n * Checks if value is null/undefined or the text \"null\"/\"undefined\"\r\n * @param {unknown} value - Value to check\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport const isNilText = (value: unknown): boolean => {\r\n if (value === null || value === undefined) return true;\r\n if (typeof value === \"string\") {\r\n const v = value.trim().toLowerCase();\r\n return v === \"null\" || v === \"undefined\";\r\n }\r\n return false;\r\n};\r\n\r\n/******************************************************\r\n * ##: Nil or Empty String Check\r\n * Checks if value is null/undefined or an empty string \"\"\r\n * @param {unknown} value - Value to check\r\n * History:\r\n * 21-08-2025: Created\r\n * 18-10-2025: Trim before checking empty\r\n ****************************************************/\r\nexport const isNilOrEmpty = (value: unknown): boolean => {\r\n try {\r\n return isNil(value) || (typeof value === \"string\" && value?.trim() === \"\");\r\n /* c8 ignore next -- defensive fallback (should never throw) */\r\n } catch {\r\n return true;\r\n }\r\n};\r\n\r\n/******************************************************\r\n * ##: Array Nil or Empty Element Check\r\n * Checks if any element in array is nil or empty (\"\"). Returns true if input is not an array.\r\n * @param {unknown} array - Array to check\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport const hasNilOrEmpty = (array: unknown): boolean => {\r\n try {\r\n if (!Array.isArray(array)) return true;\r\n for (const item of array) {\r\n if (isNilOrEmpty(item)) return true;\r\n }\r\n return false;\r\n } catch {\r\n return true;\r\n }\r\n};\r\n\r\n/******************************************************\r\n * ##: Nil, Empty, or Zero Length Check\r\n * Checks if value is nil, empty string, or has zero length (applies to arrays, strings, typed arrays, buffers)\r\n * @param {unknown} value - Value to check\r\n * History:\r\n * 21-08-2025: Created\r\n * 08-11-2025: Fixed type-safety and logic - added proper 'length' property check using 'in' operator,\r\n * changed catch block to return false (don't assume error means empty), added explicit\r\n * false return for values without length property\r\n ****************************************************/\r\nexport const isNilEmptyOrZeroLength = (value: unknown): boolean => {\r\n try {\r\n // Check for nil first\r\n if (isNil(value)) return true;\r\n\r\n // Check if value is empty string\r\n if (value === \"\") return true;\r\n\r\n // Check if value is string with length > 0\r\n if (typeof value === \"string\" && value.length > 0) return false;\r\n\r\n // Check if is array and has length > 0\r\n if (Array.isArray(value) && value.length > 0) return false;\r\n\r\n // For other types\r\n return true;\r\n\r\n // Error handling\r\n } catch {\r\n // fallback\r\n return true;\r\n }\r\n};\r\n\r\n/**\r\n * @deprecated Use `isNilEmptyOrZeroLength` instead.\r\n */\r\nexport const isNilEmptyOrZeroLen = isNilEmptyOrZeroLength;\r\n\r\n/******************************************************\r\n * ##: Nil or Zero Length Check\r\n * Checks if value is nil or has zero length (.length === 0). Does NOT treat \"\" specially.\r\n * @param {unknown} value - Value to check\r\n * History:\r\n * 21-08-2025: Created\r\n * 08-11-2025: Fixed type-safety and logic - added proper 'length' property check using 'in' operator,\r\n * changed catch block to return false (don't assume error means empty), added explicit\r\n * false return for values without length property\r\n ****************************************************/\r\nexport const isNilOrZeroLength = (value: unknown): boolean => {\r\n try {\r\n // Check for nil first\r\n if (isNil(value)) return true;\r\n\r\n // Check if is array and has length > 0\r\n if (Array.isArray(value) && value.length > 0) return false;\r\n\r\n // For other types\r\n return true;\r\n\r\n // Error handling\r\n } catch {\r\n // fallback\r\n return true;\r\n }\r\n};\r\n\r\n/**\r\n * @deprecated Use `isNilOrZeroLength` instead.\r\n */\r\nexport const isNilOrZeroLen = isNilOrZeroLength;\r\n\r\n/******************************************************\r\n * ##: Nil or NaN Check\r\n * Checks if value is nil OR NaN (coercive, matches global isNaN)\r\n *\r\n * Notes:\r\n * Uses global isNaN for parity with JS behavior (coerces strings). Example: isNaN(\"foo\") === true.\r\n * @param {unknown} value - Value to check\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport const isNilOrNaN = (value: unknown): boolean => {\r\n try {\r\n return isNil(value) || isNaN(value as number);\r\n } catch {\r\n return true;\r\n }\r\n};\r\n\r\n/* ======================================================================================\r\n * Deprecated aliases (backward-compatibility)\r\n * Keep until downstream code is migrated. Remove in a major release.\r\n * ====================================================================================*/\r\n\r\n/**\r\n * @deprecated Use `isNil` instead.\r\n */\r\nexport const isNullOrUndefined = isNil;\r\n\r\n/**\r\n * @deprecated Use `isNilText` instead.\r\n */\r\nexport const isNullOrUndefinedTextInc = isNilText;\r\n\r\n/**\r\n * @deprecated Use `isNilOrEmpty` instead.\r\n */\r\nexport const isNullUndefinedOrEmpty = isNilOrEmpty;\r\n\r\n/**\r\n * @deprecated Use `hasNilOrEmpty` instead.\r\n */\r\nexport const isNullOrUndefinedInArray = hasNilOrEmpty;\r\n\r\n/**\r\n * @deprecated Use `isNilEmptyOrZeroLen` instead.\r\n */\r\nexport const isNullOrUndefinedEmptyOrZero = isNilEmptyOrZeroLen;\r\n\r\n/**\r\n * @deprecated Use `isNilOrZeroLen` instead.\r\n */\r\nexport const isNullUndefinedOrZero = isNilOrZeroLen;\r\n\r\n/**\r\n * @deprecated Use `isNilOrNaN` instead.\r\n */\r\nexport const isNullOrUndefinedOrNaN = isNilOrNaN;\r\n\r\n/******************************************************\r\n * ##: Human-Readable Byte Formatter\r\n * Formats bytes as human-readable text (e.g., kB, MB, KiB, MiB)\r\n *\r\n * Notes:\r\n * SI (kB, MB, ...) uses 1000; IEC (KiB, MiB, ...) uses 1024. Negative values supported.\r\n * @param {Number} bytes - Number of bytes to format\r\n * @param {Boolean} si - True for metric (SI, base 1000), false for binary (IEC, base 1024)\r\n * @param {Number} dp - Decimal places\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport const formatBytes = (\r\n bytes: number,\r\n si: boolean = false,\r\n dp: number = 1\r\n): string => {\r\n // Guard invalid numbers\r\n if (!Number.isFinite(bytes)) return \"NaN\";\r\n\r\n const thresh = si ? 1000 : 1024;\r\n const abs = Math.abs(bytes);\r\n\r\n // Bytes (no unit scaling)\r\n if (abs < thresh) return `${bytes} B`;\r\n\r\n const units = si\r\n ? [\"kB\", \"MB\", \"GB\", \"TB\", \"PB\", \"EB\", \"ZB\", \"YB\"]\r\n : [\"KiB\", \"MiB\", \"GiB\", \"TiB\", \"PiB\", \"EiB\", \"ZiB\", \"YiB\"];\r\n\r\n let u = -1;\r\n const r = 10 ** dp;\r\n let value = bytes;\r\n\r\n do {\r\n value /= thresh;\r\n ++u;\r\n // keep dividing while rounded value still reaches next threshold\r\n } while (\r\n Math.round(Math.abs(value) * r) / r >= thresh &&\r\n u < units.length - 1\r\n );\r\n\r\n return `${value.toFixed(dp)} ${units[u]}`;\r\n};\r\n\r\n/* ======================================================================================\r\n * Deprecated aliases (backward-compatibility)\r\n * Keep until downstream code is migrated. Remove in a major release.\r\n * ====================================================================================*/\r\n/**\r\n * @deprecated Use `formatBytes` instead.\r\n */\r\nexport const humanFileSize = formatBytes;\r\n\r\n/******************************************************\r\n * ##: Levenshtein Distance\r\n * Calculates the Levenshtein distance between two strings (O(n*m), O(min(n,m)) space)\r\n * @param {String} a - First string\r\n * @param {String} b - Second string\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nconst levenshtein = (a: string, b: string): number => {\r\n if (a === b) return 0;\r\n const al = a.length;\r\n const bl = b.length;\r\n if (al === 0) return bl;\r\n if (bl === 0) return al;\r\n\r\n // Ensure `a` is the shorter to minimize memory\r\n if (al > bl) {\r\n const tmp = a;\r\n a = b;\r\n b = tmp;\r\n }\r\n\r\n const n = a.length;\r\n const m = b.length;\r\n\r\n let prev = new Array<number>(n + 1);\r\n let curr = new Array<number>(n + 1);\r\n\r\n for (let i = 0; i <= n; i++) prev[i] = i;\r\n\r\n for (let j = 1; j <= m; j++) {\r\n curr[0] = j;\r\n const bj = b.charCodeAt(j - 1);\r\n for (let i = 1; i <= n; i++) {\r\n const cost = a.charCodeAt(i - 1) === bj ? 0 : 1;\r\n const del = prev[i] + 1;\r\n const ins = curr[i - 1] + 1;\r\n const sub = prev[i - 1] + cost;\r\n curr[i] = del < ins ? (del < sub ? del : sub) : ins < sub ? ins : sub;\r\n }\r\n // swap\r\n const tmp = prev;\r\n prev = curr;\r\n curr = tmp;\r\n }\r\n\r\n return prev[n];\r\n};\r\n\r\n/******************************************************\r\n * ##: String Similarity\r\n * Returns the similarity between two strings (0..1)\r\n *\r\n * Notes:\r\n * Similarity = (|longer|-levenshtein(longer, shorter)) / |longer| ∈ [0, 1]. Safe for empty strings; if both empty => 1.0\r\n * @param {String} s1 - First string\r\n * @param {String} s2 - Second string\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport const stringSimilarity = (s1: string, s2: string): number => {\r\n const a = s1 ?? \"\";\r\n const b = s2 ?? \"\";\r\n\r\n let longer = a;\r\n let shorter = b;\r\n if (a.length < b.length) {\r\n longer = b;\r\n shorter = a;\r\n }\r\n\r\n const L = longer.length;\r\n if (L === 0) return 1.0;\r\n\r\n const dist = levenshtein(longer, shorter);\r\n return (L - dist) / L;\r\n};\r\n\r\n/* ======================================================================================\r\n * Deprecated aliases (backward-compatibility)\r\n * Keep until downstream code is migrated. Remove in a major release.\r\n * ====================================================================================*/\r\n/**\r\n * @deprecated Use `stringSimilarity` instead.\r\n */\r\nexport const getStringSimilarity = stringSimilarity;\r\n\r\n/******************************************************\r\n * ##: Thousand Separator Formatter\r\n * Adds spaces between thousands in a number (e.g., 1234567 -> \"1 234 567\")\r\n * @param {Number|String} value - Number or string to format\r\n * @returns {String} Formatted string with spaces as thousand separators\r\n * History:\r\n * 21-08-2025: Created\r\n ****************************************************/\r\nexport const addThousandsSpace = (value: number | string): string => {\r\n try {\r\n const str = value.toString();\r\n const [intPart, decimalPart] = str.split(\".\");\r\n\r\n const formattedInt = intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, \" \");\r\n return decimalPart ? `${formattedInt}.${decimalPart}` : formattedInt;\r\n } catch {\r\n return value as string;\r\n }\r\n};\r\n\r\n/******************************************************\r\n * ##: Delay Function\r\n * Creates a promise that resolves after the specified number of milliseconds\r\n * @param {Number} ms - Delay in milliseconds (negative values are treated as 0)\r\n * @returns {Promise<void>} Promise that resolves after the delay\r\n * History:\r\n * 25-09-2025: Created\r\n ****************************************************/\r\nexport const delay = (ms: number): Promise<void> =>\r\n new Promise((resolve) => setTimeout(resolve, Math.max(0, ms)));\r\n\r\n/******************************************************\r\n * ##: Enforced Nil/Empty/Textual Null Check\r\n * Checks if value is null/undefined/empty string or the text values \"null\" / \"undefined\" (case-insensitive)\r\n * @param {unknown} value - Value to check\r\n * @returns {Boolean} true if value is considered empty-like\r\n * History:\r\n * 25-09-2025: Created\r\n ****************************************************/\r\nexport const isNilTextOrEmpty = (value: unknown): boolean => {\r\n try {\r\n if (value === null || value === undefined || value === \"\") return true;\r\n if (typeof value === \"string\") {\r\n const v = value.trim().toLowerCase();\r\n return v === \"null\" || v === \"undefined\";\r\n }\r\n return false;\r\n /* c8 ignore next -- defensive fallback (should never throw) */\r\n } catch {\r\n return true; // safest fallback\r\n }\r\n};\r\n\r\n/******************************************************\r\n * ##: Modern Currency Formatter (Intl.NumberFormat)\r\n * Formats currency values using modern Intl.NumberFormat API with configurable locale and currency.\r\n *\r\n * Provides flexible currency formatting with optional symbol display,\r\n * proper decimal handling, and graceful fallback for errors.\r\n * @param {number|string|null|undefined} value Currency value to format\r\n * @param {boolean} withoutCurrencySymbol Hide currency symbol (show as decimal)\r\n * @param {string} currency Currency code (ISO 4217, e.g., \"EUR\", \"USD\")\r\n * @param {string} locale Locale string (e.g., \"pt-PT\", \"en-US\")\r\n * @returns {string} Formatted currency string (e.g., \"1.234,56 €\" or \"1.234,56\")\r\n * History:\r\n * 25-09-2025: Created\r\n ****************************************************/\r\nexport const formatCurrency = (\r\n value: number | string | null | undefined,\r\n withoutCurrencySymbol: boolean = false,\r\n currency: string = \"EUR\",\r\n locale: string = \"pt-PT\"\r\n): string => {\r\n try {\r\n // Normalize input value\r\n const numValue =\r\n value === undefined || value === null || value === \"\" ? 0 : Number(value);\r\n\r\n if (isNaN(numValue) || !isFinite(numValue)) {\r\n return withoutCurrencySymbol ? \"0,00\" : \"0,00 €\";\r\n }\r\n\r\n const intlOptions: Intl.NumberFormatOptions = {\r\n style: withoutCurrencySymbol ? \"decimal\" : \"currency\",\r\n currency: currency,\r\n minimumFractionDigits: 2,\r\n maximumFractionDigits: 2,\r\n };\r\n\r\n return new Intl.NumberFormat(locale, intlOptions).format(numValue);\r\n } catch (error) {\r\n /* c8 ignore start */\r\n // Fallback to simple formatting if Intl fails\r\n const numValue = Number(value) || 0;\r\n const formatted = numValue.toFixed(2).replace(\".\", \",\");\r\n return withoutCurrencySymbol ? formatted : `${formatted} €`;\r\n /* c8 ignore end */\r\n }\r\n};\r\n\r\n/******************************************************\r\n * ##: Parse Name into First and Last Components\r\n * Extracts first and last name from a full name string.\r\n *\r\n * Handles edge cases like single names, empty inputs, and multi-word names.\r\n * Returns first word as firstName and last word as lastName.\r\n * @param {string|null|undefined} name Full name string to parse\r\n * @returns {{firstName: string, lastName: string}} Object with firstName and lastName properties\r\n * History:\r\n * 25-09-2025: Created\r\n ****************************************************/\r\nexport const parseName = (\r\n name: string | null | undefined\r\n): { firstName: string; lastName: string } => {\r\n try {\r\n // Handle nil or empty inputs\r\n if (name === undefined || name === null || name === \"\") {\r\n return { firstName: \"\", lastName: \"\" };\r\n }\r\n\r\n // Trim whitespace and normalize spacing\r\n const cleanName = name.toString().trim().replace(/\\s+/g, \" \");\r\n\r\n if (cleanName === \"\") {\r\n return { firstName: \"\", lastName: \"\" };\r\n }\r\n\r\n // Single name case\r\n if (!cleanName.includes(\" \")) {\r\n return { firstName: cleanName, lastName: \"\" };\r\n }\r\n\r\n // Multiple names case - get first and last\r\n const nameParts = cleanName.split(\" \");\r\n const firstName = nameParts[0];\r\n const lastName = nameParts[nameParts.length - 1];\r\n\r\n return { firstName, lastName };\r\n } catch (error) {\r\n /* c8 ignore start */\r\n // Defensive fallback: try to use original input as firstName\r\n const fallbackName = name ? String(name).trim() : \"\";\r\n return { firstName: fallbackName, lastName: \"\" };\r\n /* c8 ignore end */\r\n }\r\n};\r\n\r\n/******************************************************\r\n * ##: Currency Symbol to ISO Code Converter\r\n * Converts currency symbols (€, £, $) to ISO 4217 currency codes.\r\n *\r\n * Maps common currency symbols to their corresponding three-letter codes.\r\n * Returns \"EUR\" as fallback for unknown symbols.\r\n * @param {string|null|undefined} symbol Currency symbol to convert (e.g., \"€\", \"£\", \"$\")\r\n * @returns {string} ISO 4217 currency code (e.g., \"EUR\", \"GBP\", \"USD\")\r\n * History:\r\n * 25-09-2025: Created\r\n ****************************************************/\r\nexport const symbolToCurrency = (symbol: string | null | undefined): string => {\r\n try {\r\n if (!symbol || typeof symbol !== \"string\") {\r\n return \"EUR\";\r\n }\r\n\r\n const normalizedSymbol = symbol.trim();\r\n\r\n switch (normalizedSymbol) {\r\n case \"€\":\r\n return \"EUR\";\r\n case \"£\":\r\n return \"GBP\";\r\n case \"$\":\r\n return \"USD\";\r\n case \"¥\":\r\n case \"¥\":\r\n return \"JPY\";\r\n case \"₹\":\r\n return \"INR\";\r\n case \"₽\":\r\n return \"RUB\";\r\n case \"¢\":\r\n return \"USD\"; // US cents\r\n case \"₩\":\r\n return \"KRW\"; // South Korean Won\r\n case \"₪\":\r\n return \"ILS\"; // Israeli Shekel\r\n case \"₦\":\r\n return \"NGN\"; // Nigerian Naira\r\n case \"₨\":\r\n return \"PKR\"; // Pakistani Rupee\r\n case \"₱\":\r\n return \"PHP\"; // Philippine Peso\r\n case \"₫\":\r\n return \"VND\"; // Vietnamese Dong\r\n case \"₡\":\r\n return \"CRC\"; // Costa Rican Colon\r\n case \"₲\":\r\n return \"PYG\"; // Paraguayan Guarani\r\n case \"₴\":\r\n return \"UAH\"; // Ukrainian Hryvnia\r\n case \"₵\":\r\n return \"GHS\"; // Ghanaian Cedi\r\n case \"₶\":\r\n return \"EUR\"; // Livre tournois (historical, fallback to EUR)\r\n case \"₸\":\r\n return \"KZT\"; // Kazakhstani Tenge\r\n case \"₺\":\r\n return \"TRY\"; // Turkish Lira\r\n case \"₻\":\r\n return \"EUR\"; // Nordic mark (historical, fallback to EUR)\r\n case \"₼\":\r\n return \"AZN\"; // Azerbaijani Manat\r\n case \"₾\":\r\n return \"GEL\"; // Georgian Lari\r\n case \"₿\":\r\n return \"BTC\"; // Bitcoin\r\n case \"﷼\":\r\n return \"SAR\"; // Saudi Riyal\r\n case \"$\":\r\n return \"USD\"; // Full-width dollar sign\r\n case \"¢\":\r\n return \"USD\"; // Full-width cent sign\r\n case \"£\":\r\n return \"GBP\"; // Full-width pound sign\r\n case \"¬\":\r\n return \"GBP\"; // Full-width not sign (sometimes used for pound)\r\n case \" ̄\":\r\n return \"JPY\"; // Full-width macron (sometimes used for yen)\r\n case \"¦\":\r\n return \"EUR\"; // Full-width lira sign\r\n case \"₩\":\r\n return \"KRW\"; // Full-width won sign\r\n // Additional common symbols\r\n case \"R\":\r\n return \"ZAR\"; // South African Rand (when used as symbol)\r\n case \"R$\":\r\n return \"BRL\"; // Brazilian Real\r\n case \"C$\":\r\n return \"CAD\"; // Canadian Dollar\r\n case \"A$\":\r\n return \"AUD\"; // Australian Dollar\r\n case \"S$\":\r\n return \"SGD\"; // Singapore Dollar\r\n case \"HK$\":\r\n return \"HKD\"; // Hong Kong Dollar\r\n case \"NZ$\":\r\n return \"NZD\"; // New Zealand Dollar\r\n case \"kr\":\r\n case \"Kr\":\r\n return \"SEK\"; // Swedish Krona (fallback, could be NOK or DKK)\r\n case \"zł\":\r\n return \"PLN\"; // Polish Zloty\r\n case \"Kč\":\r\n return \"CZK\"; // Czech Koruna\r\n case \"Ft\":\r\n return \"HUF\"; // Hungarian Forint\r\n case \"lei\":\r\n return \"RON\"; // Romanian Leu\r\n case \"лв\":\r\n return \"BGN\"; // Bulgarian Lev\r\n case \"kn\":\r\n return \"HRK\"; // Croatian Kuna\r\n case \"din\":\r\n return \"RSD\"; // Serbian Dinar\r\n case \"ден\":\r\n return \"MKD\"; // Macedonian Denar\r\n default:\r\n return \"EUR\"; // fallback\r\n }\r\n } catch (error) {\r\n /* c8 ignore start */\r\n return \"EUR\"; // safe fallback\r\n /* c8 ignore end */\r\n }\r\n};\r\n\r\n/******************************************************\r\n * ##: ISO Currency Code to Symbol Converter\r\n * Converts ISO 4217 currency codes to their corresponding symbols.\r\n *\r\n * Maps three-letter currency codes to common currency symbols.\r\n * Returns \"€\" as fallback for unknown currencies.\r\n * @param {string|null|undefined} currency ISO 4217 currency code (e.g., \"EUR\", \"GBP\", \"USD\")\r\n * @returns {string} Currency symbol (e.g., \"€\", \"£\", \"$\")\r\n * History:\r\n * 25-09-2025: Created\r\n ****************************************************/\r\nexport const currencyToSymbol = (\r\n currency: string | null | undefined\r\n): string => {\r\n try {\r\n if (!currency || typeof currency !== \"string\") {\r\n return \"€\";\r\n }\r\n\r\n const normalizedCurrency = currency.trim().toUpperCase();\r\n\r\n switch (normalizedCurrency) {\r\n case \"EUR\":\r\n return \"€\";\r\n case \"GBP\":\r\n return \"£\";\r\n case \"USD\":\r\n return \"$\";\r\n case \"JPY\":\r\n return \"¥\";\r\n case \"INR\":\r\n return \"₹\";\r\n case \"RUB\":\r\n return \"₽\";\r\n case \"CNY\":\r\n return \"¥\";\r\n case \"KRW\":\r\n return \"₩\"; // South Korean Won\r\n case \"ILS\":\r\n return \"₪\"; // Israeli Shekel\r\n case \"NGN\":\r\n return \"₦\"; // Nigerian Naira\r\n case \"PKR\":\r\n return \"₨\"; // Pakistani Rupee\r\n case \"PHP\":\r\n return \"₱\"; // Philippine Peso\r\n case \"VND\":\r\n return \"₫\"; // Vietnamese Dong\r\n case \"CRC\":\r\n return \"₡\"; // Costa Rican Colon\r\n case \"PYG\":\r\n return \"₲\"; // Paraguayan Guarani\r\n case \"UAH\":\r\n return \"₴\"; // Ukrainian Hryvnia\r\n case \"GHS\":\r\n return \"₵\"; // Ghanaian Cedi\r\n case \"KZT\":\r\n return \"₸\"; // Kazakhstani Tenge\r\n case \"TRY\":\r\n return \"₺\"; // Turkish Lira\r\n case \"AZN\":\r\n return \"₼\"; // Azerbaijani Manat\r\n case \"GEL\":\r\n return \"₾\"; // Georgian Lari\r\n case \"BTC\":\r\n return \"₿\"; // Bitcoin\r\n case \"SAR\":\r\n return \"﷼\"; // Saudi Riyal\r\n case \"ZAR\":\r\n return \"R\"; // South African Rand\r\n case \"BRL\":\r\n return \"R$\"; // Brazilian Real\r\n case \"CAD\":\r\n return \"C$\"; // Canadian Dollar\r\n case \"AUD\":\r\n return \"A$\"; // Australian Dollar\r\n case \"SGD\":\r\n return \"S$\"; // Singapore Dollar\r\n case \"HKD\":\r\n return \"HK$\"; // Hong Kong Dollar\r\n case \"NZD\":\r\n return \"NZ$\"; // New Zealand Dollar\r\n case \"SEK\":\r\n return \"kr\"; // Swedish Krona\r\n case \"NOK\":\r\n return \"kr\"; // Norwegian Krone\r\n case \"DKK\":\r\n return \"kr\"; // Danish Krone\r\n case \"PLN\":\r\n return \"zł\"; // Polish Zloty\r\n case \"CZK\":\r\n return \"Kč\"; // Czech Koruna\r\n case \"HUF\":\r\n return \"Ft\"; // Hungarian Forint\r\n case \"RON\":\r\n return \"lei\"; // Romanian Leu\r\n case \"BGN\":\r\n return \"лв\"; // Bulgarian Lev\r\n case \"HRK\":\r\n return \"kn\"; // Croatian Kuna\r\n case \"RSD\":\r\n return \"din\"; // Serbian Dinar\r\n case \"MKD\":\r\n return \"ден\"; // Macedonian Denar\r\n case \"CHF\":\r\n return \"CHF\"; // Swiss Franc (commonly written as CHF)\r\n case \"THB\":\r\n return \"฿\"; // Thai Baht\r\n case \"MYR\":\r\n return \"RM\"; // Malaysian Ringgit\r\n case \"IDR\":\r\n return \"Rp\"; // Indonesian Rupiah\r\n case \"CLP\":\r\n return \"$\"; // Chilean Peso (uses $ symbol)\r\n case \"COP\":\r\n return \"$\"; // Colombian Peso (uses $ symbol)\r\n case \"MXN\":\r\n return \"$\"; // Mexican Peso (uses $ symbol)\r\n case \"ARS\":\r\n return \"$\"; // Argentine Peso (uses $ symbol)\r\n case \"UYU\":\r\n return \"$\"; // Uruguayan Peso (uses $ symbol)\r\n case \"PEN\":\r\n return \"S/\"; // Peruvian Sol\r\n case \"BOB\":\r\n return \"Bs\"; // Bolivian Boliviano\r\n case \"EGP\":\r\n return \"£\"; // Egyptian Pound (uses £ symbol)\r\n case \"LBP\":\r\n return \"£\"; // Lebanese Pound (uses £ symbol)\r\n case \"SYP\":\r\n return \"£\"; // Syrian Pound (uses £ symbol)\r\n default:\r\n return \"€\"; // fallback\r\n }\r\n } catch (error) {\r\n /* c8 ignore start */\r\n return \"€\"; // safe fallback\r\n /* c8 ignore end */\r\n }\r\n};\r\n\r\n/* ======================================================================================\r\n * Deprecated aliases (backward-compatibility) - new function alias (if needed later)\r\n * ====================================================================================*/\r\n// Deprecated alias for previous provisional name\r\n/**\r\n * @deprecated Use `isNilTextOrEmpty` instead.\r\n */\r\nexport const isNullUndefinedOrEmptyEnforced = isNilTextOrEmpty;\r\n\r\n/* ======================================================================================\r\n * Deprecated aliases (backward-compatibility)\r\n * Keep until downstream code is migrated. Remove in a major release.\r\n * ====================================================================================*/\r\n/**\r\n * @deprecated Use `addThousandsSpace` instead.\r\n */\r\nexport const addSpaceBetweenNumbers = addThousandsSpace;\r\n","/******************************************************\r\n * ##: Portuguese Tax ID (NIF) Validator\r\n * Validates a Portuguese tax identification number (\"NIF\").\r\n *\r\n * Rules / Notes:\r\n * - Exactly 9 digits.\r\n * - Check digit (last digit) via Mod11 weights 9..2 over first 8 digits.\r\n * sum = Σ(d[i]*w[i]); mod = sum % 11; check = (mod < 2 ? 0 : 11 - mod).\r\n * - Allowed leading digits: 1,2,3,5,6,8,9.\r\n * - Strips non-digit characters.\r\n * - Rejects repeated digit sequences (e.g., 000000000).\r\n * @param value Raw input to validate (string or number)\r\n * @returns true if valid, otherwise false.\r\n * History:\r\n * 25-09-2025: Created as isValidPTTaxId\r\n ****************************************************/\r\nexport function isPTTaxId(value: string | number): boolean {\r\n try {\r\n if (value === null || value === undefined) return false;\r\n\r\n let nif = String(value).trim();\r\n // Strip any non-digit characters\r\n nif = nif.replace(/[^0-9]/g, \"\");\r\n\r\n if (nif.length !== 9) return false;\r\n if (!/^\\d{9}$/.test(nif)) return false;\r\n\r\n // Reject repeated digit sequences (all digits identical)\r\n if (/^(\\d)\\1{8}$/.test(nif)) return false;\r\n\r\n const first = nif[0];\r\n const defaultAllowed = new Set([\"1\", \"2\", \"3\", \"5\", \"6\", \"8\", \"9\"]);\r\n if (!defaultAllowed.has(first)) return false;\r\n\r\n // Compute control digit with weights 9..2\r\n let sum = 0;\r\n for (let i = 0; i < 8; i++) {\r\n const digit = parseInt(nif[i], 10);\r\n const weight = 9 - i; // i=0 => 9 ... i=7 => 2\r\n sum += digit * weight;\r\n }\r\n const mod11 = sum % 11;\r\n const checkDigit = mod11 < 2 ? 0 : 11 - mod11;\r\n return checkDigit === parseInt(nif[8], 10);\r\n } catch {\r\n /* c8 ignore start */\r\n return false; // Defensive fallback: any unexpected error results in invalid\r\n /* c8 ignore end */\r\n }\r\n}\r\n\r\n/**\r\n * @deprecated Use isPTTaxId instead.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport const isValidPTTaxId = isPTTaxId;\r\n","/******************************************************\r\n * ##: IBAN (International Bank Account Number) Validator\r\n * Validates International Bank Account Numbers according to ISO 13616.\r\n *\r\n * Rules / Notes:\r\n * - Country-specific format and length validation\r\n * - MOD-97 checksum validation\r\n * - BBAN (Basic Bank Account Number) format validation\r\n * - Supports all IBAN registry countries\r\n * - Strips spaces and formatting automatically\r\n * @param value Raw IBAN input to validate (string)\r\n * @returns true if valid IBAN, otherwise false.\r\n * History:\r\n * 25-09-2025: Adapted from ibantools library for SalesPark toolkit\r\n ****************************************************/\r\nexport function isValidIBAN(value: string): boolean {\r\n try {\r\n if (!value || typeof value !== \"string\") return false;\r\n\r\n // Strip formatting and convert to uppercase\r\n const iban = value.replace(/[\\s-]/g, \"\").toUpperCase();\r\n\r\n // Basic length and format check\r\n if (iban.length < 15 || iban.length > 34) return false;\r\n if (!/^[A-Z]{2}[0-9]{2}[A-Z0-9]+$/.test(iban)) return false;\r\n\r\n const countryCode = iban.slice(0, 2);\r\n const spec = countrySpecs[countryCode];\r\n\r\n // Check if country is supported\r\n if (!spec?.bban_regexp || !spec.chars) return false;\r\n\r\n // Verify length matches country specification\r\n if (spec.chars !== iban.length) return false;\r\n\r\n // Verify checksum digits are numeric\r\n if (!/^[0-9]{2}$/.test(iban.slice(2, 4))) return false;\r\n\r\n // Validate BBAN format\r\n const bban = iban.slice(4);\r\n if (!new RegExp(spec.bban_regexp).test(bban)) return false;\r\n\r\n // Validate BBAN with country-specific rules if available\r\n if (spec.bban_validation_func && !spec.bban_validation_func(bban))\r\n return false;\r\n\r\n // Validate IBAN checksum using MOD-97\r\n return isValidIBANChecksum(iban);\r\n } catch {\r\n /* c8 ignore start */\r\n return false; // Defensive fallback for any unexpected errors\r\n /* c8 ignore end */\r\n }\r\n}\r\n\r\n/******************************************************\r\n * ##: IBAN Checksum Validator\r\n * Validates IBAN checksum using MOD-97 algorithm per ISO 13616.\r\n *\r\n * Algorithm:\r\n * 1. Move country code and check digits to end\r\n * 2. Replace letters with numbers (A=10, B=11, ..., Z=35)\r\n * 3. Calculate MOD-97 of the resulting number\r\n * 4. Valid if remainder equals 1\r\n * @param iban Complete IBAN string to validate\r\n * @returns true if checksum is valid, otherwise false\r\n * History:\r\n * 25-09-2025: Created for IBAN validation\r\n ****************************************************/\r\nfunction isValidIBANChecksum(iban: string): boolean {\r\n // Rearrange: move first 4 chars to end\r\n const rearranged = iban.slice(4) + iban.slice(0, 4);\r\n\r\n // Replace letters with numbers (A=10, B=11, ..., Z=35)\r\n const numericString = rearranged\r\n .split(\"\")\r\n .map((char) => {\r\n const code = char.charCodeAt(0);\r\n return code >= 65 ? (code - 55).toString() : char;\r\n })\r\n .join(\"\");\r\n\r\n // Calculate MOD-97\r\n return mod97(numericString) === 1;\r\n}\r\n\r\n/******************************************************\r\n * ##: MOD-97 Calculator\r\n * Calculates MOD-97 for large numbers as strings to avoid overflow.\r\n *\r\n * Process chunks of max 9 digits to stay within JavaScript number limits\r\n * while maintaining precision for the modulo operation.\r\n * @param numStr Numeric string to calculate MOD-97 for\r\n * @returns MOD-97 remainder\r\n * History:\r\n * 25-09-2025: Created for IBAN checksum validation\r\n ****************************************************/\r\nfunction mod97(numStr: string): number {\r\n let remainder = numStr;\r\n\r\n while (remainder.length > 2) {\r\n const chunk = remainder.slice(0, 9); // Max 9 digits to avoid overflow\r\n const chunkNum = parseInt(chunk, 10);\r\n\r\n if (isNaN(chunkNum)) return NaN;\r\n\r\n remainder = (chunkNum % 97) + remainder.slice(chunk.length);\r\n }\r\n\r\n return parseInt(remainder, 10) % 97;\r\n}\r\n\r\n/******************************************************\r\n * ##: Country Specification Interface\r\n * Defines structure for IBAN country specifications.\r\n * History:\r\n * 25-09-2025: Created for IBAN validation\r\n ****************************************************/\r\ninterface CountrySpec {\r\n chars?: number; // Total IBAN length for country\r\n bban_regexp?: string; // BBAN format regex\r\n bban_validation_func?: (bban: string) => boolean; // Custom validation\r\n IBANRegistry?: boolean; // Official IBAN registry member\r\n SEPA?: boolean; // SEPA member country\r\n}\r\n\r\n/******************************************************\r\n * ##: IBAN Country Specifications\r\n * Country-specific IBAN format definitions and validation rules.\r\n * Based on IBAN Registry and includes SEPA membership status.\r\n * History:\r\n * 25-09-2025: Adapted from ibantools library\r\n ****************************************************/\r\nconst countrySpecs: Record<string, CountrySpec> = {\r\n AD: {\r\n chars: 24,\r\n bban_regexp: \"^[0-9]{8}[A-Z0-9]{12}$\",\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n AE: { chars: 23, bban_regexp: \"^[0-9]{3}[0-9]{16}$\", IBANRegistry: true },\r\n AL: { chars: 28, bban_regexp: \"^[0-9]{8}[A-Z0-9]{16}$\", IBANRegistry: true },\r\n AT: { chars: 20, bban_regexp: \"^[0-9]{16}$\", IBANRegistry: true, SEPA: true },\r\n AZ: { chars: 28, bban_regexp: \"^[A-Z]{4}[A-Z0-9]{20}$\", IBANRegistry: true },\r\n BA: {\r\n chars: 20,\r\n bban_regexp: \"^[0-9]{16}$\",\r\n bban_validation_func: checkMod97BBAN,\r\n IBANRegistry: true,\r\n },\r\n BE: {\r\n chars: 16,\r\n bban_regexp: \"^[0-9]{12}$\",\r\n bban_validation_func: checkBelgianBBAN,\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n BG: {\r\n chars: 22,\r\n bban_regexp: \"^[A-Z]{4}[0-9]{6}[A-Z0-9]{8}$\",\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n BH: { chars: 22, bban_regexp: \"^[A-Z]{4}[A-Z0-9]{14}$\", IBANRegistry: true },\r\n BR: {\r\n chars: 29,\r\n bban_regexp: \"^[0-9]{23}[A-Z]{1}[A-Z0-9]{1}$\",\r\n IBANRegistry: true,\r\n },\r\n BY: {\r\n chars: 28,\r\n bban_regexp: \"^[A-Z]{4}[0-9]{4}[A-Z0-9]{16}$\",\r\n IBANRegistry: true,\r\n },\r\n CH: {\r\n chars: 21,\r\n bban_regexp: \"^[0-9]{5}[A-Z0-9]{12}$\",\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n CR: { chars: 22, bban_regexp: \"^[0-9]{18}$\", IBANRegistry: true },\r\n CY: {\r\n chars: 28,\r\n bban_regexp: \"^[0-9]{8}[A-Z0-9]{16}$\",\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n CZ: {\r\n chars: 24,\r\n bban_regexp: \"^[0-9]{20}$\",\r\n bban_validation_func: checkCzechSlovakBBAN,\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n DE: { chars: 22, bban_regexp: \"^[0-9]{18}$\", IBANRegistry: true, SEPA: true },\r\n DK: { chars: 18, bban_regexp: \"^[0-9]{14}$\", IBANRegistry: true, SEPA: true },\r\n DO: { chars: 28, bban_regexp: \"^[A-Z]{4}[0-9]{20}$\", IBANRegistry: true },\r\n EE: {\r\n chars: 20,\r\n bban_regexp: \"^[0-9]{16}$\",\r\n bban_validation_func: checkEstonianBBAN,\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n EG: { chars: 29, bban_regexp: \"^[0-9]{25}$\", IBANRegistry: true },\r\n ES: {\r\n chars: 24,\r\n bban_regexp: \"^[0-9]{20}$\",\r\n bban_validation_func: checkSpanishBBAN,\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n FI: { chars: 18, bban_regexp: \"^[0-9]{14}$\", IBANRegistry: true, SEPA: true },\r\n FO: { chars: 18, bban_regexp: \"^[0-9]{14}$\", IBANRegistry: true },\r\n FR: {\r\n chars: 27,\r\n bban_regexp: \"^[0-9]{10}[A-Z0-9]{11}[0-9]{2}$\",\r\n bban_validation_func: checkFrenchBBAN,\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n GB: {\r\n chars: 22,\r\n bban_regexp: \"^[A-Z]{4}[0-9]{14}$\",\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n GE: { chars: 22, bban_regexp: \"^[A-Z0-9]{2}[0-9]{16}$\", IBANRegistry: true },\r\n GI: {\r\n chars: 23,\r\n bban_regexp: \"^[A-Z]{4}[A-Z0-9]{15}$\",\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n GL: { chars: 18, bban_regexp: \"^[0-9]{14}$\", IBANRegistry: true },\r\n GR: {\r\n chars: 27,\r\n bban_regexp: \"^[0-9]{7}[A-Z0-9]{16}$\",\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n GT: { chars: 28, bban_regexp: \"^[A-Z0-9]{24}$\", IBANRegistry: true },\r\n HR: {\r\n chars: 21,\r\n bban_regexp: \"^[0-9]{17}$\",\r\n bban_validation_func: checkCroatianBBAN,\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n HU: {\r\n chars: 28,\r\n bban_regexp: \"^[0-9]{24}$\",\r\n bban_validation_func: checkHungarianBBAN,\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n IE: {\r\n chars: 22,\r\n bban_regexp: \"^[A-Z0-9]{4}[0-9]{14}$\",\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n IL: { chars: 23, bban_regexp: \"^[0-9]{19}$\", IBANRegistry: true },\r\n IS: { chars: 26, bban_regexp: \"^[0-9]{22}$\", IBANRegistry: true, SEPA: true },\r\n IT: {\r\n chars: 27,\r\n bban_regexp: \"^[A-Z]{1}[0-9]{10}[A-Z0-9]{12}$\",\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n JO: {\r\n chars: 30,\r\n bban_regexp: \"^[A-Z]{4}[0-9]{4}[A-Z0-9]{18}$\",\r\n IBANRegistry: true,\r\n },\r\n KW: { chars: 30, bban_regexp: \"^[A-Z]{4}[A-Z0-9]{22}$\", IBANRegistry: true },\r\n KZ: { chars: 20, bban_regexp: \"^[0-9]{3}[A-Z0-9]{13}$\", IBANRegistry: true },\r\n LB: { chars: 28, bban_regexp: \"^[0-9]{4}[A-Z0-9]{20}$\", IBANRegistry: true },\r\n LC: { chars: 32, bban_regexp: \"^[A-Z]{4}[A-Z0-9]{24}$\", IBANRegistry: true },\r\n LI: {\r\n chars: 21,\r\n bban_regexp: \"^[0-9]{5}[A-Z0-9]{12}$\",\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n LT: { chars: 20, bban_regexp: \"^[0-9]{16}$\", IBANRegistry: true, SEPA: true },\r\n LU: {\r\n chars: 20,\r\n bban_regexp: \"^[0-9]{3}[A-Z0-9]{13}$\",\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n LV: {\r\n chars: 21,\r\n bban_regexp: \"^[A-Z]{4}[A-Z0-9]{13}$\",\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n MC: {\r\n chars: 27,\r\n bban_regexp: \"^[0-9]{10}[A-Z0-9]{11}[0-9]{2}$\",\r\n bban_validation_func: checkFrenchBBAN,\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n MD: {\r\n chars: 24,\r\n bban_regexp: \"^[A-Z0-9]{2}[A-Z0-9]{18}$\",\r\n IBANRegistry: true,\r\n },\r\n ME: {\r\n chars: 22,\r\n bban_regexp: \"^[0-9]{18}$\",\r\n bban_validation_func: checkMod97BBAN,\r\n IBANRegistry: true,\r\n },\r\n MK: {\r\n chars: 19,\r\n bban_regexp: \"^[0-9]{3}[A-Z0-9]{10}[0-9]{2}$\",\r\n bban_validation_func: checkMod97BBAN,\r\n IBANRegistry: true,\r\n },\r\n MR: { chars: 27, bban_regexp: \"^[0-9]{23}$\", IBANRegistry: true },\r\n MT: {\r\n chars: 31,\r\n bban_regexp: \"^[A-Z]{4}[0-9]{5}[A-Z0-9]{18}$\",\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n MU: {\r\n chars: 30,\r\n bban_regexp: \"^[A-Z]{4}[0-9]{19}[A-Z]{3}$\",\r\n IBANRegistry: true,\r\n },\r\n NL: {\r\n chars: 18,\r\n bban_regexp: \"^[A-Z]{4}[0-9]{10}$\",\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n NO: {\r\n chars: 15,\r\n bban_regexp: \"^[0-9]{11}$\",\r\n bban_validation_func: checkNorwegianBBAN,\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n PK: { chars: 24, bban_regexp: \"^[A-Z0-9]{4}[0-9]{16}$\", IBANRegistry: true },\r\n PL: {\r\n chars: 28,\r\n bban_regexp: \"^[0-9]{24}$\",\r\n bban_validation_func: checkPolishBBAN,\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n PS: { chars: 29, bban_regexp: \"^[A-Z0-9]{4}[0-9]{21}$\", IBANRegistry: true },\r\n PT: {\r\n chars: 25,\r\n bban_regexp: \"^[0-9]{21}$\",\r\n bban_validation_func: checkMod97BBAN,\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n QA: { chars: 29, bban_regexp: \"^[A-Z]{4}[A-Z0-9]{21}$\", IBANRegistry: true },\r\n RO: {\r\n chars: 24,\r\n bban_regexp: \"^[A-Z]{4}[A-Z0-9]{16}$\",\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n RS: {\r\n chars: 22,\r\n bban_regexp: \"^[0-9]{18}$\",\r\n bban_validation_func: checkMod97BBAN,\r\n IBANRegistry: true,\r\n },\r\n SA: { chars: 24, bban_regexp: \"^[0-9]{2}[A-Z0-9]{18}$\", IBANRegistry: true },\r\n SE: { chars: 24, bban_regexp: \"^[0-9]{20}$\", IBANRegistry: true, SEPA: true },\r\n SI: {\r\n chars: 19,\r\n bban_regexp: \"^[0-9]{15}$\",\r\n bban_validation_func: checkMod97BBAN,\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n SK: {\r\n chars: 24,\r\n bban_regexp: \"^[0-9]{20}$\",\r\n bban_validation_func: checkCzechSlovakBBAN,\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n SM: {\r\n chars: 27,\r\n bban_regexp: \"^[A-Z]{1}[0-9]{10}[A-Z0-9]{12}$\",\r\n IBANRegistry: true,\r\n SEPA: true,\r\n },\r\n TN: { chars: 24, bban_regexp: \"^[0-9]{20}$\", IBANRegistry: true },\r\n TR: { chars: 26, bban_regexp: \"^[0-9]{5}[A-Z0-9]{17}$\", IBANRegistry: true },\r\n UA: { chars: 29, bban_regexp: \"^[0-9]{6}[A-Z0-9]{19}$\", IBANRegistry: true },\r\n VG: { chars: 24, bban_regexp: \"^[A-Z0-9]{4}[0-9]{16}$\", IBANRegistry: true },\r\n XK: { chars: 20, bban_regexp: \"^[0-9]{16}$\", IBANRegistry: true },\r\n};\r\n\r\n/******************************************************\r\n * ##: MOD-97 BBAN Validator\r\n * Validates BBAN using MOD-97 algorithm for specific countries.\r\n *\r\n * Used by countries like Portugal, Slovenia, Serbia, etc.\r\n * that use MOD-97 checksum validation for their BBAN format.\r\n * @param bban Basic Bank Account Number to validate\r\n * @returns true if BBAN passes MOD-97 validation, otherwise false\r\n * History:\r\n * 25-09-2025: Created for country-specific IBAN validation\r\n ****************************************************/\r\nfunction checkMod97BBAN(bban: string): boolean {\r\n const stripped = bban.replace(/[\\s.]+/g, \"\");\r\n return mod97(stripped) === 1;\r\n}\r\n\r\n/******************************************************\r\n * ##: Belgian BBAN Validator\r\n * Validates Belgian BBAN format using national checksum algorithm.\r\n *\r\n * Belgian IBANs use a specific checksum calculation where the\r\n * remainder of account number divided by 97 must equal the control digits.\r\n * @param bban Basic Bank Account Number to validate (12 digits)\r\n * @returns true if BBAN passes Belgian validation, otherwise false\r\n * History:\r\n * 25-09-2025: Created for Belgian IBAN validation\r\n ****************************************************/\r\nfunction checkBelgianBBAN(bban: string): boolean {\r\n const stripped = bban.replace(/[\\s.]+/g, \"\");\r\n const checkingPart = parseInt(stripped.substring(0, stripped.length - 2), 10);\r\n const checksum = parseInt(stripped.substring(stripped.length - 2), 10);\r\n const remainder = checkingPart % 97 === 0 ? 97 : checkingPart % 97;\r\n return remainder === checksum;\r\n}\r\n\r\n/******************************************************\r\n * ##: Czech/Slovak BBAN Validator\r\n * Validates Czech Republic and Slovakia BBAN format using weighted checksums.\r\n *\r\n * Both countries use similar validation with weighted digit calculations\r\n * for prefix (positions 4-9) and suffix (positions 10-19) sections.\r\n * @param bban Basic Bank Account Number to validate (20 digits)\r\n * @returns true if BBAN passes Czech/Slovak validation, otherwise false\r\n * History:\r\n * 25-09-2025: Created for Czech Republic and Slovakia IBAN validation\r\n ****************************************************/\r\nfunction checkCzechSlovakBBAN(bban: string): boolean {\r\n const weightsPrefix = [10, 5, 8, 4, 2, 1];\r\n const weightsSuffix = [6, 3, 7, 9, 10, 5, 8, 4, 2, 1];\r\n const controlPrefix = parseInt(bban.charAt(9), 10);\r\n const controlSuffix = parseInt(bban.charAt(19), 10);\r\n const prefix = bban.substring(4, 9);\r\n const suffix = bban.substring(10, 19);\r\n\r\n let sum = 0;\r\n for (let i = 0; i < prefix.length; i++) {\r\n sum += parseInt(prefix.charAt(i), 10) * weightsPrefix[i];\r\n }\r\n let remainder = sum % 11;\r\n if (\r\n controlPrefix !==\r\n (remainder === 0 ? 0 : remainder === 1 ? 1 : 11 - remainder)\r\n ) {\r\n return false;\r\n }\r\n\r\n sum = 0;\r\n for (let i = 0; i < suffix.length; i++) {\r\n sum += parseInt(suffix.charAt(i), 10) * weightsSuffix[i];\r\n }\r\n remainder = sum % 11;\r\n return (\r\n controlSuffix ===\r\n (remainder === 0 ? 0 : remainder === 1 ? 1 : 11 - remainder)\r\n );\r\n}\r\n\r\n/******************************************************\r\n * ##: Estonian BBAN Validator\r\n * Validates Estonian BBAN format using weighted checksum algorithm.\r\n *\r\n * Estonian IBANs use weighted digit calculation with specific weights\r\n * applied to positions 2-14, with control digit at position 15.\r\n * @param bban Basic Bank Account Number to validate (16 digits)\r\n * @returns true if BBAN passes Estonian validation, otherwise false\r\n * History:\r\n * 25-09-2025: Created for Estonian IBAN validation\r\n ****************************************************/\r\nfunction checkEstonianBBAN(bban: string): boolean {\r\n const weights = [7, 1, 3, 7, 1, 3, 7, 1, 3, 7, 1, 3, 7];\r\n const controlDigit = parseInt(bban.charAt(15), 10);\r\n const toCheck = bban.substring(2, 15);\r\n let sum = 0;\r\n for (let i = 0; i < toCheck.length; i++) {\r\n sum += parseInt(toCheck.charAt(i), 10) * weights[i];\r\n }\r\n const remainder = sum % 10;\r\n return controlDigit === (remainder === 0 ? 0 : 10 - remainder);\r\n}\r\n\r\n/******************************************************\r\n * ##: Spanish BBAN Validator\r\n * Validates Spanish BBAN format using dual checksum algorithm.\r\n *\r\n * Spanish IBANs have two control digits: one for bank/branch (position 8)\r\n * and one for account number (position 9), each with specific weights.\r\n * @param bban Basic Bank Account Number to validate (20 digits)\r\n * @returns true if BBAN passes Spanish validation, otherwise false\r\n * History:\r\n * 25-09-2025: Created for Spanish IBAN validation\r\n ****************************************************/\r\nfunction checkSpanishBBAN(bban: string): boolean {\r\n const weightsBankBranch = [4, 8, 5, 10, 9, 7, 3, 6];\r\n const weightsAccount = [1, 2, 4, 8, 5, 10, 9, 7, 3, 6];\r\n const controlBankBranch = parseInt(bban.charAt(8), 10);\r\n const controlAccount = parseInt(bban.charAt(9), 10);\r\n const bankBranch = bban.substring(0, 8);\r\n const account = bban.substring(10, 20);\r\n\r\n let sum = 0;\r\n for (let i = 0; i < 8; i++) {\r\n sum += parseInt(bankBranch.charAt(i), 10) * weightsBankBranch[i];\r\n }\r\n let remainder = sum % 11;\r\n if (\r\n controlBankBranch !==\r\n (remainder === 0 ? 0 : remainder === 1 ? 1 : 11 - remainder)\r\n ) {\r\n return false;\r\n }\r\n\r\n sum = 0;\r\n for (let i = 0; i < 10; i++) {\r\n sum += parseInt(account.charAt(i), 10) * weightsAccount[i];\r\n }\r\n remainder = sum % 11;\r\n return (\r\n controlAccount ===\r\n (remainder === 0 ? 0 : remainder === 1 ? 1 : 11 - remainder)\r\n );\r\n}\r\n\r\n/******************************************************\r\n * ##: French/Monaco BBAN Validator\r\n * Validates French and Monaco BBAN format using character conversion and MOD-97.\r\n *\r\n * French IBANs convert letters to numbers using specific mapping (A/J=1, B/K/S=2, etc.)\r\n * then apply MOD-97 validation. Also used by Monaco (MC).\r\n * @param bban Basic Bank Account Number to validate (23 characters)\r\n * @returns true if BBAN passes French validation, otherwise false\r\n * History:\r\n * 25-09-2025: Created for French and Monaco IBAN validation\r\n ****************************************************/\r\nfunction checkFrenchBBAN(bban: string): boolean {\r\n const stripped = bban.replace(/[\\s.]+/g, \"\");\r\n const normalized = Array.from(stripped);\r\n\r\n for (let i = 0; i < stripped.length; i++) {\r\n const c = normalized[i].charCodeAt(0);\r\n if (c >= 65) {\r\n switch (c) {\r\n case 65:\r\n case 74:\r\n normalized[i] = \"1\";\r\n break;\r\n case 66:\r\n case 75:\r\n case 83:\r\n normalized[i] = \"2\";\r\n break;\r\n case 67:\r\n case 76:\r\n case 84:\r\n normalized[i] = \"3\";\r\n break;\r\n case 68:\r\n case 77:\r\n case 85:\r\n normalized[i] = \"4\";\r\n break;\r\n case 69:\r\n case 78:\r\n case 86:\r\n normalized[i] = \"5\";\r\n break;\r\n case 70:\r\n case 79:\r\n case 87:\r\n normalized[i] = \"6\";\r\n break;\r\n case 71:\r\n case 80:\r\n case 88:\r\n normalized[i] = \"7\";\r\n break;\r\n case 72:\r\n case 81:\r\n case 89:\r\n normalized[i] = \"8\";\r\n break;\r\n case 73:\r\n case 82:\r\n case 90:\r\n normalized[i] = \"9\";\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return mod97(normalized.join(\"\")) === 0;\r\n}\r\n\r\n/******************************************************\r\n * ##: Croatian BBAN Validator\r\n * Validates Croatian BBAN format using dual MOD-11 checksums.\r\n *\r\n * Croatian IBANs have two control digits: one for bank/branch (position 6)\r\n * and one for account number (position 16), both using MOD-11 algorithm.\r\n * @param bban Basic Bank Account Number to validate (17 digits)\r\n * @returns true if BBAN passes Croatian validation, otherwise false\r\n * History:\r\n * 25-09-2025: Created for Croatian IBAN validation\r\n ****************************************************/\r\nfunction checkCroatianBBAN(bban: string): boolean {\r\n const controlBankBranch = parseInt(bban.charAt(6), 10);\r\n const controlAccount = parseInt(bban.charAt(16), 10);\r\n const bankBranch = bban.substring(0, 6);\r\n const account = bban.substring(7, 16);\r\n\r\n return (\r\n checkMod11(bankBranch, controlBankBranch) &&\r\n checkMod11(account, controlAccount)\r\n );\r\n}\r\n\r\n/******************************************************\r\n * ##: MOD-11 Checksum Validator\r\n * Validates number sequence using MOD-11 algorithm with specific rules.\r\n *\r\n * Implementation of MOD-11 algorithm used by Croatian and other\r\n * banking systems for account number validation.\r\n * @param toCheck Number sequence to validate (string of digits)\r\n * @param control Expected control digit for validation\r\n * @returns true if control digit matches MOD-11 calculation, otherwise false\r\n * History:\r\n * 25-09-2025: Created for Croatian IBAN validation\r\n ****************************************************/\r\nfunction checkMod11(toCheck: string, control: number): boolean {\r\n let nr = 10;\r\n for (let i = 0; i < toCheck.length; i++) {\r\n nr += parseInt(toCheck.charAt(i), 10);\r\n if (nr % 10 !== 0) {\r\n nr = nr % 10;\r\n }\r\n nr = nr * 2;\r\n nr = nr % 11;\r\n }\r\n return control === (11 - nr === 10 ? 0 : 11 - nr);\r\n}\r\n\r\n/******************************************************\r\n * ##: Hungarian BBAN Validator\r\n * Validates Hungarian BBAN format using weighted checksums with special rules.\r\n *\r\n * Hungarian IBANs use weighted digit validation for bank/branch control\r\n * and different logic for account validation based on account type.\r\n * @param bban Basic Bank Account Number to validate (24 digits)\r\n * @returns true if BBAN passes Hungarian validation, otherwise false\r\n * History:\r\n * 25-09-2025: Created for Hungarian IBAN validation\r\n ****************************************************/\r\nfunction checkHungarianBBAN(bban: string): boolean {\r\n const weights = [9, 7, 3, 1, 9, 7, 3, 1, 9, 7, 3, 1, 9, 7, 3];\r\n const controlDigitBankBranch = parseInt(bban.charAt(7), 10);\r\n const toCheckBankBranch = bban.substring(0, 7);\r\n\r\n let sum = 0;\r\n for (let i = 0; i < toCheckBankBranch.length; i++) {\r\n sum += parseInt(toCheckBankBranch.charAt(i), 10) * weights[i];\r\n }\r\n const remainder = sum % 10;\r\n if (controlDigitBankBranch !== (remainder === 0 ? 0 : 10 - remainder)) {\r\n return false;\r\n }\r\n\r\n if (bban.endsWith(\"00000000\")) {\r\n const toCheckAccount = bban.substring(8, 15);\r\n const controlDigitAccount = parseInt(bban.charAt(15), 10);\r\n sum = 0;\r\n for (let i = 0; i < toCheckAccount.length; i++) {\r\n sum += parseInt(toCheckAccount.charAt(i), 10) * weights[i];\r\n }\r\n const accountRemainder = sum % 10;\r\n return (\r\n controlDigitAccount ===\r\n (accountRemainder === 0 ? 0 : 10 - accountRemainder)\r\n );\r\n } else {\r\n const toCheckAccount = bban.substring(8, 23);\r\n const controlDigitAccount = parseInt(bban.charAt(23), 10);\r\n sum = 0;\r\n for (let i = 0; i < toCheckAccount.length; i++) {\r\n sum += parseInt(toCheckAccount.charAt(i), 10) * weights[i];\r\n }\r\n const accountRemainder = sum % 10;\r\n return (\r\n controlDigitAccount ===\r\n (accountRemainder === 0 ? 0 : 10 - accountRemainder)\r\n );\r\n }\r\n}\r\n\r\n/******************************************************\r\n * ##: Norwegian BBAN Validator\r\n * Validates Norwegian BBAN format using weighted checksum algorithm.\r\n *\r\n * Norwegian IBANs use weighted digit calculation with specific weights\r\n * applied to first 10 digits, with control digit at position 10.\r\n * @param bban Basic Bank Account Number to validate (11 digits)\r\n * @returns true if BBAN passes Norwegian validation, otherwise false\r\n * History:\r\n * 25-09-2025: Created for Norwegian IBAN validation\r\n ****************************************************/\r\nfunction checkNorwegianBBAN(bban: string): boolean {\r\n const weights = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2];\r\n const stripped = bban.replace(/[\\s.]+/g, \"\");\r\n const controlDigit = parseInt(stripped.charAt(10), 10);\r\n const toCheck = stripped.substring(0, 10);\r\n\r\n let sum = 0;\r\n for (let i = 0; i < 10; i++) {\r\n sum += parseInt(toCheck.charAt(i), 10) * weights[i];\r\n }\r\n const remainder = sum % 11;\r\n return controlDigit === (remainder === 0 ? 0 : 11 - remainder);\r\n}\r\n\r\n/******************************************************\r\n * ##: Polish BBAN Validator\r\n * Validates Polish BBAN format using weighted checksum algorithm.\r\n *\r\n * Polish IBANs use weighted digit calculation with specific weights\r\n * applied to first 7 digits, with control digit at position 7.\r\n * @param bban Basic Bank Account Number to validate (24 digits)\r\n * @returns true if BBAN passes Polish validation, otherwise false\r\n * History:\r\n * 25-09-2025: Created for Polish IBAN validation\r\n ****************************************************/\r\nfunction checkPolishBBAN(bban: string): boolean {\r\n const weights = [3, 9, 7, 1, 3, 9, 7];\r\n const controlDigit = parseInt(bban.charAt(7), 10);\r\n const toCheck = bban.substring(0, 7);\r\n\r\n let sum = 0;\r\n for (let i = 0; i < 7; i++) {\r\n sum += parseInt(toCheck.charAt(i), 10) * weights[i];\r\n }\r\n const remainder = sum % 10;\r\n return controlDigit === (remainder === 0 ? 0 : 10 - remainder);\r\n}\r\n","/******************************************************\r\n * ##: Markdown Security Checker\r\n * Analyzes markdown text for potential security risks and XSS vulnerabilities.\r\n *\r\n * Detects dangerous HTML tags, JavaScript injection attempts, suspicious protocols,\r\n * and other security threats. Provides sanitized output with detailed risk assessment.\r\n * @param {string|null|undefined} markdownText Markdown content to analyze\r\n * @returns {{isValid: boolean, text: string, risks: Array}} Security analysis result\r\n * History:\r\n * 25-09-2025: Created\r\n ****************************************************/\r\n\r\nexport interface SecurityRisk {\r\n type: string;\r\n description: string;\r\n severity?: 'low' | 'medium' | 'high' | 'critical';\r\n}\r\n\r\nexport interface SecurityCheckResult {\r\n isValid: boolean;\r\n text: string;\r\n risks: SecurityRisk[];\r\n sanitized: boolean;\r\n}\r\n\r\nexport const checkMarkdownSecurity = (\r\n markdownText: string | null | undefined\r\n): SecurityCheckResult => {\r\n // Early return if no text is provided\r\n if (!markdownText || typeof markdownText !== 'string') {\r\n return { \r\n isValid: true, \r\n text: \"\", \r\n risks: [],\r\n sanitized: false\r\n };\r\n }\r\n\r\n // Initialize security check result\r\n const securityCheck: SecurityCheckResult = {\r\n isValid: true,\r\n text: markdownText,\r\n risks: [],\r\n sanitized: false,\r\n };\r\n\r\n // Enhanced security patterns with severity levels\r\n const securityPatterns = {\r\n // Critical risks\r\n scriptTags: {\r\n pattern: /<\\s*script\\b[^>]*>[\\s\\S]*?<\\s*\\/\\s*script\\s*>/gi,\r\n severity: 'critical' as const,\r\n description: 'Script tags detected - high XSS risk',\r\n },\r\n eventHandlers: {\r\n pattern: /on\\w+\\s*=\\s*[\"'][^\"']*[\"']/gi,\r\n severity: 'critical' as const,\r\n description: 'JavaScript event handlers detected',\r\n },\r\n javascriptUrls: {\r\n pattern: /javascript\\s*:[^\"'\\s>]*/gi,\r\n severity: 'critical' as const,\r\n description: 'JavaScript URLs detected',\r\n },\r\n\r\n // High risks\r\n iframes: {\r\n pattern: /<\\s*iframe\\b[^>]*>[\\s\\S]*?<\\s*\\/\\s*iframe\\s*>/gi,\r\n severity: 'high' as const,\r\n description: 'Iframe elements detected - potential embedding risk',\r\n },\r\n objectTags: {\r\n pattern: /<\\s*object\\b[^>]*>[\\s\\S]*?<\\s*\\/\\s*object\\s*>/gi,\r\n severity: 'high' as const,\r\n description: 'Object tags detected - potential code execution',\r\n },\r\n embedTags: {\r\n pattern: /<\\s*embed\\b[^>]*>[\\s\\S]*?<\\s*\\/\\s*embed\\s*>/gi,\r\n severity: 'high' as const,\r\n description: 'Embed tags detected - potential code execution',\r\n },\r\n formTags: {\r\n pattern: /<\\s*form\\b[^>]*>[\\s\\S]*?<\\s*\\/\\s*form\\s*>/gi,\r\n severity: 'high' as const,\r\n description: 'Form elements detected - potential data submission risk',\r\n },\r\n\r\n // Medium risks\r\n dataUrls: {\r\n pattern: /data:\\s*[^,\\s]+,[^\"'\\s)>]*/gi,\r\n severity: 'medium' as const,\r\n description: 'Data URLs detected - potential data exfiltration',\r\n },\r\n baseTags: {\r\n pattern: /<\\s*base\\b[^>]*\\/?>/gi,\r\n severity: 'medium' as const,\r\n description: 'Base tags detected - potential URL hijacking',\r\n },\r\n styleTags: {\r\n pattern: /<\\s*style\\b[^>]*>[\\s\\S]*?<\\s*\\/\\s*style\\s*>/gi,\r\n severity: 'medium' as const,\r\n description: 'Style tags detected - potential CSS injection',\r\n },\r\n linkTags: {\r\n pattern: /<\\s*link\\b[^>]*\\/?>/gi,\r\n severity: 'medium' as const,\r\n description: 'Link tags detected - potential resource hijacking',\r\n },\r\n\r\n // Low risks\r\n metaTags: {\r\n pattern: /<\\s*meta\\b[^>]*\\/?>/gi,\r\n severity: 'low' as const,\r\n description: 'Meta tags detected - potential information disclosure',\r\n },\r\n };\r\n\r\n // Additional security checks\r\n const additionalChecks = [\r\n {\r\n pattern: /(file|ftp|ws|wss|gopher|ldap|telnet):/gi,\r\n type: \"suspiciousProtocol\",\r\n description: \"Suspicious URL protocol detected\",\r\n severity: 'high' as const,\r\n },\r\n {\r\n pattern: /(contenteditable|autofocus|formaction|srcdoc|srclang)/gi,\r\n type: \"dangerousAttributes\",\r\n description: \"Potentially dangerous HTML attributes detected\",\r\n severity: 'medium' as const,\r\n },\r\n {\r\n pattern: /(expression|eval|setTimeout|setInterval|Function|constructor)/gi,\r\n type: \"dangerousJavaScript\",\r\n description: \"Potentially dangerous JavaScript functions detected\",\r\n severity: 'high' as const,\r\n },\r\n {\r\n pattern: /(vbscript|livescript|mocha):/gi,\r\n type: \"dangerousScriptProtocol\",\r\n description: \"Dangerous scripting protocols detected\",\r\n severity: 'critical' as const,\r\n },\r\n {\r\n pattern: /<!--[\\s\\S]*?-->/g,\r\n type: \"htmlComments\",\r\n description: \"HTML comments detected - potential information leakage\",\r\n severity: 'low' as const,\r\n },\r\n ];\r\n\r\n // Function to sanitize detected risks\r\n const sanitizeContent = (text: string, pattern: RegExp, replacement = \"\"): string => {\r\n return text.replace(pattern, replacement);\r\n };\r\n\r\n let contentWasSanitized = false;\r\n\r\n // Check for each security pattern\r\n Object.entries(securityPatterns).forEach(([riskType, config]) => {\r\n if (config.pattern.test(markdownText)) {\r\n securityCheck.isValid = false;\r\n securityCheck.risks.push({\r\n type: riskType,\r\n description: config.description,\r\n severity: config.severity,\r\n });\r\n\r\n // Sanitize the content\r\n securityCheck.text = sanitizeContent(securityCheck.text, config.pattern);\r\n contentWasSanitized = true;\r\n }\r\n });\r\n\r\n // Apply additional security checks\r\n additionalChecks.forEach((check) => {\r\n if (check.pattern.test(markdownText)) {\r\n securityCheck.isValid = false;\r\n securityCheck.risks.push({\r\n type: check.type,\r\n description: check.description,\r\n severity: check.severity,\r\n });\r\n securityCheck.text = sanitizeContent(securityCheck.text, check.pattern);\r\n contentWasSanitized = true;\r\n }\r\n });\r\n\r\n securityCheck.sanitized = contentWasSanitized;\r\n\r\n // Sort risks by severity (critical -> high -> medium -> low)\r\n const severityOrder = { critical: 0, high: 1, medium: 2, low: 3 };\r\n securityCheck.risks.sort((a, b) => {\r\n const aSeverity = severityOrder[a.severity || 'low'];\r\n const bSeverity = severityOrder[b.severity || 'low'];\r\n return aSeverity - bSeverity;\r\n });\r\n\r\n return securityCheck;\r\n};\r\n\r\n/******************************************************\r\n * ##: HTML/Markdown Sanitizer\r\n * Removes potentially dangerous HTML elements and attributes from text.\r\n *\r\n * More aggressive sanitization for when security is paramount.\r\n * Strips all HTML tags and suspicious content.\r\n * @param {string|null|undefined} text Text to sanitize\r\n * @returns {string} Sanitized text with dangerous content removed\r\n * History:\r\n * 25-09-2025: Created\r\n ****************************************************/\r\nexport const sanitizeMarkdown = (text: string | null | undefined): string => {\r\n if (!text || typeof text !== 'string') {\r\n return '';\r\n }\r\n\r\n try {\r\n return text\r\n // Remove all HTML tags\r\n .replace(/<[^>]*>/g, '')\r\n // Remove JavaScript protocols\r\n .replace(/javascript:/gi, '')\r\n // Remove data URLs\r\n .replace(/data:[^,]*,[^\"'\\s>)]*/gi, '')\r\n // Remove suspicious protocols\r\n .replace(/(file|ftp|ws|wss|vbscript|livescript|mocha):/gi, '')\r\n // Remove HTML entities that could be used for obfuscation\r\n .replace(/&[#\\w]+;/g, '')\r\n // Remove potential CSS expressions\r\n .replace(/expression\\s*\\([^)]*\\)/gi, '')\r\n // Clean up extra whitespace\r\n .replace(/\\s+/g, ' ')\r\n .trim();\r\n } catch (error) {\r\n /* c8 ignore start */\r\n // Defensive fallback\r\n return '';\r\n /* c8 ignore end */\r\n }\r\n};\r\n\r\n/******************************************************\r\n * ##: Security Risk Assessment\r\n * Provides a security risk score and recommendations based on detected risks.\r\n *\r\n * Calculates risk score and provides actionable security recommendations.\r\n * @param {SecurityRisk[]} risks Array of detected security risks\r\n * @returns {{score: number, level: string, recommendations: string[]}} Risk assessment\r\n * History:\r\n * 25-09-2025: Created\r\n ****************************************************/\r\nexport const assessSecurityRisks = (risks: SecurityRisk[]): {\r\n score: number;\r\n level: 'safe' | 'low' | 'medium' | 'high' | 'critical';\r\n recommendations: string[];\r\n} => {\r\n if (!risks || risks.length === 0) {\r\n return {\r\n score: 0,\r\n level: 'safe',\r\n recommendations: ['Content appears safe to use'],\r\n };\r\n }\r\n\r\n // Calculate risk score based on severity\r\n const severityScores = { critical: 100, high: 50, medium: 20, low: 5 };\r\n const score = risks.reduce((total, risk) => {\r\n return total + (severityScores[risk.severity || 'low'] || 5);\r\n }, 0);\r\n\r\n // Determine risk level\r\n let level: 'safe' | 'low' | 'medium' | 'high' | 'critical';\r\n if (score >= 100) level = 'critical';\r\n else if (score >= 50) level = 'high';\r\n else if (score >= 20) level = 'medium';\r\n else if (score >= 5) level = 'low';\r\n else level = 'safe';\r\n\r\n // Generate recommendations\r\n const recommendations: string[] = [];\r\n const hasCritical = risks.some(r => r.severity === 'critical');\r\n const hasHigh = risks.some(r => r.severity === 'high');\r\n\r\n if (hasCritical) {\r\n recommendations.push('URGENT: Critical security risks detected - do not render this content');\r\n recommendations.push('Use aggressive sanitization before any processing');\r\n }\r\n\r\n if (hasHigh) {\r\n recommendations.push('High security risks detected - sanitization strongly recommended');\r\n recommendations.push('Consider rejecting this content or applying strict filtering');\r\n }\r\n\r\n if (level === 'medium') {\r\n recommendations.push('Medium security risks detected - apply sanitization');\r\n recommendations.push('Review content carefully before use');\r\n }\r\n\r\n if (level === 'low') {\r\n recommendations.push('Low security risks detected - basic sanitization recommended');\r\n }\r\n\r\n recommendations.push('Always validate content from untrusted sources');\r\n recommendations.push('Consider implementing Content Security Policy (CSP)');\r\n\r\n return { score, level, recommendations };\r\n};","export * from \"./utils/array\";\r\nexport * from \"./utils/bool\";\r\nexport * from \"./utils/object\";\r\nexport * from \"./utils/string\";\r\nexport * from \"./utils/number\";\r\nexport * from \"./utils/func\";\r\nexport * from \"./utils/validations\";\r\nexport * from \"./utils/iban\";\r\nexport * from \"./utils/security\";\r\n\r\n/** Environment helpers (runtime-agnostic checks) */\r\nexport const isBrowser =\r\n typeof globalThis !== \"undefined\" &&\r\n typeof (globalThis as any).document !== \"undefined\";\r\nexport const isNode =\r\n typeof process !== \"undefined\" && !!process.versions?.node;\r\n"]}
|