@lichens-innovation/ts-common 1.20.0 → 1.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +10 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +19 -1
- package/dist/index.d.ts +19 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/mime.cjs.map +1 -1
- package/dist/mime.js.map +1 -1
- package/dist/rjsf.cjs.map +1 -1
- package/dist/rjsf.js.map +1 -1
- package/dist/web.cjs.map +1 -1
- package/dist/web.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/base64.utils.ts","../src/utils/types.utils.ts","../src/utils/chart.utils.ts","../src/utils/color.utils.ts","../src/utils/date.utils.ts","../src/utils/errors.utils.ts","../src/utils/regex.ts","../src/utils/string.utils.ts","../src/utils/filename.utils.ts","../src/utils/form.utils.ts","../src/utils/html.utils.ts","../src/utils/http.utils.ts","../src/utils/json.utils.ts","../src/utils/number.utils.ts","../src/utils/runtime-env.utils.ts","../src/utils/text.utils.ts","../src/utils/thread.utils.ts","../src/utils/time.utils.ts","../src/utils/units.utils.ts","../src/utils/uri.utils.ts","../src/utils/websocket.utils.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["const BASE64_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\nconst encodeUtf8ToBytes = (text: string): number[] => {\n const codePoints: number[] = [];\n\n for (let i = 0; i < text.length; i++) {\n const codeUnit = text.charCodeAt(i);\n if (codeUnit >= 0xd800 && codeUnit <= 0xdbff && i + 1 < text.length) {\n const next = text.charCodeAt(i + 1);\n if (next >= 0xdc00 && next <= 0xdfff) {\n codePoints.push(0x10000 + ((codeUnit - 0xd800) << 10) + (next - 0xdc00));\n i++;\n continue;\n }\n }\n codePoints.push(codeUnit);\n }\n\n const bytes: number[] = [];\n for (const codePoint of codePoints) {\n if (codePoint < 0x80) {\n bytes.push(codePoint);\n } else if (codePoint < 0x800) {\n bytes.push(0xc0 | (codePoint >> 6), 0x80 | (codePoint & 0x3f));\n } else if (codePoint < 0x10000) {\n bytes.push(0xe0 | (codePoint >> 12), 0x80 | ((codePoint >> 6) & 0x3f), 0x80 | (codePoint & 0x3f));\n } else {\n bytes.push(\n 0xf0 | (codePoint >> 18),\n 0x80 | ((codePoint >> 12) & 0x3f),\n 0x80 | ((codePoint >> 6) & 0x3f),\n 0x80 | (codePoint & 0x3f),\n );\n }\n }\n\n return bytes;\n};\n\nconst decodeUtf8FromBytes = (bytes: number[]): string => {\n let result = '';\n let i = 0;\n\n while (i < bytes.length) {\n const b0 = bytes[i]!;\n let codePoint: number;\n\n if (b0 < 0x80) {\n codePoint = b0;\n i += 1;\n } else if ((b0 & 0xe0) === 0xc0) {\n codePoint = ((b0 & 0x1f) << 6) | (bytes[i + 1]! & 0x3f);\n i += 2;\n } else if ((b0 & 0xf0) === 0xe0) {\n codePoint = ((b0 & 0x0f) << 12) | ((bytes[i + 1]! & 0x3f) << 6) | (bytes[i + 2]! & 0x3f);\n i += 3;\n } else {\n codePoint =\n ((b0 & 0x07) << 18) |\n ((bytes[i + 1]! & 0x3f) << 12) |\n ((bytes[i + 2]! & 0x3f) << 6) |\n (bytes[i + 3]! & 0x3f);\n i += 4;\n }\n\n if (codePoint <= 0xffff) {\n result += String.fromCharCode(codePoint);\n } else {\n const adjusted = codePoint - 0x10000;\n result += String.fromCharCode(0xd800 + (adjusted >> 10), 0xdc00 + (adjusted & 0x3ff));\n }\n }\n\n return result;\n};\n\nconst encodeBytesToBase64 = (bytes: number[]): string => {\n let output = '';\n\n for (let i = 0; i < bytes.length; i += 3) {\n const b0 = bytes[i]!;\n const b1 = i + 1 < bytes.length ? bytes[i + 1]! : 0;\n const b2 = i + 2 < bytes.length ? bytes[i + 2]! : 0;\n const triplet = (b0 << 16) | (b1 << 8) | b2;\n\n output += BASE64_CHARS[(triplet >> 18) & 0x3f];\n output += BASE64_CHARS[(triplet >> 12) & 0x3f];\n output += i + 1 < bytes.length ? BASE64_CHARS[(triplet >> 6) & 0x3f] : '=';\n output += i + 2 < bytes.length ? BASE64_CHARS[triplet & 0x3f] : '=';\n }\n\n return output;\n};\n\nconst decodeBase64ToBytes = (base64: string): number[] => {\n const sanitized = base64.replace(/[^A-Za-z0-9+/=]/g, '');\n const bytes: number[] = [];\n\n for (let i = 0; i < sanitized.length; i += 4) {\n const c0 = BASE64_CHARS.indexOf(sanitized[i]!);\n const c1 = BASE64_CHARS.indexOf(sanitized[i + 1]!);\n const c2 = sanitized[i + 2] === '=' ? 0 : BASE64_CHARS.indexOf(sanitized[i + 2]!);\n const c3 = sanitized[i + 3] === '=' ? 0 : BASE64_CHARS.indexOf(sanitized[i + 3]!);\n\n if (c0 < 0 || c1 < 0 || (sanitized[i + 2] !== '=' && c2 < 0) || (sanitized[i + 3] !== '=' && c3 < 0)) {\n throw new Error('Invalid base64 character');\n }\n\n const triplet = (c0 << 18) | (c1 << 12) | (c2 << 6) | c3;\n\n bytes.push((triplet >> 16) & 0xff);\n if (sanitized[i + 2] !== '=') bytes.push((triplet >> 8) & 0xff);\n if (sanitized[i + 3] !== '=') bytes.push(triplet & 0xff);\n }\n\n return bytes;\n};\n\nexport const encodeBase64 = (text: string): string => {\n try {\n return encodeBytesToBase64(encodeUtf8ToBytes(text));\n } catch {\n return '';\n }\n};\n\nexport const decodeBase64 = (base64: string): string => {\n try {\n return decodeUtf8FromBytes(decodeBase64ToBytes(base64));\n } catch {\n return '';\n }\n};\n","export const NO_OP: () => void = () => {};\n\nexport const isNullish = (value: unknown): value is null | undefined => value === null || value === undefined;\n\nexport const isNumber = (value?: unknown | null): value is number => {\n if (isNullish(value)) {\n return false;\n }\n\n if (typeof value !== 'number') {\n return false;\n }\n\n if (isNaN(value)) {\n return false;\n }\n\n return true;\n};\n\nexport const isString = (value?: unknown | null): value is string => {\n if (isNullish(value)) {\n return false;\n }\n\n if (typeof value !== 'string') {\n return false;\n }\n\n return true;\n};\n","import { isNullish } from \"./types.utils\";\n\nexport interface ToleranceArea {\n flow: number;\n toleranceRange: [number, number];\n}\n\n/**\n * A chart point with required x and y coordinates.\n */\nexport interface ChartPoint {\n x: number;\n y: number;\n}\n\n/**\n * A chart point with optional nullable x and y coordinates.\n */\nexport interface NullableChartPoint {\n x?: number | null;\n y?: number | null;\n}\n\nexport const getTickDomain = (ticks: number[]): [number, number] => [0, ticks.at(-1) ?? 0];\n\nexport const tickFormatter = (value: number): string => value.toFixed(0);\n\nexport const toToleranceLabel = (value: number): string => `±${(value * 100).toFixed(0)}%`;\n\nexport const tooltipValueFormatter = (data?: unknown | null): string => {\n if (isNullish(data)) {\n return '';\n }\n\n if (typeof data === 'number') {\n return data.toFixed(2);\n }\n\n if (Array.isArray(data) && data.length >= 2) {\n const [min, max] = data;\n if (typeof min === 'number' && typeof max === 'number') {\n return `[${min.toFixed(2)} … ${max.toFixed(2)}]`;\n }\n }\n\n return String(data ?? '');\n};\n\n/**\n * Rounds a raw value to a \"nice\" number for chart axis increments.\n * Nice numbers are easy to read: 1, 2, 2.5, 5, or 10 multiplied by a power of 10.\n *\n * @param rawValue - The raw value to round to a nice number\n * @returns A nice number close to the raw value\n *\n * @example\n * roundToNiceNumber(0.7) // returns 1\n * roundToNiceNumber(3) // returns 5\n * roundToNiceNumber(17) // returns 20\n * roundToNiceNumber(80) // returns 100\n */\nexport const roundToNiceNumber = (rawValue: number): number => {\n if (rawValue <= 0) return 0;\n\n // Get order of magnitude\n const magnitude = Math.pow(10, Math.floor(Math.log10(rawValue)));\n\n // Normalize to find the multiplier (between 1 and 10)\n const normalized = rawValue / magnitude;\n\n // Round to nice values: 1, 2, 2.5, 5, 10\n let niceMultiplier: number;\n if (normalized <= 1) niceMultiplier = 1;\n else if (normalized <= 2) niceMultiplier = 2;\n else if (normalized <= 2.5) niceMultiplier = 2.5;\n else if (normalized <= 5) niceMultiplier = 5;\n else niceMultiplier = 10;\n\n return niceMultiplier * magnitude;\n};\n\nconst roundToPrecision = (value: number, precision = 10): number => {\n const factor = 10 ** precision;\n return Math.round(value * factor) / factor;\n};\n\n/**\n * Builds an array of \"nice\" tick values for a chart axis.\n * The algorithm aims for approximately `targetTickCount` ticks with clean, readable values.\n *\n * @param max - The maximum value to display on the axis\n * @param targetTickCount - The desired number of ticks (default: 10)\n * @returns An array of tick values from 0 to at least `max`\n */\nexport const buildTicksForChart = (max: number, targetTickCount = 10): number[] => {\n if (max <= 0) return [0];\n\n // Calculate raw increment for desired tick count and round to nice value\n const rawIncrement = max / targetTickCount;\n const niceIncrement = roundToNiceNumber(rawIncrement);\n\n // Build ticks from 0 to just past max\n const ticks: number[] = [];\n for (let value = 0; value <= max + niceIncrement * 0.5; value += niceIncrement) {\n // Round to avoid floating point precision issues\n ticks.push(roundToPrecision(value));\n }\n\n // Ensure we have at least one tick >= max\n const lastTick = ticks[ticks.length - 1];\n if (lastTick < max) {\n ticks.push(roundToPrecision(lastTick + niceIncrement));\n }\n\n return ticks;\n};\n","export interface RgbColor {\n r: number;\n g: number;\n b: number;\n}\n\nexport interface RgbaColor extends RgbColor {\n a: number;\n}\n\nexport const rgbToHex = (r: number, g: number, b: number): string => {\n if (r > 255 || g > 255 || b > 255) {\n throw new Error(\"Invalid color component\");\n }\n\n return ((r << 16) | (g << 8) | b).toString(16).padStart(6, \"0\");\n};\n\nexport const hexToRgb = (hex: string): RgbColor => {\n const cleanHex = hex.replace(\"#\", \"\");\n\n const r = parseInt(cleanHex.substring(0, 2), 16);\n const g = parseInt(cleanHex.substring(2, 4), 16);\n const b = parseInt(cleanHex.substring(4, 6), 16);\n\n return { r, g, b };\n};\n\nexport const rgbaToHex = (color: RgbaColor): string => {\n return \"#\" + rgbToHex(color.r, color.g, color.b);\n};\n\nexport const getOpacityHexValue = (opacity: number): string => {\n if (opacity < 0 || opacity > 1) {\n throw new Error(\"Invalid opacity value\");\n }\n\n return Math.round(opacity * 255)\n .toString(16)\n .padStart(2, \"0\");\n};\n\nexport const rgbaToHexWithAlpha = (color: RgbaColor): string => {\n return rgbaToHex(color) + getOpacityHexValue(color.a);\n};\n\nexport const rgbToString = (color: RgbColor): string => {\n return `rgb(${color.r}, ${color.g}, ${color.b})`;\n};\n\nexport const rgbaToString = (color: RgbaColor): string => {\n return `rgba(${color.r}, ${color.g}, ${color.b}, ${color.a})`;\n};\n\nexport const getLuminance = (r: number, g: number, b: number): number => {\n return (0.299 * r + 0.587 * g + 0.114 * b) / 255;\n};\n\nexport const getContrastTextColor = (hexColor: string): string => {\n const { r, g, b } = hexToRgb(hexColor);\n return getLuminance(r, g, b) > 0.5 ? \"#000000\" : \"#ffffff\";\n};\n\n/**\n * Normalized RGB color with values between 0 and 1.\n * Useful for graphics libraries like Three.js.\n */\nexport interface NormalizedRgb {\n r: number;\n g: number;\n b: number;\n}\n\n/**\n * Convert a hex color string to normalized RGB values (0-1 range).\n * @param hex - Hex color string (with or without # prefix)\n * @returns Normalized RGB object with values between 0 and 1\n */\nexport const hexToNormalizedRgb = (hex: string): NormalizedRgb => {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n return result\n ? {\n r: parseInt(result[1], 16) / 255,\n g: parseInt(result[2], 16) / 255,\n b: parseInt(result[3], 16) / 255,\n }\n : { r: 0, g: 0, b: 0 };\n};\n\n/**\n * Determine if a color is light or dark based on relative luminance.\n * Useful for choosing contrasting text colors.\n * @param hex - Hex color string\n * @returns True if the color is considered light (luminance > 0.5)\n */\nexport const isLightColor = (hex: string): boolean => {\n const rgb = hexToNormalizedRgb(hex);\n // Calculate relative luminance using standard coefficients\n const luminance = 0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b;\n return luminance > 0.5;\n};\n\nconst PERCENT_COLORS = [\n { pct: 0.0, color: { r: 0xff, g: 0x00, b: 0 } },\n { pct: 0.5, color: { r: 0xff, g: 0xff, b: 0 } },\n { pct: 1.0, color: { r: 0x00, g: 0xff, b: 0 } },\n] as const;\n\n// https://stackoverflow.com/a/7128796/704681\nexport const getColorForPercentage = (percent: number): string => {\n if (percent < 0 || percent > 1) {\n throw new Error(`Percentage must be between 0 and 1: ${percent}`);\n }\n\n let i = 1;\n for (; i < PERCENT_COLORS.length - 1; i++) {\n if (percent < PERCENT_COLORS[i].pct) {\n break;\n }\n }\n\n const lower = PERCENT_COLORS[i - 1];\n const upper = PERCENT_COLORS[i];\n const range = upper.pct - lower.pct;\n const rangePct = (percent - lower.pct) / range;\n const pctLower = 1 - rangePct;\n const pctUpper = rangePct;\n const color = {\n r: Math.floor(lower.color.r * pctLower + upper.color.r * pctUpper),\n g: Math.floor(lower.color.g * pctLower + upper.color.g * pctUpper),\n b: Math.floor(lower.color.b * pctLower + upper.color.b * pctUpper),\n };\n\n return \"rgb(\" + [color.r, color.g, color.b].join(\",\") + \")\";\n};\n","import { format } from \"date-fns\";\nimport { isNullish } from \"./types.utils\";\n\nexport type DateInput = Date | string | number | null;\n\nexport const dateAs_HHMMSS = (value?: DateInput) => {\n if (isNullish(value)) return \"\";\n return format(value, \"HH:mm:ss\");\n};\n\nexport const dateAs_YYYYMMDD = (value?: DateInput) => {\n if (isNullish(value)) return \"\";\n return format(value, \"yyyy-MM-dd\");\n};\n\nexport const dateAs_YYYYMMDD_HHMMSS = (value?: DateInput) => {\n if (isNullish(value)) return \"\";\n return format(value, \"yyyy-MM-dd HH:mm:ss\");\n};\n\nexport const nowAsTime = () => dateAs_HHMMSS(new Date());\nexport const nowAsDate = () => dateAs_YYYYMMDD(new Date());\nexport const nowAsDateTime = () => dateAs_YYYYMMDD_HHMMSS(new Date());\n\nexport const nowAsDateTimeForFilename = () => {\n return format(new Date(), \"yyyy-MM-dd_HH-mm-ss\");\n};\n\nconst DEFAULT_DATE_FORMAT = \"yyyy-MM-dd HH:mm:ss\";\n\n/**\n * Format a Unix timestamp (seconds since epoch) to a human-readable string.\n * @param timestamp - Unix timestamp in seconds\n * @param dateFormat - Date format string (default: \"yyyy-MM-dd HH:mm:ss\")\n * @returns Formatted date string or \"N/A\" if invalid or zero.\n */\nexport const formatUnixTimestamp = (\n timestamp: number,\n dateFormat: string = DEFAULT_DATE_FORMAT\n): string => {\n if (!timestamp) return \"N/A\";\n try {\n return format(new Date(timestamp * 1000), dateFormat);\n } catch {\n return \"Invalid date\";\n }\n};\n\n/**\n * Get the current Unix timestamp in seconds.\n * @returns Current Unix timestamp\n */\nexport const getCurrentUnixTimestamp = (): number => {\n return Math.floor(Date.now() / 1000);\n};\n\n/**\n * Check if a Unix timestamp has expired (is in the past).\n * @param timestamp - Unix timestamp in seconds\n * @returns True if the timestamp is in the past\n */\nexport const isExpiredTimestamp = (timestamp: number): boolean => {\n const now = getCurrentUnixTimestamp();\n return timestamp < now;\n};\n\n/**\n * Check if a Unix timestamp is active (current or past).\n * @param timestamp - Unix timestamp in seconds\n * @returns True if the timestamp is current or in the past\n */\nexport const isActiveTimestamp = (timestamp: number): boolean => {\n const now = getCurrentUnixTimestamp();\n return timestamp <= now;\n};\n","export const getErrorMessage = (error: unknown): string => {\n if (!error) {\n return \"\";\n }\n\n if (typeof error === \"string\") {\n return error;\n }\n\n if (typeof error === \"object\" && \"message\" in error) {\n return (error as { message: string }).message;\n }\n\n return JSON.stringify(error);\n};\n\nexport const toError = (error: unknown): Error => {\n if (error instanceof Error) {\n return error;\n }\n\n return new Error(getErrorMessage(error));\n};\n","export const REGEX_ALPHANUMERIC = /^[a-zA-Z0-9-_ $%#(){}:/.]+$/;\n\nexport const REGEX_IPV4 = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;\n","import { REGEX_ALPHANUMERIC } from './regex';\nimport { isNullish } from './types.utils';\n\nexport const isBlank = (str?: string | null): str is null | undefined | '' => {\n return isNullish(str) || str?.trim() === '';\n};\n\nexport const isNotBlank = (str?: string | null): str is string => {\n return !isBlank(str);\n};\n\nexport const isAlphanumeric = (value: string): boolean => {\n return REGEX_ALPHANUMERIC.test(value);\n};\n\n/**\n * Removes diacritical marks (e.g., accents, umlauts) from a string.\n * This method normalizes the input string to its canonical decomposition\n * form (NFD) and removes any combining diacritical marks.\n *\n * @param {string} value - The input string to normalize.\n * @returns {string} - The normalized string with diacritical marks removed.\n *\n * @example\n * const result = removeDiacriticalMarks(\"Ça va très bien, n'est-ce pas?\");\n * console.log(result); // \"Ca va tres bien, n'est-ce pas?\"\n */\nexport const removeDiacriticalMarks = (value: string): string => {\n if (!value) {\n return '';\n }\n\n return value.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '');\n};\n\n/**\n * Capitalize the first letter of a string.\n * @param str - The input string\n * @returns The string with the first character uppercased\n */\nexport const capitalizeFirst = (str: string): string => {\n if (!str) return str;\n return str.charAt(0).toUpperCase() + str.slice(1);\n};\n\n/**\n * Count the number of words in a text string.\n * Words are separated by whitespace.\n * @param text - The text to count words in\n * @returns The number of words found\n */\nexport const countWords = (text: string): number => {\n if (!text || text.trim().length === 0) return 0;\n return text.split(/\\s+/).filter((word) => word.length > 0).length;\n};\n\n/**\n * Truncate a string to a maximum length, adding an ellipsis if truncated.\n * @param str - The string to truncate\n * @param maxLength - Maximum length before truncation\n * @param ellipsis - The ellipsis string to append (default: \"...\")\n * @returns The truncated string\n */\nexport const truncate = (str: string, maxLength: number, ellipsis = '...'): string => {\n if (!str || str.length <= maxLength) return str;\n return str.slice(0, maxLength - ellipsis.length) + ellipsis;\n};\n\n/**\n * Converts a string to a URL-safe slug.\n * Removes diacritical marks, lowercases, replaces non-alphanumeric characters with hyphens,\n * and strips leading/trailing hyphens.\n *\n * @param value - The input string to slugify\n * @returns The slugified string\n *\n * @example\n * slugify(\"Héllo Wörld!\") // → \"hello-world\"\n * slugify(\" My Blog Post \") // → \"my-blog-post\"\n */\nexport const slugify = (value: string): string => {\n if (!value) return '';\n return removeDiacriticalMarks(value)\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n};\n\n/**\n * Parses an optional comma-separated string into a trimmed, non-blank string array.\n */\nexport const parseCommaSeparatedList = (raw?: string | null): string[] => {\n if (isBlank(raw)) {\n return [];\n }\n\n return raw\n .split(',')\n .map((s: string) => s.trim())\n .filter(isNotBlank);\n};\n","import { isBlank } from \"./string.utils\";\n\nexport const getFileExtension = (filename?: string | null): string => {\n if (isBlank(filename)) {\n return \"\";\n }\n\n const lastDotIndex = filename.lastIndexOf(\".\");\n if (lastDotIndex <= 0) {\n // No dot (-1), or dot is at start (0)\n // hidden file without extension\n return lastDotIndex === 0 ? filename.slice(1).toLowerCase() : \"\";\n }\n\n return filename.slice(lastDotIndex + 1).toLowerCase();\n};\n","import { isBlank } from \"./string.utils\";\nimport { isNullish } from \"./types.utils\";\n\nexport const parseOptionalFormNumber = (value?: string | null): number | null => {\n if (isBlank(value)) return null;\n\n const n = Number(value);\n return Number.isFinite(n) ? n : null;\n};\n\nexport const toFormString = (n?: number | null): string => {\n if (isNullish(n)) return \"\";\n\n return Number.isFinite(n) ? String(n) : \"\";\n};\n\n/**\n * Converts a number to a form string, rounded to integer.\n * Avoids floating-point display noise (e.g. 3700.0000000000005).\n */\nexport const toFormStringInteger = (n?: number | null): string => {\n if (isNullish(n)) return \"\";\n if (!Number.isFinite(n)) return \"\";\n\n return String(Math.round(n));\n};\n","const HTML_ESCAPE_MAP: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n};\n\nconst HTML_UNESCAPE_MAP: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '"': '\"',\n ''': \"'\",\n ''': \"'\",\n};\n\nexport const escapeHtml = (text: string): string => {\n return text.replace(/[&<>\"']/g, (char) => HTML_ESCAPE_MAP[char] ?? char);\n};\n\nexport const unescapeHtml = (text: string): string => {\n return text.replace(/&(?:amp|lt|gt|quot|#39|#x27);/g, (entity) => HTML_UNESCAPE_MAP[entity] ?? entity);\n};\n","import { isNullish } from './types.utils';\n\nexport const isHttpSuccessStatus = (status?: number | null): boolean => {\n if (isNullish(status)) {\n return false;\n }\n\n return status >= 200 && status < 300;\n};\n\nexport const isHttpClientErrorStatus = (status?: number | null): boolean => {\n if (isNullish(status)) {\n return false;\n }\n\n return status >= 400 && status < 500;\n};\n\nexport const isHttpServerErrorStatus = (status?: number | null): boolean => {\n if (isNullish(status)) {\n return false;\n }\n\n return status >= 500;\n};\n","export const safeJsonParse = <T>(value: string, fallback?: T): T | undefined => {\n try {\n return JSON.parse(value) as T;\n } catch {\n return fallback;\n }\n};\n\nexport const safeJsonStringify = (obj: unknown, space: number = 2): string => {\n if (!obj) return '';\n try {\n return JSON.stringify(obj, null, space);\n } catch {\n return '';\n }\n};\n\nexport const sortObjectKeys = (_key: string, value: unknown): unknown =>\n value instanceof Object && !(value instanceof Array)\n ? Object.keys(value as Record<string, unknown>)\n .sort()\n .reduce(\n (sorted, key) => {\n sorted[key] = (value as Record<string, unknown>)[key];\n return sorted;\n },\n {} as Record<string, unknown>,\n )\n : value;\n\ninterface FormatJsonArgs {\n value?: string;\n space?: number;\n sortKeys?: boolean;\n}\n\nexport const formatJson = ({ value, space = 2, sortKeys = false }: FormatJsonArgs): string => {\n if (!value) return '';\n\n try {\n const obj: unknown = JSON.parse(value);\n return JSON.stringify(obj, sortKeys ? sortObjectKeys : undefined, space);\n } catch {\n return value;\n }\n};\n\nexport const prettifyJson = (value?: string): string => {\n return formatJson({ value, space: 4, sortKeys: true });\n};\n\nexport const minifyJson = (value?: string): string => {\n return formatJson({ value, space: 0, sortKeys: true });\n};\n\nexport const isValidJson = (value: string): boolean => {\n try {\n JSON.parse(value);\n return true;\n } catch {\n return false;\n }\n};\n\nexport const isMinifiedJson = (value: string): boolean => {\n return value === minifyJson(value);\n};\n","import { isBlank } from './string.utils';\nimport { isNullish, isNumber } from './types.utils';\n\n/**\n * Returns true if the input string is a valid number (blank and non-numeric strings are invalid).\n */\nexport const isInputValidNumber = (value: string): boolean => {\n if (isBlank(value)) return false;\n const num = Number(value.trim());\n return Number.isFinite(num);\n};\n\n/**\n * Returns true if the input string is a valid integer (decimals like \"1500.5\" are invalid).\n */\nexport const isInputValidInteger = (value: string): boolean => {\n if (!isInputValidNumber(value)) return false;\n const num = Number(value.trim());\n return Number.isInteger(num);\n};\n\n/**\n * Returns true if the input string is a valid positive integer (decimals like \"1500.5\" are invalid).\n */\nexport const isInputValidPositiveInteger = (value: string): boolean => {\n if (!isInputValidInteger(value)) return false;\n const num = Number(value.trim());\n return num > 0;\n};\n\n/**\n * Returns true if the input string is a valid negative integer (decimals like \"1500.5\" are invalid).\n */\nexport const isInputValidNegativeInteger = (value: string): boolean => {\n if (!isInputValidInteger(value)) return false;\n const num = Number(value.trim());\n return num < 0;\n};\n\n/**\n * Formats a number as an integer display string (removes decimals).\n */\nexport const formatIntegerDisplay = (value?: number | null): string => String(toFixed(value, 0));\n\n// Example: toFixed(3.14159, 3) // 3.142\nexport const toFixed = (value?: number | null, decimals = 0): number => {\n if (isNullish(value)) return 0;\n if (decimals < 0) throw new Error('[toFixed] decimals must be >= 0');\n if (decimals === 0) return Math.round(value);\n\n const multiplier = Math.pow(10, decimals);\n return Math.round(value * multiplier) / multiplier;\n};\n\nexport const roundUpToNearest10 = (value?: number | null): number => {\n if (isNullish(value)) return 0;\n return Math.ceil(value / 10) * 10;\n};\n\n/**\n * Format a number with K (thousands) or M (millions) suffix.\n */\nexport const formatCount = (count: number): string => {\n if (count >= 1_000_000) {\n return `${(count / 1_000_000).toFixed(1)}M`;\n }\n if (count >= 1_000) {\n return `${(count / 1_000).toFixed(1)}K`;\n }\n return count.toString();\n};\n\n/**\n * Format a duration in milliseconds to a human-readable string.\n */\nexport const formatDuration = (ms: number): string => {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n return `${(ms / 1000).toFixed(1)}s`;\n};\n\nexport const formatWithSpaceSeparator = (val?: number | string | null): string => {\n if (isNullish(val)) return '';\n return String(val).replace(/\\B(?=(\\d{3})+(?!\\d))/g, '\\u00a0');\n};\n\nexport const parseWithSpaceSeparator = (val?: string): number => {\n return Number(val?.replace(/\\u00a0/g, ''));\n};\n\nexport const getOrderOfMagnitudeExponent = (n?: number | null): number => {\n if (isNullish(n)) return 0;\n if (!isNumber(n)) return 0;\n\n const absValue = Math.abs(n);\n if (absValue === 0) {\n return 0;\n }\n\n const integerPart = Math.floor(absValue);\n return Math.floor(Math.log10(integerPart));\n};\n","import { isNullish } from \"./types.utils\";\n\n/**\n * Returns true when running in Node.js.\n * Checks for process.versions.node to avoid false positives in Web Workers.\n */\nexport const isRuntimeEnvNodeJs = (): boolean => {\n if (typeof window !== \"undefined\") return false;\n if (typeof process === \"undefined\") return false;\n if (isNullish(process?.versions?.node)) return false;\n\n return true;\n};\n","export const firstSentence = (s: string): string => {\n const m = s.match(/^[^.!?]+[.!?]/);\n return m ? m[0].trim() : s.trim();\n};\n\ninterface TitleFromNameArgs {\n name: string;\n fallback?: string;\n}\n\nexport const titleFromName = ({ name, fallback = '' }: TitleFromNameArgs): string => {\n return (name || fallback)\n .split('-')\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(' ');\n};\n\nexport const joinOxford = (items: string[]): string => {\n if (items.length === 0) return '';\n if (items.length === 1) return items[0];\n return items.slice(0, -1).join(', ') + ' or ' + items.slice(-1)[0];\n};\n","export const sleep = (milliseconds: number): Promise<void> =>\n new Promise((resolve) => setTimeout(resolve, milliseconds));\n\n/**\n * Yields to the main thread so the UI can process events and repaint.\n * Use during long-running synchronous work (e.g. report generation) to keep the app responsive.\n */\nexport const yieldToMainThread = (): Promise<void> => sleep(0);\n","const ONE_SECOND_IN_MS = 1000;\nconst ONE_MINUTE_IN_MS = 60 * ONE_SECOND_IN_MS;\nconst ONE_HOUR_IN_MS = 60 * ONE_MINUTE_IN_MS;\nconst ONE_DAY_IN_MS = 24 * ONE_HOUR_IN_MS;\n\nexport const PeriodsInMS = {\n oneSecond: ONE_SECOND_IN_MS,\n oneMinute: ONE_MINUTE_IN_MS,\n oneHour: ONE_HOUR_IN_MS,\n oneDay: ONE_DAY_IN_MS,\n} as const;\n","import { isNullish } from \"./types.utils\";\n\n/** m³/s to gallons per minute */\nexport const M3PS_TO_GPM = 15850.3;\n\n/** Pascals to feet of head (1 Pa = 1 N/m²) */\nexport const PA_TO_FT = 0.000334553;\n\n/** Watts to Horsepower */\nexport const W_TO_HP = 0.00134102;\n\n/** meters to inches */\nexport const M_TO_INCHES = 39.3701;\n\n/** Hz to RPM (for synchronous speed) */\nexport const HZ_TO_RPM = 60;\n\nexport const fromM3psToGPM = (value?: number | null): number => {\n if (isNullish(value)) return 0;\n\n return value * M3PS_TO_GPM;\n};\n\nexport const fromPaToFt = (value?: number | null): number => {\n if (isNullish(value)) return 0;\n\n return value * PA_TO_FT;\n};\n\nexport const fromWToHp = (value?: number | null): number => {\n if (isNullish(value)) return 0;\n\n return value * W_TO_HP;\n};\n\nexport const fromMToInches = (value?: number | null): number => {\n if (isNullish(value)) return 0;\n\n return value * M_TO_INCHES;\n};\n\nexport const fromHzToRpm = (value?: number | null): number => {\n if (isNullish(value)) return 0;\n\n return value * HZ_TO_RPM;\n};\n","import { isBlank } from \".\";\n\nexport const SCHEME_PREFIXES = {\n file: 'file',\n content: 'content',\n http: 'http',\n https: 'https',\n ftp: 'ftp',\n ftps: 'ftps',\n sftp: 'sftp',\n smb: 'smb',\n} as const;\n\nconst SCHEME_PREFIXES_ARRAY = Object.values(SCHEME_PREFIXES);\n\nexport const DATA_URI_PATTERN = /^data:([\\w.+-]+\\/[\\w.+-]+);base64,(.+)$/;\n\nexport const isValidDataUri = (uri?: string | null): boolean => {\n if (isBlank(uri)) {\n return false;\n }\n\n return DATA_URI_PATTERN.test(uri);\n};\n\nexport const hasScheme = (uri?: string | null): boolean => {\n if (!uri) {\n return false;\n }\n\n const lowerUri = uri.toLowerCase();\n return SCHEME_PREFIXES_ARRAY.some((prefix) => lowerUri.startsWith(`${prefix}://`));\n};\n\n/**\n * Extracts the base64 data from a data URI string.\n * Data URIs have the format: data:[<mediatype>][;base64],<data>\n * This function extracts everything after the first comma.\n *\n * @param dataUri - The data URI string (e.g., \"data:image/png;base64,iVBORw0KG...\")\n * @returns The base64 data without the data URI prefix, or the original string if no comma is found\n */\nexport const extractBase64FromDataUri = (dataUri: string): string => {\n return dataUri.split(',')[1] ?? dataUri;\n};\n\nexport const encodeUrl = (value?: string): string => {\n if (!value) return '';\n return encodeURIComponent(value);\n};\n\nexport const decodeUrl = (value?: string): string => {\n if (!value) return '';\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n};\n\ninterface FormatDataUriArgs {\n mimeType: string;\n base64: string;\n}\n\nexport const formatDataUri = ({ mimeType, base64 }: FormatDataUriArgs): string => {\n return `data:${mimeType};base64,${base64}`;\n};\n\nexport const getBase64ApproxSize = (base64: string): number => {\n return Math.round((base64.length * 3) / 4);\n};\n","import { isNullish } from \"./types.utils\";\n\nconst WEBSOCKET_CONNECT_STATES: number[] = [WebSocket.CONNECTING, WebSocket.OPEN] as const;\n\nexport const isWsClosable = (ws?: WebSocket | null): ws is WebSocket => {\n if (isNullish(ws)) return false;\n return WEBSOCKET_CONNECT_STATES.includes(ws.readyState);\n};\n\nexport const isWsOpenOrConnecting = (ws?: WebSocket | null): ws is WebSocket => {\n if (isNullish(ws)) return false;\n return WEBSOCKET_CONNECT_STATES.includes(ws.readyState);\n};\n\nexport const closeWebSocket = (ws?: WebSocket | null) => {\n if (isNullish(ws) || !isWsClosable(ws)) return;\n\n try {\n ws.close();\n } catch {\n // do nothing (best effort to close, ignore unexpected errors)\n }\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/base64.utils.ts","../src/utils/types.utils.ts","../src/utils/chart.utils.ts","../src/utils/color.utils.ts","../src/utils/date.utils.ts","../src/utils/errors.utils.ts","../src/utils/regex.ts","../src/utils/string.utils.ts","../src/utils/filename.utils.ts","../src/utils/form.utils.ts","../src/utils/html.utils.ts","../src/utils/http.utils.ts","../src/utils/json.utils.ts","../src/utils/number.utils.ts","../src/utils/runtime-env.utils.ts","../src/utils/text.utils.ts","../src/utils/thread.utils.ts","../src/utils/time.utils.ts","../src/utils/units.utils.ts","../src/utils/uri.utils.ts","../src/utils/websocket.utils.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["const BASE64_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\nconst encodeUtf8ToBytes = (text: string): number[] => {\n const codePoints: number[] = [];\n\n for (let i = 0; i < text.length; i++) {\n const codeUnit = text.charCodeAt(i);\n if (codeUnit >= 0xd800 && codeUnit <= 0xdbff && i + 1 < text.length) {\n const next = text.charCodeAt(i + 1);\n if (next >= 0xdc00 && next <= 0xdfff) {\n codePoints.push(0x10000 + ((codeUnit - 0xd800) << 10) + (next - 0xdc00));\n i++;\n continue;\n }\n }\n codePoints.push(codeUnit);\n }\n\n const bytes: number[] = [];\n for (const codePoint of codePoints) {\n if (codePoint < 0x80) {\n bytes.push(codePoint);\n } else if (codePoint < 0x800) {\n bytes.push(0xc0 | (codePoint >> 6), 0x80 | (codePoint & 0x3f));\n } else if (codePoint < 0x10000) {\n bytes.push(0xe0 | (codePoint >> 12), 0x80 | ((codePoint >> 6) & 0x3f), 0x80 | (codePoint & 0x3f));\n } else {\n bytes.push(\n 0xf0 | (codePoint >> 18),\n 0x80 | ((codePoint >> 12) & 0x3f),\n 0x80 | ((codePoint >> 6) & 0x3f),\n 0x80 | (codePoint & 0x3f),\n );\n }\n }\n\n return bytes;\n};\n\nconst decodeUtf8FromBytes = (bytes: number[]): string => {\n let result = '';\n let i = 0;\n\n while (i < bytes.length) {\n const b0 = bytes[i]!;\n let codePoint: number;\n\n if (b0 < 0x80) {\n codePoint = b0;\n i += 1;\n } else if ((b0 & 0xe0) === 0xc0) {\n codePoint = ((b0 & 0x1f) << 6) | (bytes[i + 1]! & 0x3f);\n i += 2;\n } else if ((b0 & 0xf0) === 0xe0) {\n codePoint = ((b0 & 0x0f) << 12) | ((bytes[i + 1]! & 0x3f) << 6) | (bytes[i + 2]! & 0x3f);\n i += 3;\n } else {\n codePoint =\n ((b0 & 0x07) << 18) |\n ((bytes[i + 1]! & 0x3f) << 12) |\n ((bytes[i + 2]! & 0x3f) << 6) |\n (bytes[i + 3]! & 0x3f);\n i += 4;\n }\n\n if (codePoint <= 0xffff) {\n result += String.fromCharCode(codePoint);\n } else {\n const adjusted = codePoint - 0x10000;\n result += String.fromCharCode(0xd800 + (adjusted >> 10), 0xdc00 + (adjusted & 0x3ff));\n }\n }\n\n return result;\n};\n\nconst encodeBytesToBase64 = (bytes: number[]): string => {\n let output = '';\n\n for (let i = 0; i < bytes.length; i += 3) {\n const b0 = bytes[i]!;\n const b1 = i + 1 < bytes.length ? bytes[i + 1]! : 0;\n const b2 = i + 2 < bytes.length ? bytes[i + 2]! : 0;\n const triplet = (b0 << 16) | (b1 << 8) | b2;\n\n output += BASE64_CHARS[(triplet >> 18) & 0x3f];\n output += BASE64_CHARS[(triplet >> 12) & 0x3f];\n output += i + 1 < bytes.length ? BASE64_CHARS[(triplet >> 6) & 0x3f] : '=';\n output += i + 2 < bytes.length ? BASE64_CHARS[triplet & 0x3f] : '=';\n }\n\n return output;\n};\n\nconst decodeBase64ToBytes = (base64: string): number[] => {\n const sanitized = base64.replace(/[^A-Za-z0-9+/=]/g, '');\n const bytes: number[] = [];\n\n for (let i = 0; i < sanitized.length; i += 4) {\n const c0 = BASE64_CHARS.indexOf(sanitized[i]!);\n const c1 = BASE64_CHARS.indexOf(sanitized[i + 1]!);\n const c2 = sanitized[i + 2] === '=' ? 0 : BASE64_CHARS.indexOf(sanitized[i + 2]!);\n const c3 = sanitized[i + 3] === '=' ? 0 : BASE64_CHARS.indexOf(sanitized[i + 3]!);\n\n if (c0 < 0 || c1 < 0 || (sanitized[i + 2] !== '=' && c2 < 0) || (sanitized[i + 3] !== '=' && c3 < 0)) {\n throw new Error('Invalid base64 character');\n }\n\n const triplet = (c0 << 18) | (c1 << 12) | (c2 << 6) | c3;\n\n bytes.push((triplet >> 16) & 0xff);\n if (sanitized[i + 2] !== '=') bytes.push((triplet >> 8) & 0xff);\n if (sanitized[i + 3] !== '=') bytes.push(triplet & 0xff);\n }\n\n return bytes;\n};\n\nexport const encodeBase64 = (text: string): string => {\n try {\n return encodeBytesToBase64(encodeUtf8ToBytes(text));\n } catch {\n return '';\n }\n};\n\nexport const decodeBase64 = (base64: string): string => {\n try {\n return decodeUtf8FromBytes(decodeBase64ToBytes(base64));\n } catch {\n return '';\n }\n};\n","export const NO_OP: () => void = () => {};\n\nexport const isNullish = (value: unknown): value is null | undefined => value === null || value === undefined;\n\nexport const isNumber = (value?: unknown | null): value is number => {\n if (isNullish(value)) {\n return false;\n }\n\n if (typeof value !== 'number') {\n return false;\n }\n\n if (isNaN(value)) {\n return false;\n }\n\n return true;\n};\n\nexport const isString = (value?: unknown | null): value is string => {\n if (isNullish(value)) {\n return false;\n }\n\n if (typeof value !== 'string') {\n return false;\n }\n\n return true;\n};\n","import { isNullish } from \"./types.utils\";\n\nexport interface ToleranceArea {\n flow: number;\n toleranceRange: [number, number];\n}\n\n/**\n * A chart point with required x and y coordinates.\n */\nexport interface ChartPoint {\n x: number;\n y: number;\n}\n\n/**\n * A chart point with optional nullable x and y coordinates.\n */\nexport interface NullableChartPoint {\n x?: number | null;\n y?: number | null;\n}\n\nexport const getTickDomain = (ticks: number[]): [number, number] => [0, ticks.at(-1) ?? 0];\n\nexport const tickFormatter = (value: number): string => value.toFixed(0);\n\nexport const toToleranceLabel = (value: number): string => `±${(value * 100).toFixed(0)}%`;\n\nexport const tooltipValueFormatter = (data?: unknown | null): string => {\n if (isNullish(data)) {\n return '';\n }\n\n if (typeof data === 'number') {\n return data.toFixed(2);\n }\n\n if (Array.isArray(data) && data.length >= 2) {\n const [min, max] = data;\n if (typeof min === 'number' && typeof max === 'number') {\n return `[${min.toFixed(2)} … ${max.toFixed(2)}]`;\n }\n }\n\n return String(data ?? '');\n};\n\n/**\n * Rounds a raw value to a \"nice\" number for chart axis increments.\n * Nice numbers are easy to read: 1, 2, 2.5, 5, or 10 multiplied by a power of 10.\n *\n * @param rawValue - The raw value to round to a nice number\n * @returns A nice number close to the raw value\n *\n * @example\n * roundToNiceNumber(0.7) // returns 1\n * roundToNiceNumber(3) // returns 5\n * roundToNiceNumber(17) // returns 20\n * roundToNiceNumber(80) // returns 100\n */\nexport const roundToNiceNumber = (rawValue: number): number => {\n if (rawValue <= 0) return 0;\n\n // Get order of magnitude\n const magnitude = Math.pow(10, Math.floor(Math.log10(rawValue)));\n\n // Normalize to find the multiplier (between 1 and 10)\n const normalized = rawValue / magnitude;\n\n // Round to nice values: 1, 2, 2.5, 5, 10\n let niceMultiplier: number;\n if (normalized <= 1) niceMultiplier = 1;\n else if (normalized <= 2) niceMultiplier = 2;\n else if (normalized <= 2.5) niceMultiplier = 2.5;\n else if (normalized <= 5) niceMultiplier = 5;\n else niceMultiplier = 10;\n\n return niceMultiplier * magnitude;\n};\n\nconst roundToPrecision = (value: number, precision = 10): number => {\n const factor = 10 ** precision;\n return Math.round(value * factor) / factor;\n};\n\n/**\n * Builds an array of \"nice\" tick values for a chart axis.\n * The algorithm aims for approximately `targetTickCount` ticks with clean, readable values.\n *\n * @param max - The maximum value to display on the axis\n * @param targetTickCount - The desired number of ticks (default: 10)\n * @returns An array of tick values from 0 to at least `max`\n */\nexport const buildTicksForChart = (max: number, targetTickCount = 10): number[] => {\n if (max <= 0) return [0];\n\n // Calculate raw increment for desired tick count and round to nice value\n const rawIncrement = max / targetTickCount;\n const niceIncrement = roundToNiceNumber(rawIncrement);\n\n // Build ticks from 0 to just past max\n const ticks: number[] = [];\n for (let value = 0; value <= max + niceIncrement * 0.5; value += niceIncrement) {\n // Round to avoid floating point precision issues\n ticks.push(roundToPrecision(value));\n }\n\n // Ensure we have at least one tick >= max\n const lastTick = ticks[ticks.length - 1];\n if (lastTick < max) {\n ticks.push(roundToPrecision(lastTick + niceIncrement));\n }\n\n return ticks;\n};\n","export interface RgbColor {\n r: number;\n g: number;\n b: number;\n}\n\nexport interface RgbaColor extends RgbColor {\n a: number;\n}\n\nexport const rgbToHex = (r: number, g: number, b: number): string => {\n if (r > 255 || g > 255 || b > 255) {\n throw new Error(\"Invalid color component\");\n }\n\n return ((r << 16) | (g << 8) | b).toString(16).padStart(6, \"0\");\n};\n\nexport const hexToRgb = (hex: string): RgbColor => {\n const cleanHex = hex.replace(\"#\", \"\");\n\n const r = parseInt(cleanHex.substring(0, 2), 16);\n const g = parseInt(cleanHex.substring(2, 4), 16);\n const b = parseInt(cleanHex.substring(4, 6), 16);\n\n return { r, g, b };\n};\n\nexport const rgbaToHex = (color: RgbaColor): string => {\n return \"#\" + rgbToHex(color.r, color.g, color.b);\n};\n\nexport const getOpacityHexValue = (opacity: number): string => {\n if (opacity < 0 || opacity > 1) {\n throw new Error(\"Invalid opacity value\");\n }\n\n return Math.round(opacity * 255)\n .toString(16)\n .padStart(2, \"0\");\n};\n\nexport const rgbaToHexWithAlpha = (color: RgbaColor): string => {\n return rgbaToHex(color) + getOpacityHexValue(color.a);\n};\n\nexport const rgbToString = (color: RgbColor): string => {\n return `rgb(${color.r}, ${color.g}, ${color.b})`;\n};\n\nexport const rgbaToString = (color: RgbaColor): string => {\n return `rgba(${color.r}, ${color.g}, ${color.b}, ${color.a})`;\n};\n\nexport const getLuminance = (r: number, g: number, b: number): number => {\n return (0.299 * r + 0.587 * g + 0.114 * b) / 255;\n};\n\nexport const getContrastTextColor = (hexColor: string): string => {\n const { r, g, b } = hexToRgb(hexColor);\n return getLuminance(r, g, b) > 0.5 ? \"#000000\" : \"#ffffff\";\n};\n\n/**\n * Normalized RGB color with values between 0 and 1.\n * Useful for graphics libraries like Three.js.\n */\nexport interface NormalizedRgb {\n r: number;\n g: number;\n b: number;\n}\n\n/**\n * Convert a hex color string to normalized RGB values (0-1 range).\n * @param hex - Hex color string (with or without # prefix)\n * @returns Normalized RGB object with values between 0 and 1\n */\nexport const hexToNormalizedRgb = (hex: string): NormalizedRgb => {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n return result\n ? {\n r: parseInt(result[1], 16) / 255,\n g: parseInt(result[2], 16) / 255,\n b: parseInt(result[3], 16) / 255,\n }\n : { r: 0, g: 0, b: 0 };\n};\n\n/**\n * Determine if a color is light or dark based on relative luminance.\n * Useful for choosing contrasting text colors.\n * @param hex - Hex color string\n * @returns True if the color is considered light (luminance > 0.5)\n */\nexport const isLightColor = (hex: string): boolean => {\n const rgb = hexToNormalizedRgb(hex);\n // Calculate relative luminance using standard coefficients\n const luminance = 0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b;\n return luminance > 0.5;\n};\n\nconst PERCENT_COLORS = [\n { pct: 0.0, color: { r: 0xff, g: 0x00, b: 0 } },\n { pct: 0.5, color: { r: 0xff, g: 0xff, b: 0 } },\n { pct: 1.0, color: { r: 0x00, g: 0xff, b: 0 } },\n] as const;\n\n// https://stackoverflow.com/a/7128796/704681\nexport const getColorForPercentage = (percent: number): string => {\n if (percent < 0 || percent > 1) {\n throw new Error(`Percentage must be between 0 and 1: ${percent}`);\n }\n\n let i = 1;\n for (; i < PERCENT_COLORS.length - 1; i++) {\n if (percent < PERCENT_COLORS[i].pct) {\n break;\n }\n }\n\n const lower = PERCENT_COLORS[i - 1];\n const upper = PERCENT_COLORS[i];\n const range = upper.pct - lower.pct;\n const rangePct = (percent - lower.pct) / range;\n const pctLower = 1 - rangePct;\n const pctUpper = rangePct;\n const color = {\n r: Math.floor(lower.color.r * pctLower + upper.color.r * pctUpper),\n g: Math.floor(lower.color.g * pctLower + upper.color.g * pctUpper),\n b: Math.floor(lower.color.b * pctLower + upper.color.b * pctUpper),\n };\n\n return \"rgb(\" + [color.r, color.g, color.b].join(\",\") + \")\";\n};\n","import { format } from \"date-fns\";\nimport { isNullish } from \"./types.utils\";\n\nexport type DateInput = Date | string | number | null;\n\nexport const dateAs_HHMMSS = (value?: DateInput) => {\n if (isNullish(value)) return \"\";\n return format(value, \"HH:mm:ss\");\n};\n\nexport const dateAs_YYYYMMDD = (value?: DateInput) => {\n if (isNullish(value)) return \"\";\n return format(value, \"yyyy-MM-dd\");\n};\n\nexport const dateAs_YYYYMMDD_HHMMSS = (value?: DateInput) => {\n if (isNullish(value)) return \"\";\n return format(value, \"yyyy-MM-dd HH:mm:ss\");\n};\n\nexport const nowAsTime = () => dateAs_HHMMSS(new Date());\nexport const nowAsDate = () => dateAs_YYYYMMDD(new Date());\nexport const nowAsDateTime = () => dateAs_YYYYMMDD_HHMMSS(new Date());\n\nexport const nowAsDateTimeForFilename = () => {\n return format(new Date(), \"yyyy-MM-dd_HH-mm-ss\");\n};\n\nconst DEFAULT_DATE_FORMAT = \"yyyy-MM-dd HH:mm:ss\";\n\n/**\n * Format a Unix timestamp (seconds since epoch) to a human-readable string.\n * @param timestamp - Unix timestamp in seconds\n * @param dateFormat - Date format string (default: \"yyyy-MM-dd HH:mm:ss\")\n * @returns Formatted date string or \"N/A\" if invalid or zero.\n */\nexport const formatUnixTimestamp = (\n timestamp: number,\n dateFormat: string = DEFAULT_DATE_FORMAT\n): string => {\n if (!timestamp) return \"N/A\";\n try {\n return format(new Date(timestamp * 1000), dateFormat);\n } catch {\n return \"Invalid date\";\n }\n};\n\n/**\n * Get the current Unix timestamp in seconds.\n * @returns Current Unix timestamp\n */\nexport const getCurrentUnixTimestamp = (): number => {\n return Math.floor(Date.now() / 1000);\n};\n\n/**\n * Check if a Unix timestamp has expired (is in the past).\n * @param timestamp - Unix timestamp in seconds\n * @returns True if the timestamp is in the past\n */\nexport const isExpiredTimestamp = (timestamp: number): boolean => {\n const now = getCurrentUnixTimestamp();\n return timestamp < now;\n};\n\n/**\n * Check if a Unix timestamp is active (current or past).\n * @param timestamp - Unix timestamp in seconds\n * @returns True if the timestamp is current or in the past\n */\nexport const isActiveTimestamp = (timestamp: number): boolean => {\n const now = getCurrentUnixTimestamp();\n return timestamp <= now;\n};\n","export const getErrorMessage = (error: unknown): string => {\n if (!error) {\n return \"\";\n }\n\n if (typeof error === \"string\") {\n return error;\n }\n\n if (typeof error === \"object\" && \"message\" in error) {\n return (error as { message: string }).message;\n }\n\n return JSON.stringify(error);\n};\n\nexport const toError = (error: unknown): Error => {\n if (error instanceof Error) {\n return error;\n }\n\n return new Error(getErrorMessage(error));\n};\n","export const REGEX_ALPHANUMERIC = /^[a-zA-Z0-9-_ $%#(){}:/.]+$/;\n\nexport const REGEX_IPV4 = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;\n","import { REGEX_ALPHANUMERIC } from './regex';\nimport { isNullish } from './types.utils';\n\nexport const isBlank = (str?: string | null): str is null | undefined | '' => {\n return isNullish(str) || str?.trim() === '';\n};\n\nexport const isNotBlank = (str?: string | null): str is string => {\n return !isBlank(str);\n};\n\nexport const isAlphanumeric = (value: string): boolean => {\n return REGEX_ALPHANUMERIC.test(value);\n};\n\n/**\n * Removes diacritical marks (e.g., accents, umlauts) from a string.\n * This method normalizes the input string to its canonical decomposition\n * form (NFD) and removes any combining diacritical marks.\n *\n * @param {string} value - The input string to normalize.\n * @returns {string} - The normalized string with diacritical marks removed.\n *\n * @example\n * const result = removeDiacriticalMarks(\"Ça va très bien, n'est-ce pas?\");\n * console.log(result); // \"Ca va tres bien, n'est-ce pas?\"\n */\nexport const removeDiacriticalMarks = (value: string): string => {\n if (!value) {\n return '';\n }\n\n return value.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '');\n};\n\n/**\n * Capitalize the first letter of a string.\n * @param str - The input string\n * @returns The string with the first character uppercased\n */\nexport const capitalizeFirst = (str: string): string => {\n if (!str) return str;\n return str.charAt(0).toUpperCase() + str.slice(1);\n};\n\n/**\n * Count the number of words in a text string.\n * Words are separated by whitespace.\n * @param text - The text to count words in\n * @returns The number of words found\n */\nexport const countWords = (text: string): number => {\n if (!text || text.trim().length === 0) return 0;\n return text.split(/\\s+/).filter((word) => word.length > 0).length;\n};\n\n/**\n * Truncate a string to a maximum length, adding an ellipsis if truncated.\n * @param str - The string to truncate\n * @param maxLength - Maximum length before truncation\n * @param ellipsis - The ellipsis string to append (default: \"...\")\n * @returns The truncated string\n */\nexport const truncate = (str: string, maxLength: number, ellipsis = '...'): string => {\n if (!str || str.length <= maxLength) return str;\n return str.slice(0, maxLength - ellipsis.length) + ellipsis;\n};\n\n/**\n * Converts a string to kebab-case.\n * Handles camelCase, PascalCase, snake_case, and space-separated strings.\n *\n * @example\n * toKebabCase(\"myComponentName\") // → \"my-component-name\"\n * toKebabCase(\"XMLParser\") // → \"xml-parser\"\n */\nexport const toKebabCase = (value?: string | null): string => {\n if (isBlank(value)) return '';\n return value\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '')\n .toLowerCase();\n};\n\n/**\n * Converts a string to camelCase.\n * Handles kebab-case, snake_case, PascalCase, and space-separated strings.\n *\n * @example\n * toCamelCase(\"my-component-name\") // → \"myComponentName\"\n * toCamelCase(\"my_snake_case\") // → \"mySnakeCase\"\n */\nexport const toCamelCase = (value?: string | null): string => {\n if (isBlank(value)) return '';\n return value\n .trim()\n .replace(/[-_\\s]+(.)/g, (_, char: string) => char.toUpperCase())\n .replace(/^[A-Z]/, (char) => char.toLowerCase());\n};\n\n/**\n * Converts a string to a URL-safe slug.\n * Removes diacritical marks, lowercases, replaces non-alphanumeric characters with hyphens,\n * and strips leading/trailing hyphens.\n *\n * @param value - The input string to slugify\n * @returns The slugified string\n *\n * @example\n * slugify(\"Héllo Wörld!\") // → \"hello-world\"\n * slugify(\" My Blog Post \") // → \"my-blog-post\"\n */\nexport const slugify = (value: string): string => {\n if (!value) return '';\n return removeDiacriticalMarks(value)\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n};\n\n/**\n * Parses an optional comma-separated string into a trimmed, non-blank string array.\n */\nexport const parseCommaSeparatedList = (raw?: string | null): string[] => {\n if (isBlank(raw)) {\n return [];\n }\n\n return raw\n .split(',')\n .map((s: string) => s.trim())\n .filter(isNotBlank);\n};\n","import { isBlank } from \"./string.utils\";\n\nexport const getFileExtension = (filename?: string | null): string => {\n if (isBlank(filename)) {\n return \"\";\n }\n\n const lastDotIndex = filename.lastIndexOf(\".\");\n if (lastDotIndex <= 0) {\n // No dot (-1), or dot is at start (0)\n // hidden file without extension\n return lastDotIndex === 0 ? filename.slice(1).toLowerCase() : \"\";\n }\n\n return filename.slice(lastDotIndex + 1).toLowerCase();\n};\n","import { isBlank } from \"./string.utils\";\nimport { isNullish } from \"./types.utils\";\n\nexport const parseOptionalFormNumber = (value?: string | null): number | null => {\n if (isBlank(value)) return null;\n\n const n = Number(value);\n return Number.isFinite(n) ? n : null;\n};\n\nexport const toFormString = (n?: number | null): string => {\n if (isNullish(n)) return \"\";\n\n return Number.isFinite(n) ? String(n) : \"\";\n};\n\n/**\n * Converts a number to a form string, rounded to integer.\n * Avoids floating-point display noise (e.g. 3700.0000000000005).\n */\nexport const toFormStringInteger = (n?: number | null): string => {\n if (isNullish(n)) return \"\";\n if (!Number.isFinite(n)) return \"\";\n\n return String(Math.round(n));\n};\n","const HTML_ESCAPE_MAP: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n};\n\nconst HTML_UNESCAPE_MAP: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '"': '\"',\n ''': \"'\",\n ''': \"'\",\n};\n\nexport const escapeHtml = (text: string): string => {\n return text.replace(/[&<>\"']/g, (char) => HTML_ESCAPE_MAP[char] ?? char);\n};\n\nexport const unescapeHtml = (text: string): string => {\n return text.replace(/&(?:amp|lt|gt|quot|#39|#x27);/g, (entity) => HTML_UNESCAPE_MAP[entity] ?? entity);\n};\n","import { isNullish } from './types.utils';\n\nexport const isHttpSuccessStatus = (status?: number | null): boolean => {\n if (isNullish(status)) {\n return false;\n }\n\n return status >= 200 && status < 300;\n};\n\nexport const isHttpClientErrorStatus = (status?: number | null): boolean => {\n if (isNullish(status)) {\n return false;\n }\n\n return status >= 400 && status < 500;\n};\n\nexport const isHttpServerErrorStatus = (status?: number | null): boolean => {\n if (isNullish(status)) {\n return false;\n }\n\n return status >= 500;\n};\n","export const safeJsonParse = <T>(value: string, fallback?: T): T | undefined => {\n try {\n return JSON.parse(value) as T;\n } catch {\n return fallback;\n }\n};\n\nexport const safeJsonStringify = (obj: unknown, space: number = 2): string => {\n if (!obj) return '';\n try {\n return JSON.stringify(obj, null, space);\n } catch {\n return '';\n }\n};\n\nexport const sortObjectKeys = (_key: string, value: unknown): unknown =>\n value instanceof Object && !(value instanceof Array)\n ? Object.keys(value as Record<string, unknown>)\n .sort()\n .reduce(\n (sorted, key) => {\n sorted[key] = (value as Record<string, unknown>)[key];\n return sorted;\n },\n {} as Record<string, unknown>,\n )\n : value;\n\ninterface FormatJsonArgs {\n value?: string;\n space?: number;\n sortKeys?: boolean;\n}\n\nexport const formatJson = ({ value, space = 2, sortKeys = false }: FormatJsonArgs): string => {\n if (!value) return '';\n\n try {\n const obj: unknown = JSON.parse(value);\n return JSON.stringify(obj, sortKeys ? sortObjectKeys : undefined, space);\n } catch {\n return value;\n }\n};\n\nexport const prettifyJson = (value?: string): string => {\n return formatJson({ value, space: 4, sortKeys: true });\n};\n\nexport const minifyJson = (value?: string): string => {\n return formatJson({ value, space: 0, sortKeys: true });\n};\n\nexport const isValidJson = (value: string): boolean => {\n try {\n JSON.parse(value);\n return true;\n } catch {\n return false;\n }\n};\n\nexport const isMinifiedJson = (value: string): boolean => {\n return value === minifyJson(value);\n};\n","import { isBlank } from './string.utils';\nimport { isNullish, isNumber } from './types.utils';\n\n/**\n * Returns true if the input string is a valid number (blank and non-numeric strings are invalid).\n */\nexport const isInputValidNumber = (value: string): boolean => {\n if (isBlank(value)) return false;\n const num = Number(value.trim());\n return Number.isFinite(num);\n};\n\n/**\n * Returns true if the input string is a valid integer (decimals like \"1500.5\" are invalid).\n */\nexport const isInputValidInteger = (value: string): boolean => {\n if (!isInputValidNumber(value)) return false;\n const num = Number(value.trim());\n return Number.isInteger(num);\n};\n\n/**\n * Returns true if the input string is a valid positive integer (decimals like \"1500.5\" are invalid).\n */\nexport const isInputValidPositiveInteger = (value: string): boolean => {\n if (!isInputValidInteger(value)) return false;\n const num = Number(value.trim());\n return num > 0;\n};\n\n/**\n * Returns true if the input string is a valid negative integer (decimals like \"1500.5\" are invalid).\n */\nexport const isInputValidNegativeInteger = (value: string): boolean => {\n if (!isInputValidInteger(value)) return false;\n const num = Number(value.trim());\n return num < 0;\n};\n\n/**\n * Formats a number as an integer display string (removes decimals).\n */\nexport const formatIntegerDisplay = (value?: number | null): string => String(toFixed(value, 0));\n\n// Example: toFixed(3.14159, 3) // 3.142\nexport const toFixed = (value?: number | null, decimals = 0): number => {\n if (isNullish(value)) return 0;\n if (decimals < 0) throw new Error('[toFixed] decimals must be >= 0');\n if (decimals === 0) return Math.round(value);\n\n const multiplier = Math.pow(10, decimals);\n return Math.round(value * multiplier) / multiplier;\n};\n\nexport const roundUpToNearest10 = (value?: number | null): number => {\n if (isNullish(value)) return 0;\n return Math.ceil(value / 10) * 10;\n};\n\n/**\n * Format a number with K (thousands) or M (millions) suffix.\n */\nexport const formatCount = (count: number): string => {\n if (count >= 1_000_000) {\n return `${(count / 1_000_000).toFixed(1)}M`;\n }\n if (count >= 1_000) {\n return `${(count / 1_000).toFixed(1)}K`;\n }\n return count.toString();\n};\n\n/**\n * Format a duration in milliseconds to a human-readable string.\n */\nexport const formatDuration = (ms: number): string => {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n return `${(ms / 1000).toFixed(1)}s`;\n};\n\nexport const formatWithSpaceSeparator = (val?: number | string | null): string => {\n if (isNullish(val)) return '';\n return String(val).replace(/\\B(?=(\\d{3})+(?!\\d))/g, '\\u00a0');\n};\n\nexport const parseWithSpaceSeparator = (val?: string): number => {\n return Number(val?.replace(/\\u00a0/g, ''));\n};\n\nexport const getOrderOfMagnitudeExponent = (n?: number | null): number => {\n if (isNullish(n)) return 0;\n if (!isNumber(n)) return 0;\n\n const absValue = Math.abs(n);\n if (absValue === 0) {\n return 0;\n }\n\n const integerPart = Math.floor(absValue);\n return Math.floor(Math.log10(integerPart));\n};\n","import { isNullish } from \"./types.utils\";\n\n/**\n * Returns true when running in Node.js.\n * Checks for process.versions.node to avoid false positives in Web Workers.\n */\nexport const isRuntimeEnvNodeJs = (): boolean => {\n if (typeof window !== \"undefined\") return false;\n if (typeof process === \"undefined\") return false;\n if (isNullish(process?.versions?.node)) return false;\n\n return true;\n};\n","export const firstSentence = (s: string): string => {\n const m = s.match(/^[^.!?]+[.!?]/);\n return m ? m[0].trim() : s.trim();\n};\n\ninterface TitleFromNameArgs {\n name: string;\n fallback?: string;\n}\n\nexport const titleFromName = ({ name, fallback = '' }: TitleFromNameArgs): string => {\n return (name || fallback)\n .split('-')\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(' ');\n};\n\nexport const joinOxford = (items: string[]): string => {\n if (items.length === 0) return '';\n if (items.length === 1) return items[0];\n return items.slice(0, -1).join(', ') + ' or ' + items.slice(-1)[0];\n};\n","export const sleep = (milliseconds: number): Promise<void> =>\n new Promise((resolve) => setTimeout(resolve, milliseconds));\n\n/**\n * Yields to the main thread so the UI can process events and repaint.\n * Use during long-running synchronous work (e.g. report generation) to keep the app responsive.\n */\nexport const yieldToMainThread = (): Promise<void> => sleep(0);\n","const ONE_SECOND_IN_MS = 1000;\nconst ONE_MINUTE_IN_MS = 60 * ONE_SECOND_IN_MS;\nconst ONE_HOUR_IN_MS = 60 * ONE_MINUTE_IN_MS;\nconst ONE_DAY_IN_MS = 24 * ONE_HOUR_IN_MS;\n\nexport const PeriodsInMS = {\n oneSecond: ONE_SECOND_IN_MS,\n oneMinute: ONE_MINUTE_IN_MS,\n oneHour: ONE_HOUR_IN_MS,\n oneDay: ONE_DAY_IN_MS,\n} as const;\n","import { isNullish } from \"./types.utils\";\n\n/** m³/s to gallons per minute */\nexport const M3PS_TO_GPM = 15850.3;\n\n/** Pascals to feet of head (1 Pa = 1 N/m²) */\nexport const PA_TO_FT = 0.000334553;\n\n/** Watts to Horsepower */\nexport const W_TO_HP = 0.00134102;\n\n/** meters to inches */\nexport const M_TO_INCHES = 39.3701;\n\n/** Hz to RPM (for synchronous speed) */\nexport const HZ_TO_RPM = 60;\n\nexport const fromM3psToGPM = (value?: number | null): number => {\n if (isNullish(value)) return 0;\n\n return value * M3PS_TO_GPM;\n};\n\nexport const fromPaToFt = (value?: number | null): number => {\n if (isNullish(value)) return 0;\n\n return value * PA_TO_FT;\n};\n\nexport const fromWToHp = (value?: number | null): number => {\n if (isNullish(value)) return 0;\n\n return value * W_TO_HP;\n};\n\nexport const fromMToInches = (value?: number | null): number => {\n if (isNullish(value)) return 0;\n\n return value * M_TO_INCHES;\n};\n\nexport const fromHzToRpm = (value?: number | null): number => {\n if (isNullish(value)) return 0;\n\n return value * HZ_TO_RPM;\n};\n","import { isBlank } from \".\";\n\nexport const SCHEME_PREFIXES = {\n file: 'file',\n content: 'content',\n http: 'http',\n https: 'https',\n ftp: 'ftp',\n ftps: 'ftps',\n sftp: 'sftp',\n smb: 'smb',\n} as const;\n\nconst SCHEME_PREFIXES_ARRAY = Object.values(SCHEME_PREFIXES);\n\nexport const DATA_URI_PATTERN = /^data:([\\w.+-]+\\/[\\w.+-]+);base64,(.+)$/;\n\nexport const isValidDataUri = (uri?: string | null): boolean => {\n if (isBlank(uri)) {\n return false;\n }\n\n return DATA_URI_PATTERN.test(uri);\n};\n\nexport const hasScheme = (uri?: string | null): boolean => {\n if (!uri) {\n return false;\n }\n\n const lowerUri = uri.toLowerCase();\n return SCHEME_PREFIXES_ARRAY.some((prefix) => lowerUri.startsWith(`${prefix}://`));\n};\n\n/**\n * Extracts the base64 data from a data URI string.\n * Data URIs have the format: data:[<mediatype>][;base64],<data>\n * This function extracts everything after the first comma.\n *\n * @param dataUri - The data URI string (e.g., \"data:image/png;base64,iVBORw0KG...\")\n * @returns The base64 data without the data URI prefix, or the original string if no comma is found\n */\nexport const extractBase64FromDataUri = (dataUri: string): string => {\n return dataUri.split(',')[1] ?? dataUri;\n};\n\nexport const encodeUrl = (value?: string): string => {\n if (!value) return '';\n return encodeURIComponent(value);\n};\n\nexport const decodeUrl = (value?: string): string => {\n if (!value) return '';\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n};\n\ninterface FormatDataUriArgs {\n mimeType: string;\n base64: string;\n}\n\nexport const formatDataUri = ({ mimeType, base64 }: FormatDataUriArgs): string => {\n return `data:${mimeType};base64,${base64}`;\n};\n\nexport const getBase64ApproxSize = (base64: string): number => {\n return Math.round((base64.length * 3) / 4);\n};\n","import { isNullish } from \"./types.utils\";\n\nconst WEBSOCKET_CONNECT_STATES: number[] = [WebSocket.CONNECTING, WebSocket.OPEN] as const;\n\nexport const isWsClosable = (ws?: WebSocket | null): ws is WebSocket => {\n if (isNullish(ws)) return false;\n return WEBSOCKET_CONNECT_STATES.includes(ws.readyState);\n};\n\nexport const isWsOpenOrConnecting = (ws?: WebSocket | null): ws is WebSocket => {\n if (isNullish(ws)) return false;\n return WEBSOCKET_CONNECT_STATES.includes(ws.readyState);\n};\n\nexport const closeWebSocket = (ws?: WebSocket | null) => {\n if (isNullish(ws) || !isWsClosable(ws)) return;\n\n try {\n ws.close();\n } catch {\n // do nothing (best effort to close, ignore unexpected errors)\n }\n};\n"]}
|
package/dist/mime.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/types.utils.ts","../src/utils/string.utils.ts","../src/utils/uri.utils.ts","../src/mime/mime.utils.ts","../src/mime/index.ts"],"names":["mime"],"mappings":"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","file":"mime.cjs","sourcesContent":["export const NO_OP: () => void = () => {};\n\nexport const isNullish = (value: unknown): value is null | undefined => value === null || value === undefined;\n\nexport const isNumber = (value?: unknown | null): value is number => {\n if (isNullish(value)) {\n return false;\n }\n\n if (typeof value !== 'number') {\n return false;\n }\n\n if (isNaN(value)) {\n return false;\n }\n\n return true;\n};\n\nexport const isString = (value?: unknown | null): value is string => {\n if (isNullish(value)) {\n return false;\n }\n\n if (typeof value !== 'string') {\n return false;\n }\n\n return true;\n};\n","import { REGEX_ALPHANUMERIC } from './regex';\nimport { isNullish } from './types.utils';\n\nexport const isBlank = (str?: string | null): str is null | undefined | '' => {\n return isNullish(str) || str?.trim() === '';\n};\n\nexport const isNotBlank = (str?: string | null): str is string => {\n return !isBlank(str);\n};\n\nexport const isAlphanumeric = (value: string): boolean => {\n return REGEX_ALPHANUMERIC.test(value);\n};\n\n/**\n * Removes diacritical marks (e.g., accents, umlauts) from a string.\n * This method normalizes the input string to its canonical decomposition\n * form (NFD) and removes any combining diacritical marks.\n *\n * @param {string} value - The input string to normalize.\n * @returns {string} - The normalized string with diacritical marks removed.\n *\n * @example\n * const result = removeDiacriticalMarks(\"Ça va très bien, n'est-ce pas?\");\n * console.log(result); // \"Ca va tres bien, n'est-ce pas?\"\n */\nexport const removeDiacriticalMarks = (value: string): string => {\n if (!value) {\n return '';\n }\n\n return value.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '');\n};\n\n/**\n * Capitalize the first letter of a string.\n * @param str - The input string\n * @returns The string with the first character uppercased\n */\nexport const capitalizeFirst = (str: string): string => {\n if (!str) return str;\n return str.charAt(0).toUpperCase() + str.slice(1);\n};\n\n/**\n * Count the number of words in a text string.\n * Words are separated by whitespace.\n * @param text - The text to count words in\n * @returns The number of words found\n */\nexport const countWords = (text: string): number => {\n if (!text || text.trim().length === 0) return 0;\n return text.split(/\\s+/).filter((word) => word.length > 0).length;\n};\n\n/**\n * Truncate a string to a maximum length, adding an ellipsis if truncated.\n * @param str - The string to truncate\n * @param maxLength - Maximum length before truncation\n * @param ellipsis - The ellipsis string to append (default: \"...\")\n * @returns The truncated string\n */\nexport const truncate = (str: string, maxLength: number, ellipsis = '...'): string => {\n if (!str || str.length <= maxLength) return str;\n return str.slice(0, maxLength - ellipsis.length) + ellipsis;\n};\n\n/**\n * Converts a string to a URL-safe slug.\n * Removes diacritical marks, lowercases, replaces non-alphanumeric characters with hyphens,\n * and strips leading/trailing hyphens.\n *\n * @param value - The input string to slugify\n * @returns The slugified string\n *\n * @example\n * slugify(\"Héllo Wörld!\") // → \"hello-world\"\n * slugify(\" My Blog Post \") // → \"my-blog-post\"\n */\nexport const slugify = (value: string): string => {\n if (!value) return '';\n return removeDiacriticalMarks(value)\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n};\n\n/**\n * Parses an optional comma-separated string into a trimmed, non-blank string array.\n */\nexport const parseCommaSeparatedList = (raw?: string | null): string[] => {\n if (isBlank(raw)) {\n return [];\n }\n\n return raw\n .split(',')\n .map((s: string) => s.trim())\n .filter(isNotBlank);\n};\n","import { isBlank } from \".\";\n\nexport const SCHEME_PREFIXES = {\n file: 'file',\n content: 'content',\n http: 'http',\n https: 'https',\n ftp: 'ftp',\n ftps: 'ftps',\n sftp: 'sftp',\n smb: 'smb',\n} as const;\n\nconst SCHEME_PREFIXES_ARRAY = Object.values(SCHEME_PREFIXES);\n\nexport const DATA_URI_PATTERN = /^data:([\\w.+-]+\\/[\\w.+-]+);base64,(.+)$/;\n\nexport const isValidDataUri = (uri?: string | null): boolean => {\n if (isBlank(uri)) {\n return false;\n }\n\n return DATA_URI_PATTERN.test(uri);\n};\n\nexport const hasScheme = (uri?: string | null): boolean => {\n if (!uri) {\n return false;\n }\n\n const lowerUri = uri.toLowerCase();\n return SCHEME_PREFIXES_ARRAY.some((prefix) => lowerUri.startsWith(`${prefix}://`));\n};\n\n/**\n * Extracts the base64 data from a data URI string.\n * Data URIs have the format: data:[<mediatype>][;base64],<data>\n * This function extracts everything after the first comma.\n *\n * @param dataUri - The data URI string (e.g., \"data:image/png;base64,iVBORw0KG...\")\n * @returns The base64 data without the data URI prefix, or the original string if no comma is found\n */\nexport const extractBase64FromDataUri = (dataUri: string): string => {\n return dataUri.split(',')[1] ?? dataUri;\n};\n\nexport const encodeUrl = (value?: string): string => {\n if (!value) return '';\n return encodeURIComponent(value);\n};\n\nexport const decodeUrl = (value?: string): string => {\n if (!value) return '';\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n};\n\ninterface FormatDataUriArgs {\n mimeType: string;\n base64: string;\n}\n\nexport const formatDataUri = ({ mimeType, base64 }: FormatDataUriArgs): string => {\n return `data:${mimeType};base64,${base64}`;\n};\n\nexport const getBase64ApproxSize = (base64: string): number => {\n return Math.round((base64.length * 3) / 4);\n};\n","export const VALID_IMAGE_TYPES = [\n \"image/png\",\n \"image/jpeg\",\n \"image/jpg\",\n \"image/gif\",\n \"image/webp\",\n \"image/bmp\",\n \"image/svg+xml\",\n \"image/avif\",\n \"image/tiff\",\n \"image/x-icon\",\n \"image/vnd.microsoft.icon\",\n \"image/heic\",\n \"image/heif\",\n];\n","import mime from \"mime\";\n\nimport { DATA_URI_PATTERN, isValidDataUri } from \"~/utils/uri.utils\";\nimport { VALID_IMAGE_TYPES } from './mime.utils';\n\nexport { VALID_IMAGE_TYPES } from './mime.utils';\n\nexport interface ParseDataUriResult {\n mimeType: string;\n base64: string;\n ext: string;\n}\n\nexport const parseDataUri = (input: string): ParseDataUriResult | null => {\n if (!isValidDataUri(input)) return null;\n\n const match = DATA_URI_PATTERN.exec(input);\n if (!match) return null;\n\n const [, mimeType, base64] = match;\n if (!mimeType || !base64) return null;\n\n return { mimeType, base64, ext: mimeToExt(mimeType) };\n};\n\nexport const isImageMimeType = (mimeType: string): boolean => {\n return VALID_IMAGE_TYPES.includes(mimeType);\n};\n\nexport const isValidImageFile = (file: { type: string }): boolean => {\n return isImageMimeType(file.type);\n};\n\nexport const getExtensionFromDataUri = (dataUri: string): string => {\n const parsed = parseDataUri(dataUri);\n if (!parsed) return 'bin';\n\n return parsed.ext;\n};\n\nexport const getImagePreviewSrc = (input: string): string | null => {\n const parsed = parseDataUri(input);\n if (!parsed) return null;\n if (!isImageMimeType(parsed.mimeType)) return null;\n\n return input;\n};\n\nexport const mimeToExt = (mimeType: string): string => {\n const ext = mime.getExtension(mimeType);\n if (ext) return ext;\n\n const subtype = mimeType.split(\"/\")[1] ?? mimeType;\n return subtype.split(\"+\")[0] ?? subtype;\n};\n\nexport const getMimeType = (extension: string): string => {\n const mimeType = mime.getType(extension);\n if (!mimeType) {\n throw new Error(`[getMimeType] Mime type not found for extension: \"${extension}\"`);\n }\n\n return mimeType;\n};\n\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/types.utils.ts","../src/utils/string.utils.ts","../src/utils/uri.utils.ts","../src/mime/mime.utils.ts","../src/mime/index.ts"],"names":["mime"],"mappings":"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","file":"mime.cjs","sourcesContent":["export const NO_OP: () => void = () => {};\n\nexport const isNullish = (value: unknown): value is null | undefined => value === null || value === undefined;\n\nexport const isNumber = (value?: unknown | null): value is number => {\n if (isNullish(value)) {\n return false;\n }\n\n if (typeof value !== 'number') {\n return false;\n }\n\n if (isNaN(value)) {\n return false;\n }\n\n return true;\n};\n\nexport const isString = (value?: unknown | null): value is string => {\n if (isNullish(value)) {\n return false;\n }\n\n if (typeof value !== 'string') {\n return false;\n }\n\n return true;\n};\n","import { REGEX_ALPHANUMERIC } from './regex';\nimport { isNullish } from './types.utils';\n\nexport const isBlank = (str?: string | null): str is null | undefined | '' => {\n return isNullish(str) || str?.trim() === '';\n};\n\nexport const isNotBlank = (str?: string | null): str is string => {\n return !isBlank(str);\n};\n\nexport const isAlphanumeric = (value: string): boolean => {\n return REGEX_ALPHANUMERIC.test(value);\n};\n\n/**\n * Removes diacritical marks (e.g., accents, umlauts) from a string.\n * This method normalizes the input string to its canonical decomposition\n * form (NFD) and removes any combining diacritical marks.\n *\n * @param {string} value - The input string to normalize.\n * @returns {string} - The normalized string with diacritical marks removed.\n *\n * @example\n * const result = removeDiacriticalMarks(\"Ça va très bien, n'est-ce pas?\");\n * console.log(result); // \"Ca va tres bien, n'est-ce pas?\"\n */\nexport const removeDiacriticalMarks = (value: string): string => {\n if (!value) {\n return '';\n }\n\n return value.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '');\n};\n\n/**\n * Capitalize the first letter of a string.\n * @param str - The input string\n * @returns The string with the first character uppercased\n */\nexport const capitalizeFirst = (str: string): string => {\n if (!str) return str;\n return str.charAt(0).toUpperCase() + str.slice(1);\n};\n\n/**\n * Count the number of words in a text string.\n * Words are separated by whitespace.\n * @param text - The text to count words in\n * @returns The number of words found\n */\nexport const countWords = (text: string): number => {\n if (!text || text.trim().length === 0) return 0;\n return text.split(/\\s+/).filter((word) => word.length > 0).length;\n};\n\n/**\n * Truncate a string to a maximum length, adding an ellipsis if truncated.\n * @param str - The string to truncate\n * @param maxLength - Maximum length before truncation\n * @param ellipsis - The ellipsis string to append (default: \"...\")\n * @returns The truncated string\n */\nexport const truncate = (str: string, maxLength: number, ellipsis = '...'): string => {\n if (!str || str.length <= maxLength) return str;\n return str.slice(0, maxLength - ellipsis.length) + ellipsis;\n};\n\n/**\n * Converts a string to kebab-case.\n * Handles camelCase, PascalCase, snake_case, and space-separated strings.\n *\n * @example\n * toKebabCase(\"myComponentName\") // → \"my-component-name\"\n * toKebabCase(\"XMLParser\") // → \"xml-parser\"\n */\nexport const toKebabCase = (value?: string | null): string => {\n if (isBlank(value)) return '';\n return value\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '')\n .toLowerCase();\n};\n\n/**\n * Converts a string to camelCase.\n * Handles kebab-case, snake_case, PascalCase, and space-separated strings.\n *\n * @example\n * toCamelCase(\"my-component-name\") // → \"myComponentName\"\n * toCamelCase(\"my_snake_case\") // → \"mySnakeCase\"\n */\nexport const toCamelCase = (value?: string | null): string => {\n if (isBlank(value)) return '';\n return value\n .trim()\n .replace(/[-_\\s]+(.)/g, (_, char: string) => char.toUpperCase())\n .replace(/^[A-Z]/, (char) => char.toLowerCase());\n};\n\n/**\n * Converts a string to a URL-safe slug.\n * Removes diacritical marks, lowercases, replaces non-alphanumeric characters with hyphens,\n * and strips leading/trailing hyphens.\n *\n * @param value - The input string to slugify\n * @returns The slugified string\n *\n * @example\n * slugify(\"Héllo Wörld!\") // → \"hello-world\"\n * slugify(\" My Blog Post \") // → \"my-blog-post\"\n */\nexport const slugify = (value: string): string => {\n if (!value) return '';\n return removeDiacriticalMarks(value)\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n};\n\n/**\n * Parses an optional comma-separated string into a trimmed, non-blank string array.\n */\nexport const parseCommaSeparatedList = (raw?: string | null): string[] => {\n if (isBlank(raw)) {\n return [];\n }\n\n return raw\n .split(',')\n .map((s: string) => s.trim())\n .filter(isNotBlank);\n};\n","import { isBlank } from \".\";\n\nexport const SCHEME_PREFIXES = {\n file: 'file',\n content: 'content',\n http: 'http',\n https: 'https',\n ftp: 'ftp',\n ftps: 'ftps',\n sftp: 'sftp',\n smb: 'smb',\n} as const;\n\nconst SCHEME_PREFIXES_ARRAY = Object.values(SCHEME_PREFIXES);\n\nexport const DATA_URI_PATTERN = /^data:([\\w.+-]+\\/[\\w.+-]+);base64,(.+)$/;\n\nexport const isValidDataUri = (uri?: string | null): boolean => {\n if (isBlank(uri)) {\n return false;\n }\n\n return DATA_URI_PATTERN.test(uri);\n};\n\nexport const hasScheme = (uri?: string | null): boolean => {\n if (!uri) {\n return false;\n }\n\n const lowerUri = uri.toLowerCase();\n return SCHEME_PREFIXES_ARRAY.some((prefix) => lowerUri.startsWith(`${prefix}://`));\n};\n\n/**\n * Extracts the base64 data from a data URI string.\n * Data URIs have the format: data:[<mediatype>][;base64],<data>\n * This function extracts everything after the first comma.\n *\n * @param dataUri - The data URI string (e.g., \"data:image/png;base64,iVBORw0KG...\")\n * @returns The base64 data without the data URI prefix, or the original string if no comma is found\n */\nexport const extractBase64FromDataUri = (dataUri: string): string => {\n return dataUri.split(',')[1] ?? dataUri;\n};\n\nexport const encodeUrl = (value?: string): string => {\n if (!value) return '';\n return encodeURIComponent(value);\n};\n\nexport const decodeUrl = (value?: string): string => {\n if (!value) return '';\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n};\n\ninterface FormatDataUriArgs {\n mimeType: string;\n base64: string;\n}\n\nexport const formatDataUri = ({ mimeType, base64 }: FormatDataUriArgs): string => {\n return `data:${mimeType};base64,${base64}`;\n};\n\nexport const getBase64ApproxSize = (base64: string): number => {\n return Math.round((base64.length * 3) / 4);\n};\n","export const VALID_IMAGE_TYPES = [\n \"image/png\",\n \"image/jpeg\",\n \"image/jpg\",\n \"image/gif\",\n \"image/webp\",\n \"image/bmp\",\n \"image/svg+xml\",\n \"image/avif\",\n \"image/tiff\",\n \"image/x-icon\",\n \"image/vnd.microsoft.icon\",\n \"image/heic\",\n \"image/heif\",\n];\n","import mime from \"mime\";\n\nimport { DATA_URI_PATTERN, isValidDataUri } from \"~/utils/uri.utils\";\nimport { VALID_IMAGE_TYPES } from './mime.utils';\n\nexport { VALID_IMAGE_TYPES } from './mime.utils';\n\nexport interface ParseDataUriResult {\n mimeType: string;\n base64: string;\n ext: string;\n}\n\nexport const parseDataUri = (input: string): ParseDataUriResult | null => {\n if (!isValidDataUri(input)) return null;\n\n const match = DATA_URI_PATTERN.exec(input);\n if (!match) return null;\n\n const [, mimeType, base64] = match;\n if (!mimeType || !base64) return null;\n\n return { mimeType, base64, ext: mimeToExt(mimeType) };\n};\n\nexport const isImageMimeType = (mimeType: string): boolean => {\n return VALID_IMAGE_TYPES.includes(mimeType);\n};\n\nexport const isValidImageFile = (file: { type: string }): boolean => {\n return isImageMimeType(file.type);\n};\n\nexport const getExtensionFromDataUri = (dataUri: string): string => {\n const parsed = parseDataUri(dataUri);\n if (!parsed) return 'bin';\n\n return parsed.ext;\n};\n\nexport const getImagePreviewSrc = (input: string): string | null => {\n const parsed = parseDataUri(input);\n if (!parsed) return null;\n if (!isImageMimeType(parsed.mimeType)) return null;\n\n return input;\n};\n\nexport const mimeToExt = (mimeType: string): string => {\n const ext = mime.getExtension(mimeType);\n if (ext) return ext;\n\n const subtype = mimeType.split(\"/\")[1] ?? mimeType;\n return subtype.split(\"+\")[0] ?? subtype;\n};\n\nexport const getMimeType = (extension: string): string => {\n const mimeType = mime.getType(extension);\n if (!mimeType) {\n throw new Error(`[getMimeType] Mime type not found for extension: \"${extension}\"`);\n }\n\n return mimeType;\n};\n\n"]}
|
package/dist/mime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/types.utils.ts","../src/utils/string.utils.ts","../src/utils/uri.utils.ts","../src/mime/mime.utils.ts","../src/mime/index.ts"],"names":[],"mappings":"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","file":"mime.js","sourcesContent":["export const NO_OP: () => void = () => {};\n\nexport const isNullish = (value: unknown): value is null | undefined => value === null || value === undefined;\n\nexport const isNumber = (value?: unknown | null): value is number => {\n if (isNullish(value)) {\n return false;\n }\n\n if (typeof value !== 'number') {\n return false;\n }\n\n if (isNaN(value)) {\n return false;\n }\n\n return true;\n};\n\nexport const isString = (value?: unknown | null): value is string => {\n if (isNullish(value)) {\n return false;\n }\n\n if (typeof value !== 'string') {\n return false;\n }\n\n return true;\n};\n","import { REGEX_ALPHANUMERIC } from './regex';\nimport { isNullish } from './types.utils';\n\nexport const isBlank = (str?: string | null): str is null | undefined | '' => {\n return isNullish(str) || str?.trim() === '';\n};\n\nexport const isNotBlank = (str?: string | null): str is string => {\n return !isBlank(str);\n};\n\nexport const isAlphanumeric = (value: string): boolean => {\n return REGEX_ALPHANUMERIC.test(value);\n};\n\n/**\n * Removes diacritical marks (e.g., accents, umlauts) from a string.\n * This method normalizes the input string to its canonical decomposition\n * form (NFD) and removes any combining diacritical marks.\n *\n * @param {string} value - The input string to normalize.\n * @returns {string} - The normalized string with diacritical marks removed.\n *\n * @example\n * const result = removeDiacriticalMarks(\"Ça va très bien, n'est-ce pas?\");\n * console.log(result); // \"Ca va tres bien, n'est-ce pas?\"\n */\nexport const removeDiacriticalMarks = (value: string): string => {\n if (!value) {\n return '';\n }\n\n return value.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '');\n};\n\n/**\n * Capitalize the first letter of a string.\n * @param str - The input string\n * @returns The string with the first character uppercased\n */\nexport const capitalizeFirst = (str: string): string => {\n if (!str) return str;\n return str.charAt(0).toUpperCase() + str.slice(1);\n};\n\n/**\n * Count the number of words in a text string.\n * Words are separated by whitespace.\n * @param text - The text to count words in\n * @returns The number of words found\n */\nexport const countWords = (text: string): number => {\n if (!text || text.trim().length === 0) return 0;\n return text.split(/\\s+/).filter((word) => word.length > 0).length;\n};\n\n/**\n * Truncate a string to a maximum length, adding an ellipsis if truncated.\n * @param str - The string to truncate\n * @param maxLength - Maximum length before truncation\n * @param ellipsis - The ellipsis string to append (default: \"...\")\n * @returns The truncated string\n */\nexport const truncate = (str: string, maxLength: number, ellipsis = '...'): string => {\n if (!str || str.length <= maxLength) return str;\n return str.slice(0, maxLength - ellipsis.length) + ellipsis;\n};\n\n/**\n * Converts a string to a URL-safe slug.\n * Removes diacritical marks, lowercases, replaces non-alphanumeric characters with hyphens,\n * and strips leading/trailing hyphens.\n *\n * @param value - The input string to slugify\n * @returns The slugified string\n *\n * @example\n * slugify(\"Héllo Wörld!\") // → \"hello-world\"\n * slugify(\" My Blog Post \") // → \"my-blog-post\"\n */\nexport const slugify = (value: string): string => {\n if (!value) return '';\n return removeDiacriticalMarks(value)\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n};\n\n/**\n * Parses an optional comma-separated string into a trimmed, non-blank string array.\n */\nexport const parseCommaSeparatedList = (raw?: string | null): string[] => {\n if (isBlank(raw)) {\n return [];\n }\n\n return raw\n .split(',')\n .map((s: string) => s.trim())\n .filter(isNotBlank);\n};\n","import { isBlank } from \".\";\n\nexport const SCHEME_PREFIXES = {\n file: 'file',\n content: 'content',\n http: 'http',\n https: 'https',\n ftp: 'ftp',\n ftps: 'ftps',\n sftp: 'sftp',\n smb: 'smb',\n} as const;\n\nconst SCHEME_PREFIXES_ARRAY = Object.values(SCHEME_PREFIXES);\n\nexport const DATA_URI_PATTERN = /^data:([\\w.+-]+\\/[\\w.+-]+);base64,(.+)$/;\n\nexport const isValidDataUri = (uri?: string | null): boolean => {\n if (isBlank(uri)) {\n return false;\n }\n\n return DATA_URI_PATTERN.test(uri);\n};\n\nexport const hasScheme = (uri?: string | null): boolean => {\n if (!uri) {\n return false;\n }\n\n const lowerUri = uri.toLowerCase();\n return SCHEME_PREFIXES_ARRAY.some((prefix) => lowerUri.startsWith(`${prefix}://`));\n};\n\n/**\n * Extracts the base64 data from a data URI string.\n * Data URIs have the format: data:[<mediatype>][;base64],<data>\n * This function extracts everything after the first comma.\n *\n * @param dataUri - The data URI string (e.g., \"data:image/png;base64,iVBORw0KG...\")\n * @returns The base64 data without the data URI prefix, or the original string if no comma is found\n */\nexport const extractBase64FromDataUri = (dataUri: string): string => {\n return dataUri.split(',')[1] ?? dataUri;\n};\n\nexport const encodeUrl = (value?: string): string => {\n if (!value) return '';\n return encodeURIComponent(value);\n};\n\nexport const decodeUrl = (value?: string): string => {\n if (!value) return '';\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n};\n\ninterface FormatDataUriArgs {\n mimeType: string;\n base64: string;\n}\n\nexport const formatDataUri = ({ mimeType, base64 }: FormatDataUriArgs): string => {\n return `data:${mimeType};base64,${base64}`;\n};\n\nexport const getBase64ApproxSize = (base64: string): number => {\n return Math.round((base64.length * 3) / 4);\n};\n","export const VALID_IMAGE_TYPES = [\n \"image/png\",\n \"image/jpeg\",\n \"image/jpg\",\n \"image/gif\",\n \"image/webp\",\n \"image/bmp\",\n \"image/svg+xml\",\n \"image/avif\",\n \"image/tiff\",\n \"image/x-icon\",\n \"image/vnd.microsoft.icon\",\n \"image/heic\",\n \"image/heif\",\n];\n","import mime from \"mime\";\n\nimport { DATA_URI_PATTERN, isValidDataUri } from \"~/utils/uri.utils\";\nimport { VALID_IMAGE_TYPES } from './mime.utils';\n\nexport { VALID_IMAGE_TYPES } from './mime.utils';\n\nexport interface ParseDataUriResult {\n mimeType: string;\n base64: string;\n ext: string;\n}\n\nexport const parseDataUri = (input: string): ParseDataUriResult | null => {\n if (!isValidDataUri(input)) return null;\n\n const match = DATA_URI_PATTERN.exec(input);\n if (!match) return null;\n\n const [, mimeType, base64] = match;\n if (!mimeType || !base64) return null;\n\n return { mimeType, base64, ext: mimeToExt(mimeType) };\n};\n\nexport const isImageMimeType = (mimeType: string): boolean => {\n return VALID_IMAGE_TYPES.includes(mimeType);\n};\n\nexport const isValidImageFile = (file: { type: string }): boolean => {\n return isImageMimeType(file.type);\n};\n\nexport const getExtensionFromDataUri = (dataUri: string): string => {\n const parsed = parseDataUri(dataUri);\n if (!parsed) return 'bin';\n\n return parsed.ext;\n};\n\nexport const getImagePreviewSrc = (input: string): string | null => {\n const parsed = parseDataUri(input);\n if (!parsed) return null;\n if (!isImageMimeType(parsed.mimeType)) return null;\n\n return input;\n};\n\nexport const mimeToExt = (mimeType: string): string => {\n const ext = mime.getExtension(mimeType);\n if (ext) return ext;\n\n const subtype = mimeType.split(\"/\")[1] ?? mimeType;\n return subtype.split(\"+\")[0] ?? subtype;\n};\n\nexport const getMimeType = (extension: string): string => {\n const mimeType = mime.getType(extension);\n if (!mimeType) {\n throw new Error(`[getMimeType] Mime type not found for extension: \"${extension}\"`);\n }\n\n return mimeType;\n};\n\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/types.utils.ts","../src/utils/string.utils.ts","../src/utils/uri.utils.ts","../src/mime/mime.utils.ts","../src/mime/index.ts"],"names":[],"mappings":"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","file":"mime.js","sourcesContent":["export const NO_OP: () => void = () => {};\n\nexport const isNullish = (value: unknown): value is null | undefined => value === null || value === undefined;\n\nexport const isNumber = (value?: unknown | null): value is number => {\n if (isNullish(value)) {\n return false;\n }\n\n if (typeof value !== 'number') {\n return false;\n }\n\n if (isNaN(value)) {\n return false;\n }\n\n return true;\n};\n\nexport const isString = (value?: unknown | null): value is string => {\n if (isNullish(value)) {\n return false;\n }\n\n if (typeof value !== 'string') {\n return false;\n }\n\n return true;\n};\n","import { REGEX_ALPHANUMERIC } from './regex';\nimport { isNullish } from './types.utils';\n\nexport const isBlank = (str?: string | null): str is null | undefined | '' => {\n return isNullish(str) || str?.trim() === '';\n};\n\nexport const isNotBlank = (str?: string | null): str is string => {\n return !isBlank(str);\n};\n\nexport const isAlphanumeric = (value: string): boolean => {\n return REGEX_ALPHANUMERIC.test(value);\n};\n\n/**\n * Removes diacritical marks (e.g., accents, umlauts) from a string.\n * This method normalizes the input string to its canonical decomposition\n * form (NFD) and removes any combining diacritical marks.\n *\n * @param {string} value - The input string to normalize.\n * @returns {string} - The normalized string with diacritical marks removed.\n *\n * @example\n * const result = removeDiacriticalMarks(\"Ça va très bien, n'est-ce pas?\");\n * console.log(result); // \"Ca va tres bien, n'est-ce pas?\"\n */\nexport const removeDiacriticalMarks = (value: string): string => {\n if (!value) {\n return '';\n }\n\n return value.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '');\n};\n\n/**\n * Capitalize the first letter of a string.\n * @param str - The input string\n * @returns The string with the first character uppercased\n */\nexport const capitalizeFirst = (str: string): string => {\n if (!str) return str;\n return str.charAt(0).toUpperCase() + str.slice(1);\n};\n\n/**\n * Count the number of words in a text string.\n * Words are separated by whitespace.\n * @param text - The text to count words in\n * @returns The number of words found\n */\nexport const countWords = (text: string): number => {\n if (!text || text.trim().length === 0) return 0;\n return text.split(/\\s+/).filter((word) => word.length > 0).length;\n};\n\n/**\n * Truncate a string to a maximum length, adding an ellipsis if truncated.\n * @param str - The string to truncate\n * @param maxLength - Maximum length before truncation\n * @param ellipsis - The ellipsis string to append (default: \"...\")\n * @returns The truncated string\n */\nexport const truncate = (str: string, maxLength: number, ellipsis = '...'): string => {\n if (!str || str.length <= maxLength) return str;\n return str.slice(0, maxLength - ellipsis.length) + ellipsis;\n};\n\n/**\n * Converts a string to kebab-case.\n * Handles camelCase, PascalCase, snake_case, and space-separated strings.\n *\n * @example\n * toKebabCase(\"myComponentName\") // → \"my-component-name\"\n * toKebabCase(\"XMLParser\") // → \"xml-parser\"\n */\nexport const toKebabCase = (value?: string | null): string => {\n if (isBlank(value)) return '';\n return value\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '')\n .toLowerCase();\n};\n\n/**\n * Converts a string to camelCase.\n * Handles kebab-case, snake_case, PascalCase, and space-separated strings.\n *\n * @example\n * toCamelCase(\"my-component-name\") // → \"myComponentName\"\n * toCamelCase(\"my_snake_case\") // → \"mySnakeCase\"\n */\nexport const toCamelCase = (value?: string | null): string => {\n if (isBlank(value)) return '';\n return value\n .trim()\n .replace(/[-_\\s]+(.)/g, (_, char: string) => char.toUpperCase())\n .replace(/^[A-Z]/, (char) => char.toLowerCase());\n};\n\n/**\n * Converts a string to a URL-safe slug.\n * Removes diacritical marks, lowercases, replaces non-alphanumeric characters with hyphens,\n * and strips leading/trailing hyphens.\n *\n * @param value - The input string to slugify\n * @returns The slugified string\n *\n * @example\n * slugify(\"Héllo Wörld!\") // → \"hello-world\"\n * slugify(\" My Blog Post \") // → \"my-blog-post\"\n */\nexport const slugify = (value: string): string => {\n if (!value) return '';\n return removeDiacriticalMarks(value)\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n};\n\n/**\n * Parses an optional comma-separated string into a trimmed, non-blank string array.\n */\nexport const parseCommaSeparatedList = (raw?: string | null): string[] => {\n if (isBlank(raw)) {\n return [];\n }\n\n return raw\n .split(',')\n .map((s: string) => s.trim())\n .filter(isNotBlank);\n};\n","import { isBlank } from \".\";\n\nexport const SCHEME_PREFIXES = {\n file: 'file',\n content: 'content',\n http: 'http',\n https: 'https',\n ftp: 'ftp',\n ftps: 'ftps',\n sftp: 'sftp',\n smb: 'smb',\n} as const;\n\nconst SCHEME_PREFIXES_ARRAY = Object.values(SCHEME_PREFIXES);\n\nexport const DATA_URI_PATTERN = /^data:([\\w.+-]+\\/[\\w.+-]+);base64,(.+)$/;\n\nexport const isValidDataUri = (uri?: string | null): boolean => {\n if (isBlank(uri)) {\n return false;\n }\n\n return DATA_URI_PATTERN.test(uri);\n};\n\nexport const hasScheme = (uri?: string | null): boolean => {\n if (!uri) {\n return false;\n }\n\n const lowerUri = uri.toLowerCase();\n return SCHEME_PREFIXES_ARRAY.some((prefix) => lowerUri.startsWith(`${prefix}://`));\n};\n\n/**\n * Extracts the base64 data from a data URI string.\n * Data URIs have the format: data:[<mediatype>][;base64],<data>\n * This function extracts everything after the first comma.\n *\n * @param dataUri - The data URI string (e.g., \"data:image/png;base64,iVBORw0KG...\")\n * @returns The base64 data without the data URI prefix, or the original string if no comma is found\n */\nexport const extractBase64FromDataUri = (dataUri: string): string => {\n return dataUri.split(',')[1] ?? dataUri;\n};\n\nexport const encodeUrl = (value?: string): string => {\n if (!value) return '';\n return encodeURIComponent(value);\n};\n\nexport const decodeUrl = (value?: string): string => {\n if (!value) return '';\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n};\n\ninterface FormatDataUriArgs {\n mimeType: string;\n base64: string;\n}\n\nexport const formatDataUri = ({ mimeType, base64 }: FormatDataUriArgs): string => {\n return `data:${mimeType};base64,${base64}`;\n};\n\nexport const getBase64ApproxSize = (base64: string): number => {\n return Math.round((base64.length * 3) / 4);\n};\n","export const VALID_IMAGE_TYPES = [\n \"image/png\",\n \"image/jpeg\",\n \"image/jpg\",\n \"image/gif\",\n \"image/webp\",\n \"image/bmp\",\n \"image/svg+xml\",\n \"image/avif\",\n \"image/tiff\",\n \"image/x-icon\",\n \"image/vnd.microsoft.icon\",\n \"image/heic\",\n \"image/heif\",\n];\n","import mime from \"mime\";\n\nimport { DATA_URI_PATTERN, isValidDataUri } from \"~/utils/uri.utils\";\nimport { VALID_IMAGE_TYPES } from './mime.utils';\n\nexport { VALID_IMAGE_TYPES } from './mime.utils';\n\nexport interface ParseDataUriResult {\n mimeType: string;\n base64: string;\n ext: string;\n}\n\nexport const parseDataUri = (input: string): ParseDataUriResult | null => {\n if (!isValidDataUri(input)) return null;\n\n const match = DATA_URI_PATTERN.exec(input);\n if (!match) return null;\n\n const [, mimeType, base64] = match;\n if (!mimeType || !base64) return null;\n\n return { mimeType, base64, ext: mimeToExt(mimeType) };\n};\n\nexport const isImageMimeType = (mimeType: string): boolean => {\n return VALID_IMAGE_TYPES.includes(mimeType);\n};\n\nexport const isValidImageFile = (file: { type: string }): boolean => {\n return isImageMimeType(file.type);\n};\n\nexport const getExtensionFromDataUri = (dataUri: string): string => {\n const parsed = parseDataUri(dataUri);\n if (!parsed) return 'bin';\n\n return parsed.ext;\n};\n\nexport const getImagePreviewSrc = (input: string): string | null => {\n const parsed = parseDataUri(input);\n if (!parsed) return null;\n if (!isImageMimeType(parsed.mimeType)) return null;\n\n return input;\n};\n\nexport const mimeToExt = (mimeType: string): string => {\n const ext = mime.getExtension(mimeType);\n if (ext) return ext;\n\n const subtype = mimeType.split(\"/\")[1] ?? mimeType;\n return subtype.split(\"+\")[0] ?? subtype;\n};\n\nexport const getMimeType = (extension: string): string => {\n const mimeType = mime.getType(extension);\n if (!mimeType) {\n throw new Error(`[getMimeType] Mime type not found for extension: \"${extension}\"`);\n }\n\n return mimeType;\n};\n\n"]}
|
package/dist/rjsf.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/rjsf/i18n/en/rjsf.json","../src/rjsf/i18n/fr/rjsf.json","../src/rjsf/i18n/i18n.ts","../src/utils/types.utils.ts","../src/utils/string.utils.ts","../src/rjsf/utils/rjsf-i18n.utils.ts","../src/rjsf/utils/rjsf-widgets.utils.ts","../src/rjsf/utils/use-localized-form.ts","../src/rjsf/utils/use-rjsf-validator.ts"],"names":["rjsf_default","replaceStringParameters","useTranslation","localizer","customizeValidator"],"mappings":"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","file":"rjsf.cjs","sourcesContent":["{\n \"rjsf\": {\n \"add\": \"Add\",\n \"debugFormDataTitle\": \"JSON data\",\n \"addItem\": \"Add Item\",\n \"clear\": \"Clear\",\n \"errors\": \"Errors detected in the form\",\n \"copy\": \"Copy\",\n \"keyLabel\": \"%1 Key\",\n \"moveDown\": \"Move down\",\n \"moveUp\": \"Move up\",\n \"no\": \"No\",\n \"remove\": \"Remove\",\n \"submit\": \"Submit\",\n \"yes\": \"Yes\"\n }\n}\n","{\n \"rjsf\": {\n \"add\": \"Ajouter\",\n \"debugFormDataTitle\": \"Données JSON\",\n \"addItem\": \"Ajouter un élément\",\n \"clear\": \"Effacer\",\n \"errors\": \"Erreurs détectées dans le formulaire\",\n \"copy\": \"Copier\",\n \"keyLabel\": \"Clé %1\",\n \"moveDown\": \"Déplacer vers le bas\",\n \"moveUp\": \"Déplacer vers le haut\",\n \"no\": \"Non\",\n \"remove\": \"Supprimer\",\n \"submit\": \"Envoyer\",\n \"yes\": \"Oui\"\n }\n}\n","import type { i18n } from \"i18next\";\n\nimport en from \"./en/rjsf.json\";\nimport fr from \"./fr/rjsf.json\";\n\nconst RJSF_NAMESPACE = \"rjsf\";\n\nexport const addResourceBundleForRjsf = (instance: i18n): void => {\n if (!instance?.isInitialized) {\n throw new Error(\"[addResourceBundleForRjsf] i18next must be initialized prior to calling this method. Call initI18N() or i18next.init() first.\");\n }\n\n if (instance.hasResourceBundle(\"en\", RJSF_NAMESPACE)) return;\n\n const isDeep = true;\n const isOverwrite = true;\n\n instance.addResourceBundle(\"en\", RJSF_NAMESPACE, en.rjsf, isDeep, isOverwrite);\n instance.addResourceBundle(\"fr\", RJSF_NAMESPACE, fr.rjsf, isDeep, isOverwrite);\n\n // Note: if ever we get duplicated instances of react-i18next, we will need to register the\n // instance provided by this ts-common package like so:\n // import { initReactI18next } from 'react-i18next'\n // instance.use(initReactI18next);\n\n // eslint-disable-next-line no-console\n console.info('[addResourceBundleForRjsf] RJSF i18n initialized'); \n};\n","export const NO_OP: () => void = () => {};\n\nexport const isNullish = (value: unknown): value is null | undefined => value === null || value === undefined;\n\nexport const isNumber = (value?: unknown | null): value is number => {\n if (isNullish(value)) {\n return false;\n }\n\n if (typeof value !== 'number') {\n return false;\n }\n\n if (isNaN(value)) {\n return false;\n }\n\n return true;\n};\n\nexport const isString = (value?: unknown | null): value is string => {\n if (isNullish(value)) {\n return false;\n }\n\n if (typeof value !== 'string') {\n return false;\n }\n\n return true;\n};\n","import { REGEX_ALPHANUMERIC } from './regex';\nimport { isNullish } from './types.utils';\n\nexport const isBlank = (str?: string | null): str is null | undefined | '' => {\n return isNullish(str) || str?.trim() === '';\n};\n\nexport const isNotBlank = (str?: string | null): str is string => {\n return !isBlank(str);\n};\n\nexport const isAlphanumeric = (value: string): boolean => {\n return REGEX_ALPHANUMERIC.test(value);\n};\n\n/**\n * Removes diacritical marks (e.g., accents, umlauts) from a string.\n * This method normalizes the input string to its canonical decomposition\n * form (NFD) and removes any combining diacritical marks.\n *\n * @param {string} value - The input string to normalize.\n * @returns {string} - The normalized string with diacritical marks removed.\n *\n * @example\n * const result = removeDiacriticalMarks(\"Ça va très bien, n'est-ce pas?\");\n * console.log(result); // \"Ca va tres bien, n'est-ce pas?\"\n */\nexport const removeDiacriticalMarks = (value: string): string => {\n if (!value) {\n return '';\n }\n\n return value.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '');\n};\n\n/**\n * Capitalize the first letter of a string.\n * @param str - The input string\n * @returns The string with the first character uppercased\n */\nexport const capitalizeFirst = (str: string): string => {\n if (!str) return str;\n return str.charAt(0).toUpperCase() + str.slice(1);\n};\n\n/**\n * Count the number of words in a text string.\n * Words are separated by whitespace.\n * @param text - The text to count words in\n * @returns The number of words found\n */\nexport const countWords = (text: string): number => {\n if (!text || text.trim().length === 0) return 0;\n return text.split(/\\s+/).filter((word) => word.length > 0).length;\n};\n\n/**\n * Truncate a string to a maximum length, adding an ellipsis if truncated.\n * @param str - The string to truncate\n * @param maxLength - Maximum length before truncation\n * @param ellipsis - The ellipsis string to append (default: \"...\")\n * @returns The truncated string\n */\nexport const truncate = (str: string, maxLength: number, ellipsis = '...'): string => {\n if (!str || str.length <= maxLength) return str;\n return str.slice(0, maxLength - ellipsis.length) + ellipsis;\n};\n\n/**\n * Converts a string to a URL-safe slug.\n * Removes diacritical marks, lowercases, replaces non-alphanumeric characters with hyphens,\n * and strips leading/trailing hyphens.\n *\n * @param value - The input string to slugify\n * @returns The slugified string\n *\n * @example\n * slugify(\"Héllo Wörld!\") // → \"hello-world\"\n * slugify(\" My Blog Post \") // → \"my-blog-post\"\n */\nexport const slugify = (value: string): string => {\n if (!value) return '';\n return removeDiacriticalMarks(value)\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n};\n\n/**\n * Parses an optional comma-separated string into a trimmed, non-blank string array.\n */\nexport const parseCommaSeparatedList = (raw?: string | null): string[] => {\n if (isBlank(raw)) {\n return [];\n }\n\n return raw\n .split(',')\n .map((s: string) => s.trim())\n .filter(isNotBlank);\n};\n","import { replaceStringParameters } from \"@rjsf/utils\";\nimport { i18n } from \"i18next\";\nimport { isBlank } from \"../../utils/string.utils\";\n\n/** Maps RJSF TranslatableString values to our i18n keys (rjsf namespace). */\nexport const RJSF_STRING_TO_I18N_KEY: Record<string, string> = {\n \"Add Item\": \"rjsf:addItem\",\n Add: \"rjsf:add\",\n Copy: \"rjsf:copy\",\n \"Move down\": \"rjsf:moveDown\",\n \"Move up\": \"rjsf:moveUp\",\n Remove: \"rjsf:remove\",\n \"clear input\": \"rjsf:clear\",\n \"%1 Key\": \"rjsf:keyLabel\", // TODO: RJSF-001 find a way to dynamicaly resolve the rjsf-i18n.utils \"%1 Key\" pattern\n Yes: \"rjsf:yes\",\n No: \"rjsf:no\",\n Errors: \"rjsf:errors\",\n};\n\ninterface TranslateStringArgs {\n i18n: i18n;\n stringToTranslate: string;\n params?: string[];\n}\n\nexport const translateRjsfString = ({ stringToTranslate, params, i18n }: TranslateStringArgs): string => {\n const i18nKey = RJSF_STRING_TO_I18N_KEY[stringToTranslate];\n if (isBlank(i18nKey)) {\n // eslint-disable-next-line no-console\n console.warn(`[translateRjsfString] RJSF i18n: missing key: \"${stringToTranslate}\"`);\n }\n\n const translated = i18nKey ? i18n.t(i18nKey) : stringToTranslate;\n return replaceStringParameters(translated, params);\n};\n","import type { WidgetProps } from \"@rjsf/utils\";\nimport { isBlank } from \"../../utils/string.utils\";\nimport { isNullish } from \"../../utils/types.utils\";\n\n/**\n * Returns true when the widget has at least one validation error from RJSF.\n *\n * @param rawErrors - The rawErrors from WidgetProps (often `unknown`).\n * @returns true if rawErrors is a non-empty array.\n */\nexport const hasRjsfErrors = (rawErrors: unknown): boolean => Array.isArray(rawErrors) && rawErrors.length > 0;\n\nexport interface GetRjsfDisplayLabelArgs {\n label?: string;\n required?: boolean;\n hideLabel?: boolean;\n}\n\n/**\n * Returns the label to display for an RJSF widget, with optional required asterisk and\n * hideLabel support.\n *\n * @param label - The label to display for the widget.\n * @param required - Whether the field is required.\n * @param hideLabel - Whether to hide the label.\n *\n * @returns The label to display for the widget.\n */\nexport const getRjsfDisplayLabel = ({ label, required, hideLabel }: GetRjsfDisplayLabelArgs): string | undefined => {\n if (hideLabel) return undefined;\n if (isBlank(label)) return undefined;\n\n const requiredSuffix = required ? \" *\" : \"\";\n return `${label}${requiredSuffix}`;\n};\n\nconst HEX_COLOR_PATTERN = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/;\n\n/**\n * Reads the `labelColor` from a widget/field `ui:options` object.\n *\n * @param options - The `ui:options` object (e.g. WidgetProps.options or uiSchema[\"ui:options\"]).\n * @returns A validated hex color string (#RGB or #RRGGBB), or undefined when missing/invalid (default color).\n */\nexport const getRjsfLabelColor = (options?: Record<string, unknown> | null): string | undefined => {\n const color = options?.labelColor;\n if (typeof color !== \"string\") return undefined;\n const trimmed = color.trim();\n return HEX_COLOR_PATTERN.test(trimmed) ? trimmed : undefined;\n};\n\ninterface EnumOption {\n value: string;\n label: string;\n}\n\nexport type EnumOptionDisplay = { label: string; value: string };\n\nconst toEnumOptionDisplay = (o: EnumOption): EnumOptionDisplay => ({\n label: o?.label ?? String(o?.value ?? \"\"),\n value: String(o?.value ?? \"\"),\n});\n\nexport const mapEnumOptions = (options: WidgetProps[\"options\"]): EnumOptionDisplay[] => {\n const enumOptions = options?.enumOptions as EnumOption[] | undefined;\n if (!Array.isArray(enumOptions)) return [];\n return enumOptions.map(toEnumOptionDisplay);\n};\n\n/**\n * Converts a value to display string, or empty string when null/undefined.\n */\nexport const toStringOrEmpty = (value: unknown): string => (isNullish(value) ? \"\" : String(value));\n\n/**\n * Converts a value to display string, or undefined when null/undefined (e.g. for select placeholder).\n */\nexport const toStringOrUndefined = (value: unknown): string | undefined =>\n isNullish(value) ? undefined : String(value);\n\nexport interface GetRjsfTextChangeValueArgs {\n text: string;\n emptyValue?: unknown;\n}\n\n/**\n * Returns the value to pass to onChange for a text input.\n *\n * @param args.text - The current text input value.\n * @param args.emptyValue - The value to use when text is empty (e.g. options.emptyValue from WidgetProps).\n * @returns emptyValue when text is empty, otherwise text.\n */\nexport const getRjsfTextChangeValue = ({ text, emptyValue }: GetRjsfTextChangeValueArgs): unknown => {\n if (text === \"\") return emptyValue;\n return text;\n};\n\nexport const parseDateOrNull = (value?: string): Date | null => {\n if (isBlank(value)) return null;\n\n const date = new Date(value);\n const isValid = !Number.isNaN(date.getTime());\n return isValid ? date : null;\n};\n\n/** Returns YYYY-MM-DD for JSON Schema \"date\" format (form storage). */\nexport const dateToDateOnlyString = (date: Date): string => {\n const y = date.getFullYear();\n const m = String(date.getMonth() + 1).padStart(2, \"0\");\n const d = String(date.getDate()).padStart(2, \"0\");\n return `${y}-${m}-${d}`;\n};\n\nconst DATE_ONLY_REGEX = /^\\d{4}-\\d{2}-\\d{2}$/;\n\n/** Parses a date-only or full ISO string into a Date at local midnight (for date picker display). */\nexport const parseDateOnlyToLocalDate = (value?: string): Date | null => {\n if (isBlank(value)) return null;\n\n const trimmed = String(value).trim();\n const dateOnly = trimmed.slice(0, 10);\n if (!DATE_ONLY_REGEX.test(dateOnly)) return null;\n\n const [y, m, d] = dateOnly.split(\"-\").map(Number);\n return new Date(y, m - 1, d);\n};\n\n/** Extracts date-only YYYY-MM-DD for display from a full ISO or date-only string. */\nexport const formatDateOnlyForDisplay = (value?: string): string => {\n if (isBlank(value)) return \"\";\n\n const trimmed = String(value).trim();\n const dateOnly = trimmed.slice(0, 10);\n return DATE_ONLY_REGEX.test(dateOnly) ? dateOnly : \"\";\n};\n\n/** Formats a full ISO or date string for date-time display (locale string). */\nexport const formatDateTimeForDisplay = (value?: string): string => {\n const date = parseDateOrNull(value);\n return date ? date.toLocaleString() : \"\";\n};\n\ntype FormLayoutContext = {\n labelCol?: { span: number };\n wrapperCol?: { span: number };\n};\n\nconst DEFAULT_SPAN = 24;\n\nexport const getFormLayoutCols = (formContext?: unknown): FormLayoutContext => {\n if (isNullish(formContext)) {\n return {\n labelCol: { span: DEFAULT_SPAN },\n wrapperCol: { span: DEFAULT_SPAN },\n };\n }\n\n const { labelCol, wrapperCol } = formContext as FormLayoutContext;\n return {\n labelCol: labelCol ?? { span: DEFAULT_SPAN },\n wrapperCol: wrapperCol ?? { span: DEFAULT_SPAN },\n };\n};\n","import { isBlank } from \"../../utils/string.utils\";\nimport { useTranslation } from \"react-i18next\";\nimport type { LocalizedFormSchema, MetaFormSchema } from \"./rjsf-i18n-types\";\n\nconst DEFAULT_LANGUAGE = \"fr\";\n\n// i18n.language can be 'fr-CA', so we take the first part\nconst parseSimplifiedLangCode = (language?: string): string => {\n if (isBlank(language)) return DEFAULT_LANGUAGE;\n return language.split(\"-\")[0];\n};\n\nconst getFallbackLanguage = (metaFormSchema: MetaFormSchema): string => {\n return Object.keys(metaFormSchema.i18n)[0] ?? DEFAULT_LANGUAGE;\n};\n\nexport const useLocalizedForm = (metaFormSchema: MetaFormSchema): LocalizedFormSchema => {\n const { i18n } = useTranslation();\n const language = parseSimplifiedLangCode(i18n.language);\n\n if (metaFormSchema.i18n[language]) {\n return metaFormSchema.i18n[language];\n }\n\n const fallbackLanguage = getFallbackLanguage(metaFormSchema);\n // eslint-disable-next-line no-console\n console.warn(\n `Language ${language} not found in metaFormSchema ${metaFormSchema.id}. Falling back to ${fallbackLanguage}.`\n );\n\n return metaFormSchema.i18n[fallbackLanguage];\n};\n","import { customizeValidator, type Localizer } from \"@rjsf/validator-ajv8\";\nimport localizer from \"ajv-i18n\";\n\nconst customFormats = {\n \"phone-america\": /^\\(?\\d{3}\\)?[\\s-]?\\d{3}[\\s-]?\\d{4}$/,\n};\n\ntype ValidationLanguages = keyof typeof localizer;\n\nexport const useRjsfValidator = (language: string) => {\n const appLanguage = language as ValidationLanguages;\n const localizerFn: Localizer = localizer[appLanguage] ?? localizer.en;\n\n return customizeValidator({ customFormats }, localizerFn);\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/rjsf/i18n/en/rjsf.json","../src/rjsf/i18n/fr/rjsf.json","../src/rjsf/i18n/i18n.ts","../src/utils/types.utils.ts","../src/utils/string.utils.ts","../src/rjsf/utils/rjsf-i18n.utils.ts","../src/rjsf/utils/rjsf-widgets.utils.ts","../src/rjsf/utils/use-localized-form.ts","../src/rjsf/utils/use-rjsf-validator.ts"],"names":["rjsf_default","replaceStringParameters","useTranslation","localizer","customizeValidator"],"mappings":"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","file":"rjsf.cjs","sourcesContent":["{\n \"rjsf\": {\n \"add\": \"Add\",\n \"debugFormDataTitle\": \"JSON data\",\n \"addItem\": \"Add Item\",\n \"clear\": \"Clear\",\n \"errors\": \"Errors detected in the form\",\n \"copy\": \"Copy\",\n \"keyLabel\": \"%1 Key\",\n \"moveDown\": \"Move down\",\n \"moveUp\": \"Move up\",\n \"no\": \"No\",\n \"remove\": \"Remove\",\n \"submit\": \"Submit\",\n \"yes\": \"Yes\"\n }\n}\n","{\n \"rjsf\": {\n \"add\": \"Ajouter\",\n \"debugFormDataTitle\": \"Données JSON\",\n \"addItem\": \"Ajouter un élément\",\n \"clear\": \"Effacer\",\n \"errors\": \"Erreurs détectées dans le formulaire\",\n \"copy\": \"Copier\",\n \"keyLabel\": \"Clé %1\",\n \"moveDown\": \"Déplacer vers le bas\",\n \"moveUp\": \"Déplacer vers le haut\",\n \"no\": \"Non\",\n \"remove\": \"Supprimer\",\n \"submit\": \"Envoyer\",\n \"yes\": \"Oui\"\n }\n}\n","import type { i18n } from \"i18next\";\n\nimport en from \"./en/rjsf.json\";\nimport fr from \"./fr/rjsf.json\";\n\nconst RJSF_NAMESPACE = \"rjsf\";\n\nexport const addResourceBundleForRjsf = (instance: i18n): void => {\n if (!instance?.isInitialized) {\n throw new Error(\"[addResourceBundleForRjsf] i18next must be initialized prior to calling this method. Call initI18N() or i18next.init() first.\");\n }\n\n if (instance.hasResourceBundle(\"en\", RJSF_NAMESPACE)) return;\n\n const isDeep = true;\n const isOverwrite = true;\n\n instance.addResourceBundle(\"en\", RJSF_NAMESPACE, en.rjsf, isDeep, isOverwrite);\n instance.addResourceBundle(\"fr\", RJSF_NAMESPACE, fr.rjsf, isDeep, isOverwrite);\n\n // Note: if ever we get duplicated instances of react-i18next, we will need to register the\n // instance provided by this ts-common package like so:\n // import { initReactI18next } from 'react-i18next'\n // instance.use(initReactI18next);\n\n // eslint-disable-next-line no-console\n console.info('[addResourceBundleForRjsf] RJSF i18n initialized'); \n};\n","export const NO_OP: () => void = () => {};\n\nexport const isNullish = (value: unknown): value is null | undefined => value === null || value === undefined;\n\nexport const isNumber = (value?: unknown | null): value is number => {\n if (isNullish(value)) {\n return false;\n }\n\n if (typeof value !== 'number') {\n return false;\n }\n\n if (isNaN(value)) {\n return false;\n }\n\n return true;\n};\n\nexport const isString = (value?: unknown | null): value is string => {\n if (isNullish(value)) {\n return false;\n }\n\n if (typeof value !== 'string') {\n return false;\n }\n\n return true;\n};\n","import { REGEX_ALPHANUMERIC } from './regex';\nimport { isNullish } from './types.utils';\n\nexport const isBlank = (str?: string | null): str is null | undefined | '' => {\n return isNullish(str) || str?.trim() === '';\n};\n\nexport const isNotBlank = (str?: string | null): str is string => {\n return !isBlank(str);\n};\n\nexport const isAlphanumeric = (value: string): boolean => {\n return REGEX_ALPHANUMERIC.test(value);\n};\n\n/**\n * Removes diacritical marks (e.g., accents, umlauts) from a string.\n * This method normalizes the input string to its canonical decomposition\n * form (NFD) and removes any combining diacritical marks.\n *\n * @param {string} value - The input string to normalize.\n * @returns {string} - The normalized string with diacritical marks removed.\n *\n * @example\n * const result = removeDiacriticalMarks(\"Ça va très bien, n'est-ce pas?\");\n * console.log(result); // \"Ca va tres bien, n'est-ce pas?\"\n */\nexport const removeDiacriticalMarks = (value: string): string => {\n if (!value) {\n return '';\n }\n\n return value.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '');\n};\n\n/**\n * Capitalize the first letter of a string.\n * @param str - The input string\n * @returns The string with the first character uppercased\n */\nexport const capitalizeFirst = (str: string): string => {\n if (!str) return str;\n return str.charAt(0).toUpperCase() + str.slice(1);\n};\n\n/**\n * Count the number of words in a text string.\n * Words are separated by whitespace.\n * @param text - The text to count words in\n * @returns The number of words found\n */\nexport const countWords = (text: string): number => {\n if (!text || text.trim().length === 0) return 0;\n return text.split(/\\s+/).filter((word) => word.length > 0).length;\n};\n\n/**\n * Truncate a string to a maximum length, adding an ellipsis if truncated.\n * @param str - The string to truncate\n * @param maxLength - Maximum length before truncation\n * @param ellipsis - The ellipsis string to append (default: \"...\")\n * @returns The truncated string\n */\nexport const truncate = (str: string, maxLength: number, ellipsis = '...'): string => {\n if (!str || str.length <= maxLength) return str;\n return str.slice(0, maxLength - ellipsis.length) + ellipsis;\n};\n\n/**\n * Converts a string to kebab-case.\n * Handles camelCase, PascalCase, snake_case, and space-separated strings.\n *\n * @example\n * toKebabCase(\"myComponentName\") // → \"my-component-name\"\n * toKebabCase(\"XMLParser\") // → \"xml-parser\"\n */\nexport const toKebabCase = (value?: string | null): string => {\n if (isBlank(value)) return '';\n return value\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '')\n .toLowerCase();\n};\n\n/**\n * Converts a string to camelCase.\n * Handles kebab-case, snake_case, PascalCase, and space-separated strings.\n *\n * @example\n * toCamelCase(\"my-component-name\") // → \"myComponentName\"\n * toCamelCase(\"my_snake_case\") // → \"mySnakeCase\"\n */\nexport const toCamelCase = (value?: string | null): string => {\n if (isBlank(value)) return '';\n return value\n .trim()\n .replace(/[-_\\s]+(.)/g, (_, char: string) => char.toUpperCase())\n .replace(/^[A-Z]/, (char) => char.toLowerCase());\n};\n\n/**\n * Converts a string to a URL-safe slug.\n * Removes diacritical marks, lowercases, replaces non-alphanumeric characters with hyphens,\n * and strips leading/trailing hyphens.\n *\n * @param value - The input string to slugify\n * @returns The slugified string\n *\n * @example\n * slugify(\"Héllo Wörld!\") // → \"hello-world\"\n * slugify(\" My Blog Post \") // → \"my-blog-post\"\n */\nexport const slugify = (value: string): string => {\n if (!value) return '';\n return removeDiacriticalMarks(value)\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n};\n\n/**\n * Parses an optional comma-separated string into a trimmed, non-blank string array.\n */\nexport const parseCommaSeparatedList = (raw?: string | null): string[] => {\n if (isBlank(raw)) {\n return [];\n }\n\n return raw\n .split(',')\n .map((s: string) => s.trim())\n .filter(isNotBlank);\n};\n","import { replaceStringParameters } from \"@rjsf/utils\";\nimport { i18n } from \"i18next\";\nimport { isBlank } from \"../../utils/string.utils\";\n\n/** Maps RJSF TranslatableString values to our i18n keys (rjsf namespace). */\nexport const RJSF_STRING_TO_I18N_KEY: Record<string, string> = {\n \"Add Item\": \"rjsf:addItem\",\n Add: \"rjsf:add\",\n Copy: \"rjsf:copy\",\n \"Move down\": \"rjsf:moveDown\",\n \"Move up\": \"rjsf:moveUp\",\n Remove: \"rjsf:remove\",\n \"clear input\": \"rjsf:clear\",\n \"%1 Key\": \"rjsf:keyLabel\", // TODO: RJSF-001 find a way to dynamicaly resolve the rjsf-i18n.utils \"%1 Key\" pattern\n Yes: \"rjsf:yes\",\n No: \"rjsf:no\",\n Errors: \"rjsf:errors\",\n};\n\ninterface TranslateStringArgs {\n i18n: i18n;\n stringToTranslate: string;\n params?: string[];\n}\n\nexport const translateRjsfString = ({ stringToTranslate, params, i18n }: TranslateStringArgs): string => {\n const i18nKey = RJSF_STRING_TO_I18N_KEY[stringToTranslate];\n if (isBlank(i18nKey)) {\n // eslint-disable-next-line no-console\n console.warn(`[translateRjsfString] RJSF i18n: missing key: \"${stringToTranslate}\"`);\n }\n\n const translated = i18nKey ? i18n.t(i18nKey) : stringToTranslate;\n return replaceStringParameters(translated, params);\n};\n","import type { WidgetProps } from \"@rjsf/utils\";\nimport { isBlank } from \"../../utils/string.utils\";\nimport { isNullish } from \"../../utils/types.utils\";\n\n/**\n * Returns true when the widget has at least one validation error from RJSF.\n *\n * @param rawErrors - The rawErrors from WidgetProps (often `unknown`).\n * @returns true if rawErrors is a non-empty array.\n */\nexport const hasRjsfErrors = (rawErrors: unknown): boolean => Array.isArray(rawErrors) && rawErrors.length > 0;\n\nexport interface GetRjsfDisplayLabelArgs {\n label?: string;\n required?: boolean;\n hideLabel?: boolean;\n}\n\n/**\n * Returns the label to display for an RJSF widget, with optional required asterisk and\n * hideLabel support.\n *\n * @param label - The label to display for the widget.\n * @param required - Whether the field is required.\n * @param hideLabel - Whether to hide the label.\n *\n * @returns The label to display for the widget.\n */\nexport const getRjsfDisplayLabel = ({ label, required, hideLabel }: GetRjsfDisplayLabelArgs): string | undefined => {\n if (hideLabel) return undefined;\n if (isBlank(label)) return undefined;\n\n const requiredSuffix = required ? \" *\" : \"\";\n return `${label}${requiredSuffix}`;\n};\n\nconst HEX_COLOR_PATTERN = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/;\n\n/**\n * Reads the `labelColor` from a widget/field `ui:options` object.\n *\n * @param options - The `ui:options` object (e.g. WidgetProps.options or uiSchema[\"ui:options\"]).\n * @returns A validated hex color string (#RGB or #RRGGBB), or undefined when missing/invalid (default color).\n */\nexport const getRjsfLabelColor = (options?: Record<string, unknown> | null): string | undefined => {\n const color = options?.labelColor;\n if (typeof color !== \"string\") return undefined;\n const trimmed = color.trim();\n return HEX_COLOR_PATTERN.test(trimmed) ? trimmed : undefined;\n};\n\ninterface EnumOption {\n value: string;\n label: string;\n}\n\nexport type EnumOptionDisplay = { label: string; value: string };\n\nconst toEnumOptionDisplay = (o: EnumOption): EnumOptionDisplay => ({\n label: o?.label ?? String(o?.value ?? \"\"),\n value: String(o?.value ?? \"\"),\n});\n\nexport const mapEnumOptions = (options: WidgetProps[\"options\"]): EnumOptionDisplay[] => {\n const enumOptions = options?.enumOptions as EnumOption[] | undefined;\n if (!Array.isArray(enumOptions)) return [];\n return enumOptions.map(toEnumOptionDisplay);\n};\n\n/**\n * Converts a value to display string, or empty string when null/undefined.\n */\nexport const toStringOrEmpty = (value: unknown): string => (isNullish(value) ? \"\" : String(value));\n\n/**\n * Converts a value to display string, or undefined when null/undefined (e.g. for select placeholder).\n */\nexport const toStringOrUndefined = (value: unknown): string | undefined =>\n isNullish(value) ? undefined : String(value);\n\nexport interface GetRjsfTextChangeValueArgs {\n text: string;\n emptyValue?: unknown;\n}\n\n/**\n * Returns the value to pass to onChange for a text input.\n *\n * @param args.text - The current text input value.\n * @param args.emptyValue - The value to use when text is empty (e.g. options.emptyValue from WidgetProps).\n * @returns emptyValue when text is empty, otherwise text.\n */\nexport const getRjsfTextChangeValue = ({ text, emptyValue }: GetRjsfTextChangeValueArgs): unknown => {\n if (text === \"\") return emptyValue;\n return text;\n};\n\nexport const parseDateOrNull = (value?: string): Date | null => {\n if (isBlank(value)) return null;\n\n const date = new Date(value);\n const isValid = !Number.isNaN(date.getTime());\n return isValid ? date : null;\n};\n\n/** Returns YYYY-MM-DD for JSON Schema \"date\" format (form storage). */\nexport const dateToDateOnlyString = (date: Date): string => {\n const y = date.getFullYear();\n const m = String(date.getMonth() + 1).padStart(2, \"0\");\n const d = String(date.getDate()).padStart(2, \"0\");\n return `${y}-${m}-${d}`;\n};\n\nconst DATE_ONLY_REGEX = /^\\d{4}-\\d{2}-\\d{2}$/;\n\n/** Parses a date-only or full ISO string into a Date at local midnight (for date picker display). */\nexport const parseDateOnlyToLocalDate = (value?: string): Date | null => {\n if (isBlank(value)) return null;\n\n const trimmed = String(value).trim();\n const dateOnly = trimmed.slice(0, 10);\n if (!DATE_ONLY_REGEX.test(dateOnly)) return null;\n\n const [y, m, d] = dateOnly.split(\"-\").map(Number);\n return new Date(y, m - 1, d);\n};\n\n/** Extracts date-only YYYY-MM-DD for display from a full ISO or date-only string. */\nexport const formatDateOnlyForDisplay = (value?: string): string => {\n if (isBlank(value)) return \"\";\n\n const trimmed = String(value).trim();\n const dateOnly = trimmed.slice(0, 10);\n return DATE_ONLY_REGEX.test(dateOnly) ? dateOnly : \"\";\n};\n\n/** Formats a full ISO or date string for date-time display (locale string). */\nexport const formatDateTimeForDisplay = (value?: string): string => {\n const date = parseDateOrNull(value);\n return date ? date.toLocaleString() : \"\";\n};\n\ntype FormLayoutContext = {\n labelCol?: { span: number };\n wrapperCol?: { span: number };\n};\n\nconst DEFAULT_SPAN = 24;\n\nexport const getFormLayoutCols = (formContext?: unknown): FormLayoutContext => {\n if (isNullish(formContext)) {\n return {\n labelCol: { span: DEFAULT_SPAN },\n wrapperCol: { span: DEFAULT_SPAN },\n };\n }\n\n const { labelCol, wrapperCol } = formContext as FormLayoutContext;\n return {\n labelCol: labelCol ?? { span: DEFAULT_SPAN },\n wrapperCol: wrapperCol ?? { span: DEFAULT_SPAN },\n };\n};\n","import { isBlank } from \"../../utils/string.utils\";\nimport { useTranslation } from \"react-i18next\";\nimport type { LocalizedFormSchema, MetaFormSchema } from \"./rjsf-i18n-types\";\n\nconst DEFAULT_LANGUAGE = \"fr\";\n\n// i18n.language can be 'fr-CA', so we take the first part\nconst parseSimplifiedLangCode = (language?: string): string => {\n if (isBlank(language)) return DEFAULT_LANGUAGE;\n return language.split(\"-\")[0];\n};\n\nconst getFallbackLanguage = (metaFormSchema: MetaFormSchema): string => {\n return Object.keys(metaFormSchema.i18n)[0] ?? DEFAULT_LANGUAGE;\n};\n\nexport const useLocalizedForm = (metaFormSchema: MetaFormSchema): LocalizedFormSchema => {\n const { i18n } = useTranslation();\n const language = parseSimplifiedLangCode(i18n.language);\n\n if (metaFormSchema.i18n[language]) {\n return metaFormSchema.i18n[language];\n }\n\n const fallbackLanguage = getFallbackLanguage(metaFormSchema);\n // eslint-disable-next-line no-console\n console.warn(\n `Language ${language} not found in metaFormSchema ${metaFormSchema.id}. Falling back to ${fallbackLanguage}.`\n );\n\n return metaFormSchema.i18n[fallbackLanguage];\n};\n","import { customizeValidator, type Localizer } from \"@rjsf/validator-ajv8\";\nimport localizer from \"ajv-i18n\";\n\nconst customFormats = {\n \"phone-america\": /^\\(?\\d{3}\\)?[\\s-]?\\d{3}[\\s-]?\\d{4}$/,\n};\n\ntype ValidationLanguages = keyof typeof localizer;\n\nexport const useRjsfValidator = (language: string) => {\n const appLanguage = language as ValidationLanguages;\n const localizerFn: Localizer = localizer[appLanguage] ?? localizer.en;\n\n return customizeValidator({ customFormats }, localizerFn);\n};\n"]}
|