@3dsource/utils 1.0.20 → 1.0.21

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.
@@ -2,7 +2,6 @@ import { Subject, fromEvent, startWith, map as map$1, from, switchMap, finalize,
2
2
  import { filter, map, distinctUntilChanged, tap } from 'rxjs/operators';
3
3
  import { v4 } from 'uuid';
4
4
  import { Md5 } from 'ts-md5';
5
- import { InjectionToken, inject, DOCUMENT } from '@angular/core';
6
5
 
7
6
  /**
8
7
  * RGB from each of the CMYK values to determine a return as an any[].
@@ -408,6 +407,12 @@ const COLOR_CODES = {
408
407
  TO_CIRRUS: ['#ffffff', '#3c9738', 'CIRRUS <-'],
409
408
  };
410
409
 
410
+ /*
411
+ * Copyright (c) 2025.
412
+ * Sergii Karanda - All Rights Reserved
413
+ */
414
+ const DOCUMENT_ROOT = window['source3d_app_base'] || '';
415
+
411
416
  function CSV2Array(strData, strDelimiter) {
412
417
  // Check to see if the delimiter is defined. If not,
413
418
  // then default to comma.
@@ -1945,26 +1950,9 @@ const tapLog = (text, ...args) => (source) => source.pipe(tap((data) => {
1945
1950
  Logger.colored(...COLOR_CODES.TAP_LOG, text, data, ...args);
1946
1951
  }));
1947
1952
 
1948
- /*
1949
- * Copyright (c) 2025.
1950
- * Sergii Karanda - All Rights Reserved
1951
- */
1952
- const WINDOW = new InjectionToken('An abstraction over global window object', {
1953
- factory: () => {
1954
- const { defaultView } = inject(DOCUMENT);
1955
- if (!defaultView) {
1956
- throw new Error('Window is not available');
1957
- }
1958
- return defaultView;
1959
- },
1960
- });
1961
- const DOCUMENT_ROOT = new InjectionToken('An abstraction over window.source3d_app_base string', {
1962
- factory: () => inject(WINDOW)['source3d_app_base'] || '',
1963
- });
1964
-
1965
1953
  /**
1966
1954
  * Generated bundle index. Do not edit.
1967
1955
  */
1968
1956
 
1969
- export { BatchLoader, CMYKtoRGB, COLOR_CODES, CSV2Array, CSV2Records, DOCUMENT_ROOT, DownloadImage, Falsy, HEXtoRGB, HSVtoRGB, ImageOutput, InvertedKeyMap, IsEmpty, KeyboardNumericCode, KeyboardStringCode, Logger, Mutex, NotEmpty, ObjectToCSV, RGBtoCMYK, RGBtoHEX, RGBtoHSV, SaveImage, Semaphore, Signal, TaskRunner, Truthy, WINDOW, baseSortedIndex, calculateMedian, circularIndex, clampf, cleanupFileName, debounce, degreesToRadians, expandOverRectangle, fitIntoRectangle, fpIsAGreaterThanB, fpIsALessThanB, fpIsASameAsB, generateUuid, getCanvasCached, getSnapshot, hsv, inverseLerp, isAllValuesTruthy, isDefined, isDesktop, isEmpty, isJSON, isLocalhost, isNotDefined, leadingTrailingDebounceTime, lerp, loadImage, makePath, max, media, min, normalizePath, overlay, pad, radiansToDegrees, rgb, saveToLocalDrive, serialize, shortHash, sleep, smoothTransition, sub, subtract, sum, tapLog, textForSearch, timeToString, timeUTCToString, toRGB, toRGBA, trimLastSlashFromUrl, where, whereNot };
1957
+ export { BatchLoader, CMYKtoRGB, COLOR_CODES, CSV2Array, CSV2Records, DOCUMENT_ROOT, DownloadImage, Falsy, HEXtoRGB, HSVtoRGB, ImageOutput, InvertedKeyMap, IsEmpty, KeyboardNumericCode, KeyboardStringCode, Logger, Mutex, NotEmpty, ObjectToCSV, RGBtoCMYK, RGBtoHEX, RGBtoHSV, SaveImage, Semaphore, Signal, TaskRunner, Truthy, baseSortedIndex, calculateMedian, circularIndex, clampf, cleanupFileName, debounce, degreesToRadians, expandOverRectangle, fitIntoRectangle, fpIsAGreaterThanB, fpIsALessThanB, fpIsASameAsB, generateUuid, getCanvasCached, getSnapshot, hsv, inverseLerp, isAllValuesTruthy, isDefined, isDesktop, isEmpty, isJSON, isLocalhost, isNotDefined, leadingTrailingDebounceTime, lerp, loadImage, makePath, max, media, min, normalizePath, overlay, pad, radiansToDegrees, rgb, saveToLocalDrive, serialize, shortHash, sleep, smoothTransition, sub, subtract, sum, tapLog, textForSearch, timeToString, timeUTCToString, toRGB, toRGBA, trimLastSlashFromUrl, where, whereNot };
1970
1958
  //# sourceMappingURL=3dsource-utils.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"3dsource-utils.mjs","sources":["../../../../projects/3dsource/utils/src/lib/color/CMYKtoRGB.ts","../../../../projects/3dsource/utils/src/lib/color/HEXtoRGB.ts","../../../../projects/3dsource/utils/src/lib/color/rgb.ts","../../../../projects/3dsource/utils/src/lib/color/HSVtoRGB.ts","../../../../projects/3dsource/utils/src/lib/color/hsv.ts","../../../../projects/3dsource/utils/src/lib/color/toRGB.ts","../../../../projects/3dsource/utils/src/lib/color/max.ts","../../../../projects/3dsource/utils/src/lib/color/min.ts","../../../../projects/3dsource/utils/src/lib/color/overlay.ts","../../../../projects/3dsource/utils/src/lib/color/RGBtoCMYK.ts","../../../../projects/3dsource/utils/src/lib/color/RGBtoHEX.ts","../../../../projects/3dsource/utils/src/lib/color/RGBtoHSV.ts","../../../../projects/3dsource/utils/src/lib/color/sub.ts","../../../../projects/3dsource/utils/src/lib/color/subtract.ts","../../../../projects/3dsource/utils/src/lib/color/sum.ts","../../../../projects/3dsource/utils/src/lib/color/toRGBA.ts","../../../../projects/3dsource/utils/src/lib/constants/color-codes.constant.ts","../../../../projects/3dsource/utils/src/lib/csv/CSV2Array.ts","../../../../projects/3dsource/utils/src/lib/csv/CSV2Records.ts","../../../../projects/3dsource/utils/src/lib/csv/ObjectToCSV.ts","../../../../projects/3dsource/utils/src/lib/dev/dev3d.ts","../../../../projects/3dsource/utils/src/lib/strings/pad.ts","../../../../projects/3dsource/utils/src/lib/dev/timeToString.ts","../../../../projects/3dsource/utils/src/lib/predicates/operators.ts","../../../../projects/3dsource/utils/src/lib/predicates/textForSearch.ts","../../../../projects/3dsource/utils/src/lib/predicates/where.ts","../../../../projects/3dsource/utils/src/lib/dev/logger.ts","../../../../projects/3dsource/utils/src/lib/filenaming/cleanupFileName.ts","../../../../projects/3dsource/utils/src/lib/filenaming/makePath.ts","../../../../projects/3dsource/utils/src/lib/filenaming/normalizePath.ts","../../../../projects/3dsource/utils/src/lib/geom/expandOverRectangle.ts","../../../../projects/3dsource/utils/src/lib/geom/fitIntoRectangle.ts","../../../../projects/3dsource/utils/src/lib/image/getCanvasCached.ts","../../../../projects/3dsource/utils/src/lib/image/getSnapshot.ts","../../../../projects/3dsource/utils/src/lib/image/loadImage.ts","../../../../projects/3dsource/utils/src/lib/image/SaveImage.ts","../../../../projects/3dsource/utils/src/lib/helpers/BatchLoader.ts","../../../../projects/3dsource/utils/src/lib/helpers/debounce.ts","../../../../projects/3dsource/utils/src/lib/helpers/KeyboardNumericCode.ts","../../../../projects/3dsource/utils/src/lib/helpers/serialize.ts","../../../../projects/3dsource/utils/src/lib/helpers/save-to-local-drive.ts","../../../../projects/3dsource/utils/src/lib/helpers/sleep.ts","../../../../projects/3dsource/utils/src/lib/helpers/trimLastSlashFromUrl.ts","../../../../projects/3dsource/utils/src/lib/helpers/signal.ts","../../../../projects/3dsource/utils/src/lib/helpers/generate-uuid.ts","../../../../projects/3dsource/utils/src/lib/helpers/short-hash.ts","../../../../projects/3dsource/utils/src/lib/helpers/is-desktop.ts","../../../../projects/3dsource/utils/src/lib/helpers/media.ts","../../../../projects/3dsource/utils/src/lib/interfaces/image-output.ts","../../../../projects/3dsource/utils/src/lib/math/baseSortedIndex.ts","../../../../projects/3dsource/utils/src/lib/math/calculateMedian.ts","../../../../projects/3dsource/utils/src/lib/math/clampf.ts","../../../../projects/3dsource/utils/src/lib/math/circularIndex.ts","../../../../projects/3dsource/utils/src/lib/math/degrees.ts","../../../../projects/3dsource/utils/src/lib/math/floatCompare.ts","../../../../projects/3dsource/utils/src/lib/math/inverseLerp.ts","../../../../projects/3dsource/utils/src/lib/math/lerp.ts","../../../../projects/3dsource/utils/src/lib/mutex/Mutex.ts","../../../../projects/3dsource/utils/src/lib/mutex/Semaphore.ts","../../../../projects/3dsource/utils/src/lib/mutex/TaskRunner.ts","../../../../projects/3dsource/utils/src/lib/rxjs/leadingTrailingDebounceTime.ts","../../../../projects/3dsource/utils/src/lib/rxjs/smoothTransition.ts","../../../../projects/3dsource/utils/src/lib/rxjs/tapLog.ts","../../../../projects/3dsource/utils/src/lib/tokens/index.ts","../../../../projects/3dsource/utils/src/3dsource-utils.ts"],"sourcesContent":["/**\r\n * RGB from each of the CMYK values to determine a return as an any[].\r\n * CMYK values are as follows.\r\n * C - a number between 0 and 255 representing cyan\r\n * M - number between 0 and 255 representing magenta\r\n * Y - number between 0 and 255 representing yellow\r\n * K - number between 0 and 255 representing black\r\n *\r\n **/\r\nexport function CMYKtoRGB(c: number, m: number, y: number, k: number): any[] {\r\n c = 255 - c;\r\n m = 255 - m;\r\n y = 255 - y;\r\n k = 255 - k;\r\n return [\r\n ((255 - c) * (255 - k)) / 255,\r\n ((255 - m) * (255 - k)) / 255,\r\n ((255 - y) * (255 - k)) / 255,\r\n ];\r\n}\r\n","export function HEXtoRGB(color: number | string) {\r\n if (typeof color === 'string') {\r\n color = parseInt(color.replace('#', ''), 16);\r\n }\r\n const r = (color >> 16) & 255;\r\n const g = (color >> 8) & 255;\r\n const b = color & 255;\r\n return { r: r, g: g, b: b };\r\n}\r\n","/**\r\n * Values calculated from each RGB * RGB color value.\r\n * @ Param r the red (R) indicating the number (0-255)\r\n * @ Param g green (G) indicates the number (0-255)\r\n * @ Param b blue (B) shows the number (0-255)\r\n * @ Return obtained from the RGB color value for each indicating the number\r\n **/\r\nexport function rgb(r: number, g: number, b: number): number {\r\n return (r << 16) | (g << 8) | b;\r\n}\r\n","/* eslint-disable prefer-const */\r\n/**\r\n * HSV from each of the RGB values to determine a return as an any[].\r\n * RGB values are as follows.\r\n * R - a number from 0 to 255\r\n * G - a number from 0 to 255\r\n * B - a number from 0 to 255\r\n *\r\n * HSV values are as follows.\r\n * H - a number between 360-0\r\n * S - number between 0 and 1.0\r\n * V - number between 0 and 1.0\r\n *\r\n * H is replaced with equivalent numbers in the range of the 360-0 that is out of range.\r\n * Cannot compute, including alpha.\r\n *\r\n * @ Param h hue (Hue) number that indicates (to 360-0)\r\n * @ Param s the saturation (Saturation) shows the number (0.0 to 1.0)\r\n * @ Param v lightness (Value) indicates the number (0.0 to 1.0)\r\n * @ Return RGB values into an any[] of [R, G, B]\r\n **/\r\n\r\nexport function HSVtoRGB(h: number, s: number, v: number): number[] {\r\n let r = 0,\r\n g = 0,\r\n b = 0;\r\n let i, x, y, z;\r\n if (s < 0) {\r\n s = 0;\r\n }\r\n if (s > 1) {\r\n s = 1;\r\n }\r\n if (v < 0) {\r\n v = 0;\r\n }\r\n if (v > 1) {\r\n v = 1;\r\n }\r\n h = h % 360;\r\n if (h < 0) {\r\n h += 360;\r\n }\r\n h /= 60;\r\n i = h >> 0;\r\n x = v * (1 - s);\r\n y = v * (1 - s * (h - i));\r\n z = v * (1 - s * (1 - h + i));\r\n switch (i) {\r\n case 0:\r\n r = v;\r\n g = z;\r\n b = x;\r\n break;\r\n case 1:\r\n r = y;\r\n g = v;\r\n b = x;\r\n break;\r\n case 2:\r\n r = x;\r\n g = v;\r\n b = z;\r\n break;\r\n case 3:\r\n r = x;\r\n g = y;\r\n b = v;\r\n break;\r\n case 4:\r\n r = z;\r\n g = x;\r\n b = v;\r\n break;\r\n case 5:\r\n r = v;\r\n g = x;\r\n b = y;\r\n break;\r\n }\r\n return [(r * 255) >> 0, (g * 255) >> 0, (b * 255) >> 0];\r\n}\r\n","/* eslint-disable prefer-spread */\r\n/**\r\n * HSV calculated from the numbers of each RGB color value.\r\n * @ Param h hue (Hue) number that indicates (to 360-0)\r\n * @ Param s the saturation (Saturation) shows the number (0.0 to 1.0)\r\n * @ Param v lightness (Value) indicates the number (0.0 to 1.0)\r\n * @ Return obtained from the RGB color value for each indicating the number\r\n **/\r\nimport { rgb } from './rgb';\r\nimport { HSVtoRGB } from './HSVtoRGB';\r\n\r\nexport function hsv(h: number, s: number, v: number): number {\r\n return rgb.apply(null, HSVtoRGB(h, s, v) as any);\r\n}\r\n","/**\r\n * RGB figures show (0x000000 0xFFFFFF up from) the\r\n * R, G, B returns an any[] divided into a number from 0 to 255, respectively.\r\n *\r\n * @ Param rgb numbers show (0x000000 0xFFFFFF up from)\r\n * @ Return any[] indicates the value of each color [R, G, B]\r\n **/\r\nexport function toRGB(rgb: number): number[] {\r\n const r: number = (rgb >> 16) & 0xff;\r\n const g: number = (rgb >> 8) & 0xff;\r\n const b: number = rgb & 0xff;\r\n\r\n return [r, g, b];\r\n}\r\n","/**\r\n * Comparison (light).\r\n * 2 RGB single number that indicates (0x000000 0xFFFFFF up from) to compare,\r\n * RGB values combined with higher returns to their numbers.\r\n * @ Param col1 RGB numbers show (0x000000 0xFFFFFF up from)\r\n * @ Param col2 RGB numbers show (0x000000 0xFFFFFF up from)\r\n * @ Return comparison (light) value\r\n **/\r\nimport { toRGB } from './toRGB';\r\n\r\nexport function max(col1: number, col2: number): number {\r\n const c1: any[] = toRGB(col1);\r\n const c2: any[] = toRGB(col2);\r\n const r: number = Math.max(c1[0], c2[0]);\r\n const g: number = Math.max(c1[1], c2[1]);\r\n const b: number = Math.max(c1[2], c2[2]);\r\n return (r << 16) | (g << 8) | b;\r\n}\r\n","/**\r\n * Comparison (dark).\r\n * 2 RGB single numbers that indicate (0x000000 0xFFFFFF up from) to compare,\r\n * RGB lower combined returns a numeric value for each number.\r\n * @ Param col1 RGB numbers show (0x000000 0xFFFFFF up from)\r\n * @ Param col2 RGB numbers show (0x000000 0xFFFFFF up from)\r\n * @ Return comparison (dark) values\r\n **/\r\nimport { toRGB } from './toRGB';\r\n\r\nexport function min(col1: number, col2: number): number {\r\n const c1: any[] = toRGB(col1);\r\n const c2: any[] = toRGB(col2);\r\n const r: number = Math.min(c1[0], c2[0]);\r\n const g: number = Math.min(c1[1], c2[1]);\r\n const b: number = Math.min(c1[2], c2[2]);\r\n return (r << 16) | (g << 8) | b;\r\n}\r\n","/**\r\n *\r\n There are two part of formula:\r\n First part: If Lower Layer Value > 127.5, then do the following -\r\n Value Unit = (255-Lower Layer Value)/127.5\r\n Min Value = Lower Layer Value - (255-Lower Layer Value)\r\n Overlay = (Upper Layer Value * Value Unit) + Min Value\r\n Second part: If Lower Layer Value < 127.5, then do the following -\r\n Value Unit=Lower Layer Value/127.5\r\n\r\n Overlay = Upper Layer Value * Value Unit\r\n * @param {number} col1\r\n * @param {number} col2\r\n * @return {number}\r\n */\r\nimport { toRGB } from './toRGB';\r\n\r\nexport function overlay(col1: number, col2: number): number {\r\n const c1: any[] = toRGB(col1);\r\n const c2: any[] = toRGB(col2);\r\n const r: number = Math.max(c1[0], c2[0]);\r\n const g: number = Math.max(c1[1], c2[1]);\r\n const b: number = Math.max(c1[2], c2[2]);\r\n return (r << 16) | (g << 8) | b;\r\n}\r\n","/**\r\n * RGB from the respective figures, HSV sequences in terms of returns.\r\n * RGB values are as follows.\r\n * R - a number from 0 to 255\r\n * G - a number from 0 to 255\r\n * B - a number from 0 to 255\r\n *\r\n * CMYK values are as follows.\r\n * C - a number between 0 and 255 representing cyan\r\n * M - number between 0 and 255 representing magenta\r\n * Y - number between 0 and 255 representing yellow\r\n * K - number between 0 and 255 representing black\r\n *\r\n * Cannot compute, including alpha.\r\n * @ Param r the red (R) indicating the number (0x00 to 0xFF to)\r\n * @ Param g green (G) indicates the number (0x00 to 0xFF to)\r\n * @ Param b blue (B) shows the number (0x00 to 0xFF to)\r\n * @ Return CMYK values into an any[] of [H, S, V]\r\n **/\r\nexport function RGBtoCMYK(r: number, g: number, b: number): any[] {\r\n let c = 0;\r\n let m = 0;\r\n let y = 0;\r\n let k = 0;\r\n\r\n c = 255 - r;\r\n m = 255 - g;\r\n y = 255 - b;\r\n k = 255;\r\n\r\n if (c < k) {\r\n k = c;\r\n }\r\n if (m < k) {\r\n k = m;\r\n }\r\n if (y < k) {\r\n k = y;\r\n }\r\n if (k === 255) {\r\n c = 0;\r\n m = 0;\r\n y = 0;\r\n } else {\r\n c = Math.round((255 * (c - k)) / (255 - k));\r\n m = Math.round((255 * (m - k)) / (255 - k));\r\n y = Math.round((255 * (y - k)) / (255 - k));\r\n }\r\n return [c, m, y, k];\r\n}\r\n","export function RGBtoHEX(r: number, g: number, b: number): string {\r\n let redColor = r.toString(16);\r\n let greenColor = g.toString(16);\r\n let blackColor = b.toString(16);\r\n\r\n if (redColor.length === 1) {\r\n redColor = '0' + redColor;\r\n }\r\n if (greenColor.length === 1) {\r\n greenColor = '0' + greenColor;\r\n }\r\n if (blackColor.length === 1) {\r\n blackColor = '0' + blackColor;\r\n }\r\n\r\n return (redColor + greenColor + blackColor).toUpperCase();\r\n}\r\n","/**\r\n * RGB from the respective figures, HSV sequences in terms of returns.\r\n * RGB values are as follows.\r\n * R - a number from 0 to 255\r\n * G - a number from 0 to 255\r\n * B - a number from 0 to 255\r\n *\r\n * HSV values are as follows.\r\n * H - a number between 360-0\r\n * S - number between 0 and 1.0\r\n * V - number between 0 and 1.0\r\n *\r\n * Cannot compute, including alpha.\r\n * @ Param r the red (R) indicating the number (0x00 to 0xFF to)\r\n * @ Param g green (G) indicates the number (0x00 to 0xFF to)\r\n * @ Param b blue (B) shows the number (0x00 to 0xFF to)\r\n * @ Return HSV values into an any[] of [H, S, V]\r\n **/\r\nexport function RGBtoHSV(r: number, g: number, b: number): number[] {\r\n r /= 255;\r\n g /= 255;\r\n b /= 255;\r\n let h = 0,\r\n s = 0,\r\n v = 0;\r\n let x: number, y: number;\r\n if (r >= g) x = r;\r\n else x = g;\r\n if (b > x) x = b;\r\n if (r <= g) y = r;\r\n else y = g;\r\n if (b < y) y = b;\r\n v = x;\r\n const c: number = x - y;\r\n if (x === 0) s = 0;\r\n else s = c / x;\r\n if (s !== 0) {\r\n if (r === x) {\r\n h = (g - b) / c;\r\n } else {\r\n if (g === x) {\r\n h = 2 + (b - r) / c;\r\n } else {\r\n if (b === x) {\r\n h = 4 + (r - g) / c;\r\n }\r\n }\r\n }\r\n h = h * 60;\r\n if (h < 0) h = h + 360;\r\n }\r\n return [h, s, v];\r\n}\r\n","/**\r\n * Subtractive.\r\n * 2 RGB single numbers that indicate (0x000000 0xFFFFFF up from) Return the value\r\n * of the subtractive color.\r\n * @ Param col1 RGB numbers show (0x000000 0xFFFFFF up from)\r\n * @ Param col2 RGB numbers show (0x000000 0xFFFFFF up from)\r\n * @ Return the subtractive\r\n **/\r\nimport { toRGB } from './toRGB';\r\n\r\nexport function sub(col1: number, col2: number): number {\r\n const c1: any[] = toRGB(col1);\r\n const c2: any[] = toRGB(col2);\r\n const r: number = Math.max(c1[0] - c2[0], 0);\r\n const g: number = Math.max(c1[1] - c2[1], 0);\r\n const b: number = Math.max(c1[2] - c2[2], 0);\r\n return (r << 16) | (g << 8) | b;\r\n}\r\n","/**\r\n * Subtraction.\r\n * 2 RGB single number that indicates (0x000000 0xFFFFFF up from) is subtracted\r\n * from the return numbers.\r\n * @ Param col1 RGB numbers show (0x000000 0xFFFFFF up from)\r\n * @ Param col2 RGB numbers show (0x000000 0xFFFFFF up from)\r\n * @ Return value subtracted Blend\r\n **/\r\nimport { toRGB } from './toRGB';\r\n\r\nexport function subtract(col1: number, col2: number): number {\r\n const colA: any[] = toRGB(col1);\r\n const colB: any[] = toRGB(col2);\r\n const r: number = Math.max(\r\n Math.max(colB[0] - (256 - colA[0]), colA[0] - (256 - colB[0])),\r\n 0,\r\n );\r\n const g: number = Math.max(\r\n Math.max(colB[1] - (256 - colA[1]), colA[1] - (256 - colB[1])),\r\n 0,\r\n );\r\n const b: number = Math.max(\r\n Math.max(colB[2] - (256 - colA[2]), colA[2] - (256 - colB[2])),\r\n 0,\r\n );\r\n return (r << 16) | (g << 8) | b;\r\n}\r\n","/**\r\n * Additive color.\r\n * 2 RGB single numbers that indicate (0x000000 0xFFFFFF up from) Return the value\r\n * of the additive mixture.\r\n * @ Param col1 RGB numbers show (0x000000 0xFFFFFF up from)\r\n * @ Param col2 RGB numbers show (0x000000 0xFFFFFF up from)\r\n * @ Return the additive color\r\n **/\r\nimport { toRGB } from './toRGB';\r\n\r\nexport function sum(col1: number, col2: number): number {\r\n const c1: any[] = toRGB(col1);\r\n const c2: any[] = toRGB(col2);\r\n const r: number = Math.min(c1[0] + c2[0], 255);\r\n const g: number = Math.min(c1[1] + c2[1], 255);\r\n const b: number = Math.min(c1[2] + c2[2], 255);\r\n\r\n return (r << 16) | (g << 8) | b;\r\n}\r\n","export function toRGBA(rgba: number): number[] {\r\n const a: number = (rgba >> 24) & 0xff;\r\n const r: number = (rgba >> 16) & 0xff;\r\n const g: number = (rgba >> 8) & 0xff;\r\n const b: number = rgba & 0xff;\r\n\r\n return [r, g, b, a];\r\n}\r\n","export const COLOR_CODES = {\r\n TO_UNREAL: ['#ffffff', '#005912', `UNREAL <-`],\r\n TAP_LOG: ['#ffff00', '#1976d2', ' [TAPLOG]'],\r\n FROM_UNREAL: ['#ffff00', '#898989', 'UNREAL ->'],\r\n FROM_UNREAL_ERROR: ['#ffffff', '#ff0000', 'UNREAL ERROR ->'],\r\n FROM_CIRRUS: ['#ffffff', '#ef702b', 'CIRRUS ->'],\r\n FROM_CIRRUS_ERROR: ['#ffffff', '#ff0000', 'CIRRUS ->'],\r\n TO_CIRRUS: ['#ffffff', '#3c9738', 'CIRRUS <-'],\r\n} as const;\r\n","export function CSV2Array(strData: any, strDelimiter?: string): any[] {\r\n // Check to see if the delimiter is defined. If not,\r\n // then default to comma.\r\n strDelimiter = strDelimiter || ',';\r\n\r\n // Create a regular expression to parse the CSV values.\r\n const objPattern = new RegExp(\r\n // Delimiters.\r\n '(\\\\' +\r\n strDelimiter +\r\n '|\\\\r?\\\\n|\\\\r|^)' +\r\n // Quoted fields.\r\n '(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|' +\r\n // Standard fields.\r\n '([^\"\\\\' +\r\n strDelimiter +\r\n '\\\\r\\\\n]*))',\r\n 'gi',\r\n );\r\n\r\n // Create an array to hold our data. Give the array\r\n // a default empty first row.\r\n const arrData: any[] = [[]];\r\n\r\n // Create an array to hold our individual pattern\r\n // matching groups.\r\n let arrMatches = null;\r\n\r\n // Keep looping over the regular expression matches\r\n // until we can no longer find a match.\r\n while ((arrMatches = objPattern.exec(strData))) {\r\n // Get the delimiter that was found.\r\n const strMatchedDelimiter = arrMatches[1];\r\n\r\n // Check to see if the given delimiter has a length\r\n // (is not the start of string) and if it matches\r\n // field delimiter. If idKey does not, then we know\r\n // that this delimiter is a row delimiter.\r\n if (strMatchedDelimiter.length && strMatchedDelimiter !== strDelimiter) {\r\n // Since we have reached a new row of data,\r\n // add an empty row to our data array.\r\n arrData.push([]);\r\n }\r\n\r\n let strMatchedValue: any;\r\n\r\n // Now that we have our delimiter out of the way,\r\n // let's check to see which kind of value we\r\n // captured (quoted or unquoted).\r\n if (arrMatches[2]) {\r\n // We found a quoted value. When we capture\r\n // this value, unescape any double quotes.\r\n strMatchedValue = arrMatches[2].replace(new RegExp('\"\"', 'g'), '\"');\r\n } else {\r\n // We found a non-quoted value.\r\n strMatchedValue = arrMatches[3];\r\n }\r\n\r\n // Now that we have our value string, let's add\r\n // it to the data array.\r\n arrData[arrData.length - 1].push(strMatchedValue);\r\n }\r\n\r\n // Return the parsed data.\r\n return arrData;\r\n}\r\n","import { CSV2Array } from './CSV2Array';\r\n\r\nconst booleanRegex = /^(true|false)$/i;\r\nconst trueRegex = /^(true)$/i;\r\nconst jsonRegex = /([\\d.]+)|(\\[])|(\\[.+])|({.+})/i;\r\n\r\nconst zipObject = (props: string[], values: any[]) =>\r\n props.reduce(\r\n (obj: any, prop, index) => ((obj[prop] = values[index]), obj),\r\n {},\r\n );\r\n\r\nconst toHead = (input: any): string => {\r\n return String(input).trim();\r\n};\r\n\r\nconst toCorrectString = (input: any): any => {\r\n if (typeof input === 'string') {\r\n if (input.match(jsonRegex)) {\r\n // optimization for use try-catch only after regex match. much faster than without regex\r\n try {\r\n return JSON.parse(input);\r\n } catch {\r\n /* empty */\r\n }\r\n }\r\n if (input.match(booleanRegex)) {\r\n return !!input.match(trueRegex);\r\n }\r\n return input.trim();\r\n } else if (typeof input === 'number') {\r\n return input;\r\n }\r\n};\r\n\r\nexport function CSV2Records(\r\n csv: string,\r\n useRowAsHead = 0,\r\n strDelimiter?: string,\r\n): any {\r\n const arr = CSV2Array(csv, strDelimiter);\r\n const total = arr.length;\r\n const keys = arr[useRowAsHead].map(toHead);\r\n const data: any[] = [];\r\n\r\n let tmpSKU = 0;\r\n\r\n for (let i = useRowAsHead + 1; i < total; i++) {\r\n const obj = zipObject(keys, arr[i].map(toCorrectString));\r\n data.push(obj);\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n tmpSKU++;\r\n }\r\n\r\n return data.filter(Boolean);\r\n}\r\n","export function ObjectToCSV<T extends object>(records: T[]) {\r\n if (records.length === 0) {\r\n return;\r\n }\r\n\r\n const uniqueFields = Array.from(\r\n records.reduce((fields, record) => {\r\n Object.keys(record).forEach((field: string) => fields.add(field));\r\n return fields;\r\n }, new Set<string>()),\r\n );\r\n\r\n const csvHeader = uniqueFields.join(',') + '\\n';\r\n const csvRows = records\r\n .map((record: any) =>\r\n uniqueFields.map((field: any) => `\"${record[field] || ''}\"`).join(','),\r\n )\r\n .join('\\n');\r\n\r\n return csvHeader + csvRows;\r\n}\r\n","export const isLocalhost = !!window.location.href.match(/localhost/gi);\r\n","/**\r\n * Adds required number of symbols before input\r\n * @param input input string\r\n * @param size amount of total symbols\r\n * @param symbol filler\r\n * @returns string\r\n */\r\nexport function pad(\r\n input: number | string,\r\n size: number,\r\n symbol = '0',\r\n): string {\r\n let s = input + '';\r\n while (s.length < size) {\r\n s = symbol + s;\r\n }\r\n return s.slice(-size);\r\n}\r\n","import { pad } from '../strings';\r\n\r\n/**\r\n * Create a string of the form 'HOURS.MINUTES.SECONDS.MILLISECONDS'.\r\n */\r\nexport function timeToString() {\r\n const date = new Date();\r\n\r\n return `${pad(date.getHours(), 2)}:${pad(date.getMinutes(), 2)}:${pad(date.getSeconds(), 2)}.${pad(date.getMilliseconds(), 3)}`;\r\n}\r\n\r\nexport function timeUTCToString() {\r\n const date = new Date();\r\n\r\n return `${pad(date.getUTCHours(), 2)}:${pad(date.getUTCMinutes(), 2)}:${pad(date.getUTCSeconds(), 2)}.${pad(date.getUTCMilliseconds(), 3)}`;\r\n}\r\n","type TruthyTypesOf<T> = T extends false | '' | 0 | null | undefined ? never : T;\r\ntype FalsyTypesOf<T> = T extends false | '' | 0 | null | undefined ? T : never;\r\ntype EmptyTypesOf<T> = T extends undefined | null | object | '' ? T : never;\r\ntype NonEmptyTypesOf<T> = T extends undefined | null | object | '' ? never : T;\r\n/**\r\n * The Boolean object represents a truth value: true or false.\r\n * @param value\r\n * @constructor\r\n * Returns:boolean\r\n */\r\nexport const Truthy: <T>(value: T) => value is TruthyTypesOf<T> = <T>(\r\n value?: T,\r\n): value is TruthyTypesOf<T> =>\r\n !!value && value !== 'false' && value !== 'undefined' && value !== 'null';\r\n\r\n/**\r\n * The Boolean object represents an INVERSE truth value: true or false.\r\n * @param value\r\n * @constructor\r\n * Returns:boolean\r\n */\r\nexport const Falsy: <T>(value: T) => value is FalsyTypesOf<T> = <T>(\r\n value?: T,\r\n): value is FalsyTypesOf<T> => !Truthy(value);\r\n\r\n/**\r\n * Checks if a value is empty.\r\n *\r\n * @param {any} value - The value to check.\r\n * @return {boolean} Returns true if the value is empty, otherwise false.\r\n */\r\nexport const IsEmpty: <T>(value: T) => value is EmptyTypesOf<T> = <T>(\r\n value: T,\r\n): value is EmptyTypesOf<T> => {\r\n return (\r\n value === undefined ||\r\n value === null ||\r\n (typeof value === 'object' && Object.keys(value).length === 0) ||\r\n (typeof value === 'string' && value.trim().length === 0)\r\n );\r\n};\r\n\r\nexport const NotEmpty: <T>(value: T) => value is NonEmptyTypesOf<T> = <T>(\r\n value: T,\r\n): value is NonEmptyTypesOf<T> => {\r\n return !IsEmpty(value);\r\n};\r\nexport const isDefined = <T>(arg: T | null | undefined): arg is T =>\r\n arg !== null && arg !== undefined;\r\n\r\nexport const isNotDefined = <T>(\r\n arg: T | null | undefined,\r\n): arg is null | undefined => arg === null || arg === undefined;\r\n\r\nexport const isJSON = (str: string): boolean => {\r\n try {\r\n JSON.parse(str);\r\n } catch (e) {\r\n console.warn(e);\r\n\r\n return false;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nexport const isEmpty = (value: any) =>\r\n value === undefined ||\r\n value === null ||\r\n (typeof value === 'object' && Object.keys(value).length === 0) ||\r\n (typeof value === 'string' && value.trim().length === 0);\r\n\r\nexport function isAllValuesTruthy<T extends string, K>(value: Record<T, K>) {\r\n return Object.values(value).every(Truthy);\r\n}\r\n","const cache: Record<string, unknown> = {};\r\n\r\n/**\r\n * Converts a given value to a string suitable for search comparisons.\r\n * The resulting string is in lowercase, with consecutive spaces replaced by underscores.\r\n * The function uses a cache to improve performance by storing and reusing the results of previous conversions.\r\n *\r\n * @param {any} value - The value to be converted to a search-friendly string.\r\n * It can be of any type, but it will be coerced to a string if not already one.\r\n *\r\n * @param {boolean} caseSensitive - A flag indicating whether the comparison should be case-sensitive.\r\n * If set to true, the function will perform case-sensitive comparisons, preserving the original casing of input strings.\r\n * If set to false (default), the function will convert the input strings to lowercase for case-insensitive comparisons\r\n *\r\n * @returns {string} The processed string, which is trimmed, converted to lowercase (unless caseSensitive is true),\r\n * and has all sequences of spaces replaced with underscores. This string is either\r\n * retrieved from the cache or freshly computed and then cached.\r\n *\r\n */\r\nexport function textForSearch(value: unknown, caseSensitive = false): string {\r\n const key = `${value}_${caseSensitive}`;\r\n return (cache[key] ||\r\n (() => {\r\n let result = String(value).trim().replace(/ +/gi, '_');\r\n\r\n if (!caseSensitive) {\r\n result = result.toLowerCase();\r\n }\r\n\r\n cache[key] = result;\r\n\r\n return result;\r\n })()) as string;\r\n}\r\n","import { textForSearch } from './textForSearch';\r\n\r\n/**\r\n * Builds a predicate that checks whether a record matches **all** provided criteria.\r\n *\r\n * Behavior:\r\n * - Only keys with **defined** values in `criteria` are considered; keys with `undefined` are ignored.\r\n * - Both the criterion value and the corresponding record value are normalized using `textForSearch(value, caseSensitive)`,\r\n * then compared for **equality** (not substring/contains).\r\n * - By default (`caseSensitive = false`), comparisons are case-insensitive and tolerant to extra spacing\r\n * (per `textForSearch`). When `caseSensitive = true`, comparisons preserve original casing.\r\n * - If **no** criteria have defined values, the resulting predicate always returns **false**.\r\n *\r\n * @remarks\r\n * **Nested object stringification (runtime edge case):**\r\n * Although the TypeScript types constrain comparisons to primitive fields via `ISearchable<T>`,\r\n * at runtime any non-primitive value that slips through (e.g., due to loose typing) will be coerced to a string\r\n * before normalization. For example:\r\n *\r\n * ```ts\r\n * // Runtime behavior with nested objects (typing omitted for brevity)\r\n * const record = { age: 20, test: { hello: 'world' } } as any;\r\n * // textForSearch(record.test, false) => \"[object_object]\" (e.g., \"[object Object]\" normalized)\r\n * const criteria = { age: 20, test: \"[object_object]\" } as any;\r\n * const matches = where<any>(criteria)(record);\r\n * // matches === true\r\n * ```\r\n *\r\n * In other words, `{ hello: 'world' }` is interpreted as the string `\"[object_object]\"` after normalization,\r\n * so a criterion with `test: \"[object_object]\"` will successfully match.\r\n *\r\n * @typeParam T - The object type whose **primitive** fields are comparable via `ISearchable<T>`.\r\n *\r\n * @param criteria - A partial set of key–value pairs over `ISearchable<T>` to match against.\r\n * Only keys with defined values participate in the comparison.\r\n * @param caseSensitive - Whether comparisons should be case-sensitive. Defaults to `false`.\r\n *\r\n * @returns A predicate `(record: ISearchable<T>) => boolean` that is `true` iff the record matches **all** criteria.\r\n *\r\n * @example\r\n * type Item = { name: string; category: string; note?: string };\r\n * const items: Item[] = [\r\n * { name: \"Apple\", category: \"Fruit\" },\r\n * { name: \"Carrot\", category: \"Vegetable\" },\r\n * { name: \"Banana\", category: \"Fruit\" }\r\n * ];\r\n *\r\n * // Case-insensitive equality match on category (\"fruit\" matches \"Fruit\")\r\n * const isFruit = where<Item>({ category: \"fruit\" });\r\n * const fruits = items.filter(isFruit);\r\n * // → [{ name: \"Apple\", category: \"Fruit\" }, { name: \"Banana\", category: \"Fruit\" }]\r\n *\r\n * // Empty criteria → predicate always false\r\n * const matchNothing = where<Item>({});\r\n * items.filter(matchNothing); // → []\r\n */\r\nexport function where<T extends object>(\r\n criteria: Input<T>,\r\n caseSensitive = false,\r\n): (record: ISearchable<T>) => boolean {\r\n const preComputedEntries = Object.entries(criteria)\r\n .filter(([, value]) => value !== undefined)\r\n .map(([key, value]) => [key, textForSearch(value, caseSensitive)] as const);\r\n\r\n return (record: ISearchable<T>): boolean => {\r\n return (\r\n preComputedEntries.length > 0 &&\r\n preComputedEntries.every(([key, criterionValue]) => {\r\n return (\r\n textForSearch(\r\n record[key as keyof ISearchable<T>] ?? '',\r\n caseSensitive,\r\n ) === criterionValue\r\n );\r\n })\r\n );\r\n };\r\n}\r\n\r\n/**\r\n * Builds a predicate that is the logical **negation** of `where`.\r\n *\r\n * Behavior mirrors `where(criteria, caseSensitive)` but returns `true` when a record **does not**\r\n * satisfy all criteria. Notable edge cases:\r\n * - If `criteria` has no defined values (i.e., `where` would always return `false`), this negated predicate\r\n * will always return **true**.\r\n * - **Nested object stringification (runtime edge case):** If a nested object is compared against a criterion\r\n * like `\"[object_object]\"` (after normalization), the original `where` would return `true`, so `whereNot` will return `false`.\r\n *\r\n * @typeParam T - The object type whose **primitive** fields are comparable via `ISearchable<T>`.\r\n *\r\n * @param criteria - Same as in `where`.\r\n * @param caseSensitive - Same as in `where`. Defaults to `false`.\r\n *\r\n * @returns A predicate `(record: ISearchable<T>) => boolean` that is `true` iff the record **fails** the `where` check.\r\n *\r\n * @example\r\n * type Item = { name: string; category: string };\r\n * const items: Item[] = [\r\n * { name: \"Apple\", category: \"Fruit\" },\r\n * { name: \"Carrot\", category: \"Vegetable\" }\r\n * ];\r\n *\r\n * const isNotFruit = whereNot<Item>({ category: \"fruit\" });\r\n * items.filter(isNotFruit);\r\n * // → [{ name: \"Carrot\", category: \"Vegetable\" }]\r\n */\r\nexport function whereNot<T extends object>(\r\n criteria: Input<T>,\r\n caseSensitive = false,\r\n): (record: ISearchable<T>) => boolean {\r\n const whereFunc = where(criteria, caseSensitive);\r\n return (record: ISearchable<T>) => {\r\n return !whereFunc(record);\r\n };\r\n}\r\n\r\ntype HasPrimitivePartKeys<T> = {\r\n [K in keyof T]: Extract<T[K], Primitive> extends never ? never : K;\r\n}[keyof T];\r\n\r\ntype ISearchable<T> = {\r\n [K in HasPrimitivePartKeys<T>]: Extract<T[K], Primitive>;\r\n};\r\n\r\ntype Input<T> = Partial<TruthyTypesOf<ISearchable<T>>>;\r\ntype Primitive = string | number | bigint | boolean | symbol | null | undefined;\r\ntype TruthyTypesOf<T> = T extends Falsy ? never : T;\r\ntype Falsy = null | undefined | false | 0 | -0 | 0n | '';\r\n","import { timeUTCToString } from './timeToString';\r\nimport { Truthy } from '../predicates';\r\n\r\nexport class Logger {\r\n static isDevMode = Truthy(localStorage.getItem('devMode'));\r\n\r\n static colored(color: string, background: string, ...args: unknown[]) {\r\n if (!Logger.isDevMode) {\r\n return;\r\n }\r\n\r\n const [first, ...rest] = args;\r\n console.log.apply(console, [\r\n `%c ${timeUTCToString()} ${first} `,\r\n `color: ${color}; background: ${background};`,\r\n ...rest,\r\n ]);\r\n }\r\n\r\n static log(...args: unknown[]) {\r\n if (!Logger.isDevMode) {\r\n return;\r\n }\r\n\r\n console.log.apply(console, [\r\n `%c ${timeUTCToString()} [ LOG ] `,\r\n 'color: black; background: #80ff80;',\r\n ...args,\r\n ]);\r\n }\r\n\r\n static warn(...args: unknown[]) {\r\n if (!Logger.isDevMode) {\r\n return;\r\n }\r\n\r\n console.warn.apply(console, [\r\n `%c ${timeUTCToString()} WARN `,\r\n 'color: black; background: #ffd500;',\r\n ...args,\r\n ]);\r\n }\r\n\r\n static info(...args: unknown[]) {\r\n if (!Logger.isDevMode) {\r\n return;\r\n }\r\n\r\n console.log.apply(console, [\r\n `%c ${timeUTCToString()} [ INFO ] `,\r\n 'color: white; background: blue;',\r\n ...args,\r\n ]);\r\n }\r\n\r\n static error(...args: unknown[]) {\r\n if (!Logger.isDevMode) {\r\n return;\r\n }\r\n\r\n console.error.apply(console, [\r\n `%c ${timeUTCToString()} ERROR `,\r\n 'color: white; background: red;',\r\n ...args,\r\n ]);\r\n }\r\n\r\n static table(...args: unknown[]) {\r\n if (!Logger.isDevMode) {\r\n return;\r\n }\r\n\r\n // eslint-disable-next-line no-console\r\n console.table.apply(console, [args]);\r\n }\r\n\r\n static time(...args: any) {\r\n if (!Logger.isDevMode) {\r\n return;\r\n }\r\n\r\n // eslint-disable-next-line no-console,prefer-spread\r\n console.time.apply(console, args);\r\n }\r\n\r\n static timeEnd(...args: any) {\r\n if (!Logger.isDevMode) {\r\n return;\r\n }\r\n\r\n // eslint-disable-next-line no-console,prefer-spread\r\n console.timeEnd.apply(console, args);\r\n }\r\n}\r\n","export function cleanupFileName(value: string): string {\r\n if (!value) {\r\n return value;\r\n }\r\n\r\n value = value\r\n .toString()\r\n .replace(/undefined/g, '')\r\n .trim()\r\n .replace(/\\//g, '-')\r\n .replace(/[-]+/g, '-')\r\n .replace(/[^\\w^.-]+/gi, '_')\r\n .replace(/[\\^]+/gi, '_');\r\n\r\n value = value.split('_').filter(Boolean).join('_').toLowerCase();\r\n\r\n return value;\r\n}\r\n","import { cleanupFileName } from './cleanupFileName';\r\n\r\nexport function makePath(...value: string[]): string {\r\n return [...value].map((el) => cleanupFileName(el)).join('/');\r\n}\r\n","import { cleanupFileName } from './cleanupFileName';\r\n\r\nexport function normalizePath(value: string): string {\r\n const re = new RegExp('[/\\\\\\\\]+', 'g');\r\n return value\r\n .split(re)\r\n .map((el) => cleanupFileName(el))\r\n .join('/');\r\n}\r\n","import type { Area, Rect } from './interfaces';\r\n\r\nexport function expandOverRectangle(objectRect: Rect, areaRect: Rect): Area {\r\n const ratio: number = objectRect.w / objectRect.h;\r\n const result: Area = { x: 0, y: 0, w: 0, h: 0, scale: 1 };\r\n if (areaRect.w / ratio < areaRect.h) {\r\n result.w = areaRect.h * ratio;\r\n result.h = areaRect.h;\r\n } else {\r\n result.w = areaRect.w;\r\n result.h = areaRect.w / ratio;\r\n }\r\n result.x = areaRect.x + (areaRect.w - result.w) / 2;\r\n result.y = areaRect.y + (areaRect.h - result.h) / 2;\r\n result.scale = result.w / objectRect.w;\r\n return result;\r\n}\r\n","import type { Area, Rect } from './interfaces';\r\n\r\nexport function fitIntoRectangle(\r\n objectRect: Rect,\r\n areaRect: Rect,\r\n round = true,\r\n fixedRatio: number | null = null,\r\n): Area {\r\n const result: Area = { x: 0, y: 0, w: 0, h: 0, scale: 1 };\r\n const ratio: number = objectRect.h / objectRect.w;\r\n\r\n if (objectRect.h > objectRect.w) {\r\n result.h = areaRect.h;\r\n result.w = areaRect.h / ratio;\r\n\r\n if (result.w > areaRect.w) {\r\n result.w = areaRect.w;\r\n result.h = areaRect.w * ratio;\r\n }\r\n } else {\r\n result.w = areaRect.w;\r\n result.h = areaRect.w * ratio;\r\n\r\n if (result.h > areaRect.h) {\r\n result.h = areaRect.h;\r\n result.w = areaRect.h / ratio;\r\n }\r\n }\r\n\r\n if (fixedRatio) {\r\n result.w = objectRect.w * fixedRatio;\r\n result.h = objectRect.h * fixedRatio;\r\n }\r\n const wOut: number = round ? Math.floor(result.w) : result.w;\r\n const hOut: number = round ? Math.floor(result.h) : result.h;\r\n return {\r\n x: areaRect.x + (areaRect.w - wOut) / 2,\r\n y: areaRect.y + (areaRect.h - hOut) / 2,\r\n w: wOut,\r\n h: hOut,\r\n scale: wOut / objectRect.w,\r\n };\r\n}\r\n","const canvasCacheObj: any = {};\r\n\r\nexport function getCanvasCached(id: string): {\r\n canvas: HTMLCanvasElement;\r\n ctx: CanvasRenderingContext2D;\r\n} {\r\n if (!canvasCacheObj[id]) {\r\n const canvas = document.createElement('canvas');\r\n canvasCacheObj[id] = {\r\n canvas,\r\n ctx: canvas.getContext('2d'),\r\n };\r\n }\r\n\r\n return canvasCacheObj[id];\r\n}\r\n","import { fitIntoRectangle } from '../geom';\r\nimport type { ImageOutputValues } from '../interfaces';\r\n\r\nfunction getSnapshot2(\r\n imageElement:\r\n | HTMLImageElement\r\n | HTMLCanvasElement\r\n | HTMLVideoElement\r\n | ImageBitmap,\r\n maxWidth = 1024,\r\n output: ImageOutputValues = 'image/png',\r\n quality = 0.9,\r\n): HTMLCanvasElement | string {\r\n const drawableImage = imageElement as any;\r\n const canvasHelper: HTMLCanvasElement = document.createElement('canvas');\r\n const drawCTX: CanvasRenderingContext2D = canvasHelper.getContext(\r\n '2d',\r\n ) as CanvasRenderingContext2D;\r\n\r\n const prop = fitIntoRectangle(\r\n {\r\n x: 0,\r\n y: 0,\r\n w: drawableImage.naturalWidth || drawableImage.width,\r\n h: drawableImage.naturalHeight || drawableImage.height,\r\n },\r\n {\r\n x: 0,\r\n y: 0,\r\n w: maxWidth,\r\n h: drawableImage.naturalHeight || drawableImage.height,\r\n },\r\n );\r\n\r\n const width = prop.w;\r\n const height = prop.h;\r\n canvasHelper.width = width;\r\n canvasHelper.height = height;\r\n\r\n drawCTX.save();\r\n drawCTX.clearRect(0, 0, width, height);\r\n drawCTX.drawImage(drawableImage, 0, 0, width, height);\r\n drawCTX.restore();\r\n\r\n if (output === 'canvas') {\r\n return canvasHelper;\r\n }\r\n\r\n return canvasHelper.toDataURL(output, quality);\r\n}\r\n\r\nexport function getSnapshot(\r\n imageElement:\r\n | HTMLImageElement\r\n | HTMLCanvasElement\r\n | HTMLVideoElement\r\n | ImageBitmap,\r\n maxWidth = 1024,\r\n output: ImageOutputValues = 'image/png',\r\n quality = 0.9,\r\n): HTMLCanvasElement | string {\r\n const drawableImage = imageElement as any;\r\n const canvasHelper: HTMLCanvasElement = document.createElement('canvas');\r\n const drawCTX: CanvasRenderingContext2D = canvasHelper.getContext(\r\n '2d',\r\n ) as CanvasRenderingContext2D;\r\n\r\n const prop = fitIntoRectangle(\r\n {\r\n x: 0,\r\n y: 0,\r\n w: drawableImage.naturalWidth || drawableImage.width,\r\n h: drawableImage.naturalHeight || drawableImage.height,\r\n },\r\n {\r\n x: 0,\r\n y: 0,\r\n w: (drawableImage.naturalWidth || drawableImage.width) / 2,\r\n h: drawableImage.naturalHeight || drawableImage.height,\r\n },\r\n );\r\n\r\n const width = prop.w;\r\n const height = prop.h;\r\n canvasHelper.width = width;\r\n canvasHelper.height = height;\r\n\r\n drawCTX.save();\r\n drawCTX.clearRect(0, 0, width, height);\r\n drawCTX.drawImage(drawableImage, 0, 0, width, height);\r\n\r\n drawCTX.restore();\r\n\r\n if (width > maxWidth * 2) {\r\n return getSnapshot(canvasHelper, maxWidth, output, quality);\r\n }\r\n\r\n return getSnapshot2(drawableImage, maxWidth, output, quality);\r\n}\r\n","export function loadImage(url: string): Promise<HTMLImageElement> {\r\n return new Promise((resolve: any, reject) => {\r\n const img = new Image();\r\n img.crossOrigin = 'anonymous';\r\n img.onload = () => {\r\n setTimeout(() => resolve(img), 1);\r\n };\r\n img.onerror = () => {\r\n setTimeout(() => reject(null), 1);\r\n };\r\n img.src = url;\r\n });\r\n}\r\n","import { getSnapshot } from './getSnapshot';\r\nimport type { ImageOutputValues } from '../interfaces';\r\n\r\n/**\r\n * USE DownloadImage instead!\r\n * @deprecated use DownloadImage instead!\r\n * @param imageSource\r\n * @param name\r\n * @param width\r\n * @param format\r\n */\r\nfunction SaveImage(\r\n imageSource:\r\n | HTMLImageElement\r\n | HTMLCanvasElement\r\n | HTMLVideoElement\r\n | ImageBitmap\r\n | string,\r\n name: string,\r\n width?: number,\r\n format?: string | ImageOutputValues,\r\n): any {\r\n let out;\r\n const image: any = imageSource;\r\n\r\n if (typeof image !== 'string') {\r\n out = getSnapshot(image, width, format as ImageOutputValues);\r\n } else {\r\n out = image;\r\n }\r\n\r\n if ((navigator as any).msSaveBlob) {\r\n // IE10+\r\n try {\r\n const blob = image.msToBlob();\r\n return (navigator as any).msSaveBlob(blob, name);\r\n } catch (e) {\r\n console.warn(e);\r\n }\r\n } else {\r\n const uri = out;\r\n const link = document.createElement('a');\r\n link.download = name;\r\n link.href = uri as string;\r\n\r\n document.body.appendChild(link);\r\n if (link.click) {\r\n link.click();\r\n } else {\r\n const event = document.createEvent('MouseEvents');\r\n (event as any).initMouseEvent('click', true, true, window);\r\n link.dispatchEvent(event);\r\n }\r\n document.body.removeChild(link);\r\n }\r\n}\r\n\r\n/**\r\n * @param imageSource\r\n * @param string name\r\n * @param number width\r\n * @param string format\r\n */\r\nconst DownloadImage = SaveImage;\r\nexport { SaveImage, DownloadImage };\r\n","import type { LoadArgs, LoadArgsTmp } from '../interfaces';\r\nimport { loadImage } from '../image';\r\n\r\nexport class BatchLoader {\r\n private maximumSlotsNumber = 1;\r\n private queue: LoadArgsTmp[] = [];\r\n private slots: LoadArgsTmp[] = [];\r\n private _whenDone!: () => any;\r\n\r\n clear() {\r\n this.queue.forEach((item) => {\r\n try {\r\n if (item.img) {\r\n item.img.src = '';\r\n }\r\n } catch (e) {\r\n console.warn(e);\r\n }\r\n\r\n try {\r\n item.xhr?.abort();\r\n } catch (e) {\r\n console.warn(e);\r\n }\r\n });\r\n\r\n this.slots.forEach((item) => {\r\n try {\r\n if (item.img) {\r\n item.img.src = '';\r\n }\r\n } catch (e) {\r\n console.warn(e);\r\n }\r\n\r\n try {\r\n item.xhr?.abort();\r\n } catch (e) {\r\n console.warn(e);\r\n }\r\n });\r\n this.slots.length = 0;\r\n this.queue.length = 0;\r\n }\r\n\r\n /**\r\n * new settings\r\n * you must pass new settings\r\n * @param sett\r\n */\r\n setSettings(sett: any) {\r\n this.maximumSlotsNumber =\r\n sett.maximumSlotsNumber !== undefined\r\n ? sett.maximumSlotsNumber\r\n : this.maximumSlotsNumber;\r\n }\r\n\r\n /**\r\n * execute with a chosen file\r\n * @param id\r\n * @param func\r\n */\r\n withItem(id: string, func: (item: LoadArgs) => any): boolean {\r\n let item = this.getById(id);\r\n if (!item) {\r\n return false;\r\n }\r\n item = func(item);\r\n this.queue.sort(this.sortByOrder);\r\n return true;\r\n }\r\n\r\n remove(id: string): LoadArgs[] {\r\n this.queue = this.queue.filter((arg) => arg.id !== id);\r\n return this.queue;\r\n }\r\n\r\n /**\r\n * executes when all files are downloaded\r\n * @param cb\r\n */\r\n whenDone(cb: any) {\r\n this._whenDone = cb;\r\n }\r\n\r\n // order {number} lower will execute first, default *100*\r\n load(args: LoadArgs[]) {\r\n const out: { path: string; self?: any; id: string }[] = args\r\n .filter((arg) => !!arg.path)\r\n .map((arg) => ({\r\n path: arg.path,\r\n id: this.add(arg),\r\n }));\r\n\r\n this.queue.sort(this.sortByOrder);\r\n this.checkSlots();\r\n\r\n return out;\r\n }\r\n\r\n /**\r\n * operates with one file\r\n * @param item\r\n * @private\r\n */\r\n private add(item: LoadArgs): string {\r\n // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n const that = this;\r\n const temp: LoadArgsTmp = {\r\n id: item.id,\r\n resolutionId: null,\r\n useXhr: item.useXhr,\r\n order: item.order !== undefined ? item.order : 100,\r\n fallBack: item.fallBack,\r\n path: item.path,\r\n onLoadEnd: item.onLoadEnd,\r\n onProgress: item.onProgress,\r\n onLoadStart: item.onLoadStart,\r\n extra: item.extra,\r\n };\r\n\r\n let retryCount = 1;\r\n if (temp.useXhr) {\r\n temp.xhr = this.getXmlHttp();\r\n temp.xhr.onloadstart = (data: ProgressEvent) => item.onLoadStart(data);\r\n temp.xhr.onprogress = (data: ProgressEvent) => item.onProgress(data);\r\n temp.xhr.onreadystatechange = async function (data: any) {\r\n if (this.readyState === 1 && this.status === 0) {\r\n return;\r\n }\r\n if (\r\n this.readyState === 4 &&\r\n (this.status === 404 || this.status === 0)\r\n ) {\r\n temp.error = true;\r\n that.loadEnd(temp);\r\n return;\r\n }\r\n if (this.readyState === 4 && this.status === 200) {\r\n const urlCreator = window.URL;\r\n const imageUrl = urlCreator.createObjectURL(data.target.response);\r\n temp.img = await loadImage(imageUrl);\r\n that.loadEnd(temp);\r\n return;\r\n }\r\n };\r\n } else {\r\n temp.img = new Image();\r\n temp.img.crossOrigin = 'anonymous';\r\n temp.img.onload = () => {\r\n that.loadEnd(temp);\r\n };\r\n temp.img.onerror = () => {\r\n if (temp.fallBack && retryCount-- > 0) {\r\n console.warn('Fallback used =>', temp.path, '=>', temp.fallBack);\r\n if (temp.img) {\r\n temp.img.onload = null;\r\n temp.img.src = temp.fallBack;\r\n }\r\n\r\n that.loadEnd(temp);\r\n } else {\r\n temp.error = true;\r\n that.loadEnd(temp);\r\n }\r\n };\r\n }\r\n this.queue.push(temp);\r\n return temp.id as string;\r\n }\r\n\r\n private sortByOrder(a: LoadArgs, b: LoadArgs): number {\r\n return a.order > b.order ? 1 : a.order < b.order ? -1 : 0;\r\n }\r\n\r\n private loadEnd(item: LoadArgs) {\r\n if (item.onLoadEnd !== undefined) {\r\n for (let i = 0, len = this.slots.length; i < len; i += 1) {\r\n if (this.slots[i].id === item.id) {\r\n this.slots.splice(i, 1);\r\n break;\r\n }\r\n }\r\n item.onLoadEnd(item);\r\n }\r\n this.checkSlots();\r\n }\r\n\r\n private checkSlots() {\r\n while (\r\n (this.slots.length < this.maximumSlotsNumber ||\r\n this.maximumSlotsNumber === -1) &&\r\n this.queue.length\r\n ) {\r\n this.slots.push(this.queue.shift() as LoadArgsTmp);\r\n const slot: LoadArgsTmp = this.slots[\r\n this.slots.length - 1\r\n ] as LoadArgsTmp;\r\n if (slot.useXhr) {\r\n slot.xhr?.open('GET', slot.path, true);\r\n slot.xhr?.send(null);\r\n } else {\r\n if (slot.img) {\r\n slot.img.src = slot.path;\r\n }\r\n }\r\n }\r\n\r\n if (\r\n this.slots.length === 0 &&\r\n this.queue.length === 0 &&\r\n this._whenDone !== undefined\r\n ) {\r\n this._whenDone();\r\n }\r\n }\r\n\r\n /**\r\n * get Item By id for interaction with files in this.queue\r\n * @param id\r\n * @private\r\n */\r\n private getById(id: string): LoadArgs | null {\r\n for (let i = 0, len = this.queue.length; i < len; i += 1) {\r\n if (this.queue[i].id === id) {\r\n return this.queue[i];\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private getXmlHttp(): XMLHttpRequest {\r\n let xhr = null;\r\n try {\r\n xhr = new XMLHttpRequest();\r\n xhr.responseType = 'blob';\r\n } catch (e) {\r\n console.warn(e);\r\n }\r\n\r\n return xhr as any;\r\n }\r\n}\r\n","export const debounce = <T extends (...args: any[]) => any>(\r\n fn: T,\r\n ms = 300,\r\n) => {\r\n let timeoutId: ReturnType<typeof setTimeout>;\r\n return function (this: any, ...args: any[]) {\r\n clearTimeout(timeoutId);\r\n timeoutId = setTimeout(() => fn.apply(this, args), ms);\r\n };\r\n};\r\n","const KeyboardNumericCode = {\r\n Backspace: 8,\r\n Tab: 9,\r\n Numpad5: 12,\r\n NumpadEnter: 13,\r\n ShiftRight: 16,\r\n ControlRight: 17,\r\n ControlLeft: 17,\r\n AltRight: 18,\r\n Escape: 27,\r\n Space: 32,\r\n Numpad9: 33,\r\n Numpad3: 34,\r\n Numpad1: 35,\r\n Numpad7: 36,\r\n Numpad4: 37,\r\n Numpad8: 38,\r\n Numpad6: 39,\r\n Numpad2: 40,\r\n Numpad0: 45,\r\n NumpadDecimal: 46,\r\n Digit0: 48,\r\n Digit1: 49,\r\n Digit2: 50,\r\n Digit3: 51,\r\n Digit4: 52,\r\n Digit5: 53,\r\n Digit6: 54,\r\n Digit7: 55,\r\n Digit8: 56,\r\n Digit9: 57,\r\n KeyA: 65,\r\n KeyB: 66,\r\n KeyC: 67,\r\n KeyD: 68,\r\n KeyE: 69,\r\n KeyF: 70,\r\n KeyG: 71,\r\n KeyH: 72,\r\n KeyI: 73,\r\n KeyJ: 74,\r\n KeyK: 75,\r\n KeyL: 76,\r\n KeyM: 77,\r\n KeyN: 78,\r\n KeyO: 79,\r\n KeyP: 80,\r\n KeyQ: 81,\r\n KeyR: 82,\r\n KeyS: 83,\r\n KeyT: 84,\r\n KeyU: 85,\r\n KeyV: 86,\r\n KeyW: 87,\r\n KeyX: 88,\r\n KeyY: 89,\r\n KeyZ: 90,\r\n MetaLeft: 91,\r\n ContextMenu: 93,\r\n NumpadMultiply: 106,\r\n NumpadAdd: 107,\r\n NumpadSubtract: 109,\r\n NumpadDivide: 111,\r\n F1: 112,\r\n F2: 113,\r\n F3: 114,\r\n F4: 115,\r\n F5: 116,\r\n F6: 117,\r\n F7: 118,\r\n F8: 119,\r\n F9: 120,\r\n F10: 121,\r\n F11: 122,\r\n F12: 123,\r\n NumLock: 144,\r\n ScrollLock: 145,\r\n Semicolon: 186,\r\n Equal: 187,\r\n Comma: 188,\r\n Minus: 189,\r\n Period: 190,\r\n Slash: 191,\r\n Backquote: 192,\r\n BracketLeft: 219,\r\n Backslash: 220,\r\n BracketRight: 221,\r\n Quote: 222,\r\n IntlBackslash: 226,\r\n ArrowUp: 38,\r\n ArrowDown: 40,\r\n ArrowLeft: 37,\r\n ArrowRight: 39,\r\n} as const;\r\n\r\ntype IKeyName = keyof typeof KeyboardNumericCode;\r\ntype IKeyCode = (typeof KeyboardNumericCode)[IKeyName];\r\n\r\ntype InvertedKeyMapType = {\r\n [K in IKeyName as (typeof KeyboardNumericCode)[K]]: K;\r\n};\r\nconst InvertedKeyMapValues = {} as { [K in IKeyCode]: IKeyName[K] };\r\n\r\n//For use for InvertedKeyMap[32] will return 'Space' and so on\r\nconst InvertedKeyMap = InvertedKeyMapValues as InvertedKeyMapType;\r\n\r\nconst KeyboardStringCode = {} as { [K in IKeyName]: K };\r\n\r\nObject.entries(KeyboardNumericCode).forEach(\r\n // @ts-expect-error @typescript-eslint/ban-ts-comment\r\n ([key, value]: [IKeyName, IKeyCode]) => {\r\n InvertedKeyMapValues[value] = key;\r\n // @ts-expect-error @typescript-eslint/ban-ts-comment\r\n KeyboardStringCode[key] = key;\r\n },\r\n);\r\nexport type { IKeyName, IKeyCode };\r\nexport { KeyboardStringCode, InvertedKeyMap, KeyboardNumericCode };\r\n","export function serialize(obj: any): string {\r\n const str = [];\r\n\r\n for (const p in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, p)) {\r\n str.push(encodeURIComponent(p) + '=' + encodeURIComponent(obj[p]));\r\n }\r\n }\r\n\r\n return str.join('&');\r\n}\r\n","export const saveToLocalDrive = (uri: string, name: string) => {\r\n if (!uri) {\r\n return;\r\n }\r\n\r\n if ((navigator as any).msSaveBlob) {\r\n // IE10+\r\n try {\r\n return (navigator as any).msSaveBlob(uri, name);\r\n } catch (e) {\r\n console.warn(e);\r\n }\r\n } else {\r\n const link = document.createElement('a');\r\n link.target = '_blank';\r\n link.href = uri;\r\n link.download = name;\r\n\r\n document.body.appendChild(link);\r\n\r\n if (link.click) {\r\n link.click();\r\n } else {\r\n const event = document.createEvent('MouseEvents');\r\n (event as any).initMouseEvent('click', true, true, window);\r\n link.dispatchEvent(event);\r\n }\r\n\r\n document.body.removeChild(link);\r\n }\r\n};\r\n","export function sleep(time: number) {\r\n return new Promise((r) => setTimeout(r, time));\r\n}\r\n","export function trimLastSlashFromUrl(baseUrl: string) {\r\n if (!baseUrl) {\r\n return null;\r\n } else if (baseUrl[baseUrl.length - 1] === '/') {\r\n return baseUrl.substring(0, baseUrl.length - 1);\r\n }\r\n\r\n return;\r\n}\r\n","import type { Observable } from 'rxjs';\r\nimport { Subject } from 'rxjs';\r\nimport { filter, map } from 'rxjs/operators';\r\n\r\ninterface BroadcastEvent {\r\n key: any;\r\n data?: any;\r\n}\r\n\r\n/**\r\n * SingleTone Private class.\r\n * Event-Driving pattern for sending signals from component to component.\r\n */\r\nclass SignalClass {\r\n private static eventBus: Subject<BroadcastEvent>;\r\n\r\n constructor() {\r\n if (SignalClass.eventBus) {\r\n throw new Error(`Check that 'SignalClass' is not instantiated again!`);\r\n }\r\n SignalClass.eventBus = new Subject<BroadcastEvent>();\r\n }\r\n\r\n /**\r\n * It is not recommended to use this class directly.\r\n * use the sendSignal functions instead.\r\n * those wrappers are more convenient and provide a better type safety.\r\n */\r\n broadcast<K, D>(key: K, data?: D) {\r\n SignalClass.eventBus.next({ key, data });\r\n }\r\n\r\n /**\r\n * It is not recommended to use this class directly.\r\n * use the fromSignal functions instead.\r\n * those wrappers are more convenient and provide a better type safety.\r\n */\r\n on<K, D = any>(key: K): Observable<D> {\r\n return SignalClass.eventBus.asObservable().pipe(\r\n filter((event) => event.key === key),\r\n map((event) => event.data),\r\n );\r\n }\r\n}\r\n\r\nexport const Signal = new SignalClass();\r\n","import { v4 as uuidv4 } from 'uuid';\r\n\r\nexport function generateUuid() {\r\n return uuidv4();\r\n}\r\n","import { Md5 } from 'ts-md5';\r\n\r\nexport function shortHash<T>(data: T, shorten?: boolean): string;\r\nexport function shortHash(data: null | undefined, shorten?: boolean): null;\r\nexport function shortHash<T>(\r\n data: T | null | undefined,\r\n shorten = true,\r\n): string | null {\r\n if (!data) {\r\n return null;\r\n }\r\n\r\n const stringify: string = Md5.hashStr(JSON.stringify(data));\r\n\r\n if (shorten) {\r\n return parseInt('0x' + stringify.substring(0, 10), 16).toString(32);\r\n }\r\n\r\n return stringify;\r\n}\r\n","export const isDesktop = () => {\r\n // 1) Try the newer userAgentData API if available\r\n const uaData = (navigator as any).userAgentData;\r\n if (uaData && typeof uaData.mobile === 'boolean') {\r\n return !uaData.mobile;\r\n }\r\n\r\n // 2) Fallback to a broader UA regex\r\n const mobileRegex =\r\n /Mobi|Android|iPhone|iPad|iPod|Opera Mini|IEMobile|Windows Phone|webOS|BlackBerry/i;\r\n return !mobileRegex.test(navigator.userAgent);\r\n};\r\n","import { fromEvent, map, startWith } from 'rxjs';\r\n\r\nexport const media = (query: string) => {\r\n const mediaQuery = window.matchMedia(query);\r\n return fromEvent<MediaQueryList>(mediaQuery, 'change').pipe(\r\n startWith(mediaQuery),\r\n map((list: MediaQueryList) => list.matches),\r\n );\r\n};\r\n","export const ImageOutput = {\r\n CANVAS: 'canvas',\r\n PNG: 'image/png',\r\n WEBP: 'image/webp',\r\n JPG: 'image/jpeg',\r\n} as const;\r\n\r\nexport type ImageOutputValues = (typeof ImageOutput)[keyof typeof ImageOutput];\r\n","/**\r\n * Calculates the index at which the `value` should be inserted into the `array` to maintain its\r\n * sorted order. This function performs a binary search with a complexity of O(log n), making it\r\n * efficient for large datasets. It assumes that the input array is sorted in ascending order and\r\n * contains comparable elements.\r\n *\r\n * Note: The function is designed to handle arrays with lengths up to a maximum of `HALF_MAX_ARRAY_LENGTH`\r\n * to ensure the search operation remains within JavaScript's maximum array index limit.\r\n *\r\n * @param {any[]} array The sorted array into which the value should be inserted. The array elements\r\n * should be comparable with the `value` using less-than and greater-than operations.\r\n * @param {number} value The value to insert into the array. This function assumes that `array` is sorted\r\n * in ascending order and will find the correct position for `value` accordingly.\r\n * @returns {number} The index at which the `value` should be inserted into `array` to maintain its sorted order.\r\n * If the `array` is empty or if `value` is less than or equal to all elements in `array`,\r\n * returns 0. If `value` is greater than all elements in `array`, returns the length of `array`.\r\n * @example\r\n * // returns 2\r\n * baseSortedIndex([1, 3, 4], 3);\r\n *\r\n * @example\r\n * // returns 1\r\n * baseSortedIndex([1, 2, 3], 2);\r\n */\r\nexport function baseSortedIndex(array: number[], value: number): number {\r\n const MAX_ARRAY_LENGTH = 4294967295;\r\n const HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\r\n let low = 0;\r\n let high = array?.length || low;\r\n\r\n if (high <= HALF_MAX_ARRAY_LENGTH) {\r\n while (low < high) {\r\n const mid = (low + high) >>> 1;\r\n const computed = array[mid];\r\n if (computed !== null && computed < value) {\r\n low = mid + 1;\r\n } else {\r\n high = mid;\r\n }\r\n }\r\n }\r\n return high;\r\n}\r\n","/**\r\n * Calculates the median of an array of numbers.\r\n *\r\n * The median is the middle value of a sorted list of numbers. If the list has an even number\r\n * of elements, the median is the average of the two middle numbers.\r\n *\r\n * @param numbers - An array of numbers for which the median will be calculated.\r\n * @returns The median value as a number, or `null` if the array is empty.\r\n *\r\n * @example\r\n * ```typescript\r\n * const numbers = [3, 1, 4, 2];\r\n * const median = calculateMedian(numbers);\r\n * console.log(median); // Output: 2.5\r\n * ```\r\n */\r\nexport function calculateMedian(numbers: number[]): number {\r\n if (numbers.length === 0) return 0;\r\n\r\n // Sort the array in ascending order\r\n const sorted = [...numbers].sort((a, b) => a - b);\r\n\r\n const length = sorted.length;\r\n const middle = Math.floor(length / 2);\r\n\r\n // If the length is even, return the average of the two middle numbers\r\n if (length % 2 === 0) {\r\n return (sorted[middle - 1] + sorted[middle]) / 2;\r\n }\r\n\r\n // If the length is odd, return the middle number\r\n return sorted[middle];\r\n}\r\n","/**\r\n * Clamps value between min and max;\r\n * @param min minValue\r\n * @param max maxValue\r\n * @param value inputValue\r\n * @returns number\r\n */\r\n\r\nexport function clampf(min: number, max: number, value: number): number {\r\n if (min > max) {\r\n return min;\r\n }\r\n return Math.min(max, Math.max(min, value));\r\n}\r\n","import { clampf } from './clampf';\r\n\r\n/**\r\n * Computes a circular index within a given range.\r\n *\r\n * This function ensures that the index wraps around within the range of 0 to `totalItems - 1`.\r\n * It uses the `clampf` function to clamp the result within the valid range.\r\n *\r\n * @param index - The current index to be wrapped.\r\n * @param totalItems - The total number of items in the range.\r\n * @returns The wrapped index within the range of 0 to `totalItems - 1`.\r\n *\r\n * @example\r\n * ```typescript\r\n * import { circularIndex } from './circularIndex';\r\n *\r\n * // Example 1: Basic usage\r\n * const index1 = circularIndex(5, 5);\r\n * console.log(index1); // Output: 0\r\n *\r\n * // Example 2: Index greater than totalItems\r\n * const index2 = circularIndex(6, 5);\r\n * console.log(index2); // Output: 1\r\n *\r\n * // Example 3: Negative index\r\n * const index3 = circularIndex(-2, 5);\r\n * console.log(index3); // Output: 3\r\n *\r\n * // Example 4: Large Negative index\r\n * const index4 = circularIndex(-6, 5);\r\n * console.log(index4); // Output: 4\r\n *\r\n * // Example 5: Index equal to totalItems\r\n * const index5 = circularIndex(1, 1);\r\n * console.log(index5); // Output: 0\r\n */\r\nexport function circularIndex(index: number, totalItems: number): number {\r\n return clampf(0, totalItems - 1, (totalItems * 2 + index) % totalItems);\r\n}\r\n","export function degreesToRadians(degrees: number): number {\r\n return degrees * (Math.PI / 180);\r\n}\r\n\r\nexport function radiansToDegrees(radians: number): number {\r\n return radians * (180 / Math.PI);\r\n}\r\n","/**\r\n * A small epsilon value used for floating-point comparisons.\r\n *\r\n * @remarks\r\n * The value of `EPSILON` is `0.01`. This can be overridden in the comparison functions if needed.\r\n */\r\nconst EPSILON = 0.01;\r\n\r\n/**\r\n * Checks if floating-point number `A` is less than `B` considering a small margin of error.\r\n *\r\n * @param A - The first floating-point number to compare.\r\n * @param B - The second floating-point number to compare.\r\n * @param Epsilon - Optional custom epsilon value for comparison. Defaults to `EPSILON` if not provided.\r\n * @returns `true` if `A` is less than `B` considering the epsilon margin, otherwise `false`.\r\n *\r\n * @example\r\n * ```\r\n * const result = fpIsALessThanB(0.0034, 0.0066); // true\r\n * ```\r\n */\r\nexport function fpIsALessThanB(\r\n A: number,\r\n B: number,\r\n Epsilon?: number,\r\n): boolean {\r\n Epsilon = Epsilon || EPSILON;\r\n return A - B < Epsilon && Math.abs(A - B) > Epsilon;\r\n}\r\n\r\n/**\r\n * Checks if floating-point number `A` is greater than `B` considering a small margin of error.\r\n *\r\n * @param A - The first floating-point number to compare.\r\n * @param B - The second floating-point number to compare.\r\n * @param Epsilon - Optional custom epsilon value for comparison. Defaults to `EPSILON` if not provided.\r\n * @returns `true` if `A` is greater than `B` considering the epsilon margin, otherwise `false`.\r\n *\r\n * @example\r\n * ```\r\n * const result = fpIsAGreaterThanB(0.0066, 0.0034); // true\r\n * ```\r\n */\r\nexport function fpIsAGreaterThanB(\r\n A: number,\r\n B: number,\r\n Epsilon?: number,\r\n): boolean {\r\n Epsilon = Epsilon || EPSILON;\r\n return A - B > Epsilon && Math.abs(A - B) > Epsilon;\r\n}\r\n\r\n/**\r\n * Checks if floating-point number `A` is approximately the same as `B` considering a small margin of error.\r\n *\r\n * @param A - The first floating-point number to compare.\r\n * @param B - The second floating-point number to compare.\r\n * @param Epsilon - Optional custom epsilon value for comparison. Defaults to `EPSILON` if not provided.\r\n * @returns `true` if `A` is approximately equal to `B` considering the epsilon margin, otherwise `false`.\r\n *\r\n * @example\r\n * ```\r\n * const result = fpIsASameAsB(0.005, 0.0051); // true\r\n * ```\r\n */\r\nexport function fpIsASameAsB(A: number, B: number, Epsilon?: number): boolean {\r\n Epsilon = Epsilon || EPSILON;\r\n return Math.abs(A - B) < Epsilon;\r\n}\r\n","/**\r\n * Performs an inverse linear interpolation.\r\n *\r\n * Given a range defined by `min` and `max`, this function calculates the\r\n * interpolation factor (or percentage) of `value` within that range. Optionally,\r\n * it can clamp the result to be between 0 and 1 to ensure the return value is\r\n * within the range of a standard lerp operation.\r\n *\r\n * @param {number} min - The minimum value of the interpolation range.\r\n * @param {number} max - The maximum value of the interpolation range.\r\n * @param {number} value - The value to interpolate.\r\n * @param {boolean} [clampToNormal=false] - Whether to clamp the result between 0 and 1.\r\n * @returns {number} The interpolation factor of `value` between `min` and `max`.\r\n * If `clampToNormal` is true, the result is clamped between 0 and 1.\r\n * If the difference between `min` and `max` is 0, returns 1 to avoid division by zero.\r\n */\r\nexport function inverseLerp(\r\n min: number,\r\n max: number,\r\n value: number,\r\n clampToNormal = false,\r\n): number {\r\n if (clampToNormal) {\r\n value = Math.min(max, value);\r\n value = Math.max(min, value);\r\n }\r\n const difference = max - min;\r\n\r\n // Avoid JS division error\r\n if (difference === 0) {\r\n return 1;\r\n }\r\n const result = (value - min) / difference;\r\n if (clampToNormal) {\r\n return Math.min(1, Math.max(0, result));\r\n }\r\n return result;\r\n}\r\n","import { clampf } from './clampf';\r\n\r\n/**\r\n * @param min minimums\r\n * @param max maximums\r\n * @param value current float value in 0-1 range\r\n * @returns clamped value\r\n */\r\nexport function lerp(min: number, max: number, value: number): number {\r\n value = clampf(0, 1, value);\r\n return value * (max - min) + min;\r\n}\r\n","/**\r\n * A Mutex class to handle mutual exclusion locks, ensuring that only one asynchronous task can execute a critical section at a time.\r\n *\r\n * @example\r\n * const mutex = new Mutex();\r\n *\r\n * async function task(name: string, duration: number) {\r\n * console.log(`${name} waiting to acquire mutex`);\r\n * const release = await mutex.acquire();\r\n * console.log(`${name} acquired mutex`);\r\n * await new Promise(resolve => setTimeout(resolve, duration));\r\n * console.log(`${name} releasing mutex`);\r\n * release();\r\n * }\r\n *\r\n * task('Task 1', 1000);\r\n * task('Task 2', 2000);\r\n * task('Task 3', 1500);\r\n * task('Task 4', 500);\r\n *\r\n * Outputs\r\n * [LOG]: \"Task 1 waiting to acquire mutex\"\r\n * [LOG]: \"Task 2 waiting to acquire mutex\"\r\n * [LOG]: \"Task 3 waiting to acquire mutex\"\r\n * [LOG]: \"Task 4 waiting to acquire mutex\"\r\n * [LOG]: \"Task 1 acquired mutex\"\r\n * [LOG]: \"Task 1 releasing mutex\"\r\n * [LOG]: \"Task 2 acquired mutex\"\r\n * [LOG]: \"Task 2 releasing mutex\"\r\n * [LOG]: \"Task 3 acquired mutex\"\r\n * [LOG]: \"Task 3 releasing mutex\"\r\n * [LOG]: \"Task 4 acquired mutex\"\r\n * [LOG]: \"Task 4 releasing mutex\"\r\n */\r\nexport class Mutex {\r\n private mutex = Promise.resolve();\r\n\r\n /**\r\n * Acquires the mutex, returning a promise that resolves when the mutex is acquired.\r\n * The returned promise provides a release function that should be called to release the mutex.\r\n * @returns A promise that resolves with a release function.\r\n */\r\n async acquire(): Promise<() => void> {\r\n let release: () => void;\r\n const previous = this.mutex;\r\n this.mutex = new Promise<void>((resolve) => (release = resolve));\r\n await previous;\r\n return release!;\r\n }\r\n}\r\n","/**\r\n * A Semaphore controls access to a resource that can handle a limited number of concurrent operations.\r\n *\r\n * @example\r\n * const semaphore = new Semaphore(2);\r\n *\r\n * async function task(name: string, duration: number) {\r\n * console.log(`${name} waiting to acquire semaphore`);\r\n * await semaphore.acquire();\r\n * console.log(`${name} acquired semaphore`);\r\n * await new Promise(resolve => setTimeout(resolve, duration));\r\n * console.log(`${name} releasing semaphore`);\r\n * semaphore.release();\r\n * }\r\n *\r\n * task('Task 1', 1000);\r\n * task('Task 2', 2000);\r\n * task('Task 3', 1500);\r\n * task('Task 4', 500);\r\n *\r\n * Outputs\r\n * [LOG]: \"Task 1 waiting to acquire semaphore\"\r\n * [LOG]: \"Task 2 waiting to acquire semaphore\"\r\n * [LOG]: \"Task 3 waiting to acquire semaphore\"\r\n * [LOG]: \"Task 4 waiting to acquire semaphore\"\r\n * [LOG]: \"Task 1 acquired semaphore\"\r\n * [LOG]: \"Task 2 acquired semaphore\"\r\n * [LOG]: \"Task 1 releasing semaphore\"\r\n * [LOG]: \"Task 3 acquired semaphore\"\r\n * [LOG]: \"Task 2 releasing semaphore\"\r\n * [LOG]: \"Task 4 acquired semaphore\"\r\n * [LOG]: \"Task 4 releasing semaphore\"\r\n * [LOG]: \"Task 3 releasing semaphore\"\r\n */\r\nexport class Semaphore {\r\n private tasks: (() => void)[] = [];\r\n private currentCount = 0;\r\n\r\n constructor(private readonly maxConcurrency: number) {}\r\n\r\n public acquire(): Promise<void> {\r\n return new Promise((resolve) => {\r\n if (this.currentCount < this.maxConcurrency) {\r\n this.currentCount++;\r\n resolve();\r\n } else {\r\n this.tasks.push(resolve);\r\n }\r\n });\r\n }\r\n\r\n public release(): void {\r\n if (this.tasks.length > 0) {\r\n const nextTask = this.tasks.shift();\r\n if (nextTask) {\r\n nextTask();\r\n }\r\n } else if (this.currentCount > 0) {\r\n this.currentCount--;\r\n }\r\n }\r\n}\r\n","import type { Observable } from 'rxjs';\r\nimport { finalize, from, switchMap } from 'rxjs';\r\nimport { Logger } from '../dev';\r\nimport { Mutex } from './Mutex';\r\n\r\nexport class TaskRunner {\r\n private mutex = new Mutex();\r\n\r\n runTask(name: string, task: () => Observable<string | null>) {\r\n // Log that the task is waiting to acquire the mutex\r\n Logger.log(`${name} waiting to acquire mutex`);\r\n\r\n return from(this.mutex.acquire()).pipe(\r\n switchMap((release) => {\r\n // Log that the mutex has been acquired\r\n Logger.log(`${name} acquired mutex`);\r\n return task().pipe(\r\n finalize(() => {\r\n Logger.log(`${name} releasing mutex`);\r\n release();\r\n }),\r\n );\r\n }),\r\n );\r\n }\r\n}\r\n","import type { SchedulerLike, Subscriber, Subscription } from 'rxjs';\r\nimport { asyncScheduler, Observable, timer } from 'rxjs';\r\n\r\n/**\r\n * Emits the most recent value emitted by the source Observable after a\r\n * specified time span has passed without another source emission.\r\n *\r\n * This is a combination of `debounceTime` and `auditTime` operators.\r\n *\r\n * The leading value is emitted immediately, and trailing values are debounced.\r\n *\r\n * @param dueTime The time to wait before emitting the last value.\r\n * @param scheduler The scheduler to use for the timeout.\r\n * @returns A function that returns an Observable that mirrors the source Observable, but applies the specified debouncing.\r\n */\r\nexport function leadingTrailingDebounceTime<T>(\r\n dueTime: number,\r\n scheduler: SchedulerLike = asyncScheduler,\r\n): (source: Observable<T>) => Observable<T> {\r\n return (source: Observable<T>) =>\r\n new Observable<T>((subscriber: Subscriber<T>) => {\r\n let hasValue = false;\r\n let lastValue: T | null = null;\r\n let timerSubscription: Subscription | null = null;\r\n let leading = true; // Controls whether we emit immediately.\r\n\r\n const clearTimer = () => {\r\n if (timerSubscription) {\r\n timerSubscription.unsubscribe();\r\n timerSubscription = null;\r\n }\r\n };\r\n\r\n const resetValues = () => {\r\n hasValue = false;\r\n lastValue = null;\r\n leading = true; // Reset so the next new value is immediate.\r\n };\r\n\r\n const emitLastValue = () => {\r\n if (hasValue && lastValue !== null) {\r\n subscriber.next(lastValue);\r\n resetValues();\r\n }\r\n };\r\n\r\n const sourceSubscription = source.subscribe({\r\n next: (value) => {\r\n // If we are \"leading\", emit immediately and switch leading off\r\n if (leading) {\r\n subscriber.next(value);\r\n leading = false;\r\n timerSubscription = timer(dueTime, scheduler).subscribe(() => {\r\n resetValues();\r\n clearTimer();\r\n });\r\n return;\r\n }\r\n\r\n // Otherwise, save the value and start (or restart) timer\r\n hasValue = true;\r\n lastValue = value;\r\n clearTimer();\r\n timerSubscription = timer(dueTime, scheduler).subscribe(() => {\r\n emitLastValue();\r\n });\r\n },\r\n error: (err: unknown) => {\r\n clearTimer();\r\n subscriber.error(err);\r\n },\r\n complete: () => {\r\n // If there is a pending emission, emit it before completing\r\n clearTimer();\r\n emitLastValue();\r\n subscriber.complete();\r\n },\r\n });\r\n\r\n // Cleanup logic\r\n return () => {\r\n clearTimer();\r\n sourceSubscription.unsubscribe();\r\n };\r\n });\r\n}\r\n","import type { Observable } from 'rxjs';\r\nimport { animationFrameScheduler, interval } from 'rxjs';\r\nimport { distinctUntilChanged, map } from 'rxjs/operators';\r\nimport { clampf, lerp } from '../math';\r\n\r\n/**\r\n * Creates an observable that emits values transitioning smoothly from the start value to the end value over a specified duration.\r\n * The transition is performed using linear interpolation (lerp) and clamped to the range [0, 1].\r\n *\r\n * @param {number} start - The starting value of the transition.\r\n * @param {number} end - The ending value of the transition.\r\n * @param {number} duration - The duration of the transition in milliseconds.\r\n * @returns {Observable<number>} An observable that emits the interpolated values from start to end over the specified duration.\r\n */\r\nexport const smoothTransition = (\r\n start: number,\r\n end: number,\r\n duration: number,\r\n): Observable<number> => {\r\n const startTime = animationFrameScheduler.now();\r\n return interval(0, animationFrameScheduler).pipe(\r\n map(() => {\r\n const elapsed = (animationFrameScheduler.now() - startTime) / duration;\r\n return clampf(0, 1, elapsed);\r\n }),\r\n distinctUntilChanged(),\r\n map((fraction) => lerp(start, end, fraction)),\r\n );\r\n};\r\n","import { tap } from 'rxjs/operators';\r\nimport type { Observable } from 'rxjs';\r\nimport { Logger } from '../dev';\r\nimport { COLOR_CODES } from '../constants';\r\n\r\nexport const tapLog =\r\n <T>(text: string, ...args: any): ((source: Observable<T>) => Observable<T>) =>\r\n (source: Observable<T>) =>\r\n source.pipe(\r\n tap((data) => {\r\n Logger.colored(...COLOR_CODES.TAP_LOG, text, data, ...args);\r\n }),\r\n );\r\n","/*\r\n * Copyright (c) 2025.\r\n * Sergii Karanda - All Rights Reserved\r\n */\r\n\r\nimport { DOCUMENT, inject, InjectionToken } from '@angular/core';\r\n\r\nexport const WINDOW = new InjectionToken<Window>(\r\n 'An abstraction over global window object',\r\n {\r\n factory: () => {\r\n const { defaultView } = inject(DOCUMENT);\r\n\r\n if (!defaultView) {\r\n throw new Error('Window is not available');\r\n }\r\n\r\n return defaultView;\r\n },\r\n },\r\n);\r\n\r\nexport const DOCUMENT_ROOT = new InjectionToken<string>(\r\n 'An abstraction over window.source3d_app_base string',\r\n {\r\n factory: () => (inject(WINDOW) as any)['source3d_app_base'] || '',\r\n },\r\n);\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["uuidv4","map"],"mappings":"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"}
1
+ {"version":3,"file":"3dsource-utils.mjs","sources":["../../../../projects/3dsource/utils/src/lib/color/CMYKtoRGB.ts","../../../../projects/3dsource/utils/src/lib/color/HEXtoRGB.ts","../../../../projects/3dsource/utils/src/lib/color/rgb.ts","../../../../projects/3dsource/utils/src/lib/color/HSVtoRGB.ts","../../../../projects/3dsource/utils/src/lib/color/hsv.ts","../../../../projects/3dsource/utils/src/lib/color/toRGB.ts","../../../../projects/3dsource/utils/src/lib/color/max.ts","../../../../projects/3dsource/utils/src/lib/color/min.ts","../../../../projects/3dsource/utils/src/lib/color/overlay.ts","../../../../projects/3dsource/utils/src/lib/color/RGBtoCMYK.ts","../../../../projects/3dsource/utils/src/lib/color/RGBtoHEX.ts","../../../../projects/3dsource/utils/src/lib/color/RGBtoHSV.ts","../../../../projects/3dsource/utils/src/lib/color/sub.ts","../../../../projects/3dsource/utils/src/lib/color/subtract.ts","../../../../projects/3dsource/utils/src/lib/color/sum.ts","../../../../projects/3dsource/utils/src/lib/color/toRGBA.ts","../../../../projects/3dsource/utils/src/lib/constants/color-codes.constant.ts","../../../../projects/3dsource/utils/src/lib/constants/document-root.ts","../../../../projects/3dsource/utils/src/lib/csv/CSV2Array.ts","../../../../projects/3dsource/utils/src/lib/csv/CSV2Records.ts","../../../../projects/3dsource/utils/src/lib/csv/ObjectToCSV.ts","../../../../projects/3dsource/utils/src/lib/dev/dev3d.ts","../../../../projects/3dsource/utils/src/lib/strings/pad.ts","../../../../projects/3dsource/utils/src/lib/dev/timeToString.ts","../../../../projects/3dsource/utils/src/lib/predicates/operators.ts","../../../../projects/3dsource/utils/src/lib/predicates/textForSearch.ts","../../../../projects/3dsource/utils/src/lib/predicates/where.ts","../../../../projects/3dsource/utils/src/lib/dev/logger.ts","../../../../projects/3dsource/utils/src/lib/filenaming/cleanupFileName.ts","../../../../projects/3dsource/utils/src/lib/filenaming/makePath.ts","../../../../projects/3dsource/utils/src/lib/filenaming/normalizePath.ts","../../../../projects/3dsource/utils/src/lib/geom/expandOverRectangle.ts","../../../../projects/3dsource/utils/src/lib/geom/fitIntoRectangle.ts","../../../../projects/3dsource/utils/src/lib/image/getCanvasCached.ts","../../../../projects/3dsource/utils/src/lib/image/getSnapshot.ts","../../../../projects/3dsource/utils/src/lib/image/loadImage.ts","../../../../projects/3dsource/utils/src/lib/image/SaveImage.ts","../../../../projects/3dsource/utils/src/lib/helpers/BatchLoader.ts","../../../../projects/3dsource/utils/src/lib/helpers/debounce.ts","../../../../projects/3dsource/utils/src/lib/helpers/KeyboardNumericCode.ts","../../../../projects/3dsource/utils/src/lib/helpers/serialize.ts","../../../../projects/3dsource/utils/src/lib/helpers/save-to-local-drive.ts","../../../../projects/3dsource/utils/src/lib/helpers/sleep.ts","../../../../projects/3dsource/utils/src/lib/helpers/trimLastSlashFromUrl.ts","../../../../projects/3dsource/utils/src/lib/helpers/signal.ts","../../../../projects/3dsource/utils/src/lib/helpers/generate-uuid.ts","../../../../projects/3dsource/utils/src/lib/helpers/short-hash.ts","../../../../projects/3dsource/utils/src/lib/helpers/is-desktop.ts","../../../../projects/3dsource/utils/src/lib/helpers/media.ts","../../../../projects/3dsource/utils/src/lib/interfaces/image-output.ts","../../../../projects/3dsource/utils/src/lib/math/baseSortedIndex.ts","../../../../projects/3dsource/utils/src/lib/math/calculateMedian.ts","../../../../projects/3dsource/utils/src/lib/math/clampf.ts","../../../../projects/3dsource/utils/src/lib/math/circularIndex.ts","../../../../projects/3dsource/utils/src/lib/math/degrees.ts","../../../../projects/3dsource/utils/src/lib/math/floatCompare.ts","../../../../projects/3dsource/utils/src/lib/math/inverseLerp.ts","../../../../projects/3dsource/utils/src/lib/math/lerp.ts","../../../../projects/3dsource/utils/src/lib/mutex/Mutex.ts","../../../../projects/3dsource/utils/src/lib/mutex/Semaphore.ts","../../../../projects/3dsource/utils/src/lib/mutex/TaskRunner.ts","../../../../projects/3dsource/utils/src/lib/rxjs/leadingTrailingDebounceTime.ts","../../../../projects/3dsource/utils/src/lib/rxjs/smoothTransition.ts","../../../../projects/3dsource/utils/src/lib/rxjs/tapLog.ts","../../../../projects/3dsource/utils/src/3dsource-utils.ts"],"sourcesContent":["/**\r\n * RGB from each of the CMYK values to determine a return as an any[].\r\n * CMYK values are as follows.\r\n * C - a number between 0 and 255 representing cyan\r\n * M - number between 0 and 255 representing magenta\r\n * Y - number between 0 and 255 representing yellow\r\n * K - number between 0 and 255 representing black\r\n *\r\n **/\r\nexport function CMYKtoRGB(c: number, m: number, y: number, k: number): any[] {\r\n c = 255 - c;\r\n m = 255 - m;\r\n y = 255 - y;\r\n k = 255 - k;\r\n return [\r\n ((255 - c) * (255 - k)) / 255,\r\n ((255 - m) * (255 - k)) / 255,\r\n ((255 - y) * (255 - k)) / 255,\r\n ];\r\n}\r\n","export function HEXtoRGB(color: number | string) {\r\n if (typeof color === 'string') {\r\n color = parseInt(color.replace('#', ''), 16);\r\n }\r\n const r = (color >> 16) & 255;\r\n const g = (color >> 8) & 255;\r\n const b = color & 255;\r\n return { r: r, g: g, b: b };\r\n}\r\n","/**\r\n * Values calculated from each RGB * RGB color value.\r\n * @ Param r the red (R) indicating the number (0-255)\r\n * @ Param g green (G) indicates the number (0-255)\r\n * @ Param b blue (B) shows the number (0-255)\r\n * @ Return obtained from the RGB color value for each indicating the number\r\n **/\r\nexport function rgb(r: number, g: number, b: number): number {\r\n return (r << 16) | (g << 8) | b;\r\n}\r\n","/* eslint-disable prefer-const */\r\n/**\r\n * HSV from each of the RGB values to determine a return as an any[].\r\n * RGB values are as follows.\r\n * R - a number from 0 to 255\r\n * G - a number from 0 to 255\r\n * B - a number from 0 to 255\r\n *\r\n * HSV values are as follows.\r\n * H - a number between 360-0\r\n * S - number between 0 and 1.0\r\n * V - number between 0 and 1.0\r\n *\r\n * H is replaced with equivalent numbers in the range of the 360-0 that is out of range.\r\n * Cannot compute, including alpha.\r\n *\r\n * @ Param h hue (Hue) number that indicates (to 360-0)\r\n * @ Param s the saturation (Saturation) shows the number (0.0 to 1.0)\r\n * @ Param v lightness (Value) indicates the number (0.0 to 1.0)\r\n * @ Return RGB values into an any[] of [R, G, B]\r\n **/\r\n\r\nexport function HSVtoRGB(h: number, s: number, v: number): number[] {\r\n let r = 0,\r\n g = 0,\r\n b = 0;\r\n let i, x, y, z;\r\n if (s < 0) {\r\n s = 0;\r\n }\r\n if (s > 1) {\r\n s = 1;\r\n }\r\n if (v < 0) {\r\n v = 0;\r\n }\r\n if (v > 1) {\r\n v = 1;\r\n }\r\n h = h % 360;\r\n if (h < 0) {\r\n h += 360;\r\n }\r\n h /= 60;\r\n i = h >> 0;\r\n x = v * (1 - s);\r\n y = v * (1 - s * (h - i));\r\n z = v * (1 - s * (1 - h + i));\r\n switch (i) {\r\n case 0:\r\n r = v;\r\n g = z;\r\n b = x;\r\n break;\r\n case 1:\r\n r = y;\r\n g = v;\r\n b = x;\r\n break;\r\n case 2:\r\n r = x;\r\n g = v;\r\n b = z;\r\n break;\r\n case 3:\r\n r = x;\r\n g = y;\r\n b = v;\r\n break;\r\n case 4:\r\n r = z;\r\n g = x;\r\n b = v;\r\n break;\r\n case 5:\r\n r = v;\r\n g = x;\r\n b = y;\r\n break;\r\n }\r\n return [(r * 255) >> 0, (g * 255) >> 0, (b * 255) >> 0];\r\n}\r\n","/* eslint-disable prefer-spread */\r\n/**\r\n * HSV calculated from the numbers of each RGB color value.\r\n * @ Param h hue (Hue) number that indicates (to 360-0)\r\n * @ Param s the saturation (Saturation) shows the number (0.0 to 1.0)\r\n * @ Param v lightness (Value) indicates the number (0.0 to 1.0)\r\n * @ Return obtained from the RGB color value for each indicating the number\r\n **/\r\nimport { rgb } from './rgb';\r\nimport { HSVtoRGB } from './HSVtoRGB';\r\n\r\nexport function hsv(h: number, s: number, v: number): number {\r\n return rgb.apply(null, HSVtoRGB(h, s, v) as any);\r\n}\r\n","/**\r\n * RGB figures show (0x000000 0xFFFFFF up from) the\r\n * R, G, B returns an any[] divided into a number from 0 to 255, respectively.\r\n *\r\n * @ Param rgb numbers show (0x000000 0xFFFFFF up from)\r\n * @ Return any[] indicates the value of each color [R, G, B]\r\n **/\r\nexport function toRGB(rgb: number): number[] {\r\n const r: number = (rgb >> 16) & 0xff;\r\n const g: number = (rgb >> 8) & 0xff;\r\n const b: number = rgb & 0xff;\r\n\r\n return [r, g, b];\r\n}\r\n","/**\r\n * Comparison (light).\r\n * 2 RGB single number that indicates (0x000000 0xFFFFFF up from) to compare,\r\n * RGB values combined with higher returns to their numbers.\r\n * @ Param col1 RGB numbers show (0x000000 0xFFFFFF up from)\r\n * @ Param col2 RGB numbers show (0x000000 0xFFFFFF up from)\r\n * @ Return comparison (light) value\r\n **/\r\nimport { toRGB } from './toRGB';\r\n\r\nexport function max(col1: number, col2: number): number {\r\n const c1: any[] = toRGB(col1);\r\n const c2: any[] = toRGB(col2);\r\n const r: number = Math.max(c1[0], c2[0]);\r\n const g: number = Math.max(c1[1], c2[1]);\r\n const b: number = Math.max(c1[2], c2[2]);\r\n return (r << 16) | (g << 8) | b;\r\n}\r\n","/**\r\n * Comparison (dark).\r\n * 2 RGB single numbers that indicate (0x000000 0xFFFFFF up from) to compare,\r\n * RGB lower combined returns a numeric value for each number.\r\n * @ Param col1 RGB numbers show (0x000000 0xFFFFFF up from)\r\n * @ Param col2 RGB numbers show (0x000000 0xFFFFFF up from)\r\n * @ Return comparison (dark) values\r\n **/\r\nimport { toRGB } from './toRGB';\r\n\r\nexport function min(col1: number, col2: number): number {\r\n const c1: any[] = toRGB(col1);\r\n const c2: any[] = toRGB(col2);\r\n const r: number = Math.min(c1[0], c2[0]);\r\n const g: number = Math.min(c1[1], c2[1]);\r\n const b: number = Math.min(c1[2], c2[2]);\r\n return (r << 16) | (g << 8) | b;\r\n}\r\n","/**\r\n *\r\n There are two part of formula:\r\n First part: If Lower Layer Value > 127.5, then do the following -\r\n Value Unit = (255-Lower Layer Value)/127.5\r\n Min Value = Lower Layer Value - (255-Lower Layer Value)\r\n Overlay = (Upper Layer Value * Value Unit) + Min Value\r\n Second part: If Lower Layer Value < 127.5, then do the following -\r\n Value Unit=Lower Layer Value/127.5\r\n\r\n Overlay = Upper Layer Value * Value Unit\r\n * @param {number} col1\r\n * @param {number} col2\r\n * @return {number}\r\n */\r\nimport { toRGB } from './toRGB';\r\n\r\nexport function overlay(col1: number, col2: number): number {\r\n const c1: any[] = toRGB(col1);\r\n const c2: any[] = toRGB(col2);\r\n const r: number = Math.max(c1[0], c2[0]);\r\n const g: number = Math.max(c1[1], c2[1]);\r\n const b: number = Math.max(c1[2], c2[2]);\r\n return (r << 16) | (g << 8) | b;\r\n}\r\n","/**\r\n * RGB from the respective figures, HSV sequences in terms of returns.\r\n * RGB values are as follows.\r\n * R - a number from 0 to 255\r\n * G - a number from 0 to 255\r\n * B - a number from 0 to 255\r\n *\r\n * CMYK values are as follows.\r\n * C - a number between 0 and 255 representing cyan\r\n * M - number between 0 and 255 representing magenta\r\n * Y - number between 0 and 255 representing yellow\r\n * K - number between 0 and 255 representing black\r\n *\r\n * Cannot compute, including alpha.\r\n * @ Param r the red (R) indicating the number (0x00 to 0xFF to)\r\n * @ Param g green (G) indicates the number (0x00 to 0xFF to)\r\n * @ Param b blue (B) shows the number (0x00 to 0xFF to)\r\n * @ Return CMYK values into an any[] of [H, S, V]\r\n **/\r\nexport function RGBtoCMYK(r: number, g: number, b: number): any[] {\r\n let c = 0;\r\n let m = 0;\r\n let y = 0;\r\n let k = 0;\r\n\r\n c = 255 - r;\r\n m = 255 - g;\r\n y = 255 - b;\r\n k = 255;\r\n\r\n if (c < k) {\r\n k = c;\r\n }\r\n if (m < k) {\r\n k = m;\r\n }\r\n if (y < k) {\r\n k = y;\r\n }\r\n if (k === 255) {\r\n c = 0;\r\n m = 0;\r\n y = 0;\r\n } else {\r\n c = Math.round((255 * (c - k)) / (255 - k));\r\n m = Math.round((255 * (m - k)) / (255 - k));\r\n y = Math.round((255 * (y - k)) / (255 - k));\r\n }\r\n return [c, m, y, k];\r\n}\r\n","export function RGBtoHEX(r: number, g: number, b: number): string {\r\n let redColor = r.toString(16);\r\n let greenColor = g.toString(16);\r\n let blackColor = b.toString(16);\r\n\r\n if (redColor.length === 1) {\r\n redColor = '0' + redColor;\r\n }\r\n if (greenColor.length === 1) {\r\n greenColor = '0' + greenColor;\r\n }\r\n if (blackColor.length === 1) {\r\n blackColor = '0' + blackColor;\r\n }\r\n\r\n return (redColor + greenColor + blackColor).toUpperCase();\r\n}\r\n","/**\r\n * RGB from the respective figures, HSV sequences in terms of returns.\r\n * RGB values are as follows.\r\n * R - a number from 0 to 255\r\n * G - a number from 0 to 255\r\n * B - a number from 0 to 255\r\n *\r\n * HSV values are as follows.\r\n * H - a number between 360-0\r\n * S - number between 0 and 1.0\r\n * V - number between 0 and 1.0\r\n *\r\n * Cannot compute, including alpha.\r\n * @ Param r the red (R) indicating the number (0x00 to 0xFF to)\r\n * @ Param g green (G) indicates the number (0x00 to 0xFF to)\r\n * @ Param b blue (B) shows the number (0x00 to 0xFF to)\r\n * @ Return HSV values into an any[] of [H, S, V]\r\n **/\r\nexport function RGBtoHSV(r: number, g: number, b: number): number[] {\r\n r /= 255;\r\n g /= 255;\r\n b /= 255;\r\n let h = 0,\r\n s = 0,\r\n v = 0;\r\n let x: number, y: number;\r\n if (r >= g) x = r;\r\n else x = g;\r\n if (b > x) x = b;\r\n if (r <= g) y = r;\r\n else y = g;\r\n if (b < y) y = b;\r\n v = x;\r\n const c: number = x - y;\r\n if (x === 0) s = 0;\r\n else s = c / x;\r\n if (s !== 0) {\r\n if (r === x) {\r\n h = (g - b) / c;\r\n } else {\r\n if (g === x) {\r\n h = 2 + (b - r) / c;\r\n } else {\r\n if (b === x) {\r\n h = 4 + (r - g) / c;\r\n }\r\n }\r\n }\r\n h = h * 60;\r\n if (h < 0) h = h + 360;\r\n }\r\n return [h, s, v];\r\n}\r\n","/**\r\n * Subtractive.\r\n * 2 RGB single numbers that indicate (0x000000 0xFFFFFF up from) Return the value\r\n * of the subtractive color.\r\n * @ Param col1 RGB numbers show (0x000000 0xFFFFFF up from)\r\n * @ Param col2 RGB numbers show (0x000000 0xFFFFFF up from)\r\n * @ Return the subtractive\r\n **/\r\nimport { toRGB } from './toRGB';\r\n\r\nexport function sub(col1: number, col2: number): number {\r\n const c1: any[] = toRGB(col1);\r\n const c2: any[] = toRGB(col2);\r\n const r: number = Math.max(c1[0] - c2[0], 0);\r\n const g: number = Math.max(c1[1] - c2[1], 0);\r\n const b: number = Math.max(c1[2] - c2[2], 0);\r\n return (r << 16) | (g << 8) | b;\r\n}\r\n","/**\r\n * Subtraction.\r\n * 2 RGB single number that indicates (0x000000 0xFFFFFF up from) is subtracted\r\n * from the return numbers.\r\n * @ Param col1 RGB numbers show (0x000000 0xFFFFFF up from)\r\n * @ Param col2 RGB numbers show (0x000000 0xFFFFFF up from)\r\n * @ Return value subtracted Blend\r\n **/\r\nimport { toRGB } from './toRGB';\r\n\r\nexport function subtract(col1: number, col2: number): number {\r\n const colA: any[] = toRGB(col1);\r\n const colB: any[] = toRGB(col2);\r\n const r: number = Math.max(\r\n Math.max(colB[0] - (256 - colA[0]), colA[0] - (256 - colB[0])),\r\n 0,\r\n );\r\n const g: number = Math.max(\r\n Math.max(colB[1] - (256 - colA[1]), colA[1] - (256 - colB[1])),\r\n 0,\r\n );\r\n const b: number = Math.max(\r\n Math.max(colB[2] - (256 - colA[2]), colA[2] - (256 - colB[2])),\r\n 0,\r\n );\r\n return (r << 16) | (g << 8) | b;\r\n}\r\n","/**\r\n * Additive color.\r\n * 2 RGB single numbers that indicate (0x000000 0xFFFFFF up from) Return the value\r\n * of the additive mixture.\r\n * @ Param col1 RGB numbers show (0x000000 0xFFFFFF up from)\r\n * @ Param col2 RGB numbers show (0x000000 0xFFFFFF up from)\r\n * @ Return the additive color\r\n **/\r\nimport { toRGB } from './toRGB';\r\n\r\nexport function sum(col1: number, col2: number): number {\r\n const c1: any[] = toRGB(col1);\r\n const c2: any[] = toRGB(col2);\r\n const r: number = Math.min(c1[0] + c2[0], 255);\r\n const g: number = Math.min(c1[1] + c2[1], 255);\r\n const b: number = Math.min(c1[2] + c2[2], 255);\r\n\r\n return (r << 16) | (g << 8) | b;\r\n}\r\n","export function toRGBA(rgba: number): number[] {\r\n const a: number = (rgba >> 24) & 0xff;\r\n const r: number = (rgba >> 16) & 0xff;\r\n const g: number = (rgba >> 8) & 0xff;\r\n const b: number = rgba & 0xff;\r\n\r\n return [r, g, b, a];\r\n}\r\n","export const COLOR_CODES = {\r\n TO_UNREAL: ['#ffffff', '#005912', `UNREAL <-`],\r\n TAP_LOG: ['#ffff00', '#1976d2', ' [TAPLOG]'],\r\n FROM_UNREAL: ['#ffff00', '#898989', 'UNREAL ->'],\r\n FROM_UNREAL_ERROR: ['#ffffff', '#ff0000', 'UNREAL ERROR ->'],\r\n FROM_CIRRUS: ['#ffffff', '#ef702b', 'CIRRUS ->'],\r\n FROM_CIRRUS_ERROR: ['#ffffff', '#ff0000', 'CIRRUS ->'],\r\n TO_CIRRUS: ['#ffffff', '#3c9738', 'CIRRUS <-'],\r\n} as const;\r\n","/*\r\n * Copyright (c) 2025.\r\n * Sergii Karanda - All Rights Reserved\r\n */\r\n\r\nexport const DOCUMENT_ROOT = (window as any)['source3d_app_base'] || '';\r\n","export function CSV2Array(strData: any, strDelimiter?: string): any[] {\r\n // Check to see if the delimiter is defined. If not,\r\n // then default to comma.\r\n strDelimiter = strDelimiter || ',';\r\n\r\n // Create a regular expression to parse the CSV values.\r\n const objPattern = new RegExp(\r\n // Delimiters.\r\n '(\\\\' +\r\n strDelimiter +\r\n '|\\\\r?\\\\n|\\\\r|^)' +\r\n // Quoted fields.\r\n '(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|' +\r\n // Standard fields.\r\n '([^\"\\\\' +\r\n strDelimiter +\r\n '\\\\r\\\\n]*))',\r\n 'gi',\r\n );\r\n\r\n // Create an array to hold our data. Give the array\r\n // a default empty first row.\r\n const arrData: any[] = [[]];\r\n\r\n // Create an array to hold our individual pattern\r\n // matching groups.\r\n let arrMatches = null;\r\n\r\n // Keep looping over the regular expression matches\r\n // until we can no longer find a match.\r\n while ((arrMatches = objPattern.exec(strData))) {\r\n // Get the delimiter that was found.\r\n const strMatchedDelimiter = arrMatches[1];\r\n\r\n // Check to see if the given delimiter has a length\r\n // (is not the start of string) and if it matches\r\n // field delimiter. If idKey does not, then we know\r\n // that this delimiter is a row delimiter.\r\n if (strMatchedDelimiter.length && strMatchedDelimiter !== strDelimiter) {\r\n // Since we have reached a new row of data,\r\n // add an empty row to our data array.\r\n arrData.push([]);\r\n }\r\n\r\n let strMatchedValue: any;\r\n\r\n // Now that we have our delimiter out of the way,\r\n // let's check to see which kind of value we\r\n // captured (quoted or unquoted).\r\n if (arrMatches[2]) {\r\n // We found a quoted value. When we capture\r\n // this value, unescape any double quotes.\r\n strMatchedValue = arrMatches[2].replace(new RegExp('\"\"', 'g'), '\"');\r\n } else {\r\n // We found a non-quoted value.\r\n strMatchedValue = arrMatches[3];\r\n }\r\n\r\n // Now that we have our value string, let's add\r\n // it to the data array.\r\n arrData[arrData.length - 1].push(strMatchedValue);\r\n }\r\n\r\n // Return the parsed data.\r\n return arrData;\r\n}\r\n","import { CSV2Array } from './CSV2Array';\r\n\r\nconst booleanRegex = /^(true|false)$/i;\r\nconst trueRegex = /^(true)$/i;\r\nconst jsonRegex = /([\\d.]+)|(\\[])|(\\[.+])|({.+})/i;\r\n\r\nconst zipObject = (props: string[], values: any[]) =>\r\n props.reduce(\r\n (obj: any, prop, index) => ((obj[prop] = values[index]), obj),\r\n {},\r\n );\r\n\r\nconst toHead = (input: any): string => {\r\n return String(input).trim();\r\n};\r\n\r\nconst toCorrectString = (input: any): any => {\r\n if (typeof input === 'string') {\r\n if (input.match(jsonRegex)) {\r\n // optimization for use try-catch only after regex match. much faster than without regex\r\n try {\r\n return JSON.parse(input);\r\n } catch {\r\n /* empty */\r\n }\r\n }\r\n if (input.match(booleanRegex)) {\r\n return !!input.match(trueRegex);\r\n }\r\n return input.trim();\r\n } else if (typeof input === 'number') {\r\n return input;\r\n }\r\n};\r\n\r\nexport function CSV2Records(\r\n csv: string,\r\n useRowAsHead = 0,\r\n strDelimiter?: string,\r\n): any {\r\n const arr = CSV2Array(csv, strDelimiter);\r\n const total = arr.length;\r\n const keys = arr[useRowAsHead].map(toHead);\r\n const data: any[] = [];\r\n\r\n let tmpSKU = 0;\r\n\r\n for (let i = useRowAsHead + 1; i < total; i++) {\r\n const obj = zipObject(keys, arr[i].map(toCorrectString));\r\n data.push(obj);\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n tmpSKU++;\r\n }\r\n\r\n return data.filter(Boolean);\r\n}\r\n","export function ObjectToCSV<T extends object>(records: T[]) {\r\n if (records.length === 0) {\r\n return;\r\n }\r\n\r\n const uniqueFields = Array.from(\r\n records.reduce((fields, record) => {\r\n Object.keys(record).forEach((field: string) => fields.add(field));\r\n return fields;\r\n }, new Set<string>()),\r\n );\r\n\r\n const csvHeader = uniqueFields.join(',') + '\\n';\r\n const csvRows = records\r\n .map((record: any) =>\r\n uniqueFields.map((field: any) => `\"${record[field] || ''}\"`).join(','),\r\n )\r\n .join('\\n');\r\n\r\n return csvHeader + csvRows;\r\n}\r\n","export const isLocalhost = !!window.location.href.match(/localhost/gi);\r\n","/**\r\n * Adds required number of symbols before input\r\n * @param input input string\r\n * @param size amount of total symbols\r\n * @param symbol filler\r\n * @returns string\r\n */\r\nexport function pad(\r\n input: number | string,\r\n size: number,\r\n symbol = '0',\r\n): string {\r\n let s = input + '';\r\n while (s.length < size) {\r\n s = symbol + s;\r\n }\r\n return s.slice(-size);\r\n}\r\n","import { pad } from '../strings';\r\n\r\n/**\r\n * Create a string of the form 'HOURS.MINUTES.SECONDS.MILLISECONDS'.\r\n */\r\nexport function timeToString() {\r\n const date = new Date();\r\n\r\n return `${pad(date.getHours(), 2)}:${pad(date.getMinutes(), 2)}:${pad(date.getSeconds(), 2)}.${pad(date.getMilliseconds(), 3)}`;\r\n}\r\n\r\nexport function timeUTCToString() {\r\n const date = new Date();\r\n\r\n return `${pad(date.getUTCHours(), 2)}:${pad(date.getUTCMinutes(), 2)}:${pad(date.getUTCSeconds(), 2)}.${pad(date.getUTCMilliseconds(), 3)}`;\r\n}\r\n","type TruthyTypesOf<T> = T extends false | '' | 0 | null | undefined ? never : T;\r\ntype FalsyTypesOf<T> = T extends false | '' | 0 | null | undefined ? T : never;\r\ntype EmptyTypesOf<T> = T extends undefined | null | object | '' ? T : never;\r\ntype NonEmptyTypesOf<T> = T extends undefined | null | object | '' ? never : T;\r\n/**\r\n * The Boolean object represents a truth value: true or false.\r\n * @param value\r\n * @constructor\r\n * Returns:boolean\r\n */\r\nexport const Truthy: <T>(value: T) => value is TruthyTypesOf<T> = <T>(\r\n value?: T,\r\n): value is TruthyTypesOf<T> =>\r\n !!value && value !== 'false' && value !== 'undefined' && value !== 'null';\r\n\r\n/**\r\n * The Boolean object represents an INVERSE truth value: true or false.\r\n * @param value\r\n * @constructor\r\n * Returns:boolean\r\n */\r\nexport const Falsy: <T>(value: T) => value is FalsyTypesOf<T> = <T>(\r\n value?: T,\r\n): value is FalsyTypesOf<T> => !Truthy(value);\r\n\r\n/**\r\n * Checks if a value is empty.\r\n *\r\n * @param {any} value - The value to check.\r\n * @return {boolean} Returns true if the value is empty, otherwise false.\r\n */\r\nexport const IsEmpty: <T>(value: T) => value is EmptyTypesOf<T> = <T>(\r\n value: T,\r\n): value is EmptyTypesOf<T> => {\r\n return (\r\n value === undefined ||\r\n value === null ||\r\n (typeof value === 'object' && Object.keys(value).length === 0) ||\r\n (typeof value === 'string' && value.trim().length === 0)\r\n );\r\n};\r\n\r\nexport const NotEmpty: <T>(value: T) => value is NonEmptyTypesOf<T> = <T>(\r\n value: T,\r\n): value is NonEmptyTypesOf<T> => {\r\n return !IsEmpty(value);\r\n};\r\nexport const isDefined = <T>(arg: T | null | undefined): arg is T =>\r\n arg !== null && arg !== undefined;\r\n\r\nexport const isNotDefined = <T>(\r\n arg: T | null | undefined,\r\n): arg is null | undefined => arg === null || arg === undefined;\r\n\r\nexport const isJSON = (str: string): boolean => {\r\n try {\r\n JSON.parse(str);\r\n } catch (e) {\r\n console.warn(e);\r\n\r\n return false;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nexport const isEmpty = (value: any) =>\r\n value === undefined ||\r\n value === null ||\r\n (typeof value === 'object' && Object.keys(value).length === 0) ||\r\n (typeof value === 'string' && value.trim().length === 0);\r\n\r\nexport function isAllValuesTruthy<T extends string, K>(value: Record<T, K>) {\r\n return Object.values(value).every(Truthy);\r\n}\r\n","const cache: Record<string, unknown> = {};\r\n\r\n/**\r\n * Converts a given value to a string suitable for search comparisons.\r\n * The resulting string is in lowercase, with consecutive spaces replaced by underscores.\r\n * The function uses a cache to improve performance by storing and reusing the results of previous conversions.\r\n *\r\n * @param {any} value - The value to be converted to a search-friendly string.\r\n * It can be of any type, but it will be coerced to a string if not already one.\r\n *\r\n * @param {boolean} caseSensitive - A flag indicating whether the comparison should be case-sensitive.\r\n * If set to true, the function will perform case-sensitive comparisons, preserving the original casing of input strings.\r\n * If set to false (default), the function will convert the input strings to lowercase for case-insensitive comparisons\r\n *\r\n * @returns {string} The processed string, which is trimmed, converted to lowercase (unless caseSensitive is true),\r\n * and has all sequences of spaces replaced with underscores. This string is either\r\n * retrieved from the cache or freshly computed and then cached.\r\n *\r\n */\r\nexport function textForSearch(value: unknown, caseSensitive = false): string {\r\n const key = `${value}_${caseSensitive}`;\r\n return (cache[key] ||\r\n (() => {\r\n let result = String(value).trim().replace(/ +/gi, '_');\r\n\r\n if (!caseSensitive) {\r\n result = result.toLowerCase();\r\n }\r\n\r\n cache[key] = result;\r\n\r\n return result;\r\n })()) as string;\r\n}\r\n","import { textForSearch } from './textForSearch';\r\n\r\n/**\r\n * Builds a predicate that checks whether a record matches **all** provided criteria.\r\n *\r\n * Behavior:\r\n * - Only keys with **defined** values in `criteria` are considered; keys with `undefined` are ignored.\r\n * - Both the criterion value and the corresponding record value are normalized using `textForSearch(value, caseSensitive)`,\r\n * then compared for **equality** (not substring/contains).\r\n * - By default (`caseSensitive = false`), comparisons are case-insensitive and tolerant to extra spacing\r\n * (per `textForSearch`). When `caseSensitive = true`, comparisons preserve original casing.\r\n * - If **no** criteria have defined values, the resulting predicate always returns **false**.\r\n *\r\n * @remarks\r\n * **Nested object stringification (runtime edge case):**\r\n * Although the TypeScript types constrain comparisons to primitive fields via `ISearchable<T>`,\r\n * at runtime any non-primitive value that slips through (e.g., due to loose typing) will be coerced to a string\r\n * before normalization. For example:\r\n *\r\n * ```ts\r\n * // Runtime behavior with nested objects (typing omitted for brevity)\r\n * const record = { age: 20, test: { hello: 'world' } } as any;\r\n * // textForSearch(record.test, false) => \"[object_object]\" (e.g., \"[object Object]\" normalized)\r\n * const criteria = { age: 20, test: \"[object_object]\" } as any;\r\n * const matches = where<any>(criteria)(record);\r\n * // matches === true\r\n * ```\r\n *\r\n * In other words, `{ hello: 'world' }` is interpreted as the string `\"[object_object]\"` after normalization,\r\n * so a criterion with `test: \"[object_object]\"` will successfully match.\r\n *\r\n * @typeParam T - The object type whose **primitive** fields are comparable via `ISearchable<T>`.\r\n *\r\n * @param criteria - A partial set of key–value pairs over `ISearchable<T>` to match against.\r\n * Only keys with defined values participate in the comparison.\r\n * @param caseSensitive - Whether comparisons should be case-sensitive. Defaults to `false`.\r\n *\r\n * @returns A predicate `(record: ISearchable<T>) => boolean` that is `true` iff the record matches **all** criteria.\r\n *\r\n * @example\r\n * type Item = { name: string; category: string; note?: string };\r\n * const items: Item[] = [\r\n * { name: \"Apple\", category: \"Fruit\" },\r\n * { name: \"Carrot\", category: \"Vegetable\" },\r\n * { name: \"Banana\", category: \"Fruit\" }\r\n * ];\r\n *\r\n * // Case-insensitive equality match on category (\"fruit\" matches \"Fruit\")\r\n * const isFruit = where<Item>({ category: \"fruit\" });\r\n * const fruits = items.filter(isFruit);\r\n * // → [{ name: \"Apple\", category: \"Fruit\" }, { name: \"Banana\", category: \"Fruit\" }]\r\n *\r\n * // Empty criteria → predicate always false\r\n * const matchNothing = where<Item>({});\r\n * items.filter(matchNothing); // → []\r\n */\r\nexport function where<T extends object>(\r\n criteria: Input<T>,\r\n caseSensitive = false,\r\n): (record: ISearchable<T>) => boolean {\r\n const preComputedEntries = Object.entries(criteria)\r\n .filter(([, value]) => value !== undefined)\r\n .map(([key, value]) => [key, textForSearch(value, caseSensitive)] as const);\r\n\r\n return (record: ISearchable<T>): boolean => {\r\n return (\r\n preComputedEntries.length > 0 &&\r\n preComputedEntries.every(([key, criterionValue]) => {\r\n return (\r\n textForSearch(\r\n record[key as keyof ISearchable<T>] ?? '',\r\n caseSensitive,\r\n ) === criterionValue\r\n );\r\n })\r\n );\r\n };\r\n}\r\n\r\n/**\r\n * Builds a predicate that is the logical **negation** of `where`.\r\n *\r\n * Behavior mirrors `where(criteria, caseSensitive)` but returns `true` when a record **does not**\r\n * satisfy all criteria. Notable edge cases:\r\n * - If `criteria` has no defined values (i.e., `where` would always return `false`), this negated predicate\r\n * will always return **true**.\r\n * - **Nested object stringification (runtime edge case):** If a nested object is compared against a criterion\r\n * like `\"[object_object]\"` (after normalization), the original `where` would return `true`, so `whereNot` will return `false`.\r\n *\r\n * @typeParam T - The object type whose **primitive** fields are comparable via `ISearchable<T>`.\r\n *\r\n * @param criteria - Same as in `where`.\r\n * @param caseSensitive - Same as in `where`. Defaults to `false`.\r\n *\r\n * @returns A predicate `(record: ISearchable<T>) => boolean` that is `true` iff the record **fails** the `where` check.\r\n *\r\n * @example\r\n * type Item = { name: string; category: string };\r\n * const items: Item[] = [\r\n * { name: \"Apple\", category: \"Fruit\" },\r\n * { name: \"Carrot\", category: \"Vegetable\" }\r\n * ];\r\n *\r\n * const isNotFruit = whereNot<Item>({ category: \"fruit\" });\r\n * items.filter(isNotFruit);\r\n * // → [{ name: \"Carrot\", category: \"Vegetable\" }]\r\n */\r\nexport function whereNot<T extends object>(\r\n criteria: Input<T>,\r\n caseSensitive = false,\r\n): (record: ISearchable<T>) => boolean {\r\n const whereFunc = where(criteria, caseSensitive);\r\n return (record: ISearchable<T>) => {\r\n return !whereFunc(record);\r\n };\r\n}\r\n\r\ntype HasPrimitivePartKeys<T> = {\r\n [K in keyof T]: Extract<T[K], Primitive> extends never ? never : K;\r\n}[keyof T];\r\n\r\ntype ISearchable<T> = {\r\n [K in HasPrimitivePartKeys<T>]: Extract<T[K], Primitive>;\r\n};\r\n\r\ntype Input<T> = Partial<TruthyTypesOf<ISearchable<T>>>;\r\ntype Primitive = string | number | bigint | boolean | symbol | null | undefined;\r\ntype TruthyTypesOf<T> = T extends Falsy ? never : T;\r\ntype Falsy = null | undefined | false | 0 | -0 | 0n | '';\r\n","import { timeUTCToString } from './timeToString';\r\nimport { Truthy } from '../predicates';\r\n\r\nexport class Logger {\r\n static isDevMode = Truthy(localStorage.getItem('devMode'));\r\n\r\n static colored(color: string, background: string, ...args: unknown[]) {\r\n if (!Logger.isDevMode) {\r\n return;\r\n }\r\n\r\n const [first, ...rest] = args;\r\n console.log.apply(console, [\r\n `%c ${timeUTCToString()} ${first} `,\r\n `color: ${color}; background: ${background};`,\r\n ...rest,\r\n ]);\r\n }\r\n\r\n static log(...args: unknown[]) {\r\n if (!Logger.isDevMode) {\r\n return;\r\n }\r\n\r\n console.log.apply(console, [\r\n `%c ${timeUTCToString()} [ LOG ] `,\r\n 'color: black; background: #80ff80;',\r\n ...args,\r\n ]);\r\n }\r\n\r\n static warn(...args: unknown[]) {\r\n if (!Logger.isDevMode) {\r\n return;\r\n }\r\n\r\n console.warn.apply(console, [\r\n `%c ${timeUTCToString()} WARN `,\r\n 'color: black; background: #ffd500;',\r\n ...args,\r\n ]);\r\n }\r\n\r\n static info(...args: unknown[]) {\r\n if (!Logger.isDevMode) {\r\n return;\r\n }\r\n\r\n console.log.apply(console, [\r\n `%c ${timeUTCToString()} [ INFO ] `,\r\n 'color: white; background: blue;',\r\n ...args,\r\n ]);\r\n }\r\n\r\n static error(...args: unknown[]) {\r\n if (!Logger.isDevMode) {\r\n return;\r\n }\r\n\r\n console.error.apply(console, [\r\n `%c ${timeUTCToString()} ERROR `,\r\n 'color: white; background: red;',\r\n ...args,\r\n ]);\r\n }\r\n\r\n static table(...args: unknown[]) {\r\n if (!Logger.isDevMode) {\r\n return;\r\n }\r\n\r\n // eslint-disable-next-line no-console\r\n console.table.apply(console, [args]);\r\n }\r\n\r\n static time(...args: any) {\r\n if (!Logger.isDevMode) {\r\n return;\r\n }\r\n\r\n // eslint-disable-next-line no-console,prefer-spread\r\n console.time.apply(console, args);\r\n }\r\n\r\n static timeEnd(...args: any) {\r\n if (!Logger.isDevMode) {\r\n return;\r\n }\r\n\r\n // eslint-disable-next-line no-console,prefer-spread\r\n console.timeEnd.apply(console, args);\r\n }\r\n}\r\n","export function cleanupFileName(value: string): string {\r\n if (!value) {\r\n return value;\r\n }\r\n\r\n value = value\r\n .toString()\r\n .replace(/undefined/g, '')\r\n .trim()\r\n .replace(/\\//g, '-')\r\n .replace(/[-]+/g, '-')\r\n .replace(/[^\\w^.-]+/gi, '_')\r\n .replace(/[\\^]+/gi, '_');\r\n\r\n value = value.split('_').filter(Boolean).join('_').toLowerCase();\r\n\r\n return value;\r\n}\r\n","import { cleanupFileName } from './cleanupFileName';\r\n\r\nexport function makePath(...value: string[]): string {\r\n return [...value].map((el) => cleanupFileName(el)).join('/');\r\n}\r\n","import { cleanupFileName } from './cleanupFileName';\r\n\r\nexport function normalizePath(value: string): string {\r\n const re = new RegExp('[/\\\\\\\\]+', 'g');\r\n return value\r\n .split(re)\r\n .map((el) => cleanupFileName(el))\r\n .join('/');\r\n}\r\n","import type { Area, Rect } from './interfaces';\r\n\r\nexport function expandOverRectangle(objectRect: Rect, areaRect: Rect): Area {\r\n const ratio: number = objectRect.w / objectRect.h;\r\n const result: Area = { x: 0, y: 0, w: 0, h: 0, scale: 1 };\r\n if (areaRect.w / ratio < areaRect.h) {\r\n result.w = areaRect.h * ratio;\r\n result.h = areaRect.h;\r\n } else {\r\n result.w = areaRect.w;\r\n result.h = areaRect.w / ratio;\r\n }\r\n result.x = areaRect.x + (areaRect.w - result.w) / 2;\r\n result.y = areaRect.y + (areaRect.h - result.h) / 2;\r\n result.scale = result.w / objectRect.w;\r\n return result;\r\n}\r\n","import type { Area, Rect } from './interfaces';\r\n\r\nexport function fitIntoRectangle(\r\n objectRect: Rect,\r\n areaRect: Rect,\r\n round = true,\r\n fixedRatio: number | null = null,\r\n): Area {\r\n const result: Area = { x: 0, y: 0, w: 0, h: 0, scale: 1 };\r\n const ratio: number = objectRect.h / objectRect.w;\r\n\r\n if (objectRect.h > objectRect.w) {\r\n result.h = areaRect.h;\r\n result.w = areaRect.h / ratio;\r\n\r\n if (result.w > areaRect.w) {\r\n result.w = areaRect.w;\r\n result.h = areaRect.w * ratio;\r\n }\r\n } else {\r\n result.w = areaRect.w;\r\n result.h = areaRect.w * ratio;\r\n\r\n if (result.h > areaRect.h) {\r\n result.h = areaRect.h;\r\n result.w = areaRect.h / ratio;\r\n }\r\n }\r\n\r\n if (fixedRatio) {\r\n result.w = objectRect.w * fixedRatio;\r\n result.h = objectRect.h * fixedRatio;\r\n }\r\n const wOut: number = round ? Math.floor(result.w) : result.w;\r\n const hOut: number = round ? Math.floor(result.h) : result.h;\r\n return {\r\n x: areaRect.x + (areaRect.w - wOut) / 2,\r\n y: areaRect.y + (areaRect.h - hOut) / 2,\r\n w: wOut,\r\n h: hOut,\r\n scale: wOut / objectRect.w,\r\n };\r\n}\r\n","const canvasCacheObj: any = {};\r\n\r\nexport function getCanvasCached(id: string): {\r\n canvas: HTMLCanvasElement;\r\n ctx: CanvasRenderingContext2D;\r\n} {\r\n if (!canvasCacheObj[id]) {\r\n const canvas = document.createElement('canvas');\r\n canvasCacheObj[id] = {\r\n canvas,\r\n ctx: canvas.getContext('2d'),\r\n };\r\n }\r\n\r\n return canvasCacheObj[id];\r\n}\r\n","import { fitIntoRectangle } from '../geom';\r\nimport type { ImageOutputValues } from '../interfaces';\r\n\r\nfunction getSnapshot2(\r\n imageElement:\r\n | HTMLImageElement\r\n | HTMLCanvasElement\r\n | HTMLVideoElement\r\n | ImageBitmap,\r\n maxWidth = 1024,\r\n output: ImageOutputValues = 'image/png',\r\n quality = 0.9,\r\n): HTMLCanvasElement | string {\r\n const drawableImage = imageElement as any;\r\n const canvasHelper: HTMLCanvasElement = document.createElement('canvas');\r\n const drawCTX: CanvasRenderingContext2D = canvasHelper.getContext(\r\n '2d',\r\n ) as CanvasRenderingContext2D;\r\n\r\n const prop = fitIntoRectangle(\r\n {\r\n x: 0,\r\n y: 0,\r\n w: drawableImage.naturalWidth || drawableImage.width,\r\n h: drawableImage.naturalHeight || drawableImage.height,\r\n },\r\n {\r\n x: 0,\r\n y: 0,\r\n w: maxWidth,\r\n h: drawableImage.naturalHeight || drawableImage.height,\r\n },\r\n );\r\n\r\n const width = prop.w;\r\n const height = prop.h;\r\n canvasHelper.width = width;\r\n canvasHelper.height = height;\r\n\r\n drawCTX.save();\r\n drawCTX.clearRect(0, 0, width, height);\r\n drawCTX.drawImage(drawableImage, 0, 0, width, height);\r\n drawCTX.restore();\r\n\r\n if (output === 'canvas') {\r\n return canvasHelper;\r\n }\r\n\r\n return canvasHelper.toDataURL(output, quality);\r\n}\r\n\r\nexport function getSnapshot(\r\n imageElement:\r\n | HTMLImageElement\r\n | HTMLCanvasElement\r\n | HTMLVideoElement\r\n | ImageBitmap,\r\n maxWidth = 1024,\r\n output: ImageOutputValues = 'image/png',\r\n quality = 0.9,\r\n): HTMLCanvasElement | string {\r\n const drawableImage = imageElement as any;\r\n const canvasHelper: HTMLCanvasElement = document.createElement('canvas');\r\n const drawCTX: CanvasRenderingContext2D = canvasHelper.getContext(\r\n '2d',\r\n ) as CanvasRenderingContext2D;\r\n\r\n const prop = fitIntoRectangle(\r\n {\r\n x: 0,\r\n y: 0,\r\n w: drawableImage.naturalWidth || drawableImage.width,\r\n h: drawableImage.naturalHeight || drawableImage.height,\r\n },\r\n {\r\n x: 0,\r\n y: 0,\r\n w: (drawableImage.naturalWidth || drawableImage.width) / 2,\r\n h: drawableImage.naturalHeight || drawableImage.height,\r\n },\r\n );\r\n\r\n const width = prop.w;\r\n const height = prop.h;\r\n canvasHelper.width = width;\r\n canvasHelper.height = height;\r\n\r\n drawCTX.save();\r\n drawCTX.clearRect(0, 0, width, height);\r\n drawCTX.drawImage(drawableImage, 0, 0, width, height);\r\n\r\n drawCTX.restore();\r\n\r\n if (width > maxWidth * 2) {\r\n return getSnapshot(canvasHelper, maxWidth, output, quality);\r\n }\r\n\r\n return getSnapshot2(drawableImage, maxWidth, output, quality);\r\n}\r\n","export function loadImage(url: string): Promise<HTMLImageElement> {\r\n return new Promise((resolve: any, reject) => {\r\n const img = new Image();\r\n img.crossOrigin = 'anonymous';\r\n img.onload = () => {\r\n setTimeout(() => resolve(img), 1);\r\n };\r\n img.onerror = () => {\r\n setTimeout(() => reject(null), 1);\r\n };\r\n img.src = url;\r\n });\r\n}\r\n","import { getSnapshot } from './getSnapshot';\r\nimport type { ImageOutputValues } from '../interfaces';\r\n\r\n/**\r\n * USE DownloadImage instead!\r\n * @deprecated use DownloadImage instead!\r\n * @param imageSource\r\n * @param name\r\n * @param width\r\n * @param format\r\n */\r\nfunction SaveImage(\r\n imageSource:\r\n | HTMLImageElement\r\n | HTMLCanvasElement\r\n | HTMLVideoElement\r\n | ImageBitmap\r\n | string,\r\n name: string,\r\n width?: number,\r\n format?: string | ImageOutputValues,\r\n): any {\r\n let out;\r\n const image: any = imageSource;\r\n\r\n if (typeof image !== 'string') {\r\n out = getSnapshot(image, width, format as ImageOutputValues);\r\n } else {\r\n out = image;\r\n }\r\n\r\n if ((navigator as any).msSaveBlob) {\r\n // IE10+\r\n try {\r\n const blob = image.msToBlob();\r\n return (navigator as any).msSaveBlob(blob, name);\r\n } catch (e) {\r\n console.warn(e);\r\n }\r\n } else {\r\n const uri = out;\r\n const link = document.createElement('a');\r\n link.download = name;\r\n link.href = uri as string;\r\n\r\n document.body.appendChild(link);\r\n if (link.click) {\r\n link.click();\r\n } else {\r\n const event = document.createEvent('MouseEvents');\r\n (event as any).initMouseEvent('click', true, true, window);\r\n link.dispatchEvent(event);\r\n }\r\n document.body.removeChild(link);\r\n }\r\n}\r\n\r\n/**\r\n * @param imageSource\r\n * @param string name\r\n * @param number width\r\n * @param string format\r\n */\r\nconst DownloadImage = SaveImage;\r\nexport { SaveImage, DownloadImage };\r\n","import type { LoadArgs, LoadArgsTmp } from '../interfaces';\r\nimport { loadImage } from '../image';\r\n\r\nexport class BatchLoader {\r\n private maximumSlotsNumber = 1;\r\n private queue: LoadArgsTmp[] = [];\r\n private slots: LoadArgsTmp[] = [];\r\n private _whenDone!: () => any;\r\n\r\n clear() {\r\n this.queue.forEach((item) => {\r\n try {\r\n if (item.img) {\r\n item.img.src = '';\r\n }\r\n } catch (e) {\r\n console.warn(e);\r\n }\r\n\r\n try {\r\n item.xhr?.abort();\r\n } catch (e) {\r\n console.warn(e);\r\n }\r\n });\r\n\r\n this.slots.forEach((item) => {\r\n try {\r\n if (item.img) {\r\n item.img.src = '';\r\n }\r\n } catch (e) {\r\n console.warn(e);\r\n }\r\n\r\n try {\r\n item.xhr?.abort();\r\n } catch (e) {\r\n console.warn(e);\r\n }\r\n });\r\n this.slots.length = 0;\r\n this.queue.length = 0;\r\n }\r\n\r\n /**\r\n * new settings\r\n * you must pass new settings\r\n * @param sett\r\n */\r\n setSettings(sett: any) {\r\n this.maximumSlotsNumber =\r\n sett.maximumSlotsNumber !== undefined\r\n ? sett.maximumSlotsNumber\r\n : this.maximumSlotsNumber;\r\n }\r\n\r\n /**\r\n * execute with a chosen file\r\n * @param id\r\n * @param func\r\n */\r\n withItem(id: string, func: (item: LoadArgs) => any): boolean {\r\n let item = this.getById(id);\r\n if (!item) {\r\n return false;\r\n }\r\n item = func(item);\r\n this.queue.sort(this.sortByOrder);\r\n return true;\r\n }\r\n\r\n remove(id: string): LoadArgs[] {\r\n this.queue = this.queue.filter((arg) => arg.id !== id);\r\n return this.queue;\r\n }\r\n\r\n /**\r\n * executes when all files are downloaded\r\n * @param cb\r\n */\r\n whenDone(cb: any) {\r\n this._whenDone = cb;\r\n }\r\n\r\n // order {number} lower will execute first, default *100*\r\n load(args: LoadArgs[]) {\r\n const out: { path: string; self?: any; id: string }[] = args\r\n .filter((arg) => !!arg.path)\r\n .map((arg) => ({\r\n path: arg.path,\r\n id: this.add(arg),\r\n }));\r\n\r\n this.queue.sort(this.sortByOrder);\r\n this.checkSlots();\r\n\r\n return out;\r\n }\r\n\r\n /**\r\n * operates with one file\r\n * @param item\r\n * @private\r\n */\r\n private add(item: LoadArgs): string {\r\n // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n const that = this;\r\n const temp: LoadArgsTmp = {\r\n id: item.id,\r\n resolutionId: null,\r\n useXhr: item.useXhr,\r\n order: item.order !== undefined ? item.order : 100,\r\n fallBack: item.fallBack,\r\n path: item.path,\r\n onLoadEnd: item.onLoadEnd,\r\n onProgress: item.onProgress,\r\n onLoadStart: item.onLoadStart,\r\n extra: item.extra,\r\n };\r\n\r\n let retryCount = 1;\r\n if (temp.useXhr) {\r\n temp.xhr = this.getXmlHttp();\r\n temp.xhr.onloadstart = (data: ProgressEvent) => item.onLoadStart(data);\r\n temp.xhr.onprogress = (data: ProgressEvent) => item.onProgress(data);\r\n temp.xhr.onreadystatechange = async function (data: any) {\r\n if (this.readyState === 1 && this.status === 0) {\r\n return;\r\n }\r\n if (\r\n this.readyState === 4 &&\r\n (this.status === 404 || this.status === 0)\r\n ) {\r\n temp.error = true;\r\n that.loadEnd(temp);\r\n return;\r\n }\r\n if (this.readyState === 4 && this.status === 200) {\r\n const urlCreator = window.URL;\r\n const imageUrl = urlCreator.createObjectURL(data.target.response);\r\n temp.img = await loadImage(imageUrl);\r\n that.loadEnd(temp);\r\n return;\r\n }\r\n };\r\n } else {\r\n temp.img = new Image();\r\n temp.img.crossOrigin = 'anonymous';\r\n temp.img.onload = () => {\r\n that.loadEnd(temp);\r\n };\r\n temp.img.onerror = () => {\r\n if (temp.fallBack && retryCount-- > 0) {\r\n console.warn('Fallback used =>', temp.path, '=>', temp.fallBack);\r\n if (temp.img) {\r\n temp.img.onload = null;\r\n temp.img.src = temp.fallBack;\r\n }\r\n\r\n that.loadEnd(temp);\r\n } else {\r\n temp.error = true;\r\n that.loadEnd(temp);\r\n }\r\n };\r\n }\r\n this.queue.push(temp);\r\n return temp.id as string;\r\n }\r\n\r\n private sortByOrder(a: LoadArgs, b: LoadArgs): number {\r\n return a.order > b.order ? 1 : a.order < b.order ? -1 : 0;\r\n }\r\n\r\n private loadEnd(item: LoadArgs) {\r\n if (item.onLoadEnd !== undefined) {\r\n for (let i = 0, len = this.slots.length; i < len; i += 1) {\r\n if (this.slots[i].id === item.id) {\r\n this.slots.splice(i, 1);\r\n break;\r\n }\r\n }\r\n item.onLoadEnd(item);\r\n }\r\n this.checkSlots();\r\n }\r\n\r\n private checkSlots() {\r\n while (\r\n (this.slots.length < this.maximumSlotsNumber ||\r\n this.maximumSlotsNumber === -1) &&\r\n this.queue.length\r\n ) {\r\n this.slots.push(this.queue.shift() as LoadArgsTmp);\r\n const slot: LoadArgsTmp = this.slots[\r\n this.slots.length - 1\r\n ] as LoadArgsTmp;\r\n if (slot.useXhr) {\r\n slot.xhr?.open('GET', slot.path, true);\r\n slot.xhr?.send(null);\r\n } else {\r\n if (slot.img) {\r\n slot.img.src = slot.path;\r\n }\r\n }\r\n }\r\n\r\n if (\r\n this.slots.length === 0 &&\r\n this.queue.length === 0 &&\r\n this._whenDone !== undefined\r\n ) {\r\n this._whenDone();\r\n }\r\n }\r\n\r\n /**\r\n * get Item By id for interaction with files in this.queue\r\n * @param id\r\n * @private\r\n */\r\n private getById(id: string): LoadArgs | null {\r\n for (let i = 0, len = this.queue.length; i < len; i += 1) {\r\n if (this.queue[i].id === id) {\r\n return this.queue[i];\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private getXmlHttp(): XMLHttpRequest {\r\n let xhr = null;\r\n try {\r\n xhr = new XMLHttpRequest();\r\n xhr.responseType = 'blob';\r\n } catch (e) {\r\n console.warn(e);\r\n }\r\n\r\n return xhr as any;\r\n }\r\n}\r\n","export const debounce = <T extends (...args: any[]) => any>(\r\n fn: T,\r\n ms = 300,\r\n) => {\r\n let timeoutId: ReturnType<typeof setTimeout>;\r\n return function (this: any, ...args: any[]) {\r\n clearTimeout(timeoutId);\r\n timeoutId = setTimeout(() => fn.apply(this, args), ms);\r\n };\r\n};\r\n","const KeyboardNumericCode = {\r\n Backspace: 8,\r\n Tab: 9,\r\n Numpad5: 12,\r\n NumpadEnter: 13,\r\n ShiftRight: 16,\r\n ControlRight: 17,\r\n ControlLeft: 17,\r\n AltRight: 18,\r\n Escape: 27,\r\n Space: 32,\r\n Numpad9: 33,\r\n Numpad3: 34,\r\n Numpad1: 35,\r\n Numpad7: 36,\r\n Numpad4: 37,\r\n Numpad8: 38,\r\n Numpad6: 39,\r\n Numpad2: 40,\r\n Numpad0: 45,\r\n NumpadDecimal: 46,\r\n Digit0: 48,\r\n Digit1: 49,\r\n Digit2: 50,\r\n Digit3: 51,\r\n Digit4: 52,\r\n Digit5: 53,\r\n Digit6: 54,\r\n Digit7: 55,\r\n Digit8: 56,\r\n Digit9: 57,\r\n KeyA: 65,\r\n KeyB: 66,\r\n KeyC: 67,\r\n KeyD: 68,\r\n KeyE: 69,\r\n KeyF: 70,\r\n KeyG: 71,\r\n KeyH: 72,\r\n KeyI: 73,\r\n KeyJ: 74,\r\n KeyK: 75,\r\n KeyL: 76,\r\n KeyM: 77,\r\n KeyN: 78,\r\n KeyO: 79,\r\n KeyP: 80,\r\n KeyQ: 81,\r\n KeyR: 82,\r\n KeyS: 83,\r\n KeyT: 84,\r\n KeyU: 85,\r\n KeyV: 86,\r\n KeyW: 87,\r\n KeyX: 88,\r\n KeyY: 89,\r\n KeyZ: 90,\r\n MetaLeft: 91,\r\n ContextMenu: 93,\r\n NumpadMultiply: 106,\r\n NumpadAdd: 107,\r\n NumpadSubtract: 109,\r\n NumpadDivide: 111,\r\n F1: 112,\r\n F2: 113,\r\n F3: 114,\r\n F4: 115,\r\n F5: 116,\r\n F6: 117,\r\n F7: 118,\r\n F8: 119,\r\n F9: 120,\r\n F10: 121,\r\n F11: 122,\r\n F12: 123,\r\n NumLock: 144,\r\n ScrollLock: 145,\r\n Semicolon: 186,\r\n Equal: 187,\r\n Comma: 188,\r\n Minus: 189,\r\n Period: 190,\r\n Slash: 191,\r\n Backquote: 192,\r\n BracketLeft: 219,\r\n Backslash: 220,\r\n BracketRight: 221,\r\n Quote: 222,\r\n IntlBackslash: 226,\r\n ArrowUp: 38,\r\n ArrowDown: 40,\r\n ArrowLeft: 37,\r\n ArrowRight: 39,\r\n} as const;\r\n\r\ntype IKeyName = keyof typeof KeyboardNumericCode;\r\ntype IKeyCode = (typeof KeyboardNumericCode)[IKeyName];\r\n\r\ntype InvertedKeyMapType = {\r\n [K in IKeyName as (typeof KeyboardNumericCode)[K]]: K;\r\n};\r\nconst InvertedKeyMapValues = {} as { [K in IKeyCode]: IKeyName[K] };\r\n\r\n//For use for InvertedKeyMap[32] will return 'Space' and so on\r\nconst InvertedKeyMap = InvertedKeyMapValues as InvertedKeyMapType;\r\n\r\nconst KeyboardStringCode = {} as { [K in IKeyName]: K };\r\n\r\nObject.entries(KeyboardNumericCode).forEach(\r\n // @ts-expect-error @typescript-eslint/ban-ts-comment\r\n ([key, value]: [IKeyName, IKeyCode]) => {\r\n InvertedKeyMapValues[value] = key;\r\n // @ts-expect-error @typescript-eslint/ban-ts-comment\r\n KeyboardStringCode[key] = key;\r\n },\r\n);\r\nexport type { IKeyName, IKeyCode };\r\nexport { KeyboardStringCode, InvertedKeyMap, KeyboardNumericCode };\r\n","export function serialize(obj: any): string {\r\n const str = [];\r\n\r\n for (const p in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, p)) {\r\n str.push(encodeURIComponent(p) + '=' + encodeURIComponent(obj[p]));\r\n }\r\n }\r\n\r\n return str.join('&');\r\n}\r\n","export const saveToLocalDrive = (uri: string, name: string) => {\r\n if (!uri) {\r\n return;\r\n }\r\n\r\n if ((navigator as any).msSaveBlob) {\r\n // IE10+\r\n try {\r\n return (navigator as any).msSaveBlob(uri, name);\r\n } catch (e) {\r\n console.warn(e);\r\n }\r\n } else {\r\n const link = document.createElement('a');\r\n link.target = '_blank';\r\n link.href = uri;\r\n link.download = name;\r\n\r\n document.body.appendChild(link);\r\n\r\n if (link.click) {\r\n link.click();\r\n } else {\r\n const event = document.createEvent('MouseEvents');\r\n (event as any).initMouseEvent('click', true, true, window);\r\n link.dispatchEvent(event);\r\n }\r\n\r\n document.body.removeChild(link);\r\n }\r\n};\r\n","export function sleep(time: number) {\r\n return new Promise((r) => setTimeout(r, time));\r\n}\r\n","export function trimLastSlashFromUrl(baseUrl: string) {\r\n if (!baseUrl) {\r\n return null;\r\n } else if (baseUrl[baseUrl.length - 1] === '/') {\r\n return baseUrl.substring(0, baseUrl.length - 1);\r\n }\r\n\r\n return;\r\n}\r\n","import type { Observable } from 'rxjs';\r\nimport { Subject } from 'rxjs';\r\nimport { filter, map } from 'rxjs/operators';\r\n\r\ninterface BroadcastEvent {\r\n key: any;\r\n data?: any;\r\n}\r\n\r\n/**\r\n * SingleTone Private class.\r\n * Event-Driving pattern for sending signals from component to component.\r\n */\r\nclass SignalClass {\r\n private static eventBus: Subject<BroadcastEvent>;\r\n\r\n constructor() {\r\n if (SignalClass.eventBus) {\r\n throw new Error(`Check that 'SignalClass' is not instantiated again!`);\r\n }\r\n SignalClass.eventBus = new Subject<BroadcastEvent>();\r\n }\r\n\r\n /**\r\n * It is not recommended to use this class directly.\r\n * use the sendSignal functions instead.\r\n * those wrappers are more convenient and provide a better type safety.\r\n */\r\n broadcast<K, D>(key: K, data?: D) {\r\n SignalClass.eventBus.next({ key, data });\r\n }\r\n\r\n /**\r\n * It is not recommended to use this class directly.\r\n * use the fromSignal functions instead.\r\n * those wrappers are more convenient and provide a better type safety.\r\n */\r\n on<K, D = any>(key: K): Observable<D> {\r\n return SignalClass.eventBus.asObservable().pipe(\r\n filter((event) => event.key === key),\r\n map((event) => event.data),\r\n );\r\n }\r\n}\r\n\r\nexport const Signal = new SignalClass();\r\n","import { v4 as uuidv4 } from 'uuid';\r\n\r\nexport function generateUuid() {\r\n return uuidv4();\r\n}\r\n","import { Md5 } from 'ts-md5';\r\n\r\nexport function shortHash<T>(data: T, shorten?: boolean): string;\r\nexport function shortHash(data: null | undefined, shorten?: boolean): null;\r\nexport function shortHash<T>(\r\n data: T | null | undefined,\r\n shorten = true,\r\n): string | null {\r\n if (!data) {\r\n return null;\r\n }\r\n\r\n const stringify: string = Md5.hashStr(JSON.stringify(data));\r\n\r\n if (shorten) {\r\n return parseInt('0x' + stringify.substring(0, 10), 16).toString(32);\r\n }\r\n\r\n return stringify;\r\n}\r\n","export const isDesktop = () => {\r\n // 1) Try the newer userAgentData API if available\r\n const uaData = (navigator as any).userAgentData;\r\n if (uaData && typeof uaData.mobile === 'boolean') {\r\n return !uaData.mobile;\r\n }\r\n\r\n // 2) Fallback to a broader UA regex\r\n const mobileRegex =\r\n /Mobi|Android|iPhone|iPad|iPod|Opera Mini|IEMobile|Windows Phone|webOS|BlackBerry/i;\r\n return !mobileRegex.test(navigator.userAgent);\r\n};\r\n","import { fromEvent, map, startWith } from 'rxjs';\r\n\r\nexport const media = (query: string) => {\r\n const mediaQuery = window.matchMedia(query);\r\n return fromEvent<MediaQueryList>(mediaQuery, 'change').pipe(\r\n startWith(mediaQuery),\r\n map((list: MediaQueryList) => list.matches),\r\n );\r\n};\r\n","export const ImageOutput = {\r\n CANVAS: 'canvas',\r\n PNG: 'image/png',\r\n WEBP: 'image/webp',\r\n JPG: 'image/jpeg',\r\n} as const;\r\n\r\nexport type ImageOutputValues = (typeof ImageOutput)[keyof typeof ImageOutput];\r\n","/**\r\n * Calculates the index at which the `value` should be inserted into the `array` to maintain its\r\n * sorted order. This function performs a binary search with a complexity of O(log n), making it\r\n * efficient for large datasets. It assumes that the input array is sorted in ascending order and\r\n * contains comparable elements.\r\n *\r\n * Note: The function is designed to handle arrays with lengths up to a maximum of `HALF_MAX_ARRAY_LENGTH`\r\n * to ensure the search operation remains within JavaScript's maximum array index limit.\r\n *\r\n * @param {any[]} array The sorted array into which the value should be inserted. The array elements\r\n * should be comparable with the `value` using less-than and greater-than operations.\r\n * @param {number} value The value to insert into the array. This function assumes that `array` is sorted\r\n * in ascending order and will find the correct position for `value` accordingly.\r\n * @returns {number} The index at which the `value` should be inserted into `array` to maintain its sorted order.\r\n * If the `array` is empty or if `value` is less than or equal to all elements in `array`,\r\n * returns 0. If `value` is greater than all elements in `array`, returns the length of `array`.\r\n * @example\r\n * // returns 2\r\n * baseSortedIndex([1, 3, 4], 3);\r\n *\r\n * @example\r\n * // returns 1\r\n * baseSortedIndex([1, 2, 3], 2);\r\n */\r\nexport function baseSortedIndex(array: number[], value: number): number {\r\n const MAX_ARRAY_LENGTH = 4294967295;\r\n const HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\r\n let low = 0;\r\n let high = array?.length || low;\r\n\r\n if (high <= HALF_MAX_ARRAY_LENGTH) {\r\n while (low < high) {\r\n const mid = (low + high) >>> 1;\r\n const computed = array[mid];\r\n if (computed !== null && computed < value) {\r\n low = mid + 1;\r\n } else {\r\n high = mid;\r\n }\r\n }\r\n }\r\n return high;\r\n}\r\n","/**\r\n * Calculates the median of an array of numbers.\r\n *\r\n * The median is the middle value of a sorted list of numbers. If the list has an even number\r\n * of elements, the median is the average of the two middle numbers.\r\n *\r\n * @param numbers - An array of numbers for which the median will be calculated.\r\n * @returns The median value as a number, or `null` if the array is empty.\r\n *\r\n * @example\r\n * ```typescript\r\n * const numbers = [3, 1, 4, 2];\r\n * const median = calculateMedian(numbers);\r\n * console.log(median); // Output: 2.5\r\n * ```\r\n */\r\nexport function calculateMedian(numbers: number[]): number {\r\n if (numbers.length === 0) return 0;\r\n\r\n // Sort the array in ascending order\r\n const sorted = [...numbers].sort((a, b) => a - b);\r\n\r\n const length = sorted.length;\r\n const middle = Math.floor(length / 2);\r\n\r\n // If the length is even, return the average of the two middle numbers\r\n if (length % 2 === 0) {\r\n return (sorted[middle - 1] + sorted[middle]) / 2;\r\n }\r\n\r\n // If the length is odd, return the middle number\r\n return sorted[middle];\r\n}\r\n","/**\r\n * Clamps value between min and max;\r\n * @param min minValue\r\n * @param max maxValue\r\n * @param value inputValue\r\n * @returns number\r\n */\r\n\r\nexport function clampf(min: number, max: number, value: number): number {\r\n if (min > max) {\r\n return min;\r\n }\r\n return Math.min(max, Math.max(min, value));\r\n}\r\n","import { clampf } from './clampf';\r\n\r\n/**\r\n * Computes a circular index within a given range.\r\n *\r\n * This function ensures that the index wraps around within the range of 0 to `totalItems - 1`.\r\n * It uses the `clampf` function to clamp the result within the valid range.\r\n *\r\n * @param index - The current index to be wrapped.\r\n * @param totalItems - The total number of items in the range.\r\n * @returns The wrapped index within the range of 0 to `totalItems - 1`.\r\n *\r\n * @example\r\n * ```typescript\r\n * import { circularIndex } from './circularIndex';\r\n *\r\n * // Example 1: Basic usage\r\n * const index1 = circularIndex(5, 5);\r\n * console.log(index1); // Output: 0\r\n *\r\n * // Example 2: Index greater than totalItems\r\n * const index2 = circularIndex(6, 5);\r\n * console.log(index2); // Output: 1\r\n *\r\n * // Example 3: Negative index\r\n * const index3 = circularIndex(-2, 5);\r\n * console.log(index3); // Output: 3\r\n *\r\n * // Example 4: Large Negative index\r\n * const index4 = circularIndex(-6, 5);\r\n * console.log(index4); // Output: 4\r\n *\r\n * // Example 5: Index equal to totalItems\r\n * const index5 = circularIndex(1, 1);\r\n * console.log(index5); // Output: 0\r\n */\r\nexport function circularIndex(index: number, totalItems: number): number {\r\n return clampf(0, totalItems - 1, (totalItems * 2 + index) % totalItems);\r\n}\r\n","export function degreesToRadians(degrees: number): number {\r\n return degrees * (Math.PI / 180);\r\n}\r\n\r\nexport function radiansToDegrees(radians: number): number {\r\n return radians * (180 / Math.PI);\r\n}\r\n","/**\r\n * A small epsilon value used for floating-point comparisons.\r\n *\r\n * @remarks\r\n * The value of `EPSILON` is `0.01`. This can be overridden in the comparison functions if needed.\r\n */\r\nconst EPSILON = 0.01;\r\n\r\n/**\r\n * Checks if floating-point number `A` is less than `B` considering a small margin of error.\r\n *\r\n * @param A - The first floating-point number to compare.\r\n * @param B - The second floating-point number to compare.\r\n * @param Epsilon - Optional custom epsilon value for comparison. Defaults to `EPSILON` if not provided.\r\n * @returns `true` if `A` is less than `B` considering the epsilon margin, otherwise `false`.\r\n *\r\n * @example\r\n * ```\r\n * const result = fpIsALessThanB(0.0034, 0.0066); // true\r\n * ```\r\n */\r\nexport function fpIsALessThanB(\r\n A: number,\r\n B: number,\r\n Epsilon?: number,\r\n): boolean {\r\n Epsilon = Epsilon || EPSILON;\r\n return A - B < Epsilon && Math.abs(A - B) > Epsilon;\r\n}\r\n\r\n/**\r\n * Checks if floating-point number `A` is greater than `B` considering a small margin of error.\r\n *\r\n * @param A - The first floating-point number to compare.\r\n * @param B - The second floating-point number to compare.\r\n * @param Epsilon - Optional custom epsilon value for comparison. Defaults to `EPSILON` if not provided.\r\n * @returns `true` if `A` is greater than `B` considering the epsilon margin, otherwise `false`.\r\n *\r\n * @example\r\n * ```\r\n * const result = fpIsAGreaterThanB(0.0066, 0.0034); // true\r\n * ```\r\n */\r\nexport function fpIsAGreaterThanB(\r\n A: number,\r\n B: number,\r\n Epsilon?: number,\r\n): boolean {\r\n Epsilon = Epsilon || EPSILON;\r\n return A - B > Epsilon && Math.abs(A - B) > Epsilon;\r\n}\r\n\r\n/**\r\n * Checks if floating-point number `A` is approximately the same as `B` considering a small margin of error.\r\n *\r\n * @param A - The first floating-point number to compare.\r\n * @param B - The second floating-point number to compare.\r\n * @param Epsilon - Optional custom epsilon value for comparison. Defaults to `EPSILON` if not provided.\r\n * @returns `true` if `A` is approximately equal to `B` considering the epsilon margin, otherwise `false`.\r\n *\r\n * @example\r\n * ```\r\n * const result = fpIsASameAsB(0.005, 0.0051); // true\r\n * ```\r\n */\r\nexport function fpIsASameAsB(A: number, B: number, Epsilon?: number): boolean {\r\n Epsilon = Epsilon || EPSILON;\r\n return Math.abs(A - B) < Epsilon;\r\n}\r\n","/**\r\n * Performs an inverse linear interpolation.\r\n *\r\n * Given a range defined by `min` and `max`, this function calculates the\r\n * interpolation factor (or percentage) of `value` within that range. Optionally,\r\n * it can clamp the result to be between 0 and 1 to ensure the return value is\r\n * within the range of a standard lerp operation.\r\n *\r\n * @param {number} min - The minimum value of the interpolation range.\r\n * @param {number} max - The maximum value of the interpolation range.\r\n * @param {number} value - The value to interpolate.\r\n * @param {boolean} [clampToNormal=false] - Whether to clamp the result between 0 and 1.\r\n * @returns {number} The interpolation factor of `value` between `min` and `max`.\r\n * If `clampToNormal` is true, the result is clamped between 0 and 1.\r\n * If the difference between `min` and `max` is 0, returns 1 to avoid division by zero.\r\n */\r\nexport function inverseLerp(\r\n min: number,\r\n max: number,\r\n value: number,\r\n clampToNormal = false,\r\n): number {\r\n if (clampToNormal) {\r\n value = Math.min(max, value);\r\n value = Math.max(min, value);\r\n }\r\n const difference = max - min;\r\n\r\n // Avoid JS division error\r\n if (difference === 0) {\r\n return 1;\r\n }\r\n const result = (value - min) / difference;\r\n if (clampToNormal) {\r\n return Math.min(1, Math.max(0, result));\r\n }\r\n return result;\r\n}\r\n","import { clampf } from './clampf';\r\n\r\n/**\r\n * @param min minimums\r\n * @param max maximums\r\n * @param value current float value in 0-1 range\r\n * @returns clamped value\r\n */\r\nexport function lerp(min: number, max: number, value: number): number {\r\n value = clampf(0, 1, value);\r\n return value * (max - min) + min;\r\n}\r\n","/**\r\n * A Mutex class to handle mutual exclusion locks, ensuring that only one asynchronous task can execute a critical section at a time.\r\n *\r\n * @example\r\n * const mutex = new Mutex();\r\n *\r\n * async function task(name: string, duration: number) {\r\n * console.log(`${name} waiting to acquire mutex`);\r\n * const release = await mutex.acquire();\r\n * console.log(`${name} acquired mutex`);\r\n * await new Promise(resolve => setTimeout(resolve, duration));\r\n * console.log(`${name} releasing mutex`);\r\n * release();\r\n * }\r\n *\r\n * task('Task 1', 1000);\r\n * task('Task 2', 2000);\r\n * task('Task 3', 1500);\r\n * task('Task 4', 500);\r\n *\r\n * Outputs\r\n * [LOG]: \"Task 1 waiting to acquire mutex\"\r\n * [LOG]: \"Task 2 waiting to acquire mutex\"\r\n * [LOG]: \"Task 3 waiting to acquire mutex\"\r\n * [LOG]: \"Task 4 waiting to acquire mutex\"\r\n * [LOG]: \"Task 1 acquired mutex\"\r\n * [LOG]: \"Task 1 releasing mutex\"\r\n * [LOG]: \"Task 2 acquired mutex\"\r\n * [LOG]: \"Task 2 releasing mutex\"\r\n * [LOG]: \"Task 3 acquired mutex\"\r\n * [LOG]: \"Task 3 releasing mutex\"\r\n * [LOG]: \"Task 4 acquired mutex\"\r\n * [LOG]: \"Task 4 releasing mutex\"\r\n */\r\nexport class Mutex {\r\n private mutex = Promise.resolve();\r\n\r\n /**\r\n * Acquires the mutex, returning a promise that resolves when the mutex is acquired.\r\n * The returned promise provides a release function that should be called to release the mutex.\r\n * @returns A promise that resolves with a release function.\r\n */\r\n async acquire(): Promise<() => void> {\r\n let release: () => void;\r\n const previous = this.mutex;\r\n this.mutex = new Promise<void>((resolve) => (release = resolve));\r\n await previous;\r\n return release!;\r\n }\r\n}\r\n","/**\r\n * A Semaphore controls access to a resource that can handle a limited number of concurrent operations.\r\n *\r\n * @example\r\n * const semaphore = new Semaphore(2);\r\n *\r\n * async function task(name: string, duration: number) {\r\n * console.log(`${name} waiting to acquire semaphore`);\r\n * await semaphore.acquire();\r\n * console.log(`${name} acquired semaphore`);\r\n * await new Promise(resolve => setTimeout(resolve, duration));\r\n * console.log(`${name} releasing semaphore`);\r\n * semaphore.release();\r\n * }\r\n *\r\n * task('Task 1', 1000);\r\n * task('Task 2', 2000);\r\n * task('Task 3', 1500);\r\n * task('Task 4', 500);\r\n *\r\n * Outputs\r\n * [LOG]: \"Task 1 waiting to acquire semaphore\"\r\n * [LOG]: \"Task 2 waiting to acquire semaphore\"\r\n * [LOG]: \"Task 3 waiting to acquire semaphore\"\r\n * [LOG]: \"Task 4 waiting to acquire semaphore\"\r\n * [LOG]: \"Task 1 acquired semaphore\"\r\n * [LOG]: \"Task 2 acquired semaphore\"\r\n * [LOG]: \"Task 1 releasing semaphore\"\r\n * [LOG]: \"Task 3 acquired semaphore\"\r\n * [LOG]: \"Task 2 releasing semaphore\"\r\n * [LOG]: \"Task 4 acquired semaphore\"\r\n * [LOG]: \"Task 4 releasing semaphore\"\r\n * [LOG]: \"Task 3 releasing semaphore\"\r\n */\r\nexport class Semaphore {\r\n private tasks: (() => void)[] = [];\r\n private currentCount = 0;\r\n\r\n constructor(private readonly maxConcurrency: number) {}\r\n\r\n public acquire(): Promise<void> {\r\n return new Promise((resolve) => {\r\n if (this.currentCount < this.maxConcurrency) {\r\n this.currentCount++;\r\n resolve();\r\n } else {\r\n this.tasks.push(resolve);\r\n }\r\n });\r\n }\r\n\r\n public release(): void {\r\n if (this.tasks.length > 0) {\r\n const nextTask = this.tasks.shift();\r\n if (nextTask) {\r\n nextTask();\r\n }\r\n } else if (this.currentCount > 0) {\r\n this.currentCount--;\r\n }\r\n }\r\n}\r\n","import type { Observable } from 'rxjs';\r\nimport { finalize, from, switchMap } from 'rxjs';\r\nimport { Logger } from '../dev';\r\nimport { Mutex } from './Mutex';\r\n\r\nexport class TaskRunner {\r\n private mutex = new Mutex();\r\n\r\n runTask(name: string, task: () => Observable<string | null>) {\r\n // Log that the task is waiting to acquire the mutex\r\n Logger.log(`${name} waiting to acquire mutex`);\r\n\r\n return from(this.mutex.acquire()).pipe(\r\n switchMap((release) => {\r\n // Log that the mutex has been acquired\r\n Logger.log(`${name} acquired mutex`);\r\n return task().pipe(\r\n finalize(() => {\r\n Logger.log(`${name} releasing mutex`);\r\n release();\r\n }),\r\n );\r\n }),\r\n );\r\n }\r\n}\r\n","import type { SchedulerLike, Subscriber, Subscription } from 'rxjs';\r\nimport { asyncScheduler, Observable, timer } from 'rxjs';\r\n\r\n/**\r\n * Emits the most recent value emitted by the source Observable after a\r\n * specified time span has passed without another source emission.\r\n *\r\n * This is a combination of `debounceTime` and `auditTime` operators.\r\n *\r\n * The leading value is emitted immediately, and trailing values are debounced.\r\n *\r\n * @param dueTime The time to wait before emitting the last value.\r\n * @param scheduler The scheduler to use for the timeout.\r\n * @returns A function that returns an Observable that mirrors the source Observable, but applies the specified debouncing.\r\n */\r\nexport function leadingTrailingDebounceTime<T>(\r\n dueTime: number,\r\n scheduler: SchedulerLike = asyncScheduler,\r\n): (source: Observable<T>) => Observable<T> {\r\n return (source: Observable<T>) =>\r\n new Observable<T>((subscriber: Subscriber<T>) => {\r\n let hasValue = false;\r\n let lastValue: T | null = null;\r\n let timerSubscription: Subscription | null = null;\r\n let leading = true; // Controls whether we emit immediately.\r\n\r\n const clearTimer = () => {\r\n if (timerSubscription) {\r\n timerSubscription.unsubscribe();\r\n timerSubscription = null;\r\n }\r\n };\r\n\r\n const resetValues = () => {\r\n hasValue = false;\r\n lastValue = null;\r\n leading = true; // Reset so the next new value is immediate.\r\n };\r\n\r\n const emitLastValue = () => {\r\n if (hasValue && lastValue !== null) {\r\n subscriber.next(lastValue);\r\n resetValues();\r\n }\r\n };\r\n\r\n const sourceSubscription = source.subscribe({\r\n next: (value) => {\r\n // If we are \"leading\", emit immediately and switch leading off\r\n if (leading) {\r\n subscriber.next(value);\r\n leading = false;\r\n timerSubscription = timer(dueTime, scheduler).subscribe(() => {\r\n resetValues();\r\n clearTimer();\r\n });\r\n return;\r\n }\r\n\r\n // Otherwise, save the value and start (or restart) timer\r\n hasValue = true;\r\n lastValue = value;\r\n clearTimer();\r\n timerSubscription = timer(dueTime, scheduler).subscribe(() => {\r\n emitLastValue();\r\n });\r\n },\r\n error: (err: unknown) => {\r\n clearTimer();\r\n subscriber.error(err);\r\n },\r\n complete: () => {\r\n // If there is a pending emission, emit it before completing\r\n clearTimer();\r\n emitLastValue();\r\n subscriber.complete();\r\n },\r\n });\r\n\r\n // Cleanup logic\r\n return () => {\r\n clearTimer();\r\n sourceSubscription.unsubscribe();\r\n };\r\n });\r\n}\r\n","import type { Observable } from 'rxjs';\r\nimport { animationFrameScheduler, interval } from 'rxjs';\r\nimport { distinctUntilChanged, map } from 'rxjs/operators';\r\nimport { clampf, lerp } from '../math';\r\n\r\n/**\r\n * Creates an observable that emits values transitioning smoothly from the start value to the end value over a specified duration.\r\n * The transition is performed using linear interpolation (lerp) and clamped to the range [0, 1].\r\n *\r\n * @param {number} start - The starting value of the transition.\r\n * @param {number} end - The ending value of the transition.\r\n * @param {number} duration - The duration of the transition in milliseconds.\r\n * @returns {Observable<number>} An observable that emits the interpolated values from start to end over the specified duration.\r\n */\r\nexport const smoothTransition = (\r\n start: number,\r\n end: number,\r\n duration: number,\r\n): Observable<number> => {\r\n const startTime = animationFrameScheduler.now();\r\n return interval(0, animationFrameScheduler).pipe(\r\n map(() => {\r\n const elapsed = (animationFrameScheduler.now() - startTime) / duration;\r\n return clampf(0, 1, elapsed);\r\n }),\r\n distinctUntilChanged(),\r\n map((fraction) => lerp(start, end, fraction)),\r\n );\r\n};\r\n","import { tap } from 'rxjs/operators';\r\nimport type { Observable } from 'rxjs';\r\nimport { Logger } from '../dev';\r\nimport { COLOR_CODES } from '../constants';\r\n\r\nexport const tapLog =\r\n <T>(text: string, ...args: any): ((source: Observable<T>) => Observable<T>) =>\r\n (source: Observable<T>) =>\r\n source.pipe(\r\n tap((data) => {\r\n Logger.colored(...COLOR_CODES.TAP_LOG, text, data, ...args);\r\n }),\r\n );\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["uuidv4","map"],"mappings":"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"}
package/index.d.ts CHANGED
@@ -1,6 +1,5 @@
1
1
  import * as rxjs from 'rxjs';
2
2
  import { Observable, SchedulerLike } from 'rxjs';
3
- import { InjectionToken } from '@angular/core';
4
3
 
5
4
  /**
6
5
  * RGB from each of the CMYK values to determine a return as an any[].
@@ -128,6 +127,8 @@ declare const COLOR_CODES: {
128
127
  readonly TO_CIRRUS: readonly ["#ffffff", "#3c9738", "CIRRUS <-"];
129
128
  };
130
129
 
130
+ declare const DOCUMENT_ROOT: any;
131
+
131
132
  declare function CSV2Array(strData: any, strDelimiter?: string): any[];
132
133
 
133
134
  declare function CSV2Records(csv: string, useRowAsHead?: number, strDelimiter?: string): any;
@@ -860,8 +861,5 @@ declare const tapLog: <T>(text: string, ...args: any) => ((source: Observable<T>
860
861
  */
861
862
  declare function pad(input: number | string, size: number, symbol?: string): string;
862
863
 
863
- declare const WINDOW: InjectionToken<Window>;
864
- declare const DOCUMENT_ROOT: InjectionToken<string>;
865
-
866
- export { BatchLoader, CMYKtoRGB, COLOR_CODES, CSV2Array, CSV2Records, DOCUMENT_ROOT, DownloadImage, Falsy$1 as Falsy, HEXtoRGB, HSVtoRGB, ImageOutput, InvertedKeyMap, IsEmpty, KeyboardNumericCode, KeyboardStringCode, Logger, Mutex, NotEmpty, ObjectToCSV, RGBtoCMYK, RGBtoHEX, RGBtoHSV, SaveImage, Semaphore, Signal, TaskRunner, Truthy, WINDOW, baseSortedIndex, calculateMedian, circularIndex, clampf, cleanupFileName, debounce, degreesToRadians, expandOverRectangle, fitIntoRectangle, fpIsAGreaterThanB, fpIsALessThanB, fpIsASameAsB, generateUuid, getCanvasCached, getSnapshot, hsv, inverseLerp, isAllValuesTruthy, isDefined, isDesktop, isEmpty, isJSON, isLocalhost, isNotDefined, leadingTrailingDebounceTime, lerp, loadImage, makePath, max, media, min, normalizePath, overlay, pad, radiansToDegrees, rgb, saveToLocalDrive, serialize, shortHash, sleep, smoothTransition, sub, subtract, sum, tapLog, textForSearch, timeToString, timeUTCToString, toRGB, toRGBA, trimLastSlashFromUrl, where, whereNot };
864
+ export { BatchLoader, CMYKtoRGB, COLOR_CODES, CSV2Array, CSV2Records, DOCUMENT_ROOT, DownloadImage, Falsy$1 as Falsy, HEXtoRGB, HSVtoRGB, ImageOutput, InvertedKeyMap, IsEmpty, KeyboardNumericCode, KeyboardStringCode, Logger, Mutex, NotEmpty, ObjectToCSV, RGBtoCMYK, RGBtoHEX, RGBtoHSV, SaveImage, Semaphore, Signal, TaskRunner, Truthy, baseSortedIndex, calculateMedian, circularIndex, clampf, cleanupFileName, debounce, degreesToRadians, expandOverRectangle, fitIntoRectangle, fpIsAGreaterThanB, fpIsALessThanB, fpIsASameAsB, generateUuid, getCanvasCached, getSnapshot, hsv, inverseLerp, isAllValuesTruthy, isDefined, isDesktop, isEmpty, isJSON, isLocalhost, isNotDefined, leadingTrailingDebounceTime, lerp, loadImage, makePath, max, media, min, normalizePath, overlay, pad, radiansToDegrees, rgb, saveToLocalDrive, serialize, shortHash, sleep, smoothTransition, sub, subtract, sum, tapLog, textForSearch, timeToString, timeUTCToString, toRGB, toRGBA, trimLastSlashFromUrl, where, whereNot };
867
865
  export type { Area, Coords, IKeyCode, IKeyName, ImageOutputValues, LoadArgs, LoadArgsTmp, Rect, Size };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@3dsource/utils",
3
- "version": "1.0.20",
3
+ "version": "1.0.21",
4
4
  "description": "A set of utils for using in 3dsource projects",
5
5
  "keywords": [
6
6
  "3dsource",