@lichens-innovation/ts-common 1.6.3 → 1.8.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 CHANGED
@@ -30,12 +30,15 @@ __export(index_exports, {
30
30
  REGEX_IPV4: () => REGEX_IPV4,
31
31
  SCHEME_PREFIXES: () => SCHEME_PREFIXES,
32
32
  W_TO_HP: () => W_TO_HP,
33
+ buildTicksForChart: () => buildTicksForChart,
33
34
  capitalizeFirst: () => capitalizeFirst,
34
35
  closeWebSocket: () => closeWebSocket,
35
36
  countWords: () => countWords,
36
37
  dateAs_HHMMSS: () => dateAs_HHMMSS,
37
38
  dateAs_YYYYMMDD: () => dateAs_YYYYMMDD,
38
39
  dateAs_YYYYMMDD_HHMMSS: () => dateAs_YYYYMMDD_HHMMSS,
40
+ extractBase64FromDataUri: () => extractBase64FromDataUri,
41
+ formatIntegerDisplay: () => formatIntegerDisplay,
39
42
  formatUnixTimestamp: () => formatUnixTimestamp,
40
43
  fromHzToRpm: () => fromHzToRpm,
41
44
  fromM3psToGPM: () => fromM3psToGPM,
@@ -49,6 +52,7 @@ __export(index_exports, {
49
52
  getLuminance: () => getLuminance,
50
53
  getOpacityHexValue: () => getOpacityHexValue,
51
54
  getOrderOfMagnitudeExponent: () => getOrderOfMagnitudeExponent,
55
+ getTickDomain: () => getTickDomain,
52
56
  hasScheme: () => hasScheme,
53
57
  hexToNormalizedRgb: () => hexToNormalizedRgb,
54
58
  hexToRgb: () => hexToRgb,
@@ -59,6 +63,8 @@ __export(index_exports, {
59
63
  isHttpClientErrorStatus: () => isHttpClientErrorStatus,
60
64
  isHttpServerErrorStatus: () => isHttpServerErrorStatus,
61
65
  isHttpSuccessStatus: () => isHttpSuccessStatus,
66
+ isInputValidInteger: () => isInputValidInteger,
67
+ isInputValidNumber: () => isInputValidNumber,
62
68
  isLightColor: () => isLightColor,
63
69
  isNotBlank: () => isNotBlank,
64
70
  isNullish: () => isNullish,
@@ -76,13 +82,94 @@ __export(index_exports, {
76
82
  rgbaToHex: () => rgbaToHex,
77
83
  rgbaToHexWithAlpha: () => rgbaToHexWithAlpha,
78
84
  rgbaToString: () => rgbaToString,
85
+ roundToNiceNumber: () => roundToNiceNumber,
79
86
  roundUpToNearest10: () => roundUpToNearest10,
80
87
  sleep: () => sleep,
88
+ tickFormatter: () => tickFormatter,
81
89
  toFixed: () => toFixed,
82
- truncate: () => truncate
90
+ toToleranceLabel: () => toToleranceLabel,
91
+ tooltipValueFormatter: () => tooltipValueFormatter,
92
+ truncate: () => truncate,
93
+ yieldToMainThread: () => yieldToMainThread
83
94
  });
84
95
  module.exports = __toCommonJS(index_exports);
85
96
 
97
+ // src/utils/types.utils.ts
98
+ var NO_OP = () => {
99
+ };
100
+ var isNullish = (value) => value === null || value === void 0;
101
+ var isNumber = (value) => {
102
+ if (isNullish(value)) {
103
+ return false;
104
+ }
105
+ if (typeof value !== "number") {
106
+ return false;
107
+ }
108
+ if (isNaN(value)) {
109
+ return false;
110
+ }
111
+ return true;
112
+ };
113
+ var isString = (value) => {
114
+ if (isNullish(value)) {
115
+ return false;
116
+ }
117
+ if (typeof value !== "string") {
118
+ return false;
119
+ }
120
+ return true;
121
+ };
122
+
123
+ // src/utils/chart.utils.ts
124
+ var getTickDomain = (ticks) => [0, ticks.at(-1) ?? 0];
125
+ var tickFormatter = (value) => value.toFixed(0);
126
+ var toToleranceLabel = (value) => `\xB1${(value * 100).toFixed(0)}%`;
127
+ var tooltipValueFormatter = (data) => {
128
+ if (isNullish(data)) {
129
+ return "";
130
+ }
131
+ if (typeof data === "number") {
132
+ return data.toFixed(2);
133
+ }
134
+ if (Array.isArray(data) && data.length >= 2) {
135
+ const [min, max] = data;
136
+ if (typeof min === "number" && typeof max === "number") {
137
+ return `[${min.toFixed(2)} \u2026 ${max.toFixed(2)}]`;
138
+ }
139
+ }
140
+ return String(data ?? "");
141
+ };
142
+ var roundToNiceNumber = (rawValue) => {
143
+ if (rawValue <= 0) return 0;
144
+ const magnitude = Math.pow(10, Math.floor(Math.log10(rawValue)));
145
+ const normalized = rawValue / magnitude;
146
+ let niceMultiplier;
147
+ if (normalized <= 1) niceMultiplier = 1;
148
+ else if (normalized <= 2) niceMultiplier = 2;
149
+ else if (normalized <= 2.5) niceMultiplier = 2.5;
150
+ else if (normalized <= 5) niceMultiplier = 5;
151
+ else niceMultiplier = 10;
152
+ return niceMultiplier * magnitude;
153
+ };
154
+ var roundToPrecision = (value, precision = 10) => {
155
+ const factor = 10 ** precision;
156
+ return Math.round(value * factor) / factor;
157
+ };
158
+ var buildTicksForChart = (max, targetTickCount = 10) => {
159
+ if (max <= 0) return [0];
160
+ const rawIncrement = max / targetTickCount;
161
+ const niceIncrement = roundToNiceNumber(rawIncrement);
162
+ const ticks = [];
163
+ for (let value = 0; value <= max + niceIncrement * 0.5; value += niceIncrement) {
164
+ ticks.push(roundToPrecision(value));
165
+ }
166
+ const lastTick = ticks[ticks.length - 1];
167
+ if (lastTick < max) {
168
+ ticks.push(roundToPrecision(lastTick + niceIncrement));
169
+ }
170
+ return ticks;
171
+ };
172
+
86
173
  // src/utils/color.utils.ts
87
174
  var rgbToHex = (r, g, b) => {
88
175
  if (r > 255 || g > 255 || b > 255) {
@@ -166,34 +253,6 @@ var getColorForPercentage = (percent) => {
166
253
 
167
254
  // src/utils/date.utils.ts
168
255
  var import_date_fns = require("date-fns");
169
-
170
- // src/utils/types.utils.ts
171
- var NO_OP = () => {
172
- };
173
- var isNullish = (value) => value === null || value === void 0;
174
- var isNumber = (value) => {
175
- if (isNullish(value)) {
176
- return false;
177
- }
178
- if (typeof value !== "number") {
179
- return false;
180
- }
181
- if (isNaN(value)) {
182
- return false;
183
- }
184
- return true;
185
- };
186
- var isString = (value) => {
187
- if (isNullish(value)) {
188
- return false;
189
- }
190
- if (typeof value !== "string") {
191
- return false;
192
- }
193
- return true;
194
- };
195
-
196
- // src/utils/date.utils.ts
197
256
  var dateAs_HHMMSS = (value) => {
198
257
  if (isNullish(value)) return "";
199
258
  return (0, import_date_fns.format)(value, "HH:mm:ss");
@@ -267,29 +326,6 @@ var isHttpServerErrorStatus = (status) => {
267
326
  return status >= 500;
268
327
  };
269
328
 
270
- // src/utils/number.utils.ts
271
- var toFixed = (value, decimals = 0) => {
272
- if (isNullish(value)) return 0;
273
- if (decimals < 0) throw new Error("[toFixed] decimals must be >= 0");
274
- if (decimals === 0) return Math.round(value);
275
- const multiplier = Math.pow(10, decimals);
276
- return Math.round(value * multiplier) / multiplier;
277
- };
278
- var roundUpToNearest10 = (value) => {
279
- if (isNullish(value)) return 0;
280
- return Math.ceil(value / 10) * 10;
281
- };
282
- var getOrderOfMagnitudeExponent = (n) => {
283
- if (isNullish(n)) return 0;
284
- if (!isNumber(n)) return 0;
285
- const absValue = Math.abs(n);
286
- if (absValue === 0) {
287
- return 0;
288
- }
289
- const integerPart = Math.floor(absValue);
290
- return Math.floor(Math.log10(integerPart));
291
- };
292
-
293
329
  // src/utils/regex.ts
294
330
  var REGEX_ALPHANUMERIC = /^[a-zA-Z0-9-_ $%#(){}:/.]+$/;
295
331
  var 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]?)$/;
@@ -323,8 +359,43 @@ var truncate = (str, maxLength, ellipsis = "...") => {
323
359
  return str.slice(0, maxLength - ellipsis.length) + ellipsis;
324
360
  };
325
361
 
362
+ // src/utils/number.utils.ts
363
+ var isInputValidNumber = (value) => {
364
+ if (isBlank(value)) return false;
365
+ const num = Number(value.trim());
366
+ return Number.isFinite(num);
367
+ };
368
+ var isInputValidInteger = (value) => {
369
+ if (!isInputValidNumber(value)) return false;
370
+ const num = Number(value.trim());
371
+ return Number.isInteger(num);
372
+ };
373
+ var formatIntegerDisplay = (value) => String(toFixed(value, 0));
374
+ var toFixed = (value, decimals = 0) => {
375
+ if (isNullish(value)) return 0;
376
+ if (decimals < 0) throw new Error("[toFixed] decimals must be >= 0");
377
+ if (decimals === 0) return Math.round(value);
378
+ const multiplier = Math.pow(10, decimals);
379
+ return Math.round(value * multiplier) / multiplier;
380
+ };
381
+ var roundUpToNearest10 = (value) => {
382
+ if (isNullish(value)) return 0;
383
+ return Math.ceil(value / 10) * 10;
384
+ };
385
+ var getOrderOfMagnitudeExponent = (n) => {
386
+ if (isNullish(n)) return 0;
387
+ if (!isNumber(n)) return 0;
388
+ const absValue = Math.abs(n);
389
+ if (absValue === 0) {
390
+ return 0;
391
+ }
392
+ const integerPart = Math.floor(absValue);
393
+ return Math.floor(Math.log10(integerPart));
394
+ };
395
+
326
396
  // src/utils/thread.utils.ts
327
397
  var sleep = (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds));
398
+ var yieldToMainThread = () => sleep(0);
328
399
 
329
400
  // src/utils/time.utils.ts
330
401
  var ONE_SECOND_IN_MS = 1e3;
@@ -384,6 +455,9 @@ var hasScheme = (uri) => {
384
455
  const lowerUri = uri.toLowerCase();
385
456
  return SCHEME_PREFIXES_ARRAY.some((prefix) => lowerUri.startsWith(`${prefix}://`));
386
457
  };
458
+ var extractBase64FromDataUri = (dataUri) => {
459
+ return dataUri.split(",")[1] ?? dataUri;
460
+ };
387
461
 
388
462
  // src/utils/websocket.utils.ts
389
463
  var WEBSOCKET_CONNECT_STATES = [WebSocket.CONNECTING, WebSocket.OPEN];
@@ -414,12 +488,15 @@ var closeWebSocket = (ws) => {
414
488
  REGEX_IPV4,
415
489
  SCHEME_PREFIXES,
416
490
  W_TO_HP,
491
+ buildTicksForChart,
417
492
  capitalizeFirst,
418
493
  closeWebSocket,
419
494
  countWords,
420
495
  dateAs_HHMMSS,
421
496
  dateAs_YYYYMMDD,
422
497
  dateAs_YYYYMMDD_HHMMSS,
498
+ extractBase64FromDataUri,
499
+ formatIntegerDisplay,
423
500
  formatUnixTimestamp,
424
501
  fromHzToRpm,
425
502
  fromM3psToGPM,
@@ -433,6 +510,7 @@ var closeWebSocket = (ws) => {
433
510
  getLuminance,
434
511
  getOpacityHexValue,
435
512
  getOrderOfMagnitudeExponent,
513
+ getTickDomain,
436
514
  hasScheme,
437
515
  hexToNormalizedRgb,
438
516
  hexToRgb,
@@ -443,6 +521,8 @@ var closeWebSocket = (ws) => {
443
521
  isHttpClientErrorStatus,
444
522
  isHttpServerErrorStatus,
445
523
  isHttpSuccessStatus,
524
+ isInputValidInteger,
525
+ isInputValidNumber,
446
526
  isLightColor,
447
527
  isNotBlank,
448
528
  isNullish,
@@ -460,9 +540,14 @@ var closeWebSocket = (ws) => {
460
540
  rgbaToHex,
461
541
  rgbaToHexWithAlpha,
462
542
  rgbaToString,
543
+ roundToNiceNumber,
463
544
  roundUpToNearest10,
464
545
  sleep,
546
+ tickFormatter,
465
547
  toFixed,
466
- truncate
548
+ toToleranceLabel,
549
+ tooltipValueFormatter,
550
+ truncate,
551
+ yieldToMainThread
467
552
  });
468
553
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/utils/color.utils.ts","../src/utils/date.utils.ts","../src/utils/types.utils.ts","../src/utils/errors.utils.ts","../src/utils/http.utils.ts","../src/utils/number.utils.ts","../src/utils/regex.ts","../src/utils/string.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"],"sourcesContent":["export * from \"./utils\";\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 = 0;\n for (i = 1; 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 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","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","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","import { isNullish, isNumber } from \"./types.utils\";\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\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","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","export const sleep = (milliseconds: number) =>\n new Promise((resolve) => setTimeout(resolve, milliseconds));\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","export 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 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","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"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.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/http.utils.ts","../src/utils/regex.ts","../src/utils/string.utils.ts","../src/utils/number.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"],"sourcesContent":["export * from \"./utils\";\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 = 0;\n for (i = 1; 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","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 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","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 * Formats a number as an integer display string (removes decimals).\n */\nexport const formatIntegerDisplay = (value?: number | null): string =>\n 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\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","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","export 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 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","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"],"mappings":"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","names":[]}
package/dist/index.d.cts CHANGED
@@ -1,3 +1,49 @@
1
+ interface ToleranceArea {
2
+ flow: number;
3
+ toleranceRange: [number, number];
4
+ }
5
+ /**
6
+ * A chart point with required x and y coordinates.
7
+ */
8
+ interface ChartPoint {
9
+ x: number;
10
+ y: number;
11
+ }
12
+ /**
13
+ * A chart point with optional nullable x and y coordinates.
14
+ */
15
+ interface NullableChartPoint {
16
+ x?: number | null;
17
+ y?: number | null;
18
+ }
19
+ declare const getTickDomain: (ticks: number[]) => [number, number];
20
+ declare const tickFormatter: (value: number) => string;
21
+ declare const toToleranceLabel: (value: number) => string;
22
+ declare const tooltipValueFormatter: (data?: unknown | null) => string;
23
+ /**
24
+ * Rounds a raw value to a "nice" number for chart axis increments.
25
+ * Nice numbers are easy to read: 1, 2, 2.5, 5, or 10 multiplied by a power of 10.
26
+ *
27
+ * @param rawValue - The raw value to round to a nice number
28
+ * @returns A nice number close to the raw value
29
+ *
30
+ * @example
31
+ * roundToNiceNumber(0.7) // returns 1
32
+ * roundToNiceNumber(3) // returns 5
33
+ * roundToNiceNumber(17) // returns 20
34
+ * roundToNiceNumber(80) // returns 100
35
+ */
36
+ declare const roundToNiceNumber: (rawValue: number) => number;
37
+ /**
38
+ * Builds an array of "nice" tick values for a chart axis.
39
+ * The algorithm aims for approximately `targetTickCount` ticks with clean, readable values.
40
+ *
41
+ * @param max - The maximum value to display on the axis
42
+ * @param targetTickCount - The desired number of ticks (default: 10)
43
+ * @returns An array of tick values from 0 to at least `max`
44
+ */
45
+ declare const buildTicksForChart: (max: number, targetTickCount?: number) => number[];
46
+
1
47
  interface RgbColor {
2
48
  r: number;
3
49
  g: number;
@@ -72,12 +118,29 @@ declare const isExpiredTimestamp: (timestamp: number) => boolean;
72
118
  */
73
119
  declare const isActiveTimestamp: (timestamp: number) => boolean;
74
120
 
121
+ interface Dimensions {
122
+ width: number;
123
+ height: number;
124
+ }
125
+
75
126
  declare const getErrorMessage: (error: unknown) => string;
76
127
 
77
128
  declare const isHttpSuccessStatus: (status?: number | null) => boolean;
78
129
  declare const isHttpClientErrorStatus: (status?: number | null) => boolean;
79
130
  declare const isHttpServerErrorStatus: (status?: number | null) => boolean;
80
131
 
132
+ /**
133
+ * Returns true if the input string is a valid number (blank and non-numeric strings are invalid).
134
+ */
135
+ declare const isInputValidNumber: (value: string) => boolean;
136
+ /**
137
+ * Returns true if the input string is a valid integer (decimals like "1500.5" are invalid).
138
+ */
139
+ declare const isInputValidInteger: (value: string) => boolean;
140
+ /**
141
+ * Formats a number as an integer display string (removes decimals).
142
+ */
143
+ declare const formatIntegerDisplay: (value?: number | null) => string;
81
144
  declare const toFixed: (value?: number | null, decimals?: number) => number;
82
145
  declare const roundUpToNearest10: (value?: number | null) => number;
83
146
  declare const getOrderOfMagnitudeExponent: (n?: number | null) => number;
@@ -123,7 +186,12 @@ declare const countWords: (text: string) => number;
123
186
  */
124
187
  declare const truncate: (str: string, maxLength: number, ellipsis?: string) => string;
125
188
 
126
- declare const sleep: (milliseconds: number) => Promise<unknown>;
189
+ declare const sleep: (milliseconds: number) => Promise<void>;
190
+ /**
191
+ * Yields to the main thread so the UI can process events and repaint.
192
+ * Use during long-running synchronous work (e.g. report generation) to keep the app responsive.
193
+ */
194
+ declare const yieldToMainThread: () => Promise<void>;
127
195
 
128
196
  declare const PeriodsInMS: {
129
197
  readonly oneSecond: 1000;
@@ -164,9 +232,18 @@ declare const SCHEME_PREFIXES: {
164
232
  readonly smb: "smb";
165
233
  };
166
234
  declare const hasScheme: (uri?: string | null) => boolean;
235
+ /**
236
+ * Extracts the base64 data from a data URI string.
237
+ * Data URIs have the format: data:[<mediatype>][;base64],<data>
238
+ * This function extracts everything after the first comma.
239
+ *
240
+ * @param dataUri - The data URI string (e.g., "data:image/png;base64,iVBORw0KG...")
241
+ * @returns The base64 data without the data URI prefix, or the original string if no comma is found
242
+ */
243
+ declare const extractBase64FromDataUri: (dataUri: string) => string;
167
244
 
168
245
  declare const isWsClosable: (ws?: WebSocket | null) => ws is WebSocket;
169
246
  declare const isWsOpenOrConnecting: (ws?: WebSocket | null) => ws is WebSocket;
170
247
  declare const closeWebSocket: (ws?: WebSocket | null) => void;
171
248
 
172
- export { type DateInput, HZ_TO_RPM, M3PS_TO_GPM, M_TO_INCHES, NO_OP, type NormalizedRgb, PA_TO_FT, PeriodsInMS, REGEX_ALPHANUMERIC, REGEX_IPV4, type RgbColor, type RgbaColor, SCHEME_PREFIXES, W_TO_HP, capitalizeFirst, closeWebSocket, countWords, dateAs_HHMMSS, dateAs_YYYYMMDD, dateAs_YYYYMMDD_HHMMSS, formatUnixTimestamp, fromHzToRpm, fromM3psToGPM, fromMToInches, fromPaToFt, fromWToHp, getColorForPercentage, getContrastTextColor, getCurrentUnixTimestamp, getErrorMessage, getLuminance, getOpacityHexValue, getOrderOfMagnitudeExponent, hasScheme, hexToNormalizedRgb, hexToRgb, isActiveTimestamp, isAlphanumeric, isBlank, isExpiredTimestamp, isHttpClientErrorStatus, isHttpServerErrorStatus, isHttpSuccessStatus, isLightColor, isNotBlank, isNullish, isNumber, isString, isWsClosable, isWsOpenOrConnecting, nowAsDate, nowAsDateTime, nowAsDateTimeForFilename, nowAsTime, removeDiacriticalMarks, rgbToHex, rgbToString, rgbaToHex, rgbaToHexWithAlpha, rgbaToString, roundUpToNearest10, sleep, toFixed, truncate };
249
+ export { type ChartPoint, type DateInput, type Dimensions, HZ_TO_RPM, M3PS_TO_GPM, M_TO_INCHES, NO_OP, type NormalizedRgb, type NullableChartPoint, PA_TO_FT, PeriodsInMS, REGEX_ALPHANUMERIC, REGEX_IPV4, type RgbColor, type RgbaColor, SCHEME_PREFIXES, type ToleranceArea, W_TO_HP, buildTicksForChart, capitalizeFirst, closeWebSocket, countWords, dateAs_HHMMSS, dateAs_YYYYMMDD, dateAs_YYYYMMDD_HHMMSS, extractBase64FromDataUri, formatIntegerDisplay, formatUnixTimestamp, fromHzToRpm, fromM3psToGPM, fromMToInches, fromPaToFt, fromWToHp, getColorForPercentage, getContrastTextColor, getCurrentUnixTimestamp, getErrorMessage, getLuminance, getOpacityHexValue, getOrderOfMagnitudeExponent, getTickDomain, hasScheme, hexToNormalizedRgb, hexToRgb, isActiveTimestamp, isAlphanumeric, isBlank, isExpiredTimestamp, isHttpClientErrorStatus, isHttpServerErrorStatus, isHttpSuccessStatus, isInputValidInteger, isInputValidNumber, isLightColor, isNotBlank, isNullish, isNumber, isString, isWsClosable, isWsOpenOrConnecting, nowAsDate, nowAsDateTime, nowAsDateTimeForFilename, nowAsTime, removeDiacriticalMarks, rgbToHex, rgbToString, rgbaToHex, rgbaToHexWithAlpha, rgbaToString, roundToNiceNumber, roundUpToNearest10, sleep, tickFormatter, toFixed, toToleranceLabel, tooltipValueFormatter, truncate, yieldToMainThread };
package/dist/index.d.ts CHANGED
@@ -1,3 +1,49 @@
1
+ interface ToleranceArea {
2
+ flow: number;
3
+ toleranceRange: [number, number];
4
+ }
5
+ /**
6
+ * A chart point with required x and y coordinates.
7
+ */
8
+ interface ChartPoint {
9
+ x: number;
10
+ y: number;
11
+ }
12
+ /**
13
+ * A chart point with optional nullable x and y coordinates.
14
+ */
15
+ interface NullableChartPoint {
16
+ x?: number | null;
17
+ y?: number | null;
18
+ }
19
+ declare const getTickDomain: (ticks: number[]) => [number, number];
20
+ declare const tickFormatter: (value: number) => string;
21
+ declare const toToleranceLabel: (value: number) => string;
22
+ declare const tooltipValueFormatter: (data?: unknown | null) => string;
23
+ /**
24
+ * Rounds a raw value to a "nice" number for chart axis increments.
25
+ * Nice numbers are easy to read: 1, 2, 2.5, 5, or 10 multiplied by a power of 10.
26
+ *
27
+ * @param rawValue - The raw value to round to a nice number
28
+ * @returns A nice number close to the raw value
29
+ *
30
+ * @example
31
+ * roundToNiceNumber(0.7) // returns 1
32
+ * roundToNiceNumber(3) // returns 5
33
+ * roundToNiceNumber(17) // returns 20
34
+ * roundToNiceNumber(80) // returns 100
35
+ */
36
+ declare const roundToNiceNumber: (rawValue: number) => number;
37
+ /**
38
+ * Builds an array of "nice" tick values for a chart axis.
39
+ * The algorithm aims for approximately `targetTickCount` ticks with clean, readable values.
40
+ *
41
+ * @param max - The maximum value to display on the axis
42
+ * @param targetTickCount - The desired number of ticks (default: 10)
43
+ * @returns An array of tick values from 0 to at least `max`
44
+ */
45
+ declare const buildTicksForChart: (max: number, targetTickCount?: number) => number[];
46
+
1
47
  interface RgbColor {
2
48
  r: number;
3
49
  g: number;
@@ -72,12 +118,29 @@ declare const isExpiredTimestamp: (timestamp: number) => boolean;
72
118
  */
73
119
  declare const isActiveTimestamp: (timestamp: number) => boolean;
74
120
 
121
+ interface Dimensions {
122
+ width: number;
123
+ height: number;
124
+ }
125
+
75
126
  declare const getErrorMessage: (error: unknown) => string;
76
127
 
77
128
  declare const isHttpSuccessStatus: (status?: number | null) => boolean;
78
129
  declare const isHttpClientErrorStatus: (status?: number | null) => boolean;
79
130
  declare const isHttpServerErrorStatus: (status?: number | null) => boolean;
80
131
 
132
+ /**
133
+ * Returns true if the input string is a valid number (blank and non-numeric strings are invalid).
134
+ */
135
+ declare const isInputValidNumber: (value: string) => boolean;
136
+ /**
137
+ * Returns true if the input string is a valid integer (decimals like "1500.5" are invalid).
138
+ */
139
+ declare const isInputValidInteger: (value: string) => boolean;
140
+ /**
141
+ * Formats a number as an integer display string (removes decimals).
142
+ */
143
+ declare const formatIntegerDisplay: (value?: number | null) => string;
81
144
  declare const toFixed: (value?: number | null, decimals?: number) => number;
82
145
  declare const roundUpToNearest10: (value?: number | null) => number;
83
146
  declare const getOrderOfMagnitudeExponent: (n?: number | null) => number;
@@ -123,7 +186,12 @@ declare const countWords: (text: string) => number;
123
186
  */
124
187
  declare const truncate: (str: string, maxLength: number, ellipsis?: string) => string;
125
188
 
126
- declare const sleep: (milliseconds: number) => Promise<unknown>;
189
+ declare const sleep: (milliseconds: number) => Promise<void>;
190
+ /**
191
+ * Yields to the main thread so the UI can process events and repaint.
192
+ * Use during long-running synchronous work (e.g. report generation) to keep the app responsive.
193
+ */
194
+ declare const yieldToMainThread: () => Promise<void>;
127
195
 
128
196
  declare const PeriodsInMS: {
129
197
  readonly oneSecond: 1000;
@@ -164,9 +232,18 @@ declare const SCHEME_PREFIXES: {
164
232
  readonly smb: "smb";
165
233
  };
166
234
  declare const hasScheme: (uri?: string | null) => boolean;
235
+ /**
236
+ * Extracts the base64 data from a data URI string.
237
+ * Data URIs have the format: data:[<mediatype>][;base64],<data>
238
+ * This function extracts everything after the first comma.
239
+ *
240
+ * @param dataUri - The data URI string (e.g., "data:image/png;base64,iVBORw0KG...")
241
+ * @returns The base64 data without the data URI prefix, or the original string if no comma is found
242
+ */
243
+ declare const extractBase64FromDataUri: (dataUri: string) => string;
167
244
 
168
245
  declare const isWsClosable: (ws?: WebSocket | null) => ws is WebSocket;
169
246
  declare const isWsOpenOrConnecting: (ws?: WebSocket | null) => ws is WebSocket;
170
247
  declare const closeWebSocket: (ws?: WebSocket | null) => void;
171
248
 
172
- export { type DateInput, HZ_TO_RPM, M3PS_TO_GPM, M_TO_INCHES, NO_OP, type NormalizedRgb, PA_TO_FT, PeriodsInMS, REGEX_ALPHANUMERIC, REGEX_IPV4, type RgbColor, type RgbaColor, SCHEME_PREFIXES, W_TO_HP, capitalizeFirst, closeWebSocket, countWords, dateAs_HHMMSS, dateAs_YYYYMMDD, dateAs_YYYYMMDD_HHMMSS, formatUnixTimestamp, fromHzToRpm, fromM3psToGPM, fromMToInches, fromPaToFt, fromWToHp, getColorForPercentage, getContrastTextColor, getCurrentUnixTimestamp, getErrorMessage, getLuminance, getOpacityHexValue, getOrderOfMagnitudeExponent, hasScheme, hexToNormalizedRgb, hexToRgb, isActiveTimestamp, isAlphanumeric, isBlank, isExpiredTimestamp, isHttpClientErrorStatus, isHttpServerErrorStatus, isHttpSuccessStatus, isLightColor, isNotBlank, isNullish, isNumber, isString, isWsClosable, isWsOpenOrConnecting, nowAsDate, nowAsDateTime, nowAsDateTimeForFilename, nowAsTime, removeDiacriticalMarks, rgbToHex, rgbToString, rgbaToHex, rgbaToHexWithAlpha, rgbaToString, roundUpToNearest10, sleep, toFixed, truncate };
249
+ export { type ChartPoint, type DateInput, type Dimensions, HZ_TO_RPM, M3PS_TO_GPM, M_TO_INCHES, NO_OP, type NormalizedRgb, type NullableChartPoint, PA_TO_FT, PeriodsInMS, REGEX_ALPHANUMERIC, REGEX_IPV4, type RgbColor, type RgbaColor, SCHEME_PREFIXES, type ToleranceArea, W_TO_HP, buildTicksForChart, capitalizeFirst, closeWebSocket, countWords, dateAs_HHMMSS, dateAs_YYYYMMDD, dateAs_YYYYMMDD_HHMMSS, extractBase64FromDataUri, formatIntegerDisplay, formatUnixTimestamp, fromHzToRpm, fromM3psToGPM, fromMToInches, fromPaToFt, fromWToHp, getColorForPercentage, getContrastTextColor, getCurrentUnixTimestamp, getErrorMessage, getLuminance, getOpacityHexValue, getOrderOfMagnitudeExponent, getTickDomain, hasScheme, hexToNormalizedRgb, hexToRgb, isActiveTimestamp, isAlphanumeric, isBlank, isExpiredTimestamp, isHttpClientErrorStatus, isHttpServerErrorStatus, isHttpSuccessStatus, isInputValidInteger, isInputValidNumber, isLightColor, isNotBlank, isNullish, isNumber, isString, isWsClosable, isWsOpenOrConnecting, nowAsDate, nowAsDateTime, nowAsDateTimeForFilename, nowAsTime, removeDiacriticalMarks, rgbToHex, rgbToString, rgbaToHex, rgbaToHexWithAlpha, rgbaToString, roundToNiceNumber, roundUpToNearest10, sleep, tickFormatter, toFixed, toToleranceLabel, tooltipValueFormatter, truncate, yieldToMainThread };
package/dist/index.js CHANGED
@@ -1,3 +1,79 @@
1
+ // src/utils/types.utils.ts
2
+ var NO_OP = () => {
3
+ };
4
+ var isNullish = (value) => value === null || value === void 0;
5
+ var isNumber = (value) => {
6
+ if (isNullish(value)) {
7
+ return false;
8
+ }
9
+ if (typeof value !== "number") {
10
+ return false;
11
+ }
12
+ if (isNaN(value)) {
13
+ return false;
14
+ }
15
+ return true;
16
+ };
17
+ var isString = (value) => {
18
+ if (isNullish(value)) {
19
+ return false;
20
+ }
21
+ if (typeof value !== "string") {
22
+ return false;
23
+ }
24
+ return true;
25
+ };
26
+
27
+ // src/utils/chart.utils.ts
28
+ var getTickDomain = (ticks) => [0, ticks.at(-1) ?? 0];
29
+ var tickFormatter = (value) => value.toFixed(0);
30
+ var toToleranceLabel = (value) => `\xB1${(value * 100).toFixed(0)}%`;
31
+ var tooltipValueFormatter = (data) => {
32
+ if (isNullish(data)) {
33
+ return "";
34
+ }
35
+ if (typeof data === "number") {
36
+ return data.toFixed(2);
37
+ }
38
+ if (Array.isArray(data) && data.length >= 2) {
39
+ const [min, max] = data;
40
+ if (typeof min === "number" && typeof max === "number") {
41
+ return `[${min.toFixed(2)} \u2026 ${max.toFixed(2)}]`;
42
+ }
43
+ }
44
+ return String(data ?? "");
45
+ };
46
+ var roundToNiceNumber = (rawValue) => {
47
+ if (rawValue <= 0) return 0;
48
+ const magnitude = Math.pow(10, Math.floor(Math.log10(rawValue)));
49
+ const normalized = rawValue / magnitude;
50
+ let niceMultiplier;
51
+ if (normalized <= 1) niceMultiplier = 1;
52
+ else if (normalized <= 2) niceMultiplier = 2;
53
+ else if (normalized <= 2.5) niceMultiplier = 2.5;
54
+ else if (normalized <= 5) niceMultiplier = 5;
55
+ else niceMultiplier = 10;
56
+ return niceMultiplier * magnitude;
57
+ };
58
+ var roundToPrecision = (value, precision = 10) => {
59
+ const factor = 10 ** precision;
60
+ return Math.round(value * factor) / factor;
61
+ };
62
+ var buildTicksForChart = (max, targetTickCount = 10) => {
63
+ if (max <= 0) return [0];
64
+ const rawIncrement = max / targetTickCount;
65
+ const niceIncrement = roundToNiceNumber(rawIncrement);
66
+ const ticks = [];
67
+ for (let value = 0; value <= max + niceIncrement * 0.5; value += niceIncrement) {
68
+ ticks.push(roundToPrecision(value));
69
+ }
70
+ const lastTick = ticks[ticks.length - 1];
71
+ if (lastTick < max) {
72
+ ticks.push(roundToPrecision(lastTick + niceIncrement));
73
+ }
74
+ return ticks;
75
+ };
76
+
1
77
  // src/utils/color.utils.ts
2
78
  var rgbToHex = (r, g, b) => {
3
79
  if (r > 255 || g > 255 || b > 255) {
@@ -81,34 +157,6 @@ var getColorForPercentage = (percent) => {
81
157
 
82
158
  // src/utils/date.utils.ts
83
159
  import { format } from "date-fns";
84
-
85
- // src/utils/types.utils.ts
86
- var NO_OP = () => {
87
- };
88
- var isNullish = (value) => value === null || value === void 0;
89
- var isNumber = (value) => {
90
- if (isNullish(value)) {
91
- return false;
92
- }
93
- if (typeof value !== "number") {
94
- return false;
95
- }
96
- if (isNaN(value)) {
97
- return false;
98
- }
99
- return true;
100
- };
101
- var isString = (value) => {
102
- if (isNullish(value)) {
103
- return false;
104
- }
105
- if (typeof value !== "string") {
106
- return false;
107
- }
108
- return true;
109
- };
110
-
111
- // src/utils/date.utils.ts
112
160
  var dateAs_HHMMSS = (value) => {
113
161
  if (isNullish(value)) return "";
114
162
  return format(value, "HH:mm:ss");
@@ -182,29 +230,6 @@ var isHttpServerErrorStatus = (status) => {
182
230
  return status >= 500;
183
231
  };
184
232
 
185
- // src/utils/number.utils.ts
186
- var toFixed = (value, decimals = 0) => {
187
- if (isNullish(value)) return 0;
188
- if (decimals < 0) throw new Error("[toFixed] decimals must be >= 0");
189
- if (decimals === 0) return Math.round(value);
190
- const multiplier = Math.pow(10, decimals);
191
- return Math.round(value * multiplier) / multiplier;
192
- };
193
- var roundUpToNearest10 = (value) => {
194
- if (isNullish(value)) return 0;
195
- return Math.ceil(value / 10) * 10;
196
- };
197
- var getOrderOfMagnitudeExponent = (n) => {
198
- if (isNullish(n)) return 0;
199
- if (!isNumber(n)) return 0;
200
- const absValue = Math.abs(n);
201
- if (absValue === 0) {
202
- return 0;
203
- }
204
- const integerPart = Math.floor(absValue);
205
- return Math.floor(Math.log10(integerPart));
206
- };
207
-
208
233
  // src/utils/regex.ts
209
234
  var REGEX_ALPHANUMERIC = /^[a-zA-Z0-9-_ $%#(){}:/.]+$/;
210
235
  var 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]?)$/;
@@ -238,8 +263,43 @@ var truncate = (str, maxLength, ellipsis = "...") => {
238
263
  return str.slice(0, maxLength - ellipsis.length) + ellipsis;
239
264
  };
240
265
 
266
+ // src/utils/number.utils.ts
267
+ var isInputValidNumber = (value) => {
268
+ if (isBlank(value)) return false;
269
+ const num = Number(value.trim());
270
+ return Number.isFinite(num);
271
+ };
272
+ var isInputValidInteger = (value) => {
273
+ if (!isInputValidNumber(value)) return false;
274
+ const num = Number(value.trim());
275
+ return Number.isInteger(num);
276
+ };
277
+ var formatIntegerDisplay = (value) => String(toFixed(value, 0));
278
+ var toFixed = (value, decimals = 0) => {
279
+ if (isNullish(value)) return 0;
280
+ if (decimals < 0) throw new Error("[toFixed] decimals must be >= 0");
281
+ if (decimals === 0) return Math.round(value);
282
+ const multiplier = Math.pow(10, decimals);
283
+ return Math.round(value * multiplier) / multiplier;
284
+ };
285
+ var roundUpToNearest10 = (value) => {
286
+ if (isNullish(value)) return 0;
287
+ return Math.ceil(value / 10) * 10;
288
+ };
289
+ var getOrderOfMagnitudeExponent = (n) => {
290
+ if (isNullish(n)) return 0;
291
+ if (!isNumber(n)) return 0;
292
+ const absValue = Math.abs(n);
293
+ if (absValue === 0) {
294
+ return 0;
295
+ }
296
+ const integerPart = Math.floor(absValue);
297
+ return Math.floor(Math.log10(integerPart));
298
+ };
299
+
241
300
  // src/utils/thread.utils.ts
242
301
  var sleep = (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds));
302
+ var yieldToMainThread = () => sleep(0);
243
303
 
244
304
  // src/utils/time.utils.ts
245
305
  var ONE_SECOND_IN_MS = 1e3;
@@ -299,6 +359,9 @@ var hasScheme = (uri) => {
299
359
  const lowerUri = uri.toLowerCase();
300
360
  return SCHEME_PREFIXES_ARRAY.some((prefix) => lowerUri.startsWith(`${prefix}://`));
301
361
  };
362
+ var extractBase64FromDataUri = (dataUri) => {
363
+ return dataUri.split(",")[1] ?? dataUri;
364
+ };
302
365
 
303
366
  // src/utils/websocket.utils.ts
304
367
  var WEBSOCKET_CONNECT_STATES = [WebSocket.CONNECTING, WebSocket.OPEN];
@@ -328,12 +391,15 @@ export {
328
391
  REGEX_IPV4,
329
392
  SCHEME_PREFIXES,
330
393
  W_TO_HP,
394
+ buildTicksForChart,
331
395
  capitalizeFirst,
332
396
  closeWebSocket,
333
397
  countWords,
334
398
  dateAs_HHMMSS,
335
399
  dateAs_YYYYMMDD,
336
400
  dateAs_YYYYMMDD_HHMMSS,
401
+ extractBase64FromDataUri,
402
+ formatIntegerDisplay,
337
403
  formatUnixTimestamp,
338
404
  fromHzToRpm,
339
405
  fromM3psToGPM,
@@ -347,6 +413,7 @@ export {
347
413
  getLuminance,
348
414
  getOpacityHexValue,
349
415
  getOrderOfMagnitudeExponent,
416
+ getTickDomain,
350
417
  hasScheme,
351
418
  hexToNormalizedRgb,
352
419
  hexToRgb,
@@ -357,6 +424,8 @@ export {
357
424
  isHttpClientErrorStatus,
358
425
  isHttpServerErrorStatus,
359
426
  isHttpSuccessStatus,
427
+ isInputValidInteger,
428
+ isInputValidNumber,
360
429
  isLightColor,
361
430
  isNotBlank,
362
431
  isNullish,
@@ -374,9 +443,14 @@ export {
374
443
  rgbaToHex,
375
444
  rgbaToHexWithAlpha,
376
445
  rgbaToString,
446
+ roundToNiceNumber,
377
447
  roundUpToNearest10,
378
448
  sleep,
449
+ tickFormatter,
379
450
  toFixed,
380
- truncate
451
+ toToleranceLabel,
452
+ tooltipValueFormatter,
453
+ truncate,
454
+ yieldToMainThread
381
455
  };
382
456
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/color.utils.ts","../src/utils/date.utils.ts","../src/utils/types.utils.ts","../src/utils/errors.utils.ts","../src/utils/http.utils.ts","../src/utils/number.utils.ts","../src/utils/regex.ts","../src/utils/string.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"],"sourcesContent":["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 = 0;\n for (i = 1; 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 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","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","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","import { isNullish, isNumber } from \"./types.utils\";\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\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","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","export const sleep = (milliseconds: number) =>\n new Promise((resolve) => setTimeout(resolve, milliseconds));\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","export 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 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","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"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../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/http.utils.ts","../src/utils/regex.ts","../src/utils/string.utils.ts","../src/utils/number.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"],"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 { 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 = 0;\n for (i = 1; 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","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 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","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 * Formats a number as an integer display string (removes decimals).\n */\nexport const formatIntegerDisplay = (value?: number | null): string =>\n 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\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","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","export 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 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","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"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lichens-innovation/ts-common",
3
- "version": "1.6.3",
3
+ "version": "1.8.0",
4
4
  "description": "Reusable generic typescript utilities, types, constants, helpers",
5
5
  "keywords": [
6
6
  "typescript",